2016/04/16 機械学習 名古屋 第3回勉強会
勾配:
勾配降下法:
${\bf w}$ を「負の勾配方向 $-\nabla E$ に少し動かす」ことを繰り返して、その極小点を求める方法。
この $\epsilon$ を 学習係数(learning rate)と呼ぶ。
※ TensorFlow では tf.train.GradientDescentOptimizer
というクラスが用意されている。
optimizer = tf.train.GradientDescentOptimizer(0.01)
# 引数は学習係数(learning rate)
train_step = optimizer.minimize(cross_entropy)
バッチ学習(batch learning)(もしくは エポック学習(epoch learning)):
3.1 節で見た(全訓練データを利用した)勾配降下法による学習。
確率的勾配降下法(stochastic gradient descent)(もしくは 逐次的勾配降下法(sequential gradient descent)):
訓練データいくつか(極端には1つ)ずつ繰り返し適用していく勾配降下法。
SGD と略される。
バッチ学習 | SGD | |
---|---|---|
冗長性への対応 | データ量に比例して計算コストがかかる | 学習内容・計算量に影響なし |
局所解 | 望まない局所的な極小解に陥るリスクが高い | 局所的な極小解に陥るリスクが低い |
その他 SGD の利点:
ミニバッチ(minibatch):
SGD を「訓練データ1つずつ」ではなく「いくつか(10〜100)ずつ」適用する場合の、そのひとまとめにしたサンプル集合。
コード例:
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})
訓練誤差(training error):
訓練データに対する誤差(=学習結果(もしくは途中経過)の誤差関数の値)
汎化誤差(generalization error):
サンプルの母集団に対する誤差(≒未知のデータに対してどれくらい正しい推定が行えているか)の期待値
テスト誤差(test error):
訓練データとは別に用意したテストデータに対する誤差(=学習結果のモデルによる誤差関数の値)
汎化誤差の目安として利用
過適合(overfitting)(もしくは過学習(overlearning)):
訓練データに過剰に適合するように学習されて、未知のデータ(もしくはテストデータ)にうまく適合しなくなっている状態。
学習曲線を描いたとき、テスト誤差が訓練誤差と乖離してしまっている状態。
テスト誤差が乖離し始めたら学習を打ち切ることを早期終了(early stopping)(あるいは早期打ち切り)と呼ぶ。
正則化(regularization):
過適合を緩和するための(いくつかの)手法
重み減衰(weight decay):
誤差関数に重みの二乗和(二乗ノルム)を加算する正則化手法。
($\lambda$:0.01〜0.00001 くらいの範囲の定数(正則化パラメータと呼ぶこともある))
重み上限:
重みの大きさの上限を制約する正則化手法(詳細略)。
※重み減衰よりを上回る効果がある(らしい)。
ドロップアウト(dropout):
多層ネットワークのユニットを確率的に選別して学習する方法(詳細略)。
正規化(normalization)(もしくは標準化(standardization)):
データの平均を0に(および分散を1に)なるよう変換すること。
データに偏りがある場合に実行する(詳細略)。
データ拡張(data augmentation):
データを水増しすること。
訓練データが少ない場合、かつデータの「ばらつき方」が予想出来る場合に有効(詳細略)。
モデル平均(model averaging):
入力層と出力層が同じ複数のニューラルネットで別々に学習して、その平均を取ること。
3.5.3節の「ドロップアウト」もモデル平均と同じ効果が得られる(詳細略)。
tf.train.AdagradOptimizer
が用意されている)(詳細略)モメンタム(momentum):
勾配降下法において、重みの修正量に、前回の重みの修正量のいくらかを加算する方法。
ただし $$ \Delta {\bf w}^{(t-1)} \equiv {\bf w}^{(t-1)} - {\bf w}^{(t-2)} $$
TensorFlow には tf.train.MomentumOptimizer
が用意されている。
optimizer = tf.train.MomentumOptimizer(0.1, 0.9)
# 第1引数は学習係数(learning rate)、第2引数はモメンタムのハイパーパラメータ(先ほどの式の μ の値)
重みは、ガウス分布から生成したランダム値($w_{ij} \sim N(0, \sigma^2)$)で初期化する(のが一般的)。
バイアスは $0$ で初期化する(のが一般的)。
TensorFlow では、重みおよびバイアスを定義するときに tf.Variable()
の引数で指定(2.1節参照)。
W = tf.Variable(tf.random_normal([64, 10], mean=0.0, stddev=0.05))
b = tf.Variable(tf.zeros([10]))
《略》