Reading the Math in AI Papers · Partie 1 sur 1

Comment lire les mathématiques des articles d'AI sur arXiv : guide pratique

Traduction automatique

Cet article a été traduit automatiquement depuis la version originale en anglais.

Savoir lire les mathématiques d’un article d’AI est une compétence utile pour les ingénieurs qui doivent comprendre un modèle, reproduire une méthode ou juger une affirmation expérimentale. Ce guide explique comment décoder la notation, vérifier une équation sur de petits nombres et la relier au reste de l’article et à l’implémentation. Il suppose que vous savez lire du code, mais pas que la notation de la recherche vous soit déjà familière.

Une équation compresse plusieurs décisions en une seule ligne : les objets manipulés, leurs dimensions, les valeurs qui sont échantillonnées, et ce qui est appris ou laissé fixe. Retrouver ces détails est un bon premier pas. Expliquer pourquoi une méthode fonctionne et l’implémenter fidèlement demande un travail supplémentaire.

Commencez par le parcours de l’attention : il relie une équation à des dimensions de tableaux, à de petits nombres et à du Python exécutable. La référence de notation explique les expressions que vous rencontrerez dans d’autres articles. Le reste de cette série applique la même méthode à des équations d’articles précis : des équations d’architecture comme RoPE, MLA et LoRA ; des objectifs d’entraînement comme DPO et GRPO ; des modèles génératifs et des métriques comme l’ELBO, la diffusion et pass@k. Ces parties ne sont pas encore publiées, donc les parcours auxquels cette partie renvoie ne sont pas liés. Pour un traitement plus long des fondements, The Little Book of Generative AI Foundations de Tianhua Chen développe l’algèbre linéaire et les probabilités qui sous-tendent les modèles génératifs.

Attention, lue symbole par symbole

L’attention produit un vecteur de sortie en calculant une moyenne pondérée de vecteurs valeur. Elle obtient les poids en comparant un vecteur requête de la position de sortie à un vecteur clé de chaque position d’entrée disponible. Les matrices QQ, KK et VV rassemblent ces vecteurs requête, clé et valeur. L’attention par produit scalaire normalisé (scaled dot-product attention) combine ces étapes dans l’équation (1) du §3.2.1 (§ signifie « section ») de Attention Is All You Need :

Attention⁡(Q,K,V)=softmax⁡(QK⊤dk)V.\operatorname{Attention}(Q,K,V)=\operatorname{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right)V.

Les définitions sont dans le texte, pas dans l’équation. Le paragraphe qui précède l’équation (1) dit que les requêtes et les clés ont la dimension dkd_k et les valeurs la dimension dvd_v. La méthode calcule le produit scalaire de chaque requête avec toutes les clés, divise chacun par dk\sqrt{d_k} et applique un softmax « pour obtenir les poids sur les valeurs ». Les requêtes sont « regroupées dans une matrice QQ », et les clés et les valeurs dans KK et VV. Chaque ligne de ces matrices est donc le vecteur d’un token, et le softmax produit un jeu de poids par requête. Les matrices apprises qui transforment les vecteurs de tokens en QQ, KK et VV apparaissent plus loin, au §3.2.2.

Dimensions et rôles. Une tête d’attention effectue un tel calcul avec ses propres vecteurs requête, clé et valeur. Notez leurs dimensions avant de lire les opérateurs. Pour une tête avec nn requêtes et mm clés :

SymboleDimensionCe que c’estD’où cela vient
QQn×dkn\times d_kune ligne de requête par position de sortievecteurs de tokens multipliés par une matrice apprise
KKm×dkm\times d_kune ligne de clé par position pouvant être prise en comptevecteurs de tokens multipliés par une matrice apprise
VVm×dvm\times d_vune ligne de valeur par clévecteurs de tokens multipliés par une matrice apprise
K⊤K^\topdk×md_k\times mKK transposée : les lignes deviennent des colonnesles mêmes nombres que KK
dkd_kun nombrela largeur de chaque requête et de chaque cléun réglage fixe : 64 dans le Transformer de base

Les articles donnent une forme en nommant l’ensemble auquel appartient la matrice : Q∈Rn×dkQ\in\mathbb R^{n\times d_k} désigne une matrice de nombres réels à nn lignes et dkd_k colonnes, un tableau de forme [n, dk].

Lisez de l’intérieur vers l’extérieur.

  1. QK⊤QK^\top multiplie une matrice n×dkn\times d_k par une matrice dk×md_k\times m. Le dkd_k commun est sommé, si bien que le résultat est un tableau n×mn\times m de scores. L’entrée (i,j)(i,j) est le produit scalaire de la requête ii et de la clé jj : on multiplie les entrées correspondantes, puis on additionne les produits. Pour des longueurs de vecteurs fixées, ce score est plus grand quand leurs directions sont plus proches.

  2. Diviser par dk\sqrt{d_k} empêche les scores de croître avec la largeur des vecteurs. La note de bas de page 4 de l’article montre pourquoi les produits scalaires non normalisés croissent. Supposons que les composantes d’une requête et d’une clé soient indépendantes les unes des autres (en connaître certaines n’apprend rien sur les autres), chacune de moyenne 0 et de variance 1 (la distance quadratique moyenne à la moyenne). Alors :

    one product qiki:variance 1q⊤k=∑i=1dkqiki:variance dk, standard deviation dkq⊤k/dk:standard deviation 1\begin{aligned} \text{one product }q_ik_i:&\quad\text{variance }1\\ q^\top k=\textstyle\sum_{i=1}^{d_k}q_ik_i:&\quad\text{variance }d_k,\ \text{standard deviation }\sqrt{d_k}\\ q^\top k/\sqrt{d_k}:&\quad\text{standard deviation }1 \end{aligned}

    Ces lignes utilisent deux règles sur les nombres indépendants. Première règle : le produit de deux nombres indépendants, chacun de moyenne 0 et de variance 1, a lui aussi une variance de 1. Seconde règle : quand on additionne des nombres indépendants, leurs variances s’additionnent, donc les dkd_k produits donnent une variance de dkd_k. L’écart-type est la racine carrée de la variance, dk\sqrt{d_k}. Diviser chaque score par dk\sqrt{d_k} réduit la dispersion du même facteur, qui retombe à 1.

    Pourquoi ces deux règles sont vraies

    Variance quand la moyenne vaut 0. La variance est la distance quadratique moyenne à la moyenne. Quand la moyenne vaut 0, la distance quadratique à la moyenne est simplement le carré du nombre, donc la variance est la moyenne du carré. Une composante qiq_i de moyenne 0 et de variance 1 a donc un qi2q_i^2 qui vaut 1 en moyenne.

    La moyenne d’un produit. Pour des nombres indépendants, la moyenne d’un produit est le produit des moyennes. Prenons un nombre aa qui vaut 1 ou 3 avec la même probabilité, donc de moyenne 2, et un nombre bb qui vaut 1 ou 5, aussi avec la même probabilité, donc de moyenne 3. Indépendants signifie que bb prend chacune de ses valeurs aussi souvent quelle que soit la valeur de aa, donc les quatre paires sont équiprobables. Quand a=1a=1, les produits sont 1 et 5, de moyenne 3=1×33=1\times3. Quand a=3a=3, ils sont 3 et 15, de moyenne 9=3×39=3\times3. Dans les deux cas la moyenne est a×3a\times3, donc sur les deux valeurs de aa elle vaut (3+9)/2=6(3+9)/2=6, soit 2×32\times3. Sans indépendance, la règle échoue : si bb valait 5 chaque fois que aa vaut 3, et 1 chaque fois que aa vaut 1, seuls les produits 1 et 15 se produiraient, et leur moyenne est 8. Wikipedia énonce la règle pour toutes variables aléatoires indépendantes, avec « espérance » pour la moyenne : indépendance et espérance.

    Règle 1 : un produit a une variance de 1. Prenons un produit qikiq_ik_i. Sa moyenne est le produit des moyennes, 0×0=00\times0=0, donc sa variance est la moyenne de (qiki)2=qi2ki2(q_ik_i)^2=q_i^2k_i^2. Les carrés sont indépendants parce que qiq_i et kik_i le sont, et chacun vaut 1 en moyenne, donc la variance est 1×1=11\times1=1. La formule générale est la variance d’un produit de variables indépendantes.

    Règle 2 : les variances de termes indépendants s’additionnent. Notons les produits xi=qikix_i=q_ik_i, de sorte que le produit scalaire est la somme x1+⋯+xdkx_1+\cdots+x_{d_k}. Les termes sont indépendants parce que chacun utilise des composantes différentes, et chacun a une moyenne de 0 et une variance de 1. La somme a elle aussi une moyenne de 0, donc sa variance est la moyenne de son carré. Multiplier la somme par elle-même donne un produit xixjx_ix_j pour chaque paire de termes, une grille dk×dkd_k\times d_k :

    Une grille quatre par quatre pour le carré de x1 + x2 + x3 + x4, avec une cellule pour chaque produit de deux termes. Les quatre cellules diagonales, x1 au carré à x4 au carré, sont mises en évidence : chacune vaut 1 en moyenne, donc ensemble elles totalisent 4. Les douze autres cellules multiplient deux termes indépendants différents et valent chacune en moyenne 0 fois 0, donc elles totalisent 0. Le carré de la somme vaut 4 en moyenne : variance 4, écart-type 2. Avec 64 termes, le même décompte donne une variance de 64 et un écart-type de 8.Une grille quatre par quatre pour le carré de x1 + x2 + x3 + x4, avec une cellule pour chaque produit de deux termes. Les quatre cellules diagonales, x1 au carré à x4 au carré, sont mises en évidence : chacune vaut 1 en moyenne, donc ensemble elles totalisent 4. Les douze autres cellules multiplient deux termes indépendants différents et valent chacune en moyenne 0 fois 0, donc elles totalisent 0. Le carré de la somme vaut 4 en moyenne : variance 4, écart-type 2. Avec 64 termes, le même décompte donne une variance de 64 et un écart-type de 8.

    Les cellules diagonales sont les carrés xi2x_i^2, et chacune vaut 1 en moyenne. Toute autre cellule multiplie deux termes différents et indépendants, donc sa moyenne est le produit de leurs moyennes, 0×0=00\times0=0 : ses valeurs positives et négatives s’annulent. Il ne reste que les dkd_k cellules diagonales, donc la variance de la somme est dkd_k et son écart-type dk\sqrt{d_k}. La dispersion croît comme la racine carrée de la largeur parce que la majeure partie de la grille s’annule. Wikipedia donne l’énoncé général sous le nom de variance d’une somme de variables non corrélées ; des variables indépendantes sont toujours non corrélées, donc la règle les couvre.

    Avec dk=64d_k=64, les scores bruts s’étalent typiquement sur environ ±8\pm8 ; une fois normalisés, sur environ ±1\pm1, quelle que soit la largeur.

    Des scores très dispersés saturent le softmax (étape 3), et ses gradients s’évanouissent. Si un score d’une ligne est bien au-dessus des autres, le softmax donne à cette clé un poids proche de 1 et à toutes les autres un poids proche de 0. Une petite variation de n’importe quel score ne déplace alors presque pas les poids, donc le gradient qui atteint les requêtes et les clés est proche de zéro, et l’entraînement n’a presque rien pour les ajuster. L’article propose cela comme explication probable d’un résultat antérieur : sans la normalisation, l’attention par produit scalaire faisait moins bien que l’attention additive, une forme plus ancienne qui note une requête et une clé avec un petit réseau, pour un dkd_k grand (Britz et al., 2017). L’article ne mesure pas lui-même les gradients.

  3. Le softmax transforme chaque ligne de scores en poids. Soit z=(z1,…,zm)z=(z_1,\ldots,z_m) une ligne des scores normalisés. L’exponentielle eae^a, aussi notée exp⁡(a)\exp(a), utilise la constante e≈2.718e\approx2.718. On a alors softmax⁡(z)j=ezj/∑j′ezj′\operatorname{softmax}(z)_j=e^{z_j}/\sum_{j'}e^{z_{j'}}, où j′j' n’est qu’un second nom d’indice, de sorte que la somme parcourt toutes les clés de la ligne. Les poids sont positifs et chaque ligne somme à 1.

  4. Multiplier les poids n×mn\times m par les valeurs m×dvm\times d_v somme sur l’axe des clés. La ligne ii de la sortie n×dvn\times d_v est une moyenne pondérée des lignes de valeurs, pondérée par la qualité de la correspondance de chaque clé avec la requête ii.

