Comme il était difficile de comprendre l'erreur de propagation en retour du produit matriciel, je vais le résumer.
Revoir la rétropropagation d'erreur du produit scalaire, ![Capture d'écran 2020-03-29 15.41.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209705/aaff755d-2340-a6ac-ad21- e590c81d87db.png) En supposant que la cible à gradient est L et que $ \ frac {\ partial L} {\ partial y} $ est connu à l'avance, à partir de la loi des chaînes Ce n'est pas un problème, n'est-ce pas?
Cependant, en ce qui concerne les produits matriciels, cela change avec l'intuition.
D'une manière ou d'une autre, il ne vient pas avec une épingle. Alors, je vais le confirmer concrètement. Le paramètre est considéré comme connecté au neurone Y via le produit interne de deux neurones X et de quatre poids W. ** 1) Tout d'abord, trouvez $ \ frac {\ partial L} {\ partial X} $. ** Tout d'abord, calculez-les à l'avance. En utilisant ce calcul sur le chemin
** 2) Ensuite, trouvez $ \ frac {\ partial L} {\ partial y} $. ** Tout d'abord, calculez-les à l'avance. En utilisant ce calcul sur le chemin
Si 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)
Recommended Posts