Propagacja wsteczna - Backpropagation

W uczenia maszynowego , wstecznej ( backprop , BP ) jest szeroko stosowany algorytm dla szkolenia wyprzedzającym sieci neuronowych . Uogólnienia propagacji wstecznej istnieją dla innych sztucznych sieci neuronowych (SSN) i ogólnie dla funkcji. Wszystkie te klasy algorytmów są ogólnie określane jako „propagacja wsteczna”. W montażu sieci neuronowej , wstecznej oblicza gradientu w funkcji strat w stosunku do ciężarów sieci dla jednego przykładu wejścia-wyjścia, a nie tak skutecznie , w przeciwieństwie do naiwnych bezpośredniego obliczania gradientu w odniesieniu do każdego ciężaru indywidualnie. Ta wydajność umożliwia wykorzystanie metod gradientowych do uczenia sieci wielowarstwowych, aktualizując wagi w celu zminimalizowania strat; zejście gradientowe lub warianty, takie jak stochastyczne zejście gradientowe , są powszechnie stosowane. Algorytm propagacji wstecznej działa poprzez obliczenie gradientu funkcji straty w odniesieniu do każdej wagi za pomocą reguły łańcucha , obliczenie gradientu jedna warstwa na raz, iteracja wstecz od ostatniej warstwy, aby uniknąć zbędnych obliczeń pośrednich składników w regule łańcucha; to jest przykład programowania dynamicznego .

Termin propagacja wsteczna ściśle odnosi się tylko do algorytmu obliczania gradientu, a nie do sposobu wykorzystania gradientu; jednak termin ten jest często używany luźno w odniesieniu do całego algorytmu uczenia się, w tym sposobu wykorzystania gradientu, na przykład stochastycznego spadku gradientu. Propagacja wsteczna uogólnia obliczenia gradientu w regule delta , która jest jednowarstwową wersją propagacji wstecznej, i jest z kolei uogólniona przez automatyczne różnicowanie , gdzie propagacja wsteczna jest szczególnym przypadkiem akumulacji wstecznej (lub „trybem odwrotnym”). Termin propagacja wsteczna i jego ogólne zastosowanie w sieciach neuronowych ogłosili Rumelhart, Hinton i Williams (1986a) , a następnie rozwinęli i spopularyzowali w Rumelhart, Hinton i Williams (1986b) , ale technika ta była wielokrotnie odkrywana niezależnie i miała wielu datowanych do lat 60.; patrz § Historia . Nowoczesny przegląd znajduje się w podręczniku do głębokiego uczenia się autorstwa Goodfellow, Bengio & Courville (2016) .

Przegląd

