Jak można debugować i łagodzić błędy optymalizacji?
Podsumowanie: jeśli w modelu występują problemy z optymalizacją, ważne jest, aby je naprawić, zanim spróbujesz wykonać inne działania. Diagnozowanie i korygowanie niepowodzeń podczas trenowania to aktywny obszar badań.
Na Rysunku 4 trzeba pamiętać o tych kwestiach:
- Zmiana liczby kroków nie obniża wydajności przy niskim tempie uczenia się.
- Wysokie tempo uczenia się nie jest już dobrze trenowane z powodu niestabilności.
- Zastosowanie 1000 kroków funkcji rozgrzewki dla tempa uczenia się eliminuje ten konkretny przypadek niestabilności, umożliwiając stabilną trenowanie z maksymalną szybkością uczenia się wynoszącą 0,1.
Identyfikowanie niestabilnych zadań
Wszelkie zadania stają się niestabilne, jeśli tempo uczenia się jest zbyt duże. Niestabilność występuje tylko wtedy, gdy zmusza do użycia zbyt małego tempa uczenia się. Warto wymienić co najmniej 2 typy niestabilności trenowania:
- Niestabilność przy inicjowaniu lub na wczesnym etapie trenowania.
- Nagłe niestabilność w trakcie trenowania.
Możesz systematycznie wykrywać problemy ze stabilnością zadań. W tym celu:
- Tempo uczenia się i znajdź najlepsze tempo uczenia się lr*
- Narysuj krzywe straty treningowej dla tempa uczenia się nieco powyżej lr*.
- Jeśli tempo uczenia się > lr* wykazuje niestabilność straty (strata nie rośnie w trakcie treningu), korekta niestabilności zazwyczaj poprawia trenowanie.
Zapisz normę L2 pełnego gradientu utraty podczas trenowania, ponieważ wartości odstające mogą powodować niestabilność w trakcie trenowania. To może być informacja o tym, jak agresywnie mamy przycinać gradienty lub zmiany wagi.
UWAGA: niektóre modele wykazują bardzo wczesną niestabilność, po której następuje regeneracja, która kończy się powolnym, ale stabilnym trenowaniem. W przypadku rzadkich ocen w przypadku typowych harmonogramów oceny te problemy mogą zostać pominięte.
Aby to sprawdzić, możesz wytrenować skrócony bieg z zaledwie ok. 500 kroków z użyciem funkcji lr = 2 * current best
, ale ocenić każdy krok.
Możliwe sposoby wyeliminowania częstych wzorców niestabilności
Oto możliwe rozwiązania typowych wzorców niestabilności:
- Zastosuj rozgrzewkę dla tempa uczenia się. Najlepiej sprawdza się to w przypadku niestabilności na wczesnym etapie trenowania.
- Zastosuj przycinanie gradientu. Jest to przydatne w przypadku niestabilności zarówno na początku, jak i w trakcie trenowania oraz może rozwiązać problemy z niewłaściwymi inicjacjami, których nie można przeprowadzić podczas „rozgrzewki”.
- Wypróbuj nowy optymalizator. Czasem Adam radzi sobie z niestabilnością, której nie daje Momentum. To aktywny obszar badań.
- Upewnij się, że korzystasz ze sprawdzonych metod i sprawdzonych metod inicjowania architektury modelu (poniżej znajdziesz przykłady). Dodaj pozostałe połączenia i normalizację, jeśli model jeszcze ich nie zawiera.
- Normalizuj jako ostatnią operację przed wartością resztową. Na przykład:
x + Norm(f(x))
. Pamiętaj, że plikNorm(x + f(x))
może powodować problemy. - Spróbuj zainicjować gałęzie resztkowe na 0. Zapoznaj się z sekcją ReZero is All You Need: Fast Convergence at Large
- Zmniejszenie tempa uczenia się. To ostateczna decyzja.
Tempo uczenia się – rozgrzewka
Kiedy stosować rozgrzewkę dla tempa uczenia się
Rysunek 7a przedstawia wykres osi hiperparametrów, który wskazuje, że model wykazuje niestabilność optymalizacyjną, ponieważ najlepsze tempo uczenia się znajduje się na skraju niestabilności.
Rysunek 7b pokazuje, jak można to sprawdzić, analizując utratę treningową modelu wytrenowanego z tempem uczenia się 5- lub 10-krotnie większym od tego szczytu. Jeśli ten wykres przedstawia nagły wzrost straty po stałym spadku (np. przy kroku ok. 10 tys. na ilustracji powyżej), model prawdopodobnie cierpi na niestabilność optymalizacji.
Jak zastosować rozgrzewkę dla tempa uczenia się
W ramach poprzedniej procedury niech unstable_base_learning_rate
będzie wskazywać tempo uczenia się, w którym model staje się niestabilny.
Przygotowanie obejmuje dodanie harmonogramu tempa uczenia się, które zwiększa tempo uczenia się z 0 do pewnej stabilnej wartości base_learning_rate
o co najmniej 1 rzędzie wielkości większej niż unstable_base_learning_rate
.
Domyślnie spróbujesz użyć base_learning_rate
o wartości 10x unstable_base_learning_rate
. Pamiętaj jednak, że można wykonać całą procedurę jeszcze raz dla około 100x unstable_base_learning_rate
. Konkretny harmonogram:
- Zwiększenie z 0 do base_learning_rate w stosunku do metody „cieple_steps”.
- Trenuj w stałych tempach po_warmup_steps.
Twoim celem jest znalezienie jak najkrótszej wartości w kolumnie warmup_steps
, która zapewni Ci dostęp do szczytowych wskaźników uczenia się, które są znacznie wyższe niż unstable_base_learning_rate
.
Dlatego w przypadku każdego elementu base_learning_rate
musisz dostroić elementy warmup_steps
i post_warmup_steps
. Zazwyczaj możesz ustawić post_warmup_steps
na 2*warmup_steps
.
Rozgrzewkę można dostroić niezależnie od istniejącego harmonogramu osłabiania. warmup_steps
Powinno się przesuwać z kilkoma różnymi rzędami intensywności. W przykładowym badaniu można użyć na przykład pola [10, 1000, 10,000, 100,000]
. Największy możliwy punkt nie powinien przekraczać 10% wartości max_train_steps
.
Gdy zostanie wyznaczony warmup_steps
, który nie spowalnia trenowania w base_learning_rate
, należy go zastosować do modelu bazowego.
Zasadniczo dołącz ten harmonogram do istniejącego harmonogramu i użyj omówionego powyżej optymalnego punktu kontrolnego, aby porównać ten eksperyment z wartością bazową. Jeśli na przykład początkowo mieliśmy 10 000 max_train_steps
, a warmup_steps
dla 1000 kroków, nowa procedura trenowania powinna obejmować łącznie 11 tys. kroków.
Jeśli do stabilnego trenowania wymagane są długie elementy warmup_steps
(>5% z max_train_steps
), może to być konieczne zwiększenie wartości max_train_steps
.
Nie ma żadnej „typowej” wartości w przypadku pełnego zakresu zadań. Niektóre modele potrzebują tylko 100 kroków, a inne (zwłaszcza transformatorów) mogą potrzebować ponad 40 tys. kroków.
Przycinanie gradientu
Przycinanie gradientu jest najbardziej przydatne w przypadku problemów z dużymi lub nietypowymi gradientami. Przycinanie gradientu może rozwiązać jeden z tych problemów:
- Niestabilność wczesnego trenowania (na wczesnym etapie normy dla dużego gradientu)
- Niestabilność w trakcie trenowania (nagłe skoki gradientu w trakcie trenowania).
Czasami dłuższe okresy „rozgrzewki” mogą korygować niestabilność, której nie obejmuje przycinanie. Szczegóły znajdziesz w sekcji Rozgrzewka z tempem uczenia się.
🤖 A co z robieniem klipów na rozgrzewce?
Idealne progi klipu są tuż powyżej „typowej” normy gradientu.
Oto przykład, jak można przyciąć gradient:
- Jeśli norma gradientu $\left | g \right |$ jest większa niż próg przycinania gradientu $\lambda$, wpisz ${g}'= \lambda \times \frac{g}{\left | g \right |}$ gdzie ${g}'$ to nowy gradient.
Zapisuj podczas trenowania nieprzyciętą normę gradientu. Domyślnie wygeneruj:
- Wykres normy gradientu a krok
- Histogram z normami gradientu zagregowany we wszystkich krokach
Wybierz próg przycinania gradientu na podstawie 90 centyla norm gradientu. Próg zależy od obciążenia, ale 90% to dobry punkt wyjścia. Jeśli 90% nie zadziała, możesz dostosować ten próg.
🤖 A co z jakimś strategią adaptacyjną?
Jeśli skorzystasz z przycinania z gradientem i pozostają przy tym problemy z niestabilnością, możesz spróbować go trudniej zrobić, czyli zmniejszyć próg.
Niezwykle agresywne przycinanie gradientu (czyli ponad 50% aktualizacji) jest zasadniczo dziwnym sposobem zmniejszenia tempa uczenia się. Jeśli okaże się, że używasz bardzo agresywnego przycinania, prawdopodobnie lepiej ograniczyć tempo uczenia się.
Dlaczego nazywacie hiperparametrami tempo uczenia się i inne parametry optymalizacji? Nie są one parametrami dla jakiejkolwiek wcześniejszej dystrybucji.
Termin „hiperparametr” ma dokładne znaczenie w beaesowskich systemach uczących się, dlatego odniesienie do tempa uczenia się i większości innych możliwych do dostosowania parametrów deep learning jako „hiperparametrów” może być naruszeniem terminologii. wolelibyśmy używać terminu „metaparametr” w przypadku tempa uczenia się, parametrów architektonicznych i innych możliwych do rozwiązania funkcji deep learning. Wynika to z faktu, że metaparametr eliminuje ryzyko pomyłek wynikających z nieprawidłowego użycia słowa „hiperparametr”. To niejasność jest szczególnie prawdopodobna w przypadku optymalizacji Bayesa, gdzie prawdopodobne modele powierzchni odpowiedzi mają własne hiperparametry.
Choć może być mylące, termin „hiperparametr” stał się niezwykle powszechny w społeczności rozwiązań deep learning. Dlatego w przypadku tego dokumentu, przeznaczonego dla szerokiego grona odbiorców, w tym osób, które prawdopodobnie nie zdają sobie sprawy z tej technicznej technologii, zdecydowaliśmy się przyczynić do rozwiązania jednego ze źródeł nieporozumień. Mieliśmy nadzieję, że uda nam się uniknąć kolejnego. W związku z tym możemy dokonać innego wyboru podczas publikowania publikacji naukowej i zalecamy używanie „metaparametru” zamiast „metaparameter” w większości kontekstów.
Dlaczego nie należy dostosować rozmiaru wsadu w celu bezpośredniego zwiększenia wydajności zestawu walidacji?
Zmiana rozmiaru wsadu bez zmiany innych szczegółów potoku trenowania często wpływa na wydajność zestawu walidacji. Jednak różnica w wydajności zestawu walidacji między 2 rozmiarami wsadu zwykle znika, jeśli potok trenowania jest niezależnie zoptymalizowany pod kątem każdego rozmiaru wsadu.
Hiperparametry najsilniej wpływają na wielkość wsadu, dlatego najważniejsze, aby je dostrajać osobno do każdego rozmiaru wsadu, to hiperparametry optymalizatora (np. szybkość uczenia się, pęd) i hiperparametry regularyzacji. Mniejsze wsady wprowadzają więcej szumu do algorytmu trenowania z powodu wariancji próby. Taki szum może wywołać efekt regularyzacji. W związku z tym większe partie mogą być podatne na nadmierne dopasowanie i wymagać silniejszej regularyzacji lub dodatkowych technik regularyzacji. Poza tym przy zmianie rozmiaru grupy może być konieczne dostosowanie liczby kroków trenowania.
Po wzięciu pod uwagę wszystkich tych efektów nie ma przekonujących dowodów na to, że rozmiar wsadu wpływa na maksymalną możliwą do uzyskania wydajność weryfikacji. Więcej informacji znajdziesz w Shallue i in., 2018.
Jakie są reguły aktualizacji dla wszystkich popularnych algorytmów optymalizacji?
W tej sekcji znajdziesz reguły aktualizowania kilku popularnych algorytmów optymalizacji.
Spadek gradientu stochastycznego (SGD)
\[\theta_{t+1} = \theta_{t} - \eta_t \nabla \mathcal{l}(\theta_t)\]
Gdzie $\eta_t$ to tempo uczenia się w kroku $t$.
Wykorzystanie chwili
\[v_0 = 0\]
\[v_{t+1} = \gamma v_{t} + \nabla \mathcal{l}(\theta_t)\]
\[\theta_{t+1} = \theta_{t} - \eta_t v_{t+1}\]
Gdzie $\eta_t$ to tempo uczenia się w kroku $t$, a $\gamma$ to współczynnik pędu.
Nieserow
\[v_0 = 0\]
\[v_{t+1} = \gamma v_{t} + \nabla \mathcal{l}(\theta_t)\]
\[\theta_{t+1} = \theta_{t} - \eta_t ( \gamma v_{t+1} + \nabla \mathcal{l}(\theta_{t}) )\]
Gdzie $\eta_t$ to tempo uczenia się w kroku $t$, a $\gamma$ to współczynnik pędu.
RMSProp
\[v_0 = 1 \text{, } m_0 = 0\]
\[v_{t+1} = \rho v_{t} + (1 - \rho) \nabla \mathcal{l}(\theta_t)^2\]
\[m_{t+1} = \gamma m_{t} + \frac{\eta_t}{\sqrt{v_{t+1} + \epsilon}}\nabla \mathcal{l}(\theta_t)\]
\[\theta_{t+1} = \theta_{t} - m_{t+1}\]
ADAM
\[m_0 = 0 \text{, } v_0 = 0\]
\[m_{t+1} = \beta_1 m_{t} + (1 - \beta_1) \nabla \mathcal{l} (\theta_t)\]
\[v_{t+1} = \beta_2 v_{t} + (1 - \beta_2) \nabla \mathcal{l}(\theta_t)^2\]
\[b_{t+1} = \frac{\sqrt{1 - \beta_2^{t+1}}}{1 - \beta_1^{t+1}}\]
\[\theta_{t+1} = \theta_{t} - \alpha_t \frac{m_{t+1}}{\sqrt{v_{t+1}} + \epsilon} b_{t+1}\]
NADAM
\[m_0 = 0 \text{, } v_0 = 0\]
\[m_{t+1} = \beta_1 m_{t} + (1 - \beta_1) \nabla \mathcal{l} (\theta_t)\]
\[v_{t+1} = \beta_2 v_{t} + (1 - \beta_2) \nabla \mathcal{l} (\theta_t)^2\]
\[b_{t+1} = \frac{\sqrt{1 - \beta_2^{t+1}}}{1 - \beta_1^{t+1}}\]
\[\theta_{t+1} = \theta_{t} - \alpha_t \frac{\beta_1 m_{t+1} + (1 - \beta_1) \nabla \mathcal{l} (\theta_t)}{\sqrt{v_{t+1}} + \epsilon} b_{t+1}\]