La funzione di errore di entropia incrociata nelle reti neurali


115

Nel MNIST per principianti ML definiscono l'entropia incrociata come

Hy(y):=iyilog(yi)

yi è il valore di probabilità previsto per la classe e è la vera probabilità per quella classe.iyi

Domanda 1

Non è un problema che (in ) possa essere 0? Ciò significherebbe che abbiamo un pessimo classificatore, ovviamente. Ma pensa a un errore nel nostro set di dati, ad esempio un "ovvio" etichettato come . Si schianterebbe semplicemente? Il modello che abbiamo scelto (attivazione softmax alla fine) non dà praticamente mai la probabilità 0 per la classe corretta?yilog(yi)13

Domanda 2

Ho imparato che l'entropia incrociata è definita come

Hy(y):=i(yilog(yi)+(1yi)log(1yi))

Cosa è corretto? Hai riferimenti a libri di testo per entrambe le versioni? In che modo tali funzioni differiscono nelle loro proprietà (come funzioni di errore per le reti neurali)?



Risposte:


101

Un modo di interpretare l'entropia incrociata è vederlo come una (meno) verosimiglianza logaritmica per i dati yi , secondo un modello yi .

Vale a dire, supponiamo di avere un modello fisso (noto anche come "ipotesi"), che prevede n classi {1,2,,n} loro ipotetiche probabilità di occorrenza y 1 , y 2 , ... , y n . Supponi ora di osservare (in realtà) k 1 istanze di classe 1 , k 2 istanze di classe 2 , k n istanze di classe n , ecc. Secondo il tuo modello, la probabilità che ciò accada è: P [ d a t a | m o d e l ] : = y k 1 1 y k 2 2 2 - - k n log y n = - i k iy1,y2,,ynk11k22knn

P[data|model]:=y1k1y2k2ynkn.
Prendere il logaritmo e cambiare il segno:
logP[data|model]=k1logy1k2logy2knlogyn=ikilogyi
Se ora dividi la somma della mano destra per il numero di osservazioniN=k1+k2++kn e denoti le probabilità empiriche comeyi=ki/N , otterrai l'entropia incrociata:
-1NceppoP[dun'tun'|model]=-1NΣioKioceppoyio=-Σioyio'ceppoyio=:H(y',y)

Inoltre, la probabilità logaritmica di un set di dati dato un modello può essere interpretata come una misura della "lunghezza di codifica" - il numero di bit che si prevede di spendere per codificare queste informazioni se il proprio schema di codifica si basasse sulla propria ipotesi.

Ciò deriva dall'osservazione che un evento indipendente con probabilità yio richiede almeno -ceppo2yio bit per codificare esso (supponendo codifica efficiente), e di conseguenza l'espressione

-Σioyio'ceppo2yio,
è letteralmente l'atteso lunghezza della codifica, in cui le lunghezze di codifica per gli eventi vengono calcolate utilizzando la distribuzione "ipotizzata", mentre l'attesa viene presa su quella effettiva.

Infine, invece di dire "misura della lunghezza di codifica prevista", mi piace molto usare il termine informale "misura di sorpresa". Se hai bisogno di molti bit per codificare un evento previsto da una distribuzione, la distribuzione è "davvero sorprendente" per te.

