Wybór współczynnika uczenia się

85

Obecnie pracuję nad implementacją Stochastic Gradient Descent, SGDdla 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?

wściekły szlam
źródło

Odpowiedzi:

69
  • Czy szybkość uczenia się jest związana z kształtem gradientu błędu, ponieważ dyktuje on tempo opadania?

    • W zwykłym SGD odpowiedź brzmi „nie”. Stosowana jest globalna szybkość uczenia się, która jest obojętna na gradient błędu. Jednak intuicja, do której dochodzisz, zainspirowała różne modyfikacje reguły aktualizacji SGD.
  • Jeśli tak, w jaki sposób wykorzystujesz te informacje, aby poinformować swoją decyzję o wartości?

    • Adagrad jest najbardziej znanym z nich i skaluje globalną szybkość uczenia się η dla każdego wymiaru w oparciu o normę l2 historii gradientu błędu gt dla każdego wymiaru:

      wprowadź opis zdjęcia tutaj

    • Adadelta to kolejny taki algorytm treningowy, który wykorzystuje zarówno historię gradientów błędów, jak adagrad, jak i historię aktualizacji masy i ma tę zaletę, że wcale nie musi ustawiać szybkości uczenia się .

  • Jeśli nie, jakie wartości powinienem wybrać i jak je wybrać?

    • Ustalanie szybkości uczenia się dla zwykłego SGD w sieciach neuronowych jest zwykle procesem rozpoczynania od zdrowej wartości, takiej jak 0,01, a następnie przeprowadzania weryfikacji krzyżowej w celu znalezienia optymalnej wartości. Typowe wartości mieszczą się w zakresie kilku rzędów wielkości od 0,0001 do 1.
  • 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 zbyt długo nie 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?

    • Zwykle najlepsza wartość jest zbliżona do najwyższej stabilnej szybkości uczenia się, a zanikanie / uczenie się szybkości uczenia się (liniowe lub wykładnicze) jest wykorzystywane w trakcie treningu. Powodem tego jest to, że na początku pojawia się wyraźny sygnał uczenia się, więc agresywne aktualizacje zachęcają do eksploracji, a później mniejsze wskaźniki uczenia się pozwalają na bardziej delikatne wykorzystanie lokalnej powierzchni błędu.
indico
źródło
1
W praktyce będziesz korzystać z kursu uczenia się z adadelta. W przypadku niektórych problemów nie działa bez.
bayer
Należy zauważyć, że optymalizator Adam jest obecnie bardziej powszechny niż Adagrad lub Adadelta.
E_net4 jest nadal w trakcie strajku
22

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ę.

BrNguyen
źródło
9

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.

lmjohns3
źródło
6

Skopiowano z mojej pracy magisterskiej :

  • Jeśli utrata nie zmniejsza się przez kilka epok, wskaźnik uczenia się może być zbyt niski. Proces optymalizacji może również utknąć w lokalnym minimum.
  • Utrata NAN może być spowodowana zbyt wysokimi wskaźnikami uczenia się. Innym powodem jest dzielenie przez zero lub przyjmowanie logarytmu zerowego.
  • Śledzenie aktualizacji wagi: Andrej Karpathy zaproponował w piątym wykładzie CS231n śledzenie aktualizacji wagi w celu sprawdzenia, czy tempo uczenia się jest dobrze wybrane. Sugeruje, że aktualizacja wagi powinna być rzędu 10-3. Jeśli aktualizacja masy jest zbyt wysoka, wówczas szybkość uczenia się musi zostać zmniejszona. Jeśli aktualizacja masy jest zbyt niska, należy zwiększyć szybkość uczenia się.
  • Typowe wskaźniki uczenia się wynoszą [0,1, 0,00001]
Martin Thoma
źródło
4

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:

  • Jeden odnosi się do „ czasu ”, a każdy wymiar powinien mieć ten sam rozmiar kroku. Być może zauważyłeś coś takiego

αt

podczas gdy t pokazuje bieżący numer iteracji, alfa jest parametrem hiper

  • następny jest połączony z gradientem , a każdy wymiar ma swój własny rozmiar kroku. Być może zauważyłeś coś takiego

1αβ+s=1t1gs2αβ+s=1tgs2

podczas gdy alfa i beta są hiperparametrami, g pokazuje gradient

  • ostatnia jest kombinacją czasu i gradientu i powinna być podobna

1αβ+s=1t1gs2αβ+s=1tgs2+γt

lub

1αβ+s=1t1gs2αβ+s=1tgs2γt

Mam nadzieję, że to ci pomoże, powodzenia-)

Joe
źródło
Czy masz do tego referencje?
Jon
Możesz odnieść się do części kursu FTRL, którą możemy sformułować za pomocą TIME i GRADIENT.
Joe
3

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.

dileep balineni
źródło
3

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.

tenshi
źródło
2

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:

wprowadź opis zdjęcia tutaj

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.103

David Masip
źródło