Propagacja wsteczna z Softmax / Cross Entropy


40

Próbuję zrozumieć, jak działa propagacja wsteczna dla warstwy wyjściowej softmax / cross-entropii.

Funkcja błędu entropii krzyżowej to

E(t,o)=jtjlogoj

z t i o jako celem i wyjściem odpowiednio w neuronie j . Suma jest nad każdym neuronem w warstwie wyjściowej. oj jest wynikiem funkcji softmax:

oj=softmax(zj)=ezjjezj

Ponownie, suma jest nad każdym neuronem w warstwie wyjściowej, a zj jest wejściem do neuronu j :

zj=iwijoi+b

Jest to suma po wszystkich neuronów w poprzedniej warstwy odpowiadającego mocy oi i masy wij wobec neuronów j plus polaryzacji b .

Teraz, aby zaktualizować wagę wij która łączy neuron j w warstwie wyjściowej z neuronem i w poprzedniej warstwie, muszę obliczyć częściową pochodną funkcji błędu za pomocą reguły łańcucha:

Ewij=Eojojzjzjwij

z zj jako wejście do neuronu j .

Ostatni termin jest dość prosty. Ponieważ między i i występuje tylko jedna waga j, pochodna jest następująca:

zjwij=oi

Pierwszy termin to wyprowadzenie funkcji błędu w odniesieniu do wyjścia :oj

Eoj=tjoj

Środkowy składnik to wyprowadzenie funkcji softmax w odniesieniu do jej wejścia jest trudniejsze:zj

ojzj=zjezjjezj

Powiedzmy, że mamy trzy neurony wyjściowe odpowiadające klasom a następnie o b = s o f t m a x ( b ) wynosi:a,b,cob=softmax(b)

ob=ezbez=ezbeza+ezb+ezc

i jego wyprowadzenie przy użyciu reguły ilorazowej:

=softmax(b)-softmax2(b)=ob-o 2 b =ob(1-ob) Powrót do terminu średniego w przypadku propagacji wstecznej oznacza to: oj

obzb=ezbez(ezb)2(jez)2=ezbez(ezb)2(ez)2
=softmax(b)softmax2(b)=obob2=ob(1ob)
ojzj=oj(1oj)

Zestawiam to wszystko razem

Ewij=tjojoj(1oj)oi=tj(1oj)oi

co oznacza, że ​​jeśli celem tej klasy jest , to nie zaktualizuję wag dla tego. To nie brzmi dobrze.tj=0

i=jij

Ale nie mogę tego zrozumieć. Nie jestem nawet pewien, czy to jest przyczyną mojego błędu, dlatego publikuję wszystkie moje obliczenia. Mam nadzieję, że ktoś może mi wyjaśnić, gdzie coś mi brakuje lub idzie źle.


Podane linki obliczają pochodną względem danych wejściowych, podczas gdy obliczasz pochodną względem wag.
Jenkar

Odpowiedzi:


35

Uwaga: Nie jestem ekspertem od backprop, ale teraz, gdy przeczytałem trochę, uważam, że poniższe zastrzeżenie jest właściwe. Podczas czytania gazety lub książki na temat sieci neuronowych, nie jest rzadkością w przypadku pochodnych być napisane przy użyciu mieszanki standardowej notacji podsumowanie / index , notacji macierzowej i notacja wielowskaźnikowa (to hybryda dwóch ostatnich instrumentów pochodnych tensor-tensorowych ). Zazwyczaj chodzi o to, że należy to „rozumieć z kontekstu”, więc musisz być ostrożny!

Zauważyłem kilka niespójności w twoim pochodzeniu. Tak naprawdę nie robię sieci neuronowych, więc poniższe informacje mogą być niepoprawne. Oto, jak bym poradził sobie z tym problemem.

EEkz

E=jtjlogojEzk=jtjlogojzk

oj

oj=1Ωezj,Ω=iezilogoj=zjlogΩ
logojzk=δjk1ΩΩzk
δjk
Ωzk=ieziδik=ezk
logojzk=δjkok
ojzk=oj(δjkok)
zkzδjk=1k=j

Ez

Ezk=jtj(okδjk)=ok(jtj)tkEzk=okτtk
τ=jtjt

tkoktτ=1

ozo

y

zk=iwikyi+bkzkwpq=iyiwikwpq=iyiδipδkq=δkqyp

Ew

Ewpq=kEzkzkwpq=k(okτtk)δkqyp=yp(oqτtq)
tτ=1
Ewij=yi(ojtj)
y

oizyzo

Mam nadzieję, że to pomaga. Czy ten wynik wydaje się bardziej spójny?

Ewpq=iEoioiwpq
oiwpq=koizkzkwpq
Ewpq=i[Eoi(koizkzkwpq)]
δab

