Napisałem prosty MLP w TensorFlow, który modeluje bramę XOR .
Więc dla:
input_data = [[0., 0.], [0., 1.], [1., 0.], [1., 1.]]
powinien produkować:
output_data = [[0.], [1.], [1.], [0.]]
Sieć ma warstwę wejściową, warstwę ukrytą i warstwę wyjściową z 2, 5 i 1 neuronem.
Obecnie mam następującą entropię krzyżową:
cross_entropy = -(n_output * tf.log(output) + (1 - n_output) * tf.log(1 - output))
Wypróbowałem również tę prostszą alternatywę:
cross_entropy = tf.square(n_output - output)
wraz z kilkoma innymi próbami.
Jednak bez względu na to, jaka była moja konfiguracja, błąd z GradientDescentOptimizer
zmniejszał się znacznie wolniej niż AdamOptimizer
.
W rzeczywistości tf.train.AdamOptimizer(0.01)
przyniosły naprawdę dobre wyniki po 400–800 etapach uczenia się (w zależności od wskaźnika uczenia się, gdzie 0.01
osiągnęły najlepsze wyniki), a tf.train.GradientDescentOptimizer
zawsze wymagały ponad 2000 etapów uczenia się, bez względu na to, jakie obliczenia lub entropia zostały zastosowane.
Dlaczego tak jest? Wygląda na AdamOptimizer
to, że zawsze jest lepszym wyborem ?!