Propagacja wsteczna oblicza gradient w przestrzeni wag sieci neuronowej ze sprzężeniem do przodu, w odniesieniu do funkcji straty . Oznaczać:

  • : wejście (wektor cech)
  • : wyjście docelowe
    Klasyfikacji, sygnał będzie być wektorem prawdopodobieństwa klasy (na przykład , i wysyła cel jest klasą specyficznych, kodowanych przez jeden gorącym / zmiennej obojętne (na przykład ).
  • : funkcja strat lub „funkcja kosztów”
    Dla klasyfikacji jest to zwykle entropia krzyżowa (XC, log loss ), podczas gdy dla regresji jest to zwykle kwadratowa strata błędu (SEL).
  • : liczba warstw
  • : wagi między warstwą a , gdzie jest wagą między -tym węzłem w warstwie a -tym węzłem w warstwie
  • : funkcje aktywacji w warstwie
    Dla klasyfikacji ostatnią warstwą jest zwykle funkcja logistyczna dla klasyfikacji binarnej, a softmax (softargmax) dla klasyfikacji wieloklasowej, podczas gdy dla warstw ukrytych była to tradycyjnie funkcja sigmoidalna (funkcja logistyczna lub inne) na każdym węźle (współrzędnej), ale dziś jest bardziej zróżnicowana, a prostownik ( rampa , ReLU ) jest powszechny.

W wyprowadzaniu wstecznej propagacji stosuje się inne ilości pośrednie; są one wprowadzane w miarę potrzeb poniżej. Terminy odchylenia nie są traktowane specjalnie, ponieważ odpowiadają wadze o stałej wartości wejściowej równej 1. Dla celów propagacji wstecznej, specyficzna funkcja straty i funkcje aktywacji nie mają znaczenia, o ile one i ich pochodne mogą być efektywnie oceniane.

Ogólna sieć jest kombinacją kompozycji funkcji i mnożenia macierzy :

Dla zestawu uczącego będzie zestaw par wejścia-wyjścia, . Dla każdej pary wejście-wyjście w zbiorze uczącym utrata modelu w tej parze jest kosztem różnicy między przewidywanym wyjściem a docelowym wyjściem :

Zwróć uwagę na rozróżnienie: podczas ewaluacji modelu wagi są stałe, podczas gdy dane wejściowe są różne (a docelowy wynik może być nieznany), a sieć kończy się warstwą wyjściową (nie zawiera funkcji straty). Podczas uczenia modelu para wejście-wyjście jest stała, wagi są zmienne, a sieć kończy się funkcją straty.

Propagacja wsteczna oblicza gradient dla stałej pary wejście-wyjście , w której wagi mogą się różnić. Każdy indywidualny składnik gradientu można obliczyć za pomocą reguły łańcucha; jednak robienie tego osobno dla każdej wagi jest nieefektywne. Propagacja wsteczna skutecznie oblicza gradient, unikając podwójnych obliczeń i nie obliczając zbędnych wartości pośrednich, obliczając gradient każdej warstwy – w szczególności gradient ważonego wejścia każdej warstwy, oznaczonego – od tyłu do przodu.

Nieformalnie kluczową kwestią jest to, że ponieważ jedynym sposobem, w jaki waga wpływa na utratę, jest jej wpływ na następną warstwę i dzieje się to liniowo , to jedyne dane potrzebne do obliczenia gradientów wag w warstwie , a następnie możesz obliczyć poprzednią warstwę i powtórzyć rekursywnie. Pozwala to uniknąć nieefektywności na dwa sposoby. Po pierwsze, pozwala uniknąć duplikacji, ponieważ podczas obliczania gradientu w warstwie nie trzeba za każdym razem ponownie obliczać wszystkich pochodnych na kolejnych warstwach . Po drugie, unika zbędnych obliczeń pośrednich, ponieważ na każdym etapie bezpośrednio oblicza gradient wag względem ostatecznego wyniku (straty), zamiast niepotrzebnie obliczać pochodne wartości warstw ukrytych po zmianach wag .

Propagację wsteczną można wyrazić dla prostych sieci ze sprzężeniem do przodu w postaci mnożenia macierzy lub bardziej ogólnie w postaci grafu sprzężonego .

Mnożenie macierzy

W podstawowym przypadku sieci ze sprzężeniem do przodu, gdzie węzły w każdej warstwie są połączone tylko z węzłami w następnej warstwie (bez pomijania jakichkolwiek warstw) i istnieje funkcja strat, która oblicza stratę skalarną dla końcowego wyniku, propagację wsteczną można rozumiane po prostu przez mnożenie macierzy. Zasadniczo propagacja wsteczna ocenia wyrażenie na pochodną funkcji kosztu jako iloczyn pochodnych między każdą warstwą od prawej do lewej – „do tyłu” – przy czym gradient wag między każdą warstwą jest prostą modyfikacją produktów cząstkowych („ błąd propagowany wstecz”).

Biorąc pod uwagę parę wejście-wyjście , strata wynosi:

Aby to obliczyć, zaczynamy od danych wejściowych i pracujemy do przodu; oznaczają ważone wejście każdej warstwy jako , a wyjście warstwy jako aktywację . W przypadku propagacji wstecznej aktywacja oraz pochodne (oceniane w ) muszą być buforowane do użycia podczas przebiegu wstecznego.

Pochodną straty pod względem danych wejściowych określa reguła łańcucha; zauważ, że każdy wyraz jest całkowitą pochodną , szacowaną na wartości sieci (w każdym węźle) na wejściu :

Terminy te to: pochodna funkcji straty; pochodne funkcji aktywacji; oraz macierze wag:

Gradient jest transpozycją pochodnej wyjścia względem wejścia, więc macierze są transponowane, a kolejność mnożenia jest odwrócona, ale wpisy są takie same:

Propagacja wsteczna polega zatem zasadniczo na ocenie tego wyrażenia od prawej do lewej (równoważnie, mnożeniu poprzedniego wyrażenia przez pochodną od lewej do prawej), obliczeniu gradientu w każdej warstwie po drodze; jest dodatkowy krok, ponieważ gradient wag nie jest tylko podwyrażeniem: jest dodatkowe mnożenie.

Wprowadzenie wielkości pomocniczej dla produktów cząstkowych (mnożenie od prawej do lewej), interpretowanej jako „błąd na poziomie ” i zdefiniowanej jako gradient wartości wejściowych na poziomie :

Zauważ, że jest to wektor o długości równej liczbie węzłów na poziomie ; każdy składnik jest interpretowany jako „koszt, który można przypisać (wartość) tego węzła”.

Gradient wag w warstwie wynosi wtedy:

Czynnikiem jest to, że wagi między poziomem a poziomem wpływają proporcjonalnie do wejść (aktywacji): wejścia są stałe, wagi się zmieniają.

Można łatwo obliczane rekursywnie jako:

Gradienty wag można zatem obliczyć za pomocą kilku mnożeń macierzy dla każdego poziomu; to jest wsteczna propagacja.

W porównaniu z naiwnym przetwarzaniem naprzód (używając dla ilustracji):

istnieją dwie kluczowe różnice z propagacją wsteczną:

  1. Obliczenia pod względem unikania oczywistego powielania powielania warstw i nie tylko.
  2. Mnożenie zaczynając od – propagując błąd wstecz – oznacza, że ​​każdy krok po prostu mnoży wektor ( ) przez macierze wag i pochodnych aktywacji . Natomiast mnożenie naprzód, począwszy od zmian we wcześniejszej warstwie, oznacza, że ​​każde mnożenie mnoży macierz przez macierz . Jest to znacznie droższe i odpowiada śledzeniu każdej możliwej ścieżki zmiany w jednej warstwie w przód do zmian w warstwie (w celu pomnożenia przez , z dodatkowymi mnożeniami dla pochodnych aktywacji), które niepotrzebnie oblicza pośrednie wielkości tego, jak waga zmiany wpływają na wartości ukrytych węzłów.

Dołączony wykres

W przypadku bardziej ogólnych wykresów i innych zaawansowanych odmian propagację wsteczną można rozumieć w kategoriach automatycznego różnicowania , gdzie propagacja wsteczna jest szczególnym przypadkiem akumulacji odwrotnej (lub „trybem odwrotnym”).

Intuicja

Motywacja

Celem każdego algorytmu uczenia nadzorowanego jest znalezienie funkcji, która najlepiej odwzorowuje zestaw danych wejściowych na ich prawidłowe dane wyjściowe. Motywacją do wstecznej propagacji jest wytrenowanie wielowarstwowej sieci neuronowej tak, aby mogła nauczyć się odpowiednich wewnętrznych reprezentacji, aby umożliwić jej nauczenie się dowolnego arbitralnego mapowania wejścia na wyjście.

Uczenie się jako problem optymalizacyjny

Aby zrozumieć matematyczne wyprowadzenie algorytmu wstecznej propagacji błędów, warto najpierw rozwinąć intuicję dotyczącą związku między rzeczywistym wyjściem neuronu a poprawnym wyjściem dla konkretnego przykładu treningowego. Rozważmy prostą sieć neuronową z dwiema jednostkami wejściowymi, jedną jednostką wyjściową i bez jednostek ukrytych, w której każdy neuron używa wyjścia liniowego (w przeciwieństwie do większości prac nad sieciami neuronowymi, w których mapowanie z wejść na wyjścia jest nieliniowe), czyli ważona suma jego wkładu.

Prosta sieć neuronowa z dwiema jednostkami wejściowymi (każda z jednym wejściem) i jedną jednostką wyjściową (z dwoma wejściami)

Początkowo, przed treningiem, ciężary będą ustawiane losowo. Następnie neuron uczy się na przykładach uczących , które w tym przypadku składają się ze zbioru krotek, gdzie i są wejściami do sieci, a t jest poprawnym wyjściem (wyjście, które sieć powinna wytworzyć przy danych wejściach, gdy została nauczona). Początkowa sieć, dane i , obliczy wynik y, który prawdopodobnie różni się od t (przy danych losowych wagach). Funkcja straty jest używana do pomiaru rozbieżności między docelową wartością wyjściową t a obliczoną wartością wyjściową y . Do analizy regresji problemów kwadrat błędu może być stosowany jako funkcję strat dla klasyfikacji kategoryczny crossentropy mogą być użyte.

Jako przykład rozważ problem regresji wykorzystujący błąd kwadratowy jako stratę:

gdzie E jest rozbieżnością lub błędem.

Rozważ sieć na jednym przypadku szkoleniowym: . Zatem wejścia i wynoszą odpowiednio 1 i 1, a poprawna wartość wyjściowa t wynosi 0. Teraz, jeśli wykreślona zostanie zależność między wyjściem sieci y na osi poziomej a błędem E na osi pionowej, wynikiem jest parabola. Minimalna z paraboli odpowiada wyjścia Y , który minimalizuje błędu E . W przypadku pojedynczego przypadku szkoleniowego minimum dotyka również osi poziomej, co oznacza, że ​​błąd wyniesie zero, a sieć może wygenerować wynik y, który dokładnie odpowiada docelowemu wynikowi t . Dlatego problem mapowania wejść na wyjścia można sprowadzić do problemu optymalizacji polegającego na znalezieniu funkcji, która da minimalny błąd.

Powierzchnia błędu neuronu liniowego dla pojedynczego przypadku uczącego

Jednak wyjście neuronu zależy od ważonej sumy wszystkich jego wejść:

gdzie i są wagami na połączeniu jednostek wejściowych z jednostką wyjściową. Dlatego błąd zależy również od wag przychodzących do neuronu, co ostatecznie należy zmienić w sieci, aby umożliwić uczenie się.

W tym przykładzie po wstrzyknięciu danych uczących funkcja straty staje się

Wówczas funkcja strat przyjmuje postać walca parabolicznego z podstawą skierowaną wzdłuż . Ponieważ wszystkie zestawy wag, które spełniają, minimalizują funkcję straty, w tym przypadku wymagane są dodatkowe ograniczenia, aby uzyskać jednoznaczne rozwiązanie. Dodatkowe ograniczenia mogą być generowane przez ustawienie określonych warunków dla wag lub poprzez wprowadzenie dodatkowych danych treningowych.

Jednym z powszechnie stosowanych algorytmów znajdowania zestawu wag, który minimalizuje błąd, jest opadanie gradientowe . Przez wsteczną propagację oblicza się najbardziej stromy kierunek opadania funkcji straty w stosunku do obecnych wag synaptycznych. Następnie ciężary można modyfikować wzdłuż najbardziej stromego kierunku opadania, a błąd jest minimalizowany w efektywny sposób.

Pochodzenie

Metoda gradientu spadkowego polega na obliczeniu pochodnej funkcji straty w odniesieniu do wag sieci. Zwykle odbywa się to za pomocą wstecznej propagacji. Zakładając jeden neuron wyjściowy, kwadratową funkcją błędu jest

gdzie

jest stratą dla wartości wyjściowej i docelowej ,
jest docelowym wynikiem dla próbki treningowej, oraz
jest rzeczywistym wyjściem neuronu wyjściowego.

Dla każdego neuronu jego wyjście jest zdefiniowane jako

gdzie funkcja aktywacji jest nieliniowa i różniczkowalna (nawet jeśli ReLU nie znajduje się w jednym punkcie). Historycznie stosowaną funkcją aktywacji jest funkcja logistyczna :

który ma wygodną pochodną:

Wejście do neuronu to ważona suma wyjść poprzednich neuronów. Jeśli neuron znajduje się w pierwszej warstwie po warstwie wejściowej, warstwy wejściowej są po prostu wejściami do sieci. Liczba jednostek wejściowych do neuronu wynosi . Zmienna oznacza wagę pomiędzy neuronem warstwy poprzedniej a neuronem warstwy bieżącej.

Znajdowanie pochodnej błędu

Schemat sztucznej sieci neuronowej ilustrujący zastosowaną tutaj notację

Obliczenie pochodnej cząstkowej błędu względem wagi odbywa się dwukrotnie za pomocą reguły łańcucha :

 

 

 

 

( Równanie 1 )

W ostatnim czynniku prawej strony powyższego tylko jeden wyraz w sumie zależy od , więc

 

 

 

 

( Równanie 2 )

Jeśli neuron znajduje się w pierwszej warstwie po warstwie wejściowej, jest to po prostu .

Pochodna wyjścia neuronu względem wejścia jest po prostu cząstkową pochodną funkcji aktywacji:

 

 

 

 

( Równanie 3 )

co dla przypadku funkcji aktywacji logistycznej wynosi:

Jest to powód, dla którego propagacja wsteczna wymaga, aby funkcja aktywacji była różniczkowalna . (Niemniej funkcja aktywacji ReLU , która jest nieróżnicowalna przy 0, stała się dość popularna np. w AlexNet )

Pierwszy czynnik jest prosty do oceny, czy neuron znajduje się w warstwie wyjściowej, ponieważ wtedy i

 

 

 

 

( Równanie 4 )

Jeśli połowa błędu kwadratowego jest używana jako funkcja straty, możemy przepisać ją jako

Jeśli jednak znajduje się w dowolnej wewnętrznej warstwie sieci, znalezienie pochodnej względem jest mniej oczywiste.

Biorąc pod uwagę jako funkcję, której wejściami są wszystkie neurony otrzymujące dane wejściowe z neuronu ,

i biorąc pochodną całkowitą względem , otrzymujemy wyrażenie rekurencyjne dla pochodnej:

 

 

 

 

( Równanie 5 )

Dlatego pochodną względem wyjścia można obliczyć, jeśli znane są wszystkie pochodne względem wyjść następnej warstwy – tych bliższych neuronowi wyjściowemu. [Zauważ, że jeśli którykolwiek z neuronów w zestawie nie byłby połączony z neuronem , byłyby niezależne od i odpowiadająca im pochodna cząstkowa pod sumowaniem zniknęłaby do 0.]

Zastępując równanie 2 , równ. 3 Równ.4 i Równ . 5 w równaniu 1 otrzymujemy:

z

if jest funkcją logistyczną, a błąd jest błędem kwadratowym:

Aby zaktualizować wagę za pomocą opadania gradientowego, należy wybrać tempo nauki, . Zmiana wagi musi odzwierciedlać wpływ wzrostu lub spadku . Jeśli , wzrost wzrasta ; odwrotnie, jeśli , wzrost maleje . Nowa jest dodawana do starej wagi, a iloczyn szybkości uczenia się i gradientu pomnożony przez gwarancje zmienia się w sposób, który zawsze maleje . Innymi słowy, w równaniu bezpośrednio poniżej zawsze zmienia się w taki sposób, że jest zmniejszany:

Funkcja strat

Funkcja straty to funkcja, która odwzorowuje wartości jednej lub więcej zmiennych na liczbę rzeczywistą, intuicyjnie reprezentującą pewien „koszt” związany z tymi wartościami. W przypadku propagacji wstecznej funkcja straty oblicza różnicę między wyjściem sieci a jego oczekiwanym wyjściem, po tym, jak przykład uczący propaguje się w sieci.

Założenia

Wyrażenie matematyczne funkcji straty musi spełniać dwa warunki, aby mogło być użyte w propagacji wstecznej. Pierwszym z nich jest to, że można go zapisać jako średnią z funkcji błędów , dla poszczególnych przykładów uczących, . Powodem tego założenia jest to, że algorytm wstecznej propagacji błędów oblicza gradient funkcji błędu dla pojedynczego przykładu uczącego, który należy uogólnić do funkcji błędu całkowitego. Drugim założeniem jest to, że można go zapisać jako funkcję wyjść z sieci neuronowej.

Przykładowa funkcja straty

Niech będą wektorami w .

Wybierz funkcję błędu mierzącą różnicę między dwoma wyjściami. Standardowym wyborem jest kwadrat odległości euklidesowej między wektorami i :

Funkcję błędu na przykładach uczących można następnie zapisać jako średnią strat na poszczególnych przykładach:

Ograniczenia

Zejście gradientowe może znaleźć lokalne minimum zamiast globalnego minimum.
  • Opadanie gradientu z propagacją wsteczną nie gwarantuje znalezienia globalnego minimum funkcji błędu, a jedynie minimum lokalne; ma również problemy z przekraczaniem płaskowyżów w krajobrazie funkcji błędów. Ten problem, spowodowany brakiem wypukłości funkcji błędu w sieciach neuronowych, był długo uważany za główną wadę, ale Yann LeCun i in. twierdzą, że w wielu praktycznych problemach tak nie jest.
  • Uczenie się z propagacją wsteczną nie wymaga normalizacji wektorów wejściowych; jednak normalizacja może poprawić wydajność.
  • Propagacja wsteczna wymaga, aby pochodne funkcji aktywacji były znane w czasie projektowania sieci.

Historia

Termin propagacja wsteczna i jego ogólne zastosowanie w sieciach neuronowych został ogłoszony w Rumelhart, Hinton i Williams (1986a) , a następnie opracowany i spopularyzowany w Rumelhart, Hinton i Williams (1986b) , ale technika ta była wielokrotnie odkrywana niezależnie i miała wielu datowanych do lat sześćdziesiątych.

Podstawy ciągłej propagacji wstecznej zostały wyprowadzone w kontekście teorii sterowania przez Henry'ego J. Kelleya w 1960 roku i przez Arthura E. Brysona w 1961 roku. Wykorzystali oni zasady programowania dynamicznego . W 1962 Stuart Dreyfus opublikował prostsze wyprowadzenie oparte jedynie na zasadzie łańcucha . Bryson i Ho opisali ją jako wielostopniową metodę dynamicznej optymalizacji systemu w 1969 roku . Propagację wsteczną wyprowadzili wielu badaczy we wczesnych latach 60-tych i wdrożył do działania na komputerach już w 1970 roku przez Seppo Linnainmaa . Paul Werbos jako pierwszy w USA zaproponował, że może być używany w sieciach neuronowych po dogłębnej analizie w swojej pracy doktorskiej z 1974 roku. Chociaż nie zastosowano go do sieci neuronowych, w 1970 roku Linnainmaa opublikował ogólną metodę automatycznego różnicowania (AD). Chociaż jest to bardzo kontrowersyjne, niektórzy naukowcy uważają, że był to w rzeczywistości pierwszy krok w kierunku opracowania algorytmu propagacji wstecznej. W 1973 Dreyfus dostosowuje parametry regulatorów proporcjonalnie do gradientów błędów. W 1974 r. Werbos wspomniał o możliwości zastosowania tej zasady do sztucznych sieci neuronowych, aw 1982 r. zastosował metodę AD Linnainmaa do funkcji nieliniowych.

Później metoda Werbosa została ponownie odkryta i opisana w 1985 roku przez Parkera, aw 1986 roku przez Rumelharta , Hintona i Williamsa . Rumelhart, Hinton i Williams pokazali eksperymentalnie, że ta metoda może generować przydatne wewnętrzne reprezentacje przychodzących danych w ukrytych warstwach sieci neuronowych. Yann LeCun zaproponował nowoczesną formę algorytmu uczenia propagacji wstecznej dla sieci neuronowych w swojej pracy doktorskiej w 1987 roku. W 1993 roku Eric Wan wygrał międzynarodowy konkurs rozpoznawania wzorców poprzez wsteczną propagację błędów.

W 2000 roku wypadł z łask, ale powrócił w 2010 roku, korzystając z tanich, wydajnych systemów obliczeniowych opartych na GPU . Dotyczy to zwłaszcza rozpoznawania mowy , widzenia maszynowego , przetwarzania języka naturalnego i badań nad uczeniem się struktur językowych (w których używa się go do wyjaśniania różnych zjawisk związanych z uczeniem się pierwszego i drugiego języka).

Zasugerowano, że wsteczna propagacja błędów wyjaśnia komponenty ERP ludzkiego mózgu , takie jak N400 i P600 .

Zobacz też

Uwagi

Bibliografia

Dalsza lektura

Zewnętrzne linki