Skip to content

Latest commit

 

History

History
108 lines (59 loc) · 10 KB

File metadata and controls

108 lines (59 loc) · 10 KB

Triki w trenowaniu głębokich sieci neuronowych

Wraz z pogłębianiem się sieci neuronowych, proces ich trenowania staje się coraz bardziej wymagający. Jednym z głównych problemów są tzw. zanikające gradienty lub eksplodujące gradienty. Ten artykuł dobrze wprowadza w te zagadnienia.

Aby uczynić trenowanie głębokich sieci bardziej efektywnym, można zastosować kilka technik.

Utrzymywanie wartości w rozsądnym zakresie

Aby zapewnić stabilność obliczeń numerycznych, należy upewnić się, że wszystkie wartości w sieci neuronowej mieszczą się w rozsądnym zakresie, zazwyczaj [-1..1] lub [0..1]. Nie jest to bardzo rygorystyczny wymóg, ale natura obliczeń zmiennoprzecinkowych sprawia, że wartości o różnych rzędach wielkości nie mogą być dokładnie przetwarzane razem. Na przykład, jeśli dodamy 10-10 i 1010, prawdopodobnie otrzymamy 1010, ponieważ mniejsza wartość zostanie "przekształcona" do tego samego rzędu co większa, co spowoduje utratę mantysy.

Większość funkcji aktywacji ma nieliniowości w zakresie [-1..1], dlatego sensowne jest skalowanie wszystkich danych wejściowych do zakresu [-1..1] lub [0..1].

Inicjalizacja wag

Idealnie, chcemy, aby wartości pozostawały w tym samym zakresie po przejściu przez warstwy sieci. Dlatego ważne jest, aby inicjalizować wagi w taki sposób, aby zachować rozkład wartości.

Rozkład normalny N(0,1) nie jest dobrym pomysłem, ponieważ jeśli mamy n wejść, odchylenie standardowe wyjścia wynosiłoby n, a wartości prawdopodobnie wyjdą poza zakres [0..1].

Często stosowane inicjalizacje to:

  • Rozkład jednostajny -- uniform
  • N(0,1/n) -- gaussian
  • N(0,1/√n_in) gwarantuje, że dla wejść o średniej zero i odchyleniu standardowym równym 1, te same parametry zostaną zachowane
  • N(0,√2/(n_in+n_out)) -- tzw. inicjalizacja Xaviera (glorot), która pomaga utrzymać sygnały w zakresie zarówno podczas propagacji w przód, jak i wstecz

Normalizacja wsadowa

Nawet przy odpowiedniej inicjalizacji wag, wagi mogą podczas trenowania przyjmować dowolnie duże lub małe wartości, co powoduje, że sygnały wychodzą poza właściwy zakres. Możemy przywrócić sygnały do odpowiedniego zakresu, stosując jedną z technik normalizacji. Chociaż istnieje kilka takich technik (normalizacja wag, normalizacja warstwowa), najczęściej stosowana jest normalizacja wsadowa.

Idea normalizacji wsadowej polega na uwzględnieniu wszystkich wartości w minibatchu i przeprowadzeniu normalizacji (tj. odjęciu średniej i podzieleniu przez odchylenie standardowe) na podstawie tych wartości. Jest to implementowane jako warstwa sieci, która wykonuje tę normalizację po zastosowaniu wag, ale przed funkcją aktywacji. W rezultacie możemy uzyskać wyższą końcową dokładność i szybsze trenowanie.

Oto oryginalny artykuł na temat normalizacji wsadowej, wyjaśnienie na Wikipedii oraz dobry wprowadzający artykuł (i wersja po rosyjsku).

Dropout

Dropout to ciekawa technika, która usuwa pewien procent losowych neuronów podczas trenowania. Jest to również implementowane jako warstwa z jednym parametrem (procent neuronów do usunięcia, zazwyczaj 10%-50%), a podczas trenowania zeruje losowe elementy wektora wejściowego przed przekazaniem go do kolejnej warstwy.

Choć może to brzmieć dziwnie, efekt dropout można zobaczyć podczas trenowania klasyfikatora cyfr MNIST w notatniku Dropout.ipynb. Przyspiesza on trenowanie i pozwala osiągnąć wyższą dokładność w mniejszej liczbie epok.

Efekt ten można wyjaśnić na kilka sposobów:

  • Można to uznać za losowy czynnik szokujący dla modelu, który wyprowadza optymalizację z lokalnego minimum
  • Można to traktować jako implicit model averaging, ponieważ można powiedzieć, że podczas dropout trenujemy nieco inny model

Niektórzy twierdzą, że gdy osoba pod wpływem alkoholu próbuje się czegoś nauczyć, zapamięta to lepiej następnego ranka w porównaniu z osobą trzeźwą, ponieważ mózg z pewnymi "niedziałającymi" neuronami lepiej dostosowuje się do uchwycenia sensu. Nigdy nie testowaliśmy tego sami, czy to prawda.

Zapobieganie przeuczeniu

Jednym z bardzo ważnych aspektów głębokiego uczenia jest umiejętność zapobiegania przeuczeniu. Chociaż może być kuszące użycie bardzo potężnego modelu sieci neuronowej, zawsze należy zrównoważyć liczbę parametrów modelu z liczbą próbek treningowych.

Upewnij się, że rozumiesz koncepcję przeuczenia, którą wcześniej omówiliśmy!

Istnieje kilka sposobów zapobiegania przeuczeniu:

  • Wczesne zatrzymanie -- ciągłe monitorowanie błędu na zbiorze walidacyjnym i zatrzymanie trenowania, gdy błąd walidacyjny zaczyna rosnąć.
  • Jawne zanikanie wag / Regularizacja -- dodanie dodatkowej kary do funkcji straty za wysokie wartości bezwzględne wag, co zapobiega uzyskiwaniu przez model bardzo niestabilnych wyników
  • Uśrednianie modeli -- trenowanie kilku modeli i następnie uśrednianie wyników. Pomaga to zminimalizować wariancję.
  • Dropout (Implicit Model Averaging)

Optymalizatory / Algorytmy trenowania

Kolejnym ważnym aspektem trenowania jest wybór odpowiedniego algorytmu trenowania. Chociaż klasyczny gradient descent jest rozsądnym wyborem, czasami może być zbyt wolny lub prowadzić do innych problemów.

W głębokim uczeniu stosujemy Stochastic Gradient Descent (SGD), czyli gradient descent stosowany do minibatchy, losowo wybranych ze zbioru treningowego. Wagi są dostosowywane za pomocą tego wzoru:

wt+1 = wt - η∇ℒ

Momentum

W momentum SGD przechowujemy część gradientu z poprzednich kroków. Jest to podobne do sytuacji, gdy poruszamy się z bezwładnością, a następnie otrzymujemy impuls w innym kierunku – nasza trajektoria nie zmienia się natychmiast, ale zachowuje część pierwotnego ruchu. Wprowadzamy tutaj dodatkowy wektor v, który reprezentuje prędkość:

  • vt+1 = γ vt - η∇ℒ
  • wt+1 = wt+vt+1

Parametr γ wskazuje, w jakim stopniu uwzględniamy bezwładność: γ=0 odpowiada klasycznemu SGD; γ=1 to czysta równanie ruchu.

Adam, Adagrad, itd.

Ponieważ w każdej warstwie mnożymy sygnały przez pewną macierz Wi, w zależności od ||Wi|| gradient może albo zanikać i być bliski 0, albo rosnąć w nieskończoność. To istota problemu eksplodujących/zanikających gradientów.

Jednym z rozwiązań tego problemu jest użycie jedynie kierunku gradientu w równaniu, ignorując jego wartość bezwzględną, tj.

wt+1 = wt - η(∇ℒ/||∇ℒ||), gdzie ||∇ℒ|| = √∑(∇ℒ)2

Ten algorytm nazywa się Adagrad. Inne algorytmy wykorzystujące podobną ideę: RMSProp, Adam

Adam jest uważany za bardzo efektywny algorytm w wielu zastosowaniach, więc jeśli nie jesteś pewien, którego użyć - wybierz Adam.

Gradient clipping

Gradient clipping to rozszerzenie powyższej idei. Gdy ||∇ℒ|| ≤ θ, uwzględniamy oryginalny gradient w optymalizacji wag, a gdy ||∇ℒ|| > θ - dzielimy gradient przez jego normę. Tutaj θ to parametr, w większości przypadków możemy przyjąć θ=1 lub θ=10.

Zmniejszanie współczynnika uczenia

Sukces trenowania często zależy od parametru współczynnika uczenia η. Logiczne jest założenie, że większe wartości η prowadzą do szybszego trenowania, co jest pożądane na początku procesu, a następnie mniejsze wartości η pozwalają na dopracowanie sieci. Dlatego w większości przypadków chcemy zmniejszać η w trakcie trenowania.

Można to zrobić, mnożąc η przez pewną liczbę (np. 0,98) po każdej epoce trenowania lub stosując bardziej skomplikowany harmonogram współczynnika uczenia.

Różne architektury sieci

Wybór odpowiedniej architektury sieci dla danego problemu może być trudny. Zazwyczaj wybieramy architekturę, która sprawdziła się w naszym konkretnym zadaniu (lub podobnym). Oto dobry przegląd architektur sieci neuronowych dla wizji komputerowej.

Ważne jest, aby wybrać architekturę, która będzie wystarczająco potężna dla liczby dostępnych próbek treningowych. Wybór zbyt potężnego modelu może prowadzić do przeuczenia.

Innym dobrym podejściem jest użycie architektury, która automatycznie dostosowuje się do wymaganej złożoności. Do pewnego stopnia architektury takie jak ResNet i Inception są samodostosowujące. Więcej o architekturach wizji komputerowej

Zastrzeżenie:
Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI Co-op Translator. Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za autorytatywne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia.