Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ Backward Propagation | ニューラルネットワークをゼロから構築
Pythonによるニューラルネットワーク入門

bookBackward Propagation

メニューを表示するにはスワイプしてください

バックワードプロパゲーション(または逆伝播法)は、ニューラルネットワーク内の各パラメータに対して損失関数がどのように変化するかを求めるプロセス。

目的は、これらのパラメータを全体の損失を減少させるように調整すること。

このプロセスは勾配降下法に基づいており、各層の事前活性化値(活性化関数を適用する前の生の出力)に対する損失の導関数を利用し、それらをネットワーク全体に逆方向に伝播させる。

すべての層が最終的な予測に寄与するため、勾配は段階的に計算される:

  1. フォワードプロパゲーションを実行して出力を得る;
  2. 出力の事前活性化に対する損失の導関数を計算する;
  3. この導関数を連鎖律を用いて層をまたいで逆方向に伝播させる;
  4. 重みとバイアスの勾配を計算し、学習時にそれらを更新する。
Note
ノート

勾配は、関数の入力に対する変化率を表し、すなわちその導関数。重み、バイアス、または活性化のわずかな変化が損失関数にどの程度影響するかを示し、勾配降下法によるモデルの学習過程を導く。

記法

説明を明確にするため、以下の記法を使用:

  • WlW^l:層 ll の重み行列
  • blb^l:層 ll のバイアスベクトル
  • zlz^l:層 ll の事前活性化ベクトル
  • ala^l:層 ll の活性化ベクトル

したがって、a0a^0xx(入力)と設定すると、n 層のパーセプトロンにおけるフォワードプロパゲーションは次の操作列で表される:

a0=x,......z1=W1a0+b1,zl=Wlal1+bl,zn=Wnan1+bn,a1=f1(z1),al=fl(zl),an=fn(zn),......y^=an.\begin{aligned} a^0 &= x, & &... & &...\\ z^1 &= W^1 a^0 + b^1, & z^l &= W^l a^{l-1} + b^l, & z^n &= W^n a^{n-1} + b^n,\\ a^1 &= f^1(z^1), & a^l &= f^l(z^l), & a^n &= f^n(z^n),\\ &... & &... & \hat y &= a^n. \end{aligned}

逆伝播法を数学的に記述するため、以下の記法を導入:

  • dalda^l:層llにおける活性化に対する損失関数の導関数
  • dzldz^l:層llにおける事前活性化(活性化関数適用前)に対する損失関数の導関数
  • dWldW^l:層llにおける重みに対する損失関数の導関数
  • dbldb^l:層llにおけるバイアスに対する損失関数の導関数

出力層の勾配計算

最終層nnでは、まず出力層の活性化に対する損失関数の勾配danda^n)を計算。

次に、連鎖律を用いて出力層の事前活性化に対する損失関数の勾配を次のように求める:

dzn=danfn(zn)dz^n = da^n \odot f'^n(z^n)

ここで、fn(zn)f'^n(z^n)は層nnにおける活性化関数の導関数を表し、記号\odot要素ごとの積(element-wise multiplication)を示す。

Note
ノート

記号\odot要素ごとの積(element-wise multiplication)を示し、これは一方のベクトルの各要素と他方の対応する要素を掛け合わせることを意味します。対照的に、記号\cdotドット積(dot product)を表し、標準的な行列またはベクトルの積に用いられます。fnf'^nは出力層における活性化関数の導関数を指します。

この値は、出力層の事前活性化値の変化に対する損失関数の感度を示します。

dzndz^nを計算した後、次のステップは重みとバイアスの勾配を計算することです:

dWn=dzn(an1)T,dbn=dzn\begin{aligned} dW^n &= dz^n \cdot (a^{n-1})^T,\\ db^n &= dz^n \end{aligned}

これらの勾配は、損失を減らすために出力層の各重みとバイアスをどれだけ調整すべきかを示します。

ここで、(an1)T(a^{n-1})^Tは前の層からの転置された活性化ベクトルです。元のベクトルの形状がnneurons×1n_{\text{neurons}} \times 1の場合、その転置は1×nneurons1 \times n_{\text{neurons}}の形状になります。

バックワードプロパゲーションを続けるために、前の層の活性化に関する損失の導関数は次のように計算されます:

dan1=(Wn)Tdznda^{n-1} = (W^n)^T \cdot dz^n

この式により、誤差シグナルがネットワークを逆方向に伝播し、学習時に前の層を調整できるようになります。

隠れ層への勾配伝播

各隠れ層llについても手順は同じです。dalda^lが与えられた場合:

  1. 事前活性化に関する損失の導関数を計算する;
  2. 重みとバイアスの勾配を計算する;
  3. dal1da^{l-1}を計算して導関数を逆方向に伝播する。
dzl=dalfl(zl)dWl=dzl(al1)Tdbl=dzldal1=(Wl)Tdzl\begin{aligned} dz^l &= da^l \odot f'^l(z^l)\\ dW^l &= dz^l \cdot (a^{l-1})^T\\ db^l &= dz^l\\ da^{l-1} &= (W^l)^T \cdot dz^l \end{aligned}

このプロセスは、入力層に到達するまで、各前の層に対して順番に繰り返されます。

重みとバイアスの更新

すべての層の勾配を計算した後、重みバイアス勾配降下法アルゴリズムを用いて更新されます:

Wl=WlαdWl,bl=blαdbl.\begin{aligned} W^l &= W^l - \alpha \cdot dW^l,\\ b^l &= b^l - \alpha \cdot db^l. \end{aligned}

ここで、α\alpha学習率を表し、各トレーニングステップでパラメータがどれだけ調整されるかを制御します。

ここで、α\alpha学習率であり、各更新ステップで重みとバイアスに適用される調整量を決定するハイパーパラメータです。

question mark

バックプロパゲーション中、ニューラルネットワークは損失関数を最小化するためにどのように重みとバイアスを更新しますか?

正しい答えを選んでください

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 2.  7

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 2.  7
some-alt