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 si vous pouviez vous y référer lors de l'étude de ce livre.
La formule de gradient par la méthode de propagation de retour d'erreur implémentée dans l'article précédent est très compliquée, il y a donc une forte possibilité que des erreurs se produisent. Cependant, il doit être utilisé car la vitesse de traitement est extrêmement rapide. Par conséquent, il est important de vérifier s'il y a une erreur dans l'équation de gradient par la méthode de propagation de retour d'erreur. C'est ce qu'on appelle la confirmation de gradient, et une équation de gradient de différenciation numérique simple à faire et comportant peu d'erreurs est utilisée pour la confirmation du gradient.
Bien que la vitesse de traitement de la formule de gradient différentiel numérique soit lente, il y a peu d'erreurs en raison de sa construction simple. Par conséquent, ce qui est fait par la confirmation de gradient est de confirmer le gradient obtenu à partir de l'équation de gradient de différenciation numérique et l'erreur de gradient obtenue par l'équation de gradient par la méthode de propagation d'erreur.
Maintenant, je voudrais le mettre en œuvre.
#Ajoutez l'équation de gradient différentiel numérique suivante à la méthode de classe de réseau neuronal
def slopeing_grad_net(self,x,t):#Formule de gradient différentiel numérique pour confirmer si la méthode de propagation des erreurs est correcte
loss_c = lambda W: self.loss(x, t)
grads_t = {}
grads_t['W1'] = slopeing_grad(loss_c,self.params['W1'])
grads_t['b1'] = slopeing_grad(loss_c,self.params['b1'])
grads_t['W2'] = slopeing_grad(loss_c,self.params['W2'])
grads_t['b2'] = slopeing_grad(loss_c,self.params['b2'])
return grads_t
#Vérification du gradient
#Émettre un mini lot
x_train, x_test, t_train, t_test = dataset['train_img'], dataset['test_img'], \
dataset['train_label'], dataset['test_label']
x_batch = x_train[:3]
t_batch = t_train[:3]
netwark = LayerNet(input_size = 784, hiden_size = 50, output_size = 10)
#Mettez chaque dégradé
grad_slope = netwark.slopeing_grad_net(x_batch, t_batch)
grad_new = netwark.gradient(x_batch, t_batch)
for key in grad_slope.keys(): #Comparez ces différences
diff = np.average(np.abs(grad_new[key] - grad_slope[key]))
print(key + ':' + str(diff))
W1:0.03976913034251971
b1:0.0008997051177847986
W2:0.3926011094391389
b2:0.04117287920452093
Vérifiez la moyenne des erreurs de gradient avec un code comme celui ci-dessus pour voir si les erreurs sont dans la plage.
Recommended Posts