まったりAI勉強記

AI(人工知能)について、特にゆかりがあるわけでもない社会人が、まったりとAIについて勉強していく勉強日記です。

【ひとり読書会】ディープラーニングの数学(第10回)

どうも、カタミチです。

さて、今日も「最短コースでわかる ディープラーニングの数学」のひとり読書会、やっていきたいと思います。

今日は4章の後半戦ですね。いよいよ「勾配降下法」に到達するときが来たようです。さて、行ってみましょう!

 

4-4. 全微分と合成関数

f:id:feh_asama:20220317211626j:image

…と、勾配降下法に入る前に、全微分と合成関数という節ですね。複数の層から成るニューラルネットワークでの計算をイメージした節のようです。

\(L\)が\( u_1,u_2 \)の関数で、その\( u_1,u_2 \)がそれぞれ\(x_1,x_2,x_3\)の関数…みたいな状況のとき、当然、\(L\)は\(x_1,x_2,x_3\)の関数とも言えますよね。こんな状況で、\(L\)を\(x_1\)で偏微分するとどんな式になるかというと…

$$ \frac{\partial L}{\partial x_1} = \frac{\partial L}{\partial u_1} \frac{\partial u_1}{\partial x_1} + \frac{\partial L}{\partial u_2} \frac{\partial u_2}{\partial x_1} \tag{1}$$

こんな式になるみたいです。合成関数の微分偏微分バージョンみたいな風味ですね。どこでどう使うのか?というのは今後の章で出てくるでしょうから、ひとまず覚えておこうと思います。

で、例によって、この式の導出過程も理解しようとがんばってみたんですが、最後の式変形でつまづいてしまいました…。最後の式変形は、\( dL = \frac{\partial L}{\partial u_1}du_1+\frac{\partial L}{\partial u_2}du_2 \)の両辺を「\( \partial x_1 \)」で割ると、上の(1)の式になるよ!という説明だったのですが、なぜ\( dL \)や\( du_1\)、\( du_2 \)が\( \partial L \)や\( \partial u_1 \)、\( \partial u_2 \)という具合に変質してしまったのか…?コレガワカラナイ。

しかし、この式変形については「そもそも厳密には証明が必要だ」という注意書きもあったので、「そんなもんだ」で乗り切りますかねー。不本意ですが。まぁ、もしかしたら後半の章で出てくるかもしれませんし、出てこなかったとしても機会を見て学び直しますかね。

さて、(1)の式は変数の\(u\)が2つで、\(x\)も\(x_1\)の場合限定でしたが、\(u\)の数がたくさんあって、任意の\(x_i\)に対する偏微分を求めたい場合…つまり、式を一般化するとこうなります。

$$\frac{\partial L}{\partial x_i}=\sum_{j=1}^N \frac{\partial L}{\partial u_j} \frac{\partial u_j}{\partial x_i} \tag{2}$$

で、\(u\)の数が1つの場合は特別にこうなります。

$$\frac{\partial L}{\partial x_i}=\frac{\partial L}{\partial u} \frac{\partial u}{\partial x_i} \tag{3}$$

まぁ、(3)の式は(2)の式の\(N=1\)の場合ってことでカンタンですね。

 

4-5. 勾配降下法

f:id:feh_asama:20220317211635j:image

さぁ、ここまでの勉強の集大成とも言える、勾配降下法の節に来ました。

勾配降下法の目的は…

\( L(u,v) \)を最小にするような\( (u,v) \)の値\( (u_{min},v_{min}) \)を求めたい!

ということですね。変数は\(u,v\)となっていますが、実際には「重み」を表す\( w_1,w_2 \)あたりの方がイメージは合うかもしれないですね。

さて、この\( u_{min},v_{min} \)を求めるための手順はこんな具合。

  1. 適当に\( u,v \)の初期値\( (=(u_0,v_0)) \)を決める
  2. \( u_0,v_0 \)から\(L\)を最も大きく減少させる「方向」を見つける
  3. 「2」で定めた方向に向かって「微小量」変化させて\( (u_1,v_1) \)とする
  4. \( (u_1,v_1) \)を新たな値として「2」「3」を行い\( (u_2,v_2) \)を定め、それを新たな値として…というように繰り返す

うん、徐々に降下していっている雰囲気ありますねー。この様子が「勾配降下法」の名の由来ですね。

さて、そんな感じで徐々に最小の値に近づいていっている様子を数式で表すとどうなるのか、見てみましょう。途中の点である\( (u_k,v_k) \)→\( (u_{k+1},v_{k+1}) \)へと向かうところをピックアップします。ここで各成分の変化量をそれぞれ\( du,dv \)とすると、この移動により\( L(u_k,v_k) \)がちょっと動きます。で、まずはこの\( du,dv \)の動いていく「向き」を求めようというところから行きます。

