確率的勾配降下法について解説!

そもそも勾配降下法って何?

ここでは数式を使って難しい話をしません。
Texを使うのが怠いし、説明しても分かりにくいからです。

前回、順伝播型ネットワークを解説した際に誤差関数について説明したと思います。

melheaven.hatenadiary.jp

学習では誤差関数E(w)の値を最小化させるため、重みパラメータWを更新するわけです。

Q. ではどのようにして誤差関数を最小化させるのか。
A. 誤差関数Eの極小となる重みwをひたすら探します。

極小値の重みwを探すには、誤差関数を微分して勾配が負となる方向へ重みパラメータWを動かし続けます。

これが勾配降下法です!

ちなみに重みWの更新料の大きさを学習係数と呼び、これが重要なパラメータにもなります。
学習係数が大きいと、E(W)が発散してしまうリスクあり。
学習係数が小さいと、更新量が小さく、E(W)の収束が遅い。

確率的勾配降下法って何?

実は今まで説明した勾配降下法ってサンプルがN個存在している場合、1~Nまでのサンプルに対して、
誤差関数を計算し、全て計算し終わった後にパラメータ更新をし続けていたのです。

バッチ学習と呼びます。

E(W)=\sum_{n=1}^{N} E_n(W)

でもこれじゃあ計算効率が悪いなあ。

それじゃあ各サンプル1個ずつに対して誤差関数を計算すればいいじゃない。
これを確率的勾配降下法(SGD)と呼びます!

SGDで便利なのは・・・

  • 計算効率の向上
  • Eを1つに集中させるのではなく、n個のEを持てる

後者はバッチ学習では、誤差関数Eが局所的な極小値に収束するところを、
SGDではN個のEを持てるので、局所的な極小値に収束するリスクを分散でき、
各N個のEから最も学習効果が最大化するEを選択できるところです!

局所的な極小値は本質的には最小値ではないことを意味してます!

ミニバッチとは?

色々SGDについて知ったけどそれでも1個ずつ計算するのは遅くて待てないよ・・・という方。

ミニバッチ学習では、バッチ学習とSGDの間を適用できます。
つまりNより小さいT個のサンプルを選択してミニバッチDtを作成します。
T個のサンプルごとの誤差関数を計算し、重みを更新できます。

E_t(W)=\frac{1}{N_t} \sum_{n}^{D_t}E_n(W)

このミニバッチのサイズはパラメータとして指定できます。