Eu escrevi um MLP simples no TensorFlow que está modelando um XOR-Gate .
Então para:
input_data = [[0., 0.], [0., 1.], [1., 0.], [1., 1.]]
deve produzir o seguinte:
output_data = [[0.], [1.], [1.], [0.]]
A rede possui uma camada de entrada, uma camada oculta e uma camada de saída com 2, 5 e 1 neurônios cada.
Atualmente, tenho a seguinte entropia cruzada:
cross_entropy = -(n_output * tf.log(output) + (1 - n_output) * tf.log(1 - output))
Eu também tentei esta alternativa mais simples:
cross_entropy = tf.square(n_output - output)
juntamente com algumas outras tentativas.
No entanto, independentemente da minha configuração, o erro com a GradientDescentOptimizerestava diminuindo muito mais lentamente que com a AdamOptimizer.
De fato, tf.train.AdamOptimizer(0.01)produziu resultados realmente bons após 400-800 etapas de aprendizado (dependendo da taxa de aprendizado, onde 0.01obtiveram os melhores resultados), enquanto tf.train.GradientDescentOptimizersempre eram necessárias mais de 2000 etapas de aprendizado, independentemente do cálculo da entropia cruzada ou da taxa de aprendizado.
Porque isto é assim? Parece que AdamOptimizeré sempre uma escolha melhor ?!