45 votos

Capa Softmax en una red neuronal

Estoy intentando añadir una capa softmax a una red neuronal entrenada con backpropagation, por lo que estoy intentando calcular su gradiente.

La salida del softmax es $h_j = \frac{e^{z_j}}{\sum{e^{z_i}}}$ donde $j$ es el número de neuronas de salida.

Si lo derivo entonces obtengo

$\frac{\partial{h_j}}{\partial{z_j}}=h_j(1-h_j)$

Similar a la regresión logística. Sin embargo, esto es incorrecto ya que mi comprobación de gradiente numérico falla.

¿Qué estoy haciendo mal? Se me ocurre que tengo que calcular también las derivadas cruzadas (es decir $\frac{\partial{h_j}}{\partial{z_k}}$ ) pero no estoy seguro de cómo hacerlo y mantener la misma dimensión del gradiente para que encaje en el proceso de retropropagación.

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".

45voto

nixgeek Puntos 624

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.

1 votos

Con $\vec{\sigma_l} = (\sigma_{l,1}, \sigma_{l,2}, ..., \sigma_{l,k})$ es $\sigma_{l,j} = \frac{\partial C}{\partial z_j}$ ? (sólo intento entender qué es "el gradiente" en este caso)

0 votos

Sí, eso es correcto.

0 votos

¿Podría alguien explicar qué son los términos delta en minúsculas en el Delta de Kronecker y cómo calcularlos?

17voto

zowens Puntos 1417

Cada salida del softmax depende de todas las entradas, por lo que el gradiente es efectivamente una matriz jacobiana completa. Has calculado correctamente $\partial_j h_j = \frac{\partial h_j}{\partial z_j}=h_j(1-h_j)$ pero también necesitas $\partial_k h_j=-h_jh_k$ si $j \neq k$ . Supongo que si puedes derivar la primera expresión, deberías poder derivar fácilmente la segunda también.

No estoy seguro de cuál es el problema que ves con la retropropagación: en la capa softmax tienes $j$ salidas y $j$ entradas, por lo que un error de cada salida debería propagarse a cada entrada, y precisamente por eso se necesita el jacobiano completo. Por otro lado, normalmente se tendría una función de coste asociada a la salida del softmax, por ejemplo $$C=-\sum_j t_j \log h_j, $$ donde $t_j$ son sus salidas deseadas (cuando se hace la clasificación, entonces a menudo uno de ellos es igual a 1, y otros a 0). Entonces, de hecho, usted está interesado en $\frac{\partial C}{\partial z_j}$ que puede calcularse con una regla de la cadena que da lugar a una expresión nítida, y es efectivamente un vector (no una matriz).

1 votos

Intentaré describir mejor mi problema, según por ejemplo este tutorial ufldl.stanford.edu/wiki/index.php/Agoritmo de retropropagación En el caso de los pesos, tengo que multiplicar por elementos los pesos y el delta con la derivada (paso número 3). Así que si tengo la matriz jacobiana completa, las dimensiones no se ajustan. Gracias.

0 votos

¿Sabes cómo proceder si no es un softmax, sino una capa oculta habitual? Imagina que cada unidad de esta capa recibe entradas de todas las unidades de la capa anterior (es decir, esta capa está "totalmente conectada"), lo que suele ser el caso. Entonces también hay que retropropagar los errores a través de esta capa, y las derivadas también forman una matriz jacobiana. Si estás confundido sobre cómo hacerlo, entonces tu confusión no está relacionada con softmax.

1 votos

Lo he implementado con éxito para las capas lineal y sigmoidea porque la derivada es un vector por lo que no he tenido problemas con las dimensiones.

16voto

jpmuc Puntos 4817

La derivada está mal. Debería serlo,

$$\frac{\partial h_{j}}{\partial z_{k}} = h_{j}\delta_{kj}-h_{j}h_{k}$$

comprueba de nuevo tus cálculos. Además, la expresión dada por ameba para la entropía cruzada no es del todo correcta. Para un conjunto de muestras de datos extraídos de $C$ diferentes clases, dice,

$$-\sum_{n}\sum_{k=1}^{C}t_{k}^{n}\ln y_{k}(\boldsymbol{x}^{n})$$

donde el superíndice recorre el conjunto de la muestra, $t_{k}^{n}$ es el valor del k-ésimo componente del objetivo para la n-ésima muestra. Aquí se asume que se utiliza un esquema de codificación 1-de-C, es decir, $t_{k}^{n}$ . En este caso, todos los t son cero, excepto el componente que representa su clase correspondiente, que es uno.

Nótese que las t son constantes. Por lo tanto, minimizar este funcional es equivalente a minimizar,

$$-\sum_{n}\sum_{k=1}^{C}t_{k}^{n}\ln y_{k}(\boldsymbol{x}^{n}) + \sum_{n}\sum_{k=1}^{C}t_{k}^{n}\ln t_{k}^{n} = -\sum_{n}\sum_{k=1}^{C}t_{k}^{n}\ln \frac{y_{k}(\boldsymbol{x}^{n})}{t_{k}^{n}}$$

que tiene la ventaja de que el jacobiano adopta una forma muy conveniente, a saber

$$\frac{\partial E}{\partial z_{j}} = h_{j}-t_{j}$$

Te recomiendo que consigas una copia de Bishop's Redes neuronales para el reconocimiento de patrones . En mi opinión, sigue siendo el mejor libro sobre redes neuronales.

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