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

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

HELLO CYBERNETICS

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

自己符号化器(オートエンコーダ)と主成分分析との関係

 

 自己符号化器の役割

 自己符号化器は入力の有用な特徴を抽出すると言われていますが、なぜに自己符号化器がそれを可能にしているのかを見てみましょう。

自己符号化器の構成方法

簡単な例で行くと、入力が3次元でこれを2次元に落としたいという場合には以下のように自己符号化器を構成します。

1. 3→2→3のネットワークを構成する

2. このネットワークを入力\bf x出力\bf yとして、\bf y ≒ xとなるように学習

3. 学習で獲得した3→2のネットワーク部分のみを取り出す。

f:id:s0sem0y:20160424070244p:plain

 

入力の次元が3次元であるものを、2次元に落としてから、これをもう一度3次元に復元し、ほとんど同じ値を獲得できるのであれば、2次元に落ちてもなお元々の重要な情報を維持できているということになります(というより、なるべく維持できるように変換を獲得する)。

 

数式を見る

ネットワークの構成を考えれば、3→2の変換についてはf_1を活性化関数として

 

{\bf z} = f_1({\bf W^{(1)}x+b^{(1)}})

 

\bf W^{(1)} \in R^{2×3}

\bf b^{(1)} \in R^{2×1}

 

となります。 

2→3の変換については

 

{\bf y} = f_2({\bf W^{(2)}z+b^{(2)}})

 

\bf W^{(2)} \in R^{3×2}

\bf b^{(2)} \in R^{3×1}

 

となります。中間層の活性化関数は何でもよく、出力層は自分自身への回帰問題なので恒等写像とします。従って、この変換をすべて一気に表すと

 

{\bf y} = {\bf W^{(2)}} f_1 \left({\bf W^{(1)}x + b^{(1)}} \right)+\bf b^{(2)}

 

このようにして得られる\bf y\bf xに近づけるということです。

 

損失関数を見る

回帰問題なので損失関数は二乗誤差です。

すなわちデータ\bf x_iN個ある場合は

 

L({\bf W^{(1)},W^{(2)}}) = \sum_i^N (\bf y_i - x_i)^2

 

となります。変換された式を明示的に書けば

 

L({\bf W^{(1)},W^{(2)}}) = \sum_i^N (\bf {\bf W^{(2)}} f_1 \left({\bf W^{(1)}x_i + b^{(1)}} \right)+\bf b^{(2)} - x_i)^2 

 

となっています。

 

主成分分析の復習

主成分分析の復習

主成分分析とは、データ\bf x \in R^{D}は成分が無相関な潜在的データ\bf zが変換\bf Oを受けて観測されていると考えます。

 

f:id:s0sem0y:20161121033709p:plain

 

 

いま、観測データの平均は0であるとします(そうなるように平行移動すればいい)。

 

 \bf x=Oz

 

ここでデータ\bf xに関する分散共分散行列は

 

V_x=E(\bf xx^T )

 

で表されます。一方で潜在的データ\bf zの分散共分散行列は

 

V_z=E({\bf zz^T})=E({\bf Oxx^TO^T})=E({\bf OV_xO^T})

 

です。潜在的データ\bf zは成分が無相関であるという過程を設けているため、分散共分散行列は対角行列にならなければなりません。従って、

 

\bf OV_xO^T = diag(λ_1,λ_2,...,λ_D)

 

と表されます。右辺はλ_iを対角成分に持つ対角行列を表しています。

分散共分散行列は一般に対称行列ですから、固有ベクトルは必ず互いに直行します。言い換えれば、直交行列により固有値分解が可能ということです。そして直交行列\bf Oの逆行列は必ず \bf O^Tで求まります。

すなわち上の数式(主成分分析)は、データの分散共分散行列\bf V_x

 

\bf V_x=O^TΛO

 

と固有値分解することに等しいのです。

主成分分析ではこのようにして求まる\bf Oにより

 

 \bf x=Oz

 

というデータが得られていると考えているわけですから、潜在的なデータ\bf z

 

 \bf z=O^Tx

 

により復元されます。ここで、わざと\bf x \in R^Dよりも小さな次元の\bf z \in R^dを獲得したいならば、固有値の大きな成分から順に残していきます。なぜならば固有値は潜在的データにおける分散を表現しているのであって、分散が小さな値というのはほとんど変化しない(事実上一定値だと考えられるほどに変動が小さい)ので、データの特徴として意味のないものだと考えられるからです。

 

主成分分析の次元削減

主成分分析による次元削減は固有値の大きい方から残していくということでいいのですが、もしも仮に、どのくらいの次元に落とすのか予め決めてあるのならば、それを達成する行列\bf  W \in R^{D×d}を直接推定することもできます。 

 

固有値の大きい順に固有ベクトルを並べた行列\bf W=(o_1,o_2,...,o_d) \in R^{D×d}を考えます。D次元空間上にデータ\bf xがあり、これをd次元の部分空間の押し込めたい場合は、

 

\bf y = WW^Tx

 

と変換をします。\bf W^T \in R^{d×D}なので、xは固有ベクトルo_iが張る部分空間に射影されます。これを\bf W \in R^{D×d}で復元すると元のD次元空間にデータ点を戻すことができますが、一度部分空間に射影した時に落ちた情報は戻ってきません。

 

