Propagation du dos avec Softmax / Entropie croisée


40

J'essaie de comprendre comment fonctionne la rétropropagation pour une couche de sortie softmax / entropie croisée.

La fonction d'erreur d'entropie croisée est

E(t,o)=jtjlogoj

avec et comme cible et sortie au neurone , respectivement. La somme est sur chaque neurone dans la couche de sortie. lui-même est le résultat de la fonction softmax:tojoj

oj=softmax(zj)=ezjjezj

De nouveau, la somme est sur chaque neurone dans la couche de sortie et est l'entrée du neurone :zjj

zj=iwijoi+b

C'est la somme de tous les neurones de la couche précédente avec leur sortie correspondante et leur poids vers le neurone plus un biais .oiwijjb

Maintenant, pour mettre à jour un poids qui connecte un neurone dans la couche de sortie avec un neurone dans la couche précédente, je dois calculer la dérivée partielle de la fonction d'erreur à l'aide de la règle de chaîne:wijiji

Ewij=Eojojzjzjwij

avec comme entrée du neurone . jzjj

Le dernier terme est assez simple. Comme il n'y a qu'un seul poids entre et , le dérivé est:jij

zjwij=oi

Le premier terme est la dérivation de la fonction d'erreur par rapport à la sortie :oj

Eoj=tjoj

Le moyen terme est la dérivation de la fonction softmax par rapport à son entrée est plus difficile:zj

ojzj=zjezjjezj

Disons que nous avons trois neurones de sortie correspondant aux classes puis est:o b = s o f t m a x ( b )a,b,cob=softmax(b)

ob=ezbez=ezbeza+ezb+ezc

et sa dérivation en utilisant la règle du quotient:

=softmax(b)-softmax2(b)=ob-o 2 b =ob(1-ob)oj

obzb=ezbez(ezb)2(jez)2=ezbez(ezb)2(ez)2
=softmax(b)softmax2(b)=obob2=ob(1ob)
Retour au moyen terme pour la rétropropagation, cela signifie:
ojzj=oj(1oj)

Je rassemble tout

Ewij=tjojoj(1oj)oi=tj(1oj)oi

ce qui signifie que si la cible de cette classe est , je ne pas à jour les poids pour cela. Cela ne semble pas juste.tj=0

En recherchant cela, j'ai trouvé des personnes ayant deux variantes pour la dérivation softmax, l'une où et l'autre pour , comme ici ou ici .i ji=jij

Mais je ne peux pas avoir de sens de cela. De plus, je ne suis même pas sûr que ce soit la cause de mon erreur, c'est pourquoi je publie tous mes calculs. J'espère que quelqu'un pourra me préciser s'il me manque quelque chose ou si je me trompe.


Les liens que vous avez indiqués calculent la dérivée par rapport à l'entrée, tandis que vous calculez la dérivée par rapport aux poids.
Jenkar

Réponses:


35

Note: Je ne suis pas un expert sur le backprop, mais maintenant que j'ai lu un peu, je pense que la mise en garde suivante est appropriée. Lors de la lecture des documents ou des livres sur les réseaux de neurones, il est rare que les dérivés à écrire en utilisant un mélange de la norme sommation / notation d'index , la notation de la matrice , et la notation multi-index (comprend un hybride des deux derniers pour les dérivés tenseur tenseur ). En règle générale, l'objectif est que cela soit "compris du contexte", vous devez donc faire attention!

J'ai remarqué quelques incohérences dans votre dérivation. Je ne fais pas vraiment de réseaux de neurones, alors ce qui suit peut être incorrect. Cependant, voici comment je réglerais le problème.

Tout d’abord, vous devez tenir compte de la somme en et vous ne pouvez pas supposer que chaque terme dépend d’un poids. Donc, en prenant le gradient de par rapport à la composante de , nous avons E k z E = - Σ j t j log o jEEkz

E=jtjlogojEzk=jtjlogojzk

Ensuite, exprimer comme nous avons où est le Kronecker delta . Alors le gradient du dénominateur softmax est qui donne ou, développez le journal Notez que la dérivée est relative à , un arbitraireo j = 1ojtouches ∂ log o j

oj=1Ωezj,Ω=iezilogoj=zjlogΩ
δjkOhm
logojzk=δjk1ΩΩzk
δjk
Ωzk=ieziδik=ezk
logojzk=δjkok
ojzk=oj(δjkok)
zkcomposant de , qui donne le terme ( seulement lorsque ).zδjk=1k=j

Donc, le gradient de par rapport à est alors où est constant (pour un vecteur donné ).Ez

