NumPy Softmax em Python

Muhammad Waiz Khan 15 fevereiro 2024
  1. Função NumPy Softmax para arrays 1D em Python
  2. Função NumPy Softmax para arrays 2D em Python
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:

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