🪜 De la classification au LLM

Le chemin, étape par étape, appris en pratiquant sur notre dataset (160 000 critiques Allociné). Chaque étape est entraînée sur ce projet, à coût zéro, et manipulable ci-dessous.

Étape 0 — Classifier un texte ✓ run-001

Le modèle compte les mots (TF-IDF) et apprend un poids par mot : « magnifique » pousse vers positif, « navet » vers négatif. Sortie : scores → softmax → probabilités, entraîné à la log-loss. 93,67 % de bonnes réponses sur le test — mais aucune notion du sens ni de l'ordre des mots.

Teste-le sur la page d'accueil · explore le dataset

Étape 1 — Les embeddings : le sens devient géométrie ✓ run-002

Chaque mot reçoit un vecteur de 100 nombres, initialisé au hasard. Puis un jeu tout bête : depuis chaque mot, prédire ses voisins dans la phrase (word2vec skip-gram). À chaque erreur, on ajuste les vecteurs par descente de gradient. Après 5 passages sur nos 14 millions de mots (92 s de CPU), les mots utilisés dans les mêmes contextes ont convergé vers les mêmes régions de l'espace : la distance est devenue du sens — sans qu'on ait jamais défini un seul mot.

Explore les vecteurs appris — tape un mot, vois ses plus proches voisins dans l'espace appris sur nos critiques :

Essayer :
Chargement des 15 000 vecteurs…

L'arithmétique du sens — on peut même calculer avec les mots (résultats réels de notre modèle) :

acteur − homme + femme ≈ actrice (0,82), comédienne (0,73)
meilleur − bon + mauvais ≈ pire (0,73), désastreux (0,59)

Étape 2 — L'attention : lire en contexte ✓ run-003

Problème de l'étape 1 : « avocat » a un seul vecteur, qu'on parle du fruit ou du métier. L'attention corrige ça : chaque mot recalcule son vecteur en regardant tous les autres mots de la phrase. Concrètement, chaque mot fabrique trois choses à partir de son vecteur :

Query — « ce que je cherche »  ·  Key — « ce que je propose »  ·  Value — « ce que je transmets »
score(mot A → mot B) = QA · KB  →  softmax → poids d'attention (des % qui somment à 100)
nouveau vecteur de A = somme des V de tous les mots, pondérée par ces %  — puis un petit réseau (FFN), et c'est un bloc Transformer. GPT en empile ~100.

🔬 Tutoriel pas à pas : suis ta propre phrase à travers chaque étape du Transformer — tokenisation, vecteurs, scores, softmax, verdict, avec les vrais nombres du modèle.

run-003 : on a écrit ce bloc à la main (training/mini_transformer.py, ~50 lignes) et on l'a entraîné sur nos 160 000 critiques, en initialisant les embeddings avec les vecteurs de run-002. Le classement se fait via un token spécial [CLS] ajouté en tête de phrase : son attention nous montre quels mots le modèle a regardés pour décider.

Regarde le modèle lire — tape une critique, les mots s'éclairent selon l'attention qu'ils reçoivent :

Essayer :

Étape 3 — Générer : classifier en boucle ✓ run-004

On change la question : non plus « positif ou négatif ? » (2 classes) mais « que vient-il ensuite ? ». On ajoute la prédiction à la séquence, on recommence — et le modèle crée. Même softmax, même log-loss que l'étape 0, plus un masque causal (interdiction de regarder la suite).

run-004 → 004b : on l'a fait sur des dessins plutôt que des mots — notre bloc Transformer empilé 6 fois (4,9 M params), entraîné sur notre premier GPU gratuit Kaggle avec 178 000 dessins humains (QuickDraw) à prédire le coup de crayon suivant. La version CPU (run-004 : 3 blocs, 43 000 dessins) gribouillait ; la version GPU dessine — la preuve par l'image que données × taille × époques, ça compte.

🎨 Regarde le robot dessiner un chat, une maison ou un vélo — trait par trait, avec ses candidats et leurs probabilités à chaque coup de crayon, en pas à pas si tu veux.

Étape 4 — Dialoguer : instruction tuning à venir

Un modèle qui prédit le mot suivant continue le texte ; pour qu'il réponde, on le ré-entraîne sur des exemples de dialogues (fine-tuning QLoRA — prévu sur GPU Kaggle gratuit).