Wyjaśnienie skoków w utracie treningu vs. iteracje z Adamem Optimizerem

16

Uczę sieci neuronowej przy użyciu i) SGD i ii) Adam Optimizer. Korzystając z normalnego SGD, uzyskuję płynną krzywą utraty treningu w porównaniu z krzywą iteracji, jak pokazano poniżej (czerwona). Kiedy jednak użyłem Optymalizatora Adama, krzywa utraty treningu ma pewne skoki. Jakie jest wyjaśnienie tych skoków?

Szczegóły modelu:

14 węzłów wejściowych -> 2 ukryte warstwy (100 -> 40 jednostek) -> 4 jednostki wyjściowe

Używam domyślnych parametrów dla Adama beta_1 = 0.9, beta_2 = 0.999, epsilon = 1e-8i batch_size = 32.

i) Z SGD ii) Z AdamemZ SGD Z Adamem

Abdul Fatir
źródło
Na przyszłość, obniżenie początkowego poziomu uczenia się może pomóc w wyeliminowaniu skoków w Adamie
odważny

Odpowiedzi:

12

Skoki są nieuniknioną konsekwencją zejścia w gradiencie mini-partii w Adamie (batch_size=32 ). Niektóre mini-partie mają „przypadkowe” pechowe dane do optymalizacji, powodując wzrosty widoczne w funkcji kosztów za pomocą Adama. Jeśli spróbujesz stochastycznego zejścia gradientu (tak samo jak przy użyciu batch_size=1), zobaczysz, że w funkcji kosztu jest jeszcze więcej skoków. To samo nie dzieje się w (Pełnej) partii GD, ponieważ wykorzystuje ona wszystkie dane treningowe (tzn. Wielkość partii jest równa liczności zbioru treningowego) w każdej epoce optymalizacji. Ponieważ na twojej pierwszej grafice koszt monotonicznie spada płynnie, wydaje się, że tytuł ( i) z SGD ) jest zły i używasz (Pełnego) Batch Gradient Descent zamiast SGD.

Na swoim wspaniałym kursie głębokiego uczenia się w Coursera Andrew Ng szczegółowo wyjaśnia to, korzystając z poniższego obrazu:

Funkcje kosztów

xboard
źródło
2
„SGD ... wykorzystuje wszystkie dane treningowe” - czy jesteś tego pewien? Oznacza to, że wagi są aktualizowane po przekazaniu wszystkich danych, ale nazywa się to gd pełnej partii, a nie sd. Stochastic oznacza minibatch
Alex
Dziękuję @Alex za wskazanie mojego błędu, już go naprawiłem i poprawiłem odpowiedź w odniesieniu do dalszych informacji.
xboard
@xboard - Nie, używam zejścia gradientu mini-partii dla pierwszego.
Abdul Fatir,
8

Spędziłem niesamowitą ilość czasu debugując eksplodujące gradienty i podobne zachowania. Twoja odpowiedź będzie zależeć od funkcji utraty, danych, architektury itp. Istnieją setki powodów. Wymienię kilka.

  • Zależny od strat. Straty wiarygodności logicznej muszą zostać obcięte, jeśli nie, mogą oszacować wartość bliską pod log(0)kątem złych prognoz / wartości odstających w zbiorze danych, powodując eksplozję gradientów. Większość pakietów (latarka, tensorflow itp.) Domyślnie stosuje obcinanie ze względu na swoje straty.
  • Wartości odstające w zbiorze danych.
  • ϵy=(x-u)/(s+ϵ)sϵy
  • Końcowa partia w epoce może być mała, jeśli zestaw danych jest niepodzielny według wielkości partii. W programie ładującym pochodnie znajduje się flaga drop_last. Mały rozmiar partii = duża wariancja

Teraz, dlaczego widzisz to z Adamem, a nie z SGD? Najwyraźniej osiągnąłeś niższą stratę z Adamem. Jak zauważono wcześniej, jeśli 99,9% zestawu danych ma w jednym punkcie optymalne wartości, z wyjątkiem niektórych obserwacji, może to być obserwacja krzycząca „NIE” i wyskakująca z lokalnych minimów, gdy losowo wybierana jest do partii. Jeśli widzisz to co dataset_size//batch_size+1-stopień, prawdopodobnie wynika to z małej końcowej wielkości partii. Założę się, że zobaczysz również skok SGD, jeśli pozwolisz mu osiągnąć niższą stratę.

Premia: Twój naprawdę szybki spadek dzięki optymalizacji pędu (Adam) może oznaczać, że pewna warstwa (warstwa wejściowa? Warstwa wyjściowa?) Jest inicjalizowana znacznie poza skalą (do dużych / małych ciężarów).

ragulpr
źródło