Con queste intuizioni in mente, le risposte alle tue domande possono essere viste come segue:

  • Domanda 1 . Sì. È un problema ogni volta che lo yio' corrispondente è diverso da zero allo stesso tempo . Corrisponde alla situazione in cui il tuo modello crede che una classe abbia zero probabilità di accadimento, eppure la classe si apre nella realtà. Di conseguenza, la "sorpresa" del tuo modello è infinitamente grande: il tuo modello non ha tenuto conto di quell'evento e ora ha bisogno di infiniti bit per codificarlo. Ecco perché ottieni l'infinito come tua entropia incrociata.

    Per evitare questo problema, devi assicurarti che il tuo modello non faccia ipotesi avventate su qualcosa che è impossibile mentre può accadere. In realtà, le persone tendono ad usare le funzioni sigmoide o "softmax" come modelli di ipotesi, che sono abbastanza conservative da lasciare almeno qualche possibilità per ogni opzione.

    Se usi qualche altro modello di ipotesi, spetta a te regolarizzarlo (alias "smooth") in modo che non ipotizzi zero dove non dovrebbe.

  • Domanda 2 . In questa formula, si presume di solito yio' sia0o1, mentreyioè l'ipotesi di probabilità del modello per l'input corrispondente. Se guardi da vicino, vedrai che è semplicemente un-ceppoP[dun'tun'|model]per i dati binari, un equivalente della seconda equazione in questa risposta.

    Quindi, a rigor di termini, sebbene sia ancora una probabilità logaritmica, questo non è sintatticamente equivalente all'entropia incrociata. Ciò che alcune persone intendono quando si riferiscono a un'espressione come l' entropia incrociata è che in realtà è una somma sulle entropie binarie binarie per singoli punti nel set di dati:

    ΣioH(yio',yio),
    doveyio' eyio devono essere interpretati come le corrispondenti distribuzioni binarie(yio',1-yio') e(yio,1-yio) .


1
Potete fornire una fonte in cui definiscono ? Quilo definiscono come una distribuzione a caldo per l'etichetta di classe corrente. Qual è la differenza? y'io=KioN
Lenar Hoyt il

1
Nel tutorial di MNIST TensorFlow lo definiscono anche in termini di vettori one-hot.
Lenar Hoyt il

@LenarHoyt When , k i / N sarebbe equivalente a uno caldo. Puoi pensare a uno caldo come la codifica di un oggetto in base alla sua probabilità empirica (reale) categorica. N=1Kio/N
THN,

'evento indipendente richiede ... per codificarlo' - potresti spiegare questo bit per favore?
Alex

@Alex Potrebbe essere necessaria una spiegazione più lunga per comprendere correttamente - leggi i codici di Shannon-Fano e la relazione della codifica ottimale con l'equazione di entropia di Shannon. Per sminuire le cose, se un evento ha probabilità 1/2, la soluzione migliore è codificarla usando un singolo bit. Se ha probabilità 1/4, dovresti spendere 2 bit per codificarlo, ecc. In generale, se il tuo set di eventi ha probabilità del modulo 1/2 ^ k, dovresti dare loro lunghezze k - in questo modo il tuo codice avvicinarsi alla lunghezza ottimale di Shannon.
KT.

22

La prima formula di logloss che stai utilizzando è per la perdita di log multiclasse, in cui l' iscrizione enumera le diverse classi in un esempio. La formula presuppone che un singolo y ' i in ciascun esempio sia 1, e il resto sia tutto 0.ioyio'

Ciò significa che la formula acquisisce solo errori sulla classe target. Elimina qualsiasi nozione di errori che potresti considerare "falsi positivi" e non si preoccupa di come le probabilità previste sono distribuite oltre alla probabilità prevista della classe reale.

Un altro presupposto è che per le previsioni di ciascun esempio. Un layer softmax lo fa automaticamente - se usi qualcosa di diverso dovrai ridimensionare gli output per soddisfare quel vincolo.Σioyio=1

Domanda 1

Non è un problema che il (in l o g ( y i ) ) potrebbe essere 0?yiolog(yio)

Sì, può essere un problema, ma di solito non è pratico. È estremamente improbabile che uno strato di softmax inizializzato casualmente produca un esatto 0in qualsiasi classe. Ma è possibile, quindi vale la pena permetterlo. Innanzitutto, non valutare per qualsiasi y i = 0 , poiché le classi negative contribuiscono sempre 0 all'errore. In secondo luogo, nel codice pratico è possibile limitare il valore a qualcosa di similealla stabilità numerica: in molti casi non è necessario, ma si tratta di una ragionevole programmazione difensiva.log(yio)yio'=0log( max( y_predict, 1e-15 ) )

Domanda 2

Ho imparato che l'entropia incrociata è definita come Hy'(y): =-Σio(yio'ceppo(yio)+(1-yio')ceppo(1-yio))