さぁ、ここで出てくるのが…そう、微分です。関数\( L(u_k,v_k) \)の微小変化量\( dL(u_k,v_k) \)は、全微分の意味そのものですから、その公式から…

\( dL(u_k,v_k) = Lu(u_k,v_k)du+Lv(u_k,v_k)dv \)

となります。ちなみに\(Lu\)は\( \frac{\partial L}{\partial u} \)と同じ意味ですね。簡易表現だとこう書いたりもするようです。

さて、そのあとはと言うと…ここで突然、豪快にベクトルの内積の公式を持ってきます。こいつですね。

\( a_1b_1+a_2b_2 = \mid \boldsymbol{a} \mid \mid \boldsymbol{b} \mid cos \theta \)

この式に\( a_1=Lu,a_2=Lv,b_1=du,b_2=dv \)という感じで当てはめてみると、右辺が変形されて…

\( dL(u_k,v_k) = \mid (Lu,Lv) \mid \mid (du,dv) \mid cos \theta \)

ってことになります。…なんだか、すごい発想ですね。

さて、求めたかったのは\(du,dv\)の向きでしたね。\(dL\)を最小にするのが目的ですから、\( cos \theta \)が最小になる「なす角\(180^{\circ}\)」つまり、ベクトル\( (Lu,Lv) \)とベクトル\( (du,dv) \)が反対を向いていれば最小になります。

ということでつまり…

「関数\( L(u,v) \)の\( (u_k,v_k) \)における偏微分ベクトル\( (Lu(u_k,v_k),Lv(u_k,v_k)) \)のちょうど逆向きに進めば良い」

というのが向きに関する結論です。これまでの知識総動員ですね!

さて、降下する向きが決まったら次に降下する移動量の「大きさ」ですね。大きさについてはシンプルです。なぜかというと…数式から正解を一意に決めることはできないからです。つまり…決めの問題ってことです。

仮に、偏微分ベクトル\( (Lu(u_k,v_k),Lv(u_k,v_k)) \)の大きさをそのまま使ったとすると、\( (u_k,v_k) \)→\( (u_{k+1},v_{k+1}) \)は…

\( \left( \begin{array}{c} u_{k+1} \\ v_{k+1} \end{array} \right) = \left( \begin{array}{c} u_{k} \\ v_{k} \end{array} \right) - \left( \begin{array}{c} Lu(u_k,v_k) \\ Lv(u_k,v_k) \end{array} \right) \)

ってことになりますね。うん、もう少し手心を加えたいところです。すなわち…

$$ \left( \begin{array}{c} u_{k+1} \\ v_{k+1} \end{array} \right) = \left( \begin{array}{c} u_{k} \\ v_{k} \end{array} \right) - \alpha \left( \begin{array}{c} Lu(u_k,v_k) \\ Lv(u_k,v_k) \end{array} \right) $$

はい、これが勾配降下法を表す本質部分の式ですね。ここの\( \alpha \)がまさに「手心」の部分で、学習率と言われるやつですね。\( Lu(u_k,v_k) \)と\(Lv(u_k,v_k) \)の双方に同じ値をかけないと向きが変わってしまうので、こんな書き方になっている感じですね。

この学習率、人間が決める必要があるいわゆる「ハイパーパラメータ」ってやつですね。大きすぎるとうまく収束しないし、小さすぎると計算に時間がかかる…ってことで、この数値をどう設定するか?というのは腕の見せ所ってやつですかねー。

ちなみに、2次元を例にがんばって理解しましたが、N次元に拡張しても同じ様な要領で行けるみたいです。

 

隊長「今回の作戦を伝える。各自、ヘリが所定の空域に到達次第、パラシュートで降下せよ。降下が完了したら地形を見極め、低い場所を目指せ。我々は、敵本拠地が最も海抜が低い場所にあるという確かな情報を掴んでいる。降りが急峻であるうちはまだ敵本拠地は遠いため、素早く進め。ただし、降りが緩やかになってきたら注意が必要だ、敵本拠地は近い。周囲を警戒しつつ慎重に進め。では…諸君らの健闘を祈る!」

 

ということで

いやー、理解するのにかなり時間がかかりましたが、ようやく勾配降下法のポイントがつかめた気がします。本書の山場を一つ越えた感じですかねー(油断)

次はどうやら「指数関数・対数関数」の章のようです。また雰囲気が変わりそうなので、気分一新でやっていきますかねー。

ではまた。