HOWTO · NumPy

NumPy Softmax em Python

Este tutorial demonstra como implementar a função 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:

fórmula softmax

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