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

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

HELLO CYBERNETICS

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

Blind Source Separation (BSS) の考え方と様々な手法

BSSは信号処理の推定問題で、観測データから元々の信号源を復元しようという試みです。

今月、BSSに関する論文(JointBSS)がIEEEの信号処理の雑誌で取り上げられたのでテーマとして扱いたいと思います。ちなみにその論文でのメインは脳の信号をBSSにより解析しようという内容ですが、この記事ではBSSに関する一般的な話をします。

これから信号処理・解析や機械学習で推定問題を勉強していこうという場合に良い題材となるはずです。

 

 

 

BSSの問題設定

定性的話、カクテルパーティー効果

一番わかり易く、最も有名な題材は「カクテルパーティー効果」です。

人間はパーティー会場でいろんな人が様々な種類の雑談をしている中でも、自分の興味のある話にのみ耳を傾けることができます。これは人間が選択的に聴きたい音を聴けるということを表していますが、一体それはどのようにして可能となっているのでしょうか。

耳に音が入る時点では、すべての音、すなわち様々な空気の波が同時に耳に入っていっているはずです。その音の中から自身の聴きたい音のみを選ぶには、脳内で情報処理をする際に、同時に入ってきてた波を、もともとの個々の波に分解していると考えられます。このように観測された信号が、複数の信号源が混合されたものであるときに、混合される以前の個々の信号を復元しようというのがBSSになります。人間の耳は2つですが、信号を拾うセンサーはそれ以上でも構いません。

 

定式化

観測される信号をy \in \Re ^dとすると、これは、元々の個々の信号x \in \Re ^kが線形変換A \in \Re ^{d✕k}によって混合されたものだと表せます。ここでdは観測に用いたセンサーの数であり、センサーの値がそれぞれのベクトルyの成分に対応します。kは信号源の数であり、k個の信号源の値がxの成分に対応します。

 

 y=Ax

 

このとき、既知の情報というのは観測信号yのみであり、これから行列Axを同時に推定するのがBSSの問題となります。

注意しなければならないのは、元々の信号源の信号xの次元kも未知だということです。カクテルパーティー効果だと、話している人間の数がkに相当するわけですが、一般的な問題においては、信号源に関する情報というのは一切持ち合わせていないという状況です。

 

BSSの解法 主成分分析

解くために必要なこと

もしも、電気信号を複数のセンサーで計測しているのであれば、電気信号がどのように減衰されながら拡散していくのかを物理的に計算し、各センサーにどのように信号が伝わるかが求まるかもしれません。そうともなればAが既知となり、

 

 x=A^{-1}y

 

と信号源の信号を直ちに求めることができます。そういう場合にはそもそもBSS問題とは言いませんが、要するにそういうことができないときに何らかの数学的操作によって推定を行いたいのです。

しかし、解析的に信号源の信号xを求めるには上記の方法以外ありません。Axの各成分が未知ともなれば、明らかに方程式の数に対して未知数が圧倒的に多く、解けません。ですから、BSS問題を解くには、何らかの仮定を儲ける必要があります。例えば、元々の信号源の信号xの各成分は無相関であるとか、独立であるとか、非負であるとかなどです。

 

xが無相関である場合に

 BSSで信号源に無相関を仮定するというのは、例えば信号源のある成分が正の値を取ったからといって、それにつられて他の成分が正になったり負になったりの動きは無いということです。全く持って無関係であると言うイメージです。

実信号に関してこの仮定が成り立つケースは少ないかもしれませんが、そう近似してもいいときや、物理的にそういう信号が実在しなくとも、あえて無相関な信号として取り出しておこうという場合には人為的な信号として解釈して、この仮定を設ける場合もあります。

 

ひとまず観測信号yの各成分は相関を持っているような状況でしょう。例えば、電気信号ならば、すぐ近くのセンサーが正の値であれば、電気が拡散する際に隣りのセンサーにも漏れて行っており、近距離にあるセンサーが比較的近い値をもつような状況などが考えられます。

まず観測信号はy_nとしてn=1,...,Nとします。つまりN回計測をした(あるいはN時間計測した)ということです。これらの値の各成分同士の分散共分散を計算します。その行列がV_yとしましょう。仮に信号yの平均が0であれば(そうでなくともデータを平行移動すればそう扱えますね)、

 

V_y=E[yy^T]

 

