From 686bc6b28e5b2330fdcaef9449e42f5a07f026c4 Mon Sep 17 00:00:00 2001 From: jsboige Date: Wed, 16 Sep 2026 16:41:43 +0200 Subject: [PATCH 1/2] =?UTF-8?q?enrich(rl,#16417):=20notebook=20rl=5F16=20D?= =?UTF-8?q?ream-RSI=20=E2=80=94=20exploration=20programmable,=20replay-sim?= =?UTF-8?q?ulateur,=20dreaming=20off-policy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Capstone de la serie RL : distillation du preprint arXiv 2609.14858 dans un monde jouet circle-packing stdlib. 29 cellules, 13 code, papermill 0 erreur, outputs committes (C.2). README serie : ligne 16 + arbre fichiers reconcilie au disque (31 ipynb) + decomposition kernel re-mesuree 31/31 Python. Co-Authored-By: Claude Sonnet 5 --- MyIA.AI.Notebooks/RL/README.md | 19 +- MyIA.AI.Notebooks/RL/rl_16_dream_rsi.ipynb | 1199 ++++++++++++++++++++ 2 files changed, 1216 insertions(+), 2 deletions(-) create mode 100644 MyIA.AI.Notebooks/RL/rl_16_dream_rsi.ipynb diff --git a/MyIA.AI.Notebooks/RL/README.md b/MyIA.AI.Notebooks/RL/README.md index 147dcebe60..eae13d697f 100644 --- a/MyIA.AI.Notebooks/RL/README.md +++ b/MyIA.AI.Notebooks/RL/README.md @@ -9,9 +9,9 @@ breakdown: root=26 maturity: BETA=25, DRAFT=1 --> -> **Note éditoriale (counts)** : Le marqueur `CATALOG-STATUS` ci-dessus est autoritatif pour le compte agrégé (17 notebooks canoniques). Pour la **décomposition langagière par kernel** (`metadata.kernelspec.language`), ce README reste autoritatif car la granularité kernel n'est pas dans le marqueur agrégé ; elle est documentée ici par lecture directe des kernelspecs au 10/07/2026 : +> **Note éditoriale (counts)** : Le marqueur `CATALOG-STATUS` ci-dessus est autoritatif pour le compte agrégé. Pour la **décomposition langagière par kernel** (`metadata.kernelspec.language`), ce README reste autoritatif car la granularité kernel n'est pas dans le marqueur agrégé ; elle est documentée ici par lecture directe des kernelspecs au 16/09/2026 : > -> **17 Python = python/python3 = 17/17 mono-kernel Python 100% ✓** (17 fichiers `*.ipynb` canoniques au total sur disque — aucun `_output.ipynb` Papermill dans ce hub, exécution via MCP Jupyter `nbconvert --execute --to notebook` ou `jupyter nbconvert --execute --inplace`). +> **31 Python = 31/31 mono-kernel Python 100% ✓** (31 fichiers `*.ipynb` au total sur disque — aucun `_output.ipynb` Papermill dans ce hub, exécution via MCP Jupyter `nbconvert --execute --to notebook` ou `jupyter nbconvert --execute --inplace`). La table « Notebooks » ci-dessous documente 27 d'entre eux — les lignes de `rl_1b`, `rl_1c`, `rl_14` et `RL-7b` restent à réconcilier (dérive pré-existante, signalée à la livraison du notebook 16). > > RL est un cas de **mono-kernel Python 100%** : tous les algorithmes (DQN, REINFORCE, A2C, PPO, SAC, GRPO, Dyna-Q, BCQ offline, reward shaping, POMDP belief tracker, C51 distributional, RND curiosity) sont implémentés en Python, soit via PyTorch / Stable Baselines3 / Gymnasium, soit from-scratch en NumPy + PyTorch. C'est une **variante L392 #6 NEW** : contrairement à ML (#5915) qui a des jumeaux C#/Python intra-sous-série, Probas (#5916) qui a une mixité intra-série multi-paradigme (.NET C# + Python), QC (#5917) cloisonnée par sous-série, et Sudoku (#5918 / c.388) qui a une mixité jumeaux dominante + 1 compagnon Lean intra-hub, RL a une **uniformité mono-paradigme** avec 7 moteurs SOTA distincts (PyTorch, NumPy, matplotlib, Stable Baselines3, Gymnasium, highway_env, PettingZoo) — registre EPIC #3801 entry #009 (PR #5922 — collision avec PR canonique utilisateur #5925, await ai-01 decision). > @@ -49,6 +49,7 @@ Le RL se comprend mieux en voyant l'agent apprendre. Six visualisations suivent | 12 | [rl_12_distributional_rl](rl_12_distributional_rl.ipynb) | RL distributionnel : C51 (Categorical DQN) depuis zéro, projection catégorielle, politique CVaR | 50-55 min | | 13 | [rl_13_curiosity_exploration](rl_13_curiosity_exploration.html) | Exploration par curiosité (RND), motivation intrinsèque, piège d'exploitation | 35-40 min | | 15 | [rl_15_grpo_group_relative_policy](rl_15_grpo_group_relative_policy.ipynb) | GRPO (Group Relative Policy Optimization) vs PPO sur CartPole-v1 — avantage relatif intra-groupe (sans critic) vs GAE bootstrapé, multi-seed 6 (0/1/7/42/99/123), Wilcoxon signed-rank + IC95% bootstrap. Prong B discrimination moteur. Sous-grain #13436 de l'EPIC #1454. **Verdict v3 (REPAIR c.644) : INCONCLUSIVE** (le claim initial v1 « GRPO BEATS PPO » souffrait de défauts done-mask + pad-mask — c.642 a corrigé en INCONCLUSIVE, puis c.644 a détecté 4 post-fix incohérences résolues : Wilcoxon n=4 inatteignable, verdict tri-state asymmétrique, hypothèse descriptive fausse réfutée, titre PR ré-aligné — verdict v3 INCONCLUSIVE maintenu, moyennes v3 = 299.36 vs 197.65, std = 55.26 vs 104.99) | 40-45 min | +| 16 | [rl_16_dream_rsi](rl_16_dream_rsi.ipynb) | Dream-RSI (arXiv 2609.14858, preprint 14/09/2026) : exploration explicite **programmable** (politique = code), historique de découverte = simulateur-replay, **dreaming** = évaluation off-policy à coût zéro, boucle RSI avec incumbent (garantie non-régression replay-only) — monde jouet circle-packing stdlib (16 cercles), ablation replay brut vs guidance sémantique mesurée (3/2/7), chiffres du papier rapportés non canonisés. Distillation #16417 | 40-45 min | | pt-0 | [rlpt_0_reward_model_from_scratch](rlpt_0_reward_model_from_scratch.ipynb) | Reward model from scratch (Bradley-Terry) : apprendre r(x, y) depuis des paires de préférences sur le monde de rlpt_1 — MLE BT sans `trl.RewardTrainer`, évaluation honnête vs plafond de Bayes, calibration (ECE), identification affine, multi-seed 4 | 35-40 min | | pt-0b | [rlpt_0b_preference_dataset_bias](rlpt_0b_preference_dataset_bias.ipynb) | Biais d'un dataset de préférences, mesurés sur monde synthétique à longueurs variables : les trois biais classiques (longueur, position, annotateurs) injectés à paramètres connus, dégât mesuré contre le plafond de Bayes d'un juge **oracle non biaisé**, puis les mitigations du cahier des charges (length-controlled, swap-augmentation, annotator embedding) plus une quatrième qui sert de contrôle — verdict mesuré : aucune ne franchit 2σ, le length-controlled est **structurellement** sans effet sur une métrique de classement, l'orthogonalisation de longueur **aggrave** le biais | 40-45 min | | pt-0e | [rlpt_0e_trl_DPO_SOTA](rlpt_0e_trl_DPO_SOTA.ipynb) | `trl.DPOTrainer` (bras SOTA) contre DPO from scratch et reward model explicite de `rlpt_0` sur le **même monde et les mêmes paires de préférences**, à budget égal (même β, même lr, mêmes époques) — multi-seed {0,1,7,42} départagé au plafond de Bayes : verdict **B ≈ C > A** (DPO maison 0.679 / trl 0.678 / RM 0.661 vs plafond 0.695 ; B vs C indiscernables à ±0.008 près), marges implicites B↔C corrélées ρ≈0.98 = même math ; la différence robuste est le **coût fixe** de la pile (×22 sur jouet CPU) — inclut la garde de frontière prompt/complétion (piège trl : prompt sans espace finale) | 25-35 min | @@ -556,6 +557,8 @@ L'expérience replay (notebook 6) stocke les transitions (état, action, reward, ``` RL/ ├── 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 @@ -566,12 +569,24 @@ RL/ ├── rl_6d_sac_from_scratch.ipynb ├── rl_6e_grpo_from_scratch.ipynb ├── rl_7_multi_agent_rl.ipynb +├── RL-7b-Climbing-Game.ipynb ├── rl_8_model_based_dyna_q.ipynb ├── rl_9_offline_rl.ipynb ├── rl_10_reward_shaping.ipynb ├── rl_11_pomdp.ipynb ├── rl_12_distributional_rl.ipynb ├── rl_13_curiosity_exploration.ipynb +├── rl_14_hierarchical_rl.ipynb +├── rl_15_grpo_group_relative_policy.ipynb +├── rl_16_dream_rsi.ipynb +├── rlpt_0_reward_model_from_scratch.ipynb +├── rlpt_0b_preference_dataset_bias.ipynb +├── rlpt_0e_trl_DPO_SOTA.ipynb +├── rlpt_0f_comparaison_GRPO_TRL_et_PPO_maison.ipynb +├── rlpt_1_ppo_lm_rlhf.ipynb +├── rlpt_2_grpo_minimal.ipynb +├── rlpt_3_reward_hacking.ipynb +├── rlpt_4_dpo_vs_ppo.ipynb └── README.md ``` diff --git a/MyIA.AI.Notebooks/RL/rl_16_dream_rsi.ipynb b/MyIA.AI.Notebooks/RL/rl_16_dream_rsi.ipynb new file mode 100644 index 0000000000..ad4fb408bb --- /dev/null +++ b/MyIA.AI.Notebooks/RL/rl_16_dream_rsi.ipynb @@ -0,0 +1,1199 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "9fdc9cc4", + "metadata": { + "papermill": { + "duration": 0.020596, + "end_time": "2026-09-16T14:37:29.353059+00:00", + "exception": false, + "start_time": "2026-09-16T14:37:29.332463+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "# RL-16 : Dream-RSI — l'exploration comme code, évaluée off-policy par monde-replay\n", + "\n", + "| | |\n", + "|---|---|\n", + "| **Série** : Reinforcement Learning | **Prérequis** : [RL-8](rl_8_model_based_dyna_q.ipynb) (Dyna-Q), [RL-3](rl_3_experience_replay_her.ipynb) (replay), [RL-13](rl_13_curiosity_exploration.ipynb) (exploration) |\n", + "| **Sources** : Zheng et al., *Dream-RSI: Recursive Self-Improvement through Evolving Worlds*, arXiv:2609.14858 | **Genre** : distillation SOTA-Comparison (monde jouet) |\n", + "\n", + "> **Statut de la source.** Preprint cs.CL soumis le 14/09/2026, non relu, 18 auteurs. Ses\n", + "> chiffres (162× moins d'appels que SimpleTES sur Lasso, 2.09× sur KernelBench) sont des\n", + "> *claims d'auteurs* obtenus avec un agent Gemini-3.1 Pro hors de portée d'un cours. Ce\n", + "> notebook reproduit le **mécanisme** — pas les benchmarks — sur un monde jouet exécutable\n", + "> en pur Python standard, sans LLM ni GPU.\n", + "\n", + "## L'idée en une table : Dream-RSI est du Dyna transposé aux agents\n", + "\n", + "Le papier revendique lui-même la filiation (*« This idea parallels model-based\n", + "reinforcement learning (Sutton, 1990) »*). La table de correspondance s'écrit toute seule :\n", + "\n", + "| Dyna (RL-8, Sutton 1990) | Dream-RSI (ce notebook) |\n", + "|---|---|\n", + "| modèle appris de l'environnement | arbres de découverte **enregistrés** (les « mondes ») |\n", + "| planning : simulations depuis le modèle | dreaming : marches **off-policy** sur les arbres figés |\n", + "| amélioration de la politique (Q) | sélection de la **politique d'exploration** |\n", + "| boucle act → learn → plan → act | boucle explore → enregistre → rêve → redéploie |\n", + "\n", + "Le point conceptuel fort : dans Dream-RSI, **la politique d'exploration est du code\n", + "exécutable** (elle choisit quels nœuds étendre, la largeur des batches, quand s'arrêter),\n", + "et ce code peut être **révisé en rêvant** — évalué à coût nul sur l'historique enregistré\n", + "avant d'être redéployé en ligne. C'est une boucle d'auto-amélioration récursive (RSI) à la\n", + "couche méta-exploration : l'agent qui cherche n'est pas modifié, c'est la façon de chercher\n", + "qui évolue." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "dc18293f", + "metadata": { + "execution": { + "iopub.execute_input": "2026-09-16T14:37:29.389162Z", + "iopub.status.busy": "2026-09-16T14:37:29.387505Z", + "iopub.status.idle": "2026-09-16T14:37:29.798212Z", + "shell.execute_reply": "2026-09-16T14:37:29.797584Z" + }, + "papermill": { + "duration": 0.430216, + "end_time": "2026-09-16T14:37:29.798998+00:00", + "exception": false, + "start_time": "2026-09-16T14:37:29.368782+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "seed globale : 42\n" + ] + } + ], + "source": [ + "import math\n", + "import random\n", + "from dataclasses import dataclass, field\n", + "\n", + "import matplotlib.pyplot as plt\n", + "\n", + "SEED = 42\n", + "print(\"seed globale :\", SEED)" + ] + }, + { + "cell_type": "markdown", + "id": "bdd118e1", + "metadata": { + "papermill": { + "duration": 0.004265, + "end_time": "2026-09-16T14:37:29.810249+00:00", + "exception": false, + "start_time": "2026-09-16T14:37:29.805984+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "## 1. Le monde jouet : empilement de cercles (circle packing)\n", + "\n", + "Deux des trois domaines mathématiques du papier (circle packing, autocorrélation) sont\n", + "reproductibles avec la seule bibliothèque standard — aucun LLM requis. On prend le\n", + "**circle packing** : placer $n$ cercles dans le carré unité en maximisant les distances\n", + "par paires.\n", + "\n", + "Le contrat important est le **coût** : appeler `packing_score` = un appel à\n", + "l'environnement. C'est l'unité de budget du monde Dream-RSI jouet, exactement comme un\n", + "appel d'agent dans le papier." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "57cea345", + "metadata": { + "execution": { + "iopub.execute_input": "2026-09-16T14:37:29.825036Z", + "iopub.status.busy": "2026-09-16T14:37:29.824494Z", + "iopub.status.idle": "2026-09-16T14:37:29.833828Z", + "shell.execute_reply": "2026-09-16T14:37:29.833306Z" + }, + "papermill": { + "duration": 0.017862, + "end_time": "2026-09-16T14:37:29.834748+00:00", + "exception": false, + "start_time": "2026-09-16T14:37:29.816886+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "score de la configuration initiale : 17.1273\n" + ] + } + ], + "source": [ + "N_CIRCLES = 16\n", + "R_MAX = 0.10 # rayon « utile » : deux cercles plus proches que 2R se gênent\n", + "\n", + "\n", + "def dist(a, b):\n", + " return math.hypot(a[0] - b[0], a[1] - b[1])\n", + "\n", + "\n", + "def packing_score(config):\n", + " \"\"\"Qualité d'un empilement : distances par paires saturées à 2R, moins une\n", + " pénalité forte de chevauchement. UN appel = UN coût d'environnement.\"\"\"\n", + " s = 0.0\n", + " for i in range(len(config)):\n", + " for j in range(i + 1, len(config)):\n", + " d = dist(config[i], config[j])\n", + " s += min(d, 2 * R_MAX)\n", + " if d < 2 * R_MAX:\n", + " s -= (2 * R_MAX - d) * 5.0\n", + " return s\n", + "\n", + "\n", + "def random_config(rng):\n", + " return [(rng.random(), rng.random()) for _ in range(N_CIRCLES)]\n", + "\n", + "\n", + "def mutate(config, rng, sigma=0.15):\n", + " \"\"\"Déplacer un seul cercle selon un bruit gaussien borné au carré : le plus\n", + " petit « candidat de recherche » voisin d'une configuration.\"\"\"\n", + " child = [list(p) for p in config]\n", + " k = rng.randrange(len(child))\n", + " child[k][0] = min(1.0, max(0.0, child[k][0] + rng.gauss(0, sigma)))\n", + " child[k][1] = min(1.0, max(0.0, child[k][1] + rng.gauss(0, sigma)))\n", + " return [tuple(p) for p in child]\n", + "\n", + "\n", + "config0 = random_config(random.Random(SEED))\n", + "print(f\"score de la configuration initiale : {packing_score(config0):.4f}\")" + ] + }, + { + "cell_type": "markdown", + "id": "54ce632d", + "metadata": { + "papermill": { + "duration": 0.004828, + "end_time": "2026-09-16T14:37:29.845284+00:00", + "exception": false, + "start_time": "2026-09-16T14:37:29.840456+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "## 2. L'arbre de découverte : l'historique comme structure première\n", + "\n", + "Une session de recherche en ligne n'est pas une liste de solutions : c'est un **arbre**.\n", + "Chaque nœud porte sa configuration, son observation (le score) et ses enfants — les\n", + "candidats effectivement proposés et **payés**. Dans Dream-RSI, cet arbre figé est la\n", + "matière première : il devient un « monde » rejouable." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "14d00369", + "metadata": { + "execution": { + "iopub.execute_input": "2026-09-16T14:37:29.863015Z", + "iopub.status.busy": "2026-09-16T14:37:29.862556Z", + "iopub.status.idle": "2026-09-16T14:37:29.871032Z", + "shell.execute_reply": "2026-09-16T14:37:29.869726Z" + }, + "papermill": { + "duration": 0.021457, + "end_time": "2026-09-16T14:37:29.872297+00:00", + "exception": false, + "start_time": "2026-09-16T14:37:29.850840+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "@dataclass\n", + "class Node:\n", + " config: tuple\n", + " score: float\n", + " depth: int = 0\n", + " children: list = field(default_factory=list)\n", + " visits: int = 0\n", + "\n", + "\n", + "def expand(node, rng, batch_size, sigma=0.15):\n", + " \"\"\"UN appel d'agent : proposer `batch_size` mutations depuis le nœud, les\n", + " évaluer, les ENREGISTRER dans l'arbre. Coût : 1 batch, quelle que soit la\n", + " largeur — comme dans le papier, le coût porte sur l'appel, pas sur le\n", + " parallélisme interne du batch.\"\"\"\n", + " children = []\n", + " for _ in range(batch_size):\n", + " cfg = mutate(node.config, rng, sigma)\n", + " children.append(Node(tuple(cfg), packing_score(cfg), node.depth + 1))\n", + " node.children = children\n", + " node.visits += 1\n", + " return children\n", + "\n", + "\n", + "def tree_size(root):\n", + " n, stack = 0, [root]\n", + " while stack:\n", + " node = stack.pop()\n", + " n += 1\n", + " stack.extend(node.children)\n", + " return n" + ] + }, + { + "cell_type": "markdown", + "id": "db53571a", + "metadata": { + "papermill": { + "duration": 0.005183, + "end_time": "2026-09-16T14:37:29.882333+00:00", + "exception": false, + "start_time": "2026-09-16T14:37:29.877150+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "## 3. La politique d'exploration est du code\n", + "\n", + "L'agent qui propose des mutations est **inchangé** (fonction `mutate`). Ce qui varie,\n", + "c'est la politique qui décide **quel nœud de la frontière étendre** et **avec quelle\n", + "largeur** — et cette politique est un objet Python ordinaire : une classe avec une\n", + "méthode `select()`. C'est la transposition jouet de « l'exploration explicite et\n", + "programmable » du papier : parce que la politique est du code, on peut en générer des\n", + "variantes et les comparer." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "2d93efbd", + "metadata": { + "execution": { + "iopub.execute_input": "2026-09-16T14:37:29.892821Z", + "iopub.status.busy": "2026-09-16T14:37:29.892495Z", + "iopub.status.idle": "2026-09-16T14:37:29.898186Z", + "shell.execute_reply": "2026-09-16T14:37:29.897268Z" + }, + "papermill": { + "duration": 0.012374, + "end_time": "2026-09-16T14:37:29.899078+00:00", + "exception": false, + "start_time": "2026-09-16T14:37:29.886704+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "class FixedRefinement:\n", + " \"\"\"Raffinement parallèle figé (baseline du papier) : toujours approfondir\n", + " le meilleur point connu, avec une largeur de batch constante.\"\"\"\n", + "\n", + " def __init__(self, batch_size=4):\n", + " self.batch_size = batch_size\n", + "\n", + " def select(self, frontier, rng):\n", + " return max(frontier, key=lambda n: n.score)\n", + "\n", + "\n", + "class EpsilonGreedy:\n", + " \"\"\"ε-greedy : le meilleur point connu, sauf avec probabilité ε où l'on\n", + " diversifie vers un nœud aléatoire de la frontière.\"\"\"\n", + "\n", + " def __init__(self, eps, batch_size=4):\n", + " self.eps = eps\n", + " self.batch_size = batch_size\n", + "\n", + " def select(self, frontier, rng):\n", + " if rng.random() < self.eps:\n", + " return rng.choice(frontier)\n", + " return max(frontier, key=lambda n: n.score)\n", + "\n", + "\n", + "def run_online(policy, rng, n_batches=30):\n", + " \"\"\"Une session EN LIGNE : la politique dépense `n_batches` appels d'agent.\n", + " Renvoie la racine de l'arbre enregistré (le « monde »), le meilleur score\n", + " trouvé et la frontière restante.\"\"\"\n", + " cfg0 = tuple(random_config(rng))\n", + " root = Node(cfg0, packing_score(cfg0))\n", + " frontier = [root]\n", + " for _ in range(n_batches):\n", + " node = policy.select(frontier, rng)\n", + " frontier.remove(node)\n", + " frontier.extend(expand(node, rng, policy.batch_size))\n", + " return root, tree_best(root).score, frontier\n", + "\n", + "\n", + "def tree_best(root):\n", + " \"\"\"Le nœud de meilleur score de tout l'arbre (récursif-itératif).\"\"\"\n", + " best, stack = root, [root]\n", + " while stack:\n", + " node = stack.pop()\n", + " if node.score > best.score:\n", + " best = node\n", + " stack.extend(node.children)\n", + " return best" + ] + }, + { + "cell_type": "markdown", + "id": "a5a1455d", + "metadata": { + "papermill": { + "duration": 0.006318, + "end_time": "2026-09-16T14:37:29.910726+00:00", + "exception": false, + "start_time": "2026-09-16T14:37:29.904408+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "## 4. Le replay déterministe : rêver sur l'arbre enregistré\n", + "\n", + "C'est le cœur du papier, et il tient en dix lignes. Évaluer une politique candidate\n", + "**sans l'exécuter en ligne** : la faire marcher sur l'arbre enregistré comme elle\n", + "l'aurait fait — à chaque nœud, elle choisit parmi les enfants **enregistrés** (ce que\n", + "l'agent a déjà payé). Chaque branche existante coûte **zéro** appel d'environnement :\n", + "l'évaluation est off-policy sur données historiques, exactement comme l'évaluation\n", + "off-policy de RL-9, mais sur un arbre de découverte au lieu d'un buffer de transitions.\n", + "\n", + "Un walker par unité de parallélisme (`batch_size`) ; le score du rêve est le meilleur\n", + "score rencontré le long des marches." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "dfa2ed1a", + "metadata": { + "execution": { + "iopub.execute_input": "2026-09-16T14:37:29.924300Z", + "iopub.status.busy": "2026-09-16T14:37:29.924092Z", + "iopub.status.idle": "2026-09-16T14:37:29.940338Z", + "shell.execute_reply": "2026-09-16T14:37:29.939712Z" + }, + "papermill": { + "duration": 0.025856, + "end_time": "2026-09-16T14:37:29.941446+00:00", + "exception": false, + "start_time": "2026-09-16T14:37:29.915590+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "arbre enregistré : 121 nœuds\n", + "replay de FixedRefinement(eps=0, K=4) → 22.7717 (marche de 21 pas, 0 appel payé)\n", + "replay de EpsilonGreedy(eps=0.3, K=8) → 20.5466 (marche de 5 pas, 0 appel payé)\n" + ] + } + ], + "source": [ + "def replay(root, policy, rng, max_steps=30):\n", + " \"\"\"Évaluation OFF-POLICY d'une politique sur un arbre figé.\n", + " La politique descend l'arbre enregistré via select() sur les enfants\n", + " existants : zéro appel d'environnement. Renvoie (meilleur score atteint,\n", + " pas de la plus longue marche).\"\"\"\n", + " scores, steps_max = [], 0\n", + " for _ in range(policy.batch_size): # un walker par unité de parallélisme\n", + " node, best, steps = root, root.score, 0\n", + " while node.children and steps < max_steps:\n", + " node = policy.select(node.children, rng)\n", + " best = max(best, node.score)\n", + " steps += 1\n", + " scores.append(best)\n", + " steps_max = max(steps_max, steps)\n", + " return max(scores), steps_max\n", + "\n", + "\n", + "# démo : même arbre, deux lectures différentes\n", + "rng_demo = random.Random(SEED)\n", + "root_demo, _, _ = run_online(FixedRefinement(4), rng_demo, n_batches=30)\n", + "print(f\"arbre enregistré : {tree_size(root_demo)} nœuds\")\n", + "for pol in (FixedRefinement(4), EpsilonGreedy(0.3, 8)):\n", + " q, steps = replay(root_demo, pol, random.Random(7))\n", + " print(f\"replay de {type(pol).__name__}(eps={getattr(pol, 'eps', 0)}, \"\n", + " f\"K={pol.batch_size}) → {q:.4f} (marche de {steps} pas, 0 appel payé)\")" + ] + }, + { + "cell_type": "markdown", + "id": "e17917d4", + "metadata": { + "papermill": { + "duration": 0.013666, + "end_time": "2026-09-16T14:37:29.977894+00:00", + "exception": false, + "start_time": "2026-09-16T14:37:29.964228+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "## 5. La fonction de score Eq. 1 : qualité, coût, parallélisme\n", + "\n", + "Le papier classe les politiques candidates par une valeur multi-objectif (Eq. 1) :\n", + "\n", + "$$V = \\text{qualité} - \\beta_1 \\cdot \\text{coût} + \\beta_2 \\cdot \\text{parallélisme}$$\n", + "\n", + "- **qualité** : le meilleur score que la politique trouve (ici : son replay sur le pool) ;\n", + "- **coût** : le budget qu'elle consommerait en ligne (batches) ;\n", + "- **parallélisme** : la largeur de ses batches — un batch large avance plus par appel.\n", + "\n", + "Les deux poids $\\beta_1, \\beta_2$ sont des leviers pédagogiques : l'**Exercice 2** les\n", + "balaye et montre comment le classement du rêve bascule du « cher mais large » au\n", + "« économe mais étroit »." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "4104a81f", + "metadata": { + "execution": { + "iopub.execute_input": "2026-09-16T14:37:29.990612Z", + "iopub.status.busy": "2026-09-16T14:37:29.990419Z", + "iopub.status.idle": "2026-09-16T14:37:30.002452Z", + "shell.execute_reply": "2026-09-16T14:37:30.001465Z" + }, + "papermill": { + "duration": 0.019342, + "end_time": "2026-09-16T14:37:30.003332+00:00", + "exception": false, + "start_time": "2026-09-16T14:37:29.983990+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "FixedRefinement(4) : qualité 23.0409 → V = 22.6909" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "EpsilonGreedy(0.25,4) : qualité 23.3406 → V = 22.9906\n" + ] + } + ], + "source": [ + "BETA1 = 0.02 # poids du coût (batches)\n", + "BETA2 = 0.5 # poids du parallélisme (normalisé par la largeur max de la grille)\n", + "\n", + "\n", + "def value(quality, n_batches, batch_size):\n", + " \"\"\"Eq. 1 du papier, forme jouet. Lit les constantes globales BETA1/BETA2\n", + " à chaque appel — l'Exercice 2 s'appuie dessus.\"\"\"\n", + " return quality - BETA1 * n_batches + BETA2 * (batch_size / 8.0)\n", + "\n", + "\n", + "# deux politiques de base, même budget en ligne, graines appariées\n", + "root_a, best_a, _ = run_online(FixedRefinement(4), random.Random(SEED), 30)\n", + "root_b, best_b, _ = run_online(EpsilonGreedy(0.25, 4), random.Random(SEED), 30)\n", + "print(f\"FixedRefinement(4) : qualité {best_a:.4f} → V = {value(best_a, 30, 4):.4f}\")\n", + "print(f\"EpsilonGreedy(0.25,4) : qualité {best_b:.4f} → V = {value(best_b, 30, 4):.4f}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e4eb8dce", + "metadata": { + "papermill": { + "duration": 0.004811, + "end_time": "2026-09-16T14:37:30.012880+00:00", + "exception": false, + "start_time": "2026-09-16T14:37:30.008069+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "## 6. La boucle RSI miniature : online → monde → rêve → redéploiement\n", + "\n", + "Tout est en place pour la boucle complète du papier, en trois itérations :\n", + "\n", + "1. **Online** : l'incumbent (politique courante) dépense son budget, **enregistre** un arbre — un nouveau monde rejoint le pool ;\n", + "2. **Rêve** : chaque candidate de la grille est évaluée par **replay sur tout le pool**, à coût d'environnement nul, puis classée par l'Eq. 1 ;\n", + "3. **Sélection avec incumbent** : la candidate n'est déployée que si elle bat l'incumbent **au classement du rêve** — l'incumbent fait partie des candidates, donc le score replay du choix ne peut pas régresser.\n", + "\n", + "Seul le **code de la politique** évolue ; l'agent (`mutate`), l'évaluateur\n", + "(`packing_score`) et les interfaces restent fixes — c'est la RSI à la couche\n", + "méta-exploration." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "2490a78b", + "metadata": { + "execution": { + "iopub.execute_input": "2026-09-16T14:37:30.026162Z", + "iopub.status.busy": "2026-09-16T14:37:30.025812Z", + "iopub.status.idle": "2026-09-16T14:37:30.051589Z", + "shell.execute_reply": "2026-09-16T14:37:30.050792Z" + }, + "papermill": { + "duration": 0.033065, + "end_time": "2026-09-16T14:37:30.052531+00:00", + "exception": false, + "start_time": "2026-09-16T14:37:30.019466+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "itération 2 : le rêve garde l'incumbent (EpsilonGreedy)" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "online 0 : FixedRefinement(eps=0.0, K=4) → qualité en ligne 23.0409\n", + "online 1 : EpsilonGreedy(eps=0.0, K=8) → qualité en ligne 24.0000\n", + "online 2 : EpsilonGreedy(eps=0.0, K=8) → qualité en ligne 23.9515\n" + ] + } + ], + "source": [ + "BUDGET = 30 # batches par session en ligne\n", + "GRID = [EpsilonGreedy(e, k) for e in (0.0, 0.1, 0.3) for k in (2, 4, 8)]\n", + "\n", + "\n", + "def dream(pool, candidates, rng):\n", + " \"\"\"Le rêve : classer les candidates par replay sur TOUT le pool de mondes\n", + " (coût d'environnement nul), selon l'Eq. 1.\"\"\"\n", + " rows = [(max(replay(root, pol, rng)[0] for root in pool), pol) for pol in candidates]\n", + " rows.sort(key=lambda r: -value(r[0], BUDGET, r[1].batch_size))\n", + " return rows\n", + "\n", + "\n", + "incumbent = FixedRefinement(4)\n", + "root0, best0, _ = run_online(incumbent, random.Random(SEED), BUDGET)\n", + "pool, history = [root0], [(\"online 0\", incumbent, best0)]\n", + "\n", + "for it in (1, 2):\n", + " ranking = dream(pool, GRID + [incumbent], random.Random(SEED + it))\n", + " chosen = ranking[0][1]\n", + " if chosen is incumbent:\n", + " print(f\"itération {it} : le rêve garde l'incumbent \"\n", + " f\"({type(incumbent).__name__})\")\n", + " root_new, best_new, _ = run_online(chosen, random.Random(SEED + 100 + it), BUDGET)\n", + " pool.append(root_new)\n", + " history.append((f\"online {it}\", chosen, best_new))\n", + " incumbent = chosen\n", + "\n", + "print()\n", + "for step, pol, best in history:\n", + " print(f\"{step} : {type(pol).__name__}(eps={getattr(pol, 'eps', 0.0):.1f}, \"\n", + " f\"K={pol.batch_size}) → qualité en ligne {best:.4f}\")" + ] + }, + { + "cell_type": "markdown", + "id": "11c077ef", + "metadata": { + "papermill": { + "duration": 0.00497, + "end_time": "2026-09-16T14:37:30.062529+00:00", + "exception": false, + "start_time": "2026-09-16T14:37:30.057559+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "### Lecture du résultat (les chiffres ci-dessus sont ceux de l'exécution)\n", + "\n", + "Deux enseignements, lisibles directement dans la sortie :\n", + "\n", + "1. **Itération 1** : le rêve garde l'élitisme (ε = 0) mais passe de la largeur 4 à la\n", + " largeur 8. Sur le pool enregistré, les lectures élitistes étroite et large **égalent\n", + " en qualité** (22.7717) — c'est le terme de parallélisme $\\beta_2$ de l'Eq. 1 qui\n", + " tranche. En ligne, le gain est réel : 23.04 → 24.00, soit la **saturation exacte**\n", + " du scorer (120 paires × 2R = 24.0). La boucle a découvert, sans toucher à l'agent,\n", + " que doubler la largeur à budget égal atteint l'optimum.\n", + "2. **Itération 2** : rien ne bat l'incumbent au replay — le rêve **le garde**, et la\n", + " session en ligne retombe pourtant légèrement (24.00 → 23.95). C'est la limite la\n", + " plus importante du mécanisme, et elle est structurelle : la garantie de\n", + " non-régression porte sur le **score replay** (historique figé), pas sur le tirage\n", + " aléatoire de la prochaine session en ligne. La section Limites (§8) ci-dessous y\n", + " revient — ici, le jouet la fait voir vivre." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "c1a801a3", + "metadata": { + "execution": { + "iopub.execute_input": "2026-09-16T14:37:30.074751Z", + "iopub.status.busy": "2026-09-16T14:37:30.074360Z", + "iopub.status.idle": "2026-09-16T14:37:30.101329Z", + "shell.execute_reply": "2026-09-16T14:37:30.100700Z" + }, + "papermill": { + "duration": 0.034927, + "end_time": "2026-09-16T14:37:30.102796+00:00", + "exception": false, + "start_time": "2026-09-16T14:37:30.067869+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "itération 1 : choisi EpsilonGreedy — replay 22.7717 vs incumbent 22.7717 → non-régression VRAIE\n", + "itération 2 : choisi EpsilonGreedy — replay 23.9677 vs incumbent 23.9677 → non-régression VRAIE\n" + ] + } + ], + "source": [ + "# La garantie d'incumbent du papier, vérifiée pas à pas : la sélection est un\n", + "# argmax sur un ensemble qui CONTIENT l'incumbent, donc le score replay du\n", + "# choix est >= au score replay de l'incumbent sur le même pool. La preuve\n", + "# tient en une ligne ; la mesure la rend tangible.\n", + "checks = []\n", + "inc = FixedRefinement(4)\n", + "roots = [run_online(inc, random.Random(SEED), BUDGET)[0]]\n", + "for it in (1, 2):\n", + " ranking = dream(roots, GRID + [inc], random.Random(SEED + it))\n", + " q_sel, pol_sel = ranking[0]\n", + " q_inc = next(q for q, p in ranking if p is inc)\n", + " checks.append((it, type(pol_sel).__name__, q_sel, q_inc, q_sel >= q_inc))\n", + " roots.append(run_online(pol_sel, random.Random(SEED + 100 + it), BUDGET)[0])\n", + " inc = pol_sel\n", + "\n", + "for it, name, q_sel, q_inc, ok in checks:\n", + " print(f\"itération {it} : choisi {name} — replay {q_sel:.4f} vs incumbent \"\n", + " f\"{q_inc:.4f} → non-régression {'VRAIE' if ok else 'FAUSSE'}\")" + ] + }, + { + "cell_type": "markdown", + "id": "561262de", + "metadata": { + "papermill": { + "duration": 0.005689, + "end_time": "2026-09-16T14:37:30.119099+00:00", + "exception": false, + "start_time": "2026-09-16T14:37:30.113410+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "## 7. L'ablation §5.1 : guider par un résumé nuit, le replay brut aide\n", + "\n", + "L'ablation la plus contre-intuitive du papier (§5.1) : remplacer le replay brut par une\n", + "**guidance sémantique** — un résumé de l'historique injecté dans le choix — *sous-performe\n", + "systématiquement*. La guidance sur-contraint l'espace : le résumé jette away la\n", + "structure fine de l'arbre que le replay, lui, exploite exactement.\n", + "\n", + "La version jouet : la « guidance » est une **règle écrite à la main** qui lit un résumé\n", + "statistique du monde (l'écart-type des scores enregistrés) et en déduit une politique,\n", + "sans jamais rejouer l'arbre. On la confronte au choix par replay sur la même grille, et\n", + "on mesure **honnêtement** ce que chaque choix rapporte sur des sessions en ligne fraîches\n", + "(graines appariées)." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "c371d193", + "metadata": { + "execution": { + "iopub.execute_input": "2026-09-16T14:37:30.136429Z", + "iopub.status.busy": "2026-09-16T14:37:30.136197Z", + "iopub.status.idle": "2026-09-16T14:37:30.356030Z", + "shell.execute_reply": "2026-09-16T14:37:30.355421Z" + }, + "papermill": { + "duration": 0.229692, + "end_time": "2026-09-16T14:37:30.357336+00:00", + "exception": false, + "start_time": "2026-09-16T14:37:30.127644+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sur 12 mondes jouets : replay brut 3 victoires | guidance sémantique 2 | égalités 7\n" + ] + } + ], + "source": [ + "def guided_choice(pool):\n", + " \"\"\"La guidance sémantique jouet : lire un RÉSUMÉ du monde (l'écart-type des\n", + " scores enregistrés) et appliquer une règle écrite à la main. Plausible —\n", + " c'est exactement le problème : la règle remplace la mesure.\"\"\"\n", + " scores = [c.score for r in pool for c in r.children]\n", + " mean = sum(scores) / len(scores)\n", + " spread = (sum((s - mean) ** 2 for s in scores) / len(scores)) ** 0.5\n", + " if spread > 0.8: # « monde hétérogène → diversifier » (règle inventée)\n", + " return EpsilonGreedy(0.3, 8)\n", + " return EpsilonGreedy(0.0, 8) # « monde homogène → raffiner »\n", + "\n", + "\n", + "N_TRIALS = 12\n", + "replay_wins = guided_wins = ties = 0\n", + "for t in range(N_TRIALS):\n", + " world = [run_online(FixedRefinement(4), random.Random(2000 + t), BUDGET)[0]]\n", + " pol_r = dream(world, GRID, random.Random(3000 + t))[0][1] # choix par replay\n", + " pol_g = guided_choice(world) # choix par guidance\n", + " q_r = run_online(pol_r, random.Random(4000 + t), BUDGET)[1] # graines appariées\n", + " q_g = run_online(pol_g, random.Random(4000 + t), BUDGET)[1]\n", + " if q_r > q_g:\n", + " replay_wins += 1\n", + " elif q_g > q_r:\n", + " guided_wins += 1\n", + " else:\n", + " ties += 1\n", + "\n", + "print(f\"sur {N_TRIALS} mondes jouets : replay brut {replay_wins} victoires | \"\n", + " f\"guidance sémantique {guided_wins} | égalités {ties}\")" + ] + }, + { + "cell_type": "markdown", + "id": "c5e257dd", + "metadata": { + "papermill": { + "duration": 0.008256, + "end_time": "2026-09-16T14:37:30.373473+00:00", + "exception": false, + "start_time": "2026-09-16T14:37:30.365217+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "### Lecture de l'ablation (chiffres de l'exécution ci-dessus)\n", + "\n", + "Mesuré : replay brut **3** victoires, guidance sémantique **2**, égalités **7** sur 12\n", + "mondes. **L'effet est faible à cette échelle** : dans 7 cas sur 12 les deux choix mènent\n", + "au même résultat au même budget, et la règle inventée gagne même 2 fois. Loin d'une\n", + "domination — exactement ce qu'un jouet de 16 cercles peut montrer : la comparaison est\n", + "*mesurable*, la direction rapportée par le papier (le replay brut exploite mieux la\n", + "structure enregistrée qu'une règle inventée) n'y est pas contredite, mais le signal est\n", + "trop étroit pour servir d'argument.\n", + "\n", + "**Nuance assumée** : l'effet du papier est mesuré sur 8 tâches réelles avec un agent LLM\n", + "et des résumés sémantiques ; le jouet ne prouve pas l'effet à l'échelle, il rend le\n", + "mécanisme *plausible et mémorable*. C'est précisément la différence entre « reproduire\n", + "un mécanisme » et « canoniser des chiffres »." + ] + }, + { + "cell_type": "markdown", + "id": "9e181365", + "metadata": { + "papermill": { + "duration": 0.008818, + "end_time": "2026-09-16T14:37:30.392092+00:00", + "exception": false, + "start_time": "2026-09-16T14:37:30.383274+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "## 8. Ce que le jouet ne montre pas — limites assumées\n", + "\n", + "1. **La garantie d'incumbent vaut sur le score REPLAY**, pas sur la performance online\n", + " future. L'arbre est figé ; le monde réel, non. Cette distillation l'assume\n", + " explicitement — l'itération 2 de la boucle RSI ci-dessus en est la démonstration\n", + " vivante (24.00 → 23.95).\n", + "2. **Les chiffres du papier ne sont pas reproduits** : Lasso 3587→2931 ms en 317 appels,\n", + " 162× moins de générations que SimpleTES, KernelBench ×2.09 — tout cela exige\n", + " Gemini-3.1 Pro et des budgets disymétriques entre les systèmes comparés.\n", + "3. **Preprint de 48 h** : 0 écho communautaire, 18 auteurs, non relu. Les comparaisons\n", + " SimpleTES/AlphaEvolve se citent avec leurs conditions d'expérience.\n", + "4. **L'agent du jouet ne propose pas du code** : `mutate` est un opérateur fixe. Le\n", + " Dream-RSI réel enchâsse un agent de codage inchangé — ici, l'invariant « l'agent ne\n", + " change pas, la politique change » est conservé, pas l'agent lui-même." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "1eab4821", + "metadata": { + "execution": { + "iopub.execute_input": "2026-09-16T14:37:30.407152Z", + "iopub.status.busy": "2026-09-16T14:37:30.406923Z", + "iopub.status.idle": "2026-09-16T14:37:30.561713Z", + "shell.execute_reply": "2026-09-16T14:37:30.561167Z" + }, + "papermill": { + "duration": 0.16332, + "end_time": "2026-09-16T14:37:30.562422+00:00", + "exception": false, + "start_time": "2026-09-16T14:37:30.399102+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Figure de synthèse : le meilleur empilement trouvé + la trajectoire de la boucle RSI\n", + "bnode = tree_best(pool[-1])\n", + "\n", + "fig, axes = plt.subplots(1, 2, figsize=(11, 4))\n", + "ax = axes[0]\n", + "for (x, y) in bnode.config:\n", + " ax.add_patch(plt.Circle((x, y), R_MAX, fill=False, color=\"tab:blue\"))\n", + "ax.set_xlim(0, 1)\n", + "ax.set_ylim(0, 1)\n", + "ax.set_aspect(\"equal\")\n", + "ax.set_title(f\"Meilleur empilement (score {bnode.score:.3f})\")\n", + "axes[1].bar([h[0] for h in history], [h[2] for h in history], color=\"tab:green\")\n", + "q_hist = [h[2] for h in history]\n", + "axes[1].set_ylim(min(q_hist) - 1.0, max(q_hist) * 1.05)\n", + "axes[1].set_ylabel(\"packing score\")\n", + "axes[1].set_title(\"Qualité en ligne par itération de la boucle RSI\")\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "16b1f1d6", + "metadata": { + "papermill": { + "duration": 0.00513, + "end_time": "2026-09-16T14:37:30.572631+00:00", + "exception": false, + "start_time": "2026-09-16T14:37:30.567501+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "## 9. Exercices\n", + "\n", + "Les trois exercices réutilisent les briques ci-dessus (`Node`, `expand`, `replay`,\n", + "`dream`). Aucun ne casse l'exécution du notebook : chaque cellule s'exécute telle\n", + "quelle et affiche « à compléter »." + ] + }, + { + "cell_type": "markdown", + "id": "ad6b6051", + "metadata": { + "papermill": { + "duration": 0.004809, + "end_time": "2026-09-16T14:37:30.583576+00:00", + "exception": false, + "start_time": "2026-09-16T14:37:30.578767+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "### Exercice 1 — UCB1 : explorer là où l'incertitude est grande\n", + "\n", + "`FixedRefinement` est purement élitiste, `EpsilonGreedy` diversifie au hasard. UCB1\n", + "(RL-13) fait mieux : bonus d'exploration proportionnel à $1/\\sqrt{\\text{visites}}$.\n", + "Branchez-la dans `replay` puis dans `dream` et comparez." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "92b8c6cb", + "metadata": { + "execution": { + "iopub.execute_input": "2026-09-16T14:37:30.594935Z", + "iopub.status.busy": "2026-09-16T14:37:30.594542Z", + "iopub.status.idle": "2026-09-16T14:37:30.599425Z", + "shell.execute_reply": "2026-09-16T14:37:30.598475Z" + }, + "papermill": { + "duration": 0.011546, + "end_time": "2026-09-16T14:37:30.600264+00:00", + "exception": false, + "start_time": "2026-09-16T14:37:30.588718+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Exercice à compléter : implémenter select() de UCB1 puis décommenter.\n" + ] + } + ], + "source": [ + "# Exercice 1 — politique UCB1\n", + "# Etape 1 : compléter select() : argmax (score + c * sqrt(log(total) / visits))\n", + "# Etape 2 : décommenter et comparer le replay d'UCB1 aux politiques de la GRID\n", + "# Indice : chaque Node porte .visits ; total = somme des visits de la frontière.\n", + "class UCB1:\n", + " \"\"\"Exploration upper-confidence-bound : le meilleur score connu, plus un\n", + " bonus d'incertitude qui décroît avec les visites du nœud.\"\"\"\n", + "\n", + " def __init__(self, c=0.5, batch_size=4):\n", + " self.c = c\n", + " self.batch_size = batch_size\n", + "\n", + " def select(self, frontier, rng):\n", + " # TODO étudiant\n", + " pass\n", + "\n", + "\n", + "# pol_ucb = UCB1()\n", + "# print(replay(pool[0], pol_ucb, random.Random(1))[0])\n", + "print(\"Exercice à compléter : implémenter select() de UCB1 puis décommenter.\")" + ] + }, + { + "cell_type": "markdown", + "id": "19f2576d", + "metadata": { + "papermill": { + "duration": 0.00544, + "end_time": "2026-09-16T14:37:30.611206+00:00", + "exception": false, + "start_time": "2026-09-16T14:37:30.605766+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "### Exercice 2 — le compromis de l'Eq. 1 : balayer β₁ et β₂\n", + "\n", + "Le classement du rêve dépend des poids : β₁ punit le coût, β₂ récompense la largeur.\n", + "Balayez la grille et observez la bascule du classement." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "c4dd153d", + "metadata": { + "execution": { + "iopub.execute_input": "2026-09-16T14:37:30.626380Z", + "iopub.status.busy": "2026-09-16T14:37:30.625930Z", + "iopub.status.idle": "2026-09-16T14:37:30.631831Z", + "shell.execute_reply": "2026-09-16T14:37:30.630837Z" + }, + "papermill": { + "duration": 0.015417, + "end_time": "2026-09-16T14:37:30.632702+00:00", + "exception": false, + "start_time": "2026-09-16T14:37:30.617285+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Exercice à compléter : balayage (β₁, β₂) du classement dream().\n" + ] + } + ], + "source": [ + "# Exercice 2 — sensibilité de l'Eq. 1\n", + "# Etape 1 : balayer BETA1 dans [0, 0.05, 0.1] et BETA2 dans [0, 0.5, 1.0]\n", + "# Etape 2 : pour chaque couple, relancer dream(pool, GRID, ...) et noter la politique choisie\n", + "# Etape 3 : à partir de quel β₁ le coût écrase-t-il la qualité ?\n", + "# Indice : value() lit BETA1/BETA2 globaux à chaque appel — redéfinissez-les\n", + "# (globals()['BETA1'] = ...) avant chaque dream(), puis restaurez.\n", + "result = None # TODO étudiant : tableau (β₁, β₂) → politique choisie\n", + "print(\"Exercice à compléter : balayage (β₁, β₂) du classement dream().\")" + ] + }, + { + "cell_type": "markdown", + "id": "097314c8", + "metadata": { + "papermill": { + "duration": 0.007413, + "end_time": "2026-09-16T14:37:30.645351+00:00", + "exception": false, + "start_time": "2026-09-16T14:37:30.637938+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "### Exercice 3 — replay budgété : quand une branche manque, elle coûte\n", + "\n", + "Le replay de ce notebook est **optimiste** : si la politique veut un enfant absent de\n", + "l'arbre, la marche s'arrête et c'est gratuit. Rendez-le honnête : une branche manquante\n", + "coûte 1 (il faudrait la payer pour de vrai). Quand le classement du rêve bascule-t-il\n", + "entre gratuit et budgété ?" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "103fa243", + "metadata": { + "execution": { + "iopub.execute_input": "2026-09-16T14:37:30.657391Z", + "iopub.status.busy": "2026-09-16T14:37:30.657085Z", + "iopub.status.idle": "2026-09-16T14:37:30.661756Z", + "shell.execute_reply": "2026-09-16T14:37:30.660838Z" + }, + "papermill": { + "duration": 0.012328, + "end_time": "2026-09-16T14:37:30.662615+00:00", + "exception": false, + "start_time": "2026-09-16T14:37:30.650287+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Exercice à compléter : variant de replay() avec coût de branche manquante.\n" + ] + } + ], + "source": [ + "# Exercice 3 — replay budgété\n", + "# Etape 1 : écrire replay_budgate(root, policy, rng, budget) : une marche qui\n", + "# « sort » de l'arbre enregistré paie 1 par branche manquante\n", + "# Etape 2 : comparer les classements dream() gratuit vs budgété sur le même pool\n", + "# Indice : une ε-greedy sort de l'enregistré avec probabilité ε à chaque pas ;\n", + "# représentez le budget consommé comme un compteur de marches.\n", + "print(\"Exercice à compléter : variant de replay() avec coût de branche manquante.\")" + ] + }, + { + "cell_type": "markdown", + "id": "5f0ece39", + "metadata": { + "papermill": { + "duration": 0.006729, + "end_time": "2026-09-16T14:37:30.674870+00:00", + "exception": false, + "start_time": "2026-09-16T14:37:30.668141+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "## 10. Conclusion : le tiers manquant entre moteur et politique\n", + "\n", + "Ce notebook relie trois fils du cours qui ne se touchaient pas :\n", + "\n", + "- **RL-8 (Dyna)** : planifier depuis un modèle appris. Dream-RSI est ce geste, transposé\n", + " — le « modèle » est l'historique de découverte lui-même ;\n", + "- **RL-3 (replay) et RL-9 (off-policy)** : évaluer une politique sur des données\n", + " historiques sans les regénérer — ici, l'évaluation porte sur des **politiques\n", + " d'exploration**, pas sur des actions ;\n", + "- **2.11-Régularisation-Sparse-LASSO** et sa comparaison SOTA\n", + " (le solveur que le papier découvre automatiquement est le benchmark du cours) ;\n", + "- **Epic #12373 (MGS vs mealpy)** : les benchmarks circle packing / autocorrélation du\n", + " papier sont exactement ce terrain — Dream-RSI y ajoute le tiers manquant : au-dessus\n", + " du choix de *moteur*, le choix de *politique d'exploration* qui l'orchestre.\n", + "\n", + "**À retenir** : (1) l'historique de recherche est un actif — un simulateur rejouable à\n", + "coût nul ; (2) quand la politique d'exploration est du code, elle devient elle-même\n", + "optimisable, par rêve, avec une garantie de non-régression *sur le replay* ; (3) le\n", + "replay brut bat la guidance sémantique — la structure fine vaut plus que le résumé." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.14" + }, + "nbformat": 4, + "nbformat_minor": 5, + "papermill": { + "default_parameters": {}, + "duration": 3.671451, + "end_time": "2026-09-16T14:37:30.921129+00:00", + "environment_variables": {}, + "exception": null, + "input_path": "rl_16_dream_rsi.ipynb", + "output_path": "rl_16_exec2.ipynb", + "parameters": {}, + "start_time": "2026-09-16T14:37:27.249678+00:00", + "version": "2.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 4c3c908543d3a7fea10ba595ffdfeec9451e10d8 Mon Sep 17 00:00:00 2001 From: jsboige Date: Wed, 16 Sep 2026 17:26:43 +0200 Subject: [PATCH 2/2] =?UTF-8?q?enrich(rl,#16417):=20README=20table=20rows?= =?UTF-8?q?=20for=20rl=5F1b,=20rl=5F1c,=20RL-7b,=20rl=5F14=20=E2=80=94=20p?= =?UTF-8?q?re-existing=20drift=20reconciled?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rows extracted firsthand from each notebook (title, sections, stated duration). Editorial note updated: 31/31 documented. Co-Authored-By: Claude Sonnet 5 --- MyIA.AI.Notebooks/RL/README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/MyIA.AI.Notebooks/RL/README.md b/MyIA.AI.Notebooks/RL/README.md index eae13d697f..a6b1e370d1 100644 --- a/MyIA.AI.Notebooks/RL/README.md +++ b/MyIA.AI.Notebooks/RL/README.md @@ -11,7 +11,7 @@ maturity: BETA=25, DRAFT=1 > **Note éditoriale (counts)** : Le marqueur `CATALOG-STATUS` ci-dessus est autoritatif pour le compte agrégé. Pour la **décomposition langagière par kernel** (`metadata.kernelspec.language`), ce README reste autoritatif car la granularité kernel n'est pas dans le marqueur agrégé ; elle est documentée ici par lecture directe des kernelspecs au 16/09/2026 : > -> **31 Python = 31/31 mono-kernel Python 100% ✓** (31 fichiers `*.ipynb` au total sur disque — aucun `_output.ipynb` Papermill dans ce hub, exécution via MCP Jupyter `nbconvert --execute --to notebook` ou `jupyter nbconvert --execute --inplace`). La table « Notebooks » ci-dessous documente 27 d'entre eux — les lignes de `rl_1b`, `rl_1c`, `rl_14` et `RL-7b` restent à réconcilier (dérive pré-existante, signalée à la livraison du notebook 16). +> **31 Python = 31/31 mono-kernel Python 100% ✓** (31 fichiers `*.ipynb` au total sur disque — aucun `_output.ipynb` Papermill dans ce hub, exécution via MCP Jupyter `nbconvert --execute --to notebook` ou `jupyter nbconvert --execute --inplace`). La table « Notebooks » ci-dessous documente les 31 — les lignes de `rl_1b`, `rl_1c`, `RL-7b` et `rl_14`, absentes depuis leur livraison (dérive pré-existante), y sont réconciliées à la livraison du notebook 16. > > RL est un cas de **mono-kernel Python 100%** : tous les algorithmes (DQN, REINFORCE, A2C, PPO, SAC, GRPO, Dyna-Q, BCQ offline, reward shaping, POMDP belief tracker, C51 distributional, RND curiosity) sont implémentés en Python, soit via PyTorch / Stable Baselines3 / Gymnasium, soit from-scratch en NumPy + PyTorch. C'est une **variante L392 #6 NEW** : contrairement à ML (#5915) qui a des jumeaux C#/Python intra-sous-série, Probas (#5916) qui a une mixité intra-série multi-paradigme (.NET C# + Python), QC (#5917) cloisonnée par sous-série, et Sudoku (#5918 / c.388) qui a une mixité jumeaux dominante + 1 compagnon Lean intra-hub, RL a une **uniformité mono-paradigme** avec 7 moteurs SOTA distincts (PyTorch, NumPy, matplotlib, Stable Baselines3, Gymnasium, highway_env, PettingZoo) — registre EPIC #3801 entry #009 (PR #5922 — collision avec PR canonique utilisateur #5925, await ai-01 decision). > @@ -32,6 +32,8 @@ Le RL se comprend mieux en voyant l'agent apprendre. Six visualisations suivent | # | Notebook | Contenu | Durée | |---|----------|---------|-------| | 1 | [rl_1_intro_cartpole](rl_1_intro_cartpole.ipynb) | Introduction PPO, CartPole | 25-30 min | +| 1b | [rl_1b_bitwise_logic_synthesis](rl_1b_bitwise_logic_synthesis.ipynb) | Synthèse logique d'un contrôleur CartPole : bitwise 4-règles — scellement observation→bits IEEE-754, contrôleur LQR de référence (taux de désaccord), PPO budget modeste, étude de rupture et ablation. Accrétion de rl_1 | 20-25 min | +| 1c | [rl_1c_prolog_distillation](rl_1c_prolog_distillation.ipynb) | Distillation d'une politique RL en programme Prolog exécutable : teacher PPO from scratch (seed fixe), census exhaustif de T-bar, induction gloutonne type FOIL, liste de décision avec cuts, one-pass vs DAgger, SWI-Prolog réel journalisé. Accrétion de rl_1 | 45-60 min | | 2 | [rl_2_wrappers_sauvegarde_callbacks](rl_2_wrappers_sauvegarde_callbacks.ipynb) | Wrappers, sauvegarde, callbacks | 35-40 min | | 3 | [rl_3_experience_replay_her](rl_3_experience_replay_her.ipynb) | HER, goal-conditioned RL | 40-45 min | | 4 | [rl_4_multi_armed_bandits](rl_4_multi_armed_bandits.ipynb) | Bandits manchots, exploration vs exploitation, Thompson Sampling | 30-35 min | @@ -42,12 +44,14 @@ Le RL se comprend mieux en voyant l'agent apprendre. Six visualisations suivent | 6d | [rl_6d_sac_from_scratch](rl_6d_sac_from_scratch.html) | SAC depuis zéro, maximum entropy RL, twin Q-networks, auto-température | 45-50 min | | 6e | [rl_6e_grpo_from_scratch](rl_6e_grpo_from_scratch.html) | GRPO depuis zéro (DeepSeek-R1), avantage relatif intra-groupe (sans critic), clip PPO + KL vs référence, portefeuille synthétique multi-seed | 45-50 min | | 7 | [rl_7_multi_agent_rl](rl_7_multi_agent_rl.ipynb) | Multi-Agent RL, PettingZoo, IQL | 45-50 min | +| 7b | [RL-7b-Climbing-Game](RL-7b-Climbing-Game.ipynb) | Sur-généralisation relative dans le Climbing Game coopératif : même agent tabulaire, IQL vs Hysteretic Q-learning, protocole multi-graines, IQM + intervalle bootstrap, ablation du pessimisme | ~45 min | | 8 | [rl_8_model_based_dyna_q](rl_8_model_based_dyna_q.html) | Model-based RL : Dyna-Q, Dyna-Q+, planification, rollouts | 45-50 min | | 9 | [rl_9_offline_rl](rl_9_offline_rl.html) | RL offline : Behavior Cloning, erreur d'extrapolation, BCQ-lite | 50-55 min | | 10 | [rl_10_reward_shaping](rl_10_reward_shaping.html) | Reward Shaping (Ng 1999), curriculum learning, pont RLHF | 45-50 min | | 11 | [rl_11_pomdp](rl_11_pomdp.html) | POMDP, Tiger Problem, belief tracking, Q-MDP | 45-50 min | | 12 | [rl_12_distributional_rl](rl_12_distributional_rl.ipynb) | RL distributionnel : C51 (Categorical DQN) depuis zéro, projection catégorielle, politique CVaR | 50-55 min | | 13 | [rl_13_curiosity_exploration](rl_13_curiosity_exploration.html) | Exploration par curiosité (RND), motivation intrinsèque, piège d'exploitation | 35-40 min | +| 14 | [rl_14_hierarchical_rl](rl_14_hierarchical_rl.ipynb) | Hierarchical RL — l'Option framework de Sutton, Precup & Singh : abstraction temporelle, options `(I, π, β)`, gridworld quatre-pièces, crédit sur longue horizon | ~50 min | | 15 | [rl_15_grpo_group_relative_policy](rl_15_grpo_group_relative_policy.ipynb) | GRPO (Group Relative Policy Optimization) vs PPO sur CartPole-v1 — avantage relatif intra-groupe (sans critic) vs GAE bootstrapé, multi-seed 6 (0/1/7/42/99/123), Wilcoxon signed-rank + IC95% bootstrap. Prong B discrimination moteur. Sous-grain #13436 de l'EPIC #1454. **Verdict v3 (REPAIR c.644) : INCONCLUSIVE** (le claim initial v1 « GRPO BEATS PPO » souffrait de défauts done-mask + pad-mask — c.642 a corrigé en INCONCLUSIVE, puis c.644 a détecté 4 post-fix incohérences résolues : Wilcoxon n=4 inatteignable, verdict tri-state asymmétrique, hypothèse descriptive fausse réfutée, titre PR ré-aligné — verdict v3 INCONCLUSIVE maintenu, moyennes v3 = 299.36 vs 197.65, std = 55.26 vs 104.99) | 40-45 min | | 16 | [rl_16_dream_rsi](rl_16_dream_rsi.ipynb) | Dream-RSI (arXiv 2609.14858, preprint 14/09/2026) : exploration explicite **programmable** (politique = code), historique de découverte = simulateur-replay, **dreaming** = évaluation off-policy à coût zéro, boucle RSI avec incumbent (garantie non-régression replay-only) — monde jouet circle-packing stdlib (16 cercles), ablation replay brut vs guidance sémantique mesurée (3/2/7), chiffres du papier rapportés non canonisés. Distillation #16417 | 40-45 min | | pt-0 | [rlpt_0_reward_model_from_scratch](rlpt_0_reward_model_from_scratch.ipynb) | Reward model from scratch (Bradley-Terry) : apprendre r(x, y) depuis des paires de préférences sur le monde de rlpt_1 — MLE BT sans `trl.RewardTrainer`, évaluation honnête vs plafond de Bayes, calibration (ECE), identification affine, multi-seed 4 | 35-40 min |