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 GradientDescentOptimizerzmniejszał 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.01osiągnęły najlepsze wyniki), a tf.train.GradientDescentOptimizerzawsze 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 AdamOptimizerto, że zawsze jest lepszym wyborem ?!