今日は受験生向けオープンキャンパス.たかたかも研究室公開に参加するため,日曜出勤です.最近の休日出勤の定番,いつものX登校プチコース10.5kmをランニング70分.で,わかったことがひとつ….夏はシャツの替えだけやのうて,替え短パンと替えパンツも用意せなあかんです….膝下丈の薄手のズボン履いて走ってたら,汗で中までぐっしょり.替えを用意してなかったので,自分の部屋に着いたらズボンを扇風機にかぶせて乾燥.30分かけて半分くらい乾いたとこで時間切れ,諦めて履くはめになりました.中の方は…お察しください (^^;
さて,オープンキャンパスのあとでちょこちょこっと Denoising Autoencoder の実験をしてみる - まんぼう日記 のつづき.MNIST の画像を使った実験もやってみました.
MNISTのデータで実験
実験条件
MNIST の学習画像の先頭から2000枚を取り出して学習画像に.また,その続きの2000枚をテスト画像に.前回同様に,ノイズを加えていない学習データを \( X_{\rm org} \),これにノイズを加えたものを \( X_{\rm noisy } \) と表記することにします.ノイズは,元の画素値 \( x \) を確率 \( p \) で反転させる( \( 255 - x \) にする)というもの.ノイズの確率は \( p = 0.1 \) 固定.こんな感じ:
左はテストデータオリジナルの最初の50個,右はそれに画素値反転のノイズを加えたもの.
MNIST だから入力の次元数は \( D = 768 \).ネットワークは素子数 D - H - D の3層で,\( H = 1000 \) .活性化関数は隠れ層出力層とも線形としました.コスト関数は平均二乗誤差,学習則は慣性項付き最急降下法(一括修正)です.学習回数は5000回としました.
学習データの与え方は,前回同様の3通り:
- 入力出力とも \( X_{\rm org} \)
- 入力出力とも \( X_{\rm noisy} \)
- 入力は \( X_{\rm noisy} \),出力は \( X_{\rm org} \)
1. と 2. は従来の autoencoder,3. が denoising autoencoder (もどき)です. 何が「もどき」かは,前回の「注意」参照.
Theano + Numpy + OpenCV で作ったプログラム
-
ex150718-2.py: 前回( Denoising Autoencoder の実験をしてみる - まんぼう日記 )作った nnet150718.py 使ってます.また,大石東バイパスとTheanoでGPGPU - まんぼう日記 のリンク先にある mnist0118.py も使ってます.
実験結果と考察
こんなんなりました.
条件 | 誤差(*1) | ノイズありテストデータに対する出力 |
---|---|---|
1. | 0.077 | |
2. | \( 1.2\times 10^{-21} \) | |
3. | 6.5 |
(*1): 学習終了時の学習データに対する平均二乗誤差
今回の実験では \( H > D \) ですので,条件 1. と 2. の場合は単に恒等写像を学習するだけで誤差を 0 にすることができます.条件 2. では実際にそうなってしまい,ネットワークにデータを再構成させるとほとんど入力と同じものが出てくるだけで,ノイズは除去されていません.条件 1. はそれよりましですが,あまりノイズを除去できてません.一方,条件 3. では,かなりノイズを除去できていることがわかります.
また,図は割愛しますが,ノイズなしテストデータに対する出力は,3条件いずれもほとんど入力そのままでした.
以上のことから,条件 3. すなわち denoising autoencoder を用いた場合に,データの本質を最もよくとらえた内部表現を獲得できたと言えそうです.