Nie jestem pewien, w jaki sposób społeczność „Backprop / AutoDiff” rozwiązuje te problemy, ale za każdym razem, gdy próbuję używać skrótów, mogę popełniać błędy. W końcu robię tak, jak tutaj, pisząc wszystko w kategoriach podsumowań z pełnym indeksowaniem i zawsze wprowadzając nowe indeksy dla każdej pochodnej. (Podobna do mojej odpowiedzi tutaj ... Mam nadzieję, że przynajmniej podam poprawne wyniki!)
GeoMatt22,

Osobiście uważam, że zapisywanie wszystkiego znacznie ułatwia śledzenie. Wyniki wyglądają dla mnie poprawnie.
Jenkar

Chociaż nadal staram się w pełni zrozumieć każdy z twoich kroków, uzyskałem cenne informacje, które pomogły mi w uzyskaniu ogólnego obrazu. Chyba muszę przeczytać więcej na temat pochodnych i sum. Ale biorąc pod uwagę twoją radę, aby wziąć pod uwagę sumę w E, wymyśliłem to:
micha,

oj1=ezj1Ωoj1=ezj1Ω
Ω=ezj1+ezj2
E=(t1logoj1+t2logoj2)=(t1(zj1log(Ω))+t2(zj2log(Ω)))
E(zj1=(t1t1ezj1Ωt2ezj2Ω)=t1+oj1(t1+t2)

Ewij=Eojojzjzjwij
Ewij=Ezjzjwij
oj

12

Chociaż odpowiedź @ GeoMatt22 jest poprawna, osobiście uważam, że bardzo przydatne jest zredukowanie problemu do przykładu zabawki i narysowanie obrazu:

Model graficzny.

hwt

L=t1logo1t2logo2
o1=exp(y1)exp(y1)+exp(y2)
o2=exp(y2)exp(y1)+exp(y2)
y1=w11h1+w21h2+w31h3
y2=w12h1+w22h2+w32h3

w21w

Model graficzny z podświetloną ścieżką do tyłu.

y1w21

Lo1=t1o1
Lo2=t2o2
o1y1=exp(y1)exp(y1)+exp(y2)(exp(y1)exp(y1)+exp(y2))2=o1(1o1)
o2y1=exp(y2)exp(y1)(exp(y1)+exp(y2))2=o2o1
y1w21=h2

Lw21=Lo1o1y1y1w21+Lo2o2y1y1w21=t1o1[o1(1o1)]h2+t2o2(o2o1)h2=h2(t2o1t1+t1o1)=h2(o1(t1+t2)t1)=h2(o1t1)

t1+t2=1t


To ostatecznie mnie wyjaśniło! Doskonałe i eleganckie wyjaśnienie !!!!
SantoshGupta7

2
Cieszę się, że oboje dobrze się bawiliście i czytaliście mój post! Pomogło mi również napisać to i wyjaśnić.
Vivek Subramanian

=t1o1[o1(1o1)]h2+t2o2(o2o1)h2
zamiast ?
koryakinp

Masz rację - to była literówka! Dokonam zmiany.
Vivek Subramanian

Nie rozumiem tutaj, że przypisujesz logi (nieskalowane wyniki) do niektórych neuronów. (o to logiki softmaksymalne (prognozy), a y to logity w twoim przypadku). Jednak tak się zwykle nie dzieje, prawda? Spójrz na to zdjęcie (o_out1 to predykcja, a o_in1 to logity), więc jak to możliwe w tym przypadku, jak znaleźć częściową pochodną o2 w odniesieniu do y1?
ARAT

6

{oi},{yi}{pi}{oi}

Yy

Y=Diag(y)
EW
z=Wp+bdz=dWpy=softmax(z)dy=(YyyT)dzE=t:log(y)dE=t:Y1dydE=t:Y1(YyyT)dz=t:(I1yT)dz=t:(I1yT)dWp=(y1TI)tpT:dW=((1Tt)ypTtpT):dWEW=(1Tt)ypTtpT

6

Oto jedna z najczystszych i dobrze napisanych notatek, które natrafiłem na Internet, która wyjaśnia „obliczanie pochodnych w algorytmie propagacji wstecznej z funkcją utraty entropii krzyżowej” .


Jak w równaniu 22 równanie 22 stało się równaniem 23? Jak w przypadku, gdy sumowanie (k! = I) uzyskało znak ujemny. Czy to nie powinno mieć pozytywnego znaku? Podobnie Summation(Fn)(For All K) = Fn(k=i) + Summation(Fn)(k!=i)powinno się dziać zgodnie z moim zrozumieniem.
faizan

1

Oto link wyjaśniający softmax i jego pochodną.

Wyjaśnia powód używania i = j oraz i! = J.


Zaleca się udzielenie minimalnej, samodzielnej odpowiedzi, na wypadek, gdyby łącze zostało zerwane w przyszłości. W przeciwnym razie może to nie pomóc innym użytkownikom w przyszłości.
luchonacho

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.