と表せます。一方で、信号源の信号xの分散共分散行列[V_x]は、各成分が無相関であるという仮定より対角行列でなければなりません。

 

V_x=E[xx^T]

 

が対角行列であるべしという条件が付くことで、y=AxにおけるAを求めることができるようになります。

 

具体的にAを求めるために一度流れを整理します。

Aが求まればx=A^{-1}yと求まるのでした。この式はA^{-1}によって観測データyを変換したならば、xとなっており、仮定より各成分は無相関であるということを言っています。そうであれば、観測データyから出発して、適当な変換Oを使ってs=Oyという信号を作り出し、それがたまたま無相関であればいいということになります。yを変換したら各成分が無相関になるような変換Oとは一体どんなものでしょう。一回計算してみましょう。

 

V_s=E[ss^T]=E[Oy(Oy)^T]=E[Oyy^TO^T]=E[OV_yO^T]

 

となっております。すなわち行列OV_yO^Tが対角行列になるようにOを定めればいいということになります。そしてここで線形代数の重要な性質を使います。直交行列の転置行列はその逆行列と一致するということと、対称行列は直交行列を用いて対角化できるということです。これらを使うとV_yは対称行列ですから、直交行列によって対角化できます。すなわちOV_yO^Tが対角行列になってほしいというのは結局、観測データの分散共分散行列V_yの固有値問題によって解決されるのです。固有値問題によって得られる固有ベクトルによって、本来得たかったAが構築されます。

 

主成分分析の多角的視点

主成分分析は本来ならばデータの分散が最大となる主軸を探し、その主軸上に射影した成分こそが、データの性質を決める重要なファクターであると考えます。その場合は、知りたいのは分散の大きくなる軸であって、分散が小さくなる軸はあまりデータの性質には影響のないものであると解釈されます。そこで通常分散が小さくなる軸(小さな固有値に属する固有ベクトル)は捨ててしまいます。

また最小二乗距離直線を求めることと、分散が最大となる主軸を求めることは全く等価であって、データに対して回帰直線を引くという視点でも主成分分析を捉えることができます(つまり最も大きな固有値に属する固有ベクトルのみを残します)。

BSSであれば、得られた軸は全て、信号源が無相関であると仮定した際に求まった信号源そのものになっていますから、分散の大きさによって必ずしも捨てていいデータであるとは断定できません。カクテルパーティー効果を題材にすれば、遠くで喋っている人の声に耳を傾けたいのであれば、相対的に近くで喋っている人よりも小さな信号が得られるわけであって、残すべきなのは分散の小さな軸になっているかもしれません。

同じ数理的手法だとしても、今自分が何を解析しようとしているのかには注意を払わなければならないということです。

 

BSSの解法 独立成分分析

xが独立である場合に

主成分分析では信号源xに無相関性があると仮定しましたが、更に強い制約である独立性を要求してしまうこともできます。

ちなみに独立⇛無相関は常に成り立ちます。無相関⇛独立は場合によります。対象がガウス分布であれば、無相関⇛独立が成り立っており、ガウス分布に従う信号源に対してならば独立成分分析の結果は主成分分析と同じになります(逆に言えば独立成分分析という難しい手法を使う意義はない)。

 

s0sem0y.hatenablog.com

 

詳しい独立成分分析の考え方はこの記事に載せています(実は話の流れはほとんど今回の記事と同じです)。

概要だけ述べれば

 

1.信号源に独立性を仮定

2.適当に観測信号ys=Byと変換してみる。

3.sが独立性を有していればs=xであるとして、y=Ax=B^{-1}xと解を得る。

 

主成分分析では、独立性ではなく無相関性が仮定されており、無相関であるということを分散行列が対角行列になるということで計ることができました。結果的に固有値問題に持ち込むことができましたが、独立成分分析の場合はそういう上手い方法が無いため、sの独立性を上手く評価してやるための、評価関数の最適化問題を適切に設定することが重要になります。

 

BSSの解法 特異値分解

特異値分解は、行列を分解する一般的な手法です。

行列Aに対してA=UΣV^*となるような行列UVが必ず存在します。ここでΣは対角行列になっています。ただしこのような分解は一意には定まりません。もしも適切な評価を使って、上手い分解ができれば、UVがデータを説明する上手い構造を有しているかもしれません。(V^*Vの随伴行列(転置かつ共役の行列)です。随伴行列はVが実行列ならば転置行列と同じです。データ解析では対象は大抵実数なので転置行列と思っても差し支えありませんがより一般的に話をするために随伴行列でいきます。)

 

