Reti neurali: quale funzione di costo usare?


49

Sto usando TensorFlow per esperimenti principalmente con reti neurali. Anche se ho fatto alcuni esperimenti (XOR-Problem, MNIST, alcune cose di regressione, ...) ora, faccio fatica a scegliere la funzione di costo "corretta" per problemi specifici perché nel complesso potrei essere considerato un principiante.

Prima di arrivare a TensorFlow ho codificato alcune MLP completamente connesse e alcune reti ricorrenti da solo con Python e NumPy, ma soprattutto ho avuto problemi in cui era sufficiente un semplice errore al quadrato e un semplice gradiente descient.

Tuttavia, dal momento che TensorFlow offre molte funzioni di costo, oltre a creare funzioni di costo personalizzate, vorrei sapere se esiste qualche tipo di tutorial forse specifico per le funzioni di costo sulle reti neurali? (Ho già fatto la metà dei tutorial ufficiali di TensorFlow ma non spiegano perché le funzioni di costo specifiche o gli studenti vengono utilizzati per problemi specifici - almeno non per i principianti)

Per fare alcuni esempi:

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y_output, y_train))

Immagino che applichi la funzione softmax su entrambi gli input in modo che la somma di un vettore sia uguale a 1. Ma che cos'è esattamente l'entropia incrociata con i logit? Ho pensato che sommasse i valori e calcolasse l'entropia crociata ... quindi qualche misurazione metrica ?! Non sarebbe lo stesso se normalizzassi l'output, lo riassumessi e prendessi l'errore al quadrato? Inoltre, perché questo viene utilizzato, ad esempio, per MNIST (o problemi ancora più difficili)? Quando voglio classificare come 10 o forse anche 1000 classi, il riepilogo dei valori non distrugge completamente qualsiasi informazione su quale classe è stata effettivamente l'output?

cost = tf.nn.l2_loss(vector)

A cosa serve? Pensavo che la perdita di l2 fosse praticamente l'errore al quadrato, ma l'API di TensorFlow dice che il suo input è solo un tensore. L'idea non è affatto ?!

Inoltre ho visto questo per l' entropia incrociata abbastanza spesso:

cross_entropy = -tf.reduce_sum(y_train * tf.log(y_output))

... ma perché viene usato? La perdita di entropia incrociata non è matematicamente questa:

-1/n * sum(y_train * log(y_output) + (1 - y_train) * log(1 - y_output))

Dov'è la (1 - y_train) * log(1 - y_output)parte nella maggior parte degli esempi di TensorFlow? Non manca?


Risposte: so che questa domanda è abbastanza aperta, ma non mi aspetto di ottenere come 10 pagine con ogni singolo problema / funzione di costo elencata in dettaglio. Ho solo bisogno di un breve riassunto su quando usare quale funzione di costo (in generale o in TensorFlow, non importa molto per me) e alcune spiegazioni su questo argomento. E / o alcune fonti per principianti;)


1
Buona domanda. Benvenuti nel sito :)
Dawny33

2
Di solito, MSE viene preso per la regressione e Cross-Entropy per la classificazione. La classificazione della figura di merito (CFM) è stata introdotta in "Una nuova funzione obiettiva per migliorare il riconoscimento dei fonemi utilizzando reti neurali ritardate" da Hampshire e Waibel. Se lo ricordo correttamente, spiegano anche perché hanno progettato CFM come hanno fatto.
Martin Thoma,

