楽屋

TensorFlowで積層自己符号化器を用いた事前学習を実装してみた

はじめに

昨今の深層学習ブームの火付け役となった事前学習を、tensorflowを使って実装してみました。 機械学習プロフェッショナルシリーズ「深層学習」、「TensorFlowで学ぶディープラーニング入門」を参考に実装を行いました。

事前学習とは

2度の冬の時代を経験した後、2006年からの深層学習ブームのきっかけとなった深層学習の精度改善手法です。 (論文PDFはこちら) 事前学習ではニューラルネットワークを学習させる際に設定する重みの初期値を、事前に別のニューラルネットワークを学習して求め、学習を最適化させます。事前学習にはRBMによるもの、自己符号化器によるものがありますが、ここでは自己符号化器を用いたものを実装します。

自己符号化器とは

自己符号化器とは、出力を入力に近づけるよう学習するニューラルネットワークです。入力に対してニューラルネットワークで変換し(Encode 符号化)、それを折り返して変換した際(Decode 復号)、元の入力に近づくように学習します。
自己符号化器のイメージ (Wikipedia オートエンコーダ より引用)
手書き文字認識データ(MNIST)を例に、自己符号化器を実装してみたものが以下になります。 自己符号化した画像を表示してみます。 結果を見ると、入力に対して自己符号化後の出力がぼやけたものとして表現されています。これは、784次元だった入力を100次元に削減して表現したためになります。(岡谷先生の本によると、これは784次元のデータを固有値の大きい順に100個固有ベクトルを抽出して表現した主成分分析と同じようです) 自己符号化器は、このようにデータの特徴を取り出せるように入力データを変換する役割がありそうです。

事前学習の実装とその結果

次に上記で説明した自己符号化器を用いて事前学習を行います。 今回は自己符号化器を組み合わせた積層自己符号化器を用いて行います。 積層自己符号化器では、以下のステップに従って自己符号化器を学習し、事前学習を行います。
  1. 多層のネットワークを複数の単層のネットワークに分割する
  2. もっとも入力に近い単層ネットワークで自己符号化器を作成し、重み \(W^\left(2\right)\)を得る
  3. 学習した重み \(W^\left(2\right)\) をセットし、出力層の表現 \(z^\left(2\right){n}\)を得る
  4. \(z^\left(2\right){n}\) を入力として、次の単層ネットワークで自己符号化器を作成、重み \(W^\left(3\right)\) を得る
  5. 層の数だけ、(3), (4)を上位層に向けて繰り返す
  6. 学習した重みを元のネットワークにセットし、出力層を含む上位層に新たな層を1層以上追加、その重みはランダムに初期化したうえで目標とする教師あり学習を実行する
「深層学習」P73 図5.10より引用
(1)~(5)の単層ネットワークでの自己符号化器の実行例は以下になります 今回は、以下のようなユニット数をもつ6層の多層ネットワークでMNISTの学習を例にして行います。 以下長くなるので省略しますが、6層分自己符号化器を使って重みの初期値を学習していきます。 2層目では、1層目の出力を入力として使用するので自己符号化器の部分は以下のようになります。 最後に、(6) 学習した重みを元の多層ネットワークにセットし、本来解くべき多層ネットワークの教師あり学習を行います。 事前学習を使わずに通常の方法で学習したネットワークと、事前学習を使って学習したネットワークのstep数ごとの精度の変化を見てみます。 30,000 step実行時点での精度は事前学習版96.4%、通常版94.6%で通常よりも2%弱上がっています。また事前学習版の方が、重みが最適値に収束していく進み具合が通常版よりも速いように見えます (事前学習の方は2000回ほどで精度90%に到達するが、通常版は4000回まで実行しないと90%の精度に到達しない) なぜこのような事前学習が効果があるのかについては、謎な部分も多いのですが(岡谷先生本でも「もっぱら経験的な知見とい うべきであり、なぜそうなるかは理論的には解明されていません」となっていました)、 自己符号化器によって、入力データの 特徴をよりうまく捉えられていることが関係しているようです。

まとめ

実装してみることで、事前学習の効果を感じることができました。

参考文献

  • 深層学習(岡谷氏著,講談社 機械学習プロフェッショナルシリーズ)
  • TensorFlowで学ぶディープラーニング入門~畳み込みニューラルネットワーク徹底解説 (中井氏著, マイナビ)