"機械学習","信号解析","ディープラーニング"の勉強

読者です 読者をやめる 読者になる 読者になる

HELLO CYBERNETICS

深層学習、機械学習、強化学習、信号処理、制御工学などをテーマに扱っていきます

信号解析と機械学習とあとは個人的見解

 

 

 信号解析の基本手法:フーリエ級数展開

信号解析の基本手法といえばフーリエ解析があります。フーリエ解析は任意の関数を三角関数の和に分解することで対象を解析する手法です。時系列信号に適応すれば、その信号をいろいろな周波数の正弦波の和として表現できるということです。

フーリエ級数展開

フーリエ解析の基本的理念は以下の記事で解説しています。

s0sem0y.hatenablog.com

 

ここでもその理念をおさらいしましょう。

 

f_1(t)=sin(1t)

f_2(t)=sin(2t)

f_3(t)=sin(3t)

 

という基本的な信号を準備して、これを適当な重み付けで足しあわせてみます。

 

f(t)=a_1f_1(t)+a_2f_2(t)+a_3f_3(t)

 

f:id:s0sem0y:20161208002004p:plain

a_1=a_2=a_3=1

f:id:s0sem0y:20161208002121p:plain

a_1=2 a_2=3 a_3=-4

f:id:s0sem0y:20161208002302p:plain

a_1=-1 a_2=1 a_3=-2

 

いま様々な重み付けで基本的な信号の和を見ました。重み付けを色々変えることで様々な形の信号が表現できることがなんとなく見えてくるかと思います。しかしこのままでは実はどんな信号でも表現できるとはいきません。

 表現できる信号の種類を増やすためには、基本的な信号の種類を増やすことも大事です。今は三種類しか使っていませんが、この種類をもっと増やして、さらにsinだけでなくcosも使うようにすれば表現力が上がるというのが基本戦略です。

 

今、適当な重み付けで信号を合成するのを見ました。

フーリエ級数展開はこの真逆で、ある信号波形があったときに、その信号が以下の形で表現できるとして、その重みa_n,b_mを求めるというものです。

 

f(t)=c + \sum_n a_nsin(2πfnt) + \sum_m b_mcos(2πfmt)

 

cは周期によらない定数項で、バイアスに相当するものです。普通はこれも求めてしまいます。

 

回帰問題とフーリエ級数展開

データf(t)が得られたとしましょう。このtというのは時間なので普通は連続ですが、センサーでは0.1秒ごとにデータを獲得していると思うと、離散的であるとも言えます。例えば10秒観測を行えばこの場合だと100点のデータが得られることになります。そしてこのようにして得られたデータ点たちをプロットして、(f(t_1),f(t_2),...,)のように点列で考えても構いません。そのほうが機械学習にとっては馴染みが深いでしょう。

 

f:id:s0sem0y:20161208002121p:plain

↑:波形f(t)  ↓:点列(f(t_1),f(t_2),...,)

f:id:s0sem0y:20161208004910p:plain

 

限りなくセンサーが素早く動作すれば、点列はある連続的な波形f(t)のように見えてきます。

 

とにかくこのような関数f(t)に対して

 

y(t)=w_0+w_1t+w_2t^2+w_3t^3+...

 

という関数を想定しておきy(t)≒f(t)となるようにw_iを決めてやりたいと考えるわけです。どのようにy(t)f(t)の近さを測るのかというと、回帰問題では

 

\sum_i |y(t_i)-f(t_i)|^2

 

を最小化するのが常套手段です。

今多項式として、t,t^2,t^3,...などのtのべき乗の和で表現することを選びました。すなわちべき乗たちを基底関数に選んだということです。しかしこの基底関数は本来何でもいいはずです。データを上手く表せる関数を知っているならばそれを使えばいいわけですし、当然三角関数を選んでもいいはずです。すなわち

 

y(t)=c + \sum_n a_nsin(2πfnt) + \sum_m b_mcos(2πfmt)

 

という関数を想定して回帰をしてもいいはずです。フーリエ級数展開とはまさにこれで、フーリエ係数とは回帰問題における重みに相当します。

 

そして恐るべきことに上記のような関数を想定すると、対象が周期信号であれば任意の関数を任意の精度で表現できます。

任意の精度というのは、言わばピッタリにできるということです。

 

\sum_i |y(t_i)-f(t_i)|^2=0 ⇔ y(t_i)=f(t_i)

 

と出来てしまうのです。そして、実際には最適化問題を解く必要など一切ありません。

フーリエ級数(すなわち重み)は、一発でポンと求めることができるのです。

 

まず任意の関数で任意の精度を達成できるのは、数学的にかなり高度な知識が必要になります。一発で求めることができるのは、基底関数が互いに直交しているためです。この基底系は完全直交基底と表現されますが、このような都合の良い基底を準備するのは通常は困難です。

 

