66 votos

Retropropagación con Softmax / Entropía cruzada

Estoy tratando de entender cómo funciona la retropropagación para una capa de salida softmax/entropía cruzada.

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

$$E(t,o)=-\sum_j t_j \log o_j$$

con $t$ y $o$ como objetivo y la salida en la neurona $j$ respectivamente. La suma es sobre cada neurona en la capa de salida. $o_j$ es el resultado de la función softmax:

$$o_j=softmax(z_j)=\frac{e^{z_j}}{\sum_j e^{z_j}}$$

De nuevo, la suma es sobre cada neurona en la capa de salida y $z_j$ es la entrada a la neurona $j$ :

$$z_j=\sum_i w_{ij}o_i+b$$

Es la suma de todas las neuronas de la capa anterior con su correspondiente salida $o_i$ y el peso $w_{ij}$ hacia la neurona $j$ más un sesgo $b$ .

Ahora, para actualizar un peso $w_{ij}$ 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 utilizando la regla de la cadena:

$$\frac{\partial E} {\partial w_{ij}}=\frac{\partial E} {\partial o_j} \frac{\partial o_j} {\partial z_{j}} \frac{\partial z_j} {\partial w_{ij}}$$

con $z_j$ como entrada a la neurona $j$ .

El último término es bastante sencillo. Como sólo hay un peso entre $i$ y $j$ la derivada es:

$$\frac{\partial z_j} {\partial w_{ij}}=o_i$$

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

$$\frac{\partial E} {\partial o_j} = \frac{-t_j}{o_j}$$

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

$$\frac{\partial o_j} {\partial z_{j}}=\frac{\partial} {\partial z_{j}} \frac{e^{z_j}}{\sum_j e^{z_j}}$$

Digamos que tenemos tres neuronas de salida correspondientes a las clases $a,b,c$ entonces $o_b = softmax(b)$ es:

$$o_b=\frac{e^{z_b}}{\sum e^{z}}=\frac{e^{z_b}}{e^{z_a}+e^{z_b}+e^{z_c}} $$

y su derivación mediante la regla del cociente:

$$\frac{\partial o_b} {\partial z_{b}}=\frac{e^{z_b}*\sum e^z - (e^{z_b})^2}{(\sum_j e^{z})^2}=\frac{e^{z_b}}{\sum e^z}-\frac{(e^{z_b})^2}{(\sum e^z)^2}$$ $$=softmax(b)-softmax^2(b)=o_b-o_b^2=o_b(1-o_b)$$ Volver al término medio de la retropropagación significa: $$\frac{\partial o_j} {\partial z_{j}}=o_j(1-o_j)$$

Juntando todo esto obtengo

$$\frac{\partial E} {\partial w_{ij}}= \frac{-t_j}{o_j}*o_j(1-o_j)*o_i=-t_j(1-o_j)*o_i$$

lo que significa que si el objetivo de esta clase es $t_j=0$ Entonces no actualizaré los pesos para esto. Eso no suena bien.

Investigando sobre esto encontré que la gente tiene dos variantes para la derivación de softmax, una donde $i=j$ y el otro para $i\ne j$ como ici o ici .

Pero no puedo encontrarle sentido a esto. Además ni siquiera estoy seguro de que esta sea la causa de mi error, por eso estoy publicando todos mis cálculos. Espero que alguien me pueda aclarar en qué me estoy perdiendo algo o me estoy equivocando.

54voto

GeoMatt22 Puntos 1290

Nota: No soy un experto en backprop, pero ahora que he leído un poco, creo que la siguiente advertencia es apropiada. Cuando se leen documentos o libros en las redes neuronales, no es raro que los derivados se escriban utilizando una mezcla del notación de suma/índice , notación matricial y notación multiíndice (incluya un híbrido de los dos últimos para las derivadas tensoriales). Normalmente la intención es que esto se "entienda por el contexto", ¡así que hay que tener cuidado!

