49 votos

¿Diferencia entre GradientDescentOptimizer y AdamOptimizer (TensorFlow)?

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?!

85voto

mrry Puntos 948

El tf.train.AdamOptimizer utiliza Kingma y Ba's Algoritmo Adam para controlar el ritmo de aprendizaje. Adam ofrece varias ventajas sobre el simple tf.train.GradientDescentOptimizer . Lo más importante es que utiliza medias móviles de los parámetros (impulso); Bengio analiza las razones por las que esto es beneficioso en la sección 3.1.1 de este documento . En pocas palabras, esto permite a Adam utilizar un tamaño de paso efectivo mayor, y el algoritmo convergerá a este tamaño de paso sin necesidad de un ajuste fino.

La principal desventaja del algoritmo es que Adam requiere que se realicen más cálculos para cada parámetro en cada paso de entrenamiento (para mantener los promedios móviles y la varianza, y calcular el gradiente escalado); y que se retenga más estado para cada parámetro (aproximadamente triplicando el tamaño del modelo para almacenar el promedio y la varianza de cada parámetro). Una simple tf.train.GradientDescentOptimizer podría utilizarse igualmente en su MLP, pero requeriría un mayor ajuste de los hiperparámetros antes de que convergiera tan rápidamente.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X