NumPy Softmax in Python

Muhammad Waiz Khan 15 febbraio 2024
  1. Funzione NumPy Softmax per array 1D in Python
  2. Funzione NumPy Softmax per array 2D in Python
NumPy Softmax in Python

Questo tutorial spiegherà come implementare la funzione softmax utilizzando la libreria NumPy in Python. La funzione softmax è una forma multidimensionale generalizzata della funzione logistica. Viene utilizzato nella regressione logistica multinomiale e come funzione di attivazione nelle reti neurali artificiali.

La funzione softmax normalizza tutti gli elementi dell’array nell’intervallo (0,1) in modo che possano essere trattati come probabilità. La funzione softmax è definita dalla seguente formula:

formula softmax

Esamineremo i metodi per implementare la funzione softmax su array unidimensionali e bidimensionali in Python utilizzando la libreria NumPy.

Funzione NumPy Softmax per array 1D in Python

Supponiamo di dover definire una funzione softmax che accetta un array 1D come input e restituisce l’array normalizzato richiesto.

Il problema comune che può verificarsi durante l’applicazione di softmax è il problema di stabilità numerica, il che significa che ∑j e^(z_j) può diventare molto grande a causa dell’errore esponenziale e di overflow che può verificarsi. Questo errore di overflow può essere risolto sottraendo ogni valore dell’array con il suo valore massimo.

Gli esempi di codice seguenti dimostrano l’implementazione originale della funzione softmax e l’implementazione con la sottrazione massima utilizzando la libreria NumPy in Python.

  • Softmax originale:
import numpy as np


def softmax(x):

    f_x = np.exp(x) / np.sum(np.exp(x))
    return f_x
  • Softmax numericamente stabile:
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

Funzione NumPy Softmax per array 2D in Python

La funzione softmax per un array 2D eseguirà la trasformazione softmax lungo le righe, il che significa che il massimo e la somma verranno calcolati lungo le righe. Nel caso dell’array 1D, non dovevamo preoccuparci di queste cose; dovevamo solo applicare tutte le operazioni sull’array completo.

L’esempio di codice seguente mostra come la trasformazione softmax verrà trasformata su un input di array 2D utilizzando la libreria NumPy in 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

Supponiamo di dover eseguire la trasformazione softmax lungo le colonne dell’array 2D; possiamo farlo semplicemente prendendo il trasporto di input e output del metodo softmax() descritto sopra.

Codice di esempio:

softmax(x.T).T