ディープラーニング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検定の勉強中 その25(全微分と合成関数)

ディープラーニングG検定まで1ヶ月を切りました。
いよいよ試験に向けてということで、問題集に取り組んでみて、とりあえずは1周しました。
公式テキストの読了から日が経っていたことから、正答率は6~7割程度でした。
このままだと合格は厳しいので、間違っていたところを復習して、10月中には正答率が9割以上になるように頑張ります。

それとJDLAの推薦図書も読んでいます。
手始めに「人工知能は人間を超えるか  ディープラーニングの先にあるもの」を読了しました。
ディープラーニングの歴史と概要と未来について分かりやすく書かれてました。これを要約したものが公式テキストという感じです。
あとは、AI白書(2019)も暇があるときに読んでいます。かなりボリュームのある本なので、こちらは読めるところまで読む、というところでしょうか。


という感じで、今回も
書籍「最短コースでわかるディープラーニングの数学」の内容に沿って勉強してみました。

今回は、全微分と合成関数について見ていきます。

参考サイト
アタリマエ!(行列のかけ算のやり方まとめ。例題から分かる行列の積の考え方)


図1のようなパーセプトロンに、

図1
4-4-1.png

入出力層の他に中間層(隠れ層)がある場合は、関数を微分した結果を使ってさらに微分して出力することになります。これは合成関数の考え方と同じです。

合成関数の微分は、式1となりますが、

式1
4-4-2.png

この式と、多変数関数の全微分

式2 全微分の公式
4-4-3.png

を組み合わせて図1のパーセプトロンについて、ノード x1についての出力結果を出します。


図1の入力層のノードは、x1, x2, x3で、その仮出力先が u1とu2、最終的な出力層が L なので、これを式3で表します。

式3
4-4-4.png

入力層のノード x と重み w の内積は式4なので、

式4
4-4-6.png

これを計算することで、中間層全体の値が算出されます。

式5
4-4-7.png

式6
4-4-8.png

これを中間層のノードごとに書き換えると、式7になります。

式7 青い部分はx1 以外の変数なので偏微分のときに「定数」とみなします。
4-4-9.png


次に、各中間層のノードから、出力層の内積を算出する場合ですが、パーセプトロンでは入力層とその重みで算出した結果(今回はx1の偏微分)を使うので(つまりは合成関数)、式8の計算となります。

式8
4-4-10.png

これで計算が終わりましたので、各算出内容を全微分の合成関数の公式である式9に当てはめます。

式9
4-4-5.png

上記の各算出結果を微分して当てはめると、式10となるので、

式10
4-4-11.png

これを計算して式11となります。

式11 ノード x1 の 出力結果
4-4-12.png

なお、式9を多変数関数の一般式にすると式12となります。

式12
4-4-13.png


次に、中間層のノードが1つの場合について、見ていきます。

図2
4-4-14.png

中間層の変数が1つ(1次元)の場合はこれをスカラーと言います。
このスカラーでの合成関数は式13となります。

式13
4-4-15.png

これをノード x1 について算出する式は式14となります。

式14
4-4-16.png

具体的に計算してみると、式15、16となり、

式15
4-4-17.png

式16
4-4-18.png

この算出結果を式17のように当てはめると、

式17
4-4-19.png

式18の出力結果となります。

式18
4-4-20.png

式18を多変数関数に一般化したものが式19となります。

式19
4-4-21.png


今回は理解するのに時間がかかりました。でも、実際に計算してみると、なぜそうなるのかが分かったので良かったです。
ベクトル・行列の積についても再度確認できたのも良かったです。