ディープラーニングG検定の勉強中 その26(勾配降下法または最急降下法)

書籍「最短コースでわかるディープラーニングの数学」の内容に沿って勉強しています。

今回は、勾配降下法(最急降下法)について見ていきます。

参考サイト
スマナビング!(最急降下法の仕組みをイラストでわかりやすく解説)

これまで、関数に対する微分を算出してきたのは、とある曲線に引かれる接線の傾きを知るためでした。
2次関数f(x) = x^2の場合だと、そのグラフは接線の傾きが小さい(水平に近い)ほど、極小値に近いことを意味していました。

上記の関数のように1変数関数の2次関数の場合は y = a(x - p)^2+q で極小値を求めることができましたが、
多変数関数の場合は、偏微分と学習率を用いた「勾配降下法」にて極小値を算出します。
ちなみに、ディープラーニングでは、極小値から離れている値は「誤差」を意味し、学習はできるだけ処理結果(出力層のデータ)と正解データとの誤差を小さくするために行います。

接線の傾きの性質として、接点が極小値に近い場合は、接線の傾きは小さく(つまり微分値が小さい)、
極小値から離れている場合は傾きが大きく微分値も大きいことが挙げられます。

そこで、接点を極小値に近づけるため、微分値の大きさに応じた一定の負の値を掛けることで適度な変化値を得ようとするのが勾配降下法の手法です。

2変数関数の勾配降下法の公式

式2
4-5-4.png

この式によって、学習率が0 < α < 1のときに、勾配降下法を k 回実施したときよりも、k + 1 回実施したほうが 微分値が小さくなり、結果として実施のたびに極小値に近づくことになります。

ただし、学習率が範囲内のときでも、関数によっては発散して正しい微分値とならない場合があるため、入力層のデータごとに適した学習率を設定する必要があります。


こちらのサイトで、Pythonによる勾配降下法を実装したソースが公開されておりますので、

参考サイト
Qiita(最急降下法の概要)

私もこのソースをお借りして、下記の2変数関数の極小値を求めてみました。

式3
4-5-5.png

式4 上記の各偏微分
4-5-6.png


学習率0.18の場合
更新後の変数 u v: [-0.7391305 -0.3043478]
更新後のf(u,v): -1.7
更新後の勾配: [-0.0000008 0.0000004]
4-5-1.png

学習率0.02の場合
更新後の変数 u v: [-0.7391302 -0.3043475]
更新後のf(u,v): -1.7
更新後の勾配: [0.0000005 0.0000008]
4-5-2.png


学習率が大きいと極小値までの実施回数が少なくて済みますが、極小値にたどり着く前に発散などのために有効な学習が終わってしまう場合があります。
一方、学習率が小さいほど、極小値により近い値まで近づくことが可能となりますが、学習回数は増えるため、入力データが多い場合は時間がかかってしまうことになります。


なお、勾配降下法では、仮の極小値(局所最適解や停留値)というトラップにかかって正しい極小値に到達できないことがあるため、確率的勾配降下法やミニバッチ学習法等、勾配降下法の欠点を補う手法が機械学習で使われるようです。


今回でテキストの第4章、多変数関数の微分が終わりました。大学で学ぶような内容もあって理解が大変でしたが、大意は理解できたと感じており嬉しいです。次回からは第5章、指数関数・対数関数の勉強をしていきます。

"ディープラーニングG検定の勉強中 その26(勾配降下法または最急降下法)" へのコメントを書く

お名前[必須入力]
メールアドレス
ホームページアドレス
コメント[必須入力]

※ブログオーナーが承認したコメントのみ表示されます。