💯

ニューラルネットワークの学習

に公開

一般に 誤差逆伝播法 (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 : 出力
      • t_k : 正解 (one-hot)
      • つまり、事実上、正解インデックスの出力の ln を計算するだけ。
    • 分類問題に利用する。
    • 出力が滑らかなため、勾配法との相性が良い。
    • 確率分布の食い違いを測る指標であり、one-hotでないと利用できない。そのため分類問題(正解がone-hot)に利用する。

勾配法 (gradient method)

損失関数を最小化するパラメータ(重みとバイアス)の組み合わせを探すが、単純な総当たりは時間がかかりすぎる。そのため、勾配(パラメータを変化させたときの損失関数の変化の方向)を利用する。

  • 勾配 (gradient) : 複数の変数をもつ関数の全ての変数の偏微分をまとめたベクトル。
  • ニューラルネットワークにおいては損失関数 L(w_1,w_2,w_3,\cdots,b_1,b_2,b_3,\cdots) の勾配を求め、これを最小化していく。
    • あるパラメータに関して、損失関数の微分値(他のパラメータは現在値で与える)を求め、その値に学習率をかけた値をパラメータから差し引いてそのパラメータを更新する。
      • 微分は逆伝播法による。
        • 計算グラフは(数値微分より)計算コストが低いため。
        • アルゴリズムのテストとして(実装がシンプルな)数値微分が用いられる。
      • 対象となるパラメータは重みやバイアス等。
    • 損失関数は小さくなってほしいので、微分値(=傾き)が正の場合はパラメータを減らす・負の場合はパラメータを増やす。
\text{パラメータ} \quad x \quad \gets \quad x - \eta \frac{\partial L}{\partial x}
  • \eta学習率 (learning rate) :一回の学習でパラメータを更新する幅
    • この値が大きすぎても小さすぎてもうまくいかないので、変更しつつ確認するのが一般的。
    • これはハイパーパラメータ。
  • 初期値は乱数で与える。

関数には極小値や鞍点が存在するため、勾配が0=最小値とは限らないので注意が必要。また関数が複雑な場合「プラトー」と呼ばれる学習が進まない停滞期に陥ることがある。

  • 目的の方向によって呼び名がある。
    • 最小値を探す場合:勾配降下法 (gradient descent method)
    • 最大値を探す場合:勾配上昇法 (gradient ascent method)
    • 最急降下法・最急上昇法と訳されることもある。

確率的勾配法 (Stochastic Gradient Descent; SGD)

  1. ミニバッチ学習
    • 訓練データから任意の数のサンプルを無作為抽出し学習を行う。
  2. 勾配の算出
  3. パラメータを更新

1から3を繰り返していく。

Momentum

SGDにおける勾配は最小点を指すわけではなく、その点における傾きにすぎない。そのため、常に一定の学習率で更新するのは効率が悪い(行きすぎてジグザグになってしまう)。

そのため、毎回一定の学習率で更新するのではなく、前回の変化量を記憶しておき、それを足すことで「勢い」を表現し、変化を滑らかに(ジグザグを抑制)する。

\begin{align*} \text{変化量} \quad v \quad &\gets \quad \alpha v - \eta \frac{\partial L}{\partial x} \\[1em] \text{パラメータ} \quad x \quad &\gets \quad x + v \end{align*}

上の \alpha は前回の変化量を加える度合いで、「勢い」の概念における摩擦にあたる。典型例は 0.9

例えば「前回と逆方向だが前回よりも幅が小さい」場合、「前回と同じ方向に少しだけ進む」ことになる。物体に力が加わる様子のアナロジーで想像するとわかりやすい。

AdaGrad (Adaptive Gradient)

SGD, Momentumでは学習率は静的だった。しかし、学習序盤(最小値から遠い点)ではパラメータは大きく更新し、終盤(最小値に近い点)では小さく更新した方がよいと考えるのが自然。これを実現するアイデアが 学習率の減衰 learning rate decay

AdaGradでは、パラメータ単位でこれまでの学習量を記録し、更新量が多いパラメータは学習率が下がる。

\begin{align*} \text{累積二乗勾配} \quad h \quad &\gets \quad h + \left(\frac{\partial L}{\partial x}\right)^2 \\[1em] \text{パラメータ} \quad x \quad &\gets \quad x - \eta \frac{1}{\sqrt{h} + \epsilon}\frac{\partial L}{\partial x} \end{align*}

\epsilon0 で割ることを防ぐための極小値で、典型例は 10^{-7}

RMSProp

AdaGradの問題点として「過去に一度でも大きな勾配が出たパラメータは二度と大きく動けない」、つまり、例えば局所的に大きな更新量を通ったパラメータはその後大きく更新できないというものがある。

RMSPropはこの問題点へのアプローチとして「移動平均」つまり過去の更新量を次第に忘れていく。

\begin{align*} \text{指数移動平均二乗勾配} \quad h \quad &\gets \quad \rho h + (1-\rho) \left(\frac{\partial L}{\partial x}\right)^2 \\[1em] \text{パラメータ} \quad x \quad &\gets \quad x - \eta \frac{1}{\sqrt{h} + \epsilon}\frac{\partial L}{\partial x} \end{align*}

\rho は減衰率(典型例 0.9 )。

Adam

MomentumとAdaGradを掛け合わせたアイデア。

初期値

  • 初期値として均一な値を与えてはならない。
    • 全てのパラメータの勾配が同じになってしまう。
  • 乱数を与えるのが基本。
  • 乱数の与え方として色々ある。
    • 各層のアクティベーションの分布が適度な広がりを持つ必要がある。
    • 初期値の与え方
      • Xavierの初期値
        • シグモイド関数(または tanh)に対して用いられる。
        • \displaystyle \sigma^2 = \frac{1}{\text{前層のノード数}} の正規分布で初期化。
      • Heの初期値
        • ReLU(またはGELU)に対して用いられる。
        • \displaystyle \sigma^2 = \frac{2}{\text{前層のノード数}} の正規分布で初期化。

Batch Normalization

  • 各層において、前層からの入力データを正規化する。
    • その上でスケール \gamma とシフト \beta を学習可能パラメータとして持つ。
      • スケール \gamma は重み的に乗算する
      • シフト \beta はバイアス的に加算する
  • Affineレイヤと活性化関数の間に挿入する。
  • メリット
    • 学習率を大きく設定できる
    • 初期値にロバスト(それほど依存しない)
    • 過学習を抑制

正則化 (Regularization)

過学習(訓練データには高い精度を持つが、テストデータでの精度が低い状態)への対応。

荷重減衰 (weight decay)

大きな重みを持つことにペナルティを与える。

L1ノルム、L2ノルム、L \infty ノルム(MAXノルム)がある。

Dropout

学習時に、ランダムに選んだノードを除去する。

アンサンブル学習

同じ内容のモデルを複数独立して学習させ、推論時にはその出力の平均をとる。精度が数%向上するらしい。当然コストがかかる。Dropoutは、ひとつのネットワークで擬似的にアンサンブル学習を行っているとみなせる。

ハイパーパラメータの検証

  • ハイパーパラメータの設定は重要だが、学習可能変数でないので設定が難しい。
  • 原始的な最適化の手法としては、
    • 独立した検証データを用意
    • ハイパーパラメータの範囲を設定する
    • 範囲からランダムサンプリングする
    • 小さなエポックを回す
    • 100回程度繰り返し、認識精度のよいハイパーパラメータの範囲を絞っていく
  • または ベイズ最適化 (Bayesian optimization) がある。

Discussion