Softmax transforma valores reais arbitrários em probabilidades, que são muitas vezes úteis no Aprendizado de Máquina. A matemática por trás é bastante simples: dados alguns números,
- Subir e (a constante matemática) para a potência de cada um desses números.
- Subir todos os exponenciais (potências de eee). Este resultado é o denominador.
- Utilizar o exponencial de cada número como seu numerador.
- Probabilidade=NumeradorDenominador\texto{Probabilidade} = \frac{\texto{\i}}{\i1}Probabilidade=NumeradorDenominador
Escrito mais fantasticamente, Softmax executa a seguinte transformação nos números nnn x1…xnx_1 \ldots x_nx1…xn:
s(xi)=exi∑j=1nexjs(x_i) = \frac{e^{x_i}}{\sum_{j=1}^n e^{x_j}}s(xi)=∑j=1nexjexi
As saídas da transformada Softmax estão sempre no intervalo e somam até 1. Portanto, elas formam uma distribuição de probabilidade.
Um Exemplo Simples
Dizemos que temos os números -1, 0, 3, e 5. Primeiro, calculamos o denominador:
Denominador=e-1+e0+e3+e5=169.87\begin{alinhado}\texto{Denominador} &= e^{-1} + e^0 + e^3 + e^5 \\\\&= \boxed{169.87} \\\{alinhado}Denominador=e-1+e0+e3+e5=169.87
Então, podemos calcular os numeradores e probabilidades:
xxx | Numerador (exe^xex) | Probabilidade (ex169.87\frac{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 |
Quanto maior o xxx, maior a sua probabilidade. Observe também que as probabilidades somam todas até 1, como mencionado anteriormente.
Implementando Softmax em Python
Usar numpy torna isso super fácil:
import numpy as npdef softmax(xs): return np.exp(xs) / sum(np.exp(xs))xs = np.array()print(softmax(xs)) #
Nota: para usuários mais avançados, você provavelmente vai querer implementar isto usando o truque LogSumExp para evitar problemas de sub/sobrefluxo.
Por que Softmax é útil?
Imagine construindo uma Rede Neural para responder a pergunta: É esta imagem de um cão ou de um gato?
Um desenho comum para esta rede neural teria como resultado 2 números reais, um representando o cão e o outro o gato, e aplicar Softmax sobre estes valores. Por exemplo, digamos as saídas da rede :
Animal | xxx | exe^xex | Probabilidade |
---|---|---|---|
Dog | -1 | 0.368 | 0,047 |
Cat | 2 | 7,39 | 0,953 |
Isto significa que a nossa rede está 95,3% confiante de que a imagem é de um gato. Softmax nos permite responder perguntas de classificação com probabilidades, que são mais úteis que respostas mais simples (por exemplo, binário sim/não).