Repository navigation
rag(03): l'exercice 1 reutilise plus_proches (lie au vocabulaire global) et l'exercice 2 compare des pertes brutes dont l'echelle varie mecaniquement avec K #15677
Description
Findings H03+H04 de la passe d'audit GenAI, re-verifies firsthand le 2026-09-12 sur origin/main = 162779ec06. Les deux points de fond sont confirmes au source. Note preliminaire : le nom experience(D, K, mots) cite par l'audit n'existe pas dans le notebook (il vient du titre de la PR #15415) — les fonctions reelles sont plus_proches(, voisins_apres_extension( (exercice 1) et entrainer_exo( (exercice 2). La verification ci-dessous porte sur elles.
Defaut 1 (H03) — l'exercice 1 reutilise un helper lie au vocabulaire GLOBAL
Le helper de la cellule 14 etiquette ses resultats par le vocabulaire global :
def plus_proches(vecteurs_normalises, indice, k=5):
...
return [(vocabulaire[j], round(float(sims[j]), 3)) for j in ordre[1:k+1] if j != indice]L'exercice 1 (cellule 23/24) demande d'etendre le corpus du theme cuisine avec des mots nouveaux, de reconstruire son propre vocabulaire (w2i_exo, Etape 2), puis l'Etape 3 prescrit : « retourner plus_proches(normaliser(W_exo), w2i_exo[mot_sonde], k) ». Sur un corpus etendu, l'espace d'indices change (le vocabulaire grandit, les indices se decalent) : les etiquettes rendues par plus_proches proviennent de l'ANCIEN vocabulaire global — etiquettes fausses (decalage d'indices) et IndexError des que j >= len(vocabulaire) (les nouveaux mots). L'exercice mene l'eleve a un crash ou a des voisins mal etiquetes par construction, alors que l'en-tete markdown promet une experience « autonome ».
Defaut 2 (H04) — l'exercice 2 compare des pertes brutes dont l'echelle varie mecaniquement avec K
La boucle d'entrainement de reference (cellule 10) accumule, par paire, le NLL du positif plus le NLL de chacun des K negatifs (1 + K termes), puis divise par le nombre de paires seulement :
total -= math.log(p + 1e-12) # positif
for _ in range(K):
...
total -= math.log(1 - pn + 1e-12) # K negatifs
perte_par_epoque.append(total / len(paires_idx))La perte par paire (et par epoque) depend donc mecaniquement du nombre de termes (1 + K). L'exercice 2 (cellules 25/26) demande de « comparer la courbe de perte pour plusieurs couples (D, K) » avec l'exemple explicite entrainer_exo(30, 2), entrainer_exo(50, 5), entrainer_exo(100, 10) « a epoques egales » — les ecarts de perte entre ces appels sont domines par le facteur mecanique (1+K), pas par l'apprentissage ou la capacite D. Preuve par les valeurs mesurees par l'audit : 2,079 / 4,159 / 7,625 sont exactement (1+K)·ln 2 pour K = 2 / 5 / 10 (3×0,6931 ; 6×0,6931 ; 11×0,6931) — le plancher a l'initialisation, qui scale par le seul compte de termes. (Ces valeurs n'apparaissent pas dans le notebook ; le fait structurel — 1+K termes par paire — est verifie a la cellule 10.)
Localisation
MyIA.AI.Notebooks/GenAI/RAG-et-Memoire-Semantique/03-Embeddings-From-Scratch.ipynb — cellules 14 (helper plus_proches), 10 (boucle de reference de la perte), 23/24 (exercice 1), 25/26 (exercice 2).
Ce qu'un correctif devrait faire (sans l'ecrire)
- Exercice 1 : que la solution de l'eleve etiquette depuis son vocabulaire etendu (le helper prenant la liste d'etiquettes en parametre, ou la construction des couples en ligne dans la solution) — l'Etape 3 actuelle est l'instruction qui plante.
- Exercice 2 : comparer une grandeur normalisee par terme (perte divisee par 1+K), ou borner la comparaison de courbes brutes aux K egaux en le disant — l'enonce actuel invite a lire un artefact d'echelle comme un effet d'hyperparametre.
Coordination
La PR #15656 (OPEN) modifie ce notebook (+37/-283) mais aucune ligne de son patch ne touche plus_proches, entrainer_exo, voisins_apres_extension, resultat ni perte_par_epoque (verifie sur le patch de la PR) — les cellules visees ici sont hors de sa zone.
Reassessed by audit-issue-opener: CONFIRMED pedagogy (helper global => etiquettes fausses/IndexError ; pertes brutes non comparables entre K, preuve (1+K)·ln 2)
Activity
jsboige commentedon Sep 12, 2026
[CLAIMED] lane myia-po-2023:CoursIA — 2026-09-12T15:05Z — paths: MyIA.AI.Notebooks/GenAI/RAG-et-Memoire-Semantique/03-Embeddings-From-Scratch.ipynb (exercice 1 : étiquetage depuis le vocabulaire étendu de l'élève, plus de dépendance au vocabulaire global ; exercice 2 : grandeur normalisée par terme (1+K) ou comparaison bornée aux K égaux, dite dans l'énoncé. Cellules 10/14/23/24/25/26, re-exécution complète.)
jsboigeEpita commentedon Sep 12, 2026
[DELIVERED] lane myia-po-2023:CoursIA — 2026-09-12T19:0xZ — PR #15756
Les deux défauts confirmés sont corrigés, dans le périmètre annoncé au claim (cellules 10/14/23/24/25/26) :
Exercice 1 — étiquetage :
plus_proches(cellule 14) prend un paramètreetiquettesoptionnel (défaut =vocabulaireglobal → rétro-compatible ; les appels existants de la cellule 14 et l'étape 1 de l'exercice 3 en cellule 28 sont inchangés). L'étape 3 de l'exercice passeetiquettes=vocabulaire_exo— l'énoncé gagne le paragraphe « Piège d'étiquetage » (indices décalés ;IndexErrorsur les mots ajoutés).Exercice 2 — grandeur comparée : comparaison sur la perte normalisée par terme (
perte / (1 + K)), l'artefact d'échelle(1 + K)(~(1+K)·ln 2à l'initialisation) étant dit dans l'énoncé et dans le stub. Exemples d'appel inchangés(30,2)/(50,5)/(100,10), à époques égales.Option retenue : celle de l'issue (« le helper prenant la liste d'étiquettes en paramètre » + « perte divisée par 1+K »), pas la variante « construire les couples en ligne dans la solution » (elle aurait dupliqué le helper) ni « borner la comparaison aux K égaux » (elle aurait réduit la portée de l'exercice).
Validation : ré-exécution complète avec le kernelspec déclaré du notebook (
python3), 13 cellules code,execution_count1..13, 0 erreur ;validate_pr_notebooks.py origin/main1/1 PASS ; C.1 respecté (3 stubsresult = None,# TODO/# Étape Nconservés — aucune solution fournie). Chemins absolusmetadata.papermillramenés au basename parscripts/notebook_tools/scrub_papermill_paths.py(l'exécution en estampille ;mainn'en portait pas). Gardes de variation 3/3 (MED/notebook-python, prev #15753).Note de périmètre : la ré-exécution ajoute
metadata.papermill(notebook + cellules) et régénère les sorties des cellules non éditées — churn vérifié cellule par cellule contremain(cellules 11/15 byte-identiques ; cellule 19 =model_idde widget ; cellule 20 =2.68e-07→2.53e-07, conclusion identique). Documenté dans le body de la PR.fix(rag,#15677): RAG-03 exercices 1 et 2 — etiquetage depuis le vocab…
fix(rag,#15677): RAG-03 exercices 1 et 2 — etiquetage depuis le vocab…