Repository navigation
fix(rag,#15677): RAG-03 exercices 1 et 2 — étiquetage depuis le vocabulaire de l'élève, perte normalisée par terme - #15756
Conversation
…ulaire de l'eleve, perte normalisee par terme Exercice 1 : plus_proches() gagne un parametre `etiquettes` optionnel (defaut = vocabulaire global, retro-compatible) ; l'etape 3 de l'exercice etiquette desormais depuis vocabulaire_exo, car w2i_exo indexe le corpus etendu de l'eleve — les indices decales rendaient des mots faux et levaient IndexError sur les mots ajoutes. L'enonce gagne le paragraphe "Piege d'etiquetage". Exercice 2 : la comparaison porte sur une perte normalisee par terme (perte / (1 + K)), la boucle de la section 4 accumulant 1 + K termes par paire — l'echelle de la perte brute suit (1 + K) mecaniquement (~ (1+K).ln 2 a l'initialisation), donc comparer des pertes brutes entre K differents mesure le compte de termes, pas l'hyperparametre. Re-execution complete (kernel declare python3) : 13 cellules code, execution_count 1..13, 0 erreur ; validate_pr_notebooks 1/1 PASS ; les 3 stubs gardent result = None / TODO (C.1). Chemins absolus papermill ramenes au basename via scrub_papermill_paths.py. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Notebook outputs-required (H.4 schema): PASS (every code cell carries an
|
|
✅ No prose/output mismatch detected in the notebooks this PR changed. Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit |
Golden-Set Execution (H.7 P3)✅ 8/8 notebooks passed (certified reproducible)
Pinned lockfile: |
Notebook PR Validation: PASS
Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns) |
Path-collision (organ #13359/#13615)Cette PR #15756 (
Le verdict terminal (#15578) signifie que la substance est deja sur |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
VERDICT: LGTM (vérifié: rétrocompatibilité plus_proches + correction mathématique de l'artefact d'échelle (1+K)·ln 2)
[Hermes] — review du head c47893cf (aucune review cluster pré-existante sur ce SHA).
Vérifications effectuées :
- Fix 1 rétrocompatible et complet :
plus_proches(..., etiquettes=None)aveclabels = vocabulaire if etiquettes is None else etiquettes— les 4 sites d'appel du diff vérifiés : la définition, les indices de l'énoncé ex. 1 ; les appels de démonstration de la section 4 utilisent le défaut (vocabulaire global), comportement inchangé. Le diagnostic de l'issue est cohérent :w2i_exoindexe le corpus étendu → étiquettes globales = mots faux +IndexErrorau-delà de l'ancien corpus. - Fix 2 — la correction est mathématiquement juste : la perte skip-gram à K négatifs accumule bien 1+K termes par paire (terme positif + K négatifs), chacun ≈ ln 2 à l'initialisation → perte brute ≈ (1+K)·ln 2. Comparer des pertes brutes entre K∈{2,5,10} mesure le compte de termes, pas l'hyperparamètre. L'énoncé corrigé (« perte MOYENNE PAR TERME — perte_par_epoque / (1 + K) ») et l'explication ajoutée à l'élève sont exactes.
- Stubs préservés : les 2 cellules exercices restent des TODO (
result = None) — aucun output de « solution » fabriqué ; la ré-exécution intégrale du notebook est fraîche (timestampsiopub.execute_input2026-09-12,papermill.exception: falsesur toutes les cellules). Le +421 se décompose en ~176 lignes de churn papermill/timestamps, 16 lignes substantives (nouveau paramètre + énoncés), le reste en fermetures JSON. - Security scan : 0 match.
Rien de bloquant.
…ulaire de l'eleve, perte normalisee par terme (#15756) Exercice 1 : plus_proches() gagne un parametre `etiquettes` optionnel (defaut = vocabulaire global, retro-compatible) ; l'etape 3 de l'exercice etiquette desormais depuis vocabulaire_exo, car w2i_exo indexe le corpus etendu de l'eleve — les indices decales rendaient des mots faux et levaient IndexError sur les mots ajoutes. L'enonce gagne le paragraphe "Piege d'etiquetage". Exercice 2 : la comparaison porte sur une perte normalisee par terme (perte / (1 + K)), la boucle de la section 4 accumulant 1 + K termes par paire — l'echelle de la perte brute suit (1 + K) mecaniquement (~ (1+K).ln 2 a l'initialisation), donc comparer des pertes brutes entre K differents mesure le compte de termes, pas l'hyperparametre. Re-execution complete (kernel declare python3) : 13 cellules code, execution_count 1..13, 0 erreur ; validate_pr_notebooks 1/1 PASS ; les 3 stubs gardent result = None / TODO (C.1). Chemins absolus papermill ramenes au basename via scrub_papermill_paths.py. Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Ce que corrige cette PR
Grain: MED/notebook-python — lane myia-po-2023:CoursIA — prev: MED/guard #15753
#15677 : deux défauts confirmés dans
03-Embeddings-From-Scratch.ipynb, tous deuxdans les exercices de la section 8 — l'énoncé donnait à l'élève une instruction qui
plante ou une grandeur qui ne mesure pas ce qu'elle annonce.
Exercice 1 — étiquetage depuis le mauvais vocabulaire. L'étape 3 demandait
plus_proches(normaliser(W_exo), w2i_exo[mot_sonde], k). Orplus_proches(cellule 14)étiquetait ses voisins depuis le
vocabulaireglobal en dur, alors quew2i_exoindexe le corpus étendu de l'élève : indices décalés → mots rendus faux, et
IndexErrordès qu'un indice dépasse l'ancien corpus (les mots ajoutés y sont).Suivre l'énoncé à la lettre produisait donc soit un résultat silencieusement faux, soit
un crash sur l'ajout de mots — le geste même de l'exercice.
Exercice 2 — la comparaison lit un artefact d'échelle. L'énoncé invitait à comparer
les courbes de perte brutes entre couples
(D, K)— dont(30,2)/(50,5)/(100,10). La boucle de référence (section 4) accumule 1 + K termes par paire :l'échelle de la perte brute suit mécaniquement
1 + K(≈(1+K)·ln 2àl'initialisation), donc comparer des pertes brutes entre
Kdifférents mesure lecompte de termes, pas l'effet de l'hyperparamètre.
Le fix
Cellule 14 —
plus_prochesgagne un paramètreetiquettesoptionnel :Rétro-compatible : les appels existants (la cellule 14 elle-même, l'étape 1 de l'exercice 3
en cellule 28, qui travaillent sur le corpus global) gardent
vocabulairepar défaut etsont inchangés. Un commentaire explique le piège d'alignement indices↔étiquettes.
Cellules 23 / 24 (exercice 1) — l'étape 3 devient
plus_proches(normaliser(W_exo), w2i_exo[mot_sonde], k, etiquettes=vocabulaire_exo), etl'énoncé gagne un paragraphe « Piège d'étiquetage, à traiter dans la solution » qui dit
pourquoi (indices décalés ;
IndexErrorsur les mots nouveaux). L'exercice reste unstub (C.1 :
result = None,# TODO,# Étape Nconservés) — c'est l'énoncé quidevient correct, pas la solution qui est fournie.
Cellules 25 / 26 (exercice 2) — la comparaison se fait sur une perte normalisée par
terme (
perte / (1 + K)), avec l'artefact d'échelle expliqué dans l'énoncé et dans lestub. Les exemples d'appel restent
entrainer_exo(30, 2)/(50, 5)/(100, 10),« à époques égales ». Stub inchangé côté C.1.
Validation
kernelspec déclaré du notebook (
python3), viascripts/notebook_tools/notebook_tools.py execute:validate_pr_notebooks.py origin/main: 1/1 PASS (13 cellules code).execution_count1..13 (aucunnull), 0 erreur.raise NotImplementedError/assert False/1/0dans les sources ;les 3 stubs d'exercice gardent
result = None,# TODO,# Indice,# Étape N.metadata.papermill; lesinput_path/output_pathabsolus (D:\Dev\CoursIA-15677\...) ont été ramenés aubasenamepar l'outil canoniquescripts/notebook_tools/scrub_papermill_paths.py --apply(normalisation de metadata, pas un scrub de sortie). Re-scan : 0 défaut. Scan des
sorties (
--outputs) : aucune fuite.Diff — ce qui bouge et pourquoi
Changement sourcé sur 5 cellules (14, 23, 24, 25, 26) : les 5 éditions ci-dessus.
Le reste du diff est le churn inhérent à une ré-exécution (C.2), vérifié cellule par
cellule contre
origin/main:model_iddu widget tqdm2.68e-07→2.53e-07stdoutscindée en 2 blocsNote :
03-Embeddings-From-Scratch.ipynbne portait aucune metadata papermill surmain;la ré-exécution en ajoute (notebook-level + par cellule). C'est la convention majoritaire de
la série (6/10 voisins la portent) et le produit direct de l'outil d'exécution du dépôt — je
le signale explicitement puisque cela élargit le diff au-delà des 5 cellules éditées.
Hors périmètre (respecté)
W,Wc,vocabulaire,themes,phrasesinchangés.main.See #15656 (PR ouverte touchant le même notebook, cellules non recouvrantes).
Closes #15677
🤖 Generated with Claude Code