目次
最適化関数とは
最適化関数の種類
最急降下法
sgd(確率的勾配降下法)
ミニバッチsgd
モーメンタム
adagrad
rmsprop
adam
まとめ
最適化関数とは
まず初めに、最適化関数を説明するにあたり、必要な知識が「損失関数」と呼ばれる関数です。
損失関数を説明すると、想像と結果の差を数式であらわしたものです。そして、その差をなくしていくのが最終的な目標です。その目標に到達するために重みやアイアスを調整するのが、ニューラルネットワークにおける「学習」と呼ばれるものです。この「学習」を行うにあたり、正解値と予測値の差を微分(キライ)することで、勾配を求めることができます。
この勾配を利用してどのくらいの強度でパラメータを更新するかを決めているのが、今回解説する最適化関数です。
もうちょっと詳しい損失関数はこちら
最適化関数の種類
最適化関数には様々な種類があります。
たくさんあるため、今回は代表的な関数のみを解説していきたいと思います。
最急降下法
最急降下法 - 最も基本的な最適化関数です。
全てのパラメータをもとに、勾配の最も急な方向に損失関数を小さくしていく手法です。
この手法では、ひたすら小さい方向へと移動していくため、最適解ではなく「局所解」(最適化ッぽく見えるけど実は違うこと)に入ってしまうと抜け出せなくなってしまいます。また、全てのパラメータを利用しているため、計算量が大幅に増加してしまいます。
これから説明していく最適化関数は、この問題を解決するために生まれたといっても過言ではありません。
sgd(確率的勾配降下法)
SGD(確率的勾配降下法) - 基本的な計算方法は最急降下法と同じです。
違う部分は、全てのパラメータを利用するのではなく、パラメータの中からランダムに1つ選んでパラメータを更新していきます。このランダム性を利用することで、局所解にはまってしまっても抜け出せる可能性を高めています。
しかし、ランダムに1つしかパラメータを使わないため、最適化に時間がかかってしまうというデメリットがあります。
ミニバッチsgd
ミミニバッチSGD - ニバッチ学習の最適化関数をSGDにしたものです。
ミニバッチにすることで、計算量を抑えつつSGDの利点である、局所解から抜け出すことも可能となります。しかし、この方法を利用すると「Pathological Curvature」と呼ばれる鋭い勾配にはまってしまい、振動してしまうことで最小値にたどりつくまで時間がかかってしまう可能性(オーバーシュート)があります。
これから説明する最適化関数は、全てこのオーバーシュートを抑えることができます。
モーメンタム
モーメンタム - ミニバッチSGDに運動量の要素を足したものです。
勾配の大きさに応じて更新する量を変更しています。イメージとしては、坂道が急な(勾配が大きい)ほうがより速い速度でボールがころがっていき、坂道が緩やかな(勾配が小さい)場合は、ボールは転がらなくなるというイメージです。
adagrad
AdaGrad - ミニバッチSGDや最急降下法、またモーメンタムでは少しですが、最小値付近で斜面を行ったり来たりしてしまうことがあります。この問題を解決するために使われるようになりました。
原理は、学習率を元に更新する量を調整することで、学習はじめの段階では、学習率を高くすることで更新する量を大きくし、最小値に近づいてきた場合は、学習率を小さくすることで更新する量を少なくすることができます。こうすることによって、斜面を通り過ぎてしまう問題をなくしました。
rmsprop
RMSprop - AdaGradを改良した最適化関数です。
改良点は、学習率の調整をする際に過去のパラメータよりも直近のパラメータに注目して学習率を調整するようにしたものです。
adam
Adam - 現在最も使われている最適化関数です。
モーメンタムとRMSpropの良いところを組み合わせることで効率よくパラメータを更新できるようにしています。
まとめ
じゃあ結局どれを使えばいいのか?
学習率やモデルによって変わります……が基本的にAdamがいいとお思われます。
しかし、元をたどれば全て最急降下法が根底にあるので、最急降下法が理解できればほかの最適化関数の理解はさほど難しくはないと思われます。
記事作成:N&Y