AutoEncoder による DNN パラメータ決定

ホーム 目次に戻る

AutoEncoder

DNN パラメータを推定する際の初期値として AutoEncoder の出力を使う方法を紹介します。

AutoEncoder とは、隠れ層を1段含み、入力と出力の段数が同じであるようなニューラルネットワークです。
ただし、隠れ層から出力層へのアフィン変換部分は入力層から隠れ層への係数行列の転置行列を使用します。(定数成分は異なるとする)
式で書くと、 \[ y_j = f(\sum_i w_{ij} Inp_i + b^{(1)}_j) \] \[ z_k = f(\sum_j w_{kj} y_j + b^{(2)}_k) \] となります。ここで f は Sigmoid や ReLU と言った非線形関数です。


AutoEncoder のパラメータ調整

AutoEncoder の誤差逆伝搬法によるパラメータ調整は以下の手順で行います。
  1. 乱数でパラメータを初期化する
  2. 順方向の出力値を計算する。
    このとき、入力データに若干のノイズを含ませると、過学習しにくくなります。
  3. 損失関数の微分を求める
  4. パラメータ値から、前項で求まった微分値に学習率を掛けたものを引く。
  5. 損失関数が十分小さくなるまでプロセスを繰り返す。

アフィンパラメータ \( w_{ij} \) が1段目と2段目で独立ではないため、その損失関数の微分値を求めるときは注意が必要です。結果は \[ \frac{\partial L}{\partial w_{ij}} = \frac{1}{N_{sample}}(\sum_s (z^{(s)}_i - x^{(s)}_i) y^{(s)}_j + \sum_{k, s} (z^{(s)}_k - x^{(s)}_k) w_{kj} f'(\sum_m x^{(s)}_m w_{mj} + b^{(1)}_j) x^{(s)}_i) \] となります。
学習に必要な繰り返し階数は MNIST の場合、4000回あれば十分のようです。


AutoEncoder パラメータの DNN への組み込み

AutoEncoder を使うと以下のような手順で DNN パラメータの初期値を決めることができます。
  1. 入力段と直下の隠れ層を切り出し、AutoEncoder を構成します。段数 0 の DNN を別途用意します。
  2. AutoEncoder のパラメータを計算し、DNN に追加します。
  3. 直下が出力層である場合、通常のニューラルネットを構成します。
    そうでない場合、現在注目している層とその下の隠れ層を切り出し、AutoEncoder を構成します。
  4. この時の入力データは、(部分)DNNに通した値を使用します。
  5. 直下が出力層である場合、教師データをそのまま利用します。AutoEncoder の場合は入力値が出力値にも現れるとしてパラメータを計算します。
  6. 以上の操作を出力層に達するまで繰り返します。

このようにして DNN の初期値を決めることをプレトレーニングと呼びます。


ファインチューニング

プレトレーニングによってパラメータの初期値を決めたら、通常の誤差逆伝搬法を適用します。
正解に近い値が設定されているため、速やかに損失関数が最小となるパラメータ値が算出されます。
MNIST データを使った実験では、やはり 4000 回程度で十分な収束を見るようです。
Copyright (c) 2017-2019 by TeqStock.tokyo