Me he dado cuenta de un par de incoherencias en tu derivación. No hago redes neuronales realmente, así que lo siguiente puede ser incorrecto. Sin embargo, así es como yo haría el problema.

En primer lugar, hay que tener en cuenta la suma en $E$ y no se puede asumir que cada término sólo depende de un peso. Así que tomando el gradiente de $E$ con respecto al componente $k$ de $z$ tenemos $$E=-\sum_jt_j\log o_j\implies\frac{\partial E}{\partial z_k}=-\sum_jt_j\frac{\partial \log o_j}{\partial z_k}$$

Entonces, expresando $o_j$ como $$o_j=\tfrac{1}{\Omega}e^{z_j} \,,\, \Omega=\sum_ie^{z_i} \implies \log o_j=z_j-\log\Omega$$ tenemos $$\frac{\partial \log o_j}{\partial z_k}=\delta_{jk}-\frac{1}{\Omega}\frac{\partial\Omega}{\partial z_k}$$ donde $\delta_{jk}$ es el Delta de Kronecker . Entonces el gradiente del denominador softmax es $$\frac{\partial\Omega}{\partial z_k}=\sum_ie^{z_i}\delta_{ik}=e^{z_k}$$ que da $$\frac{\partial \log o_j}{\partial z_k}=\delta_{jk}-o_k$$ o, ampliando el registro $$\frac{\partial o_j}{\partial z_k}=o_j(\delta_{jk}-o_k)$$ Nótese que la derivada es con respecto a $z_k$ , un arbitrario componente de $z$ que da el $\delta_{jk}$ término ( $=1$ sólo cuando $k=j$ ).

Así que el gradiente de $E$ con respecto a $z$ es entonces $$\frac{\partial E}{\partial z_k}=\sum_jt_j(o_k-\delta_{jk})=o_k\left(\sum_jt_j\right)-t_k \implies \frac{\partial E}{\partial z_k}=o_k\tau-t_k$$ donde $\tau=\sum_jt_j$ es constante (para un determinado $t$ vectorial).

Esto muestra una primera diferencia con su resultado: el $t_k$ ya no se multiplica $o_k$ . Obsérvese que para el caso típico en el que $t$ es "one-hot" tenemos $\tau=1$ (como se indica en su primer enlace).

Una segunda incoherencia, si lo he entendido bien, es que el " $o$ "que se introduce en $z$ parece poco probable que sea el " $o$ " que sale del softmax. Me parece que tiene más sentido que esto esté realmente "más atrás" en la arquitectura de la red?

Llamando a este vector $y$ entonces tenemos $$z_k=\sum_iw_{ik}y_i+b_k \implies \frac{\partial z_k}{\partial w_{pq}}=\sum_iy_i\frac{\partial w_{ik}}{\partial w_{pq}}=\sum_iy_i\delta_{ip}\delta_{kq}=\delta_{kq}y_p$$

Por último, para obtener el gradiente de $E$ con respecto a la matriz de pesos $w$ utilizamos la regla de la cadena $$\frac{\partial E}{\partial w_{pq}}=\sum_k\frac{\partial E}{\partial z_k}\frac{\partial z_k}{\partial w_{pq}}=\sum_k(o_k\tau-t_k)\delta_{kq}y_p=y_p(o_q\tau-t_q)$$ dando la expresión final (suponiendo una $t$ es decir $\tau=1$ ) $$\frac{\partial E}{\partial w_{ij}}=y_i(o_j-t_j)$$ donde $y$ es la entrada en el nivel más bajo (de su ejemplo).

Así que esto muestra una segunda diferencia con respecto a su resultado: el " $o_i$ "debe ser presumiblemente del nivel inferior $z$ que yo llamo $y$ en lugar del nivel superior $z$ (que es $o$ ).

Espero que esto ayude. ¿Le parece que este resultado es más consistente?

