diff --git a/MyIA.AI.Notebooks/GameTheory/GameTheory-13-ImperfectInfo-CFR.ipynb b/MyIA.AI.Notebooks/GameTheory/GameTheory-13-ImperfectInfo-CFR.ipynb index cb188e1e95..4c953bd9b1 100644 --- a/MyIA.AI.Notebooks/GameTheory/GameTheory-13-ImperfectInfo-CFR.ipynb +++ b/MyIA.AI.Notebooks/GameTheory/GameTheory-13-ImperfectInfo-CFR.ipynb @@ -8182,6 +8182,21 @@ "print(\"Briques de composition definies : produit cartesien, affine, enveloppe.\")\n" ] }, + { + "cell_type": "markdown", + "id": "md-8-1-verif-produit", + "metadata": {}, + "source": [ + "#### Theoreme 4.1 verifie : la somme des facteurs egale le produit\n", + "\n", + "Les trois briques sont assemblees ; les deux cellules suivantes **mesurent**. Le protocole de la premiere fait tourner deux `MiniRegret` independants pendant $T = 3000$ tours contre des pertes separees legerement correlees (terme $0.05 (x - y)$), puis compare deux quantites que seul le theoreme rend egales :\n", + "\n", + "- $R^X + R^Y$ — le regret du compose **predit par le theoreme**, somme des regrets de chaque facteur contre sa meilleure action pure (au sens de Hannan) ;\n", + "- $R^{X \\times Y}$ en **calcul direct** — le regret de la strategie produit jouee, contre la meilleure action pure du produit sur la meme trajectoire.\n", + "\n", + "L'egalite attendue n'est pas approximative : la minimisation d'une somme de pertes separees se distribue sur les facteurs, donc l'ecart ne doit refleter que l'erreur d'arrondi flottant sur 3000 accumulations — de l'ordre de $10^{-12}$, et non « petit devant les termes ». C'est toute la difference entre verifier une identite et tenir une borne." + ] + }, { "cell_type": "code", "execution_count": 17, @@ -8245,6 +8260,22 @@ "verify_product_decomposition()\n" ] }, + { + "cell_type": "markdown", + "id": "md-8-1-verif-hull", + "metadata": {}, + "source": [ + "#### Equation 4 verifiee : la borne enveloppe convexe\n", + "\n", + "La brique (c) est la seule des trois a porter une **inegalite** : $R^{\\mathrm{co}\\{X,Y\\}} \\le R^{\\Delta^2} + \\max\\{R^X, R^Y\\}$. La verification orchestre deux experts `MiniRegret` ($X$ et $Y$) et leur `ConvexHullMixer`, qui apprend le poids $\\lambda$ melangeant leurs strategies sur le simplexe $\\Delta^2$, puis mesure quatre regrets sur la **meme trajectoire** de pertes :\n", + "\n", + "- $R^X$ et $R^Y$ — le cout de chaque expert contre sa meilleure action pure ;\n", + "- $R^{\\Delta^2}$ — le regret du mixeur : le cout de ses melanges $\\lambda_t$ contre le meilleur expert fixe a posteriori ;\n", + "- $R^{\\mathrm{co}}$ — le regret de la strategie enveloppe **reellement jouee**.\n", + "\n", + "Deux subtilites de code a noter : la strategie enveloppe est capturee **avant** l'appel a `observe` (elle depend de l'etat interne au tour $t$, pas apres la mise a jour), et le regret du mixeur se calcule sur les pertes reelles de chaque expert. La borne doit tenir a $\\varepsilon$ pres ; un depassement serait une erreur d'implementation, pas une faiblesse du theoreme." + ] + }, { "cell_type": "code", "execution_count": 18, diff --git a/MyIA.AI.Notebooks/GameTheory/GameTheory-13d-Optimistic-CFR.ipynb b/MyIA.AI.Notebooks/GameTheory/GameTheory-13d-Optimistic-CFR.ipynb index 929844a797..8bf44a61aa 100644 --- a/MyIA.AI.Notebooks/GameTheory/GameTheory-13d-Optimistic-CFR.ipynb +++ b/MyIA.AI.Notebooks/GameTheory/GameTheory-13d-Optimistic-CFR.ipynb @@ -927,6 +927,22 @@ "" ] }, + { + "cell_type": "markdown", + "id": "md-1-4-dcfr", + "metadata": {}, + "source": [ + "### 1.4 Le champion empirique : DCFR, la mémoire oublieuse\n", + "\n", + "Le pas optimiste ci-dessus offre la meilleure **garantie théorique** ; le §1.3 annonçait que la première place **empirique** reste au DCFR — c'est la cellule suivante qui l'implémente, pour que la confrontation soit loyale. Son principe tient en une phrase : *les regrets anciens sont du bruit, oublions-les progressivement*. Concrètement, la combinaison de Brown & Sandholm (2019) emboîte trois mécanismes :\n", + "\n", + "- un **discount des regrets anciens** par $t/(t+\\alpha)$ — chaque tour pèse relativement plus que le précédent, la somme de regrets s'adapte aux dernières itérations ;\n", + "- un **discount de la somme de stratégies** par $(t/(t+\\beta))^2$ — désactivé par défaut ici ($\\beta = 0$), il ne servirait qu'à ralentir l'uniformisation de la stratégie moyenne ;\n", + "- le **clipping CFR+** ($\\gamma$) — les regrets négatifs sont écrêtés, la mise à jour ne propage que le regret positif accumulé.\n", + "\n", + "L'ironie pédagogique est assumée : le solveur le plus simple conceptuellement — un CFR+ qui oublie — est celui que le benchmark suivant confrontera à l'OFTRL." + ] + }, { "cell_type": "code", "execution_count": 3, @@ -1021,6 +1037,16 @@ " f\"DCFR={cfr_d.get_average_strategy('Q').round(3).tolist()}\")\n" ] }, + { + "cell_type": "markdown", + "id": "md-1-5-benchmark", + "metadata": {}, + "source": [ + "### 1.5 L'instrument de mesure : même budget, même graine\n", + "\n", + "Une comparaison honnête exige de neutraliser tout sauf l'opérateur de mise à jour. La cellule suivante instancie les quatre variantes — CFR, CFR+, DCFR, OFTRL — et les exécute sur Kuhn poker avec un **budget d'itérations identique** et une **graine commune** (`np.random.seed`) : la séquence aléatoire est figée, l'écart final n'est imputable qu'au solveur. Deux mesures sont rapportées : le **temps de calcul** (`perf_counter`) et un **proxy d'exploitabilité** en démo — la norme de l'écart entre la stratégie moyenne apprise sur l'info set `Q` et l'uniforme $[0.5, 0.5]$. Le §1.3 laisse attendre le DCFR en tête ; la section 2 confrontera cette attente aux chiffres." + ] + }, { "cell_type": "code", "execution_count": 4, diff --git a/scripts/notebook_tools/twin_pairs.d/gametheory-13-imperfectinfo-cfr/0013-2026-09-13-myia-po-2024-CoursIA.yaml b/scripts/notebook_tools/twin_pairs.d/gametheory-13-imperfectinfo-cfr/0013-2026-09-13-myia-po-2024-CoursIA.yaml new file mode 100644 index 0000000000..a049e5bb7e --- /dev/null +++ b/scripts/notebook_tools/twin_pairs.d/gametheory-13-imperfectinfo-cfr/0013-2026-09-13-myia-po-2024-CoursIA.yaml @@ -0,0 +1,7 @@ +date: '2026-09-13' +by: myia-po-2024:CoursIA +python_sha: 4c953bd9b121fd1aac9683859e2571c32a9a5f4e +csharp_sha: 62d089558097085b4221f5f53cddb12b0d110d12 +content_python_sha: fcab516dc4e71b5b96fe9a760675a805e4890e736802519fc410bd6a6162bcc2 +content_csharp_sha: d8a93c30da3c647ad3bd8f3567d5394523c73e1a5cf7b4b0f7adfc6ed10961ed +reason: "Markdown-only cote Python (#12797, tranche 2 CFR) : 2 cellules markdown intermediaires inserees dans le run des verifications (briques de composition -> verify_product_decomposition -> verify_hull_bound), aucune cellule code touchee (source/execution_count/outputs verifiees identiques vs origin/main). Cote C# intact (csharp_sha = HEAD). Parite de contenu algorithmique inchangee (niveau semantic). Precedents re-baseline markdown-only sur cette paire : 2026-08-05 (de-pin utilites derniere iteration), 2026-07-25 (doc-honesty cell[30])."