f:id:s0sem0y:20161121034549p:plain

 

 

 

このような射影による切り捨て誤差を最小にするように以下の損失関数を設定します(図の破線の長さが切り捨て誤差に相当する)。

 

L({\bf W})=\sum_n \bf (x_n - WW^Tx_n)^2

 

これを解くことにより変換\bf W^Tが得られます。

 

 

ずっと\bf xの平均は0ということで話をしましたが、データがあるならば平均を求めるのは容易であり、その平均を\bf μと置けばここでは

 

L({\bf W})=\sum_n \bf \left( (x_n-μ) - WW^T(x_n-μ)\right)^2 

 

となりますが、予め引いておけば固有値問題を考える時に楽です(分散共分散行列を求めるときにどの道平均を計算しなければならない)。

 

自己符号化器と主成分分析

損失関数の書き換え

先ほど得られた損失関数は

 

L({\bf W^{(1)},W^{(2)}}) = \sum_i^N (\bf {\bf W^{(2)}} f_1 \left({\bf W^{(1)}x_i + b^{(1)}} \right)+\bf b^{(2)} - x_i)^2

 

 

でしたが、中間層の活性化関数f_1も恒等写像にしてしまいましょう。

つまり中間層は単に次元を落とすだけのものであり、非線形変換は行いません。

 

L({\bf W^{(1)},W^{(2)}}) = \sum_i^N (\bf {\bf W^{(2)}} \left({\bf W^{(1)}x_i + b^{(1)}} \right)+\bf b^{(2)} - x_i)^2

 

これにより以上の数式が得られますね。主成分分析との比較をするためこれを整理して

  

L({\bf W^{(1)},W^{(2)}}) = \sum_i^N (\bf W^{(2)}W^{(1)}(x_i + {W^{(1)}}^{-1}b^{(1)}) - (x_i - b^{(2)} ))^2

 

と表しておきましょう。

 

主成分分析との比較

次元削減を予め決めている主成分分析の損失関数と比較してみましょう(添字は揃えます)。損失関数の中身は二乗なので、正負は入れ替わってもよく、主成分分析の損失関数(上)と自己符号化器の損失関数(下)

 

L({\bf W})=\sum_i^N \bf (WW^T(x_i-μ)-(x_i - μ))^2

 

L({\bf W^{(1)},W^{(2)}}) = \sum_i^N (\bf W^{(2)}W^{(1)}(x_i + {W^{(1)}}^{-1}b^{(1)}) - (x_i - b^{(2)} ))^2

 

このように見ると明らかで、自己符号化器は中間層を恒等変換にする条件によって主成分分析と同じ結果を返してきます。自己符号化器の学習では{W^{(1)}}^T=W^{(2)}という制限を設ける、あるいは設けなくともそのような結果になることがよくあることが知られています。

 

主成分分析との関連を知ると、そういう設定を行うことに意味があることも、そう結果的に学習されることも頷けるところでしょう。

 

自己符号化器の価値 

非線形性を容易に表現

もしも中間層に活性化関数を導入しないというのであれば、主成分分析をしたほうがはるかに計算が速いです。なぜなら上記したように主成分分析は固有値問題だからです。大抵の場合、これは素早く解く実装がすでに存在しており、誤差逆伝搬法より一般的に計算量は少ないです。

 

従って、自己符号化器を用いるならば、中間層を恒等写像以外にしなければ価値がありません。

それはシグモイド関数でもReLUでも構わないでしょう。データを上手く表現する何かを、気軽に試せるところが自己符号化器の強みかもしれません。

自前の活性化関数を考えても、順伝搬の変換と学習の際の微分の値が変わるだけです。

これは実装上ほとんど手間がかかりません。

 

雑音に対するモデル構築が容易

また、データ\bf xに対して\bf x+εと誤差を混ぜ込んでおきながら、出力は\bf y = xとなるように自己符号化器を構成することで、ノイズが生じた時にそれを取り除いて情報を圧縮する仕組みが学習されることが期待できます。

 

自己符号化器で学習した際の一層目も二層目も両方用いれば、ノイズを取り除く仕組みがそのものが構築されることが期待できます。

 

データにノイズが混入した場合の主成分分析は、確率的主成分分析や因子分析のモデルで扱うことができますが、問題はかなり複雑化します(学習の計算自体は高速になる)。

 

ニューラルネットワークの良い初期状態を与える

自己符号化器を構成した後、ソフトマックス関数を用いた出力層を最後に加え、普通に分類の教師あり問題を自己符号化器の\bf Wを初期値に学習を行うと、精度が良くなることが報告されています。

 

実際には、たちの悪い局所解に捕まりづらくなるということで、最高精度が保証されるわけでありませんが、学習の初期状態をどうするかに関しては様々な問題と対策が存在しますから、その1つと考えるといいでしょう。

 

また、自己符号化器は多層に積み重ねることができます。例えば、

「10→8→10」、「8→6→8」、「6→4→6」

などと順番に構成していき、最後に「10→8→6→4」とニューラルネットを構成できるということです。

 

近年は、自己符号化器を多層化する学習自体に時間が掛かるということで省略される場合が多いです(代わりにReLUなど勾配消失が起こらない単純な活性化関数を用いる)。