誤差逆伝播チートシート
誤差逆伝播(Backpropagation)は、計算グラフにチェインルールを適用することで各パラメータの勾配を求める仕組みである。
ここでは、ニューラルネットワークで頻出するパターンを計算グラフと数式で整理する。
基本原則:チェインルール
\frac{dL}{da} = \frac{dL}{dy} \cdot \frac{dy}{da}
誤差は中間変数を経由して伝わる。すべての逆伝播はこの形に帰着する。
足し算(加算ノード)
逆伝播:
\frac{dL}{da} = \frac{dL}{dy}, \quad \frac{dL}{db} = \frac{dL}{dy}
掛け算(積ノード)
逆伝播:
\frac{dL}{da} = b \cdot \frac{dL}{dy}, \quad \frac{dL}{db} = a \cdot \frac{dL}{dy}
合成関数(活性化)
スカラーの場合:
\frac{dL}{da} = f'(a) \cdot \frac{dL}{dy}
ベクトルの場合:
\frac{dL}{dz} = \frac{dL}{dy} \odot f'(z)
アダマール積(⊙)
⊙ は アダマール積(Hadamard product) を意味する。
これは「行列やベクトルの要素ごとの掛け算」である。
例:
[a_1, a_2, a_3] \ \odot \ [b_1, b_2, b_3] = [a_1b_1, \ a_2b_2, \ a_3b_3]
活性化関数の微分
Sigmoid:
tanh:
ReLU:
f'(a) =
\begin{cases}
1 & (a > 0) \\
0 & (a \leq 0)
\end{cases}
Leaky ReLU:
f'(a) =
\begin{cases}
1 & (a > 0) \\
\alpha & (a \leq 0)
\end{cases}
行列積
逆伝播:
\frac{dL}{dA} = \frac{dL}{dY} B^T, \quad \frac{dL}{dB} = A^T \frac{dL}{dY}
なぜこうなるか?
行列の形状を合わせたらこうなる。
Affine層(全結合)
z = W x + b, \quad y = f(z)
逆伝播:
\delta = \frac{dL}{dz} = \frac{dL}{dy} \odot f'(z)
\frac{dL}{dW} = \delta x^T, \quad
\frac{dL}{db} = \delta, \quad
\frac{dL}{dx} = W^T \delta
ミニバッチ対応
単一サンプルでは \frac{dL}{dW} = \delta x^T となる。
N サンプルまとめて学習する場合(ミニバッチ)には平均を取る。
\frac{dL}{dW} = \frac{1}{N} \Delta X^T
\frac{dL}{db} = \frac{1}{N} \sum_{n=1}^N \delta^{(n)}
\frac{dL}{dX} = W^T \Delta
プーリング層
平均プーリング
出力は入力の平均。
y = \frac{1}{n} \sum_{i=1}^n x_i
逆伝播:
\frac{dL}{dx_i} = \frac{1}{n} \frac{dL}{dy}
Maxプーリング
出力は入力の最大値。
逆伝播:
順伝播で選ばれた最大値の位置にのみ勾配が流れる。
損失関数(回帰タスク)
逆伝播:
損失関数(分類タスク)
y = \text{softmax}(z), \quad L = -\sum_i t_i \log y_i
逆伝播:
まとめ
- 足し算 → 誤差をコピー
- 掛け算 → 相手を掛ける
- 合成関数 → スカラーなら f'(a) \cdot \frac{dL}{dy}、ベクトルなら \frac{dL}{dy} \odot f'(z)
- アダマール積(⊙):要素ごとの掛け算
- 活性化関数の微分(Sigmoid, tanh, ReLU, Leaky ReLU)
- 行列積の逆伝播(dA = dY B^T, \ dB = A^T dY)
- Affine層(δ, W, b, x の勾配)
- ミニバッチでは平均を取る
- プーリング(平均・max)の逆伝播
- MSE → y-t
- Softmax+CE → y-t
複雑なモデルであっても、これらの基本要素に分解すれば誤差逆伝播を理解できる。
Discussion