Optymalizator Adama z rozkładem wykładniczym

53

W większości kodów Tensorflow widziałem, że Adam Optimizer jest używany ze stałą szybkością uczenia się 1e-4(tj. 0,0001). Kod zwykle wygląda następująco:

...build the model...
# Add the optimizer
train_op = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
# Add the ops to initialize variables.  These will include 
# the optimizer slots added by AdamOptimizer().
init_op = tf.initialize_all_variables()

# launch the graph in a session
sess = tf.Session()
# Actually intialize the variables
sess.run(init_op)
# now train your model
for ...:
  sess.run(train_op)

Zastanawiam się, czy warto użyć rozkładu wykładniczego podczas korzystania z optymalizatora Adama, tj. Użyć następującego kodu:

...build the model...
# Add the optimizer
step = tf.Variable(0, trainable=False)
rate = tf.train.exponential_decay(0.15, step, 1, 0.9999)
optimizer = tf.train.AdamOptimizer(rate).minimize(cross_entropy, global_step=step)
# Add the ops to initialize variables.  These will include 
# the optimizer slots added by AdamOptimizer().
init_op = tf.initialize_all_variables()

# launch the graph in a session
sess = tf.Session()
# Actually intialize the variables
sess.run(init_op)
# now train your model
for ...:
  sess.run(train_op)

Zwykle ludzie używają pewnego rodzaju spadku szybkości uczenia się, dla Adama wydaje się to rzadkie. Czy ma to jakiś teoretyczny powód? Czy przydatne może być połączenie optymalizatora Adama z rozpadem?

MarvMind
źródło
Jak uzyskać zmienną kroku, którą należy aktualizować przy każdej iteracji?
perrohunter
@perrohunter: użyj global_stepparametru minimize. Zobacz edycję.
Charles Staats,
9
Uwaga: 1e-4= 0.0001nie 0.0004.
Cliff AB
Widzę, że przypisujesz „global_step = step”, ale nie widzę, jak zmienna „step” jest aktualizowana ... czy możesz to wyjaśnić, proszę?
Diego
@Diego: późna odpowiedź, ale: przekazanie zmiennej step w celu zminimalizowania, ponieważ jest to parametr global_step, powoduje, że funkcja minimalizacji zwiększa parametr global_step za każdym razem, gdy wywoływana jest minimalizacja. Zobacz dokumentację, aby zminimalizować. Należy pamiętać, że oznacza to, że podczas wykonywania mini-partii zmienna kroku jest aktualizowana dla każdej mini-partii, a nie tylko dla każdej epoki.
dimpol

Odpowiedzi:

37

Empirycznie: zdecydowanie wypróbuj to, możesz znaleźć bardzo przydatną heurystykę treningową, w takim przypadku proszę podziel się!

Zwykle ludzie używają jakiegoś rodzaju rozpadu, dla Adama wydaje się to rzadkie. Czy ma to jakiś teoretyczny powód? Czy przydatne może być połączenie optymalizatora Adama z rozpadem?

Nie widziałem wystarczającej liczby osób korzystających z optymalizatora ADAM, aby stwierdzić, czy to prawda, czy nie. Jeśli to prawda, być może dlatego, że ADAM jest stosunkowo nowy, a „najlepsze praktyki” dotyczące zaniku kursów nie zostały jeszcze ustalone.

Chciałbym jednak zauważyć, że spadek szybkości uczenia się jest w rzeczywistości częścią teoretycznej gwarancji dla ADAM. W szczególności w Twierdzeniu 4.1 w artykule ICLR jedną z ich hipotez jest to, że szybkość uczenia się ma rozkład pierwiastkowy, . Ponadto w swoich eksperymentach z regresją logistyczną wykorzystują również rozkład pierwiastkowy.αt=α/t

Mówiąc wprost: nie sądzę, aby cokolwiek w teorii zniechęciło do korzystania z reguł obniżania szybkości uczenia się w programie ADAM. Widziałem ludzi zgłaszających dobre wyniki za pomocą ADAM, a znalezienie dobrej heurystyki treningowej byłoby niezwykle cenne.

Indie AI
źródło
12

Powodem, dla którego większość ludzi nie stosuje spadku szybkości uczenia się w przypadku Adama, jest to, że sam algorytm powoduje spadek prędkości uczenia się w następujący sposób:

t <- t + 1
lr_t <- learning_rate * sqrt(1 - beta2^t) / (1 - beta1^t)

