He escrito un sencillo MLP en TensorFlow que está modelando un XOR-Gate .
Así que para:
input_data = [[0., 0.], [0., 1.], [1., 0.], [1., 1.]]
debería producir lo siguiente:
output_data = [[0.], [1.], [1.], [0.]]
La red tiene una capa de entrada, una capa oculta y una capa de salida con 2, 5 y 1 neuronas cada una.
Actualmente tengo la siguiente entropía cruzada:
cross_entropy = -(n_output * tf.log(output) + (1 - n_output) * tf.log(1 - output))
También he probado esta alternativa más sencilla:
cross_entropy = tf.square(n_output - output)
junto con otros intentos.
Sin embargo, sea cual sea mi configuración, el error con un GradientDescentOptimizer
estaba disminuyendo mucho más lento que un AdamOptimizer
.
De hecho tf.train.AdamOptimizer(0.01)
produjo resultados realmente buenos después de 400-800 pasos de aprendizaje (en dependencia de la tasa de aprendizaje, donde 0.01
tuvo los mejores resultados) mientras que tf.train.GradientDescentOptimizer
siempre ha necesitado más de 2.000 pasos de aprendizaje, independientemente del cálculo de entropía cruzada o de la tasa de aprendizaje utilizada.
¿Por qué? Parece que el AdamOptimizer
¡es siempre una mejor opción?!