Elegir entre diferentes funciones de costo y función de activación de una neural network

Recientemente comencé a jugar con redes neuronales. Estaba intentando implementar una puerta AND con Tensorflow. Tengo problemas para entender cuándo usar diferentes funciones de activación y costo. Esta es una neural network básica con solo capas de entrada y salida, sin capas ocultas.

Primero intenté implementarlo de esta manera. Como pueden ver, esta es una implementación deficiente, pero creo que hace el trabajo, al menos de alguna manera. Entonces, probé solo las salidas reales, ninguna salida real caliente. Para las funciones de activación, usé una función sigmoidea y para la función de costo usé la función de costo de error cuadrado (creo que se llama así, corrígeme si me equivoco).

He intentado usar ReLU y Softmax como funciones de activación (con la misma función de costo) y no funciona. Me di cuenta de por qué no funcionan. También probé la función sigmoide con la función de costo de entropía cruzada, tampoco funciona.

 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) 

después de 5000 iteraciones:

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

Pregunta 1 : ¿Existe alguna otra función de activación y función de costo que pueda funcionar (aprender) para la red anterior, sin cambiar los parámetros (es decir, sin cambiar W, x, b)?

Pregunta 2 – Leí de una publicación de StackOverflow aquí :

La selección de [Función de activación] depende del problema.

Entonces, ¿no hay funciones de costo que puedan usarse en cualquier lugar? Quiero decir que no hay una función de costo estándar que se pueda usar en cualquier neural network. ¿Derecha? Por favor corrígeme en esto.

También implementé la compuerta AND con un enfoque diferente, con la salida como verdaderas. Como puede ver train_Y [1,0] significa que el índice 0 es 1, por lo que la respuesta es 0. Espero que lo obtenga.

Aquí he utilizado una función de activación de softmax, con entropía cruzada como función de costo. La función sigmoidea como función de activación falla miserablemente.

 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) 

después de 5000 iteraciones

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

Pregunta 3 Entonces, en este caso, ¿qué función de costo y función de activación puedo usar? ¿Cómo entiendo qué tipo de funciones de costo y activación debo usar? ¿Hay una manera o regla estándar, o solo experiencia solamente? ¿Debo probar cada función de costo y activación de manera bruta? He encontrado una respuesta aquí . Pero espero una explicación más elaborada.

Pregunta 4 He notado que se necesitan muchas iteraciones para converger en una predicción casi precisa. Creo que la tasa de convergencia depende de la tasa de aprendizaje (usar demasiado grande perderá la solución) y la función de costo (corríjame si me equivoco). Entonces, ¿hay alguna forma óptima (es decir, la más rápida) o función de costo para converger a una solución correcta?

Responderé sus preguntas un poco fuera de orden, comenzando con respuestas más generales y terminando con aquellas específicas de su experimento en particular.

Funciones de activación Las diferentes funciones de activación, de hecho, tienen diferentes propiedades. Consideremos primero una función de activación entre dos capas de una neural network. El único propósito de una función de activación es servir como una no linealidad. Si no pone una función de activación entre dos capas, entonces dos capas juntas no servirán mejor que una, porque su efecto aún será solo una transformación lineal. Durante mucho tiempo, las personas utilizaron la función sigmoidea y el tanh, escogiendo de manera bastante arbitraria, siendo el sigmoide más popular, hasta hace poco, cuando ReLU se convirtió en la no dominancia dominante. La razón por la que las personas usan ReLU entre capas es porque no se satura (y también es más rápido de calcular). Piensa en la gráfica de una función sigmoidea. Si el valor absoluto de x es grande, entonces la derivada de la función sigmoide es pequeña, lo que significa que a medida que propagamos el error hacia atrás, el gradiente del error desaparecerá muy rápidamente a medida que retrocedemos a través de las capas. Con ReLU, la derivada es 1 para todas las entradas positivas, por lo que la unidad de activación no cambiará el gradiente de las neuronas que se activaron y no ralentizará el descenso del gradiente.

Para la última capa de la red, la unidad de activación también depende de la tarea. Para la regresión, querrá usar la activación sigmoide o tanh, porque quiere que el resultado esté entre 0 y 1. Para la clasificación, querrá que solo una de sus salidas sea una y todas las demás ceros, pero no hay una forma diferenciable de lograr precisamente eso, por lo que querrás usar un softmax para aproximarlo.

Tu ejemplo Ahora veamos tu ejemplo. Su primer ejemplo trata de calcular la salida de AND de la siguiente forma:

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

Tenga en cuenta que W1 y W2 siempre convergerán al mismo valor, porque la salida para ( x1 , x2 ) debe ser igual a la salida de ( x2 , x1 ). Por lo tanto, el modelo que está ajustando es:

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

x1 + x2 solo puede tomar uno de tres valores (0, 1 o 2) y desea devolver 0 para el caso cuando x1 + x2 < 2 y 1 para el caso cuando x1 + x2 = 2 . Dado que la función sigmoide es bastante suave, se necesitarán valores muy grandes de W y B para que la salida se acerque a la deseada, pero debido a una pequeña tasa de aprendizaje, no pueden llegar a esos valores grandes rápidamente. Aumentar la velocidad de aprendizaje en su primer ejemplo boostá la velocidad de convergencia.

Su segundo ejemplo converge mejor porque la función softmax es buena para hacer que exactamente una salida sea igual a 1 y todas las demás a 0 . Como este es precisamente tu caso, converge rápidamente. Tenga en cuenta que sigmoid también eventualmente convergerá a buenos valores, pero tomará significativamente más iteraciones (o una mayor tasa de aprendizaje).

Qué usar . Ahora hasta la última pregunta, ¿cómo se elige qué funciones de activación y costo usar? Estos consejos funcionarán para la mayoría de los casos:

  1. Si realiza la clasificación, use softmax para la no linealidad de la última capa y cross entropy como una función de costo.

  2. Si realiza una regresión, use sigmoid o tanh para la no linealidad de la última capa y el squared error como función de costo.

  3. Utilice ReLU como una falta de vitalidad entre las capas.

  4. Use mejores optimizadores ( AdamOptimizer , AdagradOptimizer ) en lugar de GradientDescentOptimizer , o use el impulso para una convergencia más rápida,