Une tête d'attention dessinée sous forme de grilles de nombres, avec trois requêtes, quatre clés, une largeur de clé de deux et une largeur de valeur de trois. Q, trois par deux, fois K transposée, deux par quatre, donne un tableau de scores trois par quatre. Le softmax conserve cette forme et fait en sorte que chaque ligne somme à un. Les poids, trois par quatre, fois V, quatre par trois, donnent une sortie trois par trois, et la ligne deux de la sortie est une moyenne pondérée des lignes de valeurs avec les poids de la ligne deux.Une tête d'attention dessinée sous forme de grilles de nombres, avec trois requêtes, quatre clés, une largeur de clé de deux et une largeur de valeur de trois. Q, trois par deux, fois K transposée, deux par quatre, donne un tableau de scores trois par quatre. Le softmax conserve cette forme et fait en sorte que chaque ligne somme à un. Les poids, trois par quatre, fois V, quatre par trois, donnent une sortie trois par trois, et la ligne deux de la sortie est une moyenne pondérée des lignes de valeurs avec les poids de la ligne deux.

Comptez les carrés dans la figure : chaque produit supprime l’axe que ses deux grilles partagent.

Vérifiez avec deux nombres. Prenons une requête et deux clés dont les scores normalisés sont (0,log⁡3)(0,\log3), choisis pour que les exponentielles valent 1 et 3, et les valeurs v1=(2,0)v_1=(2,0) et v2=(0,4)v_2=(0,4). La figure déroule le calcul, une opération par colonne :

Un tableau avec une ligne par clé. Clé 1 : score normalisé 0, exponentielle 1, poids 1/4, valeur (2, 0), valeur pondérée (0.5, 0). Clé 2 : score normalisé log 3, exponentielle 3, poids 3/4, valeur (0, 4), valeur pondérée (0, 3). Les exponentielles somment à 4, les poids à 1, et les valeurs pondérées donnent la sortie (0.5, 3).Un tableau avec une ligne par clé. Clé 1 : score normalisé 0, exponentielle 1, poids 1/4, valeur (2, 0), valeur pondérée (0.5, 0). Clé 2 : score normalisé log 3, exponentielle 3, poids 3/4, valeur (0, 4), valeur pondérée (0, 3). Les exponentielles somment à 4, les poids à 1, et les valeurs pondérées donnent la sortie (0.5, 3).

L’attention a mélangé les deux valeurs ; elle n’a pas choisi le token qui correspondait le mieux.

Comparez avec le code. La fonction NumPy ci-dessous implémente une tête. k.T est la transposée. axis=1 est l’axe des clés, donc la ligne de chaque requête est normalisée séparément. Le maximum de la ligne est soustrait avant np.exp : ajouter le même nombre à chaque score d’une ligne s’annule dans le rapport du softmax, donc le résultat est inchangé, mais les grands scores ne débordent plus. Le masque optionnel met les scores bloqués à −∞-\infty, ce qui rend leurs poids exactement nuls. Un décodeur utilise un tel masque pour empêcher chaque token de prendre en compte les tokens suivants (§3.2.3 de l’article).

Enregistrez le bloc sous le nom attention_example.py et lancez uv run --with numpy python attention_example.py. Les vérifications passent en silence.

import numpy as np

def attention(q, k, v, allowed=None):
    """One head. q: [n, dk], k: [m, dk], v: [m, dv], allowed: bool [n, m]."""
    scores = q @ k.T / np.sqrt(q.shape[1])  # [n, m]
    if allowed is not None:
        if not allowed.any(axis=1).all():
            raise ValueError("every query needs at least one allowed key")
        scores = np.where(allowed, scores, -np.inf)
    scores = scores - scores.max(axis=1, keepdims=True)
    weights = np.exp(scores)
    weights = weights / weights.sum(axis=1, keepdims=True)  # rows sum to 1
    return weights @ v, weights  # [n, dv], [n, m]

# The two-key example from the text.
out, w = attention(
    np.array([[1.0]]),
    np.array([[0.0], [np.log(3.0)]]),
    np.array([[2.0, 0.0], [0.0, 4.0]]),
)
np.testing.assert_allclose(w, [[0.25, 0.75]])
np.testing.assert_allclose(out, [[0.5, 3.0]])

# A causal mask: query i may attend only to keys 0..i.
x = np.random.default_rng(0).normal(size=(3, 4))
out, w = attention(x, x, x, allowed=np.tril(np.ones((3, 3), dtype=bool)))
assert out.shape == (3, 4)
np.testing.assert_allclose(w.sum(axis=1), 1.0)
assert np.all(w[np.triu_indices(3, k=1)] == 0)

Une requête dont toutes les clés sont bloquées est un cas que l’équation laisse ouvert : chaque poids de sa ligne vaudrait 0/00/0. La fonction lève une erreur au lieu de renvoyer NaN.

D’une tête à plusieurs. Le Transformer de base exécute huit têtes en parallèle, chacune avec ses propres matrices apprises pour produire QQ, KK et VV, et chacune avec dk=dv=64d_k=d_v=64. Il concatène leurs sorties et multiplie le résultat par une autre matrice apprise, WOW^O (Attention Is All You Need, §3.2.2).

Une implémentation peut aussi traiter un batch : plusieurs séquences d’entrée ensemble. Par exemple, le scaled dot-product attention de PyTorch accepte un tenseur de requêtes Q de forme [batch, heads, n, d_k]. Les deux premières dimensions sélectionnent une séquence et une tête ; Q[b, h] est la matrice [n, d_k] de cette paire. La formule de l’attention s’applique séparément à chaque paire. La fonction NumPy ci-dessus ne gère qu’une seule de ces paires : ses opérations .T et axis=1 supposent des entrées à deux dimensions.

Six questions pour toute équation

QuestionRéponse pour l’attention
Que renvoie l’équation, et avec quelle forme ?Une matrice n×dvn\times d_v : une ligne de sortie par requête
Chaque symbole est-il une donnée, un poids entraîné, un modèle figé, un réglage ou un échantillon ?QQ, KK et VV sont calculés à partir des tokens par des matrices apprises ; dkd_k est un réglage fixe ; rien n’est échantillonné
Sur quel indice ou quel axe porte chaque opération ?Le softmax porte sur les mm clés de la ligne de chaque requête ; le produit des poids avec VV somme sur les clés
Où sont les définitions ?Le paragraphe avant l’équation (1), la note de bas de page 4, et le §3.2.2 pour les projections apprises
Que donne une vérification avec deux ou trois nombres ?Des poids (1/4,3/4)(1/4,3/4) et une sortie (0.5,3)(0.5,3)
Qu’est-ce que le code a dû décider que l’équation laisse ouvert ?Soustraire le maximum de la ligne, la valeur utilisée pour les scores masqués, une ligne sans clé autorisée

Quel type d’énoncé une équation formule

L’attention est un calcul : elle dit comment obtenir une sortie à partir d’entrées. Les articles écrivent aussi des équations qui jouent d’autres rôles :

TypeExemple dans cette sérieCe qu’il faut vérifier
CalculLa sortie de l’attention ; le vecteur compressé de MLALa forme de chaque résultat intermédiaire
DéfinitionLe score de GRPO relatif aux autres réponsesCe que représente le nouveau nom, pour pouvoir le remplacer par sa définition
Objectif : une perte à minimiser ou un score à maximiserLa perte DPOS’il est minimisé ou maximisé, et sur quelles données porte la moyenne
Règle de mise à jourLa descente de gradient ; la mémoire de Gated DeltaNetCe qui change à chaque pas et ce qui reste fixe
Contrainte, ou ensemble de valeurs permisesLes matrices de mélange permises de mHCComment l’article produit une valeur qui la satisfait
Borne : une limite supérieure ou inférieure sur une quantitéLa borne inférieure de l’évidence (evidence lower bound, ELBO)La différence entre les deux côtés, et quand elle est nulle
Estimateur ou métriquepass@kCe qui est compté, et à partir de combien d’échantillons
Ajustement empiriqueLa loi d’échelle de DeepSeek LLMLa plage de données sur laquelle la courbe a été ajustée

Une contrainte énonce une propriété que le résultat doit avoir. Pour les poids d’attention, cette propriété est : chaque poids est positif ou nul et chaque ligne somme à 1. Le softmax est un calcul qui produit des poids ayant cette propriété. L’exigence seule ne dit pas qu’il faut utiliser le softmax.

== affirme que deux expressions sont égales. :=:= signifie « est défini comme » : il donne un nom à une expression. Une définition peut nommer une métrique, une perte ou un ensemble de valeurs permises, donc voir :=:= ne vous dit pas quel type d’équation du tableau ci-dessus vous lisez.

Par exemple, Evaluating Large Language Models Trained on Code, l’article qui a présenté le modèle de génération de code Codex, utilise :=:= pour définir son estimateur de pass@k (équation 1). Cette métrique mesure la probabilité qu’au moins un des kk programmes générés passe les tests. Dans le rapport technique de DeepSeek-V4, l’équation (2) combine deux énoncés : M:={…}\mathcal M:=\{\ldots\} définit un ensemble de matrices permises, et Bl∈MB_l\in\mathcal M impose que la matrice de mélange BlB_l du modèle appartienne à cet ensemble. La définition utilise :=:= ; la contrainte utilise ∈\in, qui signifie « appartient à ». Les sections pass@k et mHC détaillent ces exemples.

Trouver la nouvelle équation, ses définitions et son code

La section des méthodes d’un article décrit comment fonctionne son modèle ou son algorithme d’entraînement. Le titre peut être « Method », « Architecture » ou quelque chose de plus précis. Les auteurs expliquent souvent d’abord une méthode existante, puis montrent ce qu’ils ont changé. Pour repérer la contribution revendiquée, partez du résumé de la nouveauté dans l’introduction. Par exemple, DeepSeekMath, §1.1 présente la Group Relative Policy Optimization (GRPO), sa méthode pour entraîner des modèles à partir de réponses notées. Les numéros de section et d’équation donnés ici renvoient à l’article lié.

Comparez ensuite la méthode proposée avec la méthode antérieure qu’elle modifie. Deux articles l’illustrent :

  • Un changement d’architecture. DeepSeek-V2 décrit l’attention multi-têtes standard au §2.1.1 et introduit la multi-head latent attention (MLA) au §2.1.2. L’attention standard stocke les clés et les valeurs de chaque token précédent. MLA stocke un vecteur compressé à partir duquel on peut les reconstruire. Comparer ces équations révèle ce que le modèle stocke autrement ; le parcours de MLA en déduit le gain de mémoire.
  • Un changement d’entraînement. DeepSeekMath, §4.1.1 donne l’objectif de la Proximal Policy Optimization (PPO) en équation (1) et celui de GRPO en équation (3). Les deux utilisent un avantage : un nombre qui dit si une réponse était meilleure ou moins bonne que prévu. PPO l’estime avec un second réseau appris, le modèle de valeur, qui prédit la récompense restant à venir à partir d’une réponse partielle. GRPO compare plutôt la récompense de la réponse aux récompenses d’autres réponses à la même question. Le parcours de GRPO compare ces termes avec la notation de réponse complète de DeepSeek-R1.

Trouvez les définitions autour de l’équation. Vérifiez le paragraphe précédent, toute phrase « où … » qui suit, les notes de bas de page et les annexes. Dans Attention Is All You Need, le paragraphe avant l’équation (1) définit les dimensions, et la note de bas de page 4 explique le facteur d’échelle. DeepSeek-V3 définit la plupart de ses symboles de routage juste après l’équation (15), et le biais bib_i juste avant l’équation (16). DeepSeek-V2 développe MLA sur les équations (9)–(19), puis rassemble le calcul dans l’Annexe C.

Consultez l’algorithme et le code. Une boîte d’algorithme est un pseudo-code numéroté qui donne l’ordre des opérations. L’Algorithm 1 de DeepSeekMath montre quand générer des réponses et quand mettre à jour le modèle. L’Algorithm 1 de Denoising Diffusion Probabilistic Models (DDPM) précise comment échantillonner l’image d’entraînement, le niveau de bruit et le bruit. Les implémentations tranchent d’autres détails : par défaut, np.std divise la somme des écarts quadratiques par nn, alors que torch.std divise par n−1n-1. L’exemple de GRPO montre comment ce choix modifie les valeurs d’avantage calculées à partir des mêmes récompenses.

