ニューラルネットワークの学習
一般に 誤差逆伝播法 (Backpropagation) による。
- 学習:重みパラメータの自動獲得
- 損失関数 (loss function) が最小化される重みパラメータを探す。
- 学習には訓練データ(教師データ)とテストデータを用意するのが一般的。
- 汎化能力を評価する必要があるため。
- 特定のデータセットに過度に対応した状態を「過学習 overfitting」と呼ぶ。
- 学習の単位として、訓練データを使い切った= 1 epoch と呼ぶ。
前提知識
損失関数 (loss function)
ニューラルネットワークが教師データに適合していない度合いを表す。損失関数を最小化することがニューラルネットワークの学習の目的であり、これを 最適化 optimization という。任意の関数を用いることができるが、2乗和誤差 (mean squared error) や交差エントロピー誤差 (cross entropy error) が一般的。
- 2乗和誤差 (mean squared error)
- サンプル数で割る前の分散。特に割る意味がないので省略している。
- 連続的なので回帰問題に利用する。
- 分類問題(正解がone-hot)にも利用できるが、「確率的な違い」に適切な勾配を与えられない。この場合、交差エントロピー誤差と比べて学習効率・最終精度が悪くなりやすい。
- 交差エントロピー誤差 (cross entropy error)
-
\displaystyle E = - \Sigma_k t_k ln_{y_k} -
: 出力y_k -
: 正解 (one-hot)t_k - つまり、事実上、正解インデックスの出力の
を計算するだけ。ln
-
- 分類問題に利用する。
- 出力が滑らかなため、勾配法との相性が良い。
- 確率分布の食い違いを測る指標であり、one-hotでないと利用できない。そのため分類問題(正解がone-hot)に利用する。
-
勾配法 (gradient method)
損失関数を最小化するパラメータ(重みとバイアス)の組み合わせを探すが、単純な総当たりは時間がかかりすぎる。そのため、勾配(パラメータを変化させたときの損失関数の変化の方向)を利用する。
- 勾配 (gradient) : 複数の変数をもつ関数の全ての変数の偏微分をまとめたベクトル。
- ニューラルネットワークにおいては損失関数
の勾配を求め、これを最小化していく。L(w_1,w_2,w_3,\cdots,b_1,b_2,b_3,\cdots) - あるパラメータに関して、損失関数の微分値(他のパラメータは現在値で与える)を求め、その値に学習率をかけた値をパラメータから差し引いてそのパラメータを更新する。
- 微分は逆伝播法による。
- 計算グラフは(数値微分より)計算コストが低いため。
- アルゴリズムのテストとして(実装がシンプルな)数値微分が用いられる。
- 対象となるパラメータは重みやバイアス等。
- 微分は逆伝播法による。
- 損失関数は小さくなってほしいので、微分値(=傾き)が正の場合はパラメータを減らす・負の場合はパラメータを増やす。
- あるパラメータに関して、損失関数の微分値(他のパラメータは現在値で与える)を求め、その値に学習率をかけた値をパラメータから差し引いてそのパラメータを更新する。
-
は 学習率 (learning rate) :一回の学習でパラメータを更新する幅\eta - この値が大きすぎても小さすぎてもうまくいかないので、変更しつつ確認するのが一般的。
- これはハイパーパラメータ。
- 初期値は乱数で与える。
関数には極小値や鞍点が存在するため、勾配が0=最小値とは限らないので注意が必要。また関数が複雑な場合「プラトー」と呼ばれる学習が進まない停滞期に陥ることがある。
- 目的の方向によって呼び名がある。
- 最小値を探す場合:勾配降下法 (gradient descent method)
- 最大値を探す場合:勾配上昇法 (gradient ascent method)
- 最急降下法・最急上昇法と訳されることもある。
確率的勾配法 (Stochastic Gradient Descent; SGD)
- ミニバッチ学習
- 訓練データから任意の数のサンプルを無作為抽出し学習を行う。
- 勾配の算出
- パラメータを更新
1から3を繰り返していく。
Momentum
SGDにおける勾配は最小点を指すわけではなく、その点における傾きにすぎない。そのため、常に一定の学習率で更新するのは効率が悪い(行きすぎてジグザグになってしまう)。
そのため、毎回一定の学習率で更新するのではなく、前回の変化量を記憶しておき、それを足すことで「勢い」を表現し、変化を滑らかに(ジグザグを抑制)する。
上の
例えば「前回と逆方向だが前回よりも幅が小さい」場合、「前回と同じ方向に少しだけ進む」ことになる。物体に力が加わる様子のアナロジーで想像するとわかりやすい。
AdaGrad (Adaptive Gradient)
SGD, Momentumでは学習率は静的だった。しかし、学習序盤(最小値から遠い点)ではパラメータは大きく更新し、終盤(最小値に近い点)では小さく更新した方がよいと考えるのが自然。これを実現するアイデアが 学習率の減衰 learning rate decay 。
AdaGradでは、パラメータ単位でこれまでの学習量を記録し、更新量が多いパラメータは学習率が下がる。
RMSProp
AdaGradの問題点として「過去に一度でも大きな勾配が出たパラメータは二度と大きく動けない」、つまり、例えば局所的に大きな更新量を通ったパラメータはその後大きく更新できないというものがある。
RMSPropはこの問題点へのアプローチとして「移動平均」つまり過去の更新量を次第に忘れていく。
Adam
MomentumとAdaGradを掛け合わせたアイデア。
初期値
- 初期値として均一な値を与えてはならない。
- 全てのパラメータの勾配が同じになってしまう。
- 乱数を与えるのが基本。
- 乱数の与え方として色々ある。
- 各層のアクティベーションの分布が適度な広がりを持つ必要がある。
- 初期値の与え方
- Xavierの初期値
- シグモイド関数(または
tanh
)に対して用いられる。 -
の正規分布で初期化。\displaystyle \sigma^2 = \frac{1}{\text{前層のノード数}}
- シグモイド関数(または
- Heの初期値
- ReLU(またはGELU)に対して用いられる。
-
の正規分布で初期化。\displaystyle \sigma^2 = \frac{2}{\text{前層のノード数}}
- Xavierの初期値
Batch Normalization
- 各層において、前層からの入力データを正規化する。
- その上でスケール
とシフト\gamma を学習可能パラメータとして持つ。\beta - スケール
は重み的に乗算する\gamma - シフト
はバイアス的に加算する\beta
- スケール
- その上でスケール
- Affineレイヤと活性化関数の間に挿入する。
- メリット
- 学習率を大きく設定できる
- 初期値にロバスト(それほど依存しない)
- 過学習を抑制
正則化 (Regularization)
過学習(訓練データには高い精度を持つが、テストデータでの精度が低い状態)への対応。
荷重減衰 (weight decay)
大きな重みを持つことにペナルティを与える。
L1ノルム、L2ノルム、L
Dropout
学習時に、ランダムに選んだノードを除去する。
アンサンブル学習
同じ内容のモデルを複数独立して学習させ、推論時にはその出力の平均をとる。精度が数%向上するらしい。当然コストがかかる。Dropoutは、ひとつのネットワークで擬似的にアンサンブル学習を行っているとみなせる。
ハイパーパラメータの検証
- ハイパーパラメータの設定は重要だが、学習可能変数でないので設定が難しい。
- 原始的な最適化の手法としては、
- 独立した検証データを用意
- ハイパーパラメータの範囲を設定する
- 範囲からランダムサンプリングする
- 小さなエポックを回す
- 100回程度繰り返し、認識精度のよいハイパーパラメータの範囲を絞っていく
- または ベイズ最適化 (Bayesian optimization) がある。
Discussion