損失関数の勾配
ニューラルネットワークは、ある層の出力値の線形結合を次の層に渡すことを繰り返すので、ネットワークからの出力ベクトル
ネットワークに学習させるためには、使用されたすべての重み
コンピュータで微分を計算する方法として、数値微分という手法が広く知られています。これは非常に小さな値
しかしながら、実用的なニューラルネットワークでは、重みの総数が数百~数千、場合によっては数万というオーダーに達します。いくらコンピュータを使っていても、重み1つ1つについて数値微分で
そこで、数値微分よりも効率的に偏微分を処理するために、バックプロパゲーション(誤差逆伝播法)という手法を用います。
バックプロパゲーション(誤差逆伝播法)
バックプロパゲーション は、ネットワークからの出力値と正解値(目標変数)の差分を上層へ伝えることによって順次重みを調整していく手法です。
深さ
損失関数は交差エントロピー誤差
出力層の活性化関数は ソフトマックス関数 とします。
話を具体的にするために、出力層(第
出力層における損失関数の勾配
第
で表されます。成分表示すると次のようになります。
出力層における損失関数の勾配を求めてみましょう。
偏微分の連鎖律によって、
と表すことができます。まず最初に、
とすると、交差エントロピー誤差は
なので、
出力層の活性化関数はソフトマックス関数
に設定しています。ソフトマックス関数の微分は
で与えられます。式 (5) の続きを計算すると、
正解値の合計は
が得られます。同様に
となるので、
となります。すなわち、交差エントロピー誤差の入力総和による微分は出力値
となります。
次は
なので、
となります。
が得られます。式 (3) に (12) と (15) を代入すると、
となります。交差エントロピー誤差の勾配が
[出力値と正解値の差] × [1つ上の層からの入力値]
となっています。この計算はコンピュータにとっては単純な処理ですから、数千個の重みについて実行したとしても一瞬で終えることができます。
中間層における損失関数の勾配
次は第
第
と表されます。成分表記すると以下のようになります。
偏微分の連鎖律によって、
と表すことができます。(18) を
となるので、(19) は
と表せます。
次に (19) の
と表せます。
と表しておくことにすると(具体的な表式は設定した活性化関数によって異なります)、(22) は
となります。
と表せます。
となります。
の形のまま微分すると簡単です。たとえば
となって、
と表せます。したがって、(26) は
となります。(24) に代入すると、
この式を一般化すると、
となります。
式 (21) より、この層の重みによる損失関数の勾配は
となります。
重みの更新式
最後に層同士の関係を明確にするために、以下のように変数を置き換えます。
右上の添字は層番号を意味します (たとえば、
新しい変数で
同様に、
となります。ここで、
と定義すると、
となります。(37) と (40) より、出力層および、その1つ手前の中間層の重みの更新は
で与えられます (
というように遡って計算してくことができます。これでバックプロパゲーションを Python に実装することができますが、次回記事では、更新式の意味するところをもう少し掘り下げて解説したいと思います。
【おすすめ書籍】ゼロから作る Deep Learning
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装 中古価格 | ![]() |

ゼロから作るDeep Learning ? ?自然言語処理編 中古価格 | ![]() |

ゼロから作るDeep Learning ? ?フレームワーク編 中古価格 | ![]() |

コメント
下記は誤植と思われますので、ご確認ください。
微分の近似式で、E(w+ϵ)−(w−ϵ) → E(w+ϵ)−E(w−ϵ)
上から 2 番目の図で灰色のニューロンはバイアス ( =1 ) だと思うので、x2に入ってくる矢印は
不要だと思います。
ありがとうございます。記事を修正し、2番目の図も差し替えておきました m(_ _)m
下記は誤植と思われますので、ご確認ください。
式(6)で、-t2(−y2y0)/y1 → -t2(−y2y0)/y2
修正しました。
ありがとうございます。m(_ _)m
下記は誤植と思われますので、ご確認ください。
(15) 式で、z = Bμ → μ = Bz
(17) 式の右辺で、∂μj/∂aji → ∂μj/∂bji
(17) 式の下の文で、∂E/∂uj → ∂E/∂μj
(19) 式の下の行列形式で、λ= は不要。そのまま残すのであれば太字にする。
直しました。
ありがとうございます。m(_ _)m
下記は誤植と思われますので、ご確認ください。
(23)式で、∂μ/∂bji → ∂μj/∂bji
修正しました。
ありがとうございます。m(_ _)m
下記は誤植と思われますので、ご確認ください。
(21) 式の下の文で、
式(18), (19), (21) より、
∂E/∂μj = ~
となる。一般化すると、
→
式 (19), (20), ∂E/∂λr=δr (r=0,1,2) より、
∂E/∂xj = ~
となる。上の式と式 (21) を式 (18) に代入して一般化すると、
ありがとうございます。記事全体を見直して、いくつかの式を追加し、数式の順序も変更しました(それに伴って式番号も変更されています)。これで重み更新式を導く過程が少しわかりやすくなったと思います。ぜひご確認ください。
式を整理していただいてずいぶん見通しがよくなりました。ありがとうございました。
下記は誤植と思われますので、ご確認ください。
(26) 式の上の文で、(23) は → (25) は
直しました。
ありがとうございます。m(_ _)m
下記は誤植と思われますので、ご確認ください。
一番最後の式の左辺で、wji^(d-2) → wji^(d-2)(t+1)
式(32)の α (学習率:正の数) の説明が必要と思いました。
修正しました。
ありがとうございます。