Question

Ceci est une petite question conceptuelle qui a été lancinante me pendant un certain temps: Comment pouvons-nous revenir-Propager à travers une couche max de mise en commun dans un réseau de neurones

Je suis tombé sur des couches max mise en commun en passant par ce tutoriel pour la bibliothèque nn de la flamme 7. La bibliothèque fait abstraction du calcul de gradient et passe vers l'avant pour chaque couche d'un réseau profond. Je ne comprends pas comment le calcul du gradient est fait pour une couche max de mise en commun.

Je sais que si vous avez un $ d'entrée {de Z_I} ^ $ l entrer dans neurone $ i $ de la couche $ l $, puis $ {\ delta_i} ^ l $ (défini comme $ {\ delta_i} ^ l = \ frac {\ partial E} {\ partial {Z_I} ^ l} ??$) est donnée par: $$ {\ Delta_i} ^ l = \ theta ^ { '} ({Z_I} ^ l) \ sum_ {j} {\ delta_j} ^ {l + 1} w_ {i, j} ^ {l, l + 1} $$

Ainsi, une couche max de mise en commun recevrait le $ {\ delta_j} ^ {l + 1} $ est de la couche suivante comme d'habitude; mais étant donné que la fonction d'activation des neurones max pooling prend dans un vecteur de valeurs (sur lesquelles il Maxes) en entrée, $ {\ delta_i} ^ {l} $ est pas un seul numéro plus, mais un vecteur ($ \ theta ^ { '} ({z_j} ^ l) $ devrait être remplacé par $ \ nabla \ theta (\ left \ {{z_j} ^ l \ right \}) ??$). De plus, $ \ theta $, soit la fonction max, n'est pas différentiables par rapport aux entrées est tout.

Alors .... comment faut-il travailler exactement?

Était-ce utile?

La solution

Il n'y a pas de gradient par rapport aux valeurs non maximales, car les modifier ne peu affecte pas la sortie. De plus, le maximum est localement linéaire avec une pente 1, par rapport à l'entrée qui permet d'atteindre effectivement le max. Ainsi, le gradient de la couche suivante est renvoyé uniquement à ce neurone qui a atteint le maximum. Tous les autres neurones obtenir gradient zéro.

Dans votre exemple $ \ delta_i ^ l $ serait un vecteur de zéros, sauf que le i $ ^ * $ e emplacement recevra un valeurs $ \ left \ {\ delta_j ^ {l + 1} \ droit \} $ où i $ ^ * = argmax_ {i} (Z_I ^ l) $

Autres conseils

Max Pooling

Supposons donc que vous avez une couche P qui est au-dessus d'une couche PR. Ensuite, la passe avant sera quelque chose comme ceci:

$ P_i = f (\ sum_j W_ {ij} PR_j) $,

où $ P_i $ est l'activation du neurone i de la couche P, f est la fonction d'activation et W sont les poids. Donc, si vous dérivez que, par la règle de la chaîne vous que les gradients de flux comme suit:

$ grad (PR_j) = \ sum_i diplômé (P_i) f ^ \ prime W_ {ij} $.

Mais maintenant, si vous avez mise en commun max, $ f = id $ pour le neurone max et $ f = 0 $ pour tous les autres neurones, donc $ f ^ \ prime = 1 $ pour le neurone max dans la couche précédente et $ f ^ \ prime = 0 $ pour tous les autres neurones. Donc:

$ grad (PR_ {max \ neurone}) = \ sum_i grad (P_i) W_ {i \ {max \ neurone}} $,

$ grad (PR_ {} autres) = 0. $

@ réponse de Shinvu est bien écrit, je voudrais faire remarquer à un vidéo ce qui explique le gradient de fonctionnement max () et this dans un graphique de calcul qui est rapide à saisir.

en mettant en œuvre l'opération de maxpool (un nœud de calcul dans un graphe Votre calcul l'architecture NN), nous avons besoin d'une fonction crée une matrice « masque » qui garde la trace de l'endroit où le maximum de la matrice est. Vrai (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 production, et donc le coût. Backprop est calcule les gradients par rapport au coût, donc tout ce qui influe sur le coût final doit avoir une pente non nulle. Ainsi, backprop va « propager » le dos de gradient à cette valeur d'entrée particulière qui avait influencé le coût.

Licencié sous: CC-BY-SA avec attribution
scroll top