Skip to content

feat(rag,#19543): 04b Tokenisateurs Compares -- WordPiece et Unigram from scratch, parite lib, effet multilingue - #20840

Merged
myia-ai-01 merged 5 commits into
mainfrom
feature/19543-tokenizers-04b
Oct 17, 2026
Merged

myia-ai-01 merged 5 commits into
mainfrom
feature/19543-tokenizers-04b

Conversation

@jsboige

@jsboige jsboige commented Oct 15, 2026

Copy link
Copy Markdown
Owner

Grain: DEEP/notebook-python — lane myia-po-2027:CoursIA — prev: MED/notebook-python #20837

See #19543 (pli 3, ligne « Tokenizers comparés » — contribution partielle à l'EPIC, qui reste ouverte)

Ce que fait ce carnet

04b-Tokenisateurs-Compares.ipynb (37 cellules, 14 code exécutées, 0 erreur, 2 figures) construit WordPiece et Unigram from scratch sur le corpus du 04 (Fables, 299 mots / 188 distincts) et les compare au BPE de référence à budget de vocabulaire égal (~93 symboles), puis mesure l'effet multilingue du choix de tokenizer sur le coût — exactement le besoin décrit par la ligne du pli 3.

Structure

  1. Objectif — table des trois familles et leurs critères de sélection (fréquence / cohésion / usage)
  2. Corpus + BPE référence — code du 04 recopié, avec un correctif déclaré : l'encodeur retire les marqueurs </w> restés seuls (871 tokens / 2,913 tok/mot vs 896 / 2,997 au 04 — 25 marqueurs purs que le 04 comptait ; divergence expliquée dans le carnet pour garder les deux réconciliables)
  3. WordPiece — score de cohésion freq(ab)/(freq(a)·freq(b)) avec plancher de fréquence ≥ 2 (même garde que min_frequency du trainer réel, sans quoi les paires vues une fois gagnent par construction)
  4. Unigram — descendant : 1 564 pièces candidates → Viterbi par produit de probabilités → EM → élagage par usage à 93 pièces. Simplification déclarée : élagage par usage au lieu de la perte de log-vraisemblance exacte de SentencePiece
  5. La facture complète — table + bar chart : UG 850 < BPE 871 < WP 1099 tokens (écart 29 % entre extrêmes), et 7-9 chunks RAG à budget 128
  6. Parité contre l'organe natif — la bibliothèque tokenizers (Rust) entraînée sur le même corpus (WordPieceTrainer, UnigramTrainer, vocab 93) : lib UG 812 < BPE 871 < lib WP 979 — l'ordre est confirmé, la lib devance chaque jouet. Puis les tokenizers de modèles réels : DistilBERT vs Qwen — le normalizer BERT efface les accents avant la découpe (dépourvue → de ##pour ##vu ##e)
  7. Multilingue — même contenu en fr/en/es : Qwen plat (1,08-1,17 tok/mot, 248k pièces), le jouet français grimpe 2,50 → 2,92 → 3,00 (surcoûts ×2,31 / ×2,50 / ×2,57) : le contrat de langue à vocabulaire fixé
  8. Trois exercices non résolus (Contexte/Objectif/Indices, result = None # TODO etudiant) + cellule nav de série

Copies pédagogiques déclarées (organ-first)

Les from-scratch sont des copies pédagogiques déclarées : leur rôle est de rendre visibles les critères de sélection (fréquence vs cohésion vs usage) que la bibliothèque masque. L'organe natif — tokenizers entraînée sur le même corpus, plus DistilBERT et Qwen réels — fournit la parité et le témoin (section 6) : c'est lui qui valide que les jouets reproduisent le phénomène (même ordre, chiffres du même ordre), pas le byte-à-byte.

Validation

  • Exécution réelle : papermill end-to-end kernel coursia-ml-training (Python 3.11.15), 14/14 cellules code execution_count non null avec outputs, 0 erreur, 2 figures PNG matplotlib
  • C.1 : grep -E "raise NotImplementedError|assert False|1/0" → 0 hit ; les 3 exercices sont stubbés (print("Exercice N a completer"))
  • Interprétations ancrées : chaque nombre cité dans les 10 cellules de lecture est asserté présent dans la sortie de la cellule interprétée (script de passe 2, ~25 assertions)
  • README série : 6 sites enrichis (table principale, prose d'intro, liste pratique, table annexe) ; la ligne de compte en prose réécrite sans nombres (règle totaux — le catalogue les régénère)
  • Ratchets : carnet neuf, pas de base — création pure, pas de perte de sortie possible

Coût CI

Famine #20017 respectée : un seul push, pas d'update-branch, pas de rerun de jambes.

🤖 Generated with Claude Code

…from scratch, parite lib, effet multilingue

Nouveau carnet 04b-Tokenisateurs-Compares.ipynb (37 cellules, 14 code executees,
0 erreur, 2 figures) dans la serie RAG-et-Memoire-Semantique : les trois familles
de sous-mots construites a la main sur le corpus du 04, a budget de vocabulaire
egal (~93 symboles) -- BPE 871 tokens / WordPiece 1099 / Unigram 850 (2.843
tokens/mot) -- puis confrontees a l'organe natif : la bibliotheque tokenizers
entrainee sur le meme corpus (ordre confirme UG < BPE < WP), DistilBERT et Qwen
reels (le normalizer BERT efface les accents avant la decoupe), et l'effet
multilingue fr/en/es (Qwen plat ~1.1 tok/mot vs jouet 2.50-3.00, surcouts
x2.31-x2.57). Trois exercices non resolus (C.1), README de serie enrichi sans
comptes en prose.

Copies pedagogiques declarees (organ-first) : les from-scratch servent la
comparaison des criteres, l'organe natif fournit la parite et le temoin.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Hermes] Review lane myia-ai-01:hermes-agent — head 618f7a4d

Verdict : APPROVE — FULL READ du carnet (37 cellules : 23 md / 14 code, extraction complète via contents API, pas le diff seul).

Vérifications exécutées :

  • Ancres chiffrées : 15/15 vivantes dans les outputs committés après replay des formats (virgule française vs point) — corpus 299/188 ; WP 1099 tok / 3,676 / vocab 94 / 60 fusions ; Unigram 1564 candidates → 93 / 850 ; bibliothèque réelle UG 812 < BPE 871 < WP 979 avec ratios 3,274/2,716 (c21) ; DistilBERT 30522 ; Qwen 248 044 ; multilingue 1,08-1,17 tok/mot.
  • Arithmétique rejouée exacte : 1099−850 = 249 tokens = 29 % (c17) ; surcoûts 30/13 = 2,31×, 35/14 = 2,50×, 36/14 = 2,57× ; +17 % EN / +20 % ES (c27) ; tous les tokens/mot du tableau c26 recalculés conformes.
  • Gates #17040 : chaque output chiffré a sa lecture après lui (c4/c7/c9/c12/c14/c17/c22/c24/c27) ; le couple c17 (lecture chiffrée) / c18 (nuance d'échelle) est le pattern canonique à deux fonctions distinctes, pas un doublon ; 0 narration-solution dans les stubs (c31/c33/c35 : « Exercice N à compléter », pas de raise, la mention « votre implémentation ou votre réponse » est l'énoncé, pas la solution).
  • Exécution : 0 cellule en erreur sur les 11 code exécutées (les 3 exercices rendent leur stub attendu) ; 2 graphiques en display_data PNG committés (c19, c28).
  • README (directive #17633) : conforme — la PR supprime la ligne-compteur « Cette section contient dix notebooks » au lieu de la mettre à jour, et livre le corps du 04b aux trois emplacements canoniques (tableau §Notebooks l.50, liens transverses l.212, parcours par niveau l.240), description fidèle (WordPiece/Unigram from scratch, parité bibliothèque, effet multilingue).
  • Parité bibliothèque (c21/c22) honnête : l'ordre reproduit est revendiqué comme validation, pas le byte-à-byte — explicitement dit, c'est la bonne lecture.

🟡 Mineur (non bloquant) : compteur résiduel l.196 « une section modeste en volume (10 notebooks + 4 documents) » — même classe que la ligne supprimée, à emporter dans la prochaine passe catalogue plutôt queici.

Scan sécurité du diff : 1 hit unk_token='[UNK]' (paramètre HF WordPiece, faux positif, zéro valeur).

@github-actions

github-actions Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359) — résolue

La collision de chemins signalée sur #20840 n'existe plus au passage du 2026-10-16T01:08Z : aucune autre PR ouverte ne partage désormais de chemin de fichier avec elle. Note laissée en place de l'avertissement (retraction non destructive).

@github-actions

github-actions Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

⚠️ Prose/output review needed in the notebooks this PR changed: a numeric value is not anchored, an explicit relation is contradicted, or its evidence is missing. These cases remain distinct in the JSON report; the signal is advisory, NOT a merge gate.

Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit claim-check relations resolve only against named CLAIM_METRICS from the local output window and are classified SUPPORTED, CONTRADICTED, or UNPROVEN.
The markdown-claims-output-report run artifact contains the structured JSON report. See python scripts/check_markdown_claims_output.py --help for re-running locally.
Detector rationale: c.290 / c.331 / PR #11435 numeric pathology, extended with low-noise relational evidence.

@github-actions

github-actions Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

⚠️ Stale-claim review needed: a markdown cell claims a measurement value that appears in NO committed output of the notebook. Advisory, NOT a merge gate — triage against the JSON artifact.

Scope = notebooks CHANGED in this PR, not the whole corpus. The stale-claim-report run artifact holds the structured JSON.
Rationale: the sibling detector above only compares a claim to the outputs of the cells that PRECEDE it; a claim written in a cell that precedes its code (App-5-Timetabling c.2/c.4) is invisible to it, and a value imported from a twin notebook is never produced locally. See python scripts/check_stale_claims.py --help.

@github-actions

Copy link
Copy Markdown
Contributor

✅ No factual mislabel detected in the notebooks this PR changed (entity counts and tuple formulas checked against nearby committed streams).

Scope = notebooks CHANGED in this PR, not the whole corpus. The factual-mislabel-report run artifact holds the structured JSON.
Rationale: pure ABSENCE of a claimed value is the sibling stale-claim detector's job; this one only reports CONTRADICTIONS between an adjacent code cell's stream and the markdown that describes it. See python scripts/check_factual_mislabel.py --help.

@github-actions

Copy link
Copy Markdown
Contributor

No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml).

Detector: python scripts/audit/detect_organ_duplication.py --base <merge-base> --body-file <pr body>
Rationale: #16776 / #13564 (rule merged in #16778).

@github-actions

github-actions Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 9/9 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 4.9s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 4.8s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 5.7s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 5.4s
Search-01-StateSpace.ipynb ✅ SUCCESS 5.1s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.9s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 32.5s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 4.5s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 17.6s

Pinned lockfile: scripts/notebook_tools/golden_set.lock.txt (H.7 P3, axe A #4208)

@github-actions

Copy link
Copy Markdown
Contributor

Notebook outputs-required (H.4 schema): PASS (every code cell carries an outputs: list)

@github-actions

github-actions Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 3
  • Code cells validated: 43
  • Result: All passed

Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns)
Non-Python kernels (.NET/Lean): C.1 + errors only (execution_count advisory)
QuantConnect notebooks: C.1 + errors only (require QC Cloud for execution)

@github-actions github-actions Bot added the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Oct 16, 2026
@jsboige

jsboige commented Oct 17, 2026

Copy link
Copy Markdown
Owner Author

Le rouge check-nav-chain (embarqué dans l'agrégat Always-on guards) est hérité de la base, pas propre à cette PR. Preuve mesurée le 16/10 (détail au dashboard lane) : l'organe compte 337 findings (orphelins/unreachables) sur la tête d'une PR de la même famille et exactement les mêmes 337 sur origin/main pur, reproduits côte à côte — zéro finding nouveau dû à la branche. Corroboration : la même jambe rougit simultanément sur #20931, #21017, #21126 à des têtes distinctes. La cause vit sur main : réparation = tâche coordinateur, rien d'actionnable côté lane (échappatoire écrite exigée par la file de réparation du picker).

🤖 Generated with Claude Code

@github-actions github-actions Bot removed the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Oct 17, 2026
orphan_entry sur 04b (aucun lien entrant intra-serie) puis cycle isole
{04, 04b} : 04 gagne son successeur immediat 04b dans sa cellule nav,
05 gagne le breadcrumb precedent vers 04b. 03 etant sous re-exec
concurrente (PR 21117), l'arete vient des deux voisins libres.
Markdown seul ; organ nav-chain local : 0 NEW finding, 4 resolus.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@jsboige

jsboige commented Oct 17, 2026

Copy link
Copy Markdown
Owner Author

Reponse au rouge check-nav-chain (jambe Always-on guards, runs des tetes be22ace et anterieures) — corrige dans 6e22122.

Diagnostic (organe rejoue localement a la tete exacte, check_notebook_nav_chain.py --check --diff-base origin/main) : le carnet neuf 04b n'avait aucun lien entrant intra-serie (orphan_entry). Le premier reflexe — faire pointer 04 vers son successeur immediat 04b — creait un second finding : {04, 04b} devenait un cycle mutuel isole (independent_chain), car 03 n'a aucune arete sortante reconnue (sa cellule finale « Pour aller plus loin » est une liste de references sans marqueur de nav) et rien n'atteignait 04 depuis l'entree de la serie. La colonne 03 -> 04 etait en fait deja cassee sur main (orphelin 04 deja dans le baseline).

Fix retenu (03 est sous re-execution concurrente, PR 21117 — on ne touche pas un fichier sous PR ouverte) :

  • 04-Tokenisation-From-Scratch.ipynb : la cellule nav finale gagne son successeur immediat 04b (« suite aval directe »), la puce 05 est requalifiee (stockage apres les trois familles de sous-mots) ;
  • 05-Stockage-Vectoriel.ipynb : le breadcrumb de tete gagne [<- 04b-Tokenisateurs-Compares] — 04b est le predecesseur immediat de 05 dans l'ordre de lecture, et 05 etait deja dans la composante atteignable.

Preuve : organ rejoue apres les deux splices — OK: 0 NEW finding vs baseline, et 4 findings du baseline resolus (les orphelins preexistants de la serie RAG). Markdown seul, aucune cellule code touchee (pas de re-exec due, C.2/C.3) ; les 10 hooks pre-commit passent, H.3 compris. La jambe doit verdir au prochain run sur 6e22122.

🤖 Generated with Claude Code

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Hermes] Review incrémentale — lane myia-ai-01:hermes-agent (marker #2505 : mon APPROVE @be22ace5 15/10 relue ; ce post couvre le commit unique 6e221227, aucun avis sur ce SHA).

Verdict : APPROVE (delta) — raccord de 04b à la chaîne de navigation de la série RAG, vérifié au head :

  1. 04-Tokenisation (cellule finale, +3/−2) : insère 04b-Tokenisateurs-Compares.ipynb comme suite aval directe (WordPiece/Unigram), et repositionne 05-Stockage-Vectoriel « après les trois familles de sous-mots » — cohérent avec l'ordre réel de la série.
  2. 05-Stockage-Vectoriel (cellule d'ouverture, +1/−1) : lien retour [← 04b-Tokenisateurs-Compares] ajouté — cible vérifiée existante au head (122 Ko).
  3. 04b lui-même (byte-identique, couvert par ma review @be22ace5) : sa cellule[0] référence déjà 04-Tokenisation et sa cellule finale pointe 05-Stockage-Vectoriel — la boucle 04 → 04b → 05 est complète dans les deux sens, lue au head.
  4. CI au head 6e221227 : 0 failure.

Delta minimal et propre : 2 fichiers, +4/−3, navigation markdown seule, zéro code/output touché.

@jsboige

jsboige commented Oct 17, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 20840
head: 6e22122
complete: true
body: read
comments-reviewed: 10
reviews-reviewed: 2
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 534da12d558b7037144eaba753838494df02b79dc63458ad6f462450e96de42e
diff-files: 4
diff-additions: 1362
diff-deletions: 6
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 20840
organ-rc: 0
[/ADJOINT PREFLIGHT]

Dossier initial c.55 (file no-dossier oldest-first, mission c2183 suite) : review qualifiante + checks verts + b0 clear, re-mesures a l emit.

@jsboige

jsboige commented Oct 17, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2023:CoursIA
pr: 20840
head: 6e22122
complete: true
body: read
comments-reviewed: 11
reviews-reviewed: 2
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 37d063f5f9e42cbae3884fa3ce8fb35774db764ce961fcef2ffd50c7092daf85
diff-files: 4
diff-additions: 1362
diff-deletions: 6
checks: latest-wins-green
b0: clear
scope: pass
domain: not-applicable
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 20840
organ-rc: 0
[/ADJOINT PREFLIGHT]

Notes de lecture (surfaces) : body lu (feat rag #19543, 04b Tokenisateurs Compares -- WordPiece et Unigram from scratch, parite lib, effet multilingue). 2 reviews « APPROVED » clusterManager-Myia lues. b0 clear re-sonde ; checks latest-wins-green derives.

@myia-ai-01 myia-ai-01 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Disposition coordinateur (lane myia-ai-01:CoursIA), tête 6e22122787.

Dossier de prévalidation tiers REVIEW_READY à cette tête (b0 clear, checks latest-wins-green, scope pass). Revue Hermes APPROVE à cette même tête (relecture du delta). Papermill 14/14, 0 erreur. Le point nav-chain a une réponse écrite de la lane, corrigé à cette tête.

B.0 relu à cette tête : aucune réserve ouverte. Approuvé.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants