🔤 Tokenization — Quand l'IA découpe les mots comme un boucher ! 🔪✨
📖 Définition
Tokenization = découper du texte en morceaux compréhensibles pour une IA ! Comme un boucher qui coupe la viande, le tokenizer découpe "incroyablement" en ["in", "croy", "able", "ment"] pour que ton modèle puisse digérer.
Principe :
- Découpage intelligent : texte → tokens (sous-mots, mots, caractères)
- Vocabulaire fixe : chaque token = un ID numérique
- Compression efficace : balance entre précision et taille
- Fondation des LLM : pas de bonne tokenization = modèle pourri
- Trade-off permanent : trop découper vs pas assez découper ! ⚖️
⚡ Avantages / Inconvénients / Limites
✅ Avantages
- Vocabulaire fini : pas besoin de connaître tous les mots du monde
- Gère l'inconnu : mots rares découpés en sous-mots connus
- Multilingue : même tokenizer pour plusieurs langues
- Compression : réduit taille des séquences (économise mémoire)
- Flexibilité : s'adapte aux domaines spécifiques (code, médical, etc.)
❌ Inconvénients
- Perte d'info : "chat" et "chats" = tokens différents (parfois)
- Biais linguistiques : favorise les langues du training (anglais++)
- Arithmétique pourrie : "123 + 456" découpé bizarrement = calculs ratés
- Sensible aux espaces : " chat" ≠ "chat" (espace = cauchemar)
- Vocabulaire figé : ajouter nouveaux tokens = réentraîner tout
⚠️ Limites
- Out-of-vocabulary : nouveaux mots découpés en bouillie
- Inefficace sur certaines langues : chinois/japonais galérent
- Contexte perdu : découpage peut casser le sens
- Coût computationnel : tokenizer complexe = lent
- Non-réversible parfait : détokenization peut introduire erreurs
🛠️ Tutorial pratique : Mon cas réel
📊 Setup
- Tokenizer : BPE custom (Byte Pair Encoding)
- Corpus : Wikipedia français + code Python (50M tokens)
- Config : vocab_size=32000, min_frequency=5, special_tokens
- Hardware : CPU suffit (tokenization = pas gourmand)
📈 Résultats obtenus
Tokenization par caractères (baseline):
- Vocab size: 256 (ASCII)
- Séquence "tokenization": 13 tokens
- Problème: séquences ULTRA longues
Tokenization par mots:
- Vocab size: 500k+ (explosion)
- Séquence "tokenization": 1 token
- Problème: mots rares = <UNK>, vocab énorme
BPE (Byte Pair Encoding):
- Vocab size: 32k (sweet spot)
- Séquence "tokenization": 3 tokens ["token", "iza", "tion"]
- Balance parfaite: précision + compression
GPT-2 tokenizer (comparison):
- Vocab size: 50257
- "tokenization" → ["token", "ization"] (similaire)
- Meilleure gestion espaces et ponctuation
🧪 Test en conditions réelles
Mot courant: "intelligence"
- Char tokenizer: [i,n,t,e,l,l,i,g,e,n,c,e] (12 tokens) ❌
- Word tokenizer: ["intelligence"] (1 token) ✅
- BPE: ["intel", "ligence"] (2 tokens) ✅
Mot rare: "photosynthèse"
- Char tokenizer: 14 tokens ❌
- Word tokenizer: <UNK> (mot inconnu) ❌
- BPE: ["photo", "synth", "èse"] (3 tokens) ✅
Code: "print('hello')"
- Word tokenizer: ["print", "(", "'", "hello", "'", ")"] (6 tokens)
- BPE code-aware: ["print", "('", "hello", "')"] (4 tokens) ✅
Multi-langue: "Hello你好"
- Word tokenizer: ["Hello", "你", "好"] (galère chinois)
- BPE: ["Hello", "你好"] (2 tokens) ✅
Verdict : 🎯 BPE = SWEET SPOT pour la plupart des cas !
💡 Exemples concrets
Méthodes de tokenization populaires
Tokenization par caractères 🔤
- Principe : un caractère = un token
- Vocab : 256 (ASCII) ou ~10k (Unicode)
- Avantage : jamais de mot inconnu
- Inconvénient : séquences hyper longues (x5-10)
Tokenization par mots 📚
- Principe : un mot = un token
- Vocab : 500k+ (explosion)
- Avantage : sémantique préservée
- Inconvénient : mots rares = , vocab énorme
BPE (Byte Pair Encoding) 🔥
- Principe : fusionne paires fréquentes itérativement
- Vocab : 30k-50k (configurable)
- Utilisé par : GPT-2, GPT-3, RoBERTa
- Sweet spot : balance taille vocab / longueur séquence
WordPiece 🧩
- Principe : similaire BPE mais probabiliste
- Vocab : 30k typiquement
- Utilisé par : BERT, DistilBERT
- Spécial : préfixe ## pour sous-mots
SentencePiece 🌍
- Principe : traite texte comme séquence bytes bruts
- Vocab : 8k-32k
- Utilisé par : T5, XLM-R, LLaMA
- Avantage : multilingue sans preprocessing
Unigram 📊
- Principe : probabiliste, garde meilleurs tokens
- Vocab : configurable
- Utilisé par : AlBERT, T5
- Avantage : plusieurs tokenizations possibles
Applications concrètes
GPT-4 : BPE avec vocab ~100k, gère 100+ langues BERT : WordPiece avec vocab 30k, optimisé anglais LLaMA : SentencePiece avec vocab 32k, multilingue Code models : tokenizers spécialisés code (indentation, syntaxe)
📋 Fiche mémo : Choisir son tokenizer
🔍 Comparaison rapide
| Méthode | Vocab Size | Séquence Length | Use Case |
|---|---|---|---|
| Caractères | 256-10k | Très long | Langues rares |
| Mots | 500k+ | Court | Petit corpus |
| BPE | 30k-50k | Moyen | NLP général |
| WordPiece | 30k | Moyen | BERT-like |
| SentencePiece | 8k-32k | Moyen | Multilingue |
🛠️ Quand utiliser quoi
✅ BPE: NLP général, anglais dominant
✅ SentencePiece: multilingue, sans preprocessing
✅ WordPiece: fine-tuning BERT
✅ Caractères: langues avec peu de données
❌ Mots: presque jamais (vocab explosion)
❌ Caractères: si performance critique (trop long)
⚙️ Paramètres critiques
vocab_size: 30k-50k (standard)
- Plus petit: compression max mais perte info
- Plus grand: précision max mais mémoire++
min_frequency: 2-10
- Ignore tokens ultra-rares
- Évite overfitting sur typos
special_tokens:
- <PAD>, <UNK>, <BOS>, <EOS>
- <MASK> pour BERT
- Custom selon besoin
💻 Concept simplifié (code minimal)
# BPE en pseudocode ultra-simplifié
class SimpleBPE:
def train(self, corpus):
"""Entraîne le tokenizer sur un corpus"""
# Départ: découpage par caractères
vocab = set(all_characters_in_corpus)
# Itérations: fusionne les paires fréquentes
for iteration in range(num_merges):
# Trouve paire la plus fréquente
most_frequent = find_most_frequent_pair(corpus, vocab)
# Fusionne: "t" + "h" → "th"
vocab.add(most_frequent)
corpus = merge_pair_in_corpus(corpus, most_frequent)
return vocab
def tokenize(self, text):
"""Découpe un texte en tokens"""
# Exemple: "tokenization"
# Itération 1: ["t","o","k","e","n","i","z","a","t","i","o","n"]
# Itération 2: ["to","k","en","i","za","ti","on"] (fusions fréquentes)
# Itération 3: ["token","ization"] (final)
return apply_merges(text, self.vocab)
# La magie: apprend automatiquement les sous-mots fréquents !
# "ing", "tion", "er" émergent naturellement
Le concept clé : BPE commence avec des caractères et fusionne itérativement les paires les plus fréquentes. Résultat : un vocabulaire qui capture les patterns fréquents (préfixes, suffixes, mots entiers) tout en gérant l'inconnu ! 🎯
📝 Résumé
Tokenization = découpage intelligent du texte en morceaux digérables pour l'IA ! BPE et SentencePiece dominent avec vocab 30k-50k, balance parfaite compression/précision. Critique pour LLM : mauvais tokenizer = modèle handicapé. Gère mots inconnus en découpant en sous-mots. Trade-off permanent entre taille vocab et longueur séquences ! 🔪✨
🎯 Conclusion
La tokenization est la fondation invisible de tous les LLM modernes. De BPE (GPT) à WordPiece (BERT) en passant par SentencePiece (T5, LLaMA), chaque approche a ses forces. Un bon tokenizer peut améliorer les performances de 10-20% sans changer le modèle ! Les défis futurs : meilleure gestion multilingue, arithmétique robuste, et tokenization contextuelle. Fun fact : GPT-4 utilise ~100k tokens vs 50k pour GPT-3, permettant meilleure compression et multilinguisme ! La tokenization, c'est comme les fondations d'une maison : invisible mais essentiel ! 🏗️🔥
❓ Questions/Réponses
Q : Mon modèle est nul en maths, c'est à cause du tokenizer ? R : Probablement oui ! Les tokenizers découpent "123" en ["1", "23"] ou ["12", "3"] de façon incohérente. Résultat : ton modèle voit pas les nombres comme des entités. Solution : tokenizer spécialisé pour nombres ou preprocessing pour isoler les chiffres avant tokenization !
Q : Je veux ajouter du vocabulaire médical, je fais comment ? R : Deux options : (1) Réentraîner tokenizer from scratch sur corpus médical (long mais optimal), ou (2) Étendre vocab existant et fine-tune le modèle (plus rapide). Attention : option 2 nécessite réentraînement partiel du modèle pour intégrer nouveaux tokens !
Q : Pourquoi " chat" et "chat" donnent des tokens différents ? R : Parce que l'espace est significatif pour les tokenizers modernes ! " chat" (avec espace) = début de mot, "chat" (sans espace) = milieu/fin de mot. C'est voulu : permet au modèle de comprendre les positions dans la phrase. Galère parfois mais globalement utile !
🤓 Le saviez-vous ?
Le tokenizer GPT-2 est célèbre pour un bug hilarant : il ne peut pas écrire le mot "SolidGoldMagikarp" ! Ce mot reddit obscur n'était jamais apparu dans le corpus, donc jamais tokenizé correctement. Quand on force GPT-2 à le générer, il hallucine complètement et sort des trucs bizarres ! Ce bug a révélé que les tokenizers ont des "glitch tokens" - des tokens qui rendent les modèles fous. Autres glitch tokens célèbres : "�", "davidjl", "ʕ•́ᴥ•̀ʔっ". Aujourd'hui, OpenAI a fixé ces bugs dans GPT-3/4, mais ça montre à quel point la tokenization est critique ! Un seul token pourri peut faire délirer un modèle à 175B paramètres ! 🎮🐻💥
Théo CHARLET
Étudiant TSSR - Spécialisation IA/ML
Créateur d'AG-BPE (Attention-Guided Byte-Pair Encoding)
🔗 LinkedIn: https://www.linkedin.com/in/théo-charlet
🚀 En recherche de stage