NumPy Softmax em Python
Este tutorial explicará como implementar a função softmax usando a biblioteca NumPy em Python. A função softmax é uma forma multidimensional generalizada da função logística. É usado em regressão logística multinomial e como função de ativação em redes neurais artificiais.
A função softmax normaliza todos os elementos do array no intervalo (0,1)
para que possam ser tratados como probabilidades. A função softmax é definida pela seguinte fórmula:
Veremos os métodos para implementar a função softmax em arrays uni e bidimensionais em Python usando a biblioteca NumPy.
Função NumPy Softmax para arrays 1D em Python
Suponha que precisamos definir uma função softmax que recebe un array 1D como entrada e retorna a matriz normalizada necessária.
O problema comum que pode ocorrer ao aplicar softmax é o problema de estabilidade numérica, o que significa que ∑j e^(z_j)
pode se tornar muito grande devido ao erro exponencial e de estouro que pode ocorrer. Esse erro de estouro pode ser resolvido subtraindo cada valor do array com seu valor máximo.
Os exemplos de código abaixo demonstram a implementação original da função softmax e a implementação com subtração máxima usando a biblioteca NumPy em Python.
- Softmax original:
import numpy as np
def softmax(x):
f_x = np.exp(x) / np.sum(np.exp(x))
return f_x
- Numericamente estável softmax:
import numpy as np
def softmax(x):
y = np.exp(x - np.max(x))
f_x = y / np.sum(np.exp(x))
return f_x
Função NumPy Softmax para arrays 2D em Python
A função softmax para um array 2D realizará a transformação softmax ao longo das linhas, o que significa que o máximo e a soma serão calculados ao longo das linhas. No caso do array 1D, não precisamos nos preocupar com essas coisas; só precisávamos aplicar todas as operações no array completo.
O exemplo de código abaixo demonstra como a transformação softmax será transformada em uma entrada de array 2D usando a biblioteca NumPy em Python.
import numpy as np
def softmax(x):
max = np.max(
x, axis=1, keepdims=True
) # returns max of each row and keeps same dims
e_x = np.exp(x - max) # subtracts each row with its max value
sum = np.sum(
e_x, axis=1, keepdims=True
) # returns sum of each row and keeps same dims
f_x = e_x / sum
return f_x
Suponha que precisamos realizar a transformação softmax ao longo das colunas do array 2D; podemos fazer isso apenas pegando o transporte de entrada e saída do método softmax()
descrito acima.
Código de exemplo:
softmax(x.T).T