【数式編】(逆伝播)2つめの隠れ層の重みとバイアスを更新する 1-(1)
隠れ層の重みの更新式
今回から、隠れ層の重みとバイアスの更新式についてみていきます。
今回は、2層目の隠れ層の1つめのユニット ユニットh21 の重み についてみていきましょう。
隠れ層でも重みの更新式は以下のようにあらわすことができます。
連鎖率(チェインルール)
を求めるにあたっては注意が必要です。
損失関数の計算式を再掲してみましょう。
上のニューラルネットワークの図からもわかるように、 を求めるにあたっては、
それぞれで、 の値が計算に利用されています。
損失関数を で偏微分するには、それら が影響を及ぼした値も考慮する必要があります。
よって を求める式は、連鎖率によって次のようになります。
かなり複雑な式になりましたが、ひとつひとつみていけばそれほど難しくないことがわかります。
1つめのかたまり
まずは1つめのかたまりについて見ていきましょう。
の部分です。
左から第1項め、第2項め、第3項め、第4項めとします。
・第1項めと第2項めについて
第1項めと第2項めをまとめます。
実は、 は出力層の逆伝播で求めていて、
となっています。
・第3項めについて
第3項めは です。
は出力層の順伝播で求めているように以下の式になります。
よって
・第4項めについて
第4項めは ですが、 は次のように求めています。
の計算は で行われるので、次のように表されます。
は数学的には微分不可能ですが、微分については次のように定義されています。
のグラフを見るとわかりますが、負の値~0 までは傾き 0、それ以上で傾き 1 の直線となっているので、上記の定義となっていると思われます。
以上を念頭に
としておきます。
・まとめ1
ひととおり必要な部品が揃ったのでつなげてみましょう。
2つめのかたまり
今回はこの部分です。
1つめのかたまり同様に進めていきましょう。
・第1項めと第2項めについて
第1項めと第2項めをまとめます。
これもすでに出力層の逆伝播で求めています。
・第3項めについて
第3項めは です。
は出力層の順伝播で求めているように以下の式になります。
よって
・第4項めについて
第4項めはまったく同じです。
・まとめ2
ひととおり必要な部品が揃ったのでつなげてみましょう。
3つめのかたまり
最後のかたまりです。
・第1項めと第2項めについて
・第3項めについて
なので
・第4項めについて
第4項めはまったく同じです。
・まとめ3
ひととおり必要な部品が揃ったのでつなげてみましょう。
まとめると…
すべてのネタが揃ったのでまとめてみましょう。
残りの部分
あとは だけです。
これは簡単ですね。 は隠れ層2層めの順伝播で求めています。
よって
まとめ: の更新式
以上から、
と求めることができました。
【数式編】(逆伝播)出力層の重みとバイアスを更新する 3
前回までのおさらい
前回までで、ユニットo11 と ユニットo12 の更新部分の式(勾配)を求めました。
ユニットo11 の重みとバイアスの勾配()
ユニットo12 の重みとバイアスの勾配()
見比べてみると、(そのユニットの出力 - 該当する教師データ(ラベル))× 各入力値 となっていることがわかります。
ユニットo13 の重みとバイアスの勾配()
以上から、ユニットo13 の重みとバイアスの勾配の式は次のようになります。
まとめ
これで出力層のパラメータ調整で必要となる勾配の式がわかりました。
実際に重みのパラメータを更新する場合は、
で更新していきます。(バイアスの場合も同様です。)
【数式編】(逆伝播)出力層の重みとバイアスを更新する 2-(2)
前回のおさらい
前回求めた の更新式はこのようなものでした。
今回はその他の重み とバイアス の更新式を求めていきます。
まずは2つめの重み
については以下の式を求めます。
の式と見比べると の部分は同じことがわかります。
なので、 についてのみ考えます。
でしたので、
となります。
よって、
総まとめ:ユニットo12 の重みとバイアスの勾配()
ユニットo12 のすべての重みとバイアスの勾配()の部分をまとめておきます。
となります。
【数式編】(逆伝播)出力層の重みとバイアスを更新する 2-(1)
ユニットo12 の重みの更新式
今回は ユニットo12 の重み の更新式を見ていきます。
以前求めた の更新式を参考にすると…
となることがわかると思います。
今回は ユニットo12 を対象としているので、 となっていることに注意してください。
計算手順は ユニットo11 と同じですが、再度順を追って見ていくことにします。
損失関数の偏微分
まずは について見ていきます。
損失関数の式を再掲しておきます。
この式を で偏微分します。
今回も左から第1項め、第2項め、第3項めとしてひとつずつ見ていきます。
・第1項めについて
まずは を見ていきます。
なので、
公式 を利用して、
よって、
公式 を利用すると
以上より、
・第2項めについて
次に を見ていきます。
第1項めと同様に、
なので、
よって、
公式 を利用して
は先ほど求めたので、
以上より、
・第3項めについて
最後に を見ていきます。
内容は第1項めとほとんど同じです。
なので、
よって、
公式 を利用して
以上より、
・まとめると…
を求めようとしていて、
とわかったので、
(※ 教師データは one-hot 表現としているため、)
まとめ: の更新式
以上((1)、(2))から、 を調整するための具体的な更新式は以下のようになります。(※ は学習率)
【数式編】(逆伝播)出力層の重みとバイアスを更新する 1-(2)
前回のおさらい
前回求めた の更新式はこのようなものでした。
今回はその他の重み とバイアス の更新式を求めていきます。
まずは2つめの重み
まずは について見ていきましょう。
更新式は次のようになります。
の式と見比べると の部分は同じことがわかります。
なので、 についてのみ考えます。
でしたので、
となります。
よって、
総まとめ:ユニットo11 の重みとバイアスの勾配()
ユニットo11 のすべての重みとバイアスの勾配()の部分をまとめておきます。
となります。
この式で求めた値に学習率を掛けて、元の重みやバイアスから引くことで出力層の重みやバイアスを更新していきます。
【数式編】(逆伝播)出力層の重みとバイアスを更新する 1-(1)
誤差逆伝播(バックプロパゲーション)
ニューラルネットワークが正しい出力を得るようになるには、重みやバイアスなどのパラメータを調整する必要があります。
誤差逆伝播(バックプロパゲーション)という手法を使うことで、パラメータを調整することができます。
具体的には損失関数を調整したいパラメータで偏微分することで、調整値を求めていきます。
(誤差逆伝播の詳しい説明については他のWebサイトや書籍を参照してください。)
重みの更新式
まずは出力層の1つめのユニット ユニットo11 の重み を調整するための更新式を見ていきましょう。
(※ は学習率)
更新後の重みは、更新前の重みから損失関数の勾配( )に学習率を掛けた値を引くことで求めることができます。
(式の意味をわかりやすくするために ← で表現しています。)
学習率はある種の定数(ハイパーパラメータ)と考えてよいので、 を求めることができれば、重みを更新することができます。
損失関数の偏微分
は損失関数 を で偏微分することで求めることができます。
これは、連鎖率(チェインルール)によって、次の式で求めます。
まずは について見ていきましょう。
損失関数の式を再掲しておきます。
この式を で偏微分します。
左から第1項め、第2項め、第3項めとしてひとつずつ見ていきます。
・第1項めについて
まずは を見ていきます。
なので、
公式 を利用して、
よって、
公式 を利用すると
以上より、
・第2項めについて
次に を見ていきます。
第1項めと同様に、
なので、
よって、
公式 を利用して
は先ほど求めたので、
以上より、
・第3項めについて
最後に を見ていきます。
内容は第2項めとほとんど同じです。
なので、
よって、
公式 を利用して
以上より、
・まとめると…
を求めようとしていて、
とわかったので、
(※ 教師データは one-hot 表現としているため、)
まとめ: の更新式
以上((1)、(2))から、 を調整するための具体的な更新式は以下のようになります。(※ は学習率)
「(そのユニットの出力 - 該当する教師データ) × その重みに関係した入力値」になっていることがわかります。
【数式編】(損失関数)クロスエントロピー誤差
損失関数
前回の最終出力で がわかりました。
これらの値がそれぞれ、教師データの と同じ(か、ひじょうに近い値)であれば、期待した出力といえます。
しかし、重みやバイアスの初期値はいいかげん(ランダム)な値になっているため、初めから期待した出力になるわけではありません。
そこで、損失関数を使い、現時点での出力が期待する出力とどれだけ乖離しているか(誤差)を調べ、出力が期待する値になるように、重みやバイアスを調整していきます。
今回、出力層の活性化関数には を適用しているので、損失関数にはクロスエントロピー誤差(交差エントロピー誤差)を採用します。
教師データ
今回、教師データは one-hot 表現としています。
これは、正解のラベルが 1 でそれ以外は 0 となっているデータです。
例えば、 が正解ラベルの場合、次のようになります。
誤差の計算
具体的に誤差の計算をしてみましょう。
いま、期待する出力として、以下の出力を得たいとします。
つまり、りんごの出力(このニューラルネットワークでは )が最大になるようにしたいとします。
ところが、ニューラルネットワークの最終出力が次のような場合、損失関数の値はどのようになるでしょうか。
(出力層ではソフトマックス関数を適用しているので、出力の総和は 1 になっています。)
では、最終出力が次のようだった場合はどうなるでしょうか。
今回は、りんごの出力が最大になっています。
先ほどと比べて損失関数の値が小さくなっています。
さらに次のような場合はどうでしょうか。
今度はさらにりんごの出力値が大きくなっています。
先ほどと比べてさらに損失関数の値が小さくなっています。
まとめ
このように、正しい(期待する)出力に近ければ近いほど損失関数の値は小さくなっていきます。なので、損失関数の値が小さくなるような出力となるように、重みやバイアスなどのパラメータを調整すれば、正しい判断のできるニューラルネットワークになります。
また、ソフトマックス関数が出力を確率として求めていることを考えると、
2つめの例では 50% (0.5) の確率でりんごだと思っていて、
3つめの例では 90% (0.9) の確率でりんごだと思っている
と考えることができます。
損失関数の値は、ニューラルネットワークがどの程度(自信をもって)正しく判断しているかの目安になります。