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=−∑jtjlogoj⟹∂E∂zk=−∑jtj∂logoj∂zk
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,Ω=∑iezi⟹logoj=zj−logΩ
δjk∂Ohm∂logoj∂zk=δjk−1Ω∂Ω∂zk
δjk∂Ω∂zk=∑ieziδik=ezk
∂logoj∂zk=δjk−ok
∂oj∂zk=oj(δjk−ok)
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
∂E∂zk=∑jtj(ok−δjk)=ok(∑jtj)−tk⟹∂E∂zk=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+bk⟹∂zk∂wpq=∑iyi∂wik∂wpq=∑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
∂E∂wpq=∑k∂E∂zk∂zk∂wpq=∑k(okτ−tk)δkqyp=yp(oqτ−tq)
tτ=1∂E∂wij=yi(oj−tj)
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
∂E∂wpq=∑i∂E∂oi∂oi∂wpq
∂oi∂wpq=∑k∂oi∂zk∂zk∂wpq
∂E∂wpq=∑i[∂E∂oi(∑k∂oi∂zk∂zk∂wpq)]
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