Actualización: En respuesta a una pregunta de la OP en los comentarios, he aquí una ampliación del primer paso. En primer lugar, hay que tener en cuenta que la regla de la cadena vectorial requiere sumas (véase ici ). En segundo lugar, para estar seguro de obtener todo componentes del gradiente, siempre se debe introducir un nuevo letra de subíndice para el componente en el denominador de la derivada parcial. Así que para escribir completamente el gradiente con la regla de la cadena completa, tenemos $$\frac{\partial E}{\partial w_{pq}}=\sum_i \frac{\partial E}{\partial o_i}\frac{\partial o_i}{\partial w_{pq}}$$ y $$\frac{\partial o_i}{\partial w_{pq}}=\sum_k \frac{\partial o_i}{\partial z_k}\frac{\partial z_k}{\partial w_{pq}}$$ así que $$\frac{\partial E}{\partial w_{pq}}=\sum_i \left[ \frac{\partial E}{\partial o_i}\left(\sum_k \frac{\partial o_i}{\partial z_k}\frac{\partial z_k}{\partial w_{pq}}\right) \right]$$ En la práctica, las sumas completas se reducen, porque se obtiene una gran cantidad de $\delta_{ab}$ términos. Aunque implica muchas sumas y subíndices "extra", el uso de la regla de la cadena completa garantizará que siempre se obtenga el resultado correcto.

33voto

Dave Puntos 21

Aunque la respuesta de @GeoMatt22 es correcta, a mí personalmente me resultó muy útil reducir el problema a un ejemplo de juguete y hacer un dibujo:

Graphical model.

A continuación, definí las operaciones que cada nodo calculaba, tratando el $h$ y $w$ como entradas a una "red" ( $\mathbf{t}$ es un vector de un solo golpe que representa la etiqueta de clase del punto de datos):

$$L=-t_1\log o_1 -t_2\log o_2$$ $$o_1 = \frac{\exp(y_1)}{\exp(y_1) + \exp(y_2)}$$ $$o_2 = \frac{\exp(y_2)}{\exp(y_1) + \exp(y_2)}$$ $$y_1 = w_{11}h_1 + w_{21}h_2 + w_{31}h_3$$ $$y_2 = w_{12}h_1 + w_{22}h_2 + w_{32}h_3$$

Digamos que quiero calcular la derivada de la pérdida con respecto a $w_{21}$ . Puedo usar mi imagen para trazar el camino desde la pérdida hasta el peso que me interesa (eliminé la segunda columna de $w$ para mayor claridad):

Graphical model with highlighted backwards path.

Entonces, sólo puedo calcular las derivadas deseadas. Obsérvese que hay dos caminos a través de $y_1$ que conducen a $w_{21}$ , por lo que necesito sumar las derivadas que pasan por cada una de ellas.

$$\frac{\partial L}{\partial o_1} = -\frac{t_1}{o_1}$$ $$\frac{\partial L}{\partial o_2} = -\frac{t_2}{o_2}$$ $$\frac{\partial o_1}{\partial y_1} = \frac{\exp(y_1)}{\exp(y_1) + \exp(y_2)} - \left(\frac{\exp(y_1)}{\exp(y_1) + \exp(y_2)}\right)^2 = o_1(1 - o_1)$$ $$\frac{\partial o_2}{\partial y_1} = \frac{-\exp(y_2)\exp(y_1)}{(\exp(y_1) + \exp(y_2))^2} = -o_2o_1$$ $$\frac{\partial y_1}{\partial w_{21}} = h_2$$