Ezk=jtj(okδjk)=ok(jtj)tkEzk=okτtk
τ=jtjt

Cela montre une première différence par rapport à votre résultat: le ne multiplie plus . Notez que dans le cas typique où est "one-hot", nous avons (comme indiqué dans votre premier lien).tkoktτ=1

Une deuxième incohérence, si je comprends bien, est que le " " qui est entré dans semble pas être le " " qui sort du softmax. Je penserais qu'il est plus logique que cela soit réellement "plus en arrière" dans l'architecture de réseau?ozo

En appelant ce vecteur , nous avons alors z k = i w i k y i + b ky

zk=iwikyi+bkzkwpq=iyiwikwpq=iyiδipδkq=δkqyp

Enfin, pour obtenir le gradient de par rapport à la matrice de pondération , nous utilisons la règle de chaîne donnant l'expression finale (en supposant que -hot , c'est-à-dire ) où est l'entrée du niveau le plus bas (de votre exemple).w EEw

Ewpq=kEzkzkwpq=k(okτtk)δkqyp=yp(oqτtq)
tτ=1
Ewij=yi(ojtj)
y

Cela montre donc une deuxième différence par rapport à votre résultat: le " " devrait probablement provenir du niveau inférieur à , que j’appelle , plutôt que du niveau supérieur à (qui est ).oizyzo

Espérons que cela aide. Ce résultat semble-t-il plus cohérent?

Mise à jour: en réponse à une requête de l'OP dans les commentaires, voici une extension de la première étape. Tout d'abord, notez que la règle de la chaîne de vecteurs nécessite des sommations (voir ici ). Deuxièmement, pour être sûr d'obtenir tous les composants du dégradé, vous devez toujours introduire un nouvel indice en lettre pour le composant dans le dénominateur de la dérivée partielle. Donc, pour écrire complètement le dégradé avec la règle de chaîne complète, nous avons et donc

Ewpq=iEoioiwpq
oiwpq=koizkzkwpq
Ewpq=i[Eoi(koizkzkwpq)]
En pratique, les sommations complètes diminuent, car vous obtenez beaucoup de termes . Bien que cela implique un grand nombre de sommations et d’indices "extra", l’utilisation de la règle de chaîne complète vous garantit de toujours obtenir le résultat correct.δab

Je ne suis pas certain de la façon dont la communauté "Backprop / AutoDiff" résoud ces problèmes, mais je trouve que chaque fois que j'essaie de prendre des raccourcis, je suis susceptible de faire des erreurs. Je termine donc comme ici, écrivant tout en termes de sommations avec un indice complet, et introduisant toujours de nouveaux indices pour chaque dérivé. (Semblable à ma réponse ici ... j'espère au moins donner les bons résultats à la fin!)
GeoMatt22

Personnellement, je trouve que tout ce que vous écrivez rend le suivi beaucoup plus facile. Les résultats me semblent corrects.
Jenkar

Bien que j'essaie encore de bien comprendre chacune de vos étapes, j'ai obtenu de précieuses informations qui m'ont aidé à avoir une vue d'ensemble. Je suppose que je dois en savoir plus sur les dérivations et les sommes. Mais prenant en compte votre avis de tenir compte de la sommation dans E, je suis arrivé à ceci:
micha

