#1.はじめに
行列積の誤差逆伝播が分かりにくかったので、まとめておく。
#2.スカラー積の誤差逆伝播
スカラー積の誤差逆伝播から復習すると、
勾配を行う対象をLとし、あらかじめ$\frac{\partial L}{\partial y}$が分かっているものとすると、連鎖律から
これは問題ないですよね。
#3.行列積の誤差逆伝播
ところが、行列積になると直感と変わって来ます。
なんか、ピンと来ませんよね。なので、具体的に確認します。
設定は、2つのニューロンXと4つの重みWの内積を経てニューロンYに接続されていると考えます。
**1)最初に、$\frac{\partial L}{\partial X}$を求めます。**まず、これらを事前に計算しておきます。
この計算を途中で利用しながら、
**2)次に、$\frac{\partial L}{\partial y}$を求めます。**まず、これらを事前に計算しておきます。
この計算を途中で利用しながら、
#4.行列積の順伝播、逆伝播のコード
x1=X, x2=Y, grad=$\frac{\partial L}{\partial y}$とすると、
class MatMul(object):
def __init__(self, x1, x2):
self.x1 = x1
self.x2 = x2
def forward(self):
y = np.dot(self.x1, self.x2)
self.y = y
return y
def backward(self, grad):
grad_x1 = np.dot(grad, self.x2.T)
grad_x2 = np.dot(self.x1.T, grad)
return (grad_x1, grad_x2)