Nota: non sono un esperto di backprop, ma ora dopo aver letto un po ', penso che il seguente avvertimento sia appropriato. Durante la lettura di documenti o libri su reti neurali, non è raro per i derivati da scrivere utilizzando un mix di standard di notazione sommatoria / index , la notazione della matrice , e la notazione multi-index (includere un ibrido tra gli ultimi due per i derivati tensore-tensore ). In genere l'intento è che questo dovrebbe essere "compreso dal contesto", quindi devi stare attento!
Ho notato un paio di incongruenze nella tua derivazione. In realtà non faccio reti neurali, quindi potrebbe non essere corretto quanto segue. Tuttavia, ecco come farei per risolvere il problema.
Innanzitutto, devi tenere conto della somma in e non puoi assumere che ogni termine dipenda solo da un peso. Quindi prendendo il gradiente di rispetto al componente di , abbiamo
E k z E = - ∑ j t j log o jEEkz
E=−∑jtjlogoj⟹∂E∂zk=−∑jtj∂logoj∂zk
Quindi, esprimendo come
abbiamo
∂ log o joj
oj=1Ωezj,Ω=∑iezi⟹logoj=zj−logΩ
dove
δjkè il
delta di Kronecker. Quindi il gradiente del denominatore del softmax è
∂Ω∂logoj∂zk=δjk−1Ω∂Ω∂zk
δjk
che dà
∂logoj∂Ω∂zk=∑ieziδik=ezk
oppure, espandendo il registro
∂oj∂logoj∂zk=δjk−ok
Nota che la derivata è rispetto a
zk, uncomponente
arbitrariodi
z, che dà iltermine
δjk(
=1solo quando
k=j).
∂oj∂zk=oj(δjk−ok)
zkzδjk=1k=j
Quindi il gradiente di rispetto a z è quindi
∂ EEz
dove τ=∑jtjè costante (per un datovettoret).
∂E∂zk=∑jtj(ok−δjk)=ok(∑jtj)−tk⟹∂E∂zk=okτ−tk
τ=∑jtjt
Questo dimostra una prima differenza dal risultato: la non è più si moltiplica o k . Nota che nel caso tipico in cui t è "one-hot" abbiamo τ = 1 (come indicato nel tuo primo link).tkoktτ=1
Una seconda incoerenza, se ho capito bene, è che la " " che viene immessa in z sembra improbabile che sia la " o " che viene emessa dal softmax. Penserei che abbia più senso che questo sia in realtà "più indietro" nell'architettura di rete?ozo
Chiamando questo vettore , abbiamo quindi
z k = ∑ i w i k y i + b ky
zk=∑iwikyi+bk⟹∂zk∂wpq=∑iyi∂wik∂wpq=∑iyiδipδkq=δkqyp
Infine, per ottenere il gradiente di rispetto alla matrice di peso w , usiamo la regola della catena
∂ EEw
dà l'espressione finale (assumendo unatcalda, cioèτ=1)
∂E
∂E∂wpq=∑k∂E∂zk∂zk∂wpq=∑k(okτ−tk)δkqyp=yp(oqτ−tq)
tτ=1
dove
yè l'ingresso al livello più basso (del tuo esempio).
∂E∂wio j= yio( oj- tj)
y
Quindi questo mostra una seconda differenza rispetto al tuo risultato: la " " dovrebbe presumibilmente essere dal livello sotto z , che chiamo y , piuttosto che dal livello sopra z (che è o ).oiozyzo
Speriamo che questo aiuti. Questo risultato sembra più coerente?
Aggiornamento: in risposta a una query dell'OP nei commenti, ecco un'espansione del primo passo. Innanzitutto, nota che la regola della catena vettoriale richiede somme (vedi qui ). In secondo luogo, per essere certi di ottenere tutti i componenti del gradiente, è necessario introdurre sempre una nuova lettera di indice per il componente nel denominatore della derivata parziale. Quindi per scrivere completamente il gradiente con la regola della catena piena, abbiamo
e
∂oi
∂E∂wp q= ∑io∂E∂oio∂oio∂wp q
così
∂E∂oio∂wp q= ∑K∂oio∂zK∂zK∂wp q
In pratica si riducono le somme complete, poiché si ottengono moltiterminiδab. Sebbene implichi molte sommazioni e sottoscrizioni forse "extra", l'utilizzo della regola a catena intera ti garantirà sempre il risultato corretto.∂E∂wp q= ∑io[ ∂E∂oio( ∑K∂oio∂zK∂zK∂wp q) ]
δa b