Je suis curieux de savoir comment les gradients sont propagés en retour à travers un réseau de neurones à l'aide de modules ResNet / sauter les connexions. J'ai vu quelques questions sur ResNet (par exemple, un réseau de neurones avec des connexions de couche de saut ), mais celui-ci pose spécifiquement des questions sur la rétropropagation des gradients pendant l'entraînement.
L'architecture de base est ici:
J'ai lu cet article, Étude des réseaux résiduels pour la reconnaissance d'image , et dans la section 2, ils expliquent comment l'un des objectifs de ResNet est de permettre un chemin plus court / plus clair pour que le gradient se propage en retour vers la couche de base.
Quelqu'un peut-il expliquer comment le gradient traverse ce type de réseau? Je ne comprends pas très bien comment l'opération d'ajout, et l'absence d'une couche paramétrée après l'ajout, permet une meilleure propagation du gradient. Cela a-t-il quelque chose à voir avec la façon dont le gradient ne change pas lorsqu'il passe par un opérateur d'ajout et est en quelque sorte redistribué sans multiplication?
De plus, je peux comprendre comment le problème du gradient de fuite est atténué si le gradient n'a pas besoin de traverser les couches de poids, mais s'il n'y a pas de flux de gradient à travers les poids, alors comment sont-ils mis à jour après le passage en arrière?
la source
the gradient doesn't need to flow through the weight layers
, pourriez-vous expliquer cela?Réponses:
Ajouter renvoie le dégradé également aux deux entrées. Vous pouvez vous en convaincre en exécutant ce qui suit dans tensorflow:
Sortie:
Ainsi, le gradient sera:
Edit: il y a une question: "quelle est l'opération au point où la connexion de l'autoroute et le bloc de réseau neuronal se rejoignent à nouveau, au bas de la figure 2?"
La réponse est: ils sont sommés. Vous pouvez le voir dans la formule de la figure 2:
Ce que cela dit, c'est que:
Modifier 2:
Réécriture dans des mots légèrement différents:
Les blocs résiduels modifient les gradients qui reculent, mais il n'y a pas de fonctions de «compression» ou «d'activation» par lesquelles les gradients traversent. Les fonctions 'écraser' / 'activation' sont à l'origine du problème de gradient d'explosion / de fuite, donc en supprimant celles du bus lui-même, nous atténuons considérablement ce problème.
Edit 3: Personnellement j'imagine un resnet dans ma tête comme le schéma suivant. C'est topologiquement identique à la figure 2, mais cela montre peut-être plus clairement comment le bus s'écoule directement à travers le réseau, tandis que les blocs résiduels en tapent simplement les valeurs, et ajoutent / suppriment un petit vecteur contre le bus:
la source