フーリエ級数展開が、わざわざ回帰問題の一種ではなく、個別に取り扱われるのはそれだけ特別だからです。特に三角関数は微分に対して非常に強いため、微分方程式の解をフーリエ級数展開の形で予め書いておくことで、非常に見通しよく解くことができ、信号解析だけでなく物理学の世界でも多用されます(この言い方はおかしくて、本来は微分方程式を解くために考案された)。

 

 

実際には三角関数が周期信号であるために、それの線形和で作られる信号も周期信号になってしまいます。これが「対象が周期信号であれば(任意の精度で近似できる)」という仮定の理由ですが、周期信号以外を扱う場合はどうするのかというと、周期が無限大としてしまう、すなわち周期が大きすぎて一生かけても2周期目に突入しないだけで、あくまで周期信号であるということにして扱うのです。

 

これによりフーリエ級数展開は、フーリエ変換へと姿を変えます。

 

特徴量抽出としてフーリエ係数

フーリエ級数展開、およびフーリエ変換は三角関数で対象の信号を分解します。

対象は必ずしも時間的に測定された信号でなくても、位置に応じて得られるデータ(ピクセル画像など)でも構いませんし、ともかくデータの形を三角関数で表現するものだと考えてください。すると、フーリエ係数なるもの自体が、十分に機械学習における特徴量として用いることができるのがわかります。

 

例えば、「人の声」の波形というのは人によって違いはあるでしょう。しかし声の高さを考えれば、それは物理的な振動の周波数に支配されているものであり、フーリエ級数というのは、まさにある周波数の波がどれほどの重みで含まれているのかを表すものですから、この値を見れば声の高さを知ることができそうです。

 

そして「声の高さ」というのは声をフーリエ変換したときに最も絶対値が大きなフーリエ係数に支配されます。例えばcos(2π・400・t)の係数の絶対値が大きいのであれば、その人の声は400Hzに聴こえます。そして、他のフーリエ係数の具合がその人の声色を決めるのです。

実際の応用ではフーリエ係数の二乗を見ることで、どのような波がどれくらい含まれているのかを見ます。フーリエ級数の値の正負は、ある三角関数が上下反転するだけであり、「含まれている周波数成分がどれくらいか」を考える上では必要のない情報だからです。

 

もしも、高さを決めているただ1つの波しか声に含まれないのであれば、声に個性など生まれません。すべて音叉の音のように聴こえてしまうのです。ここまで考えれば、個人を特定するのに声を使いたければ、フーリエ係数が十分に特徴量になりうるであろうことがわかります。

 

 

機械学習における基本手法

ニューラルネットワークの回帰

現在はニューラルネットワークが爆発的な人気を誇っています。

上記での記述になぞらえて見てみましょう。中間層が1つのニューラルネットでの回帰問題では

 

点列(x_1,x_2,...,x_N)

 

に対して

 

{\bf z_i}=σ({\bf w}x_i+{\bf w_0})

 

y_i={\bf v^T z_i} + v_0

 

というニューラルネットワークを構築します。 そして

 

\sum_i |y_i-x_i|^2

 

を最小化するように{\bf w,w_0,v}v_0を学習することとなります。

これは図示すると以下のようになります。

 

f:id:s0sem0y:20161208014356p:plain

 

中間層から出力層に対する変換を、内積を使わずに書けばx_iに対する中間層のj個目のユニットの出力を{z_i}_{(j)}とし、ベクトル\bf vj番目の成分もv_{(j)}とすると

 

y_i=\sum_j v_{(j)} {z_i}_{(j)} + v_0

 

と書くことができます。{z_i}_{(j)}というのはx_iを何らかの形で変換したものであり、これを基底、v_{(j)}を重みとして回帰を行っていることがわかります。

入力層から中間層にかけては、何らかのうまい基底を獲得する過程だと見るわけです。

 

すると自ずとニューラルネットワークの表現力の高さと、一方で少し無駄な働きがあることが伺えます

 

表現力の高さとは

フーリエ級数展開の話をしたときに、三角関数をたくさん準備すれば表現力が上がるということを言いました。言わば基底関数の種類をたくさん準備しておくということです。

上記のニューラルネットにおいては基底関数は中間層で構築されるわけですから、この中間層の数が多ければ多いほど表現力が高いことはすぐに理解できるでしょう。

実際任意の個数のユニットを配置すれば、任意の関数が表現できることが知られています。

 

一方で、その基底関数をどのように構築するかというと、それはもっぱら学習に任せてしまうわけです。

 

無駄な働きとは

学習の過程で運悪く、全く同じ基底が2つできてしまったらどうでしょうか。これは全く意味のないものだとすぐに分かるはずです。例として以下を見ましょう。

 

y = a_1f_1+a_2f_2

 

a_1,a_2を色々変えてみようというときに、基底がf_1=f_2のような関係になってしまえば、そもそもyに関しては

 

y=(a_1+a_2)f_1

 

としてしか表現できません。これではユニットを多くした意味が全くないことになります。

そして、学習においてそういうことは実際に起こりえます。基底を決めているのは入力層から中間層への重み\bf wに他なりません。そして回帰を行うのは\bf vです。もう一度図を見ましょう。

 

f:id:s0sem0y:20161208014356p:plain

\bf wが基底(中間層)を構築し、\bf vが回帰を行う 

 

\bf wも学習の対象であって、これが学習の過程で変なことになってしまった場合には学習に停滞が生じるのです(当然\bf vにも言えることですが)。

このネットワークのケースでは、全く同じ基底を作るというのは、\bf wの成分がいくつか同じ値になっているようなケースでしょう。

他にも、\bf wのある成分が0になってしまえば、その中間層は無いのと同じです。当然、その後の\bf vがどのように調整されようとも、そのユニットから情報は伝わってきません。

 

 

これらは最も極端な例ですが、各成分の取り方の組み合わせによっては、同様に学習に悪影響を及ぼすことが起こってきます(以下の記事ではそのような話題をメインに取り扱っています)。

s0sem0y.hatenablog.com

 

 

多層化すれば当然出力層での回帰以前の「基底の構築」に相当する部分が多重化されるわけで、表現力がある一方でその構築は非常に難しくなります。

良い基底というダイヤを、広大なグラウンドから探し求めなければならないのです。

 

多層化やユニットを増やすことは、グラウンドの範囲を広げ、探索範囲を広げることです。

そうすればより質の良いダイヤがあるかもしれませんが、それを見つけるには多大な労力が必要となってくるわけです。大抵、ニューラルネットワークの表現力は解析対象に比べ冗長なんです。

 

 

 

個人的見解

特徴抽出

信号解析は、その解析手法に数学的理念や物理的意味を宿らせています。それ故、その概念を理解した熟練者が、解析対象の事前知識を持ってこれを使うことで、非常に良い特徴抽出を行うことができます。

 

一方で、機械学習では基底とか係数とかは、予測に使える最大限精度の良いものでありさえすればよく、最近の潮流では、特徴抽出自体も学習に組み込んでしまいます。

そして深層学習の素晴らしいところは、学習のハイパーパラメータを使うことで、解析対象の事前知識をある程度反映した形で学習を行うことができる点です。例えば本来必要な基底に対して、予め冗長なユニットを準備しておいたというのであれば、スパース正則化を入れるなどのことができます。

 

そして人間としては悲しいことに、特徴抽出が、機械学習に任せてしまったほうが良いということになってきています。

 

ノイズにまみれたデータを対象にするならば自己符号化器やラダーネットが、画像などには畳み込みニューラルネットが、時系列データにはリカレントネットが、それぞれ強力な特徴抽出を兼ね備えられることが分かっています。

生成モデルも活発に研究されるようになり、データ自体をニューラルネットが作れるようにもなっています。(例えば画像を一杯与えると、新規の画像を作り出せるようになる)

 

しっかり学ぶためには

ニューラルネットというのはどうもかなりの表現力を持っているらしく、時間さえ与えればほとんどのタスクをこなせるのではないかと感じています。

しかし時間は有限なので、上手くニューラルネットを学習させる必要があり、できる限り効率的な解の探索が行えるような構成、学習法を考えなければなりません。

 

ニューラルネット自身が強力なのは周知の事実なので、もしもニューラルネットを使うだけならば、人間同士で差をつけようと思った時には、ニューラルネットの調整屋として能力が指標になっているかもしれません(これは言い過ぎかもしれませんが)。

 

やはり差をつけるにはニューラルネット自体の根本的理解も必要でしょう。

 

新規のニューラルネット

新しいニューラルネットワークを構築する際の考え方は大きく分けて2つあります。

 

・既存のニューラルネットに新たな層やユニットを考案し、何だかよくわからないが結果として上手く行くような方法を探す。

 

・何らかの理念のもとに、それをニューラルネットワークという形で表現する

 

特に後者においては、脳をモデル化するという形での研究が盛んです。

これはデータ解析のための機械学習という視点だけでなく、汎用人工知能の達成という面でも大きな役割を担っているのでぜひとも注目していきたいところです。

 

また、ニューラルネットと言わなくとも、データ解析や機械学習という観点ではまだまだ注目すべきものは知らないだけでたくさんあるんではないかなと思っています。

 

位相的データ解析とか今はどうなっているんだろうか。