Strato di Softmax in una rete neurale


43

Sto cercando di aggiungere uno strato di softmax a una rete neurale addestrata con backpropagation, quindi sto provando a calcolare il suo gradiente.

L'output di softmax è hj=ezjezi cuijè il numero di uscita neurone.

Se lo ricavo, allora ottengo

hjzj=hj(1hj)

Simile alla regressione logistica. Tuttavia, questo è sbagliato poiché il mio controllo numerico del gradiente fallisce.

Che cosa sto facendo di sbagliato? Pensavo che avrei bisogno di calcolare anche i derivati ​​incrociati (cioè hjzk ) ma non sono sicuro di come fare e mantenere la dimensione del gradiente uguale in modo che si adatti al processo di propagazione posteriore.


3
Dovresti migliorare il titolo della tua domanda in quanto non parla dell'aggiunta di un layer softmax generale a una NN, poiché la tua domanda è specifica su come il controllo del gradiente fallisce. Consiglio vivamente di cambiare il titolo in "Perché la backpropagation smette di funzionare correttamente quando aggiungo un layer softmax alla mia rete neurale".
Charlie Parker,

Risposte:


43

Mi sento un po 'male nel fornire la mia risposta per questo perché è abbastanza ben catturato da ameba e juampa, tranne forse l'intuizione finale su come il Jacobiano può essere ridotto a un vettore.

Hai correttamente derivato il gradiente della diagonale della matrice giacobina, vale a dire che

hizj=hi(1hj):i=j

e come diceva l'ameba, devi anche derivare le voci diagonali del giacobino, che cedono

hizj=hihj:ij

Queste definizioni di due concetti possono essere convenientemente combinate usando un costrutto chiamato Delta di Kronecker , così diventa la definizione del gradiente

hizj=hi(δijhj)

Quindi il giacobino è una matrice quadrata [J]ij=hi(δijhj)

Tutte le informazioni fino a questo punto sono già coperte da ameba e juampa. Naturalmente il problema è che dobbiamo ottenere gli errori di input dagli errori di output che sono già stati calcolati. Poiché il gradiente dell'errore di uscita dipende da tutti gli ingressi, quindi il gradiente di ingresso x i èhixi

[x]k=i=1hi,k

Data la matrice giacobina sopra definita, questa viene implementata in modo banale come prodotto della matrice e vettore di errore di output:

σl=Jσl+1

Se il livello softmax è il livello di output, la combinazione con il modello di costo tra entropia semplifica il calcolo in modo semplice

σl=ht

dove è il vettore delle etichette e h è l'output della funzione softmax. Non solo è conveniente la forma semplificata, ma è anche estremamente utile dal punto di vista della stabilità numerica.th


con , è σ l , j = Cσl=(σl,1,σl,2,...,σl,k) ? (sto solo cercando di dare un senso a ciò che è "il gradiente" in questo caso)σl,j=Czj
Alexandre Holden Daly,

Si, è corretto.
Mranz,

Qualcuno potrebbe spiegare quali sono i termini delta minuscoli nel Delta del Kronecker e come calcolarli?
danijar,

Sono bloccato a questo problema per un po '. Chiarire. Hai un vettore (pre softmax) e quindi calcoli softmax. Poiché i valori di softmax dipendono da tutti i valori di input, è necessaria la matrice jacobiana effettiva. Quindi prendi la matrice jacobiana e la somma riduce le righe per ottenere un vettore a riga singola, che usi come al solito per la discesa del gradiente. Tutto questo è corretto al 100%?
harveyslash,

14

Il derivato è sbagliato. Dovrebbe essere,

hjzk=hjδkjhjhk

controlla di nuovo i tuoi calcoli. Inoltre, l'espressione data dall'ameba per l'entropia incrociata non è del tutto corretta. Per un set di campioni di dati tratti da classi diverse , si legge:C

nk=1Ctknlnyk(xn)

dove il superindice viene eseguito sul set di campioni, è il valore del componente k-esimo del target per l'n-esimo campione. Qui si presume che si stia utilizzando uno schema di codifica 1-of-C, ovvero . In tal caso tutte le t sono zero tranne per il componente che rappresenta la sua classe corrispondente, che è una.tkntkn

Nota che le t sono costanti. Quindi minimizzare questa funzione equivale a minimizzare,

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

che ha il vantaggio che il giacobino prende una forma molto conveniente, vale a dire,

Ezj=hjtj

Ti consiglierei di ottenere una copia di Bishop's Neural Networks for Pattern Recognition . IMHO è ancora il miglior libro sulle reti neurali.


14

Ogni uscita del softmax dipende da tutti gli input, quindi il gradiente è davvero un'intera matrice giacobina. Hai calcolato correttamente , ma hai anche bisogno di se . Immagino che se riesci a ricavare la prima espressione, dovresti riuscire facilmente a derivare anche la seconda.jhj=hjzj=hj(1hj)khj=hjhkjk

Non sono sicuro del problema riscontrato con la retro-propagazione: nel livello softmax ci sono output e input, quindi un errore da ciascun output dovrebbe essere propagato a ciascun input, ed è proprio per questo che è necessario l'intero Jacobiano. D'altra parte, di solito si avrebbe una funzione di costo associata all'output del softmax, ad esempio dove sono gli output desiderati (quando si fa la classificazione, spesso uno di questi è uguale a 1 e altri a 0). Quindi in effetti sei interessato a , che può essere calcolato con una regola a catena risultante in un'espressione ordinata, ed è davvero un vettore (non una matrice).jj

C=jtjloghj,
tjCzj

1
Proverò a descrivere meglio il mio problema, secondo ad esempio questo tutorial ufldl.stanford.edu/wiki/index.php/Backpropagation_Algorithm , ho bisogno di moltiplicare per elemento i pesi e il delta con la derivata (passaggio numero 3). Quindi, se ho la matrice jacobiana completa, le dimensioni non si adattano. Grazie.
Funzionò il

Sai come procedere se non è un softmax, ma un normale strato nascosto? Immagina che ogni unità su questo livello ottenga input da tutte le unità del livello precedente (cioè questo livello è "completamente collegato"), che è normalmente il caso. Quindi è necessario anche propagare indietro gli errori attraverso questo livello e anche i derivati ​​formano una matrice giacobina. Se sei confuso su come farlo, la tua confusione non è correlata al softmax.
ameba dice di reintegrare Monica il

1
L'ho implementato con successo per i livelli lineari e sigmoidi perché la derivata è un vettore, quindi non ho avuto problemi con le dimensioni.
Funzionò il

Scusa, Ran, forse sono solo uno stupido, ma se hai uno strato sigmoideo completamente connesso allo strato precedente, allora l'output (o input) a ciascuna unità avrà una derivazione rispetto alla connessione in entrata da ogni unità sul livello precedente, ovvero tutti i derivati ​​formano una matrice 2D, n'est-ce pas? ji
ameba dice Ripristina Monica il
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.