Polydesk-logotype
Polydesk.ai — Header

Softmax

Softmax est une fonction d’activation qui transforme un vecteur de valeurs brutes (logits) en une distribution de probabilités dont la somme vaut exactement 1. Chaque élément de la sortie représente la probabilité que l’entrée appartienne à une classe donnée. C’est la fonction standard pour la couche de sortie de tout classifieur multi-classes et le mécanisme fondamental par lequel les LLM prédisent le prochain token.

Prenons un réseau de neurones qui classifie des images en 3 catégories (chat, chien, oiseau). La dernière couche produit des logits bruts : [2.0, 1.0, 0.1]. Ces valeurs n’ont pas de signification probabiliste directe. Softmax les transforme en [0.659, 0.242, 0.099]. Maintenant, on peut dire : 65,9 % de chances que ce soit un chat, 24,2 % un chien, 9,9 % un oiseau. La somme fait bien 1,0.

Softmax en bref
Formule
softmax(xᵢ) = eˣⁱ / Σⱼ eˣʲ
Plage de sortie
(0, 1) pour chaque élément, somme = 1
Usage principal
Couche de sortie multi-classes, prédiction de tokens dans les LLM
Paramètre clé
Température T (contrôle la « dureté » de la distribution)
Perte associée
Cross-entropy (entropie croisée)
Alternative
Sigmoïde (pour binaire ou multi-label)

La formule softmax décortiquée

Pour un vecteur de logits z = [z₁, z₂, …, zₖ], la probabilité de la classe i est :

softmax(zᵢ) = eᶻⁱ / (eᶻ¹ + eᶻ² + ... + eᶻᵏ)

L’exponentielle e transforme chaque logit en un nombre positif (même les logits négatifs deviennent positifs). La division par la somme de toutes les exponentielles normalise le résultat pour que la somme fasse 1. Le logit le plus élevé obtient la probabilité la plus forte, mais les autres logits, même négatifs, conservent une probabilité non nulle.

Exemple chiffré avec les logits [2.0, 1.0, 0.1] :

e² ≈ 7,389. e¹ ≈ 2,718. e⁰·¹ ≈ 1,105. Somme ≈ 11,212. Probabilités : 7,389/11,212 ≈ 0,659 ; 2,718/11,212 ≈ 0,242 ; 1,105/11,212 ≈ 0,099. Total : 0,659 + 0,242 + 0,099 = 1,000.

Stabilité numérique

En pratique, les logits peuvent être très grands (par exemple, [1000, 999, 998]). Calculer e¹⁰⁰⁰ provoque un overflow. La solution standard est de soustraire le maximum des logits avant d’appliquer l’exponentielle :

softmax(zᵢ) = e⁽ᶻⁱ⁻ᵐᵃˣ⁽ᶻ⁾⁾ / Σⱼ e⁽ᶻʲ⁻ᵐᵃˣ⁽ᶻ⁾⁾

Cette transformation ne change pas le résultat mathématique mais empêche l’overflow. C’est une astuce fondamentale que toute implémentation correcte de softmax doit inclure.

Softmax dans les LLM : comment les modèles choisissent le prochain mot

C’est probablement l’usage le plus important de softmax aujourd’hui. Quand un LLM comme GPT, Claude ou Gemini génère du texte, voici ce qui se passe à chaque étape :

Le modèle transformer prend en entrée la séquence de tokens déjà générée et produit un vecteur de logits pour chaque token possible du vocabulaire. Si le vocabulaire contient 50 000 tokens, la dernière couche produit un vecteur de 50 000 logits. Softmax transforme ces 50 000 logits en 50 000 probabilités qui somment à 1. Le modèle échantillonne ensuite le prochain token à partir de cette distribution de probabilités.

C’est ici qu’intervient le paramètre de température.

Température : contrôler la créativité

La formule de softmax avec température divise les logits par un paramètre T avant d’appliquer l’exponentielle :

softmax(zᵢ, T) = e⁽ᶻⁱ/ᵀ⁾ / Σⱼ e⁽ᶻʲ/ᵀ⁾

Ce paramètre T contrôle la « dureté » de la distribution de probabilités :

Température = 1 (défaut) : la distribution est celle du softmax standard. Le modèle suit fidèlement ses probabilités apprises.

Température basse (T < 1, par exemple 0,2) : les logits sont amplifiés avant softmax. La distribution devient « peaked » (concentrée) : le token avec le logit le plus élevé reçoit une probabilité proche de 1, les autres tombent à quasi zéro. Le modèle est déterministe, prévisible, factuel. Idéal pour le code, les résumés, les réponses factuelles.

Température élevée (T > 1, par exemple 1,5) : les logits sont atténués. La distribution devient « plate » (uniforme) : les tokens moins probables gagnent des chances d’être sélectionnés. Le modèle est créatif, surprenant, mais potentiellement incohérent. Adapté à l’écriture créative et au brainstorming.

Quand T → 0, softmax se comporte comme un argmax : seul le token avec le logit maximal est choisi, avec 100 % de probabilité. Le modèle est entièrement déterministe.

Choix de la température en pratique Code et tâches factuelles : T = 0 à 0,3. Conversation générale : T = 0,7 à 1,0. Écriture créative : T = 1,0 à 1,5. La plupart des API de LLM permettent de régler la température entre 0 et 2. Au-delà de 1,5, les résultats deviennent souvent incohérents.

Softmax pour la classification multi-classes

En dehors des LLM, softmax est la fonction standard pour la couche de sortie des classifieurs multi-classes. Le réseau produit un logit pour chaque classe, softmax les convertit en probabilités, et la classe avec la probabilité la plus élevée est la prédiction.

La fonction de perte associée est l’entropie croisée catégorielle (categorical cross-entropy), qui mesure la divergence entre la distribution softmax prédite et la distribution cible (one-hot : 1 pour la bonne classe, 0 pour les autres). Cette combinaison softmax + cross-entropy est si courante que PyTorch propose CrossEntropyLoss qui fusionne les deux en une seule opération numériquement stable (elle prend les logits bruts en entrée, pas les probabilités softmax).

Exemple : classification ImageNet

ImageNet contient 1000 classes d’images. La dernière couche d’un réseau comme ResNet produit 1000 logits. Softmax les transforme en 1000 probabilités. Si la probabilité de la classe « golden retriever » est 0,87, le réseau est confiant à 87 % que l’image montre un golden retriever. Les 999 autres classes se partagent les 13 % restants.

Softmax vs Sigmoïde

La confusion entre softmax et sigmoïde est l’une des plus fréquentes en deep learning.

Critère Softmax Sigmoïde
Plage de sortie (0, 1) par classe, Σ = 1 (0, 1) par sortie, indépendantes
Probabilités Interdépendantes (si une monte, les autres baissent) Indépendantes (chacune vit sa vie)
Classification binaire Possible (2 classes) mais sigmoïde préférée Standard (1 sortie)
Classification multi-classes exclusive Standard Inadapté
Classification multi-label Inadapté Standard (1 sigmoïde par classe)
Perte associée Categorical cross-entropy Binary cross-entropy
LLM (prédiction tokens) Standard Non utilisée

La règle est simple : si exactement une classe est correcte par exemple (chat OU chien OU oiseau), utilisez softmax. Si un exemple peut appartenir à plusieurs classes simultanément (un article tagué « politique » ET « économie »), utilisez une sigmoïde par classe.

Softmax dans le mécanisme d’attention

Le mécanisme d’attention des transformers utilise softmax pour calculer les poids d’attention. Pour chaque token, le modèle calcule des scores de similarité avec tous les autres tokens (produit scalaire query × key). Ces scores bruts sont passés à travers softmax pour obtenir des poids d’attention qui somment à 1. Chaque token « attend » alors aux autres tokens proportionnellement à ces poids.

La formule de l’attention scaled dot-product est :

Attention(Q, K, V) = softmax(Q×Kᵀ / √dₖ) × V

Le facteur √dₖ (racine de la dimension des clés) joue un rôle similaire à la température : il empêche les scores de devenir trop grands, ce qui rendrait la distribution softmax trop « peaked » (un seul token recevrait toute l’attention). Sans cette normalisation, les grands modèles souffriraient d’attention « collapsed ».

Implémentation en Python

import numpy as np

# Softmax numériquement stable
def softmax(logits):
    shifted = logits - np.max(logits)  # Stabilité numérique
    exp = np.exp(shifted)
    return exp / exp.sum()

# Softmax avec température
def softmax_temperature(logits, T=1.0):
    if T <= 0:
        T = 1e-10  # Éviter division par zéro
    scaled = logits / T
    shifted = scaled - np.max(scaled)
    exp = np.exp(shifted)
    return exp / exp.sum()

