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-8
i batch_size = 32
.
neural-networks
deep-learning
adam
Abdul Fatir
źródło
źródło
Odpowiedzi:
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życiubatch_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:
źródło
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.
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.drop_last
. Mały rozmiar partii = duża wariancjaTeraz, 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).
źródło