メインコンテンツまでスキップ

最適化手法とバッチサイズ

  1. RMSProp
    勾配(微分値)に合わせて学習率を調整する。モメンタム SGD と違い微分値に補正をかけず学習率だけを補正する。

  2. Adam
    Momentum + RMSProp。
    RMSProp の学習率の抑制(短期的調整)とモメンタムのスムージングされた勾配変化(長期的調整)のいいとこ取り。 RMSPropはその時の勾配値によって更新量を増減させる。その勾配値を移動平均に置き換えることで勾配の変化を二十で抑える。
    移動平均の値は学習の後半ほど強く補正されるのでMomemtumの補正も強くなる。逆に言えば学習初期は両方の効果が少ないので勾配変化量が大きくなり効率的に学習されていく。

モメンタムと移動平均

移動平均

移動平均を求めると勾配変化が激しいグラフをスムーズにしたグラフが求まる。
SGDのギザギザ部分を緩やかなカーブにでき、勾配の変化しすぎを抑える。 現在までの累積和と現在の値、の和でも求まる。

νx=βνx1+(1β)V\nu_x = \beta\nu_{x-1} + (1-\beta)V

Momentum

その時の勾配ではなく移動平均した勾配を引いているだけ。

νt=βνt1+(1β)Gwt=wt1ανt\nu_t = \beta\nu_{t-1} + (1-\beta)G \rightarrow w_t = w_{t-1} - \alpha \nu_t

二人合わせてAdam

νt=β1νt1+(1β1)Gst=β2st1+(1β2)G2wt=wt1ανtst+ϵ\nu_{t} = \beta_1\nu_{t-1} + (1-\beta_1)G s_{t} = \beta_2s_{t-1} + (1-\beta_2)G^2 w_t = w_{t-1} - \alpha\frac{\nu_{t}}{\sqrt{s_t + \epsilon}}


バッチサイズが与える影響

  1. 1つのサンプルデータに対する反応度
  2. 1epochの計算速度
  3. メモリ使用量

1. 1つのサンプルデータに対する反応度

サンプリング数が増加するとサンプル分散が分布の分散に収束する、逆に言うとサンプリング数が少ない時はサンプリング結果によって損失が大きく異なる。

θt+1θtϵ(t)1Bb=0B1L(θ,mb)θ\theta_{t+1} \leftarrow \theta_{t} - \epsilon (t) \frac{1}{B} \sum_{b=0}^{B-1} \frac{\partial \mathcal{L} (\theta, \mathbf{m}_b )}{ \partial \theta }

ここで、ミニバッチの単位で重みが更新される。平均をミニバッチ毎にとって、そのミニバッチごとにパラメーターを更新する。
ということは、ミニバッチの単位が小さければ小さいほど、1つ1つのデータに敏感に反応する。逆にミニバッチの単位が大きければ大きいほど、平均化されるので、1つ1つのデータよりもミニバッチ全体の特徴を捉えるということなる。

ミニバッチのサイズが小さいほど、1つ1つのデータに敏感に反応することから、学習が安定しなくなるが、学習率などのパラメーターをいじることである程度対処できる。

2. 更新値の安定性

1epoch毎のパラメーターの更新の回数というのが、ミニバッチのサイズが小さいほど多くなるので、更新値がギザギザになる。 移動平均などをとることで対処可能。

3.メモリ使用量

サンプリング数が多いとそれだけ多くの変数を保持しなければならない。CUDAエラーとかよくなるよね。