una tutorial redes recurrente neuronales neuronal implementacion convolucionales convolucional python machine-learning neural-network svm tensorflow

python - tutorial - tensorflow



Elegir entre diferentes funciones de costo y funciĆ³n de activaciĆ³n de una red neuronal (1)

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 costo y activación. Esta es una red neuronal básica con solo capas de entrada y salida, sin capas ocultas.

Primero traté de implementarlo de esta manera. Como puede ver, esta es una implementación deficiente, pero creo que hace el trabajo, al menos de alguna manera. Por lo tanto, probé solo las salidas reales, no hay salidas verdaderas calientes. Para las funciones de activación, utilicé una función sigmoide y para la función de costo utilicé la función de costo de error al cuadrado (creo que se llama así, corrígeme si estoy equivocado).

Intenté usar ReLU y Softmax como funciones de activación (con la misma función de costo) y no funciona. Descubrí por qué no funcionan. También probé la función sigmoide con función de costo Cross Entropy, pero 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 here :

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

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


También implementé la puerta AND con un enfoque diferente, con el resultado como verdadero único. Como puede ver, el train_Y [1,0] significa que el 0 ° índice es 1, por lo que la respuesta es 0. Espero que lo obtenga.

Aquí he usado 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 costo y funciones de activación debo usar? ¿Hay una forma o regla estándar, o solo experiencia? ¿Debo intentar cada función de costo y activación de una manera de fuerza bruta? Encontré una respuesta here . Pero espero una explicación más elaborada.

Pregunta 4 He notado que se requieren muchas iteraciones para converger a una predicción casi precisa. Creo que la tasa de convergencia depende de la tasa de aprendizaje (utilizar demasiada información como para perder la solución) y la función de costo (corregirme si estoy equivocado). 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é a sus preguntas un poco fuera de orden, comenzando con respuestas más generales y terminando con las específicas de su experimento en particular.

Funciones de activación Diferentes funciones de activación, de hecho, tienen diferentes propiedades. Consideremos primero una función de activación entre dos capas de una red neuronal. El único propósito de una función de activación es servir como no lineal. 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 seguirá siendo solo una transformación lineal. Durante mucho tiempo, las personas usaban la función sigmoidea y el tanh, eligiendo de forma muy arbitraria, con sigmoide siendo más popular, hasta hace poco, cuando ReLU se convirtió en el noleniarity dominante. La razón por la que las personas usan ReLU entre capas es porque no satura (y también es más rápido de calcular). Piense en el gráfico de una función sigmoidea. Si el valor absoluto de x es grande, entonces la derivada de la función sigmoidea es pequeña, lo que significa que a medida que propaguemos el error hacia atrás, el gradiente del error desaparecerá rápidamente a medida que retrocedamos por 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 dispararon 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 uno y todos los demás sean ceros, pero no hay una manera diferenciable de lograrlo. precisamente eso, así que querrás usar un softmax para aproximarlo.

Tu ejemplo Ahora veamos tu ejemplo. Su primer ejemplo intenta calcular el resultado 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 de ( 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 sigmoidea es bastante suave, tomará valores muy grandes de W y B para hacer que la salida se acerque a la deseada, pero debido a una tasa de aprendizaje pequeña no pueden alcanzar rápidamente esos valores grandes. Aumentar la velocidad de aprendizaje en su primer ejemplo aumentará la velocidad de convergencia.

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

Qué usar Ahora, a 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 la regresión, use sigmoid o tanh para la no linealidad de la última capa y el squared error como una función de costo.

  3. Use ReLU como no lienealidad entre las capas.

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