Me siento un poco mal por dar mi propia respuesta a esto porque está bastante bien plasmada por ameba y juampa, salvo quizás la intuición final sobre cómo el Jacobiano puede reducirse a un vector.
Has obtenido correctamente el gradiente de la diagonal de la matriz jacobiana, es decir
$ {\partial h_i \over \partial z_j}= h_i(1-h_j)\;\;\;\;\;\;: i = j $
y, tal y como dijo ameba, también hay que derivar las entradas fuera de la diagonal del jacobiano, que dan como resultado
$ {\partial h_i \over \partial z_j}= -h_ih_j\;\;\;\;\;\;: i \ne j $
Estas dos definiciones de conceptos pueden combinarse convenientemente utilizando una construcción llamada Delta de Kronecker por lo que la definición del gradiente se convierte en
$ {\partial h_i \over \partial z_j}= h_i(\delta_{ij}-h_j) $
Así que el jacobiano es una matriz cuadrada $ \left[J \right]_{ij}=h_i(\delta_{ij}-h_j) $
Toda la información hasta este punto ya está cubierta por ameba y juampa. El problema es, por supuesto, que tenemos que conseguir la entrada de los errores de salida ya calculados. Como el gradiente del error de salida $\nabla h_i$ depende de todas las entradas, entonces el gradiente de la entrada $x_i$ es
$[\nabla x]_k = \sum\limits_{i=1} \nabla h_{i,k} $
Dada la matriz jacobiana definida anteriormente, esto se implementa trivialmente como el producto de la matriz y el vector de error de salida:
$ \vec{\sigma_l} = J\vec{\sigma_{l+1}} $
Si la capa softmax es su capa de salida, entonces la combinación con el modelo de coste de entropía cruzada simplifica el cálculo a simplemente
$ \vec{\sigma_l} = \vec{h}-\vec{t} $
donde $\vec{t}$ es el vector de etiquetas, y $\vec{h}$ es la salida de la función softmax. La forma simplificada no sólo es conveniente, sino que también es extremadamente útil desde el punto de vista de la estabilidad numérica.
3 votos
Deberías mejorar el título de tu pregunta ya que no se trata de añadir una capa general de softmax a una NN, ya que tu pregunta es específica sobre cómo falla la comprobación del gradiente. Te sugiero que cambies el título por "Por qué la retropropagación deja de funcionar correctamente cuando añado una capa softmax a mi red neuronal".