特異値と特異ベクトル

通常固有値と固有ベクトルは正方行列Aに対して

 

Ax=λx

 

が成り立つようなλxのことを言いますね。ではAが正方行列でないような場合にはどうすればいいでしょうか?普通には固有値問題というのは考えることができません。しかしAがm✕nの行列であれば、A^*はn✕mの行列であり、それらの積A^*Aはn✕nの正方行列になります。このことに着目して、正方行列でないA \in \Re^{m✕n}に対して

 

A^*Av=λv

 

という固有値問題を考えることができます。

本来はAについて調べたいわけです。A^*Aをというのは、Aを2回使っていますのでλというものも何らかの値の二乗だと考えたほうが綺麗ですのでλ=σ^2と置き換えて

 

A^*Av=σ^2v

 

として問題を書きなおしておきましょう。

このとき、ベクトルvAの特異ベクトル、σAの特異値と言います。

 

まとめるとA^*Aの固有値がλであって、本来はAについて知りたいのでσ=\sqrt{λ}として考えているわけです。普通に問題を解くときには、この流れに沿って、A*Aの固有値を求めて、その平方根を獲得すれば特異値になっています。

 

一方で、AA^*u=σ^2uという問題を考えることができるのも忘れてはいけません。

この場合にはAA^*はm✕mの正方行列になっています。こちらで求めた場合の特異ベクトルuは左特異ベクトルと言います。vは右特異ベクトルと言います。 

特異値分解

A \in \Re^{m✕n}に対して

 

A=UΣV^*

 


Σ=\left( Σ_1 O \right) (m > n)

Σ=Σ_1 (m=n)

Σ=\left( \begin{array}{cc} Σ_1 \\ O \end{array} \right) (m < n)

 

Σ_1=diag(σ_1,σ_2,......,σ_p) ただし σ_1≧σ_2≧......≧σ_p

 

p=min(m,n)

 

となるような直交行列U \in \Re ^{m✕m}V \in \Re ^{n✕n}が必ず存在します。(ちなみにA \in \Im ^{m✕n}ならU,Vはユニタリ行列)

特異値を求めれば、Σは求まります。あとはUVを決めるだけですが、これは通常、一意には定まらなく、A=UΣV^*が成り立つようなU,Vは複数あります。取り敢えずVAの右特異ベクトルで構成することにすれば、あとはUの成分を求める連立方程式になります。

もしも特異値に縮退(1つの特異値に複数の特異ベクトルが存在する)がなければ一意に求まります。その際にはU,Vはそれぞれ、左特異ベクトルuと右特異ベクトルvで構成できます(もしも縮退があれば、直交ベクトルを自身で構築する必要があり、それが要因で一意性が無い)。

また、行列Aが正定エルミート行列であれば、特異値と特異ベクトルはそれぞれ固有値と固有ベクトルに一致します。分散共分散行列の場合には、正定エルミート行列ですから固有値分解をすることと特異値分解をすることは同じことになります。

 

すなわち主成分分析は特異値分解に包含されています。

 

BSSへの応用として

 特異値分解が非常に一般的な行列に対して使える手法であることから、これを応用してみる意義は十分にあります。BSSを主成分分析で解くならば、結局はデータの分散共分散行列を特異値分解することになりますし、もしも画像データで400✕300のピクセル画像を解析しようと思うのであれば、画像データに対して特異値分解をしてみるというのも手段になり得ます。

今、データ行列Yの特異値分解Y=UΣV^*を成分を明示して書けば

 

Y=\sum_{k=1}^{p} γ_ku_k{v_k}^*

 

となります。すなわち行列Yu_kv_k \in \Re^{m✕n}の和で表現していると言えます。

 

BSSの問題に立ち返れば観測データyが以下のように得られているとして

 

y=Ax

 

複数のデータがy_1=Ax_1,y_2=Ax_2,...,y_n=Ax_nと得られています。

複数のyの値からAを推定して、信号源xを得ようというわけですが、この観測データyを以下のように並べて表記し、

 

(y_1,y_2,...,y_n)=A(x_1,x_2,...,x_n)

⇔Y=AX

 

としてしまえば、特異値分解

 

Y=UΣV^*

 

