Multiply関数を実装。
class MultiLayer: def forward(self, x, y): self.x = x self.y = y return x * y def backward(self, dLda): dLdx = dLda * y dLdy = dLda * x return dLdx, dLdy
掛け算の関数です。
forwardはただ掛け算するだけですが、backwardの時に使うのでxとyを保存しておきます。
最終結果Lに対するxの勾配、yの勾配は、
dL/dx = dL/da x da/dx = dL/da x y
dL/dy = dL/da x da/dy = dL/da x x
なので、一つ上流の勾配であるdL/daに、xとyを対応させれば良いという事になります。
では試してみましょう。
mul = MultiLayer() x = np.array([[1],[2]]) y = np.array([[3],[4]]) dLda = np.array([5]) print("forward = ", mul.forward(x, y)) dLdx , dLdy = mul.backward(dLda) print("dLdx = ", dLdx) print("dLdy = ", dLdy) >> forward = [[3] [8]] dLdx = [[15] [20]] dLdy = [[ 5] [10]]
forwardは(1×3, 2×4) = (3, 8)ですね。
backwardは1行目が(5×3, 5×4) = (15, 20)
2行目が(5×1, 5×2) = ( 5, 10)
ですね。