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.