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 GradientDescentOptimizer
estava 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.01
obtiveram os melhores resultados), enquanto tf.train.GradientDescentOptimizer
sempre 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 ?!