2015-12-11 36 views
20

Recentemente ho iniziato a giocare con le reti neurali. Stavo cercando di implementare un cancello AND con Tensorflow. Ho difficoltà a capire quando utilizzare diverse funzioni di costo e attivazione. Questa è una rete neurale di base con solo livelli di input e output, senza livelli nascosti.Scelta dalla funzione di costo e funzione di attivazione di una rete neurale

Per prima cosa ho provato a implementarlo in questo modo. Come puoi vedere, questa è una pessima implementazione, ma penso che possa portare a termine il lavoro, almeno in qualche modo. Quindi, ho provato solo le uscite reali, nessuna uscita true hot. Per le funzioni di attivazione, ho usato una funzione sigmoid e per la funzione di costo ho usato la funzione di costo di errore al quadrato (penso che sia chiamato così, correggimi se sbaglio).

Ho provato a utilizzare ReLU e Softmax come funzioni di attivazione (con la stessa funzione di costo) e non funziona. Ho capito perché non funzionano. Ho anche provato la funzione sigmoid con la funzione di costo Cross Entropy, ma non funziona.

import tensorflow as tf 
import numpy 

train_X = numpy.asarray([[0,0],[0,1],[1,0],[1,1]]) 
train_Y = numpy.asarray([[0],[0],[0],[1]]) 

x = tf.placeholder("float",[None, 2]) 
y = tf.placeholder("float",[None, 1]) 

W = tf.Variable(tf.zeros([2, 1])) 
b = tf.Variable(tf.zeros([1, 1])) 

activation = tf.nn.sigmoid(tf.matmul(x, W)+b) 
cost = tf.reduce_sum(tf.square(activation - y))/4 
optimizer = tf.train.GradientDescentOptimizer(.1).minimize(cost) 

init = tf.initialize_all_variables() 

with tf.Session() as sess: 
    sess.run(init) 
    for i in range(5000): 
     train_data = sess.run(optimizer, feed_dict={x: train_X, y: train_Y}) 

    result = sess.run(activation, feed_dict={x:train_X}) 
    print(result) 

dopo 5000 iterazioni:

[[ 0.0031316 ] 
[ 0.12012422] 
[ 0.12012422] 
[ 0.85576665]] 

Domanda 1 - C'è qualche altra funzione di attivazione e funzione di costo, che può funzionare (imparare) per la rete di cui sopra, senza modificare i parametri (che significa senza cambiare W, x, b).

Domanda 2 - Ho letto da uno StackOverflow messaggio here:

[Attivazione Funzione] selezione dipende dal problema.

Quindi non ci sono funzioni di costo che possono essere utilizzate ovunque? Voglio dire che non esiste la funzione di costo standard che può essere utilizzata su qualsiasi rete neurale. Destra? Per favore correggimi su questo.


Ho anche implementato il cancello AND con un approccio differente, con l'uscita come un vero caldo. Come puoi vedere, lo train_Y[1,0] significa che lo 0 ° indice è 1, quindi la risposta è 0. Spero che tu la ottenga.

Qui ho utilizzato una funzione di attivazione softmax, con entropia incrociata come funzione di costo. La funzione sigmoide come funzione di attivazione fallisce miseramente.

import tensorflow as tf 
import numpy 

train_X = numpy.asarray([[0,0],[0,1],[1,0],[1,1]]) 
train_Y = numpy.asarray([[1,0],[1,0],[1,0],[0,1]]) 

x = tf.placeholder("float",[None, 2]) 
y = tf.placeholder("float",[None, 2]) 

W = tf.Variable(tf.zeros([2, 2])) 
b = tf.Variable(tf.zeros([2])) 

activation = tf.nn.softmax(tf.matmul(x, W)+b) 

cost = -tf.reduce_sum(y*tf.log(activation)) 

optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(cost) 

init = tf.initialize_all_variables() 

with tf.Session() as sess: 
    sess.run(init) 
    for i in range(5000): 
     train_data = sess.run(optimizer, feed_dict={x: train_X, y: train_Y}) 

    result = sess.run(activation, feed_dict={x:train_X}) 
    print(result) 

dopo 5000 iterazione

[[ 1.00000000e+00 1.41971401e-09] 
[ 9.98996437e-01 1.00352429e-03] 
[ 9.98996437e-01 1.00352429e-03] 
[ 1.40495342e-03 9.98595059e-01]] 