1
Penso che si riduca molto (y_train * tf.log (y_output)) perché è un esempio abbastanza comune di "caso semplice". Verrà eseguita la somma dell'errore di ciascun batch, il che significa che l'errore raddoppia il costo (e l'entità del gradiente) se il batch_size raddoppia. Apportare la semplice modifica a reduce_mean renderà quantomeno più comprensibile il debug e la riproduzione di impostazioni secondo me.
neurone,

Risposte:


35

Questa risposta è sul lato generale delle funzioni di costo, non correlata a TensorFlow, e affronterà principalmente la parte "alcune spiegazioni su questo argomento" della domanda.

Nella maggior parte degli esempi / tutorial che ho seguito, la funzione di costo utilizzata era in qualche modo arbitraria. Il punto era più di introdurre il lettore a un metodo specifico, non specificamente alla funzione di costo. Non dovresti impedirti di seguire il tutorial per avere familiarità con gli strumenti, ma la mia risposta dovrebbe aiutarti su come scegliere la funzione di costo per i tuoi problemi.

Se vuoi risposte su Cross-Entropy, Logit, norme L2 o qualcosa di specifico, ti consiglio di inviare più domande più specifiche. Ciò aumenterà la probabilità che qualcuno con conoscenze specifiche possa vedere la tua domanda.


Scegliere la giusta funzione di costo per ottenere il risultato desiderato è un punto critico dei problemi di apprendimento automatico. L'approccio di base, se non sai esattamente cosa vuoi dal tuo metodo, è quello di utilizzare Mean Square Error (Wikipedia) per problemi di regressione e Percentuale di errore per problemi di classificazione. Tuttavia, se si desidera ottenere buoni risultati dal proprio metodo, è necessario definire buoni e quindi definire la funzione di costo adeguata. Ciò deriva sia dalla conoscenza del dominio (quali sono i tuoi dati, cosa stai cercando di ottenere), sia dalla conoscenza degli strumenti a tua disposizione.

Non credo di poterti guidare attraverso le funzioni di costo già implementate in TensorFlow, poiché ho una conoscenza molto ridotta dello strumento, ma posso darti un esempio su come scrivere e valutare diverse funzioni di costo.


Per illustrare le varie differenze tra le funzioni di costo, usiamo l'esempio del problema di classificazione binaria, dove vogliamo, per ogni campione , la classe .xnf(xn){0,1}

A partire da proprietà computazionali ; come due funzioni che misurano la "stessa cosa" potrebbero portare a risultati diversi. Prendi la seguente semplice funzione di costo; la percentuale di errore. Se hai campioni, è la classe prevista e la classe vera, vuoi minimizzareNf(yn)yn

  • 1Nn{1 if f(xn)yn0 otherwise=nyn[1f(xn)]+[1yn]f(xn) .

Questa funzione di costo ha il vantaggio di essere facilmente interpretabile. Tuttavia, non è liscio; se si hanno solo due campioni, la funzione "salta" da 0, a 0,5, a 1. Ciò comporterà incongruenze se si tenta di utilizzare la discesa gradiente su questa funzione. Un modo per evitarlo è cambiare la funzione di costo per utilizzare le probabilità di assegnazione; . La funzione diventap(yn=1|xn)

  • 1Nnynp(yn=0|xn)+(1yn)p(yn=1|xn) .

Questa funzione è più fluida e funzionerà meglio con un approccio con discesa gradiente. Otterrai un modello "più fine". Tuttavia, ha altri problemi; se si dispone di un campione ambiguo, si supponga di non disporre di informazioni sufficienti per dire qualcosa di meglio di . Quindi, l'utilizzo della discesa gradiente su questa funzione di costo porterà a un modello che aumenta il più possibile questa probabilità e quindi, forse, si adatta.p(yn=1|xn)=0.5

Un altro problema di questa funzione è che se mentre , si è certi di avere ragione, ma si sbaglia. Per evitare questo problema, puoi prendere il registro della probabilità, . Come e , la seguente funzione non presenta il problema descritto nel paragrafo precedente:p(yn=1|xn)=1yn=0logp(yn|xn)log(0)=log(1)=0

  • 1Nnynlogp(yn=0|xn)+(1yn)logp(yn=1|xn) .

Ciò dovrebbe dimostrare che, al fine di ottimizzare la stessa cosa , la percentuale di errore, definizioni diverse potrebbero produrre risultati diversi se sono più facili da capire, a livello computazionale.

E 'possibile per funzioni di costo e per misurare la stesso concetto , ma potrebbe portare il tuo metodo per risultati migliori rispetto a .ABAB


Ora vediamo come la diversa funzione dei costi può misurare concetti diversi. Nel contesto del recupero delle informazioni, come nella ricerca di Google (se ignoriamo la classifica), vogliamo che i risultati restituiti vengano

  • avere un'elevata precisione , non restituire informazioni irrilevanti
  • avere un elevato richiamo , restituire il maggior numero possibile di risultati pertinenti
  • Precisione e richiamo (Wikipedia)

Nota che se il tuo algoritmo restituisce tutto , restituirà ogni possibile risultato rilevante e quindi avrà un alto richiamo, ma avrà una precisione molto scarsa. D'altra parte, se restituisce solo un elemento, quello che è il più certo è rilevante, avrà un'alta precisione ma un basso richiamo.

Per giudicare tali algoritmi, la funzione di costo comune è il punteggio (Wikipedia) . Il caso comune è il punteggio , che dà uguale peso alla precisione e al richiamo, ma il caso generale è il punteggio , e puoi modificare per ottenereFF1Fββ

  • Richiamo superiore, se si utilizzaβ>1
  • Maggiore precisione, se si utilizza .β<1

In tale scenario, scegliere la funzione di costo è scegliere quale compromesso dovrebbe fare l'algoritmo .

Un altro esempio che viene spesso sollevato è il caso della diagnosi medica, puoi scegliere una funzione di costo che punisce più falsi negativi o falsi positivi a seconda di ciò che è preferibile:

  • Le persone più sane vengono classificate come malate (Ma poi, potremmo trattare le persone sane, il che è costoso e potrebbe ferirle se in realtà non sono malati)
  • Più persone malate vengono classificate come sane (ma potrebbero morire senza cure)

In conclusione, la definizione della funzione di costo sta definendo l'obiettivo del tuo algoritmo. L'algoritmo definisce come arrivarci.


Nota a margine: alcune funzioni di costo hanno modi algoritmici utili per raggiungere i propri obiettivi. Ad esempio, esiste un buon modo per minimizzare la perdita di cerniere (Wikipedia) , risolvendo il doppio problema in SVM (Wikipedia)


10

Per rispondere alla tua domanda sull'entropia incrociata, noterai che entrambe le cose che hai menzionato sono la stessa cosa.

1n(y_trainlog(y_output)+(1y_train)log(1y_output))

che hai menzionato è semplicemente la perdita binaria di entropia incrociata in cui supponi che sia uno scalare 0/1 e che sia di nuovo uno scalare che indica la probabilità che l'output sia 1.y_trainy_output

L'altra equazione che hai citato è una variante più generica di quella che si estende a più classi

-tf.reduce_sum(y_train * tf.log(y_output)) è la stessa cosa della scrittura

ntrain_problog(out_prob)

dove la somma è sopra le classi multiple e le probabilità sono per ogni classe. Chiaramente nel caso binario è esattamente la stessa cosa di quanto menzionato in precedenza. Il termine viene omesso in quanto non contribuisce in alcun modo alla minimizzazione della perdita in quanto è una costante.n


4

BLUF: tentativi ed errori iterativi con sottoinsieme di dati e matplotlib.

Risposta lunga:

La mia squadra stava lottando con questa stessa domanda non molto tempo fa. Tutte le risposte qui sono fantastiche, ma volevo condividere con te la mia "risposta per principianti" per il contesto e come punto di partenza per persone che non conoscono l'apprendimento automatico.

Volete puntare a una funzione di costo che sia liscia e convessa per la vostra scelta specifica di algoritmo e set di dati. Questo perché vuoi che il tuo algoritmo sia in grado di regolare in modo sicuro ed efficiente i pesi per raggiungere il minimo globale di quella funzione di costo. Se la tua funzione di costo è "irregolare" con massimi e minimi locali e / o non ha un minimo globale, il tuo algoritmo potrebbe avere difficoltà a convergere; i suoi pesi potrebbero semplicemente saltare dappertutto, alla fine non riuscendo a darti previsioni accurate e / o coerenti.

Ad esempio, se si utilizza la regressione lineare per prevedere il peso di qualcuno (numero reale, in libbre) in base all'altezza (numero reale, in pollici) e all'età (numero reale, in anni), la funzione di costo quadratico medio dell'errore dovrebbe essere una curva piacevole, liscia, convessa. Il tuo algoritmo non avrà problemi a convergere.

Supponiamo invece che tu stia utilizzando un algoritmo di regressione logistica per un problema di classificazione binaria, come prevedere il genere di una persona in base al fatto se la persona abbia acquistato i pannolini negli ultimi 30 giorni e se la persona abbia acquistato birra negli ultimi 30 giorni. In questo caso, l'errore quadratico medio potrebbe non darti una superficie convessa liscia, che potrebbe essere dannosa per l'allenamento. E lo diresti per sperimentazione.

Puoi iniziare eseguendo una prova con l'utilizzo di MSE e un piccolo e semplice esempio dei tuoi dati o con dati simulati che hai generato per questo esperimento. Visualizza cosa sta succedendo con matplotlib (o qualunque soluzione di stampa tu preferisca). La curva di errore risultante è liscia e convessa? Riprovare con un'ulteriore variabile di input ... la superficie risultante è ancora liscia e convessa? Attraverso questo esperimento potresti scoprire che mentre MSE non si adatta al tuo problema / soluzione, l'entropia incrociata ti dà una forma convessa liscia che si adatta meglio alle tue esigenze. Quindi potresti provarlo con un set di dati di esempio più grande e vedere se l'ipotesi è ancora valida. E se lo fa, allora puoi provarlo con il tuo set completo di allenamento alcune volte e vedere come si comporta e se fornisce costantemente modelli simili. In caso contrario, selezionare un'altra funzione di costo e ripetere il processo.

Questo tipo di processo di prova ed errore altamente iterativo ha funzionato abbastanza bene per me e il mio team di data scientist di dati principianti e ci consente di concentrarci sulla ricerca di soluzioni alle nostre domande senza dover approfondire la teoria matematica dietro la selezione della funzione di costo e ottimizzazione del modello.

Naturalmente, molti di questi tentativi ed errori sono già stati fatti da altre persone, quindi sfruttiamo anche la conoscenza del pubblico per aiutarci a filtrare le nostre scelte su quelle che potrebbero essere buone funzioni di costo all'inizio del processo. Ad esempio, l'entropia incrociata è generalmente una buona scelta per i problemi di classificazione, sia che si tratti di classificazione binaria con regressione logistica come nell'esempio sopra o di una classificazione multi-etichetta più complicata con uno strato di softmax come output. Considerando che MSE è una buona prima scelta per i problemi di regressione lineare in cui si sta cercando una previsione scalare anziché la probabilità di appartenenza a una categoria nota da un insieme noto di possibili categorie, nel qual caso invece di un livello softmax come output si ' d potrebbe avere solo una somma ponderata degli input più il bias senza una funzione di attivazione.

Spero che questa risposta aiuti gli altri principianti là fuori senza essere eccessivamente semplicistico e ovvio.


3

Regradare la tua domanda

Dov'è la parte (1 - y_train) * log (1 - y_output) nella maggior parte degli esempi di TensorFlow? Non manca?

La risposta è che la maggior parte delle funzioni di output sono softmax. Ciò significa che non è necessario ridurre necessariamente tutte le probabilità in casi errati poiché verranno automaticamente ridotte quando si aumenta la probabilità di quella giusta

Per esempio:

prima dell'ottimizzazione

y_output = [0.2, 0.2, 0.6] e y_train = [0, 0, 1]

dopo l'ottimizzazione

y_output = [0.15, 0.15, 0.7] e y_train = [0, 0, 1]

qui osserviamo che anche se abbiamo appena aumentato il terzo mandato, tutti gli altri termini si riducono automaticamente


0

Una funzione di perdita è una guida per il modello per decidere il suo percorso utilizzando l'ottimizzatore. Quindi, proverà a portare un numero che deve riflettere correttamente il divario con il valore reale e anche (anche se non limitato a) -

Comprensione dei valori anomali, comprensione dello scopo del modello, approccio del modello, comprensione del tipo di previsione, ad esempio numero, etichetta binaria ecc.

Sono d'accordo sul fatto che questa domanda sia troppo vasta per rispondere in un breve testo, ma comunque, proverei a elencare un riassunto dell'uso che ho trovato la maggior parte degli autori che suggeriscono.

Questo potrebbe aiutarti ad avviare il tuo modello, ma deve essere accompagnato da ricerche individuali basate su scenari e dati.

Potrebbe anche innescare più perché e come. Poni una nuova domanda O usa le domande già risposte su queste (ce ne sono molte)

mean_squared_error Predefinito per regressione

mean_absolute_error Regressione quando si hanno valori anomali

mean_squared_logarithmic_error Regressione. Ridimensionato ulteriormente l'errore. Utilizzare quando ci si aspetta grandi valori nella previsione

huber_loss Una via di mezzo tra MSE e MAE. Questa funzione è quadratica per valori piccoli e lineare per valori grandi

logcosh È di nuovo una via di mezzo per ottenere i vantaggi di entrambi i registri MSE e MAE (cosh (x)) è approssimativamente uguale a (x ** 2) / 2 per x piccola e abs (x) - log (2) per grande X. Ciò significa che 'logcosh' funziona principalmente come l'errore quadratico medio, ma non sarà così fortemente influenzato dalla previsione selvaggiamente errata occasionale.

mean_absolute_percentage_error Quando siamo interessati alla misurazione%, non ai valori. ad esempio, mentre si occupa dei dati di scala della popolazione di un paese, la% sarebbe più importante di un grande numero ~ 10000

cerniera SVM. Si occupa del margine attorno al vettore di supporto.

categorical_crossentropy Classificazione multiclasse: abbiamo una probabilità target per classe per ogni istanza (ad esempio vettori a uno caldo, ad esempio [0., 0., 0., 1., 0., 0., 0., 0., 0. , 0.] per rappresentare la classe 3

sparse_categorical_crossentropy Classificazione multiclasse - abbiamo etichette sparse (cioè, per ogni istanza, c'è solo un indice di classe target, da 0 a 9 in questo caso), e le classi sono esclusive

binary_crossentropy Usalo per una semplice classificazione binaria

Note :: Queste sono le "perdite" dalla libreria Keras. Il concetto sarebbe lo stesso ma altre biblioteche potrebbero usare qualche altra varianza di testo per nominarli.

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.