Différence entre GradientDescentOptimizer et AdamOptimizer (TensorFlow)?

45

J'ai écrit un simple MLP dans TensorFlow qui modélise une porte XOR .

Donc pour:

input_data = [[0., 0.], [0., 1.], [1., 0.], [1., 1.]]

il devrait produire les éléments suivants:

output_data = [[0.], [1.], [1.], [0.]]

Le réseau comporte une couche d'entrée, une couche cachée et une couche de sortie de 2, 5 et 1 neurones chacune.

Actuellement, j'ai l'entropie croisée suivante:

cross_entropy = -(n_output * tf.log(output) + (1 - n_output) * tf.log(1 - output))

J'ai aussi essayé cette alternative plus simple:

cross_entropy = tf.square(n_output - output)

à côté d'autres essais.


Cependant, quelle que soit ma configuration, l’erreur avec GradientDescentOptimizera diminuait beaucoup plus lentement qu’un AdamOptimizer.

En fait tf.train.AdamOptimizer(0.01), on a 0.01obtenu de très bons résultats après 400 à 800 étapes d’apprentissage (en fonction du taux d’apprentissage, là où se trouvaient les meilleurs résultats), alors qu’il tf.train.GradientDescentOptimizerfallait toujours plus de 2 000 étapes d’apprentissage, quels que soient le calcul par entropie croisée ou le taux d’apprentissage utilisé.

Pourquoi cela est-il ainsi? Il semble que le AdamOptimizerest toujours un meilleur choix?!

daniel451
la source
2
L'optimiseur Adam est plus sophistiqué que la descente sur gradient (il est basé sur ce document ).
Marc Claesen

Réponses:

77

Le tf.train.AdamOptimizerutilise les algorithmes Adam de Kingma et Ba pour contrôler le taux d'apprentissage. Adam offre plusieurs avantages par rapport au simple tf.train.GradientDescentOptimizer. Le plus important est qu'il utilise des moyennes mobiles des paramètres (moment); Bengio explique les raisons pour lesquelles cela est avantageux dans la section 3.1.1 du présent document . En termes simples, cela permet à Adam d’utiliser une taille de pas effective plus grande, et l’algorithme convergera vers cette taille de pas sans réglage précis.

Le principal inconvénient de l’algorithme est qu’Adam demande que davantage de calculs soient effectués pour chaque paramètre à chaque étape de la formation (pour conserver les moyennes mobiles et la variance et calculer le gradient mis à l’échelle); et plus d'état à conserver pour chaque paramètre (en triplant approximativement la taille du modèle pour stocker la moyenne et la variance de chaque paramètre). Un simple tf.train.GradientDescentOptimizerpourrait également être utilisé dans votre MLP, mais il faudrait davantage de réglages hyperparamètres avant qu'il ne converge aussi rapidement.

mrry
la source
5
Merci pour cette réponse! Pourriez-vous ajouter ce que vous voulez dire exactement quand vous parlez de " réglage hyperparamètre "?
daniel451
12
Désolé pour le jargon! En gros, je voulais dire "faire varier l' learning_rateargument au tf.train.GradientDescentOptimizerconstructeur jusqu'à ce qu'il converge plus rapidement". :)
Mr