今回は深層学習のパラメータの最適化手法を備忘録として色々とまとめていきます。

kerasでのoptimizerの定義方法は以下の公式ドキュメントに全て載っているので参考にしてください。

keras公式ドキュメント(optimizer)

パラメータ更新とは

まず初めにニューラルネットワークにおけるパラメータ更新について簡単に定義しておきます。

損失関数についてのまとめでも少し言いましたが、ニューラルネットワークの学習の目的は損失関数の値を最小化するようにパラメータを設定するということです。

つまりニューラルネットワークのパラメータ更新がどのように行われるかというと、損失関数の値を最小化できるようにパラメータの更新が行われます

これを前提としてこのパラメータ更新の手法を見ていきましょう。



SGD

まずは最も単純なパラメータ更新方法であるSGD(stochastic gradient decent: 確率的勾配降下法)です。

SGDはパラメータの勾配を使って、勾配方向にパラメータを更新して徐々に最適なパラメータへと近づける方法です。

式で書くとこのようになります。

$$
\mathbf{W} \gets \mathbf{W} – \eta \frac{\partial E}{\partial \mathbf{W}}
$$

このとき更新する重みパラメータを\(\mathbf{W}\)、\(\mathbf{W}\)に関する損失関数の勾配を\( \frac{\partial E}{\partial \mathbf{W}}\)、学習係数(どのくらいパラメータを更新するか)を \(\eta\)としています。

また式中の\(\gets\)は右辺の値で左辺を更新するということを表します。

式を見ての通り単純に損失関数を小さくする方向にパラメータを移動させていく手法です。

SGDの欠点

SGDの欠点としては関数の形状が等方的でないとパラメータの更新が非効率ということがあります。

例えば、

$$
f(x, y) = \frac{1}{20}x^2 + y^2
$$

という関数があったとすると、勾配は\(x\)軸方向が極端に小さく\(y\)軸方向に大きくなり、パラメータの更新経路が\(y\)軸方向にジグザグなり非効率な経路でパラメータを探索してしまいます。

Momentum

以降SGDの欠点を改善した手法を見ていきます。

まずはMomentumです。

数式では以下のように表されます。

$$
v \gets \alpha v – \eta \frac{\partial E}{\partial \mathbf{W}}\\
\mathbf{W} \gets \mathbf{W} + v
$$

ここでの\(v\)は物理で言うところの「速度」に相当する。

パラメータの更新に慣性的な力を加える。つまり前と同じ方向にパラメータの更新が行われるときはより大きくパラメータの更新がなされる。

AdaGrad

ニューラルネットワークの学習係数では学習係数の値がかなり重要で、学習係数が小さすぎると学習に時間がかかりすぎてしまい、逆に大きすぎると発散して正しい学習が行えない。

そこで有効なのが学習係数を減衰させる方法。

このAdaGradは学習が進むにつれて学習係数\(\eta\)を小さくする方法。

数式は以下の通り。

$$
h \gets h + \frac{\partial E}{\partial \mathbf{W}} \odot \frac{\partial E}{\partial \mathbf{W}}\\
\mathbf{W} \gets \mathbf{W} – \eta \frac{1}{\sqrt{h}} \frac{\partial E}{\partial \mathbf{W}}
$$

よく動いたパラメータの学習係数は次第に小さくなるという学習係数の減衰を、パラメータの要素ごとに行うことができる。

ここで\(h\)はこれまでの勾配の値を二乗和として保持し、パラメータ更新の際に\(\frac{1}{\sqrt{h}}\)を乗算して学習係数を減衰させる。

しかし無限に学習すると\(h\)がかなり大きくなりパラメータの更新が行われなくなってします。

RMSProp

このAdaGradの無限に学習するとパラメータの更新が行われなくなるという問題を解決したのがRMSProp

$$
h \gets \alpha h + (1-\alpha) \frac{\partial E}{\partial \mathbf{W}} \odot \frac{\partial E}{\partial \mathbf{W}}\\
\mathbf{W} \gets \mathbf{W} – \eta \frac{1}{\sqrt{h}} \frac{\partial E}{\partial \mathbf{W}}\\
\alpha = 0.9
$$

勾配の2乗の指数移動平均をとるようにパラメータが更新されていく。つまり過去のAdaGradのようにすべての勾配を均一に加算するのではなく、新しい勾配の情報が大きく反映されるように加算する。

イメージとしては過去の勾配を徐々に忘れて、新しい勾配の情報が大きく反映される。
式を見て何となくわかるが、過去の勾配情報に0.9を何回も掛けたものを足しているので徐々に古いものの影響は小さくなる。

参考:https://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf

Adam

物理法則に準じる動きをするMomentum, パラメータの要素ごとに、適応的に更新ステップを調整するAdaGradを組み合わせたもの。

式は以下の通り。

$$
m \gets \beta_{1} m + (1-\beta_{1})\frac{\partial E}{\partial \mathbf{W}} \\
v \gets \beta_{2} v + (1- \beta_{2})\frac{\partial E}{\partial \mathbf{W}} \odot \frac{\partial E}{\partial \mathbf{W}}\\
\hat{m} \gets \frac{m}{1-\beta_{1}}\\
\hat{v} \gets \frac{v}{1-\beta_{2}}\\
h \gets \alpha h + (1-\alpha) \frac{\partial E}{\partial \mathbf{W}} \odot \frac{\partial E}{\partial \mathbf{W}}\\
\mathbf{W} \gets \mathbf{W} – \alpha \frac{\hat{m}}{\sqrt{\hat{v}}+\epsilon}
$$

ごちゃごちゃしてよくわからないが、最初のステップでは減衰率が小さいときなどで生じるバイアス(勾配の大きさを変えてしまうようなもの)があるが、簡単に打ち消すことができて、それはバイアス補正された推定値\(\hat{m},\hat{v}\)となるというようなことが論文で書かれている。

があまりまだ理解が完ぺきではないのでもう少し読み深める。
参考:https://arxiv.org/pdf/1412.6980v8.pdf

 

パラメータの更新イメージ

$$
f(x, y) = \frac{1}{20}x^2 + y^2
$$

を最小化するようにパラメータ\(x,y\)(初期値\((x,y) = (-7, 2)\))を更新するイメージ↓

 

深層学習に関するまとめ記事

損失関数についてのまとめ

活性化関数についてのまとめ

スポンサーリンク