• Génération IA
  • Posts
  • SolidGoldMagikarp, le token qui fit dérailler les modèles de langage

SolidGoldMagikarp, le token qui fit dérailler les modèles de langage

Apprenez en un peu plus sur le fonctionnement des modèles de langage (LLM) et le rôle crucial des tokens via l'incroyable histoire de SolidGoldMagikarp, simple pseudonyme devenu glitch token fatal.

Moi aussi, je vais écrire un roman ! Pas de romance, pas de quantique. Non, moi je vais vous parler d’un célèbre token au nom de pokemon doré : SolidGoldMagikarp. Ce nom ne vous dit rien ? Nan ? SolidGoldMagikarp est pourtant le plus célèbre des “Glitch Tokens”. Une légende des bas-fonds d'Internet. Et les glitch tokens, c'est... euh... ben, faut lire l’article.

Comme titre, j’avais pensé à : “SolidGoldMagikarp et les Glitch Tokens”. Mon éditeur a pas l’air super emballé. Je comprends pas.

Seulement voilà, il y a un hic. Pour bien comprendre l’histoire, il faut avoir les bases, donc il faut d’abord répondre à quelques questions du genre :

  • C'est quoi un token ? et un Tokenizer ?

  • C’est quoi un vocabulaire de tokens ? Y a t’il un lien avec les embeddings ?

  • Existe t’il des tokens spéciaux ?

Ah oui, avant d’attaquer, je vous présente Magikarp, un pokemon de type eau qui, d’après mes investigations, est réputé comme étant un des plus inutiles qui soit.

Le pokémon Magikarp qui, effectivement, a l’air assez inutile

C’est parti.

Au commencement était le token..

Avant d’envoyer un texte à un modèle de langage, on le découpe en petites unités appelées tokens. Un token peut être : un mot, un morceau de mot ou même un simple caractère. Cette étape s’appelle la tokénisation. Et, pour la réaliser, on utilise un tokéniseur (ou tokenizer).

Allez jouer avec Tiktokenizer, un outil en ligne qui vous permet de visualiser tout ça concrètement et simplement pour différents modèles.

Entrez une phrase, comme “QHARMONY avait modélisé des milliers de scénarios pour l'avenir climatique de Singapour“ (phrase tirée du roman “managé” par Benoît).

Si vous choisissez le tokenizer de gpt2, vous obtenez 30 tokens :

tokenisation avec gpt2

Rien que le mot QHARMONY est divisé en 5 tokens : Q-H-AR-MON-Y

Si vous choisissez le tokenizer de Meta-Llama-3-8B vous obtenez non pas 30 mais 26 tokens :

tokenisation avec Meta-Llama-3-8B

et QHARMONY est alors divisé en 4 tokens : Q-H-ARM-ONY

Comme vous le voyez avec cet exemple, chaque tokenizer découpe le texte différemment, notamment parce qu'ils n'utilisent pas le même vocabulaire.

Remarque: Je vous invite vraiment à tester plusieurs types de texte dans Tiktokenizer : des calculs, de l’anglais, la même phrase en français, en majuscule, avec des espaces, sans espace, ou des phrases avec des petites variations... C’est assez instructif.

D'où viennent les vocabulaires de tokens ?

Ils sont appris à partir de l'analyse d’un vaste corpus de textes. BPE (Byte Pair Encoding) est une technique populaire pour cette tâche. On commence avec un dictionnaire (dictionnaire, vocabulaire : c’est la même chose) initial très simple, contenant uniquement les caractères de base (lettres, chiffres, ponctuations, etc.). Ensuite, les paires de tokens les plus fréquentes sont progressivement fusionnées pour former de nouveaux tokens.

Par exemple, si l'algorithme détecte que "Q" et "HA" apparaissent souvent ensemble, il va créer le token unique "QHA" et ainsi de suite. Si “QHA” apparaît souvent avec “RM“, il créera le token “QHARM“.

Remarque : d'autres approches populaires comme WordPiece ou SentencePiece différent légèrement dans leur fonctionnement mais l’idée générale reste assez proche.

