Derivada de la Capa Softmax
Derivada de la función Softmax respecto a su entrada
Queremos calcular la derivada de la salida de la softmax con respecto a cada entrada
Para simplificar, vamos a llamar y a la salida y x a la entrada
y=Softmax(x)
Entonces y es un vector:
y=ex1+...+exc[ex1,...,exc]=N[ex1,...,exc]
Y cada elemento de y se define como
yi(x)=ex1+...+excexi
Cada entrada afecta a varias salidas, por la normalización (N). Entonces la derivada de la salida y respecto a una entrada entrada xj es un vector:
dxjdy=[dxjdy1,...,dxjdyi,...,dxjdyc]=[dxjdNex1,...,dxjdNexi,...dxjdNexc]
Entonces, buscamos dxjdyi. Para eso tenemos que separar en dos casos:
- i=j : x_j aparece tanto en el numerador como en el denominador )
- i=j, x_j aparece solo en el denominador
En ambos casos usaremos la Regla del cociente para derivar, donde si f(x)=h(x)g(x), entonces f′(x)=h(x)²g′(x)h(x)−g(x)h′(x).
En el 2do caso es más fácil porque el numerador es constante con respecto a xj, entonces $f′(x)=g(x)h(x)²−h′(x). Empezamos con este caso más simple:
dxjdyi=N2−exjexi=N−exjNexi=−yiyjif i=j
En el caso i=j, tenemos entonces:
dxjdyi=N2exiN−exiexj=N2exiN−N2exiexj=Nexi−NexiNexj=yi−yiyj=(1−yj)yi=(1−yi)yiif i=j
Finalmente entonces
dxjdyi={−yiyj(1−yi)yiif i=jif i=j
Dado que tenemos c entradas y c salidas, podemos escribir una matriz (la matriz Jacobiana) con las derivadas parciales de cada elemento de y con respecto a cada elemento de x
dxdy=⎝⎜⎜⎜⎛dx1dy1dx1dy2...dx1dycdx2dy1dx2dy2...dx2dyc............dxcdy1dxcdy2...dxcdyc⎠⎟⎟⎟⎞=⎝⎜⎜⎛(1−y1)y1−y2y1...−ycy1−y1y2−(1−y2)y2...−ycy2............−y1yc−y2yc...(1−yc)yc⎠⎟⎟⎞=⎝⎛(1−y1)−y2...−yc−y1(1−y2)...−yc............−y1−y2...(1−yc)⎠⎞∗⎝⎛y1y1...y1y2y2...y2............ycyc...yc⎠⎞=(I−(y1y2...ycy1y2...yc............y1y2...yc))∗(y1y1...y1y2y2...y2............ycyc...yc)
Si bien es posible calcular las derivadas en forma matricial, en general este enfoque puede utilizar mucha memoria. En lugar de eso, se puede calcular cada columna de esta matriz por separado, utilizando O(c) espacio en lugar de O(c²), y de esa forma ir calculando la derivada de y con respecto a cada xj por separado.
Derivada del Error respecto de la entrada a la Softmax
En una Capa Softmax, para realizar backpropagation debemos poder calcular dxdE es decir, las derivadas del error respecto de las entradas. Podemos hacerlo en base a dydE, las derivadas del error respecto de la salida, y la fórmula que derivamos para dxdy.
Podemos de nuevo enfocarnos en una entrada xj. Como cada entrada afecta a varias salidas, vamos a tener que sumar todas las contribuciones de xjdy1, xjdy2, … xjdyc.
Cada uno de estos términos indica la derivada de yi respecto de xj, pero no la derivada de E respecto de xj. Para eso, vamos a tener que usar la regla de la cadena:
xjdE=dydExjdy=i=1∑cdyidExjdyi
En donde dyidE es simplemente el elemento i-ésimo del vector dydE que recibimos, y ya tenemos una fórmula para xjdyi:
dxjdyi={−yiyj(1−yi)yiif i=jif i=j
Notemos también que esta igualdad nos dice que podemos calcular el producto punto o matricial entre dydE y xjdy para obtener dxjdE:
dydExjdy=np.dot(dydE,xjdy)
Otros recursos
Podés consultar también otros recursos complementarios para entender la derivada. Cuidado porque algunos no solo tratan la derivada de la softmax respecto de su entrada, sino que tratan también la derivada de Softmax(wx+b) respecto de w y b, o la derivada de CrossEntropy(Softmax(x)) respecto de x, que son otros casos. Nosotros, en cambio, seguimos un enfoque modular aplicable al diseño de redes por capas.