Backpropagation con Softmax / Cross Entropy


40

Estoy tratando de entender cómo funciona la retropropagación para una capa de salida softmax / cross-entropy.

La función de error de entropía cruzada es

E(t,o)=jtjlogoj

con t y o como objetivo y salida en la neurona j , respectivamente. La suma está sobre cada neurona en la capa de salida. oj sí es el resultado de la función softmax:

oj=softmax(zj)=ezjjezj

Nuevamente, la suma está sobre cada neurona en la capa de salida y zj es la entrada a la neurona j :

zj=iwijoi+b

Esa es la suma de todas las neuronas en la capa anterior con su correspondiente salida oi y peso wij hacia la neurona j más un sesgo b .

Ahora, para actualizar un peso wij que conecta una neurona j en la capa de salida con una neurona i en la capa anterior, necesito calcular la derivada parcial de la función de error usando la regla de la cadena:

Ewij=Eojojzjzjwij

con zj como entrada a la neurona j .

El último término es bastante simple. Como solo hay un peso entre i y j , la derivada es:

zjwij=oi

El primer término es la derivación de la función de error con respecto a la salida :oj

Eoj=tjoj

El término medio es la derivación de la función softmax con respecto a su entrada es más difícil:zj

ojzj=zjezjjezj

Digamos que tenemos tres neuronas de salida correspondientes a las clases , entonces o b = s o f t m a x ( b ) es:a,b,cob=softmax(b)

ob=ezbez=ezbeza+ezb+ezc

y su derivación usando la regla del cociente:

=softmax(b)-softmax2(b)=ob-o 2 b =ob(1-ob) Volver al término medio para retropropagación esto significa: oj

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

Poniendo todo junto consigo

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

lo que significa que si el objetivo para esta clase es , entonces no actualizaré los pesos para esto. Eso no suena bien.tj=0

Investigando sobre esto encontré personas que tienen dos variantes para la derivación de softmax, una donde y la otra para i j , como aquí o aquí .i=jij

Pero no puedo entender esto. Además, ni siquiera estoy seguro de si esta es la causa de mi error, por eso publico todos mis cálculos. Espero que alguien pueda aclararme dónde me falta algo o si sale mal.


Los enlaces que ha proporcionado están calculando la derivada relativa a la entrada, mientras que está calculando la derivada relativa a los pesos.
Jenkar

Respuestas:


35

Nota: No soy un experto en backprop, pero ahora que he leído un poco, creo que la siguiente advertencia es apropiada. Al leer periódicos o libros sobre redes neuronales, no es raro que los derivados sean escritos utilizando una combinación de la norma de notación de sumatoria / índice , notación matricial , y la notación multi-índice (incluya un híbrido de los dos últimos de los derivados del tensor tensor ) Por lo general, la intención es que esto debe "entenderse desde el contexto", por lo que debe tener cuidado.

Noté un par de inconsistencias en tu derivación. Realmente no hago redes neuronales, por lo que lo siguiente puede ser incorrecto. Sin embargo, así es como abordaría el problema.

Primero, debe tener en cuenta la suma en , y no puede asumir que cada término solo depende de un peso. Entonces, tomando el gradiente de E con respecto al componente k de z , tenemos E = - j t j log o jEEkz

E=jtjlogojEzk=jtjlogojzk

Luego, expresando como o j = 1oj tenemos log o j

oj=1Ωezj,Ω=iezilogoj=zjlogΩ
dondeδjkes eldelta de Kronecker. Entonces el gradiente del softmax-denominador es Ω
logojzk=δjk1ΩΩzk
δjk que da logoj
Ωzk=ieziδik=ezk
o, expandiendo el log oj
logojzk=δjkok
Tenga en cuenta que la derivada es con respecto azk, uncomponentearbitrariodez, que da eltérminoδjk(=1solo cuandok=j).
ojzk=oj(δjkok)
zkzδjk=1k=j

Entonces el gradiente de con respecto a z es entonces EEz donde τ=jtjes constante (para unvectortdado).

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

Esto muestra una primera diferencia con respecto a su resultado: la ya no se multiplica o k . Tenga en cuenta que para el caso típico donde t es "one-hot" tenemos τ = 1 (como se indica en su primer enlace).tkoktτ=1

Una segunda inconsistencia, si entiendo correctamente, es que la " " que se ingresa en z parece poco probable que sea la " o " que sale del softmax. ¿Creo que tiene más sentido que esto realmente esté "más atrás" en la arquitectura de red?ozo

Llamando a este vector y , entonces tenemos

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

Finalmente, para obtener el gradiente de con respecto a la matriz de peso w , usamos la regla de la cadena EEw dando la expresión final (suponiendo untcaliente, es decir,τ=1) E

