hiden-cubistのブログ

機械学習などの技術や投資に関する情報を記事にしています。

深層学習第3章

深層学習(機械学習プロフェッショナルシリーズ、岡谷貴之)を読み進めていきます。第3章のテーマは確率的勾配降下法です。 ネットワークの学習には様々なノウハウがありますが、厳密な理論が伴っていないものが多く、性能を上げるためにどのノウハウを利用するべきかという点や、どれだけ性能が上がるのかが分からない点で実装する時に問題になりそうです。

確率的勾配降下法(stochastic gradient descent)


w^{(t+1)} = w^{(t)} - \epsilon \nabla E_n

通常の勾配降下法では、全訓練サンプルの誤差の合計の勾配を用いるが(バッチ学習、batch learning)、確率的勾配降下法はサンプルのうち1つだけを用いてパラメータを更新する。サンプルは更新のたびに取り換える。 確率的勾配降下法を用いると、訓練データに冗長性がある場合に計算効率が上昇する。また、局所極小解にトラップされてしまうリスクを低減できる。 さらに、学習の途中経過をより細かく監視できたり、訓練データの収集と最適化の計算を同時並行で行う(オンライン学習)ことができる。

ミニバッチ(minibatch)

並列計算資源を有効に利用するためにミニバッチと呼ばれるサンプル集合を用いて重みを更新することもできる。


\displaystyle E_t(w) = \frac {1} {N_t} \sum_{n \in D_t} E_n(w)

 N_t = |D_t|はミニバッチのサンプル数。正規化することで学習係数の調整が不要となる。また、通常 D_tは学習前に固定するが、そのサイズをあまり大きくすると確率的勾配降下法のメリットを生かせないので、大体10~100前後とすることが多い。

汎化性能と過適合

訓練データに対する誤差を訓練誤差(training error)、サンプルの母集団に対する誤差を汎化誤差(generalization error)という。汎化誤差を小さくすることが目標だが、直接求められないため、訓練データと異なるテストデータを用意しその誤差であるテスト誤差(test error)を小さくする。 通常訓練誤差は単調減少するが、テスト誤差は訓練誤差と乖離してしまう。その状態を過適合(overfitting)と呼び、途中で学習を終了させる(早期終了、early stopping)こともある。

過適合の緩和

過適合を防ぐために重みの自由度を制限する正則化(regularization)が有効である。

重み減衰

誤差関数


\displaystyle E_t(w) =  \frac {1} {N_t} \sum_{n \in D_t} E_n(w) + \frac {\lambda} {2} \|w\|^{2}

勾配降下法


\displaystyle w^{(t+1)} = w^{(t)} - \epsilon (\frac {1} {N_t} \sum \nabla E_n + \lambda w^{(t)})

重み上限


\displaystyle \sum_{i} w_{ji}^{2} < c

この不等式が満たされていない場合は、各重みに1以下の定数を掛けて満たされるようにする。

ドロップアウト

各層のユニットを決まった割合pで選出しそれ以外を無効化する。これによって推論時に重みが1/p倍になっているため学習後に出力をp倍する。

学習のトリック

汎化性能の向上や学習の高速化のための様々なノウハウが存在する。

正規化(normalization of data)

線形変換によって平均を0、分散を1にする。

データ拡張(data augmentation)

データに何らかの加工をすることでデータを水増しする。例えば画像データなら、平行移動、鏡像反転、回転移動などの幾何学的変形や、濃淡や色の変更、ランダムノイズの付加などを行う。

モデル平均(model averaging)

複数のニューラルネットを訓練し、出力の平均を予測値とする。計算量の増加が欠点となる。ドロップアウトは、単一のネットワークで複数のネットワークのモデル平均をとることに相当する効果があると考えられている。

学習係数

学習係数は手動で試行錯誤して値を選ぶのが一般的である。学習の進捗とともに学習係数を小さくする、また、ネットワークの各層の重みの更新速度がなるべく揃うように各層の重みを設定するのが良いとされている。 学習係数を自動で定める方法もあり、AdaGradが良く使われている。AdaGradでは、勾配の更新量を


\displaystyle - \frac {\epsilon} {\sqrt {\sum_{t' = 1}^{t} g_{t', i}^{2}}} g_{t, i}

g_{t} = \nabla E_{t}

とする。まれに表れる勾配の成分では分子が小さくなるので勾配が大きくなる。

モメンタム(momentum)

以下のように重みを更新する。


w^{(t+1)} = w^{(t)} - \epsilon \nabla E_{t} + \mu \Delta w^{(t-1)}


\Delta w^{(t-1)} = w^{(t)} - w^{(t-1)}

過去の重みの修正量に比例する値を加えることで、誤差関数が谷状の場合に振動を抑制する。

重みの初期化

一般的には平均0、標準偏差 \sigmaガウス分布から生成したランダムな値を初期値にする。 標準偏差を大きくすると初期の学習は早く進むが、誤差関数の減少が早く停止してしまう。また、活性化関数がロジスティック関数のような上下限のある関数の場合、標準偏差が小さ過ぎると入力が等しく0とするのと変わらなくなってしまい、一方大きすぎると入力が上下限の値に偏ってしまい誤差関数の微分が0に近くなり学習がうまく進まない。 よって、ユニットへの総入力の分散を \sigma_{u}^{2}にしたいとき、入力の分散はMを入力の結合数として、


\sigma = \frac {\sigma_u} {M^{\frac {1} {2}}}

とすれば良い(データを全てa倍すると分散はaの二乗倍となることに注意)。 他にも、事前学習によって初期値を決める方法もある。

サンプルの順序

確率的勾配降下法によって訓練サンプルを使う順序には自由度があるが、一般的には外れ値ではないがネットワークが見慣れないサンプルを先に使った方が学習が早く進むとされている。

深層学習 (機械学習プロフェッショナルシリーズ)

深層学習 (機械学習プロフェッショナルシリーズ)