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 GradientDescentOptimizer
a diminuait beaucoup plus lentement qu’un AdamOptimizer
.
En fait tf.train.AdamOptimizer(0.01)
, on a 0.01
obtenu 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.GradientDescentOptimizer
fallait 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 AdamOptimizer
est toujours un meilleur choix?!
Réponses:
Le
tf.train.AdamOptimizer
utilise les algorithmes Adam de Kingma et Ba pour contrôler le taux d'apprentissage. Adam offre plusieurs avantages par rapport au simpletf.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.GradientDescentOptimizer
pourrait également être utilisé dans votre MLP, mais il faudrait davantage de réglages hyperparamètres avant qu'il ne converge aussi rapidement.la source
learning_rate
argument autf.train.GradientDescentOptimizer
constructeur jusqu'à ce qu'il converge plus rapidement". :)