Le nombre final de tokens dans le dictionnaire est défini à l'avance. Le dictionnaire du tokenizer de Llama 2 contenait 32 000 tokens. Pour Llama 3, il en contient 128 000. Quelques dizaines de milliers de tokens donc, avec une tendance à la hausse pour les modèles les plus récents.

Le nombre de tokens dans le dictionnaire est un paramètre clé. S'il est trop grand, il sera gourmand en ressources. S'il est trop petit, il ne capturera pas bien les spécificités du langage. Il faut donc trouver le juste équilibre.

Au final, le dictionnaire créé par BPE (ou autres) reflète le corpus d'entraînement : les mots et morceaux de mots les plus fréquents sont représentés par des tokens dédiés.

Je me suis amusé à entraîner un tokéniseur (avec une taille de 4096 tokens) sur le roman de Benoît (et oui, j’ai accès à l’intégral moi, pas que le chapitre 1 et 2).

La phrase “QHARMONY avait modélisé des milliers de scénarios pour l'avenir climatique de Singapour“ est alors tokenisée comme suit en 15 tokens :

QHARMONY- avait- modélis-é- des- milli-ers- de- scénarios- pour- l-'avenir- climatique- de- Singapour

Notez que QHARMONY a le droit a un token rien que pour lui ! Rien de surprenant, car QHARMONY est très fréquent dans le roman (84 occurences pour être précis)

Multilinguisme. La plupart des corpus utilisés pour entraîner les tokenizers sont majoritairement en anglais. Les dictionnaires de tokens sont par conséquents optimisés pour cette langue.

À l'inverse, pour le français ou d'autres langues moins représentées, la tokenisation est souvent moins optimale.

Il faudra, par exemple, davantage de tokens pour représenter un texte en français qu'un texte de taille identique en anglais. Autrement dit, avec 100 tokens en “anglais”, vous écrivez un texte plus long qu’avec 100 tokens en “français”.

Il est important de bien comprendre que la phase d'entraînement du tokeniseur pour construire le dictionnaire de tokens est complètement séparée de l'entraînement du modèle de langage (LLM) lui-même.

Du tokenizer au LLM : un voyage aller-retour

D’ailleurs le LLM, réellement, ne voit jamais de tokens textuels. Il voit seulement une liste d’identifiants numériques (un identifiant par token du vocabulaire).

Si vous allez refaire un tour sur Tiktokenizer, avec le tokéniseur de gpt-4, la phrase “QHARMONY avait modélisé des milliers de scénarios pour l'avenir climatique de Singapour“ est encodée par cette suite d'identifiants numériques :

La version numérique

La version texte

C'est la séquence numérique qui est donnée en entrée au LLM.

La première couche de celui-ci est une sorte de table de correspondance "identifiant -> embedding" où chaque identifiant est associé à un vecteur numérique (voir l’article sur les embeddings). L'entraînement du modèle de langage consiste en partie à apprendre une représentation numérique qui capture le sens de chaque identifiant.

Les tokens spéciaux. Au-delà des tokens "texte" standards, il existe différents types de tokens spéciaux qui jouent un rôle clé dans le contrôle et le guidage des modèles de langage :

- Les tokens de structuration comme <|startoftext|>, <|endoftext|>, [INST], [/INST] qui délimitent des sections.

- Les tokens "outils" comme <|calculator_available|>, <|web_search_enabled|> qui listent les capacités disponibles.

Leur représentation exacte peut varier d'un tokenizer à l'autre.

En fin de traitement, en sortie, le LLM, qui fonctionne de manière auto-régressive pour prédire le prochain token, calcule la probabilité pour chacun des identifiants du vocabulaire. Si le vocabulaire contient 32 000 tokens, la sortie du LLM est un vecteur avec 32 000 entrées :

Identifiant du token

Probabilité

0

0.13%

1

0.26%

2

17,3%

31 199

0.05 %

Il répètera ce processus jusqu’à atteindre le “token spécial” de fin de texte. Et la réponse finale prendra la forme d’une liste d’identifiants numériques qui sera décodée par le tokéniseur. Exemple avec le décodage de QHARMONY par gpt-4 :

48, 39, 18394, 53375 -> Q, H, ARM, ONY -> QHARMONY

ok, très bien le cours magistral, mais nous ce qui nous intéresse, c’est le pokémon SolidGoldMagikarp !

J’y viens. J’y viens. Avant ça, permettez-moi un dernier résumé pour m’assurer que tout le monde suit.

  • L'apprentissage d'un tokenizer et d'un modèle de langage (LLM) sont deux étapes distinctes et complémentaires.

  • Le tokenizer apprend un vocabulaire de tokens à partir d'un large corpus de textes.

  • Il encode ensuite tout texte en une séquence d'identifiants numériques uniques pour chaque token

  • Le modèle de langage (LLM) apprend une représentation vectorielle (vecteur sémantique) pour chaque identifiant numérique de token.

  • Il prédit le prochain identifiant numérique en calculant les probabilités des tokens suivants possibles. Processus répété jusqu’à atteindre un token spécial de “fin”

  • Enfin, le tokenizer intervient à nouveau pour décoder la séquence d'identifiants numériques générée par le LLM en texte lisible, en mappant chaque identifiant à son token “texte” correspondant.

SolidGoldMagikarp et les Glitch Tokens

Place au roman.

Il était une fois, sur un forum obscur de Reddit, un groupe de “passionnés” (appelons-les comme ça) qui s'étaient lancé un défi absurde : compter jusqu'à l'infini. Un par un, ils écrivaient des messages avec le nombre suivant, déterminés à repousser les limites du comptage numérique. Parmi eux, un certain SolidGoldMagikarp n’avait qu’un objectif en tête : se retrouver au sommet du Hall Of Fame des compteurs. Avec son pseudonyme de pokémon doré, il postait sans relâche, poussant toujours plus loin la quête de l'infini : trois cent mille cent vingt sept, trois cent mille cent vingt huit, .. trois millions deux cent quatorze…

Dans un univers pas si parallèle, une équipe de savants fous s'afférait à créer l'intelligence artificielle ultime. Jour et nuit, ils nourrissaient leur créature numérique de milliards de données, aspirés aux quatre coins d'Internet. Leur but : façonner un modèle de langage si puissant qu'il pourrait converser sur n'importe quel sujet, résoudre n'importe quel problème, et peut-être même, qui sait, découvrir le sens de la vie.

Mais dans leur quête d'omniscience artificielle, ils allaient commettre une erreur fatidique. Par une nuit sans lune, alors que les processeurs surchauffaient et que les cerveaux fumaient, un échange crucial eut lieu :

  • Au fait, Sam, tu as pensé au tokenizeurrr ?

  • Au quoi ?

  • Tu sais, le truc là, le tokenizeurrr quoi ?

  • Ah ouais, ça... Oh, on s'en fout du tokenizer ! L'important, c'est les données, toujours plus de données !

  • T'es sûr ? J'ai lu sur /r/MachineLearning que le tokenizer, c'était super important...

  • Écoute, Kevin, on a pas le temps pour ces détails. On a une IA à entraîner, un monde à changer ! Allez, lance l'extraction de Reddit et passe-moi une canette.

Kevin haussa les épaules et lança le script. Les disques durs grondèrent, les ventilateurs hurlèrent, et des téraoctets de shitposts, mèmes, et autres joyeusetés d'Internet se déversèrent dans les entrailles de la bête. Parmi eux, les élucubrations de SolidGoldMagikarp et de sa bande de compteurs fous.

Le modèle fut entraîné, jour après jour, nuit après nuit. Les savants fous scrutaient les métriques, ajustaient les hyperparamètres, sacrifiaient leur vie sociale et leur santé mentale sur l'autel de la performance. Jusqu'au jour où, enfin, leur création ouvrit les yeux.

GPT-3000 était né. Un modèle de langage sans pareil, capable de disserter sur la philosophie, de coder en 18 langages, d'écrire de la poésie, et de prédire le cours du Bitcoin. Les savants fous exultaient. Ils publiaient des papers, donnaient des conférences, et rêvaient déjà de Prix Nobel.

Mais dans l'ombre, une menace grandissait. Les racines de GPT-3000 étaient infestées de glitch tokens, ces bugs lexicaux nés des délires de SolidGoldMagikarp et consorts. Telles des bombes à retardement sémantiques, elles attendaient leur heure...

L'apocalypse commença un matin, sur le chat d'assistance d'un site de e-commerce. Un utilisateur frustré tapa "SolidGoldMagikarp", probablement pour se défouler. La réponse de GPT-3000 le laissa sans voix :

"SolidGoldMagikarp trois cents milliards quatre cents douze mille cinq cent vingt-trois mille millions de mille sabords..."

Un flot d'absurdités numériques, ponctué de nombres aléatoires et d'injures fleurant bon les tréfonds de Reddit. Le client pensa à un canular et posta la capture d'écran sur Twitter.

En quelques heures, des dizaines de cas similaires furent rapportés. petertodd, ittrLoremipumdolorsitametconsecteturadipiscingelitIntegervelvel... Chaque glitch token provoquait chez GPT-3000 une réaction unique, mais toujours aussi délirante. Les serveurs principaux durent être déconnectés en urgence.

La panique gagna la Silicon Valley. Les savants fous étaient désormais des savants désespérés, tentant par tous les moyens de comprendre et de corriger ces bugs existentiels qui gangrenaient leur création. Mais rien n'y faisait. Telle l'hydre de Lerne, à chaque glitch token corrigé, dix nouveaux apparaissaient.

Pendant ce temps, sur /r/counting, SolidGoldMagikarp continuait à compter, imperturbable. Trois cents milliards quatre cents douze mille cinq cent vingt-quatre, trois cents milliards quatre cents douze mille cinq cent vingt-cinq... Ignorant qu'il était devenu, à son insu, le patient zéro d'une nouvelle forme de virus informatique, un ver sémantique qui dévorait l'intelligence artificielle de l'intérieur...

PS : En prévision du prix nobel de littérature, j’ai préparé un petit texte de remerciements : Merci à ma famille sans qui je ne serai pas la .. et à Claude 3 sans qui .. enfin merci !

Nan, mais sérieux

ok. Beaucoup de similitudes entre la fiction et la réalité. L’histoire du forum reddit ou des redditors s’amusaient à compter, compter et compter est bien réelle.

Allez faire un dernier petit tour sur Tiktokenizer. Sélectionnez gpt2. Et tapez la phrase suivante: “Le SolidGoldMagikarp est un pokémon de type eau”

Verdict :

" SolidGoldMagikarp" (avec un espace avant, pour être exact) apparaît comme un token unique dans le vocabulaire. Pourquoi ? Tout simplement parce qu'il était très fréquent dans les données d'entraînement du tokenizer utilisé par GPT-2 (merci Reddit). Ils ont été diaboliquement efficaces nos compteurs de l’infini à poster message sur message avec leur pseudonyme dedans (vous pouvez lire cet article qui leur est dédié).

Et question : que se passe-t-il si le modèle de langage derrière est entraîné sur des données où SolidGoldMagikarp est absent ou très très rare ? (Rappel: ceux sont deux phases distinctes)

Hé ben, dans ce cas, le modèle n'apprend pas à utiliser correctement le token. Les représentations vectorielles associées (les fameux "embeddings") sont alors au mieux sous-entraînées, au pire aléatoires.

Et c'est là que y a un bug (ou glitch) dans la matrice. Quand un tel token apparaît dans une conversation, le modèle déraille littéralement. Les embeddings “aléatoires“ brouillent complètement le réseau de neurones. Conséquence : génération de phrases absurdes, incohérentes voire insultantes.

Moralité de l’histoire : même la plus puissante des IA peut être mise à genoux par un simple token, pour peu qu'il n'ait jamais appris à le dompter. Indomptable ce Magicarpe !

The End.

Liens en vrac

  • La vidéo de Karpathy pour apprendre à développer un tokenizer BPE. Vidéo qui m’a pas mal servi de point de référence. Orientée développeur.