Backprop przez warstwy Max-Pooling?

62

Jest to małe pytanie koncepcyjne, które dręczy mnie od dłuższego czasu: Jak możemy propagować wstecz przez warstwę max-pooling w sieci neuronowej?

Natknąłem się na warstwy o maksymalnej puli podczas omawiania tego samouczka dla biblioteki nn Torch 7. Biblioteka streszcza obliczenia gradientu i przebiegi do przodu dla każdej warstwy głębokiej sieci. Nie rozumiem, w jaki sposób wykonuje się obliczenia gradientu dla warstwy maksymalnej puli.

Wiem, że jeśli masz wejście wchodzące do neuronu i warstwy l , to δ i l (zdefiniowane jako δ i l = Ezililδil ) podaje: δil=θδil=Ezil

δil=θ(zil)jδjl+1wi,jl,l+1

Tak więc, warstwa maks pulowania otrzymałby „S kolejnej warstwy, jak zwykle; jednak ponieważ funkcja aktywacji neuronów max-łączenie wykonuje się w wektorze wartości (na której maxes) jako wejście δ , że L nie jest jeden numer więcej, ale wektora ( θδjl+1δilbędą musiały być zastąpioneθ( { oo j l } )). Ponadtoθ, będąc funkcją maksimum, nie różni się pod względem swoich danych wejściowych.θ(zjl)θ({zjl})θ

Więc .... jak to powinno działać dokładnie?

shinvu
źródło

Odpowiedzi:

58

Nie ma gradientu w stosunku do wartości maksymalnych, ponieważ ich nieznaczna zmiana nie wpływa na wynik. Ponadto maks. Jest lokalnie liniowe ze spadkiem 1, w odniesieniu do sygnału wejściowego, który faktycznie osiąga maks. Tak więc gradient od następnej warstwy jest przekazywany z powrotem tylko do tego neuronu, który osiągnął maks. Wszystkie pozostałe neurony mają zerowy gradient.

δili{δjl+1}i=argmaxi(zil)

abora
źródło
7
No tak, nie ma sensu propagować wstecz przez neurony nie-maksymalne - to był kluczowy wgląd. Więc jeśli teraz rozumiem to poprawnie, propagacja wsteczna przez warstwę puli maksimum po prostu wybiera maksimum. neuron z poprzedniej warstwy (na której dokonano maksymalizacji puli) i kontynuuje propagację wsteczną tylko przez to.
shinvu
Ale czy nie trzeba pomnożyć przez pochodną funkcji aktywacji?
Jason
1
@Jason: Funkcja max jest lokalnie liniowa dla aktywacji, która uzyskała maksimum, więc jej pochodna jest stała 1. Dla aktywacji, które jej nie przeszły, jest to 0. Jest to koncepcyjnie bardzo podobne do różnicowania ReLU (x ) = funkcja aktywacji maks. (0, x).
Chrigi
Jaki krok jest mniejszy niż szerokość jądra dla maksymalnej puli?
Vatsal
1
Świetna odpowiedź! Co z przypadkiem krawędzi, w którym wiele wpisów ma tę samą wartość maksymalną (na przykład 2 wartości mają 0 z ReLU, a pozostałe dwa są ujemne)?
DankMasterDan
6

Max Pooling

Załóżmy, że masz warstwę P, która jest na wierzchu warstwy PR. Następnie podanie do przodu będzie wyglądać mniej więcej tak:

Pi=f(jWijPRj)

Pi

grad(PRj)=igrad(Pi)fWij

f=idf=0f=1f=0

grad(PRmax neuron)=igrad(Pi)Wi max neuron

grad(PRothers)=0.

patapouf_ai
źródło
2

Odpowiedź Shinvu jest dobrze napisana, chciałbym wskazać na wideo, które wyjaśnia gradient operacji Max () i to na grafie obliczeniowym, który jest szybki do zrozumienia.!

podczas implementacji operacji maxpool (węzeł obliczeniowy w grafie obliczeniowym - Twoja architektura NN) potrzebujemy funkcji, która tworzy macierz „maski”, która śledzi, gdzie jest maksimum macierzy. True (1) wskazuje pozycję maksimum w X, pozostałe wpisy to False (0). Śledzimy pozycję maksimum, ponieważ jest to wartość wejściowa, która ostatecznie wpłynęła na wynik, a zatem i na koszt. Backprop oblicza gradienty w odniesieniu do kosztu, więc wszystko, co wpływa na ostateczny koszt, powinno mieć niezerowy gradient. Zatem backprop „propaguje” gradient z powrotem do tej konkretnej wartości wejściowej, która wpłynęła na koszt.

anu
źródło