深層学習5章の白色化とデノイジング自己符号化器を試してみた

お久しぶりです。

SPPnetの論文をよみつつ深層学習の青い本も読み進めてます。
青い本の5章における白色化とデノイジング自己符号化器が気になったので作って見ることにした。

白色化というのは機械学習における訓練データに偏りがあると学習の妨げになる場合があるので学習前に訓練データに何らかの処理を施し、偏り(相関でいいのかな)を除去する処理のこと。

訓練データの成分間の相関は共分散行列で与えられるっぽい
f:id:Owatank:20170826184205p:plain

この共分散行列の(p,q)成分は、訓練データのサンプルXの(p,q)成分がどの程度同じように変化するか、相関があるかを示す。

ある確率変数 X1,X2 に対しての共分散行列を以下のように定めることにする。
f:id:Owatank:20170826184749p:plain
ρ11,ρ22 はそれぞれ X1の分散、X2の分散を、ρ12 は X1とX2 の共分散を表す。
つまり対角成分に分散が、非対角成分には今日分散が並ぶ行列を共分散行列と呼ぶんだな。

確率変数が互いに独立(無相関)ならば、共分散の値は 0 になるという性質から、白色化はこの共分散行列の非対角成分を 0 にする、つまり対角行列に線形変換する操作を行っている、で合っているかな?。

手順を本通り行い、乱数のデータセットを作り試してみた。
結果はここ

元の訓練データ(正規化済み)の分布が
f:id:Owatank:20170826185721p:plain
こんな感じになる
f:id:Owatank:20170826185743p:plain

線形変換後の共分散行列が対角行列になっているかの確認が取れなかった。

おまけでデノイジング自己符号化器を作った。こっちはTensorflowで実装した。
デノイジング自己符号化器は訓練データをノイズありのもので学習し、出力でノイズなしの結果が得られることを期待する感じ。
訓練データはMNISTのデータを使った。

github.com

学習をガウス分布に従うノイズありのみのデータで行ったため、最後のソルトペッパーノイズでの出力はあまりよろしくなかった。
これを実装している時に、配列を a = b のような形でコピーして、 a の値を変える操作を行うと参照元 b の値も変化するということに気づいた。
ポインタとかそこらへんの問題かな。a = b.copy() のように copy を使うと値だけを得られるということを知った。気をつける。