Comment fonctionne la rétropropagation via la couche Max Pooling lors de la création d'un lot?

10

Supposons que nous utilisons une taille de lot de 100 échantillons pour l'apprentissage.

Donc, dans chaque lot, le poids de chaque neurone (et biais, etc.) est mis à jour en ajoutant le moins du taux d'apprentissage * la valeur d'erreur moyenne que nous avons trouvée en utilisant les 100 échantillons * la dérivée de la fonction d'erreur par rapport à le poids actuel des neurones mis à jour.

Maintenant, lorsque nous utilisons une couche Max Pool, comment pouvons-nous calculer la dérivée sur cette couche? Dans chaque échantillon que nous alimentons en avant, un pixel différent (disons) est choisi comme maximum, donc quand nous rétropropagons plus de 100 échantillons dans lesquels chaque fois qu'un chemin différent a été choisi, comment pouvons-nous le faire? Une solution que j'ai à l'esprit est de se souvenir de chaque pixel qui a été choisi comme maximum, puis de diviser la dérivée sur tous les pixels max. C'est ce qui se fait?

Nadav B
la source
J'ai la même question. lorsque BP avec un seul échantillon, il est clair que seule la dérivée du plus grand élément n'est pas nulle, mais lorsque BP avec des échantillons en lot, un échantillon différent peut entraîner une position différente du plus grand élément, pouvons-nous simplement calculer la dérivée moyenne de chaque paramètre comme d'habitude (juste ajouter ∂L / ∂wi de chaque échantillon et divisé par la taille du lot)?
Shaotao Li

Réponses:

8

Lorsqu'un réseau neuronal traite un lot, toutes les valeurs d'activation pour chaque couche sont calculées pour chaque exemple (peut-être en parallèle par exemple si la bibliothèque et le matériel le prennent en charge). Ces valeurs sont stockées pour une utilisation ultérieure possible - c'est-à-dire une valeur par activation par exemple dans le lot, elles ne sont en aucun cas agrégées

Pendant la rétropropagation, ces valeurs d'activation sont utilisées comme l'une des sources numériques pour calculer les gradients, ainsi que les gradients calculés jusqu'à présent en arrière et les poids de connexion. Comme la propagation avant, la propagation arrière est appliquée par exemple, elle ne fonctionne pas avec des valeurs moyennes ou sommées. Ce n'est que lorsque tous les exemples ont été traités que vous travaillez avec les dégradés sommés ou moyennés pour le lot.

Cela s'applique également aux couches de pool max. Non seulement vous savez quelle était la sortie de la couche de regroupement pour chaque exemple du lot, mais vous pouvez également regarder la couche précédente et déterminer quelle entrée dans le pool était maximale.

Mathématiquement, et en évitant de définir des indices pour les couches NN et les neurones, la règle peut être exprimée comme ceci

  • La fonction avant est m=max(a,b)

  • Nous savons Jm pour une fonction cible J (dans le réseau neuronal qui sera la fonction de perte que nous voulons minimiser, et nous supposons que nous avons déjà rétropropagé à ce point)

  • Nous voulons savoir Ja et Jb

  • Si a>b

    • Localement , * . Doncm=aJa=Jm

    • Localement , * ne dépend pas de . DoncmbJb=0

  • Par conséquent si , sinonJa=Jma>bJa=0

  • et si , sinonJb=Jmb>aJb=0

Lorsque la propagation arrière traverse une couche de regroupement maximale, le gradient est traité par exemple et affecté uniquement à l'entrée de la couche précédente qui était maximale. Les autres entrées ont un gradient nul. Lorsque cela est groupé, ce n'est pas différent, il est simplement traité par exemple, peut-être en parallèle. Sur un lot entier, cela peut signifier que plus d'une, peut-être la totalité, des activations d'entrée dans le pool max obtiennent une part du gradient - chacune provenant d'un sous-ensemble différent d'exemples du lot.


* Localement -> lorsque vous effectuez uniquement des modifications infinitésimales sur .m

** Techniquement, si exactement nous avons une discontinuité, mais dans la pratique , nous pouvons ignorer que , sans problèmes lors de la formation d' un réseau de neurones.a=b

Neil Slater
la source
3
Je ne suis pas sûr de vous comprendre. Ce que vous dites fonctionne lorsque vous effectuez un backprop après un seul accessoire avant. Mais lorsque vous avez un lot, vous soutenez 100 échantillons pour calculer une fonction d'erreur moyenne. L'intérêt d'un lot est de pouvoir produire des gradients plus précis, puis vous ne faites qu'une fois le backprop basé sur la dérivée de la fonction d'erreur par rapport à W, à la valeur d'erreur moyenne trouvée multipliée par le taux d'apprentissage. Il n'est donc toujours pas clair comment vous calculez la dérivée de la fonction max, quand chaque fois un nœud différent a été sélectionné comme maximum. Qu'est-ce que je rate?
Nadav B
4
@NadavB: Il vous manque la séquence des événements. 1) Le lot est calculé à terme, article par article. 2) Le lot est rétropropagié, article par article. 3) Prenez les moyennes des gradients. 4) Appliquer une étape de descente de gradient (peut-être modifiée par quelque chose comme Adagrad ou RMSProp). Donc, vous mettez l'étape 3 hors séquence et vous vous demandez comment décocher les gradients moyens sur la couche de pool maximale - mais vous n'avez jamais à le faire, car vous backproposez chaque exemple individuellement - vous agrégez uniquement les résultats du lot par la suite
Neil Slater
1
Parfait. Vous l'avez précisé maintenant.
Nadav B
@NeilSlater La rétropropagation est-elle effectuée uniquement élément par élément, car elle est nécessaire pour la couche de pool maximale? Dans un MLP, on fait d'abord la moyenne de l'erreur de l'ensemble du lot, puis le calcul du gradient sur cette erreur moyenne est identique au calcul du gradient par article, puis à l'ajustement des paramètres par le taux d'apprentissage du gradient moyen *, n'est-ce pas? Cependant, la rétropropagation de l'erreur moyenne est beaucoup plus rapide que la rétropropagation de toutes les erreurs individuelles, puis l'application des mises à jour. Donc, si possible, vous voudriez le faire comme ça et seulement par article si nécessaire ... comme pour le pool max. Est-ce correct?
lo tolmencre
@lotolmencre Vous avez tort de calculer l'erreur moyenne sur un lot. Vous devez sauvegarder propager individuellement, puis additionner les gradients à la fin. Les calculs de gradient ne fonctionneront pas correctement, sinon par le biais de non-linéarités. Si vous voulez en savoir plus à ce sujet, veuillez poser une nouvelle question
Neil Slater
2

J'ai la même question, mais je la comprends probablement en examinant le code source de Caffe.

Veuillez consulter le code source de Caffe:

lignes 620 et 631 de ce code.

Il calcule la dérivée de chaque paramètre en ajoutant la dérivée (de ce paramètre) de chaque entrée, puis la divise par la taille du lot.

Voir également la ligne 137 de ce code, il redimensionne simplement le dérivé à 1 / iter_size, exactement comme la moyenne.

Nous pouvons voir qu'il n'y a AUCUN traitement spécial pour la couche Max Pooling lorsque BP.

Quant au dérivé de Max Pooling, voyons à nouveau le code source de Caffe:

ligne 272 de ce code. De toute évidence, seule la dérivée du plus grand élément est 1*top_diff, la dérivée des autres l'est 0*top_diff.

Shaotao Li
la source