Cet article est une sortie facile à comprendre de ** Deep Learning from scratch Chapter 6 Error back propagation method **. J'ai pu le comprendre moi-même, j'espère donc que vous pourrez le lire confortablement. De plus, je serais plus qu'heureux que vous puissiez vous y référer lorsque vous étudiez ce livre.
class Sigmoid: #Implémentation de couche de la fonction sigmoïde
def __init__(self):
self.out = None #Le traitement de rétro-propagation de la fonction sigmoïde nécessite un signal de sortie du traitement de propagation directe
def forward(self, x):
out = 1 / (1 + np.log(-x))
self.out = out #Stockage de sortie de propagation directe
return out
def backward(self, dout):
dx = dout * self.out * (1 - self.out) #Traitement pour retrouver la propagation de la fonction sigmoïde
return dx
La propagation en avant traite selon la formule de la fonction sigmoïde et la renvoie avec retour. Cependant, puisque le résultat du processus de propagation vers l'avant est utilisé dans le processus de propagation arrière, il est enregistré dans la variable d'instance.
Dans le processus de rétro-propagation, ce serait assez compliqué si c'était normal, nous utilisons donc ici une formule simplifiée pour trouver la différenciation. Trouvez le différentiel de la valeur d'entrée de la couche sigmoïde en utilisant le différentiel précédent et le résultat du processus de propagation vers l'avant enregistré dans la variable d'instance.
class Relu: #Implémentation de couche de la fonction Relu
def __init__(self):
self.mask = None #Si le signal d'entrée inférieur à 0 est Vrai et supérieur à 0, le tableau Faux est entré.
def forward(self, x):
self.mask = (x <= 0)
out = x.copy()
out[self.mask] = 0 #Réglez le signal d'entrée entre 0 et 0
return out
def backward(self, dout):
dout[self.mask] = 0 #Si la propagation vers l'avant est 0, la propagation vers l'arrière est également 0, alors réglez-la sur 0 ici.
dx = dout #D'autres héritent de la différenciation précédente
return dx
Dans le processus de propagation avant, pour implémenter sans utiliser if, tout d'abord, toutes les valeurs d'entrée qui ne dépassent pas 0 sont définies sur True, et celles qui dépassent 0 sont définies sur False, et cela est stocké dans une variable d'instance. Cela sera utilisé plus tard.
Ensuite, copiez le tableau contenant les valeurs d'entrée et utilisez les tableaux True et False enregistrés précédemment pour convertir tous les True en 0. Et retournez-le avec retour.
Dans le processus de propagation arrière, tout True est converti en 0 à l'aide des tableaux True et False enregistrés dans le processus de propagation avant. Si la propagation aller est 0, la propagation inverse est également 0.
Après cela, il hérite de la différenciation précédente et la renvoie avec retour.
Recommended Posts