Por último, la regla de la cadena: \begin{align} \frac{\partial L}{\partial w_{21}} &= \frac{\partial L}{\partial o_1}\frac{\partial o_1}{\partial y_1}\frac{\partial y_1}{\partial w_{21}} + \frac{\partial L}{\partial o_2}\frac{\partial o_2}{\partial y_1}\frac{\partial y_1}{\partial w_{21}}\\ &= \frac{-t_1}{o_1}[o_1(1 - o_1)]h_2 + \frac{-t_2}{o_2}(-o_2 o_1)h_2\\ &= h_2(t_2 o_1 - t_1 + t_1 o_1)\\ &= h_2(o_1(t_1 + t_2) - t_1)\\ &= h_2(o_1 - t_1) \end{align}

Tenga en cuenta que en el último paso, $t_1 + t_2 = 1$ porque el vector $\mathbf{t}$ es un vector de un solo punto.

7voto

BeginnerUser Puntos 1

En lugar del $\{o_i\},\,$ Quiero una letra cuya mayúscula se distinga visualmente de su minúscula. Así que voy a sustituirla por $\{y_i\}$ . Además, vamos a utilizar la variable $\{p_i\}$ para designar el $\{o_i\}$ de la capa anterior.

Dejemos que $Y$ sea la matriz diagonal cuya diagonal es igual al vector $y$ es decir $$Y={\rm Diag}(y)$$ Utilizando esta nueva variable matricial y la Producto interior de Frobenius podemos calcular el gradiente de $E$ wrt $W$ . $$\eqalign{ z &= Wp+b &dz= dWp \cr y &= {\rm softmax}(z) &dy = (Y-yy^T)\,dz \cr E &= -t:\log(y) &dE = -t:Y^{-1}dy \cr\cr dE &= -t:Y^{-1}(Y-yy^T)\,dz \cr &= -t:(I-1y^T)\,dz \cr &= -t:(I-1y^T)\,dW\,p \cr &= (y1^T-I)tp^T:dW \cr &= ((1^Tt)yp^T - tp^T):dW \cr\cr \frac{\partial E}{\partial W} &= (1^Tt)yp^T - tp^T \cr }$$

2voto

limefartlek Puntos 81

La pregunta original se responde en este post Derivada de la activación Softmax -Alijah Ahmed . Sin embargo, escribo esto para aquellos que han venido aquí por la cuestión general de Backpropagation con Softmax y Cross-Entropy.

$$ \mathbf { \bbox[10px, border:2px solid red] { \color{red}{ \begin{aligned} a^0 \rightarrow \bbox[5px, border:2px solid black] { \underbrace{\text{hidden layers}}_{a^{l-2}} } \,\rightarrow \bbox[5px, border:2px solid black] { \underbrace{w^{l-1} a^{l-2}+b^{l-1}}_{z^{l-1} } } \,\rightarrow \bbox[5px, border:2px solid black] { \underbrace{\sigma(z^{l-1})}_{a^{l-1}} } \,\rightarrow \bbox[5px, border:2px solid black] { \underbrace{w^l a^{l-1}+b^l}_{z^{l}/logits } } \,\rightarrow \bbox[5px, border:2px solid black] { \underbrace{P(z^l)}_{\vec P/ \text{softmax} /a^{l}} } \,\rightarrow \bbox[5px, border:2px solid black] { \underbrace{L ( \vec P, \vec Y)}_{\text{CrossEntropyLoss}} } \end{aligned} }}} $$

Pérdida de entropía cruzada derivada wrto Peso en la última capa

$$ \mathbf { \frac {\partial L}{\partial w^l} = \color{red}{\frac {\partial L}{\partial z^l}}.\color{green}{\frac {\partial z^l}{\partial w^l}} \rightarrow \quad EqA1 } $$

Donde $$ \mathbf { L = -\sum_k y_k \log \color{red}{p_k} \,\,and \,p_j = \frac {e^ \color{red}{z_j}} {\sum_k e^{z_k}} } $$

A raíz de Derivada de la activación Softmax -Alijah Ahmed para la primera legislatura