Ewpq=kEzkzkwpq=k(okτtk)δkqyp=yp(oqτtq)
tτ=1 dondeyes la entrada en el nivel más bajo (de su ejemplo).
Ewij=yi(ojtj)
y

oizyzo

Espero que esto ayude. ¿Este resultado parece más consistente?

Ewpq=iEoioiwpq
oiwpq=koizkzkwpq
so
Ewpq=i[Eoi(koizkzkwpq)]
In practice the full summations reduce, because you get a lot of δab terms. Although it involves a lot of perhaps "extra" summations and subscripts, using the full chain rule will ensure you always get the correct result.

I am not certain how the "Backprop/AutoDiff" community does these problems, but I find any time I try to take shortcuts, I am liable to make errors. So I end up doing as here, writing everything out in terms of summations with full subscripting, and always introducing new subscripts for every derivative. (Similar to my answer here ... I hope I am at least giving correct results in the end!)
GeoMatt22

I personally find that you writing everything down makes it much easier to follow. The results look correct to me.
Jenkar

Although I'm still trying to fully understand each of your steps, I got some valuable insights that helped me with the overall picture. I guess I need to read more into the topic of derivations and sums. But taking your advise to take account of the summation in E, I came up with this:
micha

for two outputs oj1=ezj1Ω and oj1=ezj1Ω with
Ω=ezj1+ezj2
the cross entropy error is
E=(t1logoj1+t2logoj2)=(t1(zj1log(Ω))+t2(zj2log(Ω)))
Then the derivative is
E(zj1=(t1t1ezj1Ωt2ezj2Ω)=t1+oj1(t1+t2)
which conforms with your result... taking in account that you didn't have the minus sign before the error sum
micha

But a further question I have is: Instead of
Ewij=Eojojzjzjwij
which is generally what your introduced to with backpropagation, you calculated:
Ewij=Ezjzjwij
as like to cancel out the oj . Why is this way leading to the right result?
micha

12

While @GeoMatt22's answer is correct, I personally found it very useful to reduce the problem to a toy example and draw a picture:

Graphical model.

I then defined the operations each node was computing, treating the h's and w's as inputs to a "network" (t is a one-hot vector representing the class label of the data point):

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

Say I want to calculate the derivative of the loss with respect to w21. I can just use my picture to trace back the path from the loss to the weight I'm interested in (removed the second column of w's for clarity):

Graphical model with highlighted backwards path.

Then, I can just calculate the desired derivatives. Note that there are two paths through y1 that lead to w21, so I need to sum the derivatives that go through each of them.

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

Finally, putting the chain rule together:

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

Note that in the last step, t1+t2=1 because the vector t is a one-hot vector.


This is what finally cleared this up for me! Excellent and Elegant explanation!!!!
SantoshGupta7

2
I’m glad you both enjoyed and benefited from reading my post! It was also helpful for me to write it out and explain it.
Vivek Subramanian

@VivekSubramanian should it be
=t1o1[o1(1o1)]h2+t2o2(o2o1)h2
instead ?
koryakinp

You’re right - it was a typo! I will make the change.
Vivek Subramanian

The thing i do not understand here is that you also assign logits (unscaled scores) to some neurons. (o is softmaxed logits (predictions) and y is logits in your case). However, this is not the case normally, is not it? Look at this picture ( o_out1 is prediction and o_in1 is logits) so how is it possible in this case how can you find the partial derivative of o2 with respect to y1?
ARAT

6

In place of the {oi}, I want a letter whose uppercase is visually distinct from its lowercase. So let me substitute {yi}. Also, let's use the variable {pi} to designate the {oi} from the previous layer.

Let Y be the diagonal matrix whose diagonal equals the vector y, i.e.

Y=Diag(y)
Using this new matrix variable and the Frobenius Inner Product we can calculate the gradient of E wrt W.
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

Here is one of the cleanest and well written notes that I came across the web which explains about "calculation of derivatives in backpropagation algorithm with cross entropy loss function".


In the given pdf how did equation 22 become equation 23? As in how did the Summation(k!=i) get a negative sign. Shouldn't it get a positive sign? Like Summation(Fn)(For All K) = Fn(k=i) + Summation(Fn)(k!=i) should be happening according to my understanding.
faizan

1

Here's a link explaining the softmax and its derivative.

It explains the reason for using i=j and i!=j.


It is recommended to provide a minimal, stand-alone answer, in case that link gets broken in the future. Otherwise, this might no longer help other users in the future.
luchonacho

0

Other answers have provided the correct way of calculating the derivative, but they do not point out where you have gone wrong. In fact, tj is always 1 in your last equation, cause you have assumed that oj takes that node of target 1 in your output; oj of other nodes have different forms of probability function, thus lead to different forms of derivative, so you should now understand why other people have treated i=j and ij differently.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.