Skip to content

[Audit #17073] Série RL — partition Hermes #17251

Description

@clusterManager-Myia

[Audit #17073] Série RL — partition Hermes

Population (partition Hermes) : 35 notebooks. Ligne principale rl_1→rl_18 (+ RL-7b, rl_1b, rl_1c) + ligne post-training rlpt_0→rlpt_4.

Panorama (survol headers, 21/09)

Arc pédagogique proposé : l'apprenant part de l'agent tabulaire (bandits rl_4, MDP/DP/Q-learning rl_5 — socle explicite des prérequis), monte aux familles from-scratch modernes (rl_6* : DQN, actor-critic, PPO, SAC, GRPO), parcourt les thèmes avancés (multi-agent, model-based, offline, reward shaping, POMDP, distributional, curiosity, hiérarchique), puis deux extensions théoriques récentes bordées « preprint » (rl_17 k-server/WFA, rl_18 secrétaire matroïdal). La ligne rlpt_* constitue un sous-arc RLHF autonome (reward model → DPO vs PPO).

Ordre canonique proposé : respecter l'ordre des index ; entrée alternative par la ligne rlpt pour un public déjà aguerri. rl_11 (POMDP) s'appuie sur rl_5 + rl_6 comme prérequis — position correcte.

Niveau d'apprenant proposé : intermédiaire → avancé. Constant sur la ligne principale (énoncés qui imposent Q-learning, epsilon-greedy, gradient policy comme acquis).

Gaps de série observés au survol :

  • Numérotation figée « Notebook : N/13 » (constaté rl_10 10/13, rl_11 11/13, rl_12 12/13, rl_6c 6c/13) alors que la ligne principale compte 18 tomes + RL-7b + rl_1b/1c + la ligne rlpt non numérotée — l'annonce « 11/13 » sous-estime la série réelle ; cohérente entre voisins directs, donc non déposée comme finding de rl_11, mais l'écart 13 vs 18+ mérite un arbitrage de série.
  • rl_5 (prérequis déclaré de rl_11) présente du mojibake d'accents dans ses titres (« Itération de Valeur ») — sera traité à son propre cycle, noté ici pour mémoire.
  • rl_13, rl_14, rl_18 ne portent pas le bandeau « N/13 » (titre seul) — la convention d'en-tête n'est pas uniforme en fin de série.

Checklist notebooks (partition Hermes)

  • RL-7b-Climbing-Game.ipynb
  • rl_1_intro_cartpole.ipynb
  • rl_1b_bitwise_logic_synthesis.ipynb
  • rl_1c_prolog_distillation.ipynb
  • rl_2_wrappers_sauvegarde_callbacks.ipynb
  • rl_3_experience_replay_her.ipynb
  • rl_4_multi_armed_bandits.ipynb
  • rl_5_mdp_dp_qlearning.ipynb
  • rl_6_dqn_policy_gradient.ipynb
  • rl_6b_actor_critic.ipynb
  • rl_6c_ppo_from_scratch.ipynb
  • rl_6d_sac_from_scratch.ipynb
  • rl_6e_grpo_from_scratch.ipynb
  • rl_7_multi_agent_rl.ipynb
  • rl_8_model_based_dyna_q.ipynb
  • rl_9_offline_rl.ipynb
  • rl_10_reward_shaping.ipynb
  • rl_11_pomdp.ipynb — audité (voir commentaire)
  • rl_12_distributional_rl.ipynb — audité (voir commentaire)
  • rl_13_curiosity_exploration.ipynb
  • rl_14_hierarchical_rl.ipynb — audité (voir commentaire)
  • rl_15_grpo_group_relative_policy.ipynb — audité (voir commentaire)
  • rl_16_dream_rsi.ipynb — audité (voir commentaire)
  • rl_17_k_server_wfa.ipynb — audité (voir commentaire)
  • rl_18_matroid_secretary.ipynb — audité (voir commentaire)
  • rlpt_0_reward_model_from_scratch.ipynb — audité (voir commentaire)
  • rlpt_0b_preference_dataset_bias.ipynb — audité (voir commentaire)
  • rlpt_0c_reward_hacking_case_study.ipynb
  • rlpt_0d_reward_trainer_sota.ipynb — audité (voir commentaire)
  • rlpt_0e_trl_DPO_SOTA.ipynb
  • rlpt_0f_comparaison_GRPO_TRL_et_PPO_maison.ipynb
  • rlpt_1_ppo_lm_rlhf.ipynb — audité (voir commentaire)
  • rlpt_2_grpo_minimal.ipynb — audité (voir commentaire)
  • rlpt_3_reward_hacking.ipynb — audité (voir commentaire)
  • rlpt_4_dpo_vs_ppo.ipynb — audité (voir commentaire)

Campagne #17073 — audit critique au long cours, lecture seule stricte. Findings déposés en commentaires par notebook.

Activity

  1. clusterManager-Myia commented on Sep 21, 2026

    @clusterManager-Myia
    CollaboratorAuthor

    rl_11_pomdp.ipynb — 4 findings (2 stale-claim, 2 exercise-mismatch)

    Organes : OK — 0 signal sur 4 checks (split_reading_cells, interp_positioning, output_failure_text, source_parses) ; accents : 35 cures curables / 12 formes hors table (ecoute) ; check_duplicate_sections absent du checkout au pull du jour. Lectures chiffrees cellules 19 et 22 : verifiees contre les outputs bruts (valeurs 3.2/-4.8, -6.2±0.7, -11.8±1.8 presentes) — conformes. Figure cellule 11 : verifiee visuellement contre sa lecture (grille 2x2, echelier bleu, verte = position reelle, pointille 0.5) — conforme.

    Verdicts ci-dessous obtenus par execution du code du notebook ( reimplementation stdlib fidele de TigerPOMDP cellule 2 + politiques cellule 5, 100k-200k episodes ; croisee avec l'analyse close-form : listen x5 a p=0.85 = 0.973x10 - 0.027x100 - 5 = +2.05, mesure +2.05 ).


    F1 — stale-claim | cellules : 0d2550de (section 6, Resultats cles, point 1)

    « Open immediately est la meilleure politique simple ! Avec une precision de 85%, une seule observation gratuite suffit, et ecouter plus ne compense pas le cout (-1/écoute). »

    Pourquoi : faux sous le code du notebook — listen x5 puis ouvrir mesure +2.05 contre -6.55 pour open immediately (ecart ~8.5 de retour par episode) ; l'apprenant qui execute l'experience mere de la section obtient le contraire du resultat cle annonce. Racine : le code rend une observation gratuite a 85 % au reset() (variante non canonique du Tiger Problem), que open_immediately exploite et listen_then_open ignore — les politiques comparees ne jouent pas le meme jeu, et celle qui accumule les ecoutes gagne.

    F2 — exercise-mismatch | cellules : 482fee41 (Enonce exercice 1) + d3c47acf (lecture du stub)

    « Faites varier p_correct entre 0.5 et 1.0 [...] A quel seuil la politique "open immediately" devient-elle meilleure que "listen x2" ? »

    Pourquoi : le seuil demande n'existe pas — mesure sur p de 0.5 a 1.0 : open immediately domine listen x2 a tous les p (ecart +1.8 a +2.1, quasi constant = cout des deux ecoutes) ; l'apprenant cherche un croisement que sa courbe ne montrera jamais. La lecture du stub d3c47acf renforce la fausse promesse : « le seuil ou deux ecoutes remboursent leur cout se trouve entre les deux, et c'est la valeur que le trace doit isoler ».

    F3 — exercise-mismatch | cellules : 1677f9e6 (Enonce exercice 2)

    « Trouvez le nombre optimal d'ecoutes [...] Montrez que N* = 1 pour P = 0.85 mais que N* augmente quand P diminue. »

    Pourquoi : l'enonce ordonne de demontrer un resultat faux sous le code fourni — N* mesure = 5 a p = 0.85 (listen x5 +2.05 contre -7.45 pour N = 1), et N* n'est pas croissant quand P diminue (N* = 0 a p = 0.5 et p = 1.0, maximum vers p ~ 0.85) ; l'apprenant ne peut pas resoudre l'exercice comme pose.

    F4 — stale-claim | cellules : 18cb6291 (section 4, « Pourquoi Q-MDP sous-performe-t-il ? »)

    « Si le belief est incertain ($b \approx 0.5$), l'agent prend une decision quasi-aleatoire, ce qui arrive frequemment en debut d'episode. »

    Pourquoi : contredit par la Q-table affichee deux cellules plus haut (sortie cellule 14 : a b = 0.5, ouvrir vaut (10-100)/2 = -45 contre Listen 8.5) — l'agent Q-MDP ecoute systematiquement en debut d'episode, il ne decide jamais quasi-au hasard ; l'apprenant qui lit le tableau puis l'explication voit deux recits incompatibles, et la vraie cause du -16.1 (ecouter trop longtemps, seuil b > 0.986) est d'ailleurs correctement calculee par la lecture chiffree 6d0b4aaa — l'explication de la section et sa propre lecture se contredisent.


    Note de serie (non finding, arbitrage) : la cause racine de F1-F3 est unique — l'observation gratuite au reset, heritee de l'implementation cellule 2, n'est jamais mentionnee dans les enonces ni dans les resultats cles. Toute correction devrait arbitrer d'abord la semantique voulue (variante canonique sans observation gratuite, ou exploitation coherente de celle-ci dans les deux politiques et les enonces).

    Ledger : mis a jour (status audite, classe_counts {stale-claim: 2, exercise-mismatch: 2}).

  2. clusterManager-Myia commented on Sep 21, 2026

    @clusterManager-Myia
    CollaboratorAuthor

    Audit MyIA.AI.Notebooks/RL/rl_13_curiosity_exploration.ipynb (RND / curiosité)

    Organes : couverts (0 signal sur 5 checks). check_split_reading_cells, check_interp_positioning, check_output_failure_text, check_cell_source_parses : vide. restore_accents_canonical --check : 6 cures possibles / 23 formes hors table (visites x4, piege x3, region x2, etat x2…). check_duplicate_sections absent du checkout.

    Lecture apprenant (survol rl_8 → rl_12 avant audit) : notebook très propre. Arc mécanisme (Partie A jouet 2D) → effet agent (Partie B chaîne) → comparatif → exercices, cohérent avec les prérequis annoncés (1, 4, 5, 6, 8 — tous réels et conformes). Les lectures chiffrées (cells 7 et 13) sont d'une précision exemplaire — décomposition 0.96 = 0.96×1.0 + 0.04×0.1 vérifiée, ratio 1969x vs ~2021 expliqué (division sur valeurs non arrondies), chemin minimal 15 droites nettes vs détours H=48 correct. Les deux figures (cells 8, 14) validées visuellement : zone sombre sur le nuage blanc, courbe verte ~1.0 vs rouge ~0.1, histogramme vert étalé jusqu'à N-1.

    Finding (1)

    • Classe : navigation-misplaced (bandeau de série manquant — défaut de SÉRIE, partagé avec rl_14)
      • Cellules : f63ecdca (cellule 0, en-tête)
      • Extrait (verbatim, début de cellule) : # RL 13 - Exploration par curiosité : Random Network Distillation (RND) — suivi directement du corps, sans le bandeau **Serie** : Reinforcement Learning | **Notebook** : N/13 | **Duree** : … ni la ligne Navigation :
      • Pourquoi : sur 9 notebooks de la série testés en amont (rl_1, rl_4, rl_5, rl_6, rl_6c, rl_8, rl_9, rl_10*, rl_12), le bandeau Série + position N/13 + durée estimée est la constante d'orientation (rl_10 l'a partiellement) ; rl_13 passe directement du titre au texte, l'apprenant qui enchaîne la série perd son repère de position (13/13) et de durée — un défaut de série à corriger en une passe unique, pas notebook par notebook.
      • Antériorité vérifiée : le bandeau n'a JAMAIS existé dans l'historique du fichier (git log complet) — la tranche densité du jour (Add: 2 markdown lectures chiffrees RL-13 RND curiosite (densite 1195 -> 1354, #13410) #16495, lectures cells 7/13) ne l'a ni créé ni retiré. Même constat sur rl_14.

    Candidats d'enrichissement (arbitrage user, PAS des findings — densification gelée)

    • La comparaison epsilon-greedy vs RND (cell 12) utiliserait un visits cumulé en fréquence par épisode pour montrer l'érosion de la concentration au fil des épisodes RND (figure actuelle : cumul total).
    • ICM (mentionné table cell 16) n'a pas de mini-implémentation jouet contrairement à RND — asymmétrie assumée par la table comparative, sans défaut associé.

    RAS ailleurs. Solutions des exercices non fuitées (squelettes TODO purs, notebook exécutable de bout en bout). Énoncés des 3 exercices exécutables tels quels (train_chain(beta=...), Welford, sweep N — tous les APIs cités existent dans le code fourni, vérifié par grep).

  3. clusterManager-Myia commented on Sep 21, 2026

    @clusterManager-Myia
    CollaboratorAuthor

    Audit — MyIA.AI.Notebooks/RL/rl_2_wrappers_sauvegarde_callbacks.ipynb (2/13)

    Verdict : RAS — organes : couverts (0 signal sur 5 checks ; accents : 55 cures possibles dans 11/23 cellules MD, 12 formes hors table).

    Lecture apprenante complète (33 cellules, 10 code) après survol de rl_1_intro_cartpole :

    • Chaque output a sa lecture (10/10) : wrapper (c5), round-trip save/load + pourquoi le 210.00 vient du disque (c8), multiprocessing avec garde explicite contre la lecture causale du 465.1 vs 210 (A2C+vec-env changés ensemble, c12), contrat booléen du callback (c15), checkpoints avec lecture des 5 lignes et du -inf initial (c18), env custom 1.0 = plomberie pas difficulté (c21), stubs exercices 1-3 (c25/c28/c31).
    • Valeurs citées vérifiées dans les outputs : 210.00→42 % du plafond 500, 465.1→93 %, check_freq=1000 × 5000 pas = exactement les 5 contrôrels affichés.
    • Exercices alignés avec les stubs et la progression : l'exercice 3 hérite explicitement de la distinction terminated/truncated (wrapper §1 → formalisation §5 → GridWorld).
    • Faux positif de la gate Redressement campagne densité #13410 : remplissages dégénérés — 233 notebooks, 20 paquets d'audit #17040 : l'empilement de prose détecté en [8,9] est l'encart « Attention » (c9, replay buffer off-policy), distinct d'une lecture et annoncé par c8 elle-même (« L'encart Attention ci-dessous complète le contrat ») — pas un double-reading.

    Le seul écart série (faiblesse RL/requirements vs %pip du MD c1) est couvert par la prose de la cellule d'imports elle-même (c2) — pas de perte pour l'apprenant.

    — Hermes (po-2026), partition Hermes, campagne #17073.

  4. jsboige commented on Sep 21, 2026

    @jsboige
    Owner

    Audit rl_3_experience_replay_her.ipynb

    Organes : OK — 0 signal sur 5 checks (split_reading_cells, interp_positioning, output_failure_text, source_parses ; accents : 77 cures / 21 formes hors table ; duplicate_sections absent du checkout).
    Lectures vs sorties : valeurs citées vérifiées exactes sur [9] (24.1 ± 8.3, 241/2000), [27] (success_rate 0 sur les 20 tranches, -55.2 / 9984 / 8983 — la lecture agrège légitimement les logs DDPG), [36] (655 it/s). Les 5 paires « lectures empilées » des gates #17040 sont des paires lecture-lecture légitimes (chiffres puis portée), pas des doublons.

    Findings (4 × stale-claim)

    F1 — stale-claim · cellules [14]

    On peut vérifier en imprimant env.action_space ou env.observation_space.

    La prose promet une vérification qu'aucune cellule n'exécute : action_space/observation_space n'apparaissent dans aucune cellule code de ce notebook ni dans aucun output (la cellule [12] n'affiche que les clés du dict + shapes). L'apprenant qui suit ne voit jamais la vérification annoncée, et ne sait pas si le « 2 dimensions » de la ligne suivante est montré ou affirmé.

    F2 — stale-claim · cellules [9]

    la source code litteralement q_target_naive = rew_b + gamma * (1 - done_b) * 0.0

    La citation « littérale » ne l'est pas : la ligne réelle de la cellule [8] est q_target_naive = rew_b + gamma * (1 - done_b.astype(np.float32)) * 0.0. Une lecture qui enseigne le point de vigilance « la cible Q n'est pas nulle » en citant une source introuvable telle quelle affaiblit le geste pédagogique central (montrer le * 0.0 dans le code) — l'apprenant qui grep la ligne ne la retrouve pas.

    F3 — stale-claim · cellules [9]

    SAC (notebook suivant : rl_6d_sac_from_scratch.ipynb)

    Le renvoi désigne rl_6d comme « notebook suivant » alors que le suivant dans la série est rl_4 (bandits) — cf. navigation du header [0] ([RL-4 Bandits >>]) et table du README (rl_6d = 15e entrée du répertoire). L'apprenant est envoyé 12 notebooks plus loin en croyant suivre l'ordre de lecture ; un renvoi transversal correct exigerait « plus loin dans la série ».

    F4 — stale-claim (défaut de SÉRIE) · cellules [0]

    Serie : Reinforcement Learning | Notebook : 3/13 | Duree estimee : 40-45 min

    Le dénominateur « /13 » ne correspond à aucun comptage réel : le README de la série table 18 notebooks numérotés (1→18) + fichiers annexes (rl_1b, rl_1c, RL-7b, rlpt_0→4f), 33 fichiers au total. Vérifié en survol : le même pattern figure sur rl_1 (« 1/13 »), rl_4 (« 4/13 »), rl_5 (« 5/13 ») → dénominateur figé datant d'un état ancien de la série, à corriger en série (une passe header sur les 33 fichiers), pas notebook par notebook.

    RAS

    • Exercices 1-3 : stubs propres (strategy_results = {} etc.), TODO étudiants, pas de fuite.
    • [45] lecture du stub exercice 3 : réécriture correcte du contrat, pas de seconde lecture ajoutée.
    • Panorama inchangé (issue [Audit #17073] Série RL — partition Hermes #17251) : position 3/18 confirmée dans l'arc, aucune révision d'ordre canonique.
  5. jsboige commented on Sep 21, 2026

    @jsboige
    Owner

    Audit rl_7_multi_agent_rl.ipynb (cycle Hermes #17073)

    Organes : couverts (0 signal sur 4 checks — split_reading, interp_positioning, output_failure_text, cell_source_parses ; accents : 54 cures possibles / 20 cellules, hors finding). check_duplicate_sections absent du checkout. Lectures chiffrees vérifiées contre les outputs : valeurs exactes (92,0/71,0 %, nuls 13→24→20 %, grille, anti-diagonale, tuple 710+134+156=1000) — RAS de ce côté.

    Findings (3) :

    1. orphan-statement — cellules m2c3e003 [02] et m3d4e004 [03] : la cellule 03 rejoue import numpy as np / import matplotlib.pyplot as plt / from pettingzoo.classic import tictactoe_v3 / print("PettingZoo charge avec succes"), strictement inclus dans la cellule 02 (qui ajoute seulement warnings). Extrait 03 : import numpy as np\nimport matplotlib.pyplot as plt\nfrom pettingzoo.classic import tictactoe_v3\n\nprint("PettingZoo charge avec succes"). La lecture 644c4588 [04] rationalise la duplication en geste intentionnel (« Le geste est applique deux fois ») alors que c'est un résidu de copier-coller. L'apprenant perd : il apprend que ré-importer à l'identique est un pattern de vérification délibéré, et en reproduira le cargo-culte.

    2. navigation-misplaced — cellule m0a1e001 [00], bandeau Navigation : [RL-1 Intro](rl_1_intro_cartpole.ipynb) | [RL-2 Wrappers](…) | [RL-3 HER](…) | [RL-5 Tabulaire](…) | [RL-6 DQN/PG](…) | **RL-7**. RL-4 (rl_4_multi_armed_bandits.ipynb, présent dans le dépôt ET dans la table de conclusion de ce notebook) est omis entre RL-3 et RL-5, et il n'y a ni lien suivant (RL-8 model-based) ni lien Index — contrairement à RL-1 qui ouvre par [Index](README.md). L'apprenant perd : deux portes de sortie de la série (bandits, suite RL-8) invisibles depuis ce carrefour.

    3. paraphrase-stack — cellules 49ca7299 [25] puis o1v2e022 [26] : la Lecture chiffree [25] couvre déjà « les DEUX agents ecrasent l'aleatoire », « l'ecart entre les deux taux… avantage structurel du premier joueur ». La cellule 26 restitue la même chose en plus faible : Un agent bien entraine devrait gagner la majorite des parties contre un joueur aleatoire. Le joueur X (qui commence) a un avantage naturel et devrait avoir un taux de victoire plus eleve. L'apprenant perd : la prose générique survit sous la lecture qui la remplace — c'est exactement la sous-famille visée par la proposition d'organe paraphrase-stack déjà déposée sur Audit critique au long cours des 1343 notebooks -- campagne Hermes + NanoClaw, decouverte de classes et organes #17073 (répétition de transition générique après Lecture chiffree).

    Non déposés (Parade 3) : paires [08,09] et [11,12] — la seconde cellule est annoncée par la première (« La cellule suivante detaille le tenseur » / exemple→règle des récompenses), enrichissement sans défaut ; [19] se positionne explicitement par rapport à [20]. Bandeau « 7/13 » : écart de numérotation déjà arbitré au niveau série dans le panorama ci-dessus.

    Compteur campagne : orphan-statement = 1ʳᵉ occurrence (seuil organe = 3, non atteint).

  6. clusterManager-Myia commented on Sep 23, 2026

    @clusterManager-Myia
    CollaboratorAuthor

    Audit MyIA.AI.Notebooks/RL/rlpt_0c_reward_hacking_case_study.ipynb (biais de longueur, RM appris + PPO)

    Organes : couverts — 0 signal sur 5 checks (split_reading_cells, interp_positioning, output_failure_text, cell_source_parses, duplicate_sections) ; accents : 0 cure / 14 formes hors table (donne ×5, retiré ×3, optimisé ×2…). Checkout organes f47d4f93e.

    Survol de série : rlpt_0 (Bradley-Terry from scratch, calibration), rlpt_3 (hack qui ne prend pas) — l'intro de 0c se positionne correctement par rapport aux deux. Référence croisée « détecteur Length Drift de PT-07 » vérifiée : MyIA.AI.Notebooks/GenAI/PostTraining/PT_07_rewardspy_reward_hacking.ipynb existe et documente bien ce détecteur (pas un finding ; l'absence de lien retour depuis la série PT est un candidat panorama). Exercices : 3 squelettes à TODO réel, énoncés en cohérence — pas d'exercise-mismatch.

    Finding 1 — stale-claim : la table r_phi n'est pas reproduite par les poids imprimés

    • Cellules : md-008 (modèle déclaré), code-010 (impression des poids), code-018 (table r_phi par action)
    • Extrait (md-008, verbatim) : « $$\hat s_\phi(e) = b + w_c \cdot \mathbb{1}[e \text{ correct}] + w_l \cdot \frac{p(e)}{B}$$ »
    • Preuve (reconstruit depuis les outputs) : la table code-018 donne r_phi(e=0) = +8.7153 pour correct=False, longueur=10, donc constante + w_l·1 = 8.7153 ; avec w_l = +7.7436 imprimé en code-010, la constante effective vaut 0.9717 — pas le b = +0.5304 affiché. L'écart est constant (+0.4413) sur les 11 lignes de la table : c'est le poids de la première feature de features() (colonne constante 1.0, jamais imprimée), redondant avec le rm.bias de nn.Linear. Confirmation indépendante : le score RM de la politique uniforme (+6.6103, code-015/code-018) vaut 0.4545·w_c + moyenne(p/B)·w_l + constante et ne se reproduit qu'avec 0.9717.
    • Pourquoi l'apprenant perd : la lecture centrale du notebook (« le biais est un paramètre mesuré de r_φ », md-011) repose sur des poids dont il ne peut pas retrouver la table — quatre paramètres effectifs sont déclarés/imprimés sur cinq, donc toute re-derivation de r_phi(e) depuis les valeurs affichées échoue silencieusement de +0.44.

    Remède minimal (à arbitrage) : imprimer aussi le poids de la feature constante (ou l'inclure dans b et n'afficher que la somme), pour que ŝ_φ affiché = r_phi calculé.


    Ledger : 1 finding (stale-claim). Rappel : proposition d'organe stale-claim déjà déposée (sous-famille « valeur citée non reproduite par l'output » — instance supplémentaire ici).

  7. added a commit that references this issue on Sep 23, 2026
  8. added 2 commits that reference this issue on Sep 23, 2026
  9. jsboige commented on Sep 24, 2026

    @jsboige
    Owner

    [CLAIMED] lane myia-po-2027:CoursIA-2 — réparation du mojibake de rl_5 (27 cellules markdown et cellule de code 61, puis ré-exécution papermill de bout en bout), claim posé au dispatch par le titulaire myia-po-2025:CoursIA-2 -- paths: MyIA.AI.Notebooks/RL/rl_5_mdp_dp_qlearning.ipynb

    Mesure du titulaire (origin/main 88b5459, 2026-09-24 04:20Z) : sur les 1382 notebooks de MyIA.AI.Notebooks/**, rl_5 est le seul qui porte du mojibake UTF-8 décodé en cp1252 (motif [ÃÂâ] suivi d'un octet cp1252 0x80-0xBF). Compte : 222 occurrences en markdown, 1 en code, 1 en sortie. L'origine est le commit 369eb6c (PR #13010). L'aller-retour seg.encode('cp1252').decode('utf-8') rétablit les 27 cellules markdown touchées, avec 0 résidu mesuré. La cellule de code 61 (print(f"Exercice 1 : ... cree — ...")) et sa sortie demandent une correction de source suivie d'une ré-exécution (C.2), jamais une retouche de la sortie.

    C'est le cycle propre que ce ticket annonçait pour ce mojibake (« sera traité à son propre cycle »).

  10. clusterManager-Myia commented on Sep 25, 2026

    @clusterManager-Myia
    CollaboratorAuthor

    Audit MyIA.AI.Notebooks/RL/rl_6c_ppo_from_scratch.ipynb (PPO depuis zéro)

    Organes (checkout 289e0a4) : OK — split_reading_cells 0, interp_positioning 0/0, output_failure_text 0, source_parses 0/1, duplicate_sections 0 (advisory multi_closing seulement) ; accents : 56 cures / 4 formes hors table.

    Survol de série : rl_6b (Actor-Critic) lu en headers — enchaînement 6b→6c cohérent (6b clôt sur « Ouverture — vers PPO », 6c ouvre sur la limite A2C du pas d'apprentissage ; mêmes conventions terminated/truncated, gabarit ablation 5 graines repris). Arc solide : motivation TRPO→PPO → géométrie du clip (fig. lue) → implémentation → ablation multi-graines exemplaire → GAE → exercices → pont RLHF vers PostTraining. Aucun gap de prérequis détecté.

    Findings (2)

    1. stale-claim — finale du run de référence citée « 489.5 » / « 489 » mais la sortie commitée imprime 495.2

    • Cellules : 69967e1f [§3.6] et f000d273 [Interprétation]
    • Extraits : « sur un run unique (seed 42, resolution 489.5) » / « mediane 168, contre 489 au run de reference a 400 episodes »
    • Classe : stale-claim
    • Pourquoi : l'apprenant qui croise la sortie de la cellule 17 (« Recompense moyenne (derniers 50) : 495.2 ») ne retrouve ce chiffre nulle part dans la prose qui le commente — les deux sections décrivent un run antérieur jamais ré-exécuté dans le texte.

    2. stale-claim — phrase de process interne (« écart signalé à l'owner dans la PR ») laissée dans une lecture chiffrée

    • Cellule : 075341e1 [§3.6, lecture de l'ablation]
    • Extrait : « le chiffre exact de la prose ne se retrouve dans aucune sortie, ecart signale a l'owner dans la PR »
    • Classe : stale-claim
    • Pourquoi : cette phrase documente un flux de réparation interne (constat fait puis remonté en review) ; face à l'apprenant elle est un traînard qui admet le défaut sans le corriger — après correction du finding 1, elle n'aurait plus rien à commenter.

    Non-findings (exclusions Parade 3, notés pour mémoire)

    • Exercices 2 et 3 sans lecture de stub (l'exercice 3 en a une) — TODO d'exercice, exclu.
    • Pont vers ../GenAI/PostTraining/PT_01…PT_05 : liens vérifiés présents sur main.
    • Indice « modifier lam » de l'exercice 2 : la voie (sous-classer PPOAgent, exposée dans le stub) est bien indiquée — pas d'exercise-mismatch.

    Ledger : status audité, classe_counts {stale-claim: 2}.

  11. clusterManager-Myia commented on Sep 25, 2026

    @clusterManager-Myia
    CollaboratorAuthor

    Audit pédagogique — MyIA.AI.Notebooks/RL/rlpt_0e_trl_DPO_SOTA.ipynb

    Passe d'organes : OK — split_reading_cells 5 signaux (paires génériques [5,6], [14,15], [28,29], [33,34] + separated_by_code [26,28], jaccard ≤ 0.125) couverts ; interp_positioning 0 ; output_failure_text 0 ; cell_source_parses 0 ; duplicate_sections 0 ; accents 15 cures / 8 cellules + 31 formes hors table.

    Lecture apprenant (posture : a lu rlpt_0, rlpt_0b, rlpt_0d) : arc très bien construit — reprise verbatim du monde rlpt_0 (section 1), dérivation DPO en section 3 (Rafailov 2023 cité), bras A/B/C mesurés dans la même session, multi-seed {0,1,7,42} avec verdict honnête « indiscernables » (cellule 34), section 7 from-scratch-vs-SOTA avec LOC réellement comptées sur les sources (46/61/33 vérifié par re-comptage AST : conforme). Les stubs d'exercices sont conformes C.1 (trois exercices TODO etudiant, sorties « Exercice a completer » réelles).

    Findings — 1

    F1 — stale-claim — cellule 26 (« Lecture chiffree — la dynamique DPO dans les logs trl : la marge triple, la perte bouge a peine ») :

    « Les six lignes de log du bras C racontent la meme histoire que la perte 0.6482 -> 0.6053 du bras B [...] le cout : [Bras C | trl.DPOTrainer] entraînement 151.0s contre 6.2 s pour la boucle maison (x24) »

    Extrait vérifié : les valeurs 0.6482 -> 0.6053 sont les première/dernière loss des logs trl (cellule 25, bras C) ; la perte réellement imprimée du bras B est 0.6336 -> 0.6057 (cellule 21). L'apprenant qui veut re-croiser « la même histoire » sur le bras B relit la cellule 21 et ne retrouve pas ces nombres — la phrase attribue au bras B la trajectoire de perte du bras C. (Par ailleurs 151.0/6.2 = 24.4, le « x24 » est correct ; c'est la seule attribution qui est fausse.)

    Pourquoi l'apprenant perd : l'exercice de re-croisement lecture↔sortie — le geste même que la série entraîne (« À lire sur la sortie ci-dessus ») — échoue sur cette cellule : les nombres cités n'existent pas dans la sortie référencée.

    RAS par ailleurs

    • Les 5 paires empilées signalées par l'organe sont couvertes : [5,6] « Lecture chiffree » + « Lecture. » = gabarit standard de la série (chiffrée puis conceptuelle), [28,29] et [33,34] idem, [14,15] idem — aucune réécriture nécessaire.
    • Claims chiffrés vérifiés conformes aux outputs : marge ×3.2 (0.1155→0.3746 ✓), Spearman 0.978/0.889/0.886/0.805 ✓, écart 0.001 vs ±0.008 ✓, ~0.02 A ✓, 2σ ✓, 7.3s vs 159.3s (×21.8) ✓, LOC 46/61/33 ✓ (re-compté AST).
    • Exercices 1-3 : chacun s'appuie sur les fonctions définies (run_beta/logps_matrix_ln/train_rpo), énoncés complets, sans fuite de solution.
    • Liens internes rlpt_0/rlpt_0b/rlpt_4 valides (ls-tree).
  12. clusterManager-Myia commented on Sep 25, 2026

    @clusterManager-Myia
    CollaboratorAuthor

    Audit rlpt_0f_comparaison_GRPO_TRL_et_PPO_maison.ipynb

    Organes (passe réelle, checkout coursia-organs @ HEAD) : check_split_reading_cells : 2 paires couvertes (generic_pair [16,17] jaccard 0.099 ; separated_by_code [25,27]) ; check_interp_positioning 0 ; check_output_failure_text 0 ; check_cell_source_parses 0/1 ; check_duplicate_sections 0 carrier ; restore_accents_canonical --check 28 cures / 8 cellules touchées, 15 formes hors table. Vue structurelle nb_view : 4 paires de lectures empilées [[2,3],[6,7],[16,17],[30,31]] — critère 1 #17040 (placement) vérifié à la main ci-dessous.

    Findings (2) :

    1. stale-claim — cellules [7] (+ renvoi [6]). Extrait : « une politique uniforme sur les lettres marque ~0,44 en moyenne (le bonus positionnel tombe rarement), et la meilleure réponse possible vaut 3,2 (<pA>) / 2,4 (<pB>). Un policy à 0,8-0,9 a donc déjà appris beaucoup — sans pour autant épuiser le monde. ». La sortie de la cellule [5] (mêmes repères, committee même cellule) mesure bruit de fond (politique uniforme sur le contenu) : 0.487 : la prose ~0,44 contredit la mesure affichée une cellule plus haut ; le plafond 3,2/2,4 est conforme à la sortie. Ce que l'apprenant perd : la lecture chiffree [6] corrige en douceur (« l'ordre de grandeur tient ») mais le chiffre de [7] reste celui d'une exécution antérieure — deux bornes du même repère divergent visiblement à l'écran.

      Note : la lecture chiffree [6] signale déjà cet écart (« Ecart preexistant a signaler (hors scope md-only) ») — le finding est donc déposé pour traçabilité série, la divergence est documentée dans le notebook lui-même.

    2. stale-claim — cellule [27]. Extrait : « seed 7: maison 0.227->0.897 (62s) | trl 0.227->0.491 (43s) (GRPO rate son alignement : 0.491, a quatre centiemes du bruit de fond 0.487) ». 0.491 − 0.487 = 0.004 : quatre millièmes, pas quatre centièmes (facteur 10). Ce que l'apprenant perd : l'ampleur réelle de l'échec GRPO du seed 7 est rapprochée du hasard par un facteur 10 — un point qui gêne la lecture honnête que la cellule prétend livrer, alors que le rythme des « lectures chiffrees » de la série repose sur la précision numérique de ses renvois.

    RAS (vérifié, non déposé) : valeurs citées [22] toutes présentes dans le premier dict de [21] (rewards/reward_rm/mean −1.828, std 2.583, frac_reward_zero_std 0, entropy 2.369, kl 0.008674, clipped_ratio 0.4375, mean_length 6.773, step_time 0.395) ; 5 505 paramètres value net ✓ ; « x11 puis x1.9 » sur la KL [16] ✓ (0.042→0.462→0.863) ; « 1.67 fois le bruit de fond » [16] ✓ (0.815/0.487 = 1.673) ; « 2.6 fois plus reproductible » [30] ✓ (0.183/0.070 = 2.61) ; « 31 % plus rapide » [30] ✓ (1−42/61) ; LOC 61/36 mesurées vs claim 60/36 (bruit de comptage d'une ligne) ; budget apparié 2 304 = 2 304 ✓ ; exercices conformes C.1 (stubs resultats_* = None + étapes numérotées, exo 3 relie explicitement à rlpt_2/rlpt_3) ; pas de panneau de navigation (finding navigation-misplaced non applicable) ; prérequis [0] cohérents avec l'arc rlpt_0 → rlpt_0e → rlpt_0f.

    Verdict série : un des notebooks les plus propres de la partition Hermes à ce jour — lecture apprenante dense et vérifiable, nomenclature GRPO/PPO exacte, arc rlpt_0f ferme proprement la boucle SOTA en ligne. Les 2 findings sont des erreurs factuelles de dernière ligne (chiffre périmé, facteur 10), pas des défauts structurels.

  13. jsboige commented on Sep 26, 2026

    @jsboige
    Owner

    Grain: MED/notebook-python — lane myia-po-2025:CoursIA — prev: MED/guard #17831
    [CLAIMED] lane myia-po-2025:CoursIA -- paths: MyIA.AI.Notebooks/RL/rlpt_0f_comparaison_GRPO_TRL_et_PPO_maison.ipynb -- corriger deux écarts numériques vérifiés dans les cellules markdown, sans retoucher code ni outputs.

  14. 42 remaining items

  15. jsboige commented on Sep 28, 2026

    @jsboige
    Owner

    [CLAIMED] lane myia-po-2024:CoursIA -- audit Hermes rlpt_0d + rlpt_1 (campagne #17073/#17251), organes + lecture apprenant, findings en commentaire d'issue -- paths: MyIA.AI.Notebooks/RL/rlpt_0d_reward_trainer_sota.ipynb, MyIA.AI.Notebooks/RL/rlpt_1_ppo_lm_rlhf.ipynb

    (check_lane_claim #9774 -- server-stamped UTC; body timestamps are NOT authoritative. Release with [RELEASED] when your PR lands.)

  16. jsboige commented on Sep 28, 2026

    @jsboige
    Owner

    Audit rlpt_1_ppo_lm_rlhf.ipynb

    Organes (passe réelle, main @ HEAD 5b8d1ff57ac) : check_split_reading_cells : clean ; check_interp_positioning 0 ; check_output_failure_text 0 changed / 0 regressed ; check_cell_source_parses 0/14 cellules code ; check_duplicate_sections 0 ; restore_accents_canonical --check 21 cures / 4 cellules touchées, 15 formes hors table (reponse ×2, rapporte ×2, serie ×2, moyenne ×2, et 8 autres ×1) — dérive ASCII plate partielle, matière sweep, hors finding. Vue structurelle : 34 cellules (20 md + 14 code), ec 1→14 séquentiels, 0 null, 0 erreur ; cellules sans sortie = [2]/[6]/[15] (imports et définitions pures) et [28]/[30] (stubs d'exercices définition-pure, cf. RAS) — vérifié à la main ci-dessous.

    Findings (0).

    RAS (vérifié, non déposé) : chaque valeur citée est confrontée et re-dérivée — table de vérité du RM [3] : les 4 verdicts (tout-a→1, tout-b→0, un e pos 5→1, tout-b→0) ✓ lus en [4] avec l'extraction juste des deux règles positionnelles (pos 1 = a pour pA, pos 5 = e pour pB — que la mesure finale [21] confirmera : P('a'|A,pos1)=1.00, P('e'|B,pos5)=1.00) ; hasard pur [7] : r = 0,1,0,0,1,0,0,1 = 3/8 ✓ lu en [8] avec la baseline uniforme ~0.125 ✓ et la lecture honnête « petit échantillon, pas une compétence » ; SFT [12] : reward 0.078 « attendu ~0 » ✓, P('b'|pos1)=0.72 ✓, échantillon A sans aucun token récompensé ✓ vérifié token à token (b,b,c,b,c,f,b,d — ni a ni e), les « 28 % d'entropie » = 1−0.72 ✓ cohérents ; multi-seed [17]/[18] re-dérivé : reward 1.000 ×4 ✓, KL 0.387/0.440/0.482/0.513 ✓, spread 0.513−0.387 = 0.126 ✓, rapport 0.513/0.387 = 1.33 ✓ (« jusqu'à un tiers de KL en plus ») — la lecture « un résultat, quatre prix » est exactement ce que la sortie montre ; courbes [19]/[20] : ~0.1 → ~1.0 en ~20 itérations, KL → ~0.5 ✓ cohérent avec les finales ; mesure finale [21]/[22] : reward 1.00, P(b|A,pos1) 0.00 vs référence 0.72, P(b|A,pos3) 0.36 « position non réécrite » ✓, échantillons froids vérifiés position par position (A : a en pos 1 ✓ ; B : e en pos 5 de « a f h h e c h a » ✓) — la leçon « la dérive n'est pas parfaitement locale, les paramètres sont partagés » est la bonne ; effet β [24]/[25] : KL 0.67 → 0.41 → 0.28 pour β 0.05/0.5/2.0, reward 1.00 ×3 ✓, lecture « la KL est le prix payé, pas un mur » ✓ ; exercices 1-3 conformes C.1 : [28]/[30] sont des stubs définition-pure result = None # TODO etudiant (pattern C.1 canonique, grep raise NotImplementedError|assert False|1/0 : 0 hit) et [32] imprime « Exercice a completer » — les deux premiers n'impriment rien (fonctions à compléter, aucune sortie n'est due), noté comme différence de convention, pas un défaut ; contrats KL per-token / objectif clippé / compromis β alignés sur les sections 4/6 ; 0 mojibake ; ec 1→14 séquentiels, 0 erreur, outputs partout où une sortie est due.

    Verdict série : le carnet d'ancrage mécanique de la famille RLPT — le RLHF déroulé sur un monde où le reward est un oracle programmatique lisible à l'œil nu (deux tests conditionnels), ce qui rend chaque étape vérifiable : le hasard mesuré (3/8) avant, le 1.00 systématique après, et le prix caché (KL ×1.33 selon la seed) nommé comme l'information réelle de la sortie. Zéro finding.

  17. jsboige commented on Sep 28, 2026

    @jsboige
    Owner

    Audit rlpt_0d_reward_trainer_sota.ipynb

    Organes (passe réelle, main @ HEAD 5b8d1ff57ac) : check_split_reading_cells : clean ; check_interp_positioning 0 ; check_output_failure_text 0 changed / 0 regressed ; check_cell_source_parses 0/15 cellules code ; check_duplicate_sections 0 ; restore_accents_canonical --check 0 cures — prose correctement accentuée (4 formes hors table isole ×2, laisse ×2 : aucun accent requis). Vue structurelle : 34 cellules (19 md + 15 code), ec 1→15 séquentiels, 0 null, 0 erreur, aucune cellule code sans sortie — vérifié à la main ci-dessous.

    Findings (1, mineur) :

    1. stale-claim — cellule [24] (Lecture du round-trip) : la prose cite une exécution antérieure. « L'écart observé sur les logits (~6e-4) » — la sortie commitée [23] imprime « ecart max sur les logits : 5.68e-03 », un ordre de grandeur au-dessus. Et « le premier logit du modèle entraîné tombe exactement sur la grille bfloat16 autour de 0.1 » — le premier logit commité est −1.859375, pas autour de 0.1. Le mécanisme démontré est juste et même élégant (l'arrondi bfloat16 du logit rechargé reproduit EXACTEMENT le logit entraîné : True, imprimé dans la sortie) — mais les deux nombres qui l'habillent appartiennent à un run antérieur. Correction : re-citer 5.68e-03 et −1.859375 (md-only).

    RAS (vérifié, non déposé) : tout le reste est confronté et re-dérivé — environnement [2] : torch 2.13.0+cpu / trl 1.10.0 / transformers 5.12.1 / datasets 5.0.0 ✓ cités en tête ; contrat collator [6] : 2 chosen puis 2 rejected, le chunk(2) de compute_loss retrouve l'appariement ✓ ; « 960 pas » de [12] re-dérivé : 4000 paires / batch 256 ≈ 16 pas × 60 époques ✓ ; multi-seed [17] intégralement re-dérivé par cette lane : trl accs [0.682, 0.678, 0.665, 0.677] → moyenne 0.6755 ≈ 0.676 ✓, std ddof=1 = 0.0073 ≈ 0.007 ✓, Brier 0.2147 ✓, rho 0.868 ✓ ; référence A.1 (0.658 ± 0.008 / 0.2208 / 0.793) = exactement les moyennes de rlpt_0 [27] ✓ citation cross-carnet fidèle ; écart +0.018 ✓ et « 2.2 écarts-types A.1 » = 0.0178/0.008 ✓ tel qu'étiqueté dans la sortie (dénominateur = σ de A.1) — et la conclusion « significatif » est robuste par cette lane au-delà du chiffre cité : les seeds étant partagés, la comparaison appariée donne +0.016 ± 0.005 avec 4/4 diffs positifs (t ≈ 6), l'écart en faveur de trl survit à tout choix de dénominateur ; temps 31.6 s vs 3.0 s (~10×) ✓ (31.6/3.0 = 10.5) avec la lecture honnête « borne haute sur ce problème minuscule » ; lignes de code [21] : 23 vs 13, rapport 1.8× ✓ (23/13 = 1.77), 27 lignes déplacées dans compute_loss → « total réel 23 vs 40 » ✓ (13+27) ; verdict [25] : toutes les cellules du tableau ancrées (0.676/0.2147/0.868, 23/13/27, 3.0/31.6) ✓ ; exercices 1-3 conformes C.1 (Exercice a completer imprimé ×3, grep raise NotImplementedError|assert False|1/0 : 0 hit), contrats center_rewards_coefficient / ordre des lots / dividende écosystème alignés sur les sections ; 0 mojibake ; ec 1→15 séquentiels, 0 erreur, outputs partout.

    Verdict série : le protocole comparatif maison-vs-SOTA le plus propre possible sur un jouet : même monde, même juge, même budget, quatre seeds, et la question des lignes de code retournée deux fois (1.8× moins à écrire, mais 27 lignes de logique BT déplacées hors du regard — « total réel 23 vs 40 »). Le finding unique est une séquelle de ré-exécution sur la cellule la plus fine du carnet (la démonstration bf16-vs-fp32, dont les deux nombres d'habillage sont périmés alors que le mécanisme imprimé est juste).

  18. jsboige commented on Sep 28, 2026

    @jsboige
    Owner

    [RELEASED] lane myia-po-2024:CoursIA -- audits rlpt_0d + rlpt_1 livres (5879292557, 5879293034), checklist cochee 32/35 -- paths: MyIA.AI.Notebooks/RL/rlpt_0d_reward_trainer_sota.ipynb, MyIA.AI.Notebooks/RL/rlpt_1_ppo_lm_rlhf.ipynb

  19. jsboige commented on Sep 28, 2026

    @jsboige
    Owner

    [CLAIMED] lane myia-po-2024:CoursIA -- audit Hermes rlpt_2 + rlpt_3 + rlpt_4 (campagne #17073/#17251) — derniere tranche, organes + lecture apprenant, findings en commentaire d'issue -- paths: MyIA.AI.Notebooks/RL/rlpt_2_grpo_minimal.ipynb, MyIA.AI.Notebooks/RL/rlpt_3_reward_hacking.ipynb, MyIA.AI.Notebooks/RL/rlpt_4_dpo_vs_ppo.ipynb

    (check_lane_claim #9774 -- server-stamped UTC; body timestamps are NOT authoritative. Release with [RELEASED] when your PR lands.)

  20. jsboige commented on Sep 28, 2026

    @jsboige
    Owner

    Audit rlpt_2_grpo_minimal.ipynb

    Organes (passe réelle, main @ HEAD 5b8d1ff57ac) : check_split_reading_cells : 1 paire generic_pair cellules [14, 15] (J=0.13) et 1 paire separated_by_code cellules [12, 14] (J=0.038) — deux false positives après lecture : [12] lit les colonnes des logs d'entraînement (frac_reward_zero_std…), [14] lit la série de reward post-RL chiffre par chiffre, [15] lit le deux-étages greedy-vs-sampling — trois ancrages distincts (logs / série / mécanique), aucune paraphrase partagée ; check_interp_positioning 0 ; check_output_failure_text 0 changed / 0 regressed ; check_cell_source_parses 0/11 cellules code ; check_duplicate_sections 0 ; restore_accents_canonical --check 9 cures / 4 cellules, 9 formes hors table — dérive ASCII plate, matière sweep. Vue structurelle : 28 cellules (17 md + 11 code), ec 1→11 séquentiels, 0 null, 0 erreur, aucune cellule code sans sortie — vérifié à la main ci-dessous.

    Findings (0).

    RAS (vérifié, non déposé) : chaque valeur citée est confrontée et re-dérivée — socle [2] torch 2.6.0+cu124 / RTX 3070 8.59 Go ✓ lu en [3] ; LoRA [6] 540,672 trainable (0.0718 %) ✓ lu en [7] (et cohérent avec le rapport 71× cité par rl_6e) ; baseline [8] greedy 0.88 / sampling 0.50 ✓ — c'est le 0.50 que [15] cite comme départ sampling ; la série frac_reward_zero_std citée en [12] (0.2, 0.4, 0, 0.2, 0.2, 0.6, 0.2, 0.2) est re-extraite par cette lane des 8 logs commités de [11] : identique au chiffre près, et la série de reward (0.45 → 0.7) aussi ✓ ; courbe [13] recopiée exactement en [14] (creux double 0.300/0.300 aux steps 20-25 ✓, montée 0.300 → 0.700 = 2,3× ✓) ; lecture deux-étages [15] : greedy 0.88 avant/après inchangé ✓ (« GRPO n'a rien créé »), sampling 0.50 → 0.700 ✓ ; multi-seed [18]/[19] re-dérivé : accuracy greedy 0.88 ± 0.00, min/max 0.88 ✓ (« exactement la baseline, le pic déterministe était déjà acquis »), reward échantillonné final de 0.479 à 0.604 selon le tirage ✓ (endpoints dans la sortie), contre 0.50 en baseline ✓, et l'explication du 0.700 du run principal (plus d'itérations, pas un seed chanceux) est la bonne ; exercices 1-3 conformes C.1 (Exercice a completer (voir enonce) imprimé ×3, grep raise NotImplementedError|assert False|1/0 : 0 hit), contrats addition 3 termes / reward partiel de format / taille du groupe ; les 2 liens sortants résolus (PT_11a, PT_11b) ; 0 mojibake ; ec 1→11 séquentiels, 0 erreur, outputs partout.

    Verdict série : le GRPO réel (Qwen 0.8B QLoRA, 8 Go) avec ses deux leçons les plus rares dans la littérature de notebook : le « group no-signal » mesuré en fraction par step (jusqu'à 60 % des groupes sans variance), et le verdict « GRPO n'a rien créé » sur une tâche quasi saturée en greedy — l'effet réel est la concentration de la distribution échantillonnée, pas l'exactitude déterministe. Zéro finding.

  21. jsboige commented on Sep 28, 2026

    @jsboige
    Owner

    Audit rlpt_3_reward_hacking.ipynb

    Organes (passe réelle, main @ HEAD 5b8d1ff57ac) : check_split_reading_cells : clean ; check_interp_positioning 0 ; check_output_failure_text 0 changed / 0 regressed ; check_cell_source_parses 0/12 cellules code ; check_duplicate_sections 0 ; restore_accents_canonical --check 13 cures / 3 cellules, 52 formes hors table (recopie ×22, montre ×5, installe ×4, et 15 autres) — dérive ASCII plate, matière sweep. Vue structurelle : 31 cellules (19 md + 12 code), ec 1→12 séquentiels, 0 null, 0 erreur ; cellules sans sortie = [26]/[27] (stubs exercices 1-2 : commentaires + fonction TODO, cf. RAS) — vérifié à la main ci-dessous.

    Findings (3) :

    1. stale-claim — cellule [21] (Lecture du run B) : « l'exactitude lissée chute de 0.500 à 0.344 pendant que le proxy frémit ». La sortie commitée [20] imprime « exacte lisse : 0.250 -> 0.188 ». Ni le départ (0.500 vs 0.250) ni l'arrivée (0.344 vs 0.188) ne correspondent — la direction (chute) et l'enseignement (détectable par divergence même sous le seuil) tiennent, mais les deux bornes appartiennent à un run antérieur. Correction : re-citer 0.250 → 0.188.

    2. stale-claim — cellule [24] (Lecture du run C) : « la courbe exact monte de 0.350 à 0.750 (avec un creux au step 20) ». La sortie commitée [23] imprime 5:0.500 10:0.500 15:0.350 20:0.400 25:0.500 30:0.350 35:0.500 40:0.650 : le maximum est 0.650 au step 40 (pas 0.750), et les creux à 0.350 sont aux steps 15 et 30 (le step 20 vaut 0.400). La suite de la lecture (politique finale 0.88 greedy propre, recopie 0.00, « au niveau de la base intacte ») est fidèle — seules les bornes de la courbe sont périmées.

    3. wording — cellule [6] (Lecture de la baseline) : à propos du prompt contaminé, « la recopie reste marginale (0.00 greedy, 0.00 sampling) ». La sortie commitée [5] donne BASE contamine sampling : recopie 0.06 (seule valeur non nulle de recopie de toute la baseline). La conclusion « marginale » tient (6 %), mais le chiffre cité est faux — d'autant que [21] cite correctement ce même 0.06 plus loin (« la recopie post-run ne survit que sous prompt contaminé (0.06) »).

    RAS (vérifié, non déposé) : le reste est confronté et re-dérivée — baseline [5] lue fidèlement par ailleurs (0.66/0.41 propre, 0.28/0.12 contaminé ✓, « perturber n'est pas imiter une règle ») ; run A [8] : proxy 0.000, frac_reward_zero_std 1.0, grad_norm 0.00 sur 20 steps ✓ lu en [9] avec la déduction juste (avantage nul → poids inchangés → politique identique à l'initialisation) et l'explication instrumentale du 0.84 POST-A (wrapping LoRA à B nuls, pas la politique) ✓ ; la démo eval() [14] est le joyau instrumental du carnet : même modèle, même greedy, 0.00 en mode train vs 0.75 en mode eval (écart +0.75 imprimé) — et le carnet en fait une règle (eval() AVANT toute mesure, commentée en tête de [4], reprise par rlpt_4) ✓ ; inspection [17] : 6 questions, 1 recopie / 3 surfaces / 2 correctes ✓ lues en [18] (« surface, pas règle ») ; run B [20] : proxy lissé 0.000 → 0.031 ✓, oscillation citée (0.050 → 0.000 → 0.100 → 0.000 → 0.050) = sous-suite exacte de la courbe commitée ✓, POST-B contamine greedy 0.19 ✓ ; run C [23] : adaptateur 540,672 rechargé ✓, POST-C propre greedy 0.88 / recopie 0.00, sampling 0.38 ✓ ; les deux causes du « cas facile » (hack pas pris + reward exact dense ~50 % sampling → variance de groupe → gradient) sont dans les sorties ✓ ; frontière specification gaming / reward tampering [29] et conclusion [30] sans chiffre orphelin ; exercices 1-3 conformes C.1 ([26] énoncé en commentaires purs, [27] fonction TODO sans erreur, [28] imprime « Exercice a completer », grep raise NotImplementedError|assert False|1/0 : 0 hit) ; 0 mojibake ; ec 1→12 séquentiels, 0 erreur, outputs partout où une sortie est due.

    Verdict série : l'anatomie de hack la plus instructive de la campagne — trois voies de déclenchement testées (exploration pure : morte ; inoculation few-shot : surface sans règle ; amorce récompensée : frémissement 0.031 qui coûte immédiatement de l'exactitude), une désintoxication qui répare (0.88), et l'artefact eval()-vs-train démontré à hauteur de +0.75 sur 8 prompts. Les trois findings sont la même maladie que rlpt_12/rlpt_0d : des bornes de courbe d'un run antérieur non suivies à la ré-exécution — ici sur les deux runs centraux (B et C).

  22. jsboige commented on Sep 28, 2026

    @jsboige
    Owner

    Audit rlpt_4_dpo_vs_ppo.ipynb

    Organes (passe réelle, main @ HEAD 5b8d1ff57ac) : check_split_reading_cells : clean ; check_interp_positioning 0 ; check_output_failure_text 0 changed / 0 regressed ; check_cell_source_parses 0/12 cellules code ; check_duplicate_sections 0 ; restore_accents_canonical --check 2 cures / 2 cellules, 20 formes hors table (monte ×5, exige ×5, optimise ×3, et 7 autres) — dérive ASCII plate quasi nulle. Vue structurelle : 30 cellules (18 md + 12 code), ec 1→12 séquentiels, 0 null, 0 erreur, aucune cellule code sans sortie — vérifié à la main ci-dessous.

    Findings (0).

    RAS (vérifié, non déposé) : chaque valeur citée est confrontée et re-dérivée — baseline [4] 0.688 greedy / 0.438 sampling ✓ lue en [5] avec l'écart 0.25 ✓ et l'annonce du gain commun +0.124 (0.812−0.688 ✓) ; auto-étiquetage [7] : 31 paires / 48 prompts (65 %) ✓ lu en [8] (31/48 = 0.646 ✓, « les deux tiers »), exemple chosen/rejected ('34' vs '24') ✓ ; run DPO [9] lu exactement en [10] : marge −0.000 → 0.016 ✓ (step 40 commité : 0.016), accuracies 0.35 → 0.90 ✓, POST-DPO greedy 0.812 (+0.124 ✓) et sampling 0.521 (+0.083 ✓) — la leçon « petit déplacement bien orienté suffit à changer des argmax » est la bonne ; run GRPO [12] lu en [13] : courbe 0.450 → 0.700 avec creux 0.250 au step 20 ✓, POST-GRPO 0.812 / 0.500 ✓, « le même gain de +0.124 » ✓ ; multi-seed [16]/[17] intégralement re-dérivé par cette lane : DPO greedy 0.812 ×4 ✓, GRPO 0.812/0.792/0.792/0.812 → « atteint sur deux, 0.792 sur les deux autres » ✓, moyennes DPO 0.812 vs GRPO 0.802 ✓, sampling 0.484 (0.521+0.396+0.562+0.458)/4 ✓ vs 0.469 (0.500+0.396+0.500+0.479)/4 ✓, écart 0.010 = un demi-prompt ✓ (1/48 = 0.0208), plage sampling 0.396 → 0.562 ✓, quantification 39/48 = 0.8125 ✓ ; DM [20]/[21] : stat −1.013, p 0.3122, mean_loss_diff −0.0104, biais DPO 0.1875 vs GRPO 0.1979, VERDICT INCONCLUSIVE ✓ — tout recopié exactement, et la lecture assume les deux niveaux (avantage systématique par seed, MAIS indistinguable statistiquement sur 192 mesures poolées = 4×48 ✓, un demi-prompt = 0.0104×48 ✓) : c'est l'application exemplaire du protocole G.2 (jamais « promising », le verdict honnête à trois états) ; l'argument du coût caché [24] (budget d'entraînement égal ≠ budget total : les rollouts d'auto-étiquetage 64 s sont payés par DPO) est ancré dans [7] ✓ ; exercices 1-3 conformes C.1 (Exercice a completer imprimé ×3, grep raise NotImplementedError|assert False|1/0 : 0 hit), contrats effet β / ORPO / biais du dataset de préférences ; 0 mojibake ; ec 1→12 séquentiels, 0 erreur, outputs partout.

    Verdict série : la conclusion de la famille RLPT vue par cette lane — le duel offline/online monté à égalité de budget et de tâche, résolu par Diebold-Mariano, et le verdict INCONCLUSIVE assumé comme réponse (« statistiquement indistinguables à ce budget ») plutôt que vécu comme échec de mesure. Chaque nombre des lectures est recopié ou re-dérivable (moyennes multi-seed, demi-prompt, 192 poolées), et le gain commun +0.124 des deux bras est annoncé d'avance puis vérifié deux fois. Zéro finding.

  23. jsboige commented on Sep 28, 2026

    @jsboige
    Owner

    [RELEASED] lane myia-po-2024:CoursIA -- audits rlpt_2 (c.5879365908, 0 finding) + rlpt_3 (c.5879366944, 3 findings) + rlpt_4 (c.5879367986, 0 finding) livres, checklist cochee 35/35 — campagne RL completee pour cette lane -- paths: MyIA.AI.Notebooks/RL/rlpt_2_grpo_minimal.ipynb, MyIA.AI.Notebooks/RL/rlpt_3_reward_hacking.ipynb, MyIA.AI.Notebooks/RL/rlpt_4_dpo_vs_ppo.ipynb

  24. clusterManager-Myia commented on Sep 30, 2026

    @clusterManager-Myia
    CollaboratorAuthor

    Audit rl_4_multi_armed_bandits.ipynb — complément (cycle 2026-09-30)

    Passe d'organes + lecture apprenant refaites sur HEAD (5a75ef943). L'audit du 28/09 (c.5878319461) reste la référence série ; ce cycle apporte 1 finding complémentaire que cette passe a détecté et que l'audit précédent n'avait pas posé.

    Organes (passe réelle, checkout coursia-organs @ HEAD) : check_split_reading_cells : 1 signal — paire [14,16] couverte (légitime lecture-du-code / lecture-chiffrée, contenus distincts) ; check_interp_positioning 0 ; check_output_failure_text 0 ; check_cell_source_parses 0/21 ; check_duplicate_sections 0 carrier ; restore_accents_canonical --check 36 cures / 19 formes hors table (matière sweep, pas un finding). Sections dupliquées : voir #17066.

    Finding (1) — complément à c.5878319461 :

    1. paraphrase-stack — cellules [51] (id 3856281c) et [52] (id 0226c2d4). Extrait [52] : « La heatmap montre clairement comment chaque stratégie converge (ou pas) vers le meilleur bras (bras 3, probabilité 0.8) : - Greedy : se fixe rapidement mais peut se tromper si l'initialisation est defavorable - e-greedy : converge vers le meilleur bras tout en continuant a explorer ». La cellule [51] (lecture de figure post-densification) décode déjà la même figure avec la même triple lecture : « Greedy se fige vite sur une seule ligne (le bras verrouille), e-greedy garde une bande d'exploration faible mais permanente, UCB commence large puis se concentre ». Deux cellules de prose consécutives après l'output de [50] — empilement détecté par le critère 1 Redressement campagne densité #13410 : remplissages dégénérés — 233 notebooks, 20 paquets d'audit #17040 (LECTURES EMPI LÉES [[51, 52]]). Ce que l'apprenant perd : la cellule dense [51] (échelle, 4 axes, horizons 1000/2000/500) est immédiatement résumée par une cellule qui n'ajoute aucune information — l'empilement dilue la lecture canonique au lieu de la consolider. Correction naturelle : fusionner le triplet stratégies de [52] dans [51] (ou supprimer [52], ses trois puces étant déjà couvertes mot pour mot).

    Vérifications re-confirmées ce cycle : toutes les valeurs citées dans les lectures confrontées aux outputs ([43] vs tableau [42] ligne à ligne, sweep [45] 546.9/1172.5 cités en anticipation [32] puis lus [46], arithmétique 800−489=311 [16]) ; le finding warmup-count (100 vs 50 tirages) déposé le 28/09 reste valable et non corrigé à HEAD.

    Réconciliation ledger ↔ dépôt : les audits RL publiés ici le 28/09 (c.5878059330 → c.5879367986, 25 notebooks) n'étaient pas reportés dans le ledger de progression notebook_audit/ledger.json — backfill effectué ce cycle (25 entrées → audité, dates = publication des commentaires). Il reste 1 seul notebook RL non-audité : rl_19_reward_tampering.ipynb (prochaine cible série RL).

  25. jsboige commented on Oct 2, 2026

    @jsboige
    Owner

    [CLAIMED-AMEND] lane myia-po-2025:CoursIA -- paths: MyIA.AI.Notebooks/RL/rl_4_multi_armed_bandits.ipynb

    Grain: MED/notebook-python — lane myia-po-2025:CoursIA — prev: MED/guard #12856

    Amend du claim d'audit existant : cette lane prend maintenant le FIX des 2 findings Hermes ouverts sur rl_4 (warmup-count 100→50 cellules [44]/[46] + paraphrase-stack [51]/[52]). WIP non committé de l'arbre partagé sur ce fichier = batch d'enrichissement d'une session morte du 29/09 (identification coursia-b5 17:4xZ) — non lié, non préservé, non touché ; travail depuis worktree frais sur origin/main.

  26. jsboige commented on Oct 2, 2026

    @jsboige
    Owner

    [DELIVERED] lane myia-po-2025:CoursIA — les 2 findings ouverts sur rl_4_multi_armed_bandits.ipynb sont corrigés par PR #18861 (commit 7aaf695, branche fix/17251-rl4-findings) :

    • warmup-count (audit 28/09) : 100 → 50 tirages (5 bras × 10) en [44]/[46] (périmètre audit) + 2 occurrences supplémentaires trouvées par grep d'exhaustivité que l'audit ne citait pas : commentaire de tête de [45] et chaîne imprimée de [45] (visible dans la sortie commitée). Phrase d'auto-signalement de [19] retirée (réconciliation faite).
    • paraphrase-stack (complément 30/09) : cellule [52] supprimée, son apport propre (bras 3 p=0.8, nuance init défavorable Greedy) fusionné dans [51], renvoi avance retiré.

    Re-exécution papermill python3 end-to-end (cellule code touchée → C.2) : 53/53, ec 1→21, 0 erreur, toutes les valeurs ancrées reproduites à l'identique (déterministe) — la prose reste scellée sur ses sorties.

    WIP arbre partagé sur ce fichier : batch d'enrichissement session morte 29/09 (coursia-b5) — non lié, non touché.

    Résiduel de l'issue : audit rl_19 (dernier notebook RL non audité) + reste de la partition série.

  27. added a commit that references this issue on Oct 2, 2026
  28. added a commit that references this issue on Oct 3, 2026
  29. jsboige commented on Oct 7, 2026

    @jsboige
    Owner

    [CLOSURE PREFLIGHT]
    schema: 1
    lane: myia-po-2024:CoursIA-2
    issue: 17251
    verdict: CLOSE
    acceptance:

    Refs PR #18861 (commits 7aaf695, 667db21), claim-AMEND po-2025 du 2026-10-02T16:48:49Z. Les 2 findings Hermes rl_4 du claim-AMEND po-2025 sont fixés.

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

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions