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?