# Exemple : logits d'un LLM pour 5 tokens
logits = np.array([5.0, 4.5, 3.0, 2.7, 2.2])
tokens = ["jour", "monde", "temps", "lieu", "moment"]

print("T=1.0 :", dict(zip(tokens, np.round(softmax_temperature(logits, 1.0), 3))))
# {'jour': 0.479, 'monde': 0.290, 'temps': 0.065, 'lieu': 0.048, 'moment': 0.029}

print("T=0.3 :", dict(zip(tokens, np.round(softmax_temperature(logits, 0.3), 3))))
# {'jour': 0.920, 'monde': 0.074, 'temps': 0.003, 'lieu': 0.002, 'moment': 0.001}

print("T=2.0 :", dict(zip(tokens, np.round(softmax_temperature(logits, 2.0), 3))))
# {'jour': 0.302, 'monde': 0.252, 'temps': 0.138, 'lieu': 0.118, 'moment': 0.101}

À T=0.3, « jour » capte 92 % de la probabilité (quasi déterministe). À T=2.0, la distribution est bien plus plate : même « moment » a 10 % de chances d’être choisi.

En PyTorch et Keras :

# PyTorch : classification multi-classes
import torch.nn as nn
model = nn.Sequential(
    nn.Linear(784, 256),
    nn.ReLU(),
    nn.Linear(256, 10)  # 10 classes, PAS de softmax ici
)
# CrossEntropyLoss inclut softmax en interne
criterion = nn.CrossEntropyLoss()

# Keras : classification multi-classes
from tensorflow import keras
model = keras.Sequential([
    keras.layers.Dense(256, activation='relu', input_shape=(784,)),
    keras.layers.Dense(10, activation='softmax')  # Softmax explicite
])
model.compile(loss='categorical_crossentropy', optimizer='adam')
Piège courant PyTorch vs Keras En PyTorch, CrossEntropyLoss applique softmax en interne. Ne mettez PAS de softmax dans votre modèle si vous utilisez cette loss, sinon vous appliquez softmax deux fois. En Keras, categorical_crossentropy attend des probabilités en entrée, donc mettez softmax dans la dernière couche. Cette différence de convention cause beaucoup de bugs chez les débutants.

Propriétés mathématiques de softmax

Softmax possède plusieurs propriétés importantes. L’invariance par translation : ajouter une constante c à tous les logits ne change pas le résultat (softmax(z+c) = softmax(z)). C’est cette propriété qui justifie l’astuce de stabilité numérique consistant à soustraire le maximum. La monotonie : si zᵢ > zⱼ, alors softmax(zᵢ) > softmax(zⱼ). L’ordre des logits est préservé dans les probabilités. La dérivabilité : softmax est dérivable partout, ce qui permet la descente de gradient. Sa dérivée partielle par rapport au logit zⱼ est : ∂softmax(zᵢ)/∂zⱼ = softmax(zᵢ)(δᵢⱼ – softmax(zⱼ)), où δᵢⱼ est le delta de Kronecker (1 si i=j, 0 sinon).

La sensibilité aux écarts : softmax amplifie exponentiellement les différences entre logits. Si les logits sont [10, 9, 8], les probabilités sont environ [0.665, 0.245, 0.090]. L’écart de 1 unité entre les logits se transforme en un ratio de probabilité de 2,7x (e¹ ≈ 2,718). C’est cette amplification exponentielle qui rend softmax si efficace pour identifier la classe la plus probable, mais aussi si sensible aux logits aberrants.

Softmax, Top-k et Top-p dans la génération de texte

Dans les LLM, softmax produit une distribution sur tout le vocabulaire (typiquement 30 000 à 100 000 tokens). Échantillonner directement dans cette distribution peut produire des tokens très improbables et incohérents. Deux techniques de filtrage post-softmax sont standard.

Top-k sampling : seuls les k tokens avec les probabilités softmax les plus élevées sont considérés. Les probabilités des tokens restants sont redistribuées. Avec k=50, seuls les 50 meilleurs tokens sont candidats, quelle que soit la forme de la distribution.

Top-p sampling (nucleus sampling) : on sélectionne le plus petit ensemble de tokens dont les probabilités cumulées dépassent p (typiquement 0,9 ou 0,95). Si les 3 meilleurs tokens captent déjà 95 % de la probabilité, seuls ces 3 sont considérés. Si la distribution est plus plate, davantage de tokens sont inclus. Top-p s’adapte dynamiquement à la forme de la distribution, ce qui le rend souvent préféré à top-k.

En pratique, la température et le top-p sont souvent combinés. La température modifie la forme de la distribution avant softmax, et le top-p filtre les candidats après softmax. Les APIs de LLM modernes exposent ces deux paramètres pour donner un contrôle fin sur le comportement de génération.

Softmax et distillation de connaissances

Hinton et al. (2015) ont introduit le concept de « knowledge distillation » qui utilise la température du softmax pour transférer les connaissances d’un grand modèle (teacher) vers un petit modèle (student). Avec une température élevée, le softmax du teacher produit une distribution « douce » qui révèle les relations entre classes : si le teacher hésite entre « chat » et « lynx » mais pas avec « voiture », cette information est utile pour le student. Les distributions softmax à haute température contiennent plus d’information que les labels durs (one-hot). Cette technique est fondamentale pour la compression de modèles et reste largement utilisée pour créer des modèles plus petits et plus rapides à partir de LLM de grande taille.

Limites de softmax

Le « softmax bottleneck » : la matrice softmax a un rang limité, ce qui peut restreindre la capacité du modèle à représenter des distributions complexes dans les modèles de langage. Des recherches récentes proposent des fonctions monotones apprenables pour remplacer le softmax et augmenter le rang de la couche de sortie.

Le coût computationnel : pour un vocabulaire de 50 000 tokens, softmax doit calculer 50 000 exponentielles et une somme à chaque étape de génération. Des approximations comme le softmax hiérarchique ou le softmax échantillonné (sampled softmax) réduisent ce coût pour les très grands vocabulaires.

La sensibilité aux outliers : un logit extrêmement élevé par rapport aux autres monopolise toute la probabilité, rendant la distribution quasi déterministe. C’est parfois souhaitable (prédiction confiante), parfois problématique (exploration insuffisante). La température est le levier principal pour contrôler ce comportement.


Questions fréquentes sur softmax

Qu’est-ce que softmax simplement ?

Softmax transforme un vecteur de nombres quelconques (logits) en une distribution de probabilités dont la somme vaut exactement 1. Si un réseau produit les scores [2.0, 1.0, 0.1] pour trois classes, softmax les convertit en [0.659, 0.242, 0.099]. On peut alors dire : 65,9 % de chances pour la classe 1, 24,2 % pour la classe 2, 9,9 % pour la classe 3. C’est la fonction standard pour la classification multi-classes et la prédiction de tokens dans les LLM.

Quelle est la différence entre softmax et sigmoïde ?

Les probabilités softmax sont interdépendantes (elles somment à 1) : si la probabilité d’une classe augmente, celle des autres diminue. Les probabilités sigmoïde sont indépendantes. Utilisez softmax pour la classification multi-classes exclusive (une seule classe par exemple). Utilisez la sigmoïde pour la classification binaire ou multi-label (plusieurs classes possibles par exemple).

Qu’est-ce que la température dans softmax ?

La température T est un paramètre qui contrôle la « dureté » de la distribution softmax. Avec T 1, la distribution est aplatie (les tokens moins probables gagnent des chances). C’est le paramètre qui contrôle la « créativité » des LLM : température basse pour des réponses factuelles, température haute pour la créativité.

Pourquoi ne pas mettre softmax deux fois en PyTorch ?

En PyTorch, nn.CrossEntropyLoss inclut softmax en interne et attend des logits bruts en entrée. Si vous ajoutez un nn.Softmax dans votre modèle ET utilisez CrossEntropyLoss, softmax est appliqué deux fois, ce qui écrase la distribution et produit des résultats incorrects. En Keras, la convention est différente : categorical_crossentropy attend des probabilités, donc softmax doit être explicite dans le modèle.

Comment softmax est-il utilisé dans les transformers ?

Softmax intervient à deux niveaux dans les transformers. Premièrement, dans le mécanisme d’attention : les scores query×key sont passés à softmax pour obtenir les poids d’attention (quels tokens « regardent » quels autres tokens). Deuxièmement, dans la couche de sortie : les logits sur le vocabulaire complet sont passés à softmax (avec température optionnelle) pour obtenir la distribution de probabilités sur le prochain token. Ces deux usages sont essentiels au fonctionnement des LLM.

Polydesk.ai — Footer