🔤 Tokenization — Quand l'IA découpe les mots comme un boucher ! 🔪✨

Community Article Published October 14, 2025

📖 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

Community

Sign up or log in to comment