Nauczenie się jako Spadanie po Przestrzeni Strata
Wagi sieci neuronowej zaczynają od małych losowych liczb, dlatego jej najwcześniejsze predykcje są w podstawie szum. Trening to proces przesuwania tych wag, predykcja po predykcji, aż wyjście sieci stać się zgodne z poprawnymi odpowiedziami. Aby to zrobić systematycznie, potrzebujesz dwóch rzeczy: jednego numeru, który pomaga miary, jak bardzo błędnymi są obecne predykcje, nazywanego stratą, oraz reguły dostosowywania każdego wagi tak, aby strata stała się mniejsza.
Pomocne jest wyobrażenie sobie straty jako przestrzeni, gdzie każda możliwa kombinacja wartości wag odpowiada punktowi na powierzchni tej przestrzeni, a wysokość w tym punkcie odpowiada stracie osiągnie przez te wagi. Trening sieci neuronowej jest równoznaczny z rozpoczęciem się na losowym punkcie na tej przestrzeni (początkowe losowe wagi) i próbą idąc dolinę (zestawu wag o niskiej stracie). Przestrzeń ma znacznie więcej wymiarów niż możemy wyobrazić sobie — modyfikacja modestnej sieci może łatwo mieć miliony wag, co oznacza miliony wymiarów — ale intuicja „określ kierunek, w którym jest spadek, i postąp w nim” przetrwała dokładnie.
Kierunek, który najbardziej intensywnie zwiększa stratę na każdym punkcie tej przestrzeni, jest dany przez gradient — wektor pochodnych cząstkowych straty względem każdej wagi. Ponieważ chcemy zmniejszyć stratę, a nie zwiększyć jej, postępujemy dokładnie w przeciwne kierunku do gradientu. To jest spadek gradientowy: powtarzaj obliczanie gradientu, wykonuj mały krok w przeciwnym kierunku i powtórz, aż strata przestanie znacząco się poprawiać.
Backpropagacja: Efektywne Obliczanie Gradientu
Znając fakt, że potrzebujemy gradientu, jest jednym rzeczami; obliczanie go efektywnie dla sieci z milionami wag rozłożonych po wielu warstwach to całkowicie innym. To problem, który rozwiązuje backpropagacja, wykorzystując zasady napisane w kalkulu do sprowadzenia wydajnie niezliczonej obliczeniowej komputacji do sekwencji maneglowych lokalnych kroków.
Trening przeprowadza się w dwóch przebiegach. W przebiegu forward, wektor wejściowy przechodzi przez sieć warstwami po warstwie — każda warstwa oblicza wagowany sumator jej wejść (Z = W·A + b), a następnie stosuje funkcję aktywacji nieliniową (A = aktywacja(Z)) — aż do ostatniej warstwy, która produkuje prognozę, porównywana z prawdziwym etykietą, aby obliczyć stratę.
W przebiegu backward, w odwrotnej kolejności, od strony straty, informacje o gradientach propagują się w stronę wejścia warstwami po warstwie. Na wyjściowej warstwie, gdy używamy aktywacji softmax i straty krzyżowej (standardowa kombinacja dla klasyfikacji), gradient względem wartości przed-aktywacji upraszcza się elegancko do dZ = przewidziany − prawdziwy — to właściwie różnica między prognozą sieci a tym, co powinna była przewidzieć. Z tego punktu odległości, zasada napisana w kalkulu pozwala każdej warstwie obliczyć własne gradienty wag korzystając tylko z sygnału gradientu dostarczonego przez warstwę po niej, oraz swoich własnych aktywacji przechowywanych lokalnie podczas przebiegu forward:
dW[layer] = (1/m) · A[layer-1]ᵀ · dZ[layer] db[layer] = (1/m) · sum(dZ[layer]) dA[layer-1] = dZ[layer] · W[layer]ᵀ dZ[layer-1] = dA[layer-1] ⊙ activation'(Z[layer-1]) gdzie m to wielkość batcha, a ⊙ oznacza mnożenie elementowe. Kluczowa myśl dotycząca efektywności polega na tym, że obliczenia gradientu każdej warstwy wykorzystują już obliczony gradient dla warstwy dolnej, zamiast rekonstruować wszystko od początku — to jest co sprawia, że koszt backpropagacji jest prawie proporcjonalny do jednego przebiegu forward, zamiast eksplodować kombinatorycznie ze stopniem sieci, a to jest właściwość, która pozwala na komputerowe treningi głębokich sieci.
Rozwijacze często walidują ręczne implementacje backpropagacji za pomocą sprawdzania gradientów: przesuwając jedno wagi o mały epsilon, ponownie uruchamiając forward, przesuwając je z powrotem o taki sam epsilon, ponownie uruchamiając i porównując numeryczny spadek (loss_plus − loss_minus) / (2·epsilon) do analitycznego gradientu wygenerowanego przez backpropagację. Bliska zgoda (zazwyczaj w granicach 1e-7) potwierdza poprawność implementacji przebiegu backward — to ważne sprawdzanie, ponieważ niewyraźny błąd w obliczeniach gradientów często nadal pozwala na trening "sort of", tylko źle, co mało jest wykrywalne bez jasnego numerycznego sprawdzenia.
dW[layer] = (1/m) · A[layer-1]ᵀ · dZ[layer] db[layer] = (1/m) · sum(dZ[layer]) dA[layer-1] = dZ[layer] · W[layer]ᵀ dZ[layer-1] = dA[layer-1] ⊙ activation'(Z[layer-1])
Trzy odmiany spadkowego gradientu
Po tym, jak można obliczyć gradient, nadal musisz zdecydować, ile danych użyć do każdego obliczenia gradientu przed aktualizacją wag. Ta decyzja ma ogromne znaczenie w praktyce. Spadkowy gradient całkowity (batch gradient descent) oblicza gradient na podstawie całego zestawu treningowego, zanim dokona jednego kroku. To daje bardzo dokładny, niskonoisyjny estymator prawdziwej kierunku spadku, ale dla zestawu danych zawierającego miliony przykładów, pojedyncza aktualizacja wag może stać się niepraktycznie wolna, a pamięć wymagana do przechowywania aktywacji całego zestawu danych naraz może być niewykonalna.
Spadkowy gradient stochastyczny (SGD) idzie na przeciwny koniec, obliczając gradient i aktualizując wagi po każdym pojedynczym przykładzie treningowym. Jest szybki na poziomie kroku, a szumistość wynikających aktualizacji może pomóc optymalizatorowi uciec z głębokich lokalnych minimum lub punktów siodłowych, ale ścieżka do minimum staje się niepewna, a aktualizacje na poziomie pojedynczych przykładów nie wykorzystują paralelnych sprzętowych jednostek (GPU), które sprawiają, że operacje macierzowe w grupach są skuteczne.
Spadkowy gradient mini-batch to praktyczna kompromis używany prawie przez wszystkich: oblicza gradient na podstawie małej grupy przykładów (często 32, 64 lub 128) przed każdą aktualizacją. To pozwala zachować większość stabilności pełno-batchowych gradientów, jednocześnie pozostając szybko do wykonania, aby dokonać wielu aktualizacji na każdym okresie treningowym, a rozmiary grup w tym zakresie mapują się skutecznie na operacje macierzowe na GPU.
Momentum, RMSprop i Adam: Wybranie Smaczniejszych Kroków
Prosta spadkowa gradientu bierze każdy krok o stałej wielkości i kierunku wyznaczonym jedynie na podstawie obecnego gradientu, co okazuje się niewykorzystującego na prawdziwych krajobrazach strat — skniciaste doliny sprawiają, że oscyluje wzdłuż ścian doliny, zaś postępuje wolno po jej długości. Nowoczesne optymalizatory rozwiązywają to, pamiętając informacje z poprzednich kroków.
Momentum zachowuje ślad, wykładniczo ulegający zmniejszeniu średniej przeszłych gradientów (wyraz „prędkości”), a następnie aktualizuje wagi używając tej średniej zamiast jedynie obecnego gradientu: v = β·v + (1−β)·gradient, następnie wagi −= learning_rate·v, co zwykle oznacza wartość β blisko 0.9. Gradienty, które skierowane są na tę samą stronę przez kilka kroków, potęgują się i przyspieszają postęp w tej kierunku, podczas gdy gradienty, które zmieniają znak od jednego kroku do drugiego (oskowikowanie po dnie doliny) częściowo anulują się, tłumiąc oscylację.
RMSprop podejmuje inny kurs, zachowując ślad średniej kwadratowych gradientów dla każdego wagi i dzieląc learning rate przez pierwiastek z tej średniej: s = β·s + (1−β)·gradient², następnie wagi −= learning_rate·gradient / sqrt(s + ε). To efektywnie daje każdej pojedynczej wagie własny adaptacyjny learning rate — wagi o ciągłych dużych gradientach otrzymują zmniejszoną skuteczną wielkość kroku, podczas gdy wagi z małymi i rzadko występującymi gradientami otrzymują stosunkowo większe kroki, co pomaga, gdy różne wagi potrzebują bardzo różnych magnetyzmu aktualizacji.
Adam (Adaptive Moment Estimation) łączy obie te idee: śledzi momentum (nazywane pierwszym momentem, m) i średnią kwadratowych gradientów typu RMSprop (drugi moment, v) jednocześnie, stosuje korekcję przesunięcia do każdego (ważne w początkowych etapach treningu, gdy obie średnie ruchome zaczynają od zera i są skojarzone z zerem), a następnie aktualizuje wagi używając korektowanego momentum podzielonego przez pierwiastek z korektowanej średniej kwadratowej gradientu. Z jego obecnie zalecanymi domyślnymi wartościami (β1=0.9, β2=0.999, ε=1e-8), Adam szybko konverguje z stosunkowo małym manuelnym dostosowywaniem się na szerokim zakresie problemów, co jest powodem dla którego stało się standardowym pierwszym wyborem do treningu większości współczesnych sieci neuronowych, w tym prawie wszystkich modeli komputerowego wzroku opartych na convoluencji i transformerach.
Stosunek uczenia: Najważniejszy Parametr Hyperparametru
Każdy z tych optimizatorów nadal wymaga stosunku uczenia — wielkości kroku w stosunku do (możliwej dostosowanej) kierunku gradientu — a ta pojedyncza liczba ma ogromny wpływ na to, czy trenowanie się powiedzie w ogóle. Stosunek uczenia zbyt duży spowoduje powtarzające się przekroczenie minimum, a w najgorszym przypadku może sprawić, że straty rozbiegną się do nieskończoności zamiast maleć. Stosunek uczenia zbyt mały sprawi, że trenowanie jest technicznie stabilne, ale niezwykle wolne, i może pozostawić optimizator wciąż w miejscu przez długie czas, w płaskiej lub lekko nieregularnej części krajobrazu strat, której większy krok mógłby łatwo uniknąć.
Zamiast ustalić pojedynczy stosunek uczenia na cały okres trenowania, większość praktycznych schematów trenujących zmniejsza go w czasie zgodnie z jednym z kilku wzorów: decay step spada o stały czynnik co kilka epok; decay eksponencjalny ciągle zmniejsza go o stałą proporcję w każdym okresie; annealing kosinusowy spokojnie zmniejsza go, nawiązując do krzywej kosinusowej, aż do bliskiej zera na końcu trenowania. Podstawa logiki za tą techniką jest ta sama: używaj stosunkowo dużego stosunku uczenia wczesniej, gdy wagi są daleko od jakiegokolwiek dobrego rozwiązania i duże kroki sprawiają szybką postępu, a używaj mniejszego stosunku uczenia później, gdy wagi są blisko do dobrego obszaru, gdzie duże kroki tylko spowodują oscylacje wokół minimum zamiast osiągnięcia go.
Często zadawane pytania
Jak różni się spadek gradientu od backpropagacji?
Spadek gradientu to zasada optymalizacji do aktualizowania wag po znalezieniu gradientu straty. Backpropagacja jest konkretnym algorytmem opartym na zasadach reguły łańcuchowej rachunku różniczkowego, który wylicza ten gradient efektywnie dla każdej wagi w sieci wielokrotnej warstwowej. Pracują one razem: backpropagacja dostarcza gradient, a spadek gradientu (lub jego wariant, np. Adam) używa go do aktualizacji wag.
Dlaczego preferuje się spadek gradientu z mini-batkami nad pełnymi batkami lub aktualizacjami na jedno wystąpienie?
Mini-baty oferują praktyczne równowagę: dostarczają estymatę gradientu wystarczająco dokładną do stabilnego postępu, są wystarczająco małe, aby pozwoliły na wiele aktualizacji wag w ciągu jednej przepracowania danych, a mapują się efektywnie na równoległe operacje macierzowe, które GPU są optymalizowane dla, w przeciwieństwie do aktualizacji na jedno wystąpienie.
Dlaczego Adam prawie zawsze przewyższa proste SGD w praktyce?
Adam łączy momentum, które łagodzi nozyce lub oscylacje kierunków gradientu, z adaptacyjną dla każdej wagi stopą nauki opartą na tym, jak duże byłyby w przeszłości gradienty tej wagi. Ta kombinacja zazwyczaj konverguje szybciej i wymaga mniej ręcznej regulacji stopni stopni nauki niż proste SGD, choć dobrze nauce SGD z momentumem czasami może lepiej generalizować na niektórych zadaniach.
Co się stanie, jeśli ustawimy stopień nauki za wysoki?
Aktualizacje wag przeskoczą minimum na każdym kroku, a zamiast osiągnąć obszar niskiej straty, straty mogą oscylować niestabilnie lub rozbiegać się w kierunku nieskończoności. Ten model fałszywego poznania jest łatwo do zauważenia, ponieważ straty podniosą się lub stane się NaN w pierwszych kilku krokach treningowych.
Jak sprawdza spadek gradientów implementację backpropagacji?
Porównuje on analizowany gradient wyliczony przez backpropagację z numerycznym estymatem uzyskanym poprzez niewielkie perturbacje jednej wagi w górę i dół oraz mierzenie spowodowanego zmniejszenia strat. Bliska zgoda między oboma, zwykle w granicach około 1e-7, potwierdza, że cofa się jest poprawnie zaimplementowany, ponieważ błąd by zwykle spowodował znacznie większą niezgodność.
▶ Wypróbuj na żywo
Wszystko powyżej działa bezpośrednio w Twojej przeglądarce — otwórz Gradient Descent and Backpropagation Training Lab i zmieniaj parametry podczas działania. Nic nie jest instalowane ani przesyłane na serwer, cały model działa w jednej karcie.