Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -716,6 +716,23 @@
"Les exercices suivants laissent la main à l'étudiant : implémenter, comparer, ou rapprocher d'un cas réel."
]
},
{
"cell_type": "markdown",
"id": "e7a10001",
"metadata": {},
"source": [
"### Exercice 1 — Entraîner un BPE sur un autre corpus\n",
"\n",
"**Contexte.** La section 4 a appris 60 fusions sur les fables de La Fontaine, et la lecture qui suit montrait l'ordre d'émergence : terminaisons (`e</w>`, `s</w>`, `t</w>`), puis digrammes (`ou`, `an`, `ch`), puis mots entiers. Cet ordre n'est pas arbitraire : il épouse les fréquences du corpus.\n",
"\n",
"**Objectif.** Ré-entraîner `train_bpe` sur un corpus français de votre choix (vos propres phrases, un autre texte) et comparer l'ordre des premières fusions avec celui du notebook.\n",
"\n",
"**Indices** :\n",
"- découper en mots avec `.lower().split()` comme dans la cellule du corpus, puis `train_bpe(vos_mots, 18)` ;\n",
"- afficher les fusions dans l'ordre d'apprentissage (la liste `merges`) ;\n",
"- pour « pourquoi *le* apparaît-il tôt » : observer quelles fusions élémentaires se combinent — `e</w>` d'abord, puis `l` + `e</w>` ; un mot très fréquent hérite mécaniquement des fusions de ses terminaisons.\n"
]
},
{
"cell_type": "code",
"execution_count": 10,
Expand Down Expand Up @@ -744,6 +761,23 @@
"print(\"Exercice 1 a completer\")"
]
},
{
"cell_type": "markdown",
"id": "e7a10002",
"metadata": {},
"source": [
"### Exercice 2 — Nombres à la française : « 3.14 » contre « 3,14 »\n",
"\n",
"**Contexte.** La section 9 a montré que `1234` s'encode en quatre tokens (un par chiffre) — les nombres sont éclatés. Le français écrit ses décimales avec une virgule, l'anglais avec un point ; or le vocabulaire BPE d'un modèle vient de son corpus d'entraînement.\n",
"\n",
"**Objectif.** Encoder « 3.14 » et « 3,14 » avec le tokenizer Qwen, compter les tokens de chacun, expliquer la différence de découpe, et dire laquelle des deux formes représente le mieux le *nombre* (et pas la chaîne de caractères).\n",
"\n",
"**Indices** :\n",
"- `qwen.encode('3.14')` et `qwen.encode('3,14')`, puis `len(...)` sur chaque ;\n",
"- vérifier la réversibilité avec `qwen.decode(...)` sur chaque liste de tokens ;\n",
"- penser à la fréquence des deux motifs dans un corpus majoritairement anglais : le point décimal est banal, « chiffre-virgule-chiffre » collé beaucoup moins.\n"
]
},
{
"cell_type": "code",
"execution_count": 11,
Expand Down Expand Up @@ -773,6 +807,23 @@
"print(\"Exercice 2 a completer\")"
]
},
{
"cell_type": "markdown",
"id": "e7a10003",
"metadata": {},
"source": [
"### Exercice 3 — Budget de contexte : un document de 1000 mots\n",
"\n",
"**Contexte.** La section 8 a mesuré que le même corpus occupe 3 chunks de 128 tokens en mots, 7 avec le BPE-80, 4 avec le Qwen réel : le choix du tokenizer décide du nombre de chunks, donc du coût de stockage et de contexte.\n",
"\n",
"**Objectif.** Pour un document d'environ 1000 mots (par exemple le corpus des fables concaténé trois à quatre fois, ou un texte de votre choix), **estimer d'abord au papier** puis **vérifier par la mesure** le nombre de chunks de 256 tokens avec le BPE à 60 fusions, puis avec le Qwen réel.\n",
"\n",
"**Indices** :\n",
"- estimation : la section 6 a mesuré ~3,0 tokens/mot pour le BPE-60 et la section 8 ~1,4 pour le Qwen (419 tokens pour 299 mots) — 1000 mots donnent combien de tokens, donc combien de chunks de 256 ?\n",
"- mesure : `enc60, _ = make_bpe(train_bpe(WORDS, 60))`, puis `-(-len(tokens) // 256)` comme dans la cellule du chunking ;\n",
"- question finale : lequel « coûte le moins » en chunks, et quel est le prix caché de l'autre (taille de vocabulaire, hors-vocabulaire) ?\n"
]
},
{
"cell_type": "code",
"execution_count": 12,
Expand Down
Loading