Backpropagation con Softmax / Cross Entropy


40

Sto cercando di capire come funziona la backpropagation per un livello di output softmax / cross-entropia.

La funzione di errore di entropia incrociata è

E(t,o)=jtjlogoj

con e come target e output al neurone , rispettivamente. La somma è su ogni neurone nel livello di output. stesso è il risultato della funzione softmax:tojoj

oj=softmax(zj)=ezjjezj

Ancora una volta, la somma è su ogni neurone nel livello di output e è l'input per il neurone :zjj

zj=iwijoi+b

Questa è la somma di tutti i neuroni nel livello precedente con la loro corrispondente uscita e peso verso il neurone più un bias .oiwijjb

Ora, per aggiornare un peso che collega un neurone nel livello di output con un neurone i nel livello precedente, devo calcolare la derivata parziale della funzione di errore usando la regola della catena:wijji

Ewij=Eojojzjzjwij

con zj come input per il neurone j .

L'ultimo termine è abbastanza semplice. Poiché esiste solo un peso tra i e j , la derivata è:

zjwij=oi

Il primo termine è la derivazione della funzione di errore rispetto all'output oj :

Eoj=tjoj

Il termine medio è la derivazione della funzione softmax rispetto al suo input è più difficile:zj

ojzj=zjezjjezj

Supponiamo di avere tre neuroni in uscita corrispondenti alle classi quindi è:o b = s oa,b,coB=softmax(b)

ob=ezbez=ezbeza+ezb+ezc

e la sua derivazione usando la regola del quoziente:

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

obzb=ezbez(ezb)2(jez)2=ezbez(ezb)2(ez)2
=softmax(b)softmax2(b)=obob2=ob(1ob)
Ritorno al termine medio per backpropagation significa:
ojzj=oj(1oj)

Mettendo tutto insieme ottengo

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

il che significa che se l'obiettivo per questa classe è , non aggiornerò i pesi per questo. Non suona bene.tj=0

Studiando su questo ho trovato persone con due varianti per la derivazione del softmax, una in cui e l'altra per , come qui o qui .i ji=jij

Ma non posso avere senso da questo. Inoltre, non sono nemmeno sicuro che questa sia la causa del mio errore, motivo per cui sto pubblicando tutti i miei calcoli. Spero che qualcuno possa chiarirmi dove mi manca qualcosa o sbaglio.


I collegamenti che hai dato stanno calcolando la derivata relativa all'input, mentre stai calcolando la derivata relativa ai pesi.
Jenkar,

Risposte:


35

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=jtjlogojEzk=jtjlogojzk

Quindi, esprimendo come abbiamo log o joj

oj=1Ωezj,Ω=iezilogoj=zjlogΩ
doveδjkè ildelta di Kronecker. Quindi il gradiente del denominatore del softmax è Ω
logojzk=δjk1ΩΩzk
δjk che dà logoj
Ωzk=ieziδik=ezk
oppure, espandendo il registro oj
logojzk=δjkok
Nota che la derivata è rispetto azk, uncomponentearbitrariodiz, che dà iltermineδjk(=1solo quandok=j).
ojzk=oj(δjkok)
zkzδjk=1k=j

Quindi il gradiente di rispetto a z è quindi EEz dove τ=jtjè costante (per un datovettoret).

Ezk=jtj(okδjk)=ok(jtj)tkEzk=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+bkzkwpq=iyiwikwpq=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

Ewpq=kEzkzkwpq=k(okτtk)δkqyp=yp(oqτtq)
tτ=1 doveyè l'ingresso al livello più basso (del tuo esempio).
Ewioj=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

Ewpq=ΣioEoiooiowpq
così E
oiowpq=ΣKoiozKzKwpq
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.
Ewpq=Σio[Eoio(ΣKoiozKzKwpq)]
δun'B

Non sono sicuro di come la comunità "Backprop / AutoDiff" risolva questi problemi, ma ogni volta che provo a prendere scorciatoie, sono responsabile di commettere errori. Quindi finisco per fare come qui, scrivendo tutto in termini di sommatoria con sottoscrizione completa e introducendo sempre nuovi sottoscritti per ogni derivata. (Simile alla mia risposta qui ... Spero di dare almeno risultati corretti alla fine!)
GeoMatt22

