「深層学習」読書会 〜第3章〜

2016/04/16 機械学習 名古屋 第3回勉強会

第3章 確率的勾配降下法

3.1 勾配降下法

勾配:

$$ \nabla E \equiv \frac{\partial E}{\partial {\bf w}} = \left[ \frac{\partial E}{\partial w_1}\ \ \frac{\partial E}{\partial w_2}\ \ \dots \ \ \frac{\partial E}{\partial w_M} \right]^T $$

勾配降下法:

${\bf w}$ を「負の勾配方向 $-\nabla E$ に少し動かす」ことを繰り返して、その極小点を求める方法。

$$ {\bf w}^{(t+1)} = {\bf w}^{(t)} - \epsilon \nabla E $$

この $\epsilon$ を 学習係数learning rate)と呼ぶ。

  • $\epsilon$ が小さい ⇒ 学習にかかる時間が大きくなる
  • $\epsilon$ が大きい ⇒ 極小点に収束しないことがある

※ TensorFlow では tf.train.GradientDescentOptimizer というクラスが用意されている。

In [ ]:
optimizer = tf.train.GradientDescentOptimizer(0.01)
# 引数は学習係数(learning rate)
train_step = optimizer.minimize(cross_entropy)

3.2 確率的勾配降下法

バッチ学習batch learning)(もしくは エポック学習epoch learning)):
3.1 節で見た(全訓練データを利用した)勾配降下法による学習。

確率的勾配降下法stochastic gradient descent)(もしくは 逐次的勾配降下法sequential gradient descent)):
訓練データいくつか(極端には1つ)ずつ繰り返し適用していく勾配降下法。
SGD と略される。

$$ E({\bf w}) = \sum_n E_n({\bf w}) \\ {\bf w}^{(t+1)} = {\bf w}^{(t)} - \epsilon \nabla E_n $$
バッチ学習 SGD
冗長性への対応 データ量に比例して計算コストがかかる 学習内容・計算量に影響なし
局所解 望まない局所的な極小解に陥るリスクが高い 局所的な極小解に陥るリスクが低い

その他 SGD の利点:

  • 学習の途中経過を随時確認出来る。
  • オンライン学習(=データの収集と最適化の計算を同時並行に行える)

3.3 ミニバッチ

ミニバッチminibatch):
SGD を「訓練データ1つずつ」ではなく「いくつか(10〜100)ずつ」適用する場合の、そのひとまとめにしたサンプル集合。

コード例:

In [ ]:
for i in range(1000):
    batch_xs, batch_ys = training_data.next_batch(100)
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

3.4 汎化性能と過適合

訓練誤差training error):
訓練データに対する誤差(=学習結果(もしくは途中経過)の誤差関数の値)

汎化誤差generalization error):
サンプルの母集団に対する誤差(≒未知のデータに対してどれくらい正しい推定が行えているか)の期待値

テスト誤差test error):
訓練データとは別に用意したテストデータに対する誤差(=学習結果のモデルによる誤差関数の値)
汎化誤差の目安として利用

過適合overfitting)(もしくは過学習overlearning)):
訓練データに過剰に適合するように学習されて、未知のデータ(もしくはテストデータ)にうまく適合しなくなっている状態。
学習曲線を描いたとき、テスト誤差が訓練誤差と乖離してしまっている状態。
テスト誤差が乖離し始めたら学習を打ち切ることを早期終了early stopping)(あるいは早期打ち切り)と呼ぶ。

3.5 過適合の緩和

3.5.1 正則化

正則化regularization):
過適合を緩和するための(いくつかの)手法

  • 重み減衰
  • 重み上限
  • ドロップアウト

3.5.2 重みの制約

重み減衰weight decay):
誤差関数に重みの二乗和(二乗ノルム)を加算する正則化手法。

$$ E_t({\bf w}) \equiv \frac{1}{N_t} \sum_{n \in D_t} E_n({\bf w}) + \frac{\lambda}{2}\|{\bf w}\|^2 \\ {\bf w}^{(t+1)} = {\bf w}^{(t)} - \epsilon \left(\frac{1}{N_t} \nabla E_n + \lambda {\bf w}^{(t)} \right) $$

($\lambda$:0.01〜0.00001 くらいの範囲の定数(正則化パラメータと呼ぶこともある))

重み上限
重みの大きさの上限を制約する正則化手法(詳細略)。
※重み減衰よりを上回る効果がある(らしい)。

3.5.3 ドロップアウト

ドロップアウトdropout):
多層ネットワークのユニットを確率的に選別して学習する方法(詳細略)。

3.6 学習のトリック

3.6.1 データの正規化

正規化normalization)(もしくは標準化standardization)):
データの平均を0に(および分散を1に)なるよう変換すること。 データに偏りがある場合に実行する(詳細略)。

3.6.2 データ拡張

データ拡張data augmentation):
データを水増しすること。
訓練データが少ない場合、かつデータの「ばらつき方」が予想出来る場合に有効(詳細略)。

3.6.3 複数ネットの平均

モデル平均model averaging):
入力層と出力層が同じ複数のニューラルネットで別々に学習して、その平均を取ること。
3.5.3節の「ドロップアウト」もモデル平均と同じ効果が得られる(詳細略)。

3.6.4 学習係数の決め方

  • 「手動で(試行錯誤的に)選ぶ」という方法が一般的
  • 最初は $\epsilon$ を大きめにとって、学習が進むにつれて少しずつ小さくする方法:
    • イテレーション回数に比例して小さくする( $\epsilon = \epsilon_0 - \alpha t$ )
    • ある程度学習が進んだら $1/10$ にする( $\epsilon = \epsilon_0 / 10$ )(これを繰り返す)
  • 層ごとに学習係数を変える(ReLU を利用する場合にはあまり有効ではない)
  • AdaGrad(TensorFlow にも tf.train.AdagradOptimizer が用意されている)(詳細略)

3.6.5 モメンタム

モメンタムmomentum):
勾配降下法において、重みの修正量に、前回の重みの修正量のいくらかを加算する方法。

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

ただし $$ \Delta {\bf w}^{(t-1)} \equiv {\bf w}^{(t-1)} - {\bf w}^{(t-2)} $$

TensorFlow には tf.train.MomentumOptimizer が用意されている。

In [ ]:
optimizer = tf.train.MomentumOptimizer(0.1, 0.9)
# 第1引数は学習係数(learning rate)、第2引数はモメンタムのハイパーパラメータ(先ほどの式の μ の値)

3.6.6 重みの初期化

重みは、ガウス分布から生成したランダム値($w_{ij} \sim N(0, \sigma^2)$)で初期化する(のが一般的)。
バイアスは $0$ で初期化する(のが一般的)。

TensorFlow では、重みおよびバイアスを定義するときに tf.Variable() の引数で指定(2.1節参照)。

In [ ]:
W = tf.Variable(tf.random_normal([64, 10], mean=0.0, stddev=0.05))
b = tf.Variable(tf.zeros([10]))

3.6.7 サンプルの順序

《略》