Różnica między GradientDescentOptimizer a AdamOptimizer (TensorFlow)?

45

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 ?!

daniel451
źródło
2
Optymalizator Adama jest bardziej wyrafinowany niż spadek gradientu (jest oparty na tym dokumencie ).
Marc Claesen,

Odpowiedzi:

77

Do tf.train.AdamOptimizerzastosowania Kingma i BA Adam algorytm do kontrolowania szybkości uczenia się. Adam oferuje kilka zalet w stosunku do tego prostego tf.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.GradientDescentOptimizermoże być również stosowany w MLP, ale wymagałby więcej strojenia hiperparametrów, zanim zbiegnie się tak szybko.

mrry
źródło
5
Dzięki za tę odpowiedź! Czy możesz dodać, co dokładnie masz na myśli, mówiąc o „ strojeniu hiperparametrów ”?
daniel451,
12
Przepraszam za żargon! Mówiąc w przybliżeniu, miałem na myśli „zmienianie learning_rateargumentu w stosunku do tf.train.GradientDescentOptimizerkonstruktora, aż zbieżnie szybciej”. :)
mrry