Couche Softmax dans un réseau de neurones

43

J'essaie d'ajouter une couche softmax à un réseau de neurones formé à la rétropropagation, alors j'essaie de calculer son gradient.

La sortie softmax est hj=ezjezijest le nombre de neurones de sortie.

Si je le dérive alors je reçois

hjzj=hj(1hj)

Similaire à la régression logistique. Cependant, cela est faux car ma vérification de gradient numérique échoue.

Qu'est-ce que je fais mal? Je pensais que je devais aussi calculer les dérivées croisées (ie hjzk ) mais je ne suis pas sûr de savoir comment faire cela et garder la même dimension que le dégradé pour qu'il puisse être utilisé dans le processus de propagation arrière.

Couru
la source
3
Vous devriez améliorer le titre de votre question, car il ne s'agit pas d'ajouter un calque softmax général à un NN, car votre question est spécifique à propos de l'échec de la vérification du dégradé. Je suggérerais fortement de changer le titre en "Pourquoi la rétropropagation cesse-t-elle de fonctionner correctement lorsque j'ajoute une couche softmax à mon réseau de neurones".
Charlie Parker

Réponses:

43

Je me sens un peu mal de fournir ma propre réponse à cette question, car elle est très bien capturée par l'amibe et le juampa, à l'exception peut-être de l'intuition finale sur la façon dont le jacobien peut être réduit à un vecteur.

Vous avez correctement dérivé le gradient de la diagonale de la matrice jacobienne, c'est-à-dire que

hizj=hi(1hj):i=j

et comme l’a dit l’amibe, vous devez également déduire les entrées en diagonale du jacobien, qui donnent

hizj=hihj:ij

Ces deux concepts peuvent être combinés à l’aide d’une construction appelée Kronecker Delta . La définition du dégradé devient

hizj=hi(δijhj)

[J]ij=hi(δijhj)

hixi

[x]k=i=1hi,k

Étant donné la matrice jacobienne définie ci-dessus, celle-ci est implémentée de manière triviale en tant que produit de la matrice et du vecteur d'erreur de sortie:

σl=Jσl+1

Si la couche softmax est votre couche de sortie, sa combinaison avec le modèle de coût à entropie croisée simplifie le calcul en vous permettant simplement de:

σl=ht

th

Mranz
la source
σl=(σl,1,σl,2,...,σl,k)σl,j=Czj
Oui c'est correct.
Mranz
Quelqu'un pourrait-il expliquer en quoi consistent les termes delta minuscules dans le delta de Kronecker et comment les calculer?
danijar
Je suis coincé à ce problème pendant un moment. Clarifier. Vous avez un vecteur (pré softmax), puis vous calculez softmax. Puisque les valeurs de softmax dépendent de toutes les valeurs en entrée, la matrice jacobienne réelle est nécessaire. Ensuite, vous prenez la matrice jacobienne et réduisez la somme des lignes pour obtenir un vecteur à ligne unique, que vous utilisez pour la descente de gradient comme d’habitude. Est-ce que tout cela est correct à 100%?
harveyslash
14

Le dérivé est faux. CA devrait etre,

hjzk=hjδkjhjhk

C

nk=1Ctknlnyk(xn)

où le superindex passe sur le jeu d'échantillons est la valeur de la k-ième composante de la cible pour le n-ième échantillon. Ici, on suppose que vous utilisez un schéma de codage 1-C, c’est-à-dire . Dans ce cas, tous les t sont nuls à l'exception du composant représentant la classe correspondante, qui en est un.tkntkn

Notez que les t sont constants. Par conséquent, minimiser cette fonctionnalité équivaut à minimiser,

nk=1Ctknlnyk(xn)+nk=1Ctknlntkn=nk=1Ctknlnyk(xn)tkn

qui a l'avantage que le jacobien prend une forme très pratique, à savoir,

Ezj=hjtj

Je vous recommanderais d’obtenir une copie de Bishop's Neural Networks pour Pattern Recognition . IMHO reste le meilleur livre sur les réseaux de neurones.

jpmuc
la source
14

Chaque sortie de la softmax dépend de toutes les entrées, le gradient est donc une matrice jacobienne entière. Vous avez correctement calculé , mais vous avez également besoin de si . Je suppose que si vous pouvez dériver la première expression, vous devriez également pouvoir en dériver la seconde.khj=-hjhkjkjhj=hjzj=hj(1hj)khj=hjhkjk

Je ne suis pas sûr du problème que vous voyez avec la propagation en arrière: dans la couche softmax vous avez sorties et entrées, de sorte qu'une erreur de chaque sortie doit être propagée à chaque entrée, et c'est précisément pourquoi vous avez besoin de tout le jacobien. D’autre part, une fonction de coût est associée à la sortie softmax, par exemple où sont les sorties souhaitées (lorsque vous effectuez une classification, alors l’une d’elles est égale à 1 et autres à 0). Alors en fait, vous vous intéressez à , qui peut être calculé avec une règle de chaîne donnant une expression nette, et est en effet un vecteur (pas une matrice).j C = - Σ j t j log h j , t j Cjj

C=jtjloghj,
tjCzj
l'amibe dit de réintégrer Monica
la source
1
Je vais essayer de mieux décrire mon problème, conformément à ce tutoriel par exemple ufldl.stanford.edu/wiki/index.php/Backpropagation_Algorithm , il me faut multiplier par élément les poids et le delta avec la dérivée (numéro d’étape 3). Donc, si j'ai la matrice jacobienne complète, les dimensions ne correspondent pas. Merci.
couru
Savez-vous comment procéder s'il ne s'agit pas d'une couche softmax, mais d'une couche cachée habituelle? Imaginons que chaque unité de cette couche reçoive des entrées de toutes les unités de la couche précédente (c'est-à-dire que cette couche est "entièrement connectée"), ce qui est normalement le cas. Ensuite, vous devez également propager les erreurs en arrière dans cette couche, et les dérivés forment également une matrice jacobienne. Si vous ne savez pas comment procéder, votre confusion n’est pas liée à softmax.
Amibe dit de réintégrer Monica 12/12
1
Je l'ai implémenté avec succès pour les couches linéaires et sigmoïdes, car la dérivée est un vecteur et je n'ai eu aucun problème avec les dimensions.
couru
Désolé, Ran, je suis peut-être juste stupide, mais si vous avez une couche sigmoïde entièrement connectée à la couche précédente, la sortie (ou l'entrée) de chaque unité aura une dérivée par rapport à la connexion entrante de chaque unité du couche précédente, c'est-à-dire que toutes les dérivées forment une matrice 2D, n'est-ce pas? iji
Amibe dit de réintégrer Monica