Les versions d’arXiv peuvent déplacer des sections et reprendre des équations sous de nouveaux numéros, donc citez la version. Dans DeepSeek-R1 v1, l’objectif GRPO se trouve au §2.2.1, équations (1)–(3). Dans la v2, publiée en janvier 2026, il se trouve au §2.1, et les mêmes équations reviennent sous les numéros (11)–(13) dans le Supplementary A.3. Un lien sans version ouvre la dernière, donc chaque lien arXiv de cette série inclut la version par rapport à laquelle il a été vérifié.

Vérifier votre lecture avec un LLM

Un modèle de chat peut rédiger le tableau des symboles, l’indice de chaque somme et une vérification sur de petits nombres, si vous lui donnez les définitions et lui demandez de signaler ce qui manque. Le texte copié depuis un PDF aplatit les indices, les exposants et les fractions sur une seule ligne ; les liens « HTML (experimental) » et « TeX Source » de la page de résumé arXiv donnent un texte propre à coller. Collez l’équation et les paragraphes qui l’entourent avec un prompt comme celui-ci :

Below is equation (N) from <paper title, arXiv ID and version>, followed by
the paragraphs that define its symbols.

1. Make a table with one row per symbol: shape or type, meaning, and whether
   it is input data, a trained weight, a frozen model, a fixed setting or a
   random sample. Quote the sentence that defines it.
2. List every symbol the pasted text does not define. Do not guess them.
3. For every sum, mean, softmax, min or expectation, name the index or the
   distribution it runs over.
4. Work through the equation with the smallest numbers that use every term.
5. Say which kind of statement it is: a computation, definition, objective,
   update rule, constraint, bound, estimator or empirical fit.

Sans l’étape 2, rien n’empêche le modèle de combler une définition manquante par le sens habituel de la lettre, par exemple en lisant σ\sigma dans DPO comme un écart-type au lieu de la sigmoïde. Les citations de l’étape 1 rendent le tableau vérifiable : cherchez chacune dans le PDF, et traitez une ligne dont vous ne retrouvez pas la citation comme une supposition.

La même procédure sous forme d’agent skills. paper-math-skills regroupe cette section et la référence de notation ci-dessous en deux skills écrits pour Claude Code ; d’autres agents qui chargent des fichiers SKILL.md peuvent aussi les utiliser. read-paper-math récupère la version arXiv épinglée, cite la phrase qui définit chaque symbole, lit l’équation de l’intérieur vers l’extérieur et exécute une vérification sur de petits nombres. check-paper-math examine une telle lecture par rapport à l’article : il cherche chaque citation, relance les calculs et signale les affirmations plus fortes ou plus faibles que celles de l’article. paper-math-readings contient les lectures des skills pour les Parties 2 à 4, une pour chacune des 15 sections qui portent une ligne Source:.

Référence de notation

Si une lettre grecque ne vous est pas familière, ouvrez la référence des lettres grecques de cet article (Annexe A) pour son nom et ses sens courants. Pour s’exercer davantage aux mathématiques, Stanford CS229 propose des rappels de probabilités et d’algèbre linéaire avec exercices ; les préliminaires de Dive into Deep Learning expliquent les fondements avec du code.

Indices, marques et signes de relation

Les lettres sont des noms de variables locaux : chaque article définit les siens. Les indices inférieurs sont généralement des numéros de position. xix_i peut être la coordonnée ii d’un vecteur ou l’exemple ii d’un dataset, et hth_t est le vecteur du modèle pour le token tt, appelé son état caché.

Dans les articles sur les modèles, les exposants sont souvent des étiquettes. Dans ht(ℓ)h_t^{(\ell)}, l’exposant entre parenthèses est généralement un numéro de couche, pas une puissance ; dans les FFN⁡i(s)\operatorname{FFN}^{(s)}_i et FFN⁡i(r)\operatorname{FFN}^{(r)}_i de DeepSeek-V3, il distingue les experts partagés des experts routés, ceux que chaque token utilise et ceux qu’un routeur choisit (voir l’exemple de routage MoE). Dans DeepSeek-V2, WDKVW^{DKV} et ktCk_t^C portent des étiquettes, pas des exposants ; l’exemple de MLA définit ces étiquettes. W⊤W^\top est une transposée et x2x^2 est un carré.

x1:Tx_{1:T} désigne les positions 1 à TT, TT inclus, contrairement à une tranche Python ; les articles comptent généralement à partir de 1. x<tx_{<t} désigne toutes les positions avant tt. Xt,:X_{t,:} sélectionne la ligne tt, comme dans le slicing de NumPy.

Les marques sur une lettre changent généralement son sens de l’une de ces façons :

MarqueLecture habituelleExemple ou exception
y^\hat yUne prédiction ou une estimationExemple : A^i,t\hat A_{i,t} dans DeepSeekMath estime de combien une réponse a obtenu un meilleur score que prévu
xˉ\bar xUne moyenneException : dans DDPM, αˉt\bar\alpha_t multiplie les facteurs du calendrier de bruit de l’étape 1 à l’étape tt
x~\tilde xUne version perturbée ou non contrainteExemple : dans DeepSeek-V4, B~l\tilde B_l est une matrice avant que la normalisation n’impose ses contraintes
x∗x^\astL’optimumException : dans DPO, r∗r^\ast est la vraie récompense, que la méthode n’observe jamais
x′x'Une nouvelle valeur ou une valeur intermédiaireExemple : dans DeepSeek-V3, gi,t′g'_{i,t} est un poids d’expert avant normalisation
A−1A^{-1}L’inverse de la matricePas l’inverse terme à terme : A−1A^{-1} annule AA, A−1A=IA^{-1}A=I (la matrice identité), et (A−1)ij≠1/Aij(A^{-1})_{ij}\neq1/A_{ij} en général

Certains symboles autres que les lettres grecques ont eux aussi plusieurs rôles :

SymboleSens
∣\midLe conditionnement dans p(y∣x)p(y\mid x) ; « tel que » à l’intérieur d’un ensemble
∣x∣\vert x\vertUne valeur absolue ; la longueur d’une séquence, comme dans ∣oi∣\vert o_i\vert, le nombre de tokens de la réponse oio_i de GRPO ; la taille d’un ensemble
∼\sim« Est échantillonné selon » dans x∼px\sim p ; « environ » dans un texte informel
TTUne longueur de séquence ; une température de softmax ; le nombre de pas de diffusion
qqUn vecteur requête (attention) ; une question (GRPO) ; le modèle étudiant qθq_\theta (distillation) ; l’encodeur qϕq_\phi (ELBO)

Cinq signes disent comment deux côtés sont liés. :=:=, parfois ≜\triangleq, définit un nouveau nom. ≈\approx marque une approximation, comme la moyenne échantillonnée dans Espérances et origine des échantillons. ∝\propto signifie « proportionnel à », avec une constante de normalisation omise : pi∝ezip_i\propto e^{z_i} ne devient une distribution qu’après division par ∑jezj\sum_j e^{z_j}. ≪\ll signifie « très inférieur à », comme dans le dc≪dhnhd_c\ll d_hn_h de DeepSeek-V2 : la largeur compressée est très inférieure à la largeur totale de toutes les têtes. ←\leftarrow est une affectation, comme dans une règle de mise à jour.

Sommes, comptages, intervalles et logarithmes

Le grand ∑\sum additionne des termes et ∏\prod les multiplie. L’indice sous l’opérateur commence ici à 1 et va jusqu’à la borne supérieure NN :

∑i=1Nxi=x1+⋯+xN,∏i=1Nxi=x1⋯xN.\sum_{i=1}^{N}x_i=x_1+\cdots+x_N,\qquad\prod_{i=1}^{N}x_i=x_1\cdots x_N.

L’indice appartient à l’opérateur, comme une variable de boucle appartient à sa boucle. Dans yi=∑j=1dWijxjy_i=\sum_{j=1}^{d}W_{ij}x_j, la somme parcourt jj, tandis que ii identifie une entrée de sortie. Le résultat est un vecteur avec une entrée par ii : le produit matrice-vecteur WxWx écrit en détail. Les indices du membre de gauche vous donnent la forme de la sortie.

Le facteur devant une somme décide de ce qui reçoit un poids égal. Un batch avec une réponse de 2 tokens et une réponse de 8 tokens, où ℓit\ell_{it} est la perte sur le token tt de la réponse ii (dans GRPO, ℓ\ell est plutôt un terme à maximiser), peut être moyenné de deux façons :

Lanswers=12(12∑t=12ℓ1t+18∑t=18ℓ2t)Ltokens=110(∑t=12ℓ1t+∑t=18ℓ2t)\begin{aligned} L_{\text{answers}}&=\frac12\left(\frac12\sum_{t=1}^{2}\ell_{1t}+\frac18\sum_{t=1}^{8}\ell_{2t}\right)\\ L_{\text{tokens}}&=\frac1{10}\left(\sum_{t=1}^{2}\ell_{1t}+\sum_{t=1}^{8}\ell_{2t}\right) \end{aligned}

Dans la première, chaque réponse reçoit le poids 12\tfrac12, partagé entre ses tokens :

short answer, each token:12×12=14long answer, each token:12×18=116\begin{aligned} \text{short answer, each token:}&\quad\tfrac12\times\tfrac12=\tfrac14\\ \text{long answer, each token:}&\quad\tfrac12\times\tfrac18=\tfrac1{16} \end{aligned}

Dans la seconde, chaque token a le poids 1/101/10. GRPO échantillonne GG réponses o1,…,oGo_1,\ldots,o_G à chaque question, et ∣oi∣\vert o_i\vert est le nombre de tokens de la réponse ii. Les deux moyennes s’écrivent alors ainsi, pour le GRPO de DeepSeekMath et pour DAPO, une variante ultérieure de GRPO :

DeepSeekMath’s GRPO, per answer:1G∑i=1G1∣oi∣∑t=1∣oi∣ℓitDAPO, per token:1∑i∣oi∣∑i=1G∑t=1∣oi∣ℓit\begin{aligned} \text{DeepSeekMath's GRPO, per answer:}&\quad\frac1G\sum_{i=1}^{G}\frac1{\vert o_i\vert}\sum_{t=1}^{\vert o_i\vert}\ell_{it}\\ \text{DAPO, per token:}&\quad\frac1{\sum_i\vert o_i\vert}\sum_{i=1}^{G}\sum_{t=1}^{\vert o_i\vert}\ell_{it} \end{aligned}

Avec G=2G=2, on retrouve LanswersL_{\text{answers}} et LtokensL_{\text{tokens}} ci-dessus. DAPO est passé à la moyenne par token (§3.3) parce que la moyenne par réponse donnait trop peu de poids aux tokens des longues réponses : le modèle apprenait trop peu des longues bonnes réponses et ne pénalisait pas assez les mauvaises réponses longues et répétitives.

Une somme peut aussi compter. Les articles le font avec une indicatrice : un 1 en gras suivi d’une condition, 1[C]\mathbf 1[C], qui vaut 1 quand la condition CC est vraie et 0 quand elle est fausse. Certains articles mettent la condition entre parenthèses ou impriment un 1 à double trait ; le sens est le même. Additionner des indicatrices compte donc combien de fois la condition est vérifiée. L’exactitude (accuracy) en est l’exemple habituel. Si y^i\hat y_i est la classe prédite et yiy_i la classe correcte pour l’exemple ii, alors ∑i1[y^i=yi]\sum_i\mathbf 1[\hat y_i=y_i] est le nombre de prédictions correctes. Les prédictions (chat, chien, chien) face aux étiquettes correctes (chat, chat, chien) donnent les indicatrices 1, 0 et 1, donc le décompte est 2 et l’exactitude 2/3. Dans une couche mixture-of-experts (MoE), un routeur envoie chaque token vers quelques-uns de nombreux sous-réseaux feed-forward, appelés experts. Dans la perte d’équilibrage de DeepSeek-V3 (équation 18), l’indicatrice vaut 1 quand le score d’un expert pour un token figure parmi les KrK_r scores les plus élevés pour ce token, où KrK_r est le nombre d’experts vers lesquels chaque token est routé. Sa somme sur les tokens d’une séquence compte combien de fois cela s’est produit. Le score utilisé ici omet le biais que le routage ajoute, donc le décompte peut différer des experts que le routeur choisit réellement (routage MoE).

Le coefficient binomial (nk)\binom nk, lu « kk parmi nn », compte les façons de choisir kk éléments distincts parmi nn sans tenir compte de l’ordre. Pour des entiers 0≤k≤n0\leq k\leq n, il vaut n!/(k! (n−k)!)n!/(k!\,(n-k)!). Le point d’exclamation désigne la factorielle : n!=1×2×⋯×nn!=1\times2\times\cdots\times n, avec 0!=10!=1. Par exemple, (52)=5!/(2! 3!)=10\binom52=5!/(2!\,3!)=10 : cinq éléments forment dix paires distinctes. DeepSeekMoE utilise les coefficients binomiaux pour compter les combinaisons d’experts, et l’estimateur pass@k s’en sert pour compter les ensembles d’échantillons.

Les intervalles utilisent des crochets pour les bornes incluses : [a,b][a,b] inclut les deux, (a,b)(a,b) aucune. Dans Gated DeltaNet, αt∈(0,1)\alpha_t\in(0,1) signifie strictement entre 0 et 1. Ailleurs, (a,b)(a,b) est un couple.

Le logarithme naturel inverse l’exponentiation : log⁡(ea)=a\log(e^a)=a. Les logarithmes transforment les produits en sommes et les rapports en différences : log⁡(ab)=log⁡a+log⁡b\log(ab)=\log a+\log b et log⁡(a/b)=log⁡a−log⁡b\log(a/b)=\log a-\log b, mais log⁡(a+b)\log(a+b) ne se décompose pas. C’est pourquoi les articles travaillent avec des log-probabilités. Le log d’un produit de probabilités de tokens est une somme, et le log d’un rapport des probabilités de deux modèles est une différence, la forme utilisée dans les objectifs de DPO et de GRPO. Les articles de ML entendent le log naturel sauf indication contraire ; les résultats sont en nats, et les logs en base 2 donnent des bits. Pour une probabilité p≤1p\leq1, −log⁡p≥0-\log p\geq0, et cette valeur croît sans limite quand pp tend vers 0, si bien qu’une mauvaise prédiction confiante coûte cher.

Log-sum-exp signifie : exponentier chaque score ziz_i, additionner les résultats, puis prendre le logarithme. Calculer log⁡∑iezi\log\sum_i e^{z_i} directement peut déborder quand un score est grand. À la place, trouvez le plus grand score et appelez-le mm. La notation m=max⁡izim=\max_i z_i signifie « comparer toutes les entrées ziz_i et prendre la plus grande » ; en NumPy, m = z.max().

Soustrayez mm de chaque score avant d’exponentier, puis rajoutez-le après avoir pris le logarithme :

log⁡∑iezi=m+log⁡∑iezi−m.\log\sum_i e^{z_i}=m+\log\sum_i e^{z_i-m}.

Pour z=(1000,1001)z=(1000,1001), le plus grand score est m=1001m=1001. Les scores décalés sont (−1,0)(-1,0), donc le calcul devient 1001+log⁡(e−1+1)≈1001.3131001+\log(e^{-1}+1)\approx1001.313. Aucune exponentielle n’est supérieure à 1. Le code de l’attention utilise la même soustraction avant le softmax ; là, le facteur commun s’annule dans la division, donc rien n’est rajouté.

Probabilité conditionnelle et probabilité d’un texte

pθ(y∣x)p_\theta(y\mid x) est la probabilité que le modèle de paramètres θ\theta attribue à la sortie yy étant donnée l’entrée xx. L’indice nomme les paramètres ; certains articles écrivent p(y∣x;θ)p(y\mid x;\theta), où le point-virgule marque aussi des paramètres plutôt qu’une condition. Avec un point à la place de la sortie, pθ(⋅∣x)p_\theta(\cdot\mid x) est la distribution entière sur les sorties plutôt qu’un seul nombre. Les articles de RL écrivent le même objet πθ(o∣q)\pi_\theta(o\mid q), la probabilité que le modèle écrive la réponse oo à la question qq, et appellent le modèle une politique (policy).

Échanger l’événement et la condition donne un nombre différent. Supposons 100 réponses de modèle : 60 sont correctes, 50 sont du JSON valide, et 40 sont les deux. Alors

P(correct∣valid JSON)=40/50=0.8,P(valid JSON∣correct)=40/60≈0.67.\begin{aligned} P(\text{correct}\mid\text{valid JSON})&=40/50=0.8,\\ P(\text{valid JSON}\mid\text{correct})&=40/60\approx0.67. \end{aligned}

Soit AA « la réponse est correcte » et BB « la réponse est du JSON valide ». La probabilité conditionnelle restreint le décompte aux réponses qui satisfont la condition : P(A∣B)=P(A∩B)/P(B)P(A\mid B)=P(A\cap B)/P(B), à condition que P(B)>0P(B)>0. Le symbole ∩\cap signifie « les deux événements se produisent ». Ici la fraction vaut 0.4/0.5=0.80.4/0.5=0.8, comme 40 réponses correctes parmi 50 réponses en JSON valide.

Deux événements sont indépendants quand savoir que l’un s’est produit ne change pas la probabilité de l’autre. Cela exige P(A∩B)=P(A)P(B)P(A\cap B)=P(A)P(B). Dans cet échantillon, P(both)=0.4P(\text{both})=0.4, alors que P(correct)P(valid JSON)=0.6×0.5=0.3P(\text{correct})P(\text{valid JSON})=0.6\times0.5=0.3, donc les proportions observées ne satisfont pas l’indépendance.

Le théorème de Bayes, aussi appelé règle de Bayes, relie les deux sens du conditionnement : P(A∣B)=P(B∣A)P(A)/P(B)P(A\mid B)=P(B\mid A)P(A)/P(B). Il permet de calculer la probabilité de AA sachant BB à partir de la probabilité de BB sachant AA et des probabilités des deux événements. L’exemple de l’ELBO l’utilise pour trouver la probabilité d’un code caché étant donnée une image observée.

Un modèle de langage note une séquence un token à la fois. D’après la règle de la chaîne des probabilités,

pθ(y1:T∣x)=∏t=1Tpθ(yt∣x,y<t)log⁡pθ(y1:T∣x)=∑t=1Tlog⁡pθ(yt∣x,y<t)\begin{aligned} p_\theta(y_{1:T}\mid x)&=\prod_{t=1}^{T}p_\theta(y_t\mid x,y_{<t})\\ \log p_\theta(y_{1:T}\mid x)&=\sum_{t=1}^{T}\log p_\theta(y_t\mid x,y_{<t}) \end{aligned}

Chaque facteur conditionne sur tous les tokens précédents, donc la formule ne suppose pas que les tokens sont indépendants. Si trois tokens ont pour probabilités conditionnelles 0.5, 0.2 et 0.1 :

p=0.5×0.2×0.1=0.01log⁡p=log⁡0.5+log⁡0.2+log⁡0.1≈−0.693−1.609−2.303≈−4.61\begin{aligned} p&=0.5\times0.2\times0.1=0.01\\ \log p&=\log0.5+\log0.2+\log0.1\approx-0.693-1.609-2.303\approx-4.61 \end{aligned}

La perte d’entraînement habituelle est l’opposé de cette somme, divisé par la longueur :

L(θ)=−1T∑t=1Tlog⁡pθ(yt∣x,y<t).\mathcal L(\theta)=-\frac1T\sum_{t=1}^{T}\log p_\theta(y_t\mid x,y_{<t}).

Pendant l’entraînement, les tokens précédents y<ty_{<t} viennent du dataset. Pendant la génération, ce sont les propres choix antérieurs du modèle.

Espérances et origine des échantillons

Une espérance est une moyenne pondérée par les probabilités :

Ex∼p[f(x)]=∑xp(x)f(x).\mathbb E_{x\sim p}[f(x)]=\sum_x p(x)f(x).

Lisez Ex∼p[f(x)]\mathbb E_{x\sim p}[f(x)] comme « la moyenne de f(x)f(x) quand xx est tiré selon pp ». La notation ∑x\sum_x somme sur toutes les valeurs discrètes possibles de xx. Sans indice, E[X]\mathbb E[X] moyenne une variable aléatoire XX selon sa propre distribution : si XX vaut 1 avec la probabilité 0.75 et 3 avec la probabilité 0.25, alors E[X]=1×0.75+3×0.25=1.5\mathbb E[X]=1\times0.75+3\times0.25=1.5.

Quand une variable a une densité p(x)p(x), c’est-à-dire une probabilité par unité de xx, la moyenne pondérée est une intégrale, ∫f(x)p(x) dx\int f(x)p(x)\,dx. Le dxdx identifie xx comme la variable d’intégration ; sans bornes écrites ici, l’intégrale couvre toute sa plage. L’exemple de la densité explique la probabilité par unité et montre une intégrale comme l’aire sous une courbe.

Le code d’entraînement ne peut pas sommer sur toutes les entrées possibles, donc il échantillonne et fait la moyenne : Ex∼p[f(x)]≈1N∑i=1Nf(xi)\mathbb E_{x\sim p}[f(x)]\approx\frac1N\sum_{i=1}^{N}f(x_i), chaque xix_i étant tiré indépendamment selon pp, ce que les articles écrivent xi∼iidpx_i\overset{\text{iid}}{\sim}p. Les articles appellent cela une estimation de Monte Carlo, et dans le code c’est loss.mean() sur un batch. La moyenne du batch n’estime l’espérance que si le batch est tiré selon la distribution de l’indice de E\mathbb E, donc l’indice vous dit comment les données d’entraînement sont produites :

  • DPO fait la moyenne sur des exemples enregistrés (x,yw,yl)∼D(x,y_w,y_l)\sim\mathcal D : un prompt, une réponse préférée et une réponse rejetée. Les réponses sont collectées et étiquetées avant cette étape d’entraînement ; elles peuvent provenir d’une génération antérieure du modèle. À chaque pas d’entraînement, le modèle calcule les probabilités de ces réponses fournies et met à jour ses poids. Il n’échantillonne pas de nouvelles réponses pour ce pas.
  • GRPO dans DeepSeek-R1 : générer des réponses, puis comparer leurs récompenses. L’entraînement tire une question du dataset, génère plusieurs réponses et les note avec une fonction de récompense, par exemple en vérifiant un résultat mathématique ou en exécutant des tests unitaires. La mise à jour favorise les réponses dont le score dépasse la moyenne du groupe. La notation q∼P(Q)q\sim P(Q) signifie « échantillonner une question qq dans la distribution des questions ». La notation {oi}∼πθold(O∣q)\{o_i\}\sim\pi_{\theta_{old}}(O\mid q) signifie « échantillonner des réponses oio_i à cette question avec la copie du modèle nommée πθold\pi_{\theta_{old}} ». L’indice old marque la copie qui a généré ces réponses ; cette copie reste fixe pendant que le batch sert aux mises à jour. Le parcours de GRPO explique la comparaison des récompenses et les mises à jour.
  • La distillation on-policy dans MiniLLM et DeepSeek-V4 : générer du texte, puis apprendre des probabilités de l’enseignant. Le modèle en cours d’entraînement est l’étudiant. Il génère du texte ; un enseignant figé fournit les probabilités du token suivant pour les mêmes préfixes, et l’entraînement ajuste les probabilités de l’étudiant vers celles de l’enseignant. Ces probabilités fournissent le signal d’entraînement, plutôt que le score de récompense d’une réponse comme dans GRPO. MiniLLM écrit le texte échantillonné par l’étudiant y∼qθy\sim q_\theta : yy est le texte et qθq_\theta nomme le modèle étudiant. DeepSeek-V4 appelle son étudiant πθ\pi_\theta et utilise plusieurs enseignants spécialisés. La procédure d’échantillonnage réelle de MiniLLM mélange aussi des tokens tirés de l’enseignant. Le parcours de la distillation explique les objectifs et cette distinction d’échantillonnage.

L’ordre vous dit ce que l’entraînement optimise. Supposons qu’un modèle attribue les probabilités 0.9 et 0.1 aux sorties correctes de deux exemples d’entraînement de poids égal. Faire la moyenne de leurs log-probabilités signifie prendre d’abord chaque log, puis faire la moyenne : np.log(probs).mean(). Prendre le log de leur moyenne donne np.log(probs.mean()). Si XX est la probabilité attribuée à la sortie correcte d’un exemple choisi au hasard :

E[log⁡X]=12(log⁡0.9+log⁡0.1)≈−1.20log⁡E[X]=log⁡((0.9+0.1)/2)=log⁡0.5≈−0.69\begin{aligned} \mathbb E[\log X]&=\tfrac12(\log0.9+\log0.1)\approx-1.20\\ \log\mathbb E[X]&=\log\bigl((0.9+0.1)/2\bigr)=\log0.5\approx-0.69 \end{aligned}

Prendre l’opposé de ces scores donne des pertes de 1.20 et 0.69. Un second modèle qui attribue 0.5 à chaque sortie correcte obtient 0.69 avec l’un ou l’autre calcul. Ainsi, faire la moyenne des probabilités avant de prendre le log traite les deux modèles comme équivalents, alors que la moyenne habituelle de la log-probabilité négative pénalise davantage le premier modèle pour sa faible probabilité sur la seconde sortie correcte. Quand vous traduisez une perte en code, conservez l’ordre du log et de la moyenne.

L’inégalité de Jensen énonce la relation générale pour XX positif : E[log⁡X]≤log⁡E[X]\mathbb E[\log X]\leq\log\mathbb E[X]. Elle aide aussi à construire d’autres objectifs d’entraînement. Quand la probabilité des données d’un modèle exige une moyenne coûteuse sur des variables cachées, une moyenne de termes en log peut fournir une borne inférieure plus facile à estimer. Le parcours de l’ELBO explique ce problème d’entraînement ; ELBO signifie evidence lower bound. La section 2.4 de The Little Book of Generative AI Foundations de Tianhua Chen établit la borne avec l’inégalité de Jensen.

Densités, variance et barres d’erreur

p(x)p(x) a deux sens courants. Pour des résultats discrets comme des tokens ou des classes, il donne la probabilité du résultat xx : un nombre de 0 à 1, les probabilités sommant à 1 sur tous les résultats.

Pour comprendre l’autre sens, supposons que XX soit choisi uniformément entre 0 et 0.5. Des intervalles de même longueur ont les mêmes probabilités. L’intervalle de 0.1 à 0.2 occupe un cinquième de toute la plage, donc

P(0.1≤X≤0.2)=0.2−0.10.5=0.2.P(0.1\leq X\leq0.2)=\frac{0.2-0.1}{0.5}=0.2.

Dans cette plage, la probabilité est la largeur de l’intervalle multipliée par 2. Ce multiplicateur est la densité de probabilité : p(x)=2p(x)=2 pour 0≤x≤0.50\leq x\leq0.5, et zéro en dehors. La densité décrit la probabilité par unité de la variable, pas la probabilité d’une valeur exacte.

Une probabilité nulle pour un point ne signifie pas que rien n’est échantillonné. Rétrécissez un intervalle autour de 0.15 : sa probabilité est le double de sa largeur, donc elle tend vers zéro quand la largeur tend vers zéro. Le point exact seul a donc une probabilité nulle. Un tirage produit pourtant une valeur dans [0,0.5][0,0.5], et cet intervalle entier a une probabilité de 1. Si vous enregistrez le résultat arrondi à deux décimales, une valeur enregistrée de 0.15 représente l’intervalle de 0.145 à 0.155, dont la probabilité est 2×0.01=0.022\times0.01=0.02.

Pour une densité non uniforme, le multiplicateur varie avec xx. L’intégrale additionne les contributions sur l’intervalle :

P(a≤X≤b)=∫abp(x) dx.P(a\leq X\leq b)=\int_a^bp(x)\,dx.

Géométriquement, c’est l’aire sous la courbe de densité entre aa et bb ; l’aire sur toute la plage vaut 1. Pour l’exemple uniforme, l’aire est simplement la hauteur 2 fois la largeur 0.5. Une densité peut donc dépasser 1, et son log peut être positif, comme log⁡2≈0.69\log2\approx0.69 ici. Une probabilité ne dépasse jamais 1.

La distribution gaussienne utilisée pour le bruit dans DDPM a une densité de ce type. Toutes les distributions continues n’ont pas une densité ordinaire : la distribution de Cantor est un contre-exemple mathématique, hors des modèles discutés ici. Stocker des nombres réels n’implique pas non plus une distribution continue : une variable restreinte à 0.0 et 1.0 a toujours deux résultats discrets.

Les articles utilisent souvent la même lettre pour les probabilités et les densités. Vérifiez comment l’article définit la distribution de la variable et quelle variable est sommée ou intégrée. Une intégrale sur une variable cachée zz, comme le code latent dans l’ELBO de la Partie 4, ne vous dit pas si un xx observé est discret ou continu. Certains articles écrivent PP majuscule pour les probabilités et pp minuscule pour les densités, mais beaucoup utilisent pp pour les deux.

Pour décrire à quel point une distribution s’étale autour de sa moyenne, les articles utilisent la variance : la différence quadratique moyenne à la moyenne, Var⁡(X)=E[(X−μ)2]\operatorname{Var}(X)=\mathbb E[(X-\mu)^2], où μ=E[X]\mu=\mathbb E[X]. L’écart-type en est la racine carrée, donc il a les mêmes unités que XX.

Ces quantités apparaissent aussi dans les noms de distributions. La distribution gaussienne, aussi appelée loi normale, s’écrit N(μ,σ2)\mathcal N(\mu,\sigma^2) : μ\mu est sa moyenne et σ2\sigma^2 sa variance. Pour un vecteur, N(μ,Σ)\mathcal N(\mu,\Sigma) utilise une matrice de covariance Σ\Sigma : l’entrée (i,j)(i,j) mesure comment les coordonnées ii et jj varient ensemble, et la diagonale contient leurs variances. N(0,I)\mathcal N(0,I) décrit un vecteur de nombres normaux standard indépendants, chacun de moyenne 0 et de variance 1 ; II est la matrice identité.

Les tableaux de benchmark rapportent souvent un score moyen accompagné d’une mesure de variation. La dispersion des exécutions individuelles diffère de l’incertitude sur leur moyenne : pour NN exécutions indépendantes d’écart-type σ\sigma, l’erreur-type de la moyenne est σ/N\sigma/\sqrt N.

Avant de comparer deux entrées comme 82.3±0.482.3\pm0.4 et 81.5±0.481.5\pm0.4, cherchez dans la légende si 0.4 est un écart-type entre exécutions, une erreur-type ou la demi-largeur d’un intervalle de confiance. Pour comparer les moyennes, calculez un intervalle pour leur différence. Une procédure d’intervalle de confiance à 95 % produit des plages qui contiennent la vraie différence dans 95 % des expériences répétées, sous ses hypothèses.

Pour cet exemple, supposons quatre exécutions indépendantes par modèle, des scores d’exécution approximativement normaux et des variances de population égales. Si les exécutions sont appariées, par exemple deux modèles évalués sur les mêmes tâches échantillonnées indépendamment, analysez plutôt les différences au sein des paires. Le guide à deux échantillons du NIST explique ces cas.

Pour des moyennes indépendantes, la variance de leur différence est la somme de leurs variances. Une variable normale standard tombe entre −1.96-1.96 et 1.961.96 avec une probabilité d’environ 0.95, ce qui fournit le multiplicateur d’une approximation normale d’un intervalle à 95 %. Si 0.4 est l’écart-type sur quatre exécutions, ce premier calcul donne :

standard error of each mean=0.4/4=0.2standard error of the gap=0.22+0.22≈0.28gap=82.3−81.5=0.8normal approximation=0.8±1.96×0.28≈0.8±0.55=from 0.25 to 1.35\begin{aligned} \text{standard error of each mean}&=0.4/\sqrt4=0.2\\ \text{standard error of the gap}&=\sqrt{0.2^2+0.2^2}\approx0.28\\ \text{gap}&=82.3-81.5=0.8\\ \text{normal approximation}&=0.8\pm1.96\times0.28\approx0.8\pm0.55\\ &=\text{from }0.25\text{ to }1.35 \end{aligned}

Ce multiplicateur 1.96 traite la dispersion estimée comme connue. Avec seulement quatre exécutions par modèle, utilisez la loi de Student pour tenir compte de l’incertitude sur la dispersion. Sous les hypothèses ci-dessus, ses degrés de liberté sont 4+4−2=64+4-2=6 (huit exécutions moins deux moyennes estimées). scipy.stats.t.ppf(0.975, 6) donne environ 2.447 au lieu de 1.96 ; 0.975 laisse 2.5 % hors de chaque extrémité d’un intervalle à 95 %. Si l’hypothèse de variances égales ne convient pas, utilisez un intervalle de Welch, dont les degrés de liberté se calculent différemment.

Considérons maintenant l’autre lecture de la légende : 0.4 est déjà l’erreur-type de chaque moyenne, estimée à partir de ces quatre exécutions. Rien n’est divisé par 4\sqrt4, et l’erreur-type de l’écart vaut environ 0.566. Le multiplicateur de Student reste nécessaire. Les deux lectures donnent :

0.4 a standard deviation, t interval:0.8±2.4470.22+0.22≈0.8±0.69from 0.11 to 1.490.4 a standard error, t interval:0.8±2.4470.42+0.42≈0.8±1.38from −0.58 to 2.18\begin{aligned} \text{0.4 a standard deviation, t interval:}&\quad0.8\pm2.447\sqrt{0.2^2+0.2^2}\approx0.8\pm0.69\\ &\quad\text{from }0.11\text{ to }1.49\\ \text{0.4 a standard error, t interval:}&\quad0.8\pm2.447\sqrt{0.4^2+0.4^2}\approx0.8\pm1.38\\ &\quad\text{from }-0.58\text{ to }2.18 \end{aligned}

La figure compare l’approximation normale initiale avec les deux intervalles de Student :

Trois intervalles pour le même écart de 0.8, en supposant quatre exécutions indépendantes approximativement normales par modèle et des variances de population égales. Avec 0.4 comme écart-type, l'approximation normale donne de 0.25 à 1.35 et l'intervalle de Student de 0.11 à 1.49. Avec 0.4 comme erreur-type estimée, l'intervalle de Student va de moins 0.58 à 2.18 et contient zéro.Trois intervalles pour le même écart de 0.8, en supposant quatre exécutions indépendantes approximativement normales par modèle et des variances de population égales. Avec 0.4 comme écart-type, l'approximation normale donne de 0.25 à 1.35 et l'intervalle de Student de 0.11 à 1.49. Avec 0.4 comme erreur-type estimée, l'intervalle de Student va de moins 0.58 à 2.18 et contient zéro.

Quand 0.4 est l’écart-type, l’intervalle de Student exclut zéro : sous ces hypothèses, les résultats soutiennent une différence positive. Quand 0.4 est l’erreur-type estimée, l’intervalle contient zéro, donc les résultats n’établissent pas quel modèle a le score moyen le plus élevé.

Entropie croisée et divergence KL

Pendant l’entraînement, un modèle a besoin d’une perte numérique qui mesure à quel point ses probabilités prédites concordent avec la cible d’entraînement. L’algorithme d’entraînement modifie les paramètres du modèle pour réduire cette perte. L’entropie croisée fournit une telle perte pour des exemples étiquetés ou pour les probabilités d’un modèle enseignant. La divergence de Kullback–Leibler (KL) mesure l’écart entre deux distributions. Les articles l’utilisent pour entraîner un étudiant à imiter un enseignant ou pour pénaliser les écarts par rapport à un modèle de référence fixe.

Ici, les résultats sont discrets, comme des tokens ou des classes. Notons pp la distribution cible et qq la distribution prédite par le modèle sur les mêmes résultats. Partons d’un résultat observé ii : quand le modèle lui a donné la probabilité qiq_i, sa perte est −log⁡qi-\log q_i. Elle vaut 0 quand qi=1q_i=1, environ 0.69 quand qi=0.5q_i=0.5, environ 2.3 quand qi=0.1q_i=0.1, et est infinie quand qi=0q_i=0.

L’entropie croisée fait la moyenne de cette perte sur les résultats tirés de la cible :

H(p,q)=Ei∼p[−log⁡qi]=−∑ipilog⁡qi.H(p,q)=\mathbb E_{i\sim p}[-\log q_i]=-\sum_i p_i\log q_i.

Avec une étiquette one-hot pp, qui vaut 1 sur la classe correcte yy et 0 ailleurs, seule la classe correcte compte, et H(p,q)=−log⁡qyH(p,q)=-\log q_y : la perte de classification ordinaire. nn.CrossEntropyLoss de PyTorch la calcule à partir des scores bruts du modèle, appelés logits, et applique le log-softmax en interne ; son entrée n’est pas le vecteur de probabilités qq. Avec la distribution souple d’un modèle enseignant comme pp, chaque classe compte en proportion de la probabilité de l’enseignant. La distillation classique entraîne ainsi un petit modèle sur les probabilités d’un grand modèle. Pour la cible p=(0.9,0.1)p=(0.9,0.1), deux modèles ont ces entropies croisées H(p,q)H(p,q) :

q=(0.5,0.5):−0.9log⁡0.5−0.1log⁡0.5≈0.693q=(0.9,0.1):−0.9log⁡0.9−0.1log⁡0.1≈0.095+0.230=0.325\begin{aligned} q=(0.5,0.5):&\quad -0.9\log0.5-0.1\log0.5\approx0.693\\ q=(0.9,0.1):&\quad -0.9\log0.9-0.1\log0.1\approx0.095+0.230=0.325 \end{aligned}

Le second modèle correspond à la cible, et aucun modèle ne peut faire mieux. Ce minimum, 0.325 ici, est H(p)=−∑ipilog⁡piH(p)=-\sum_ip_i\log p_i, l’entropie de pp. Elle ne vaut 0 que pour une cible one-hot : quand la cible elle-même est incertaine, il reste une perte qu’aucun modèle ne peut supprimer.

La divergence KL soustrait ce minimum et ne garde que la perte due à l’écart de qq par rapport à pp. Elle s’écrit avec une double barre ∥\Vert, qui sépare seulement les deux arguments ; ce n’est ni la barre de probabilité conditionnelle ∣\mid de Probabilité conditionnelle et probabilité d’un texte, ni les barres de longueur ∥x∥\Vert x\Vert de la référence sur les vecteurs. Les articles l’utilisent à la place d’une virgule pour marquer que l’ordre compte : la moyenne porte sur les résultats tirés du premier argument.

DKL(p ∥ q)=H(p,q)−H(p)=∑ipilog⁡piqi=Ei∼p[log⁡piqi].D_{\mathrm{KL}}(p\,\Vert\,q)=H(p,q)-H(p)=\sum_i p_i\log\frac{p_i}{q_i}=\mathbb E_{i\sim p}\Bigl[\log\frac{p_i}{q_i}\Bigr].

Pour le premier modèle ci-dessus, 0.693−0.325≈0.370.693-0.325\approx0.37. La KL vaut 0 quand les deux distributions coïncident et est positive sinon.

L’ordre change les écarts qui sont pénalisés. Un terme avec pi>0p_i>0 et qi=0q_i=0 est infini, donc DKL(p∥q)D_{\mathrm{KL}}(p\Vert q) pénalise un qq qui attribue une probabilité nulle à tout ce que pp peut produire. Les résultats avec pi=0p_i=0 n’ajoutent rien (par convention 0log⁡0=00\log0=0), donc ils n’apportent aucune pénalité directe même si qi>0q_i>0. Inverser les arguments donne DKL(q∥p)D_{\mathrm{KL}}(q\Vert p), qui est infinie partout où qi>0q_i>0 et pi=0p_i=0. Les résultats avec qi=0q_i=0 n’ajoutent alors rien, même si pi>0p_i>0. Avec pp comme cible, DKL(p∥q)D_{\mathrm{KL}}(p\Vert q) s’appelle la KL directe (forward) et DKL(q∥p)D_{\mathrm{KL}}(q\Vert p) la KL inverse (reverse).

Pour p=(0.5,0.5)p=(0.5,0.5) et q=(1,0)q=(1,0), la KL directe est infinie, parce que qq manque un résultat que pp produit, alors que la KL inverse n’est que 1×log⁡(1/0.5)+0=log⁡21\times\log(1/0.5)+0=\log2 : le résultat que qq ignore n’ajoute rien. Pour p=(0.9,0.1)p=(0.9,0.1) et q=(0.5,0.5)q=(0.5,0.5), la KL directe est le 0.37 trouvé plus haut, calculé ici terme à terme, et la KL inverse diffère :

DKL(p∥q)=0.9log⁡0.90.5+0.1log⁡0.10.5≈0.53−0.16=0.37DKL(q∥p)=0.5log⁡0.50.9+0.5log⁡0.50.1≈−0.29+0.80=0.51\begin{aligned} D_{\mathrm{KL}}(p\Vert q)&=0.9\log\tfrac{0.9}{0.5}+0.1\log\tfrac{0.1}{0.5}\approx0.53-0.16=0.37\\ D_{\mathrm{KL}}(q\Vert p)&=0.5\log\tfrac{0.5}{0.9}+0.5\log\tfrac{0.5}{0.1}\approx-0.29+0.80=0.51 \end{aligned}

Cette asymétrie explique pourquoi la KL s’appelle une divergence et non une distance.

Comme H(p,q)=H(p)+DKL(p∥q)H(p,q)=H(p)+D_{\mathrm{KL}}(p\Vert q), et qu’un enseignant fixe a une entropie H(p)H(p) qui ne dépend pas de l’étudiant, l’entropie croisée contre un enseignant fixe donne à l’étudiant les mêmes gradients que DKL(p∥q)D_{\mathrm{KL}}(p\Vert q). Modifier un paramètre de l’étudiant change les deux pertes de la même quantité, donc leurs dérivées utilisées pour l’entraînement sont égales ; Gradients et optimisation explique ce calcul. Cela permet au code de classification et de distillation classique d’utiliser l’entropie croisée. L’échange ne fonctionne qu’avec l’enseignant en premier. Avec l’étudiant en premier, DKL(q∥p)=H(q,p)−H(q)D_{\mathrm{KL}}(q\Vert p)=H(q,p)-H(q), et l’entropie propre de l’étudiant H(q)H(q) change pendant son entraînement, donc les deux ne donnent plus les mêmes gradients.

Vecteurs et matrices

Les équations d’architecture décrivent des calculs sur des tableaux de nombres. La forme (shape) d’un tableau dit comment ses nombres sont organisés, quelles opérations sont valides et ce qu’elles produisent. Un vecteur est une liste ordonnée de nombres. Une matrice range des nombres en lignes et en colonnes. Dans le code de ML, tenseur est le terme général pour ces tableaux numériques, y compris ceux de plus de deux axes. Un axe est une dimension le long de laquelle on indexe le tableau : une matrice a un axe des lignes et un axe des colonnes.

L’état caché d’un token est un vecteur de nombres calculé à l’intérieur du modèle pour représenter ce token. Supposons que nous traitions ensemble un batch de BB séquences, chacune de TT positions de tokens, et que chaque état caché contienne dd nombres. Le tableau des états cachés a la forme [B, T, d], que les articles écrivent aussi B×T×dB\times T\times d. Ses trois axes sélectionnent la séquence, la position du token et le nombre dans le vecteur de ce token. Par exemple, [2, 3, 4] contient deux séquences, trois vecteurs de tokens par séquence et quatre nombres par vecteur : 24 nombres au total. Ici dd est la largeur du vecteur. La forme liste les trois tailles ; leur produit donne le nombre d’entrées.

Les articles écrivent souvent les formes comme une appartenance à un ensemble : a∈Rda\in\mathbb R^d signifie que aa est un vecteur de dd nombres réels, et A∈Rm×nA\in\mathbb R^{m\times n} que AA est une matrice de mm lignes et nn colonnes. Les lettres en gras marquent parfois des vecteurs ou des tenseurs, mais c’est la définition de l’article qui détermine la forme.

Dans le tableau ci-dessous, aa et bb sont des vecteurs colonnes : leurs nombres sont disposés verticalement. L’exposant ⊤\top désigne la transposée : échanger les lignes et les colonnes. Ainsi a⊤a^\top est une ligne contenant les mêmes nombres que la colonne aa. Les AA et BB majuscules nomment ici des matrices ; BB ne désigne plus la taille du batch.

ExpressionValeurs utiliséesCe que fait l’opérationRésultat
a⊤ba^\top b — produit scalaireDeux vecteurs colonnes de dd entrées chacunMultiplier les entrées correspondantes, puis additionner les produits : ∑iaibi\sum_i a_i b_iUn nombre
ab⊤ab^\top — produit extérieurUne colonne aa de mm entrées et une colonne bb de nn entréesMultiplier chaque entrée de aa par chaque entrée de bbUne matrice m×nm\times n ; l’entrée (i,j)(i,j) est aibja_i b_j
ABAB — produit matricielAA à mm lignes et kk colonnes ; BB à kk lignes et nn colonnesPour l’entrée (i,j)(i,j), multiplier les nombres correspondants de la ligne ii de AA et de la colonne jj de BB, puis additionnerUne matrice m×nm\times n ; le nombre de colonnes de AA doit égaler le nombre de lignes de BB
A⊙BA\odot B — produit terme à termeDeux tableaux de même formeMultiplier les entrées aux positions correspondantes, sans les additionnerUn tableau de même forme
[a;b][a;b] — concaténationDes colonnes aa et bb de mm et nn entréesPlacer les entrées de bb après celles de aaUne colonne de m+nm+n entrées ; vérifiez la convention de l’article pour l’axe de jonction

Pour une comparaison concrète, prenons a=(12)a=\begin{pmatrix}1\\2\end{pmatrix} et b=(34)b=\begin{pmatrix}3\\4\end{pmatrix}. Déplacer la transposée change à la fois le calcul et le résultat :

a⊤b=1×3+2×4=11ab⊤=(1×31×42×32×4)=(3468).\begin{aligned} a^\top b&=1\times3+2\times4=11\\ ab^\top&=\begin{pmatrix}1\times3&1\times4\\2\times3&2\times4\end{pmatrix}=\begin{pmatrix}3&4\\6&8\end{pmatrix}. \end{aligned}

Le produit scalaire donne un seul score, comme la comparaison requête–clé dans l’attention. Le produit extérieur garde une valeur distincte pour chaque paire d’entrées ; la mise à jour de Gated DeltaNet l’utilise pour construire une mise à jour matricielle à partir de deux vecteurs.

Un produit matriciel peut être regroupé autrement, (AB)C=A(BC)(AB)C=A(BC), mais pas réordonné ; la dérivation de MLA utilise ce regroupement pour éviter de reconstruire les clés. NumPy écrit la multiplication matricielle @ et le produit terme à terme *. Les articles n’héritent pas des règles de broadcasting de NumPy : ajouter un vecteur à une matrice exige un axe explicite. Les articles diffèrent aussi sur la question de savoir si un vecteur est une ligne ou une colonne : l’attention empile les tokens comme lignes de QQ, tandis que MLA, Gated DeltaNet et LoRA écrivent WhWh avec des vecteurs colonnes, et nn.Linear de PyTorch calcule x @ W.T sur des lignes.

Une équation d’architecture peut aussi décrire la taille d’un vecteur, restreindre les matrices permises ou réarranger un produit :

NotationSens
∥x∥2=∑ixi2\Vert x\Vert_2=\sqrt{\sum_i x_i^2}La longueur euclidienne ; ∥x∥2\Vert x\Vert^2, sans la racine, apparaît dans la perte de DDPM
∥x∥1=∑i∣xi∣\Vert x\Vert_1=\sum_i\vert x_i\vertLa somme des valeurs absolues
∥A∥2\Vert A\Vert_2La norme spectrale : le plus grand facteur par lequel AA augmente la longueur d’un vecteur ; mHC la maintient à 1 au plus
rank⁡(A)\operatorname{rank}(A)Le nombre de colonnes indépendantes ; la mise à jour de LoRA est de rang au plus rr
det⁡A\det ALe déterminant : ∣det⁡A∣\vert\det A\vert est le facteur par lequel AA met à l’échelle les volumes, et le signe indique si AA inverse l’orientation ; l’exemple de changement de variables de l’Annexe B de cet article l’utilise
A≥0A\geq0Chaque entrée est positive ou nulle, comme dans mHC ; A⪰0A\succeq0 est une condition différente, semi-définie positive : x⊤Ax≥0x^\top Ax\geq0 pour tout xx
II, 1n\mathbf 1_nLa matrice identité (1 sur sa diagonale, 0 ailleurs, donc Ix=xIx=x) ; un vecteur de nn uns
(AB)⊤=B⊤A⊤(AB)^\top=B^\top A^\topTransposer un produit inverse l’ordre ; les sections RoPE et MLA de la Partie 2 l’utilisent

Gradients et optimisation

L’entraînement utilise des dérivées pour décider comment modifier les paramètres du modèle. Soit L\mathcal L une perte scalaire et θ\theta le vecteur de tous les paramètres ; θi\theta_i est une entrée de ce vecteur.

La dérivée partielle ∂L/∂θi\partial\mathcal L/\partial\theta_i est un nombre, évalué aux valeurs actuelles des paramètres. Elle mesure le taux de variation de la perte quand seul θi\theta_i change et que les autres paramètres restent fixes. Lisez-la « la dérivée partielle de la perte par rapport au paramètre θi\theta_i ».

Le gradient ∇θL\nabla_\theta\mathcal L rassemble ces nombres pour tous les paramètres en un seul vecteur. Sa ii-ième entrée est ∂L/∂θi\partial\mathcal L/\partial\theta_i. Le symbole ∇\nabla s’appelle nabla ; ici il signifie « prendre le gradient ». Avec un seul paramètre, le gradient a une entrée égale à la dérivée ordinaire.

Par exemple, prenons L(θ1,θ2)=θ12+3θ22\mathcal L(\theta_1,\theta_2)=\theta_1^2+3\theta_2^2. En θ1=2\theta_1=2 et θ2=1\theta_2=1 :

∂L∂θ1=2θ1=4∂L∂θ2=6θ2=6∇θL=(46).\begin{aligned} \frac{\partial\mathcal L}{\partial\theta_1}&=2\theta_1=4\\ \frac{\partial\mathcal L}{\partial\theta_2}&=6\theta_2=6\\ \nabla_\theta\mathcal L&=\begin{pmatrix}4\\6\end{pmatrix}. \end{aligned}

La première dérivée partielle, 4, signifie qu’augmenter θ1\theta_1 de 0.01 fait monter la perte d’environ 0.04 tandis que θ2\theta_2 reste fixe. Le gradient contient cette information pour les deux paramètres. La descente de gradient soustrait la dérivée de chaque paramètre, multipliée par un taux d’apprentissage positif η\eta qui contrôle la taille du pas :

θ←θ−η∇θL,η>0.\theta\leftarrow\theta-\eta\nabla_\theta\mathcal L,\qquad\eta>0.

Avec η=0.1\eta=0.1, l’exemple passe de (2,1)(2,1) à (1.6,0.4)(1.6,0.4), et la perte tombe de 7 à 3.04. Pour une perte dérivable de gradient non nul, un pas suffisamment petit fait baisser la perte. Un gradient nul ne donne aucune mise à jour.

L’indice de ∇\nabla dit ce qui varie. ∇θlog⁡pθ(x)\nabla_\theta\log p_\theta(x) fait varier les paramètres ; ∇xlog⁡pθ(x)\nabla_x\log p_\theta(x) fait varier l’entrée, et les articles sur la diffusion l’appellent le score, qui n’a rien à voir avec le score d’un benchmark.

Une jacobienne enregistre les dérivées de plusieurs sorties. Une couche de réseau de neurones peut produire beaucoup de nombres, comme les composantes de l’état caché d’un token. Pour décrire comment chaque sortie réagit à chaque entrée, on rassemble les dérivées partielles dans une matrice appelée jacobienne. Pour y=f(x)y=f(x) avec nn nombres en entrée et mm nombres en sortie, sa forme est m×nm\times n : les lignes correspondent aux sorties, les colonnes aux entrées, et l’entrée Jij=∂yi/∂xjJ_{ij}=\partial y_i/\partial x_j mesure comment la sortie ii change quand l’entrée jj change.

Par exemple, soit une fonction qui prend deux nombres et renvoie y1=x1+2x2y_1=x_1+2x_2 et y2=3x1−x2y_2=3x_1-x_2. Sa jacobienne est

J=(∂y1/∂x1∂y1/∂x2∂y2/∂x1∂y2/∂x2)=(123−1).\begin{aligned} J&=\begin{pmatrix} \partial y_1/\partial x_1 & \partial y_1/\partial x_2\\ \partial y_2/\partial x_1 & \partial y_2/\partial x_2 \end{pmatrix}\\ &=\begin{pmatrix}1&2\\3&-1\end{pmatrix}. \end{aligned}

La deuxième colonne dit qu’augmenter x2x_2 de 0.1 en gardant x1x_1 fixe augmente y1y_1 de 0.2 et diminue y2y_2 de 0.1. Cet exemple est linéaire, donc sa jacobienne est constante. Pour une fonction non linéaire, les entrées peuvent dépendre de l’entrée courante et décrivent de petits changements locaux. Avec une seule sortie scalaire, la jacobienne a une ligne : les mêmes dérivées que le gradient, transposées avec notre convention de vecteurs colonnes. Deep Learning, §4.3, donne les définitions générales.

La rétropropagation utilise ces dérivées pour calculer le gradient de la perte à travers les couches successives. L’exemple de changement de variables de l’Annexe B de cet article utilise une autre propriété : la valeur absolue du déterminant d’une jacobienne carrée donne le facteur local de mise à l’échelle des volumes, nécessaire pour ajuster une densité de probabilité.

Pour l’entraînement, les dérivées décrivent des changements locaux ; un objectif d’optimisation énonce ce que les mises à jour doivent minimiser ou maximiser. Les articles distinguent la meilleure valeur d’un objectif des paramètres qui l’atteignent : min⁡θf(θ)\min_\theta f(\theta) est la plus petite valeur de ff, tandis que arg min⁡θf(θ)\operatorname*{arg\,min}_\theta f(\theta) donne les valeurs de paramètres qui l’atteignent. Pour f(θ)=(θ−3)2f(\theta)=(\theta-3)^2, le minimum est 0 et l’argmin est 3. Un argmin précise le résultat voulu, mais laisse ouvert l’algorithme de mise à jour.

Par exemple, MiniLLM écrit son but θ=arg min⁡θDKL(qθ∥p)\theta=\operatorname*{arg\,min}_\theta D_{\mathrm{KL}}(q_\theta\Vert p) (équation 1), où qθq_\theta est le modèle étudiant et pp l’enseignant dont il apprend. Le §2.2 en dérive ensuite un gradient et le modifie pour stabiliser l’entraînement ; l’équation (7) est le gradient utilisé pour les mises à jour. L’exemple de la distillation on-policy explique ces changements. Lire seulement l’argmin les ferait manquer.

Un stop-gradient, sg⁡(x)\operatorname{sg}(x), transmet xx vers l’avant inchangé mais bloque les gradients qui le traversent, comme .detach() dans PyTorch. Deux expressions de même valeur en passe avant peuvent s’entraîner différemment si l’une d’elles est détachée. Dans l’exemple de GRPO, Hugging Face TRL traite la log-probabilité de l’ancien modèle comme fixe. Dans le raccourci de distillation discuté par DeepSeek-V4, un log-rapport enseignant–étudiant détaché fournit un poids fixe pour la mise à jour.

Ensembles et contraintes

Une contrainte énonce quelles valeurs sont permises. Les articles expriment souvent les contraintes avec des ensembles : des collections de membres distincts, écrites entre accolades, comme {1,2,3}\{1,2,3\}. L’ordre n’a pas d’importance, donc {3,1,2}\{3,1,2\} nomme le même ensemble. Les entrées répétées ne comptent qu’une fois. En revanche, les parenthèses d’un vecteur comme (1,2,3)(1,2,3) décrivent une liste ordonnée : (3,1,2)(3,1,2) est un autre vecteur.

Une fois qu’un article a défini un ensemble, il peut tester l’appartenance, combiner des ensembles, compter leurs membres ou énoncer une condition à leur sujet. Prenons A={1,2,3}A=\{1,2,3\} et B={3,4}B=\{3,4\} :

NotationSensExemple et façon de le lire
x∈Ax\in AAppartenance : xx appartient à AA2∈A2\in A : 2 est un membre de AA
A∪BA\cup BUnion : inclure chaque membre de l’un ou l’autre ensembleA∪B={1,2,3,4}A\cup B=\{1,2,3,4\} ; n’inclure 3 qu’une fois
A∩BA\cap BIntersection : ne garder que les membres communs aux deux ensemblesA∩B={3}A\cap B=\{3\}
∣A∣\vert A\vertLe nombre de membres distincts∣A∣=3\vert A\vert=3
∀\forall« Pour tout » : une condition doit valoir pour tous les membres nommés∀x∈A: x>0\forall x\in A:\ x>0 : chaque membre de AA est positif
∃\exists« Il existe » : au moins un membre doit satisfaire la condition∃x∈A: x>2\exists x\in A:\ x>2 : AA a un membre supérieur à 2, à savoir 3

La notation de forme de Vecteurs et matrices nomme aussi des ensembles : Rd\mathbb R^d est l’ensemble de tous les vecteurs de dd nombres réels, et Rn×d\mathbb R^{n\times d} l’ensemble de toutes les matrices réelles à nn lignes et dd colonnes. Ainsi Q∈Rn×dkQ\in\mathbb R^{n\times d_k} précise quelle forme QQ doit avoir.

La notation par compréhension décrit un ensemble par une condition : {x∈S∣condition}\{x\in S\mid\text{condition}\} se lit « les membres de SS qui satisfont la condition », comme la compréhension d’ensemble Python {x for x in S if condition(x)}. La barre signifie « tel que », pas la probabilité conditionnelle ; certains articles utilisent deux-points à la place. Les exemples de cette série incluent les matrices permises de mHC, les experts sélectionnés de MoE et les tokens sélectionnés de l’attention parcimonieuse.

DAPO, une méthode d’entraînement qui filtre des groupes de réponses générées, ne garde une question que lorsque certaines réponses sont correctes et d’autres fausses. Pour GG réponses échantillonnées o1,…,oGo_1,\ldots,o_G et une réponse de référence aa, écrivons l’ensemble des indices des réponses correctes

C={i∈{1,…,G}∣is_equivalent⁡(a,oi)}.C=\{i\in\{1,\ldots,G\}\mid\operatorname{is\_equivalent}(a,o_i)\}.

Le filtre est 0<∣C∣<G0<\vert C\vert<G. Utiliser des indices rend le décompte explicite : deux échantillons de texte identique comptent toujours pour deux réponses. L’article de DAPO écrit plutôt l’ensemble sur les réponses oio_i ; lu littéralement comme un ensemble de textes, cette forme compte une seule fois deux réponses identiques.

Exercices

  1. Formes. QQ est 4×84\times8, KK est 6×86\times8 et VV est 6×36\times3. Quelles sont les formes des scores et de la sortie ? Sur quel axe le softmax porte-t-il ?
  2. Softmax. Calculez le softmax de (0,log⁡4)(0,\log4). Ajouter 100 aux deux entrées change-t-il le résultat ?
  3. Moyennes. Une réponse a un seul token de perte 4 ; une autre a trois tokens de perte 0. Calculez la moyenne par token et la moyenne par réponse.
  4. Conditionnement. Sur 200 réponses, 120 sont correctes, 80 passent la validation de format et 60 font les deux. Trouvez P(correct∣valid)P(\text{correct}\mid\text{valid}) et P(valid∣correct)P(\text{valid}\mid\text{correct}).
  5. KL. Pour un enseignant p=(1,0)p=(1,0) et un étudiant q=(0.5,0.5)q=(0.5,0.5), calculez les deux sens de la KL.
  6. Ensembles. DAPO ne garde une question que si 0<∣C∣<G0<\vert C\vert<G, où CC contient les indices des réponses correctes parmi GG échantillons. Avec G=4G=4, garde-t-il une question dont les réponses obtiennent (1,1,1,1)(1,1,1,1) ? Une dont les réponses obtiennent (1,0,1,1)(1,0,1,1) ? La première réponse change-t-elle si les quatre échantillons contiennent un texte correct identique ?

Réponses :

  1. Les scores sont 4×64\times6 et la sortie est 4×34\times3. Le softmax porte sur les six clés de la ligne de chaque requête.

  2. (1/5,4/5)(1/5,4/5). Ajouter le même nombre à chaque entrée laisse le softmax inchangé, mais calculer e100e^{100} directement déborde en flottants 32 bits.

  3. Les deux moyennes :

    per token:(4+0+0+0)/4=1per answer:(4/1+0/3)/2=(4+0)/2=2\begin{aligned} \text{per token:}&\quad(4+0+0+0)/4=1\\ \text{per answer:}&\quad(4/1+0/3)/2=(4+0)/2=2 \end{aligned}
  4. 60/80=0.7560/80=0.75 et 60/120=0.560/120=0.5.

  5. DKL(p∥q)=log⁡2≈0.69D_{\mathrm{KL}}(p\Vert q)=\log2\approx0.69, et DKL(q∥p)=∞D_{\mathrm{KL}}(q\Vert p)=\infty, parce que l’étudiant met de la probabilité sur un résultat que l’enseignant exclut.

  6. Non : C={1,2,3,4}C=\{1,2,3,4\} a quatre membres, ce qui égale GG. Oui : C={1,3,4}C=\{1,3,4\} a trois membres, entre 0 et 4. Un texte identique ne change pas la première réponse : ce sont quatre échantillons distincts, donc leurs quatre indices comptent toujours.

Annexe A. Lettres grecques

Les rôles indiqués sont des exemples courants ; chaque article définit toujours ce que signifient ses symboles.

LettreNomRôles courants dans les articles de ML
α\alphaalphaUn poids de mélange ou un facteur d’échelle ; une décroissance (Gated DeltaNet) ; un calendrier de bruit (DDPM)
β\betabêtaUne force de pénalité (DPO, GRPO) ; une force d’écriture (Gated DeltaNet) ; un calendrier de bruit (DDPM)
γ\gammagammaUn facteur d’actualisation en RL ; un pas (la mise à jour du biais dans DeepSeek-V3)
δ,Δ\delta,\DeltadeltaUne différence ou un changement
ϵ,ε\epsilon,\varepsilonepsilonDu bruit (DDPM) ; une plage de clipping (GRPO) ; un petit terme de stabilisation
η\etaêtaLe taux d’apprentissage
θ,Θ\theta,\ThetathêtaLes paramètres du modèle ; les angles de rotation de RoPE
λ,Λ\lambda,\LambdalambdaUn poids de régularisation ; une valeur propre
μ\mumuUne moyenne ; le nombre de pas de gradient par batch dans l’Algorithm 1 de DeepSeekMath
π,Π\pi,\PipiUne politique ; ∏\prod est l’opérateur produit
ρ\rhorhôUn rapport de probabilités, comme dans la section GRPO de la Partie 3 ; une corrélation
σ,Σ\sigma,\SigmasigmaLa sigmoïde (DPO) ; un écart-type ; une covariance ; ∑\sum est l’opérateur somme
τ\tautauUne température ; un seuil ; une trajectoire en RL
ϕ,φ,Φ\phi,\varphi,\PhiphiLes paramètres d’un second réseau, comme un encodeur ; des features ; un angle
ψ,Ψ\psi,\PsipsiLes paramètres d’un autre réseau, comme le modèle de valeur VψV_\psi dans la PPO de DeepSeekMath
ω,Ω\omega,\OmegaomégaUne fréquence ; Ω\Omega est aussi une borne inférieure en complexité, ou un ensemble de résultats

Les variantes comme ϕ/φ\phi/\varphi et ϵ/ε\epsilon/\varepsilon sont généralement la même lettre dans une autre police, mais un article peut utiliser les deux pour des variables différentes.

Annexe B. Autres familles d’équations

Des formes d’équations que cette série ne détaille pas, avec les définitions dont chacune a besoin :

Modèles d’espace d’états sélectifs. Un modèle d’espace d’états traite une séquence en mettant à jour un état stocké à chaque pas. Une mise à jour de la forme ht=Aˉtht−1+Bˉtxth_t=\bar A_th_{t-1}+\bar B_tx_t, yt=Cthty_t=C_th_t combine l’état précédent avec l’entrée courante, puis calcule une sortie. Ici xtx_t est l’entrée courante, hth_t l’état stocké et yty_t la sortie. Les matrices Aˉt\bar A_t, Bˉt\bar B_t et CtC_t transforment respectivement l’état précédent, ajoutent la contribution de l’entrée et produisent la sortie. Les barres marquent des paramètres convertis d’un modèle en temps continu vers des pas discrets ; elles ne signifient pas des moyennes. Dans Mamba, les paramètres de la mise à jour dépendent de l’entrée courante, ce que veut dire « sélectif ».

Équations différentielles stochastiques. dx/dt=f(x,t)dx/dt=f(x,t) décrit comment un état xx change avec le temps tt : ff est son taux de variation. Une équation différentielle stochastique (EDS, ou SDE en anglais) ajoute des changements aléatoires, dXt=f(Xt,t) dt+g(Xt,t) dWtdX_t=f(X_t,t)\,dt+g(X_t,t)\,dW_t. Ici ff décrit le changement déterministe, gg fixe l’échelle du bruit, et dWtdW_t est un incrément de mouvement brownien. Pour l’approcher dans le code, la méthode d’Euler–Maruyama utilise un petit pas de temps Δt\Delta t et remplace dWtdW_t par un bruit gaussien de variance Δt\Delta t. La section 5.1 de The Little Book of Generative AI Foundations de Tianhua Chen donne une telle mise à jour ; le §6.4 du même livre utilise les EDS pour décrire les modèles de diffusion.

Changement de variables. Transformer une variable aléatoire change sa densité selon la façon dont la transformation modifie le volume local. Supposons que y=f(x)y=f(x) relie des espaces de même dimension, et que ff et son inverse f−1f^{-1} soient dérivables. Les densités avant et après la transformation, pXp_X et pYp_Y, satisfont pY(y)=pX(f−1(y)) ∣det⁡Jf−1(y)∣p_Y(y)=p_X\bigl(f^{-1}(y)\bigr)\,\bigl\vert\det J_{f^{-1}}(y)\bigr\vert. L’inverse f−1f^{-1} retrouve xx à partir de yy. Sa jacobienne Jf−1J_{f^{-1}} est la matrice carrée des dérivées premières ; la valeur absolue de son déterminant corrige le changement local de volume. Par exemple, si y=2xy=2x en une dimension, la densité devient pY(y)=pX(y/2)/2p_Y(y)=p_X(y/2)/2 : doubler la largeur divise la densité par deux. Les normalizing flows utilisent de telles transformations inversibles pour modéliser des densités ; le §7.1 du livre de Tianhua Chen explique la méthode.

Objectifs min–max. Dans les generative adversarial networks (GAN), un générateur GG produit des exemples et un discriminateur DD essaie de les distinguer des données réelles. L’objectif V(D,G)V(D,G) mesure le succès du discriminateur : DD le maximise tandis que GG le minimise. Le but min⁡Gmax⁡DV(D,G)\min_G\max_DV(D,G) (équation 1) dit : pour chaque générateur possible, considérer le meilleur discriminateur contre lui, puis choisir le générateur qui donne l’objectif résultant le plus petit. L’entraînement ne résout pas exactement cette maximisation interne. L’Algorithm 1 de l’article alterne kk pas de montée de gradient sur DD avec un pas de descente de gradient sur GG ; ses expériences utilisaient k=1k=1.

Le simplexe de probabilités. Un vecteur de probabilités a des entrées positives ou nulles dont la somme vaut 1. L’ensemble de tous ces vecteurs à KK entrées s’appelle le simplexe de probabilités, noté ΔK−1={p∈RK∣pi≥0, ∑ipi=1}\Delta^{K-1}=\{p\in\mathbb R^K\mid p_i\geq0,\ \sum_ip_i=1\}. Chaque sortie de softmax y appartient. Ici Δ\Delta nomme un ensemble, et l’exposant K−1K-1 est sa dimension, pas une puissance : une fois K−1K-1 probabilités choisies, la dernière est imposée par la somme, qui doit valoir 1. Avec deux choix, chaque distribution a la forme (a,1−a)(a,1-a) pour 0≤a≤10\leq a\leq1, donc un seul nombre est libre.

Normalisation. La normalisation remet des valeurs à l’échelle avec la moyenne et la dispersion d’un groupe choisi. Une forme courante est x^=(x−μ)/σ2+ϵ\hat x=(x-\mu)/\sqrt{\sigma^2+\epsilon}, où μ\mu est une moyenne, σ2\sigma^2 une variance, et ϵ\epsilon un petit nombre positif qui évite la division par zéro. L’équation seule ne dit pas quelles entrées servent à calculer la moyenne et la variance. Pour un batch de vecteurs de features, la batch normalization les calcule séparément pour chaque feature sur l’ensemble des exemples. La layer normalization d’un Transformer les calcule séparément pour chaque token sur l’ensemble de ses features. Vérifiez les axes précisés quand vous comparez des implémentations.

Sources et versions

Les numéros de section et d’équation renvoient aux versions liées ici.

  1. Tianhua Chen. The Little Book of Generative AI Foundations: An Intuitive Mathematical Primer. 2026. Version 2 ; le §2.4 et le §3.2 couvrent l’inégalité de Jensen et l’ELBO, le §5.1 et le §6.4 le bruit en temps continu.
  2. Vaswani et al. Attention Is All You Need. 2017. Version 7, §3.2.1, équation (1), et note de bas de page 4.
  3. Dai et al. DeepSeekMoE: Towards Ultimate Expert Specialization in Mixture-of-Experts Language Models. 2024. Segmentation fine des experts et décompte des combinaisons, §3.1 ; ablation, §4.4 et Figure 3.
  4. Shao et al. DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models. 2024. Version 3, §1.1, §4.1.1, équations (1)–(4), et Algorithm 1.
  5. DeepSeek-AI. DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-Experts Language Model. 2024. Version 5, §2.1.1–2.1.3, équations (9)–(19), et Annexe C.
  6. DeepSeek-AI. DeepSeek-V3 Technical Report. 2024–2025. Version 2, §2.1.2, équations (12)–(18).
  7. DeepSeek-AI. DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning. 2025. Version 1 : §2.2.1, équations (1)–(3). Version 2, 2026 : §2.1 et Supplementary A.3.
  8. DeepSeek-AI. DeepSeek-V4: Towards Highly Efficient Million-Token Context Intelligence. 2026. Version 1 : §2.2, équations (1)–(8) ; §5.1.2, équation (29).
  9. Rafailov et al. Direct Preference Optimization: Your Language Model is Secretly a Reward Model. 2023–2024. Version 3, §4, équation (7).
  10. Gu et al. MiniLLM: Knowledge Distillation of Large Language Models. 2023–2024. Version 4, §2.1, équation (1), et §2.2, équations (2) et (7).
  11. Yu et al. DAPO: An Open-Source LLM Reinforcement Learning System at Scale. 2025. Version 2, §3.2–3.3, équations (11)–(12).
  12. Gu et Dao. Mamba: Linear-Time Sequence Modeling with Selective State Spaces. 2023–2024.
  13. Yang et al. Gated Delta Networks: Improving Mamba2 with Delta Rule. 2024–2025. Version 3, §3.1, équation (10), et §3.3–3.4.
  14. Ho, Jain et Abbeel. Denoising Diffusion Probabilistic Models. 2020. Version 2, §2, équations (4)–(5) ; §3.2, équation (12) ; §3.4, équation (14) ; et Algorithms 1–2.
  15. Goodfellow et al. Generative Adversarial Nets. 2014. Équation (1) et Algorithm 1.
  16. Chen et al. Evaluating Large Language Models Trained on Code. 2021. Version 2, §2.1, équation (1), et Figure 3.
  17. Hugging Face TRL. GRPOTrainer et GRPOConfig au commit c6eac19, octobre 2026.
  18. Stanford CS229. Probability Theory Review et Linear Algebra Review and Reference.
  19. Dive into Deep Learning. Preliminaries.
  20. Britz, Goldie, Luong et Le. Massive Exploration of Neural Machine Translation Architectures. 2017. Version 2, Table 5 ; cité par Attention Is All You Need pour la comparaison entre attention par produit scalaire et attention additive.