Un embedding est une table de correspondance, pas une fonction
Une première couche après un tokenizer
Un tokenizer fournit au modèle des identifiants entiers : [256, 1842, 7301, ...]. La première chose qu’un transformer fait : convertir chaque identifiant en un vecteur de d_model flottants. Ce vecteur vit dans un espace de d_model dimensions (768 dimensions pour ANDREA-120M).
Une couche d’embedding est une table de correspondance, pas une fonction. Imaginez une matrice géante :
forme : (V, d_model)
ligne 0 : [e_0_0, e_0_1, ..., e_0_767]
ligne 1 : [e_1_0, e_1_1, ..., e_1_767]
...
ligne 8448 : [e_8448_0, e_8448_1, ..., e_8448_767]
L'identifiant de jeton i sélectionne la ligne i. Accès direct au tableau. Aucun calcul, aucune activation. Juste un index.
Flottants entraînables
Chaque entrée de ce tableau commence comme un petit flottant aléatoire (généralement tiré d'une distribution normale mise à l'échelle par 1/sqrt(d_model)). La rétropropagation met à jour chaque ligne chaque fois que son identifiant de jeton apparaît dans un lot. Après l'entraînement, les jetons similaires (cat, dog, pet) finissent par avoir des vecteurs similaires ; les jetons non liés (cat, Tuesday, xylophone) se retrouvent éloignés dans l'espace vectoriel.
Coût d'embedding des tokens ANDREA-120M
| Quantité | Valeur |
|---|---|
| V | 8,449 |
| d_model | 768 |
| Paramètres | 6,488,832 |
Environ 6,5 M de paramètres résident dans une table d'embedding de tokens, soit environ 5,4 % du total d'ANDREA-120M. Chaque emplacement du vocabulaire reçoit ces 768 flottants.
Dimensionnement des tables d'embedding
Les produits scalaires mesurent la similarité
Les vecteurs comme des flèches
Un vecteur à 768 dimensions vit dans un espace que les humains ne peuvent pas visualiser, mais la même algèbre fonctionne dans n'importe quelle dimension. Deux opérations clés sont importantes pour les transformers :
Norme (longueur d'une flèche) :
||v|| = sqrt(v_0² + v_1² + ... + v_767²)
Produit scalaire (alignement entre deux flèches) :
u · v = u_0 × v_0 + u_1 × v_1 + ... + u_767 × v_767
Ce que vous dit un produit scalaire
Deux faits qui sont valables dans n'importe quelle dimension :
- u · v = ||u|| × ||v|| × cos(theta), où theta est l'angle entre eux.
- Les vecteurs pointant dans la même direction donnent de grands produits scalaires positifs.
- Les vecteurs pointant dans des directions opposées donnent de grands produits scalaires négatifs.
- Les vecteurs formant un angle droit donnent un produit scalaire nul.
Produit scalaire = similarité non normalisée. Deux embeddings entraînés pour cat et dog finissent par avoir un produit scalaire élevé car la rétropropagation les a rapprochés (tous deux prédisent des contextes liés aux animaux domestiques). cat et Tuesday finissent par être presque orthogonaux car ils prédisent des contextes différents.
Pourquoi un Transformer s’en soucie
L’activité 5 (grow_a_language_model_attention) construit l’attention à partir de produits scalaires : un vecteur requête multiplié scalairement par des vecteurs clés produit des scores indiquant quels tokens passés comptent pour prédire le suivant. Les embeddings et les produits scalaires portent ensemble toutes les interactions à l’intérieur d’un transformer.
Prédire la similarité
ANDREA utilise des embeddings de position appris
Un problème
Un embedding de token indique au modèle quel mot se trouve à cette position. Il ne lui indique pas où ce mot se situe. Sans information de position, un transformeur traite the cat sat on a mat et mat a on sat cat the de manière identique : un même ensemble de tokens, sans signal d’ordre.
Trois solutions existent dans la littérature des transformeurs :
Sinusoïdal (Vaswani 2017). Une formule mathématique fixe basée sur des sinus et cosinus. La position 0 reçoit un vecteur 768 spécifique ; la position 1 en reçoit un autre ; jamais entraîné, jamais mis à jour. Se généralise à n’importe quelle position via la formule.
RoPE (Rotary Position Embedding). Fait tourner les vecteurs de requête et de clé en fonction de la position. Utilisé par LLaMA, Qwen. Aucun paramètre supplémentaire ; la rotation est intégrée à l’attention.
Learned. Une table d’embedding séparée de forme (T, d_model) où T est une longueur de contexte. Chaque ligne s’entraîne par rétropropagation, tout comme les embeddings de tokens.
Choix d’ANDREA : Learned
ANDREA hérite d’une approche de position learned de microGPT, qui l’a héritée de nanoGPT, qui l’a héritée de GPT-2. Une raison :
- Simplicité. Aucune mathématique spéciale dans l'attention. Une table de positions ressemble à une table de tokens.
- Compatibilité avec CUDA personnalisé. Le moteur microgpt_cuda.cu d'ANDREA gère deux recherches d'embeddings de manière identique ; aucun noyau sin/cos n'est nécessaire.
- Suffisant pour un contexte fixe. ANDREA limite T à 1024. Une table apprise fonctionne bien pour des séquences de longueur fixe.
Coût de l'Embedding de Position ANDREA-120M
| Quantité | Valeur |
|---|---|
| T (contexte) | 1,024 |
| d_model | 768 |
| Paramètres | 786,432 |
0,79M paramètres pour la position. Combinés aux embeddings de tokens : 6,49M + 0,79M = 7,27M paramètres d’embedding au total pour ANDREA-120M.
Comment ils se combinent
À chaque position t dans une séquence d’entrée :
x_t = token_embedding[token_id_t] + position_embedding[t]
Deux vecteurs de 768 dimensions, additionnés élément par élément. Le résultat, x_t, entre dans le premier bloc transformer. Le modèle ne les sépare plus jamais ; il apprend à utiliser le signal combiné.
Apprises versus sinusoïdales
Où vivent les paramètres d’embedding
Une couche d’embedding complète ANDREA-120M
| Composant | Forme | Paramètres |
|---|---|---|
| Table d'embedding de tokens | 8,449 × 768 | 6,488,832 |
| Table d'embedding de position | 1,024 × 768 | 786,432 |
| Total | 7,275,264 |
Environ 7,3 M paramètres. Le nombre total de paramètres d'ANDREA-120M : ~120 M. La couche d'embedding seule : 6 %. Les 94 % restants se trouvent dans les blocs de transformeur (attention + MLP, abordés dans les activités 5-7).
Embeddings non partagés vs partagés
De nombreux modèles de transformeurs (y compris GPT-2) lient un embedding de token à une projection de sortie finale : la même matrice V × d_model est utilisée à l’entrée et à la sortie (logits sur le vocabulaire). Ce partage économise V × d_model paramètres et améliore souvent la qualité.
ANDREA utilise des embeddings non liés : l’embedding d’entrée et la projection de sortie s’entraînent comme des matrices distinctes. L’activité 7 (grow_a_language_model_transformer_block) couvre une couche finale.
Un passage avant jusqu’à présent
Entrée : identifiants de tokens [256, 1842, 7301, ...] (1024 au total). Chaque identifiant recherche un vecteur de 768 dimensions. Chaque position recherche un vecteur de 768 dimensions. Somme élément par élément. Résultat : une matrice (1024, 768) x de vecteurs token + position. x entre dans le bloc transformeur 1.
L’activité 5 (grow_a_language_model_attention) couvre ce que fait le bloc 1 : attention produit scalaire mis à l’échelle avec masque causal et softmax.