Domanda 3 Quindi, in questo caso ciò che funzione di costo e la funzione di attivazione posso usare? Come posso capire che tipo di costo e funzioni di attivazione dovrei usare? Esiste un modo o una norma standard o solo l'esperienza? Dovrei provare ogni costo e la funzione di attivazione in modo bruto? Ho trovato una risposta here. Ma spero in una spiegazione più elaborata.

Domanda 4 Ho notato che ci vogliono molte iterazioni per convergere in una previsione quasi accurata.Penso che il tasso di convergenza dipenda dal tasso di apprendimento (usando troppo grande mancherà la soluzione) e dalla funzione di costo (correggimi se sbaglio). Quindi, esiste una soluzione ottimale (ovvero la più veloce) o una funzione di costo per la convergenza verso una soluzione corretta?

risposta

30

Risponderò alle tue domande un po 'fuori servizio, iniziando con risposte più generali e finendo con quelle specifiche del tuo particolare esperimento.

Funzioni di attivazione Diverse funzioni di attivazione, infatti, hanno proprietà diverse. Consideriamo innanzitutto una funzione di attivazione tra due strati di una rete neurale. L'unico scopo di una funzione di attivazione è di servire come non linearità. Se non si inserisce una funzione di attivazione tra due livelli, due livelli non serviranno meglio di uno, poiché il loro effetto sarà comunque solo una trasformazione lineare. Per molto tempo le persone stavano usando la funzione sigmoide e tanh, scegliendo in modo abbastanza arbitrario, con sigmoid essendo più popolare, fino a poco tempo fa, quando ReLU divenne il non-principio dominante. Il motivo per cui le persone usano ReLU tra i livelli è perché non è saturo (ed è anche più veloce da calcolare). Pensa al grafico di una funzione sigmoide. Se il valore assoluto di x è grande, la derivata della funzione sigmoide è piccola, il che significa che mentre propagiamo l'errore all'indietro, il gradiente dell'errore svanirà molto rapidamente mentre torniamo indietro tra i livelli. Con ReLU la derivata è 1 per tutti gli input positivi, quindi il gradiente per quei neuroni che sparano non verrà modificato dall'unità di attivazione e non rallenterà la discesa del gradiente.

Per l'ultimo livello della rete, l'unità di attivazione dipende anche dall'attività. Per la regressione vorrete usare l'attivazione sigmoid o tanh, perché volete che il risultato sia tra 0 e 1. Per la classificazione, vorrete che solo uno dei vostri output sia uno e tutti gli altri zero, ma non esiste un modo differenziabile per raggiungere proprio così, quindi vorrete usare un softmax per approssimarlo.

Il tuo esempio. Ora diamo un'occhiata al tuo esempio. Tuo primo esempio tenta di calcolare l'uscita di AND in una forma seguente:

sigmoid(W1 * x1 + W2 * x2 + B) 

noti che W1 e W2 sarà sempre convergono allo stesso valore, poiché l'uscita di (x1, x2) dovrebbe essere pari alla produzione di (x2, x1). Pertanto, il modello che si sta apparecchio è:

sigmoid(W * (x1 + x2) + B) 

x1 + x2 può assumere solo uno di tre valori (0, 1 o 2) e si desidera tornare 0 per il caso in cui x1 + x2 < 2 e 1 per il caso in cui x1 + x2 = 2 . Dato che la funzione sigmoid è piuttosto regolare, i valori molto elevati di W e B assumeranno un valore molto elevato per rendere l'output simile a quello desiderato, ma a causa di un piccolo tasso di apprendimento non possono raggiungere rapidamente quei valori elevati. Aumentare il tasso di apprendimento nel primo esempio aumenterà la velocità di convergenza.

Il secondo esempio converge meglio perché la funzione softmax è in grado di eseguire esattamente un'uscita uguale a 1 e tutte le altre a 0. Poiché questo è esattamente il tuo caso, converge rapidamente. Si noti che anche lo sigmoid convergerebbe in buoni valori, ma occorreranno molte più iterazioni (o un più alto tasso di apprendimento).

Che cosa usare.Ora fino all'ultima domanda, come si sceglie quale attivazione e quali funzioni di costo utilizzare. Questi consigli lavorerà per maggior parte dei casi:

  1. Se lo fai classificazione, utilizzare softmax per non linearità dell'ultimo livello e cross entropy come una funzione di costo.

  2. Se lo fai di regressione, utilizzare sigmoid o tanh per non linearità dell'ultimo livello e squared error come una funzione di costo.

  3. Utilizzare ReLU come non-assenza tra livelli.

  4. Utilizzare ottimizzatori migliori (AdamOptimizer, AdagradOptimizer) anziché GradientDescentOptimizer, o utilizzare slancio per la convergenza veloce,