Personalmente trovo che annotare tutto sia molto più facile da seguire. I risultati mi sembrano corretti.
Jenkar,

Anche se sto ancora cercando di comprendere appieno tutti i tuoi passaggi, ho ottenuto alcune informazioni preziose che mi hanno aiutato con il quadro generale. Immagino di dover leggere di più sull'argomento delle derivazioni e delle somme. Ma prendendo il tuo consiglio per tener conto della sommatoria in E, ho pensato a questo:
micha,

oj1=ezj1Ωoj1=ezj1Ω
Ω=ezj1+ezj2
E=(t1logoj1+t2logoj2)=(t1(zj1log(Ω))+t2(zj2log(Ω)))
E(zj1=(t1t1ezj1Ωt2ezj2Ω)=t1+oj1(t1+t2)

Ewij=Eojojzjzjwij
Ewij=Ezjzjwij
oj

12

Mentre la risposta di @ GeoMatt22 è corretta, personalmente l'ho trovato molto utile per ridurre il problema a un esempio di giocattolo e disegnare un'immagine:

Modello grafico.

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

Say I want to calculate the derivative of the loss with respect to w21. I can just use my picture to trace back the path from the loss to the weight I'm interested in (removed the second column of w's for clarity):

Graphical model with highlighted backwards path.

Then, I can just calculate the desired derivatives. Note that there are two paths through y1 that lead to w21, so I need to sum the derivatives that go through each of them.

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

Finally, putting the chain rule together:

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

Note that in the last step, t1+t2=1 because the vector t is a one-hot vector.


Questo è ciò che finalmente mi ha chiarito! Spiegazione eccellente ed elegante !!!!
SantoshGupta7,

2
I’m glad you both enjoyed and benefited from reading my post! It was also helpful for me to write it out and explain it.
Vivek Subramanian

@VivekSubramanian should it be
=t1o1[o1(1o1)]h2+t2o2(o2o1)h2
instead ?
koryakinp

Hai ragione - era un errore di battitura! Farò il cambiamento.
Vivek Subramanian

La cosa che non capisco qui è che assegni anche logit (punteggi non scalati) ad alcuni neuroni. (o è logits softmax (previsioni) e y è logits nel tuo caso). Tuttavia, questo non è il caso normalmente, non è vero? Guarda questa immagine (o_out1 è previsione e o_in1 è logit) quindi come è possibile in questo caso come trovare la derivata parziale di o2 rispetto a y1?
ARAT

6

Al posto del {oio},Voglio una lettera la cui maiuscola è visivamente distinta dalla sua minuscola. Quindi lasciami sostituire{yio}. Inoltre, usiamo la variabile{pio} designare il {oio} dal livello precedente.

Permettere Y essere la matrice diagonale la cui diagonale è uguale al vettore y, cioè

Y=Dioun'g(y)
Usando questa nuova variabile matrice e il Prodotto interno Frobenius possiamo calcolare il gradiente diE wRT W.
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

Here is one of the cleanest and well written notes that I came across the web which explains about "calculation of derivatives in backpropagation algorithm with cross entropy loss function".


In the given pdf how did equation 22 become equation 23? As in how did the Summation(k!=i) get a negative sign. Shouldn't it get a positive sign? Like Summation(Fn)(For All K) = Fn(k=i) + Summation(Fn)(k!=i) should be happening according to my understanding.
faizan

1

Here's a link explaining the softmax and its derivative.

It explains the reason for using i=j and i!=j.


It is recommended to provide a minimal, stand-alone answer, in case that link gets broken in the future. Otherwise, this might no longer help other users in the future.
luchonacho

0

Other answers have provided the correct way of calculating the derivative, but they do not point out where you have gone wrong. In fact, tj is always 1 in your last equation, cause you have assumed that oj takes that node of target 1 in your output; oj of other nodes have different forms of probability function, thus lead to different forms of derivative, so you should now understand why other people have treated i=j and ij differently.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.