と見比べて、A=UΣ,X=V^*と見ているようなものだと解釈できます。

もしもこの手続きによって信号源が得られるのであれば、右特異ベクトルが信号源の値に相当していますね。しかしせっかくA=UΣとさらなる分解ができているのでこれを更に注意深く見れば、モット詳しく変換について知ることができるかもしれません(実際にこういう応用が上手くいくのかは知りませんが)。

応用の可能性は、発想の数だけあるので試してみるより他ありませんが、この特異値分解がデータ解析にも上手く利用できそうだという雰囲気が伝われば良いかなと思います。

 

データ解析をしようという際に機械学習を勉強するかと思いますが、通常機械学習の教科書には特異値分解は載っていません。しかし、数学というのはやはり一般化をして、多くのことを最小限の仮定で説明しようとすることを目的としている学問です。たまには線形代数などを勉強してみると、データ解析で使われている応用的手法が、見通しよく表現できる数学が見つかるかもしれませんね。

 

非負行列分解

データを行列とみなして

 

(y_1,y_2,...,y_n)=A(x_1,x_2,...,x_n)

⇔Y=AX

 

を解析する手法として、非負行列分解があります。

独立成分分析では、xの各成分が独立である仮定をしましたが、元々の信号源がそうでない場合もありますね。物理的には信号源は異なっているのだが、幾つかの信号源が連動して信号を出しているのであれば、それは独立ではないでしょう。

非負行列分解とは、データの値がいつでも0以上であるような場合に用いる手法です。

 

Y=AX

 

で観測データの行列Yの成分が全て非負であって、信号源Xも非負であると考えられるのであればAを推定する大きな手掛かりになります。Aも非負行列であると考えれば、更に手掛かりは多くなります(仮に行列Aが非負でない場合には、信号源Xの値の取り方によってはXが負になることも出てくるかもしれません。もちろんAが負の成分を持つとしても、Xとの積を取った際にいつでもYが正になるようにしかXが振る舞わないケースも考えられますが、非負行列分解ではAも非負であると仮定します。)

 

データが非負であるとは、例えば2次元データであれば第一象限に全てのデータが収まっているということになります。そしてこれを非負の行列Aで変換した場合には、当然第一象限に収まるだけでなく、線形変換の性質から、原点を頂点とするもっと狭い錐内にデータが収まるはずです。この錐の形をたくさんのデータから特定できれば、Aを上手く求めることができるはずです。この問題は解析的には求まらないので、最適化問題を解く必要があります。

さらなる一般化へ、テンソル分解

機械学習のトレンド

今や主成分分析や独立成分分析は、パーセプトロン学習で実装ができるものになっています。それもこれも、主成分分析や独立成分分析に対する数理の理解が伴っているからです。また統計パラメータの推測という立場に立てば、KLダイバージェンスなどを指標に最適化問題に持ち込むこともでき、やはり様々な良い解法の模索が可能になります。

対象のパラメータ推定を速く正確に行うか、パーセプトロン学習をする際の評価関数をいかなるものにするのか、これらが現在機械学習の大きなメインテーマとなっています。機械学習でよく聞く、モンテカルロ法や変分ベイズ法は最適化を上手く計算していく手法ですし、スパースコーディングは評価関数を決める指標になっています。

 

新たな手法の研究

一方で、データ解析をする上での新たな手法というものも模索されており、その1つにテンソル分解を応用しようという動きがあります。

テンソル分解は特異値分解の自然の一般化を目指しています。特異値分解が任意の形の行列を分解する一般的な手法であったのに対して、テンソル分解は任意の階数のテンソルを分解する一般的な手法であることを目指します。

テンソルの階数について説明すると、具体的には0階テンソルがスカラーで、1階テンソルがベクトル、2階テンソルが行列で、3階テンソル以降には特別な名前はありません。

スカラーを並べればベクトルができますし、ベクトルを同じ向きで並べれば行列ができます。同じように行列を同じ向きで積み重ねたもの(直方体のようなデータになるでしょう)が3階テンソルです。4階テンソルは3階テンソルを並べていったような構造になっているでしょうが、我々の認知できる3次元空間では表現できないので想像力豊かに頑張ってください。

 

これに関してはまだ私も勉強が進んでいないので、進み次第解説するかもしれません。

研究は進んでいるみたいですが、中々成果を見る機会がないので寂しいですね。