$$ \color{red} { \begin{aligned} \frac {\partial L}{\partial z_i} = \frac {\partial ({-\sum_j y_k \log {p_k})}}{\partial z_i} \\ \\ \text {taking the summation outside} \\ \\ = -\sum_j y_k\frac {\partial ({ \log {p_k})}}{\partial z_i} \\ \\ \color{black}{ \text {since } \frac{d}{dx} (f(g(x))) = f'(g(x))g'(x) } \\ \\ = -\sum_k y_k * \frac {1}{p_k} *\frac {\partial { p_k}}{\partial z_i} \end{aligned} } $$ El último término $\frac {\partial { p_k}}{\partial z_i}$ es la derivada de Softmax wrto sus entradas también llamadas logits. Esto es fácil de derivar y hay muchos sitios que lo describen. Ejemplo
Derivativo de SoftMax Antoni Parellada . La derivada más rigurosa a través de la matriz jacobiana es la siguiente La función Softmax y su derivada-Eli Bendersky

$$ \color{red} { \begin{aligned} \frac {\partial { p_i}}{\partial z_i} = p_i(\delta_{ij} -p_j) \\ \\ \delta_{ij} = 1 \text{ when i =j} \\ \delta_{ij} = 0 \text{ when i} \ne \text{j} \end{aligned} } $$ Usando esto de arriba y repitiendo tal cual de Derivada de la activación Softmax -Alijah Ahmed obtenemos lo siguiente $$ \color{red} { \begin{aligned} \frac {\partial L}{\partial z_i} = -\sum_k y_k * \frac {1}{p_k} *\frac {\partial { p_k}}{\partial z_i} \\ \\ =-\sum_k y_k * \frac {1}{p_k} * p_i(\delta_{ij} -p_j) \\ \\ \text{these i and j are dummy indices and we can rewrite this as} \\ \\ =-\sum_k y_k * \frac {1}{p_k} * p_k(\delta_{ik} -p_i) \\ \\ \text{taking the two cases and adding in above equation } \\ \\ \delta_{ij} = 1 \text{ when i =k} \text{ and } \delta_{ij} = 0 \text{ when i} \ne \text{k} \\ \\ = [- \sum_i y_i * \frac {1}{p_i} * p_i(1 -p_i)]+[-\sum_{k \ne i} y_k * \frac {1}{p_k} * p_k(0 -p_i) ] \\ \\ = [- y_i * \frac {1}{p_i} * p_i(1 -p_i)]+[-\sum_{k \ne i} y_k * \frac {1}{p_k} * p_k(0 -p_i) ] \\ \\ = [- y_i(1 -p_i)]+[-\sum_{k \ne i} y_k *(0 -p_i) ] \\ \\ = -y_i + y_i.p_i + \sum_{k \ne i} y_k.p_i \\ \\ = -y_i + p_i( y_i + \sum_{k \ne i} y_k) \\ \\ = -y_i + p_i( \sum_{k} y_k) \\ \\ \text {note that } \sum_{k} y_k = 1 \, \text{as it is a One hot encoded Vector} \\ \\ = p_i - y_i \\ \\ \frac {\partial L}{\partial z^l} = p_i - y_i \rightarrow \quad \text{EqA.1.1} \end{aligned} } $$

Ahora tenemos que calcular el segundo término, para completar la ecuación

$$ \begin{aligned} \frac {\partial L}{\partial w^l} = \color{red}{\frac {\partial L}{\partial z^l}}.\color{green}{\frac {\partial z^l}{\partial w^l}} \\ \\ \\ \color{green}{\frac {\partial z^l}{\partial w^l} = a^{l-1}} \text{ as } z^{l} = (w^l a^{l-1}+b^l) \\ \\ \text{Putting all together} \\ \\ \frac {\partial L}{\partial w^l} = (p_i - y_i) *a^{l-1} \quad \rightarrow \quad \mathbf {EqA1} \end{aligned} $$

Usando el descenso de gradiente podemos seguir ajustando la última capa como

