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 ?!
Odpowiedzi:
Do
tf.train.AdamOptimizer
zastosowania Kingma i BA Adam algorytm do kontrolowania szybkości uczenia się. Adam oferuje kilka zalet w stosunku do tego prostegotf.train.GradientDescentOptimizer
. Najważniejsze jest to, że wykorzystuje średnie ruchome parametrów (pędu); Bengio omawia powody, dla których jest to korzystne, w sekcji 3.1.1 tego dokumentu . Mówiąc prosto, pozwala to Adamowi na użycie większego efektywnego rozmiaru kroku, a algorytm zbiegnie się do tego rozmiaru kroku bez dostrajania.Główną wadą algorytmu jest to, że Adam wymaga więcej obliczeń dla każdego parametru na każdym etapie treningu (w celu utrzymania średnich ruchomych i wariancji oraz obliczenia skalowanego gradientu); i więcej stanu, który należy zachować dla każdego parametru (w przybliżeniu trzykrotnie większy rozmiar modelu, aby zapisać średnią i wariancję dla każdego parametru). Prosty
tf.train.GradientDescentOptimizer
może być również stosowany w MLP, ale wymagałby więcej strojenia hiperparametrów, zanim zbiegnie się tak szybko.źródło
learning_rate
argumentu w stosunku dotf.train.GradientDescentOptimizer
konstruktora, aż zbieżnie szybciej”. :)