Domanda

tensorflow per esperimenti principalmente con le reti neurali. Anche se ho fatto abbastanza alcuni esperimenti (XOR-problema, MNIST, alcune cose Regressione, ...) ora, lotta con la scelta della funzione di costo "corretto" per problemi specifici perché nel complesso potrei essere considerato un principiante.

Prima di venire a tensorflow ho codificato alcuni MLPs completamente collegati e alcune reti ricorrenti sul mio con Python e NumPy ma soprattutto ho avuto problemi in cui era sufficiente un semplice errore quadratico e descient semplice sfumatura.

Tuttavia, poiché tensorflow offerte un bel po 'di funzioni di costo stesso, nonché la costruzione di funzioni di costo personalizzati, vorrei sapere se c'è un qualche tipo di esercitazione forse appositamente per funzioni di costo su reti neurali? (Ho già fatto come la metà dei tutorial ufficiali tensorflow ma non sono davvero spiegare perché funzioni di costo specifici o gli studenti sono utilizzati per problemi specifici - almeno non per principianti)

Per fare qualche esempio:

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

credo che applica la funzione SoftMax su entrambi gli ingressi in modo che la somma di un vettore è uguale a 1. Ma che cosa è esattamente l'entropia croce con logit? Ho pensato che riassume i valori e calcola l'entropia croce ... quindi un po 'di misura metrica ?! Non sarebbe molto simile, se normalizzare l'uscita, riassumere e prendere l'errore quadratico? Inoltre, perché questa utilizzato ad esempio per MNIST (o anche problemi molto più difficile)? Quando voglio classificare come 10 o forse anche 1.000 classi, non sommando i valori distruggere completamente tutte le informazioni su che di classe in realtà era l'uscita?

cost = tf.nn.l2_loss(vector)

Che cosa è questo per? Ho pensato l2 perdita è più o meno l'errore al quadrato, ma API tensorflow dice che di ingresso è solo un tensore. Non ottenere l'idea a tutti?!

Inoltre ho visto questo per entropia croce abbastanza spesso:

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

... ma perché è questa macchina? Non è la perdita di entropia croce matematicamente questo:

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

Dove è la parte (1 - y_train) * log(1 - y_output) nella maggior parte degli esempi tensorflow? Non è forse manca?


Risposte: So che questa domanda è abbastanza aperta, ma non mi aspettavo di ottenere come 10 pagine con ogni singola funzione problema / costo indicato in dettaglio. Ho solo bisogno di un riassunto breve di quando usare quale funzione di costo (in generale o in tensorflow, non ha molta importanza per me) e qualche spiegazione su questo argomento. E / o di qualche fonte (s) per i principianti;)

È stato utile?

Soluzione

Questa risposta è sul Generale lato di funzioni di costo, non legati alla tensorflow, e sarà in gran parte affrontare la "qualche spiegazione su questo argomento" parte della tua domanda.

Nella maggior parte degli esempi / tutorial seguito, la funzione di costo usato era alquanto arbitraria. Il punto era più di introdurre il lettore a un metodo specifico, non alla funzione di costo specifico. Non dovrebbe smettere di seguire il tutorial per avere familiarità con gli strumenti, ma la mia risposta dovrebbe aiutare su come scegliere la funzione di costo per i propri problemi.

Se si vuole risposte per quanto riguarda Cross-entropia, Logit, norme L2, o nulla di specifico, vi consiglio di inviare più, domande più specifiche. Ciò consentirà di aumentare la probabilità che una persona con conoscenze specifiche vedrà la tua domanda.


Scegliere la funzione di costo giusto per raggiungere il risultato desiderato è un punto critico di problemi di apprendimento della macchina. L'approccio di base, se non si sa esattamente che cosa desiderate dal vostro metodo, è quello di utilizzare errore quadratico medio (Wikipedia) per problemi di regressione e la percentuale di errore per problemi di classificazione. Tuttavia, se si desidera che bene risultati fuori del metodo, è necessario Definisci buona , e quindi definire la funzione di costo adeguato. Questo viene da sia la conoscenza di dominio (che cosa è i vostri dati, che cosa stai cercando di raggiungere), e la conoscenza degli strumenti a vostra disposizione.

Non credo che posso guidare l'utente attraverso le funzioni di costo già implementate in tensorflow, come ho molto poca conoscenza dello strumento, ma posso fare un esempio su come scrivere e valutare funzioni di costo diverse.


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

A partire da proprietà computazionali ; come due funzioni di misura la "stessa cosa" potrebbe portare a risultati diversi. Prendere la seguente, semplice funzione di costo; la percentuale di errore. Se si dispone di $ N $ campioni, $ f (y_n) $ è la classe prevista e $ y_n $ la vera classe, si vuole ridurre al minimo

  • $ \ frac {1} {N} \ sum_n \ left \ { \ Begin {array} {} ll 1 & \ text {if} f (x_n) \ Non = \\ y_n 0 & \ text {altrimenti} \\ \ End {array} \ right. = \ Sum_n y_n [1-F (x_n)] + [1-y_n] f (x_n) $ .

Questa funzione di costo ha il vantaggio di essere facilmente interpretabili. Tuttavia, non è uniforme; se avete solo due campioni, la funzione "salta" da 0, a 0,5, a 1. Questo porterà a incongruenze se si tenta di utilizzare la discesa del gradiente su questa funzione. Un modo per evitarlo è quello di cambiare la funzione di costo di utilizzo probabilità di assegnazione; $ p (y_n = 1 | x_n) $ . La funzione diventa

  • $ \ frac {1} {N} \ sum_n y_n p (y_n = 0 | x_n) + (1 - y_n) p (y_n = 1 | x_n) $ .

Questa funzione è più liscia, e funziona meglio con un approccio gradiente discesa. Si otterrà un modello 'più fine'. Tuttavia, ha altro problema; se si dispone di un campione che è ambiguo, diciamo che non si dispone di informazioni sufficienti per dire qualcosa di meglio di $ p (y_n = 1 | x_n) = 0,5 $ . Quindi, utilizzando la discesa gradiente su questa funzione di costo porterà ad un modello che aumenta questa probabilità il più possibile, e quindi, forse, sovradattamento.

Un altro problema di questa funzione è che se $ p (y_n = 1 | x_n) = 1 $ , mentre $ y_n = 0 $ , si è certi di avere ragione, ma vi sbagliate. Al fine di AVOid questo problema, si può prendere il registro della probabilità, $ \ log p (y_n | x_n) $ . Come $ \ log (0) = \ infty $ e $ \ log (1) = 0 $ , la seguente funzione non ha il problema descritto nel precedente paragrafo:

  • $ \ frac {1} {N} \ sum_n y_n \ log p (y_n = 0 | x_n) + (1 - y_n) \ log p (y_n = 1 | x_n ) $ .

Questo dovrebbe illustrare che, al fine di ottimizzare la stessa cosa , la percentuale di errore, diverse definizioni potrebbe produrre risultati diversi se sono più facili da dare un senso, computazionalmente.

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


Ora lascia vedere come i costi di diversa funzione può misurare concetti diversi. Nel contesto del recupero delle informazioni, come nella ricerca di Google (se ignoriamo ranking), vogliamo che i risultati restituiti a

  • avere alta di precisione , non restituisce informazioni irrilevanti
  • avere alta richiamo , quella di ritorno, i risultati tanto rilevanti come possibile
  • Precision e Recall (Wikipedia)

Si noti che se le vostre dichiarazioni algoritmo tutto , ritornerà ogni risultato rilevante possibile, e quindi hanno un alto richiamo, ma hanno molto scarsa precisione. D'altra parte, se si restituisce solo una elemento, quello che è il più certo è rilevante, avrà ad alta precisione, ma a basso richiamo.

Al fine di giudicare tali algoritmi, la funzione comune dei costi è la $ F $ -score (Wikipedia) . Il caso comune è il $ F_1 $ -score, che dà lo stesso peso a precisione e richiamo, ma il caso generale, il $ F_ \ beta $ -score, ed è possibile modificare $ \ beta $ per ottenere

  • richiamo superiore, se si utilizza $ \ beta> 1 $
  • Maggiore precisione, se si utilizza $ \ beta <1 $ .

In tale scenario, scegliendo la funzione di costo è la scelta di cosa trade-off il vostro algoritmo dovrebbe fare .

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

  • le persone più sane di essere classificati come malati (ma poi, potremmo trattare le persone in buona salute, che è costosa e potrebbe far loro del male se non sono in realtà malato)
  • le persone più malati di essere classificati come sano (ma poi, potrebbero morire senza trattamento)

In conclusione, la definizione della funzione di costo è la definizione l'obiettivo del vostro algoritmo. I definisce algoritmo come arrivarci.


Nota a margine: alcune funzioni di costo hanno bei modi algoritmo per raggiungere i loro obiettivi. Ad esempio, un bel modo per il minimo della href="https://en.wikipedia.org/wiki/Hinge_loss" rel="nofollow noreferrer"> Cerniera perdita esiste, risolvendo il duplice problema in SVM (Wikipedia)

Altri suggerimenti

Per rispondere alla tua domanda sulla Croce entropia, noterete che entrambi quello che hai menzionato sono la stessa cosa.

$ - \ frac {1} {n} \ somma (y \ _train * \ log (y \ _output) + (1 - y \ _train) \ cdot \ log (1 - y \ _output)) $

che lei ha citato è semplicemente la perdita di entropia croce binario in cui si assume che $ y \ _train $ è uno scalare 0/1 e che $ y \ _output $ è di nuovo uno scalare che indica la probabilità dell'uscita essere 1.

L'altra equazione citato è una variante più generica che si estende per più classi

-tf.reduce_sum(y_train * tf.log(y_output)) è la stessa cosa che scrivere

$ - \ sum_n treno \ _prob \ cdot \ log (out \ _prob) $

dove la somma è sopra le più classi e le probabilità sono per ogni classe. Chiaramente nel caso binario è la stessa cosa di ciò che è stato detto in precedenza. Il $ n $ termine è omesso in quanto non contribuisce in alcun modo alla minimizzazione perdita in quanto è una costante.

Bluf: iterativo per tentativi ed errori, con sottoinsieme di dati e matplotlib

.

Long Risposta:

La mia squadra era alle prese con questa stessa domanda non molto tempo fa. Tutte le risposte qui sono grandi, ma volevo condividere con voi la mia "risposta del principiante" per il contesto e come punto di partenza per le persone che sono nuovi per l'apprendimento automatico.

Si vuole puntare ad una funzione di costo che è liscia e convessa per la vostra specifica scelta di algoritmo e di set di dati. Ecco perché si vuole l'algoritmo sia in grado di fiducia e in modo efficiente regolare i pesi al fine di raggiungere il minimo globale di quella funzione di costo. Se la funzione di costo è "accidentato" con il massimo di locali e di min, e / o non ha alcun minimo globale, allora l'algoritmo potrebbe avere un momento difficile convergenti; suoi pesi potrebbe anche saltare tutto il luogo, in ultima analisi, non riuscendo a dare previsioni accurate e / o coerenti.

Ad esempio, se si sta utilizzando la regressione lineare per prevedere il peso di qualcuno (il numero reale, in libbre) in base alla loro altezza (numero reale, in pollici) e l'età (il numero reale, in anni), allora il costo errore quadratico medio funzione dovrebbe essere una bella, liscia, curva convessa. Il vostro algoritmo non avrà problemi convergenti.

Ma dici invece si utilizza un algoritmo di regressione logistica per un problema di classificazione binaria, come predire il sesso di una persona in base al fatto che la persona ha acquistato i pannolini negli ultimi 30 giorni e se la persona ha acquistato la birra negli ultimi 30 giorni. In questo caso, l'errore quadratico medio non potrebbe dare una superficie convessa liscia, che potrebbe essere un male per la formazione. E si potrebbe dire che con la sperimentazione.

Si potrebbe iniziare eseguendo una sperimentazione con l'utilizzo di MSE e un campione piccolo e semplice dei dati o con dati finti che si è generato per questo esperimento. Visualizzare ciò che sta succedendo con matplotlib (o qualsiasi altra cosa tramando soluzione si preferisce). È la curva di errore risultante liscia e convessa? Riprovare con una variabile ingresso aggiuntivo ... è la superficie risultante ancora liscia e convessa? Attraverso questo esperimento si potrebbe scoprire che mentre MSE non si adatta il vostro problema / soluzione, entropia croce ti dà una forma convessa liscio che si adatta meglio le vostre esigenze. Così si potrebbe provare che fuori con un set di dati campione più ampio e vedere se l'ipotesi detiene ancora. E se lo fa, allora si può provare con la vostra formazione set completo un paio di volte e vedere come si svolge e se garantisce sempre modelli simili. Se non lo fa, quindi scegliere un altro funzione di costo e ripetere il processo.

Questo tipo di altamente iterativo processo di tentativi ed errori ha lavorato molto bene per me e il mio team di scienziati di dati principiante, e ci permette di concentrarsi sulla ricerca di soluzioni alle nostre domande, senza dover per immergervi in ??teoria matematica dietro costo selezione della funzione e l'ottimizzazione del modello.

Naturalmente, un sacco di questa prova ed errore è già stato fatto da altre persone, così abbiamo anche sfruttare la conoscenza pubblica di aiutarci a filtrare le nostre scelte di quello che potrebbe essere buone funzioni di costo prime fasi del processo. Ad esempio, l'entropia croce è generalmente una buona scelta per problemi di classificazione, che si tratti di classificazione binaria con regressione logistica come nell'esempio sopra o una più complicata classificazione multi-etichetta con uno strato softmax come l'uscita. Mentre MSE è una buona scelta per i problemi di regressione lineare in cui si sta cercando una previsione scalare invece che la probabilità di appartenenza a una categoria conosciuta da una serie nota di possibili categorie, in questo caso, invece di uno strato SoftMax come output' d potrebbe semplicemente avere una somma pesata degli ingressi più polarizzazione senza una funzione di attivazione.

La speranza questa risposta aiuta altre principianti là fuori senza essere eccessivamente semplicistico e ovvia.

Declassamento tua domanda

Dove è la parte - - (y_output 1) nella maggior parte (1 y_train) * log esempi tensorflow? Non è forse manca?

La risposta è che la maggior parte delle funzioni di uscita sono softmax. Ciò significa che non hanno necessariamente bisogno di ridurre tutte le probabilità in casi errate in quanto saranno automaticamente ridotti quando si aumenta la probabilità di quella giusta

Ad 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 osservare che, anche se abbiamo appena aumentato terzo termine, tutti gli altri termini ridotti automaticamente

Autorizzato sotto: CC-BY-SA insieme a attribuzione
scroll top