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