Softmax convierte valores reales arbitrarios en probabilidades, que suelen ser útiles en el aprendizaje automático. La matemática que hay detrás es bastante sencilla: dados unos números,
- Suma e (la constante matemática) a la potencia de cada uno de esos números.
- Suma todos los exponenciales (potencias de eee). Este resultado es el denominador.
- Usa el exponencial de cada número como su numerador.
- Probabilidad=NumeradorDenominador\text{probabilidad} = \frac{text{Numerador}}{text{Denominador}}Probabilidad=DenominadorNumerador.
Escrito de forma más fantasiosa, Softmax realiza la siguiente transformación sobre nnn números x1…xnx_1 \ldots x_nx1…xn:
s(xi)=exi∑j=1nexjs(x_i) = \frac{e^{x_i}}{suma_{j=1}^n e^{x_j}}s(xi)=∑j=1nexjexi
Los resultados de la transformación Softmax están siempre en el rango y suman 1. Por lo tanto, forman una distribución de probabilidad.
Un ejemplo sencillo
Supongamos que tenemos los números -1, 0, 3 y 5. Primero, calculamos el denominador:
Denominador=e-1+e0+e3+e5=169,87\begin{aligned}\text{Denominador} &= e^{-1} + e^0 + e^3 + e^5 \&= \boxed{169,87} \\ {alineado}Denominador=e-1+e0+e3+e5=169,87
Entonces, podemos calcular los numeradores y las probabilidades:
xxx | Numerador (exe^xex) | Probabilidad (ex169.87frac{e^x}{169.87}169.87ex) |
---|---|---|
-1 | 0.368 | 0.002 |
0 | 1 | 0.006 |
3 | 20.09 | 0.118 |
5 | 148,41 | 0,874 |
Cuanto mayor sea la xxx, mayor será su probabilidad. Además, fíjate en que todas las probabilidades suman 1, como se ha dicho antes.
Implementación de Softmax en Python
Usar numpy hace que esto sea súper fácil:
import numpy as npdef softmax(xs): return np.exp(xs) / sum(np.exp(xs))xs = np.array()print(softmax(xs)) #
Nota: para los usuarios más avanzados, probablemente querrá implementar esto usando el truco LogSumExp para evitar problemas de subdesbordamiento/sobredesbordamiento.
¿Por qué es útil Softmax?
Imagina construir una Red Neural para responder a la pregunta: ¿Es esta foto un perro o un gato?
Un diseño común para esta red neuronal tendría la salida de 2 números reales, uno representando el perro y el otro el gato, y aplicar Softmax en estos valores. Por ejemplo, digamos que la red produce :
Animal | xxx | exe^xex | Probabilidad |
---|---|---|---|
Perro | -1 | 0.368 | 0,047 |
Gato | 2 | 7,39 | 0,953 |
Esto significa que nuestra red tiene un 95,3% de confianza en que la foto es de un gato. Softmax nos permite responder a preguntas de clasificación con probabilidades, que son más útiles que las respuestas más simples (por ejemplo, sí/no binario).