どうも、カタミチです。
さて、今日も「最短コースでわかる ディープラーニングの数学」のひとり読書会、やっていきたいと思います。
今日は10章「ディープラーニングモデル」の損失関数のところからです。張り切っていってみよー
10-3. 損失関数
損失関数は出力部分に対して評価する関数なので、出力層に対しての交差エントロピーが前章のロジスティック回帰と同じになるので…
\( L(\boldsymbol{W})= -\frac{1}{M} \sum_{m=0}^{M-1} \sum_{i=0}^{N-1} (yt_i^{(m)}) \log{yp_i^{(m)}} \)
こうなります。前章までに苦労して式を組み上げてきたおかげで、違和感なく理解できます。ちなみに、2つ目の\(\sum\)は出力層のクラスの数だけ足し上げることになりますが、今回はその数は10個ですね。最終的に「画像が0〜9の数字のどれなのか?」というのを推測することになりますからねー。
10-4. 損失関数の微分計算
さて、毎度おなじみの損失関数の微分計算です。4回目ともなると、プロセスがだいぶ体に染み込んできました。本書の構成のおかげですね、ありがたや…。
上でも言ったように、交差エントロピー(\(ce\))は前章と同じなのでこう書けますね。
\( ce=- \sum_{k=0}^{N-1} yt_k (\log{yp_k}) \)
で、今回の隠れ層→出力層の関係は、前章のロジスティック回帰の多値問題の入力層→出力層の関係と同じなので…
\( \boldsymbol{yd}= \boldsymbol{yp}- \boldsymbol{yt} \)
\( \frac{\partial{L}}{\partial{u_i}}= yd_i \)
\( \frac{\partial{L}}{\partial{w_{ij}}}= b_j \cdot yd_i \)
って式が成り立ちますね。前章ではこの式を導くまでに、だいぶ苦労しましたが、本章ではその結果をありがたく使わせてもらう…という感じになりますね。
これで隠れ層の\(\boldsymbol{b}\)までは無事にたどり着けましたが、入力層の\(\boldsymbol{x}\)にたどり着くためにもう一段階、踏まねばなりません。今回、重みには隠れ層→出力層の\(\boldsymbol{W}\)だけでなく、入力層→隠れ層の\(\boldsymbol{V}\)もありますからね。ということで、\( \frac{\partial{L}}{\partial{v_{ij}}} \)も求める必要があります。
…で、ここからは本章で始めて出てくる部分なので、新たな式変形の旅が始まります。やはり今回も、ひとつひとつ式の展開をじっくり味わいながら進めていかないと、すぐに置いていかれる感じでしたねー。要素や層が増えたので、どこのことを言っているのか?を考えながら進めました。
今回のポイントはいくつかありそうですが、まずひとつ目は、中間値ベクトル\(\boldsymbol{a}\)を重み\(v\)で偏微分する処理。例えば具体的に\( \frac {\partial{a_1}} {\partial{v_{12}}} \)を考えた場合、\(a_1\)の式が、
\( a_1= v_{10}x_{0}+ v_{11}x_{1}+ v_{12}x_{2}+ v_{13}x_{3}+ \cdots \)
となるので、\(v_{12}\)に関係しない部分は定数として消えて…
\( \frac {\partial{a_1}} {\partial{v_{12}}}=x_2 \)
となる点ですかね。どれだけ入力値の要素があっても、この偏微分の答えはシンプルになります。
ふたつ目のポイントは、\(\boldsymbol{a}\)に活性化関数を噛ませた結果である\(\boldsymbol{b}\)の各要素は、その先の\(\boldsymbol{u}\)のすべての要素に影響するという点。例えば、損失関数を\(\boldsymbol{b}\)の要素の一つである\(b_1\)で偏微分しようと思って\(\boldsymbol{u}\)から遡ろうと思った場合…
\( \frac{\partial L}{\partial b_1}= \sum_{l=0}^{N-1} \frac{\partial L}{\partial u_l} \frac{\partial u_l}{\partial b_1} \)
という具合に、それ自体が結構長い式になります。
…さて。
そういったもろもろのポイントはありつつ、丁寧に式を作っていきます。そうして最終的に導き出される式は…
\( \frac{\partial L}{\partial v_{ij}}= x_j \cdot \frac{\partial L}{\partial a_{i}} \)
\( \frac{\partial L}{\partial a_{i}}= f'(a_i) \sum_{l=0}^{N-1}yd_l \cdot w_{li} \)
となります!最後はやっぱりシンプルになりますねー。
ちなみに\(f\)はシグモイド関数ですね。
ということで
計算自体はこれまで出てきたものをうまく使えばできるんですが、層が増えたことで複雑性が増して計算を追っかけるのは大変でした(汗)。追っかけるのが大変なくらいなので、考え出すのはものすごく大変だったんだろうなぁ(小並感)。
いずれにせよ、重みWとVのそれぞれに対して損失関数の微分計算まで導出できましたね。あとはこれを使って計算!…ってところだと思うのですが、もう少し節は続くみたいなので、振り落とされないようにしっかり付いていきますかね〜。
ではまた。