pour deux sorties et avec l'erreur d'entropie croisée est Le dérivé est alors qui est conforme à votre résultat ... compte tenu du fait que vous n'aviez pas le signe moins avant l'erreuroj1=ezj1Ωoj1=ezj1Ω
Ω=ezj1+ezj2
E=(t1logoj1+t2logoj2)=(t1(zj1log(Ω))+t2(zj2log(Ω)))
E(zj1=(t1t1ezj1Ωt2ezj2Ω)=t1+oj1(t1+t2)
micha

Mais une autre question que j'ai est la suivante: Au lieu de ce qui correspond généralement à ce que vous avez présenté avec la rétropropagation, vous avez calculé: comme pour annuler le . Pourquoi ce chemin mène-t-il au bon résultat?
Ewij=Eojojzjzjwij
Ewij=Ezjzjwij
oj
Micha

12

Bien que la réponse de @ GeoMatt22 soit correcte, j'ai personnellement trouvé très utile de réduire le problème à un exemple en jouet et de dessiner une image:

Modèle graphique.

J'ai ensuite défini les opérations que chaque nœud calculait, en traitant les et les comme des entrées dans un "réseau" ( est un vecteur one-hot représentant le libellé de classe du point de données):hwt

L=t1logo1t2logo2
o1=exp(y1)exp(y1)+exp(y2)
o2=exp(y2)exp(y1)+exp(y2)
y1=w11h1+w21h2+w31h3
y2=w12h1+w22h2+w32h3

Supposons que je veuille calculer la dérivée de la perte par rapport à . Je peux simplement utiliser ma photo pour retracer le chemin qui mène de la perte au poids qui m’intéresse (supprimez la deuxième colonne de pour plus de clarté):w21w

Modèle graphique avec chemin en arrière surligné.

Ensuite, je peux simplement calculer les dérivés souhaités. Notez qu'il existe deux chemins via qui mènent à . Je dois donc additionner les dérivées qui les parcourent.y1w21

Lo1=t1o1
Lo2=t2o2
o1y1=exp(y1)exp(y1)+exp(y2)(exp(y1)exp(y1)+exp(y2))2=o1(1o1)
o2y1=exp(y2)exp(y1)(exp(y1)+exp(y2))2=o2o1
y1w21=h2

Enfin, associez la règle de chaîne:

Lw21=Lo1o1y1y1w21+Lo2o2y1y1w21=t1o1[o1(1o1)]h2+t2o2(o2o1)h2=h2(t2o1t1+t1o1)=h2(o1(t1+t2)t1)=h2(o1t1)

Notez que dans la dernière étape, car le vecteur est un vecteur one-hot.t1+t2=1t


C'est ce qui a finalement été éclairci pour moi! Excellente et élégante explication !!!!
SantoshGupta7

2
Je suis heureux que vous ayez apprécié et tiré profit de la lecture de mon post! Cela m'a aussi été utile de l'écrire et de l'expliquer.
Vivek Subramanian

@VivekSubramanian devrait être place?
=t1o1[o1(1o1)]h2+t2o2(o2o1)h2
koryakinp

Tu as raison - c'était une faute de frappe! Je vais faire le changement.
Vivek Subramanian

Ce que je ne comprends pas, c’est que vous attribuez également des logits (scores non échelonnés) à certains neurones. (o sont des logits à valeurs variables (prévisions) et y est des logits dans votre cas). Cependant, ce n'est pas le cas normalement, n'est-ce pas? Regardez cette image (o_out1 est une prédiction et o_in1 est un logit) alors comment est-il possible dans ce cas, comment trouver la dérivée partielle de o2 par rapport à y1?
ARAT

6

Au lieu de je souhaite une lettre dont la majuscule est distincte de sa minuscule. Alors laissez-moi substituer . également la variable pour désigner le du calque précédent.{oi},{yi}{pi}{oi}

Laissez la matrice diagonale dont la diagonale est égale à vecteur , ie En utilisant cette nouvelle variable de matrice et le produit intérieur Frobenius nous pouvons calculer le gradient de WRT . Yy

Y=Diag(y)
EW
z=Wp+bdz=dWpy=softmax(z)dy=(YyyT)dzE=t:log(y)dE=t:Y1dydE=t:Y1(YyyT)dz=t:(I1yT)dz=t:(I1yT)dWp=(y1TI)tpT:dW=((1Tt)ypTtpT):dWEW=(1Tt)ypTtpT

6

Voici l'une des notes les plus propres et les mieux écrites que je suis tombées sur le Web et qui explique le "calcul des dérivées dans l'algorithme de rétropropagation avec une fonction de perte d'entropie croisée" .


Dans le pdf donné, comment l'équation 22 est-elle devenue l'équation 23? Comme dans comment la sommation (k! = I) a-t-elle obtenu un signe négatif. Ne devrait-il pas recevoir un signe positif? Comme Summation(Fn)(For All K) = Fn(k=i) + Summation(Fn)(k!=i)devrait se passer selon ma compréhension.
Faizan

1

Voici un lien expliquant le softmax et son dérivé.

Il explique la raison d'utiliser i = j et i! = J.


Il est recommandé de fournir une réponse autonome minimale, au cas où ce lien serait rompu à l'avenir. Sinon, cela pourrait ne plus aider les autres utilisateurs à l'avenir.
luchonacho

0

D'autres réponses ont fourni la manière correcte de calculer la dérivée, mais elles ne précisent pas où vous vous êtes trompé. En fait, est toujours 1 dans votre dernière équation, car vous avez supposé que prend ce nœud de la cible 1 dans votre sortie; d’autres nœuds ont différentes formes de fonction de probabilité, conduisant ainsi à différentes formes de dérivées, vous devez donc maintenant comprendre pourquoi d’autres personnes ont traité et différemment.tjojoji=jij

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.