gdzie t0jest początkowym znacznikiem czasu i lr_tjest używana nowa szybkość uczenia się.

Almanzt
źródło
4
Nie jestem pewien, czy tak jest. Czynnik sqrt(1 - beta2^t) / (1 - beta1^t)nie ulega rozkładowi. Wydaje się, że rekompensuje to inicjalizację szacunków pierwszego i drugiego momentu.
Thijs,
25
Ta odpowiedź jest niepoprawna. Ten współczynnik zbliża się do 1,0, gdy t dochodzi do nieskończoności. Uwaga dodatkowa: tutaj parametr learning_rate został naprawiony . To nie jest szybkość uczenia się w czasie t-1.
rd11
8

Adam stosuje początkową szybkość uczenia się lub wielkość kroku zgodnie z terminologią oryginalnego dokumentu, jednocześnie dostosowując obliczenia aktualizacji. Rozmiar kroku daje również przybliżone ograniczenie dla aktualizacji. W związku z tym uważam, że dobrym pomysłem jest zmniejszenie wielkości kroku pod koniec szkolenia. Potwierdza to także ostatnia praca NIPS 2017: krańcowa wartość adaptacyjnych metod gradientowych w uczeniu maszynowym .

Ostatni wiersz w sekcji 4: Eksperymenty głębokiego uczenia się mówi

Chociaż konwencjonalna mądrość sugeruje, że Adam nie wymaga strojenia, okazuje się, że dostrojenie początkowej szybkości uczenia się i schematu zanikania dla Adama zapewnia znaczną poprawę w porównaniu do jego domyślnych ustawień we wszystkich przypadkach.

Wreszcie artykuł sugeruje, że i tak korzystamy z SGD.

Murat Seckin Ayhan
źródło
2

Zgadzam się z opinią @Indie AI, tutaj podaję kilka innych informacji:

Z CS231n :

... Wiele z tych metod może nadal wymagać innych ustawień hiperparametrów, ale argumentem jest to, że są one dobrze wychowane w przypadku szerszego zakresu wartości hiperparametrów niż surowa szybkość uczenia się. ...

A także z artykułu Przemyślenie architektury początkowej dla wizji komputerowej, sekcja 8:

... podczas gdy nasze najlepsze modele zostały osiągnięte przy użyciu RMSProp [21] z opóźnieniem 0,9 i ε = 1,0. Zastosowaliśmy współczynnik uczenia się 0,045, zanikający co dwie epoki, stosując współczynnik wykładniczy 0,94. ...

llj098
źródło
2

Przeszkoliłem zbiór danych z naprawdę łatwymi danymi, jeśli dana osoba jest uważana za grubą czy nie, wzrost i waga - tworzenie danych obliczających bmi, a jeśli ponad 27, osoba jest gruba. Tak bardzo proste podstawowe dane. Gdy używam Adama jako optymalizatora, a szybkość uczenia się wynosi 0,001, dokładność da mi tylko około 85% dla 5 epoków, osiągając maksimum 90% przy ponad 100 testowanych epokach.

Ale przy ponownym wczytywaniu na poziomie może 85% i przy współczynniku uczenia się 0,0001 dokładność powyżej 3 epoków wynosi 95%, a 10 kolejnych epoków to około 98-99%. Nie jestem pewien, czy szybkość uczenia się może spaść poniżej 4 cyfr 0,0001, ale przy ponownym ładowaniu modelu i korzystaniu z 0,00001, accucary zawiśnie około 99,20 - 100% i nie spadnie poniżej. Ponownie, nie jestem pewien, czy współczynnik uczenia się będzie uważany za 0, ale i tak to mam ...

Wszystko to przy użyciu categorical_crossentropy, ale mean_square sprawia, że ​​99-100% też robi tę metodę. AdaDelta, AdaGrad, Nesterov nie mogły uzyskać dokładności powyżej 65%, tylko dla notatki.

WoodyDRN
źródło
0

Spadek szybkości uczenia się w Adamie jest taki sam jak w RSMProp (jak widać z tej odpowiedzi ), i jest to w pewnym sensie oparte głównie na wielkości poprzednich gradientów, aby zrzucić oscylacje . Tak więc rozkład wykładniczy (dla malejącego wskaźnika uczenia się w trakcie procesu szkolenia) może być przyjęty w tym samym czasie. Wszystkie one obniżają współczynnik uczenia się, ale do różnych celów .

Lerner Zhang
źródło