Softmax
Softmax converte un vettore di logit in probabilità la cui somma è pari a uno. Include la formula, la temperatura, la stabilità numerica, l’attenzione e il codice.
Softmax è una funzione che trasforma un vettore di punteggi grezzi, detti logit, in una distribuzione di probabilità: ogni valore in uscita è compreso tra 0 e 1 e la somma delle uscite è esattamente 1. Per un vettore z, calcola softmax(z)ᵢ = e^(zᵢ) / Σⱼ e^(zⱼ), elevando ogni punteggio a potenza e dividendolo per la somma di tutti gli esponenziali. Softmax è il livello di uscita standard delle reti neurali che selezionano una classe tra molte; trasforma i punteggi di somiglianza in pesi all'interno del meccanismo di attenzione dei Transformer e converte i punteggi di un modello linguistico sul proprio vocabolario in probabilità del token successivo. Il nome riflette il fatto che è una versione regolare e differenziabile dell'argmax, che assegnerebbe tutta la probabilità al punteggio più alto.
Come funziona Softmax#
L'esponenziale rende positivo ogni output e amplifica le differenze tra i punteggi, perciò il logit più alto riceve una quota sproporzionata della probabilità. Softmax conserva l'ordine dei logit, quindi il punteggio più alto ottiene sempre la probabilità più alta. Contano solo le differenze tra i logit: aggiungere la stessa costante a ogni logit lascia invariato l'output. Le librerie sfruttano questa proprietà per la stabilità numerica sottraendo il logit massimo prima di calcolare l'esponenziale, poiché e¹⁰⁰⁰ causa un overflow in virgola mobile a 32 bit.
Una temperatura T controlla quanto è concentrata la distribuzione: softmax(z / T). I valori di T inferiori a 1 rendono la distribuzione più concentrata sulla classe principale, mentre quelli superiori a 1 la appiattiscono verso una distribuzione uniforme. La stessa formula compare nella meccanica statistica come distribuzione di Boltzmann, dove T è letteralmente la temperatura. Il frammento di codice PyTorch qui sotto mostra entrambi gli effetti:
import torch
logits = torch.tensor([2.0, 1.0, 0.1])
# Divide logits by a temperature before softmax: low sharpens, high flattens
for temperature in [0.5, 1.0, 2.0]:
probs = torch.softmax(logits / temperature, dim=0)
print(f"T={temperature}: {[round(p, 3) for p in probs.tolist()]}")
# Adding a constant leaves softmax unchanged, so libraries subtract the max to avoid overflow
big = logits + 1000
naive = big.exp() / big.exp().sum()
print(f"Naive: {naive.tolist()}, torch.softmax: {[round(p, 3) for p in torch.softmax(big, dim=0).tolist()]}")Con T = 1, i logit 2.0, 1.0 e 0.1 diventano [0.659, 0.242, 0.099]. Dimezzando la temperatura, si ottiene una distribuzione più concentrata: [0.864, 0.117, 0.019]; raddoppiandola, invece, la distribuzione si appiattisce: [0.502, 0.304, 0.194]. Aggiungendo 1.000 a ogni logit, la formula ingenua va in overflow e stampa [nan, nan, nan], mentre torch.softmax restituisce comunque [0.659, 0.242, 0.099].
Softmax nell'addestramento#
I classificatori vengono addestrati usando insieme softmax e la funzione di perdita entropia incrociata. La perdita è −log(pᵧ), il logaritmo negativo della probabilità assegnata alla classe corretta y, e il suo gradiente rispetto ai logit è semplicemente p − y, cioè le probabilità previste meno l'etichetta one-hot. Per questo i framework combinano le due operazioni: CrossEntropyLoss di PyTorch riceve logit grezzi e calcola internamente log-softmax, un metodo più stabile che calcolare il logaritmo di probabilità calcolate separatamente. Un modello addestrato in questo modo restituisce logit; softmax viene applicata solo quando servono le probabilità in inferenza.
Dove si usa Softmax#
- Classificazione delle immagini: Il livello finale di un classificatore produce un logit per ogni classe e softmax li trasforma nei punteggi di confidenza visualizzati dall'utente.
- Attenzione: I Transformer calcolano softmax(QKᵀ / √dₖ) sui punteggi di somiglianza tra una query e ogni chiave, così che i pesi di attenzione di ciascun token sommino a 1. La divisione per √dₖ impedisce ai punteggi di crescere con la dimensione e di saturare softmax.
- Generazione di testo: Un modello linguistico di grandi dimensioni (LLM) applica softmax a un vocabolario di decine o centinaia di migliaia di token a ogni passaggio; la temperatura di campionamento è la T descritta sopra. Il campionamento nucleus estrae quindi i token dal più piccolo insieme le cui probabilità raggiungono una soglia.
- Apprendimento per rinforzo: Applicare softmax ai valori delle azioni produce una policy che in genere sceglie l'azione migliore, continuando però a esplorare le altre; la temperatura regola il compromesso tra esplorazione e sfruttamento.
I modelli di classificazione YOLO26 applicano softmax alla testa di classificazione in inferenza e l'attributo probs di ogni risultato contiene la distribuzione completa sulle 1.000 classi ImageNet:
from ultralytics import YOLO
# Load a YOLO26 classification model trained on ImageNet
model = YOLO("yolo26n-cls.pt")
results = model("https://ultralytics.com/images/bus.jpg")
# probs holds the softmax output of the classification head
probs = results[0].probs
for index, conf in zip(probs.top5, probs.top5conf.tolist()):
print(f"{results[0].names[index]}: {conf:.3f}")
print(f"Sum over all 1,000 classes: {probs.data.sum().item():.3f}")Stampa le cinque classi più probabili con le relative probabilità; la somma delle probabilità di tutte le 1.000 classi risulta pari a 1.000 perché la testa restituisce una distribuzione softmax.
Softmax e funzioni correlate#
- Sigmoid: Comprime indipendentemente ogni punteggio nell'intervallo da 0 a 1, quindi le uscite non devono necessariamente sommare a 1. Sigmoid è adatta ai problemi binari e multietichetta, ad esempio quando un'immagine contiene sia una persona sia uno zaino; anche i rilevatori di oggetti valutano comunemente ogni classe con questa funzione. Con due classi, softmax equivale esattamente a una sigmoid della differenza tra i due logit.
- Argmax: Restituisce l'indice del punteggio più alto, una decisione netta priva di gradiente. Softmax mantiene lo stesso ordinamento ma resta differenziabile, quindi può essere usata nell'addestramento; applicare argmax alle probabilità softmax restituisce lo stesso risultato di argmax sui logit.
- Log-softmax: Il logaritmo di softmax, calcolato direttamente per garantire la stabilità e utilizzato dalla funzione di perdita entropia incrociata.
- Scalatura della temperatura: Un metodo di calibrazione che stima una singola temperatura sui dati di validazione dopo l'addestramento, affinché le probabilità softmax corrispondano alla frequenza con cui il modello ha effettivamente ragione. Non modifica la classe prevista, perché dividere ogni logit per lo stesso valore positivo T ne mantiene l'ordine.










