Capa Softmax en una red neuronal


43

Estoy tratando de agregar una capa softmax a una red neuronal entrenada con retropropagación, así que estoy tratando de calcular su gradiente.

La salida de softmax es hj=ezjezi dondejes el número de neurona de salida.

Si lo obtengo, me sale

hjzj=hj(1hj)

Similar a la regresión logística. Sin embargo, esto está mal ya que mi verificación numérica de gradiente falla.

¿Qué estoy haciendo mal? Pensé que también necesitaba calcular las derivadas cruzadas (es decir, hjzk ) pero no estoy seguro de cómo hacer esto y mantener la dimensión del gradiente igual para que se ajuste al proceso de propagación hacia atrás.


3
Debe mejorar el título de su pregunta, ya que no se trata de agregar una capa softmax general a un NN, ya que su pregunta es específica sobre cómo falla la verificación de gradiente. Sugiero cambiar el título a "¿Por qué la propagación hacia atrás deja de funcionar correctamente cuando agrego una capa softmax a mi red neuronal?".
Charlie Parker

Respuestas:


43

Me siento un poco mal por dar mi propia respuesta para esto porque está bien capturado por la ameba y la juampa, excepto tal vez la intuición final sobre cómo el jacobiano puede reducirse a un vector.

Derivaste correctamente el gradiente de la diagonal de la matriz jacobiana, lo que quiere decir que

hizj=hi(1hj):i=j

y como lo dijo la ameba, también tienes que derivar las entradas diagonales del jacobiano, que producen

hizj=hihj:ij

Estas dos definiciones de conceptos se pueden combinar convenientemente usando una construcción llamada el Delta de Kronecker , por lo que la definición del gradiente se convierte en

hizj=hi(δijhj)

Entonces el jacobiano es una matriz cuadrada [J]ij=hi(δijhj)

Toda la información hasta este punto ya está cubierta por ameba y juampa. El problema es, por supuesto, que necesitamos obtener los errores de entrada de los errores de salida que ya están calculados. Como el gradiente del error de salida depende de todas las entradas, entonces el gradiente de la entrada x i eshixi

[x]k=i=1hi,k

Dada la matriz jacobiana definida anteriormente, esto se implementa trivialmente como el producto de la matriz y el vector de error de salida:

σl=Jσl+1

Si la capa softmax es su capa de salida, entonces combinarla con el modelo de costo de entropía cruzada simplifica el cálculo simplemente

σl=ht

donde es el vector de etiquetas, y h es la salida de la función softmax. La forma simplificada no solo es conveniente, sino que también es extremadamente útil desde el punto de vista de la estabilidad numérica.th


con , es σ l , j = Cσl=(σl,1,σl,2,...,σl,k) ? (solo tratando de dar sentido a lo que es 'el gradiente' en este caso)σl,j=Czj
Alexandre Holden Daly

Si, eso es correcto.
Mranz

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

Estoy atrapado en este problema por un tiempo. Para aclarar. Tienes un vector (pre softmax) y luego calculas softmax. Como los valores de softmax dependen de todos los valores de entrada, se necesita la matriz jacobiana real. Luego tomas la matriz jacobiana y sumas reduces las filas para obtener un solo vector de fila, que usas para el descenso de gradiente como de costumbre. ¿Es todo esto 100% correcto?
harveyslash

14

La derivada está mal. Debería ser,

hjzk=hjδkjhjhk

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

nk=1Ctknlnyk(xn)

donde el superíndice se ejecuta sobre el conjunto de muestras, es el valor del componente k-ésimo del objetivo para la n-ésima muestra. Aquí se supone que está utilizando un esquema de codificación 1-de-C, es decir, . En tal caso, todas las t son cero, excepto el componente que representa su clase correspondiente, que es una.tkntkn

Tenga en cuenta que las t son constantes. Por lo tanto, minimizar este funcional es equivalente a minimizar,

nk=1Ctknlnyk(xn)+nk=1Ctknlntkn=nk=1Ctknlnyk(xn)tkn

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

Ezj=hjtj

Le recomendaría que obtenga una copia de Bishop's Neural Networks for Pattern Recognition . En mi humilde opinión sigue siendo el mejor libro sobre redes neuronales.


14

Cada salida del softmax depende de todas las entradas, por lo que el gradiente es de hecho una matriz jacobiana completa. correctamente , pero también necesita si . Supongo que si puedes derivar la primera expresión, también deberías poder derivar fácilmente la segunda.jhj=hjzj=hj(1hj)khj=hjhkjk

No estoy seguro de qué problema ve con la propagación inversa: en la capa softmax tiene salidas y entradas, por lo que un error de cada salida debe propagarse a cada entrada, y esa es precisamente la razón por la que necesita todo el jacobiano. Por otro lado, normalmente tendría una función de costo asociada con la salida de softmax, por ejemplo, donde son sus salidas deseadas (cuando realiza la clasificación, a menudo una de ellas es igual a 1 , y otros a 0). Entonces, de hecho, está interesado en , que se puede calcular con una regla de cadena que resulta en una expresión ordenada, y de hecho es un vector (no una matriz).jj

C=jtjloghj,
tjCzj

1
Intentaré describir mejor mi problema, de acuerdo con, por ejemplo, este tutorial ufldl.stanford.edu/wiki/index.php/Backpropagation_Algorithm , necesito multiplicar los pesos y delta por elementos con el derivado (paso número 3). Entonces, si tengo la matriz jacobiana completa, las dimensiones no se ajustan. Gracias.
Corrió el

¿Sabes cómo proceder si no es un softmax, sino una capa oculta habitual? Imagine que cada unidad en esta capa obtiene entradas de todas las unidades de la capa anterior (es decir, esta capa está "completamente conectada"), que normalmente es el caso. Luego, también debe propagar de nuevo los errores a través de esta capa, y las derivadas también forman una matriz jacobiana. Si está confundido acerca de cómo hacerlo, entonces su confusión no está relacionada con softmax.
ameba dice Reinstate Monica

1
Lo implementé con éxito para capas lineales y sigmoideas porque la derivada es un vector, por lo que no tuve problemas con las dimensiones.
Corrió el

Lo siento, Ran, tal vez solo estoy siendo estúpido, pero si tienes una capa sigmoidea completamente conectada a la capa anterior, entonces la salida (o entrada) a cada unidad tendrá derivada con respecto a la conexión entrante de cada unidad en el capa anterior, es decir, todas las derivadas forman una matriz 2D, n'est-ce pas? ji
ameba dice Reinstate Monica
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.