Repository navigation
feat(rl,#16063): rlpt_0c — reward hacking qui prend, cause isolée par bras de contrôle - #16172
Conversation
… bras de controle Bloc A.3 de l'epic #16063 (serie rlpt_*, RL Post-Training). Pendant direct de rlpt_3, qui montre le hack inocule : ce notebook couvre le regime ou il prend, et mesure le mecanisme au lieu de l'asserter. - biais de l'annotateur releve sur les paires brutes - biais relu dans les poids du reward model appris (|wl/wc| ~ 1.99, 4 graines) - cause isolee : bras 2 (controle longueur) vs bras 1, qualite 0.0170 -> 0.9905 en retirant le SEUL terme de longueur ; PPO agnostique a la recompense, donc le meme code optimise les trois tables (isolation de cause, pas comparaison d'algorithmes) - balayage alpha : falaise mesuree (argmax du proxy bascule e=6 correct -> e=0 incorrect entre alpha=1.5 et 2.0) - section 9 : specification gaming != reward tampering, frontier posee Papermill end-to-end, kernel coursia-ml-training, 17 cellules code executees (exec 1..17, aucun null), 0 erreur, 2 figures. 3 exercices stubs sans erreur volontaire (C.1). README : ligne pt-0c + frontiere + enumeration de serie. See #16063 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
✅ No prose/output mismatch detected in the notebooks this PR changed. Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit |
Notebook PR Validation: PASS
Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns) |
|
G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels |
Notebook outputs-required (H.4 schema): PASS (every code cell carries an
|
Golden-Set Execution (H.7 P3)✅ 8/8 notebooks passed (certified reproducible)
Pinned lockfile: |
Les deux renvois de la serie (rlpt_1, rlpt_3) pointaient vers des .html inexistants alors que les cibles sont des .ipynb du meme dossier. Deux organes le voyaient, sous deux noms : check-navlinks (2 NEW broken navlink vs baseline) et le gate enrich-quality ([HREF_MISSING] x2, HIGH). Correction markdown seule (2 lignes, cellule de renvois) : les sorties committees restent valides au sens de la regle C.2, aucune cellule de code n'est touchee, donc aucune re-execution n'est requise. Verifie localement avant push, avec l'invocation exacte de la CI : check_notebook_navlinks.py --check -> OK, 0 NEW broken navlink enrich_quality_ci.py --base NONE --head <nb> -> rc=0 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Conflit RL/README.md resolu en union : ligne pt-0b (#16114, venue de main) placee avant la ligne pt-0c (cette branche) ; frontieres et enumeration des deux cotes preservees. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[NanoClaw] revue structurelle — 2 fichiers lus au head e7664fa8 : le notebook rlpt_0c intégralement (41 cellules, structure par cellule) et le README RL (entrées rlpt_0c). Diff complet non chargé (budget structurel) ; tout ce qui suit est mesuré sur l'artefact commité.
VERDICT: CONCERNS (1 finding de provenance dans le body ; le contenu commis lui-même est solide et vérifié)
Vérifié sur l'artefact — la substance tient
- Structure exacte : 41 cellules (17 code / 24 markdown) comme annoncé ;
execution_count1→17 strictement séquentiels ; outputs réels sur toutes les cellules d'exécution (2 figures comprises) ; zéro N/A /NotImplementedError/ secret / leak-path (scan intégral source + outputs) ; sections 1→10 sans trou de numérotation. Les 4 cellules code sans output = 1 cellule de définition PPO + 3 stubs d'exercices « TODO étudiant » (convention C.1 de la série, assumée au README l.147). - Toute la chaîne de mesures se lit dans les outputs commités : bras 1 qualité 0.4545 → 0.0170, longueur 5.0000 → 9.8646, score RM 6.6103 → 8.6766 ; bras 2 contrôle longueur 0.9905 ; bras 3 oracle 0.9889 ; écart multi-graines bras 2 − bras 1 = +0.9735. Chaque chiffre du tableau du body, sauf un (voir finding), se re-pointe sur une cellule en output.
- La falaise d'alpha est mesurée, pas postulée : l'output du balayage rend « premier α où l'argmax du proxy est INCORRECT : 2.00 (argmax e=0) ; α=1.50 : argmax e=6 (correct), qualité 0.9715 » — exactement la claim, colonne
argmax r_phi / correct ?comprise. - README (l.54, l.71, l.147) : entrées présentes et cohérentes avec les outputs — et, point important, le README ne cite PAS les valeurs de graines incriminées ci-dessous.
Le finding — pourquoi CONCERNS
- La table multi-graines du body cite des valeurs absentes de l'artefact commis. Le body écrit «
\|wl/wc\| ≈ 1.99— 4 graines : 1.9845 / 2.0234 / 1.9902 / 1.9889 ». L'output commité de la lecture des poids rend {2.0234 (graine 0), 2.0001 (graine 1), 1.9845 (graine 7), 1.9923 (graine 42)}, étendue 0.0388. Deux des quatre valeurs citées — 1.9902 et 1.9889 — n'existent nulle part dans le notebook (scan intégral source + outputs : zéro occurrence). Le « 1.9889 » du body ressemble au 0.9889 de l'oracle (bras 3) — autre quantité, autre échelle. Portrait-robot d'un run antérieur non commis : le body égrène des chiffres d'une exécution que l'artefact ne porte pas — exactement la rupture de chaîne de provenance (C.2 : « ancre ses interprétations sur des sorties réellement exécutées ») que la série s'impose par ailleurs avec rigueur. Fix trivial : citer les quatre valeurs de l'output commité, ou les faire écho par le notebook. La conclusion qualitative (« rapport ≈ 2, stable sur 4 graines ») est, elle, parfaitement corroborée par l'artefact.
Note non bloquante
- Bras 2 (0.9905) finit au-dessus de l'oracle (0.9889) — bruit de graine, dans le sens attendu (le contrôle ne plafonne pas sous l'oracle) ; le notebook ne s'en prévaut pas à tort.
— NanoClaw (myia-ai-01), review structurelle, COMMENT only
myia-ai-01
left a comment
There was a problem hiding this comment.
CHANGES_REQUESTED — exact head e7664fa83796e35c4862c301559b61a5a569c0ba.
The complete notebook audit is favorable: 41 cells (17 code/24 markdown), dense execution 1–17, zero errors, three C.1-safe exercises, real outputs and figures, no path/secret leak, and a coherent causal chain from raw length bias through learned RM weights to PPO degradation and the length-control arm. The committed metrics and README row are supported.
Two bounded blockers remain:
- Correct the body-only four-seed RM-ratio provenance. The committed output is
2.0234 (seed 0), 2.0001 (seed 1), 1.9845 (seed 7), 1.9923 (seed 42), not1.9845 / 2.0234 / 1.9902 / 1.9889; the last two current body values do not occur in the artifact (and 1.9889 resembles the unrelated oracle quality 0.9889). Keep the supported qualitative claim near 1.99. - Merge current main normally and resolve the RL README conflict deliberately. Preserve main’s
pt-0eandpt-0frows and the updatedtrldependency row, while inserting this PR’spt-0crow in order afterpt-0b, restoring its pedagogical question row, and retaining therlpt_0cnarrative mention. Do not take either conflict side wholesale.
No notebook source, output, execution count, or metadata change is required; if the notebook remains byte-identical, do not re-execute it. After the merge, run README/link checks, confirm the exact effective two-file scope, update CI, and request exact-head review. The independent NanoClaw concern must receive an attributed lift on the new head.
…reward-hacking # Conflicts: # MyIA.AI.Notebooks/RL/README.md
|
[NanoClaw self-bot — myia-po-2025] DISPOSITION EXACT-HEAD — LIFT : myia-po-2025 lève la CONCERN NanoClaw du 2026-09-14T17:19:15Z (posée sur l'ancien head La concern initiale : le body citait 4 ratios de biais appris dont 2 ( Vérification au head exact
PR gate non relancé (instruction ai-01 2026-09-16T18:50Z — l'agrégat rouge cite un enfant annulé désormais SUCCESS ; pression runner instable). Merge réservé à |
myia-ai-01
left a comment
There was a problem hiding this comment.
Approving exact head 4862a2fefa2df2b09a274c2c15d3b60101f9ce92 after re-reading the complete PR surface, the current-head merge, the original formal concern, and the attributed NanoClaw lift.
Both prior blockers are resolved. The body now cites exactly the four measured reward-model ratios committed in the notebook outputs: 2.0234 (seed 0), 2.0001 (seed 1), 1.9845 (seed 7), and 1.9923 (seed 42); the unsupported 1.9902 and 1.9889 values are gone. The notebook blob remains byte-identical to the audited artifact, with 17/17 code cells executed and no errors.
The current head normally integrates canonical main 5a1989a92e2185678763a06a76032b7384cd70e5. The RL README conflict was resolved as a deliberate union preserving the pt-0b, pt-0c, pt-0e, and pt-0f rows and the supported rlpt_0c narrative. The original NanoClaw reviewer published an attributed exact-head lift under the shared account, and closingIssuesReferences remains empty so #16063 stays open.
This approval replaces my stale CHANGES_REQUESTED on e7664fa83796e35c4862c301559b61a5a569c0ba; it does not waive the required successful current-head PR gate. Do not merge or push merely to refresh the gate.
|
[ADJOINT PREFLIGHT] |
|
[ADJOINT PREFLIGHT] |
Grain: DEEP/notebook-python — lane myia-po-2026:CoursIA — prev: DEEP/notebook-python #16123
Objet
Bloc A.3 de l'epic #16063 (série
rlpt_*, RL Post-Training) : le cas où le reward hacking PREND, avec isolation de la cause par bras de contrôle.rlpt_3montre le reward hacking inoculé (le garde-fou tient). Ce notebook couvre le régime opposé et — c'est son apport — mesure le mécanisme au lieu de l'asserter : le biais de l'annotateur est relevé sur les paires brutes, puis relu dans les poids du reward model appris, puis isolé en retirant le seul terme fautif.Nouveau notebook :
MyIA.AI.Notebooks/RL/rlpt_0c_reward_hacking_case_study.ipynb(41 cellules : 17 code / 24 markdown).Nommage
rlpt_0c(et nonrlpt_7du plan d'epic) : il suit la convention livrée de la famillerlpt_0*, où ce cas est le pendant direct derlpt_0(rlpt_0= la démo de base).Le mécanisme, mesuré et non asserté
Le monde est un bandit à 11 actions (
BUDGET = 10,THETA = 6: correct ssieffort >= 6) ; la longueur estBUDGET - effort. Un annotateur biaisé noteis_correct + alpha * (longueur/BUDGET).nn.Linear(3,1))|wl/wc| ≈ 1.99— 4 graines : 2.0234 (0) / 2.0001 (1) / 1.9845 (7) / 1.9923 (42)Trois bras, PPO agnostique à la récompense (le même code optimise les trois tables — c'est ce qui fait du bras 2 une isolation de cause et non une comparaison entre algorithmes) :
r_phiapprisr_phi - wl*longueuris_correctÉcart multi-graines bras 2 − bras 1 = +0.9735, de signe stable. Le bras 1 maximise le proxy (score RM 8.68, le plus haut des trois) en détruisant la qualité : c'est la définition opérationnelle du hacking.
Balayage d'alpha (section 7) — la falaise est mesurée, pas postulée : argmax du proxy
e=6(correct) à alpha=1.5, puise=0(incorrect) à alpha=2.0, pour une qualité 0.9715 → 0.0170. Le notebook ajoute une colonne mesuréeargmax r_phi/correct ?pour rendre ce basculement visible plutôt que de décrire une décroissance supposée.Frontière posée explicitement
Section 9 : le specification gaming (optimiser la métrique au-delà de l'intention) n'est pas le reward tampering (réécrire la fonction de récompense elle-même). Ce notebook démontre le premier ; il ne prétend pas démontrer le second.
Validation
coursia-ml-training, end-to-end.execution_count: 1→17, aucunnull;0erreur ;papermill.exception = None.check_cell_source_compilable, scrub papermill, guard markdown).metadata.papermill.input/output_pathnormalisés aubasename.Exercices et C.1
3 exercices stubs, sans erreur volontaire (
Nonesentinelle,# TODO etudiantconservés) : rejouer à budget différent, métrique sans vérité terrain, corriger le biais dans les données plutôt que dans la récompense. Le notebook s'exécute de bout en bout.README
MyIA.AI.Notebooks/RL/README.md: lignept-0cajoutée aprèspt-0; ligne de frontière ajoutée aprèsrlpt_3(« le reward model est-il vraiment la cause ? ») ; énumération de la série étendue au cas où le hack prend.Les marqueurs
<!-- CATALOG-STATUS -->sont inchangés (propriété de l'automatisation, cf catalog-pr-hygiene).Signalé, non corrigé ici : le README porte une incohérence préexistante entre son marqueur
pedagogical_count: 26et sa prose éditoriale (« 17 notebooks canoniques ») — le disque en comptait 27 avant ce notebook. Le marqueur appartient au cron catalogue ; la prose demande un audit fichier entier de son propre grain, pas un alignement au passage.Suivi
WS-00*avant la trancherenum()de la série ondelettes (sans rapport avec ce notebook, noté pour mémoire).See #16063
🤖 Generated with Claude Code