$$ w{^l}{_i} = w{^l}{_i} -\alpha * \frac {\partial L}{\partial w^l} $$

Ahora hagamos la derivación para las capas internas, que es donde ocurre la magia de la regla de la cadena

Derivada de la pérdida de peso wrto en las capas internas

El truco aquí es derivar la Pérdida wr a la capa interna como una composición de la derivada parcial que calculamos antes.

$$ \begin{aligned} \frac {\partial L}{\partial w^{l-1}} = \color{blue}{\frac {\partial L}{\partial z^{l-1}}}. \color{green}{\frac {\partial z^{l-1}}{\partial w^{l-1}}} \rightarrow \text{EqA.2} \\ \\ \text{the trick is to represent the first part in terms of what we computed earlier; in terms of } \color{blue}{\frac {\partial L}{\partial z^{l}}} \\ \\ \color{blue}{\frac {\partial L}{\partial z^{l-1}}} = \color{blue}{\frac {\partial L}{\partial z^{l}}}. \frac {\partial z^{l}}{\partial a^{l-1}}. \frac {\partial a^{l-1}}{\partial z^{l-1}} \rightarrow \text{ EqMagic} \\ \\ \color{blue}{\frac {\partial L}{\partial z^{l}}} = \color{blue}{(p_i- y_i)} \text{ from the previous layer (from EqA1.1) } \\ \\ z^l = w^l a^{l-1}+b^l \text{ which makes } {\frac {\partial z^{l} }{\partial a^{l-1}} = w^l} \text{ and } a^{l-1} = \sigma (z^{l-1}) \text{ which makes } \frac {\partial a^{l-1}}{\partial z^{l-1}} = \sigma \color{red}{'} (z^{l-1} ) \\ \\ \text{ Putting together we get the first part of Eq A.2 } \\ \\ \color{blue}{\frac {\partial L}{\partial z^{l-1}}} =\color{blue}{(p_i- y_i)}.w^l.\sigma \color{red}{'} (z^{l-1} ) \rightarrow \text{EqA.2.1 } \\ \\ \text{Value of EqA.2.1 to be used in the next layer derivation in EqMagic)} \\ \\ z^{l-1} = w^{l-1} a^{l-2}+b^{l-1} \text{ which makes } \color{green}{\frac {\partial z^{l-1}}{\partial w^{l-1}}=a^{l-2}} \\ \\ \frac {\partial L}{\partial w^{l-1}} = \color{blue}{\frac {\partial L}{\partial z^{l-1}}}. \color{green}{\frac {\partial z^{l-1}}{\partial w^{l-1}}} = \color{blue}{(p_i- y_i)}.w^l.\sigma \color{red}{'} (z^{l-1} ). \color{green}{a^{l-2}} \end{aligned} $$ Descargo de responsabilidad Vemos que con la Regla de la Cadena podemos escribir una expresión que parece correcta; y es correcta en la notación del índice. Sin embargo, cuando implementamos con un caso real, con la ecuación anterior, sus pesos no coincidirán. Esto se debe al hecho de que tenemos que convertir de la notación de índice a la notación de la matriz, y allí algunos productos de la matriz tienen que ser escritos como producto de Hadamard $\odot$ . Sin tener una idea de esto, no se puede entender completamente. Un manual de notación de índices John Crimaldi y El cálculo matricial que necesitas para el aprendizaje profundo Terence,Jermy

0voto

unohoo Puntos 1

Otras respuestas han proporcionado la forma correcta de calcular la derivada, pero no señalan dónde te has equivocado. De hecho, $t_j$ es siempre 1 en tu última ecuación, porque has asumido que $o_j$ toma ese nodo del objetivo 1 en su salida; $o_j$ de otros nodos tienen diferentes formas de función de probabilidad, por lo que conducen a diferentes formas de derivación, por lo que ahora debe entender por qué otras personas han tratado $i=j$ y $i\neq j $ de manera diferente.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X