Questa formulazione viene spesso utilizzata per una rete con un output che prevede due classi (in genere appartenenza alla classe positiva per 1 e negativa per 0 output). In tal caso avere un solo valore: puoi perdere la somma su i .ioio

Se modifichi una tale rete per avere due output opposti e usi softmax più la prima definizione di logloss, allora puoi vedere che in realtà si tratta della stessa misurazione dell'errore ma che piega la metrica dell'errore per due classi in un singolo output.

Se è prevista più di una classe per prevedere l'appartenenza e le classi non sono esclusive, ad esempio un esempio potrebbe essere una o tutte le classi contemporaneamente, sarà necessario utilizzare questa seconda formulazione. Per il riconoscimento delle cifre che non è il caso (una cifra scritta dovrebbe avere solo una classe "vera")


Nota v'è una certa ambiguità nella presentazione della seconda formula - potrebbe in teoria assumere solo una classe e sarebbe poi elencare gli esempi. i
Neil Slater

Mi dispiace, ho chiesto qualcosa di diverso da quello che volevo sapere. Non vedo un problema nel , ma in y i = 0 , a causa del log ( y i ) . Potresti adattare la tua risposta a questo? ceppo(yio)=0yio=0ceppo(yio)
Martin Thoma

@NeilSlater se le classi non si escludono a vicenda, il vettore di output per ciascun input può contenere più di 1, dovremmo usare la seconda formula?
Media

1
@ Media: non proprio. Volete guardare cose come la classificazione gerarchica però. . .
Neil Slater,

1
@Javi: Nella PO questione è la verità terra, così solitamente 0 o 1. È y i cioè l'uscita SoftMax. Tuttavia y i può finire zero pratica a causa dell'arrotondamento punto mobile. Questo in realtà succede. yio'yioyio
Neil Slater

11

Dato , si desidera ottimizzare il vostro metodo di apprendimento della macchina per ottenere la y p r e d i C T il più vicino possibile aiytrueypredioct .ytrue

Prima domanda:

La risposta sopra ha spiegato lo sfondo della tua prima formula, l'entropia incrociata definita nella teoria dell'informazione.

Da un'opinione diversa dalla teoria dell'informazione:

puoi esaminare te stesso che la prima formula non ha penalità per la falsa positività (la verità è falsa ma il tuo modello prevede che sia giusta), mentre la seconda ha una penalità per la falsa positività. Pertanto, la scelta della prima formula o della seconda influenzerà le tue metriche (ovvero la quantità statistica che desideri utilizzare per valutare il tuo modello).

In parole profani:

Se vuoi accettare che quasi tutte le persone buone diventino tuoi amici, ma che desideri accettare alcune persone cattive, diventa tuo amico, quindi usa la prima formula per criterio.

Se vuoi punirti accettando che alcune persone cattive siano tue amiche, ma allo stesso tempo il tuo tasso di accettazione delle persone buone potrebbe essere inferiore alla prima condizione, quindi usa la seconda formula.

Mentre, immagino che molti di noi siano critici e vorrebbero scegliere il secondo (così come molti pacchetti ML assumono ciò che è l'entropia incrociata).

Seconda domanda:

-ytrueceppo(ypredioct)

ΣionΣKK-ytrue(K)ceppo(ypredioct(K))

Pertanto, quando ci sono solo due classi (K = 2), avrai la seconda formula.


5

Questi problemi sono gestiti dall'uso del tutorial di softmax.

Per 1) hai ragione sul fatto che softmax garantisce un output diverso da zero perché esponenzia il suo input. Per le attivazioni che non danno questa garanzia (come relu), è semplice aggiungere un termine positivo molto piccolo a ogni output per evitare quel problema.

Per quanto riguarda 2), non sono ovviamente gli stessi, ma io la formulazione di softmax che hanno dato si occupa del problema. Se non avessi usato softmax, questo avrebbe portato a imparare termini di bias enormi che indovinano 1 per ogni classe per qualsiasi input. Ma poiché normalizzano il softmax in tutte le classi, l'unico modo per massimizzare l'output della classe corretta è che sia grande rispetto alle classi errate.


"hai ragione sul fatto che softmax garantisce un output diverso da zero" - So che teoricamente è così. In realtà, può succedere che (a causa di problemi numerici) questo diventi 0?
Martin Thoma,

Buona domanda. Suppongo che sia perfettamente possibile che la funzione di esponenziazione produca 0,0 se il tuo input è troppo piccolo per la precisione del tuo float. Tuttavia, immagino che la maggior parte delle implementazioni aggiunga il piccolo termine positivo per garantire un input diverso da zero.
jamesmf,

0

yioceppo(yio)

ceppo(0)ceppo(yio+ε)


Hy'(y): =-Σioyio'ceppo(yio)
Hy'(y): =-Σio(yio'ceppo(yio)+(1-yio')ceppo(1-yio))

(a) è corretto per la previsione multi-classe (in realtà è una doppia somma), (b) è lo stesso di (a) per la previsione a due classi. Entrambi sono entropia incrociata.

Esempio:

Xiocio'{0,1}cio[0,1] .

cio'cio

(cio',cio)={(0,0.1),(0,0.4),(0,0.8),(1,0.8),(1,0.2)}

yio'yio

  • yioK': =1cio'=K: =0

  • yioK: =p(K|Xio)XioK

(yio',yio)

(yio',yio)={([1,0],[0.9,0.1]), ([1,0],[0.6,0.4]), ([1,0],[0.2,0.8]), ([0,1],[0.2,0.8]), ([0,1],[0.8,0.2])}

Sia (a) che (b) sono calcolati come:

Hy'(y)=-1/5([log(0.9)+log(0.6)+log(0.2)]cio=0+[log(0.8)+log(0.2)]cio=1)=0,352

Derivazione:

1K
(Xio,cio')cio'=Kyio'=[0,..,1,0,..]KthyioK'=1yioK=p(K|Xio)(Xio,K)-log(yioK)yioK1-log(yioK)0

L(yio',yio)=-ΣK=1KyioK'log(yioK)

yioK'=1K'K0log(yioK')=0yiom'=1

L(yio',yio)=-log(yiom)

La formula finale su tutti i punti di allenamento è:

Hy'(y)=-Σ(Xio,yio')ΣK=1KyioK'log(yioK)

yio0'=1-yio1'yio0=1-yio1

Hy'(y)=-Σ(Xio,yio')yio1'log(yio1)+yio0'log(yio0)=-Σ(Xio,yio')yio1'log(yio1)+(1-yio1')log(1-yio1)

che è lo stesso di (b).

Cross-entropia (a) sopra le classi (una somma)

L'entropia incrociata (a) sulle classi è:

Hy'(y)=-ΣK=1KyK'log(yK)

Questa versione non può essere utilizzata per l'attività di classificazione. Consente di riutilizzare i dati dell'esempio precedente:

(cio',cio)={(0,0.1),(0,0.4),(0,0.8),(1,0.8),(1,0.2)}

y0'=3/5=0.6y1'=0.4

y0=3/5=0.6y1=0.4

-y0'logy0-y1'logy1=-0.6log(0.6)-0.4log(0.4)=0.292

(0,0.8)(1,0.2)y0'y1'


(cio',cio)={(0,0.1),(0,0.4),(0,0.2),(1,0.8),(1,0.8)}

y0'y0=3/5

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.