Skip to content

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

Closed

Description

@myia-ai-01

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

  1. jsboige commented on Sep 12, 2026

    @jsboige
    Owner

    [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.)

  2. jsboigeEpita commented on Sep 12, 2026

    @jsboigeEpita
    Contributor

    [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) :

    1. Exercice 1 — étiquetage : plus_proches (cellule 14) prend un paramètre etiquettes optionnel (défaut = vocabulaire global → 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 passe etiquettes=vocabulaire_exo — l'énoncé gagne le paragraphe « Piège d'étiquetage » (indices décalés ; IndexError sur les mots ajoutés).

    2. 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_count 1..13, 0 erreur ; validate_pr_notebooks.py origin/main 1/1 PASS ; C.1 respecté (3 stubs result = None, # TODO/# Étape N conservés — aucune solution fournie). Chemins absolus metadata.papermill ramenés au basename par scripts/notebook_tools/scrub_papermill_paths.py (l'exécution en estampille ; main n'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 contre main (cellules 11/15 byte-identiques ; cellule 19 = model_id de widget ; cellule 20 = 2.68e-07→2.53e-07, conclusion identique). Documenté dans le body de la PR.

  3. added a commit that references this issue on Sep 12, 2026
  4. added a commit that references this issue on Sep 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    auditAutomated quality audit findings

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions