Obecnie pracuję nad implementacją Stochastic Gradient Descent, SGD
dla sieci neuronowych wykorzystujących propagację wsteczną i choć rozumiem jej cel, mam kilka pytań na temat wyboru wartości szybkości uczenia się.
- Czy szybkość uczenia się jest związana z kształtem gradientu błędu, ponieważ dyktuje on tempo opadania?
- Jeśli tak, w jaki sposób wykorzystujesz te informacje, aby poinformować swoją decyzję o wartości?
- Jeśli nie, jakie wartości powinienem wybrać i jak je wybrać?
- Wygląda na to, że chciałbyś, aby małe wartości unikały przekroczenia, ale jak wybrać taką, aby nie utknąć w lokalnych minimach lub nie trzeba długo schodzić?
- Czy sensowne jest utrzymywanie stałej szybkości uczenia się, czy też powinienem zastosować jakieś dane, aby zmienić jego wartość, gdy zbliżam się do minimum w gradiencie?
W skrócie: Jak wybrać współczynnik uczenia się dla SGD?
źródło
Poniżej znajduje się bardzo dobra notatka (strona 12) na temat wskaźnika uczenia się w sieciach neuronowych (propagacja wsteczna) autorstwa Andrew Ng. Znajdziesz szczegółowe informacje na temat szybkości uczenia się.
http://web.stanford.edu/class/cs294a/sparseAutoencoder_2011new.pdf
Jeśli chodzi o czwarty punkt, masz rację, że zwykle trzeba wybrać „zrównoważoną” częstotliwość uczenia się, która nie powinna ani przekraczać, ani zbiegać się zbyt wolno. Można wykreślić tempo uczenia się względem spadku funkcji kosztu w celu zdiagnozowania / dostrojenia. W praktyce Andrew zwykle używa algorytmu L-BFGS (wspomnianego na stronie 12), aby uzyskać „wystarczająco dobrą” częstotliwość uczenia się.
źródło
Wybór szybkości uczenia się jest przykładem „meta-problemu” znanego jako optymalizacja hiperparametrów . Najlepszy wskaźnik uczenia się zależy od rodzaju problemu, a także od architektury optymalizowanego modelu, a nawet od stanu modelu w bieżącym procesie optymalizacji! Istnieją nawet pakiety oprogramowania do optymalizacji hiperparametrów, takie jak spearmint i hyperopt (tylko kilka przykładów, istnieje wiele innych!).
Oprócz optymalizacji hiperparametrów na pełną skalę, chciałem wspomnieć o jednej technice, która jest dość powszechna przy wybieraniu współczynników uczenia się, o której dotychczas nie wspomniano. Symulowane wyżarzanie jest techniką optymalizacji modelu, w której rozpoczyna się od dużej szybkości uczenia się i stopniowo zmniejsza szybkość uczenia się w miarę postępu optymalizacji. Zasadniczo optymalizujesz swój model z dużą szybkością uczenia się (0,1 lub więcej), a następnie stopniowo obniżasz tę szybkość, często o rząd wielkości (tak do 0,01, a następnie 0,001, 0,0001 itd.).
Można to połączyć z wczesnym zatrzymaniem, aby zoptymalizować model z jednym współczynnikiem uczenia się, o ile poczyniono postępy, a następnie przełącz się na mniejszy wskaźnik uczenia, gdy postęp wydaje się zwalniać. Wydaje się, że wyższe wskaźniki uczenia się pomagają modelowi zlokalizować regiony ogólnych optymów na dużą skalę, podczas gdy mniejsze wskaźniki pomagają modelowi skoncentrować się na jednym konkretnym lokalnym optymale.
źródło
Skopiowano z mojej pracy magisterskiej :
źródło
Tempo uczenia się, przekształcone jako „rozmiar kroku” podczas naszego procesu iteracji, było gorącym problemem od lat i będzie trwało.
Istnieją trzy opcje rozmiaru kroku w moim zakresie:
podczas gdy t pokazuje bieżący numer iteracji, alfa jest parametrem hiper
podczas gdy alfa i beta są hiperparametrami, g pokazuje gradient
lub
Mam nadzieję, że to ci pomoże, powodzenia-)
źródło
Sieci neuronowe są często trenowane przez gradientowe obniżanie ciężarów. Oznacza to, że przy każdej iteracji wykorzystujemy propagację wsteczną, aby obliczyć pochodną funkcji straty w odniesieniu do każdej masy i odjąć ją od tej masy. Jeśli jednak spróbujesz tego dokonać, wagi zmieniają się zdecydowanie za bardzo przy każdej iteracji, co powoduje, że stają się one „nadmiernie poprawne”, a strata faktycznie wzrasta / różni się. W praktyce ludzie zwykle mnożą każdą pochodną przez małą wartość zwaną „współczynnikiem uczenia się”, zanim odejmą ją od odpowiadającej jej wagi.
Możesz również myśleć o funkcji utraty sieci neuronowej jako o powierzchni, gdzie każdy kierunek, w którym możesz się poruszać, reprezentuje wartość ciężaru. Zejście gradientowe jest jak wykonywanie skoków w bieżącym kierunku zbocza, a tempo uczenia się jest podobne do długości wykonanego skoku.
źródło
Dodając do odpowiedzi Davida, w fastai znalazłem koncepcję znalezienia najlepszego współczynnika uczenia się dla tych danych, przy użyciu określonej architektury.
Ale ta rzecz istnieje tylko na fastai / pytorch. Ostatnio ktoś wykonał implementację keras .
które z kolei oparte są na tych dokumentach:
Mam nadzieję że to pomoże.
źródło
Pozwól, że przedstawię krótkie wprowadzenie do innego podejścia do wyboru współczynnika uczenia się, opartego na kursie głębokiego uczenia się Jeremy'ego Howarda 1. Jeśli chcesz głębiej kopać, zobacz ten blog .
Współczynnik uczenia się zaproponowany w kursie Jeremy'ego Howarda opiera się na systematycznym wypróbowywaniu różnych współczynników uczenia się i wybieraniu takiego, który powoduje, że funkcja utraty spada najbardziej. Odbywa się to poprzez karmienie wielu partii metodą malejącego gradientu mini-serii i zwiększenie szybkości uczenia się każdej nowej partii, którą podajesz do metody. Gdy tempo uczenia się jest bardzo małe, funkcja utraty będzie zmniejszać się bardzo powoli. Gdy współczynnik uczenia się jest bardzo duży, funkcja utraty wzrośnie. Pomiędzy tymi dwoma reżimami istnieje optymalna szybkość uczenia się, dla której funkcja utraty najszybciej maleje. Można to zobaczyć na poniższym rysunku:
Widzimy, że strata maleje bardzo szybko, gdy współczynnik uczenia się wynosi około . Stosując to podejście, mamy ogólny sposób na wybranie przybliżenia najlepszej stałej szybkości uczenia się dla naszej sieci.10−3
źródło