Поширення за допомогою Softmax / Cross Entropy


40

Я намагаюся зрозуміти, як працює розмноження для вихідного шару softmax / cross-entropy.

Помилка поперечної ентропії є

E(t,o)=jtjlogoj

з t і o в якості цілі та виходу при нейроні j відповідно. Сума знаходиться над кожним нейроном у вихідному шарі. oj сам по собі результат функції softmax:

oj=softmax(zj)=ezjjezj

І знову сума над кожним нейроном у вихідному шарі, а zj - вхід до нейрона j :

zj=iwijoi+b

Це сума над усіма нейронами попереднього шару з відповідним виходом oi та вагою wij бік нейрона j плюс зміщення b .

Тепер, щоб оновити вагу wij яка з'єднує нейрон j у вихідному шарі з нейроном i в попередньому шарі, мені потрібно обчислити часткову похідну функції помилки за допомогою ланцюгового правила:

Ewij=Eojojzjzjwij

з zj як вхід до нейрона j .

Останній термін досить простий. Оскільки між i та є лише одна вага j, похідна:

zjwij=oi

Перший член - це виведення функції помилки щодо виходу :oj

Eoj=tjoj

Середній член - це виведення функції softmax щодо введення важче:zj

ojzj=zjezjjezj

Скажімо, у нас є три вихідні нейрони, що відповідають класам тоді o b = s o f t m a x ( b ) є:a,b,cob=softmax(b)

ob=ezbez=ezbeza+ezb+ezc

та його виведення за допомогою коефіцієнта:

=softmax(b)-softmax2(b)=ob-o 2 b =ob(1-ob) Назад до середнього періоду для зворотного розповсюдження це означає: oj

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

Збираючи все це я отримую

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

tj=0

i=jij

Але я не можу з цього ніякого сенсу. Також я навіть не впевнений, чи це причина моєї помилки, через що я розміщую всі мої розрахунки. Я сподіваюся, що хтось може мені уточнити, де я щось пропускаю чи не так.


Наведені вами посилання обчислюють похідну відносно вхідних даних, тоді як ви обчислюєте похідну щодо ваг.
Дженкар

Відповіді:


35

Примітка. Я не фахівець з питань заднього плану, але зараз, прочитавши трохи, я вважаю, що наступний застереження підходить. Під час читання статей чи книг про нейронні мережі не рідкість, коли похідні можуть записуватися за допомогою суміші стандартних позначень підсумовування / індексів , матричних позначень та багатоіндексних позначень (включають гібрид останніх двох для похідних тензор-тензорів ). Зазвичай наміром є те, що це слід "розуміти з контексту", тому вам потрібно бути обережним!

Я помітив пару невідповідностей у вашому виведенні. Я не займаюся нейронними мережами насправді, тому наступне може бути невірним. Однак ось як би я вирішив цю проблему.

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

Сподіваємось, це допомагає. Чи здається цей результат більш послідовним?

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

Я не впевнений, як спільнота "Backprop / AutoDiff" справляється з цими проблемами, але я знаходжу будь-який час, коли я намагаюся приймати ярлики, я несу відповідальність робити помилки. Тож я закінчую так, як тут, записую все у вигляді підсумків із повним підписком і завжди вводячи нові підписки для кожної похідної. (Подібно до моєї відповіді тут ... Я сподіваюся, що я принаймні даю правильні результати врешті-решт!)
GeoMatt22,

Особисто я вважаю, що ви записуючи все, це набагато легше слідкувати. Результати мені здаються правильними.
Дженкар

Хоча я все ще намагаюся повністю зрозуміти кожен твій крок, я отримав кілька цінних відомостей, які допомогли мені в загальній картині. Напевно, мені потрібно детальніше ознайомитись з темою похідних та сум. Але, беручи до уваги вашу пораду, врахувати підсумки в Е, я придумав це:
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

Хоча відповідь @ GeoMatt22 правильна, я особисто вважав дуже корисним зменшити проблему на прикладі іграшки та намалювати малюнок:

Графічна модель.

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

Графічна модель з виділеним назад шляху.

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


Це те, що остаточно очистило це для мене! Відмінне та елегантне пояснення !!!!
SantoshGupta7

2
Я радий, що вам обом сподобалося та виграли, прочитавши мій пост! Також мені було корисно написати та пояснити.
Vivek Subramanian

=t1o1[o1(1o1)]h2+t2o2(o2o1)h2
замість цього?
корякінп

Ти маєш рацію - це була помилка! Я внесу зміни.
Вівек Субраманійський

Я не розумію тут те, що ви також призначаєте деяким нейронам логіти (незареєстровані бали). (o - програмні логіти (прогнози), а y - у вашому випадку). Однак це нормально не так, чи не так? Подивіться на цю картину (o_out1 - це передбачення, а o_in1 - logits), то як це можливо в цьому випадку, як можна знайти часткову похідну o2 щодо y1?
АРАТ

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

Ось одна з найчистіших і добре написаних зауважень, які я натрапив на Інтернет, де пояснюється "обчислення похідних в алгоритмі зворотного розповсюдження з функцією втрати поперечної ентропії" .


У наведеному pdf як рівняння 22 стало рівнянням 23? Як і в тому, як підсумок (k! = I) отримав негативний знак. Чи не повинен він отримати позитивний знак? Можливо, це Summation(Fn)(For All K) = Fn(k=i) + Summation(Fn)(k!=i)має відбуватися згідно мого розуміння.
фаян

1

Ось посилання, що пояснює софтмакс та його похідну.

Це пояснює причину використання i = j та i! = J.


Рекомендується надати мінімальну, окрему відповідь, у випадку, якщо в майбутньому посилання порушиться. Інакше це може більше не допомогти іншим користувачам у майбутньому.
luchonacho

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.