Backprop à travers les couches Max-Pooling?

62

C'est une petite question conceptuelle qui me hante depuis un moment: comment pouvons-nous propager en arrière à travers une couche de regroupement maximal dans un réseau de neurones?

Je suis tombé sur des couches de max-pooling en parcourant ce tutoriel pour la bibliothèque nn de Torch 7. La bibliothèque résume le calcul du gradient et les passes directes pour chaque couche d'un réseau profond. Je ne comprends pas comment le calcul du gradient est effectué pour une couche de regroupement maximal.

Je sais que si vous avez une entrée allant dans le neurone i de la couche l , alors δ i l (défini comme δ i l = Ezjeljelδjel ) est donné par: δil=θδjel=Ezjel

δjel=θ(zjel)Σjδjl+1wje,jl,l+1

Ainsi, une couche de regroupement maximal recevrait les de la couche suivante comme d'habitude; mais comme la fonction d’activation pour les neurones de regroupement maximal prend en entrée un vecteur de valeurs (sur lequel elle est maximale), n’est plus un nombre unique, mais un vecteur ( devrait être remplacé par ). De plus, θδ i l θδjl+1δjel& thetav( { z j l } )θ(zjl)θ({zjl})θ , étant la fonction max, n'est pas différentiable en ce qui concerne ses entrées.

Alors .... comment cela devrait-il fonctionner exactement?

shinvu
la source

Réponses:

58

Il n'y a pas de gradient par rapport aux valeurs non maximales, car les modifier légèrement n'affecte pas la sortie. De plus, max est localement linéaire avec la pente 1, par rapport à l’entrée qui atteint réellement le max. Ainsi, le gradient de la couche suivante est renvoyé uniquement au neurone ayant atteint le maximum. Tous les autres neurones ont un gradient nul.

Donc , dans votre exemple, serait un vecteur de zéros, sauf que le i * e emplacement sera obtenir une valeur { δ l + 1 j }i * = a r g m a x i ( z l i )δjelje*{δjl+1}je*=unergmuneXje(zjel)

Abora
la source
7
Oh oui, il ne sert à rien de se reproduire dans les neurones non maximaux - c'était une idée cruciale. Donc, si je comprends maintenant correctement, la rétrodiffusion à travers la couche max-pooling sélectionne simplement le max. neurone de la couche précédente (sur laquelle le max-pooling a été effectué) et continue la rétrodiffusion uniquement par ce biais.
Shinvu
Mais n'avez-vous pas besoin de multiplier avec la dérivée de la fonction d'activation?
Jason
1
@Jason: La fonction max est localement linéaire pour l'activation qui a eu le max, sa dérivée est donc constante 1. Pour les activations qui n'ont pas abouti, c'est 0. C'est conceptuellement très similaire à la différenciation du ReLU (x ) = max (0, x) fonction d’activation.
Chrigi
Quelle est la foulée inférieure à la largeur du noyau pour un pooling maximal?
Vatsal
1
Très bonne réponse! Qu'en est-il du cas où plusieurs entrées ont la même valeur maximale (par exemple, 2 valeurs ont 0 à partir d'un ReLU et les deux autres sont négatives)?
DankMasterDan le
6

Max Pooling

Supposons donc que vous avez une couche P qui vient au-dessus d’une couche PR. Ensuite, la passe avant ressemblera à ceci:

,Pje=F(ΣjWjejPRj)

est l'activation du treizième neurone de la couche P, f est la fonction d'activation et W les poids. Donc, si vous dérivez cela, vous obtenez par la règle de chaîne que les gradients s'écoulent comme suit:Pje

.grune(PRj)=Σjegrune(Pje)FWjej

Mais maintenant, si vous avez mise en commun max, pour le neurone max et f = 0 pour tous les autres neurones, donc f ' = 1 pour le neurone max dans la couche précédente et f ' = 0 pour tous les autres neurones. Alors:F=jeF=0F=1F=0

grune(PRmuneX nevousron)=Σjegrune(Pje)Wje muneX nevousron

grune(PRothers)=0.

patapouf_ai
la source
2

La réponse de @ Shinvu est bien écrite, je voudrais pointer sur une vidéo qui explique le gradient de l'opération Max () et cela dans un graphique de calcul rapide à saisir.!

lors de la mise en œuvre de l'opération maxpool (un noeud de calcul dans un graphe de calcul - Votre architecture NN), nous avons besoin d'une fonction qui crée une matrice "masque" qui garde une trace de l'emplacement du maximum de la matrice. True (1) indique la position du maximum dans X, les autres entrées sont False (0). Nous gardons une trace de la position du maximum parce que c'est la valeur d'entrée qui a finalement influencé la sortie, et donc le coût. Backprop calcule les gradients en fonction du coût. Par conséquent, tout ce qui influence le coût final doit avoir un gradient non nul. Ainsi, backprop "propagera" le dégradé sur cette valeur d'entrée particulière qui avait influencé le coût.

anu
la source