LYCÉE → PRÉPA · L16

Module L16 · Partie H · Intelligence artificielle

Apprentissage par renforcement : apprendre en agissant.

Pas d’exemples étiquetés : un agent agit dans un environnement, reçoit des récompenses, et doit découvrir seul une stratégie qui les maximise. C’est ainsi qu’AlphaGo a battu les champions, qu’un robot apprend à marcher en simulation, et que les assistants IA sont alignés sur les préférences humaines (RLHF). Ce module construit les algorithmes fondamentaux — bandits, programmation dynamique, Q-learning, gradient de politique — sur des environnements simulés dans la page.

Durée : 3 séances · Prérequis : L11 (Markov, espérance), L14. Objectifs : formalisme MDP (états, actions, récompenses, politique, valeur), exploration/exploitation, équations de Bellman, itération de la valeur, Q-learning tabulaire, approximation par réseau (DQN, idée), REINFORCE et acteur-critique, façonnage de récompense, sim-to-real et limites.

Ce que vous saurez faire à la fin
  • Formuler un problème de contrôle comme un MDP.
  • Implémenter itération de la valeur, Q-learning et REINFORCE, et les comparer sur un même environnement.
  • Faire apprendre à un robot simulé à atteindre une cible en évitant des obstacles.
  • Expliquer pourquoi le RL est difficile (crédit temporel, exploration, variance) et ce qu’on fait pour y remédier.

Références : Reinforcement Learning: An Introduction (Sutton & Barto, gratuit), cours de David Silver (DeepMind), « Spinning Up in Deep RL » (OpenAI), CS285 (Berkeley).

Fiche de cours · Définitions

Apprentissage par renforcement : définitions

Définition (processus de décision markovien, MDP). (S, A, P, R, γ) : états, actions, transitions P(s′ | s, a), récompense R(s, a) (ou r(s, a, s′)), facteur d’actualisation γ ∈ [0, 1[. Propriété de Markov : le futur ne dépend que de l’état courant et de l’action.
Définition (politique, retour, fonctions de valeur). Politique π(a | s). Retour Gt = Σk≥0 γk rt+k+1. Vπ(s) = Eπ[Gt | st = s] ; Qπ(s, a) = Eπ[Gt | st = s, at = a]. Politique optimale π* : Vπ* ≥ Vπ pour tout π et tout s ; V* et Q* ses fonctions de valeur ; π*(s) = argmaxa Q*(s, a).
Définition (exploration/exploitation). ε-glouton : action aléatoire avec probabilité ε, sinon argmax. UCB : argmax Q̂(a) + c√(ln t / N(a)). Softmax/Boltzmann sur Q. Le regret mesure la perte cumulée par rapport à la meilleure action.
Définition (méthodes). Programmation dynamique (modèle connu) : itération de valeur, de politique. Monte-Carlo : moyenne des retours d’épisodes complets. Différences temporelles (TD) : mise à jour vers r + γV(s′). Q-learning (hors politique) : Q(s, a) ← Q + α[r + γ maxa′ Q(s′, a′) − Q(s, a)] ; SARSA (sur politique) : cible r + γQ(s′, a′). Gradient de politique (REINFORCE, actor-critic) : optimiser directement πθ.
Définition (approximation de fonction). Quand S est grand ou continu, V ou Q est représentée par un modèle paramétrique (linéaire, réseau) : DQN (Q-réseau + mémoire de rejeu + réseau cible), PPO (gradient de politique avec ratio borné).

Fiche de cours · Formules

Équations à connaître

Bellman (évaluation) : Vπ(s) = Σa π(a|s) Σs′ P(s′|s,a)[R(s,a) + γVπ(s′)]
Bellman (optimalité) : V*(s) = maxa Σs′ P(s′|s,a)[R(s,a) + γV*(s′)] ; Q*(s,a) = Σs′ P(s′|s,a)[R(s,a) + γ maxa′ Q*(s′,a′)]
Itération de valeur : Vk+1 = T Vk avec (TV)(s) = maxa Σ P[R + γV(s′)] ; ‖Vk − V*‖ ≤ γk‖V₀ − V*‖
TD(0) : V(s) ← V(s) + α[r + γV(s′) − V(s)] ; l’erreur TD δ = r + γV(s′) − V(s)
Q-learning : Q(s,a) ← Q(s,a) + α[r + γ maxa′ Q(s′,a′) − Q(s,a)]
Gradient de politique : ∇θ J(θ) = Eπθtθ log πθ(at|st)·(Gt − b(st))] b : ligne de base (souvent V(s)) qui réduit la variance sans biais ; Gt − V(st) ≈ avantage A(s,a)
Horizon effectif : 1/(1 − γ) — γ = 0,99 ⇒ ≈ 100 pas comptent
Regret de UCB1 sur un bandit à K bras : O(√(K t ln t)) ; regret de ε-glouton constant : Θ(εt)

Fiche de cours · Théorèmes et démonstrations

Démonstrations à savoir refaire (1/2)

Théorème 1 (l’opérateur de Bellman est une contraction). Pour V, W : S → ℝ, ‖TV − TW‖ ≤ γ‖V − W‖. Conséquence : T a un unique point fixe V*, et l’itération de valeur converge géométriquement vers lui depuis n’importe quel V₀.
Pour tout s : |(TV)(s) − (TW)(s)| = |maxa fV(a) − maxa fW(a)| ≤ maxa |fV(a) − fW(a)| (le max est 1-lipschitzien), avec fV(a) = Σs′ P(s′|s,a)[R + γV(s′)]. Or fV(a) − fW(a) = γ Σs′ P(s′|s,a)(V(s′) − W(s′)), une moyenne pondérée de différences, donc ≤ γ‖V − W‖ en valeur absolue. Point fixe : (S fini) ℝ|S| muni de ‖·‖ est complet ; théorème du point fixe de Banach : unique V* avec TV* = V*, et ‖Vk − V*‖ = ‖TkV₀ − TkV*‖ ≤ γk‖V₀ − V*‖. Pour une précision ε il faut k ≈ log(‖V₀ − V*‖/ε)/log(1/γ) itérations — d’autant plus que γ est proche de 1.
Théorème 2 (amélioration de politique). Si π′(s) = argmaxa Qπ(s, a) pour tout s, alors Vπ′ ≥ Vπ ; et si l’égalité a lieu partout, π est optimale.
Par construction Qπ(s, π′(s)) ≥ Qπ(s, π(s)) = Vπ(s). Déroulons : Vπ(s) ≤ Qπ(s, π′(s)) = E[r₁ + γVπ(s₁) | π′] ≤ E[r₁ + γQπ(s₁, π′(s₁))] = E[r₁ + γr₂ + γ²Vπ(s₂)] ≤ … ≤ Eπ′[Σ γkrk+1] = Vπ′(s), où l’on suit π′ un pas de plus à chaque inégalité (γk → 0 fait disparaître le reste). Si Vπ′ = Vπ, alors Vπ(s) = maxa Qπ(s, a) : Vπ vérifie l’équation d’optimalité, donc Vπ = V* par unicité (Théorème 1). C’est la justification de l’itération de politique (évaluer, améliorer, répéter) qui converge en un nombre fini d’étapes (nombre fini de politiques déterministes).

Fiche de cours · Théorèmes et démonstrations

Démonstrations à savoir refaire (2/2)

Théorème 3 (théorème du gradient de politique, version épisodique). Pour J(θ) = Eτ∼πθ[R(τ)] avec R(τ) le retour d’une trajectoire τ = (s₀, a₀, s₁, …) : ∇θJ = Eτ[R(τ) Σtθ log πθ(at|st)].
J(θ) = Στ pθ(τ)R(τ). ∇J = Στ ∇pθ(τ)R(τ) = Στ pθ(τ)∇log pθ(τ)R(τ) (astuce du logarithme : ∇p = p∇log p) = Eτ[∇log pθ(τ)R(τ)]. Or pθ(τ) = p(s₀)Πt πθ(at|st)P(st+1|st,at) ; le log est une somme et les termes de dynamique ne dépendent pas de θ : ∇log pθ(τ) = Σt ∇log πθ(at|st). On n’a pas besoin de connaître P : l’estimateur ne demande que des trajectoires échantillonnées. Raffinements : remplacer R(τ) par Gt (les actions n’influencent pas les récompenses passées — causalité) et soustraire une ligne de base b(st).
Théorème 4 (une ligne de base ne biaise pas). Ea∼πθ(·|s)[∇log πθ(a|s)·b(s)] = 0.
Σa πθ(a|s)∇log πθ(a|s) b(s) = b(s) Σa ∇πθ(a|s) = b(s)∇Σa πθ(a|s) = b(s)∇1 = 0. La ligne de base ne change donc pas l’espérance mais peut réduire considérablement la variance (elle recentre les retours autour de 0 : une action n’est renforcée que si elle fait mieux que prévu). Le choix b = V(s) donne l’avantage A = Q − V et les méthodes actor-critic.
Théorème 5 (convergence du Q-learning tabulaire — énoncé). Si chaque couple (s, a) est visité infiniment souvent et si les pas αt vérifient Σαt = ∞ et Σαt² < ∞, alors Qt → Q* avec probabilité 1 (Watkins & Dayan 1992).
(Idée.) La mise à jour est une approximation stochastique du point fixe de l’opérateur de Bellman pour Q, qui est une γ-contraction (même preuve que le Théorème 1) ; les conditions sur α sont celles de Robbins-Monro (assez de pas pour progresser, décroissants pour que le bruit s’annule). La condition de visite infinie est celle qui impose l’exploration : sans elle, un couple jamais essayé garde sa valeur initiale.

Fiche de cours · Méthodes

Méthodes et pièges

Méthode — formuler un problème en MDP. État : tout ce dont dépend le futur (position, vitesse, et l’historique nécessaire — sinon Markov est violé). Actions : discrètes si possible au début. Récompense : dense plutôt que rare (mais attention au reward hacking : le robot maximise ce que vous avez écrit, pas ce que vous vouliez). γ selon l’horizon utile. Épisodes : conditions de fin claires.
Méthode — choisir un algorithme. Modèle connu et petit → itération de valeur. Petit espace discret, modèle inconnu → Q-learning tabulaire. Grand espace, actions discrètes → DQN. Actions continues (robot) → PPO / SAC. Peu de données réelles → simulateur + transfert sim-to-real (randomisation de domaine).
Méthode — déboguer un agent. Commencer par un environnement trivial (couloir de 5 cases) où la solution est connue ; vérifier que V* calculée par itération de valeur coïncide avec l’apprise ; tracer la récompense par épisode lissée sur 5 graines ; vérifier l’exploration (ε décroissant, jamais 0 pendant l’apprentissage) ; contrôler l’échelle des récompenses (normaliser).

Pièges : γ = 1 sur des épisodes infinis (valeurs infinies) ; état non markovien (vitesse manquante) ; récompense qui récompense un proxy (« se rapprocher » → tourner en rond près du but) ; surestimation des Q par le max (double Q-learning) ; comparer des agents sur une seule graine ; oublier que le simulateur n’est pas la réalité.

Fiche de cours · Exercices corrigés

Exercices corrigés

Exercice 1. Couloir à 3 états (1, 2, 3), 3 terminal avec récompense +1 à l’entrée ; actions G/D déterministes (rester si mur), récompense 0 sinon, γ = 0,9. Calculer V* par itération de valeur depuis V₀ = 0 (deux itérations suffisent-elles ?) et π*.
Correction. V(3) = 0 (terminal). Itération 1 : V₁(2) = max(γV₀(1), 1 + γ·0) = 1 ; V₁(1) = max(γV₀(1), γV₀(2)) = 0. Itération 2 : V₂(2) = max(0,9·0, 1) = 1 ; V₂(1) = max(0,9·0, 0,9·1) = 0,9. Itération 3 : inchangé — point fixe : V* = (0,9 ; 1 ; 0). π* = D partout. Vérification par Bellman : V*(1) = γV*(2) = 0,9 ✓. Le nombre d’itérations nécessaires est la longueur du plus long chemin optimal (l’information se propage d’un état par itération), borné par γk en général.
Exercice 2. Un agent Q-learning avec α = 0,5, γ = 0,9, Q initialisée à 0, observe la transition (s = 1, a = D, r = 0, s′ = 2) puis (2, D, 1, 3), puis à nouveau (1, D, 0, 2). Donner les valeurs de Q après chaque mise à jour.
Correction. (1) Q(1, D) ← 0 + 0,5[0 + 0,9·max Q(2, ·) − 0] = 0,5·0 = 0. (2) Q(2, D) ← 0 + 0,5[1 + 0,9·0 − 0] = 0,5. (3) Q(1, D) ← 0 + 0,5[0 + 0,9·0,5 − 0] = 0,225. La valeur se propage à rebours d’une transition par visite : c’est pourquoi le rejeu d’expérience (revoir les anciennes transitions) et les traces d’éligibilité accélèrent l’apprentissage. Limite : Q(2, D) → 1, Q(1, D) → 0,9.
Exercice 3. Bandit à 2 bras de moyennes 0,6 et 0,5 (Bernoulli). Comparer le regret attendu après 1 000 tirages de : ε-glouton avec ε = 0,1 (en supposant qu’il identifie vite le meilleur bras) ; UCB1. Que se passe-t-il si les moyennes sont 0,6 et 0,59 ?
Correction. Regret par tirage du mauvais bras : Δ = 0,1. ε-glouton : tire le mauvais bras avec probabilité ε/2 = 0,05 à chaque pas (après identification) : regret ≈ 0,05·0,1·1 000 = 5, linéaire en t. UCB1 : le mauvais bras est tiré O(ln t/Δ²) fois ≈ 8·ln(1000)/0,01 ≈ 5 500 fois selon la borne (pessimiste : elle dépasse t !) — en pratique quelques dizaines à centaines : regret de l’ordre de 5 à 15, mais logarithmique en t, donc meilleur à long terme. Avec Δ = 0,01 : distinguer les bras exige ≈ 1/Δ² = 10⁴ tirages ; sur 1 000 pas aucun algorithme ne peut faire mieux qu’un regret ≈ 0,01·500 = 5 — et ce n’est pas grave : perdre 0,01 par tirage sur un bras presque aussi bon est peu coûteux. Le regret dépend de Δ, pas seulement de l’algorithme.

01 / Le problème

Bandits : le dilemme exploration / exploitation, isolé

Le dilemme

Exploiter = jouer le bras qu’on croit le meilleur ; explorer = en essayer d’autres pour vérifier. Le glouton pur se bloque sur un bras médiocre si les premiers tirages ont été malchanceux. ε-glouton explore au hasard, à taux constant : regret linéaire. UCB explore les bras incertains (bonus √(ln t / n)) : regret logarithmique, prouvé optimal à constante près. Ce dilemme est partout : essais cliniques, publicité, choix de la prochaine expérience scientifique, et chaque décision d’un robot qui apprend.

01 / Le problème

Le MDP et l’environnement du module : un robot sur une grille

Le formalisme

Un processus de décision markovien : états S, actions A, transitions P(s′ | s, a), récompenses R(s, a, s′), facteur d’actualisation γ ∈ [0, 1[. Une politique π(a | s) dit quoi faire. On cherche π qui maximise le retour espéré G = Σ γᵗ rₜ. γ < 1 rend la somme finie et exprime que « 10 maintenant vaut plus que 10 dans 100 pas ». Les récompenses négatives par pas (−0,1) poussent à aller vite : le façonnage de récompense est un art — une récompense mal choisie et le robot apprend à tourner en rond pour collecter des points.

02 / Avec modèle

Équations de Bellman et itération de la valeur

Pourquoi ça converge

L’opérateur de Bellman T(V)(s) = max_a Σ p(r + γV(s′)) est une contraction de facteur γ pour la norme sup : ‖T(V) − T(W)‖ ≤ γ‖V − W‖. Par le théorème du point fixe de Banach, itérer converge géométriquement vers l’unique V* — une preuve d’une page, classique en prépa. La politique gloutonne par rapport à V* est optimale. Cette approche (programmation dynamique, module L04) exige de connaître le modèle P et R et d’énumérer les états : impossible pour un robot réel (états continus, modèle inconnu). D’où la suite.

03 / Sans modèle

Q-learning : apprendre la valeur des actions par essais

La différence temporelle

Q(s, a) estime le retour si on fait a dans s puis on joue au mieux. Après une transition (s, a, r, s′), la cible r + γ max Q(s′, ·) est une meilleure estimation que Q(s, a) : on s’en rapproche d’un pas α. C’est une version stochastique de l’itération de la valeur, qui ne demande que des échantillons. Q-learning est hors-politique : il apprend la valeur de la politique gloutonne même en explorant au hasard. Converge vers Q* si chaque (s, a) est visité infiniment souvent et α décroît convenablement (Watkins, 1989). Avec un réseau de neurones à la place de la table (DQN, 2015 : Atari depuis les pixels), la convergence n’est plus garantie ; on stabilise avec un tampon de rejeu et un réseau cible.

03 / Sans modèle

Approximation : Q-learning avec un réseau (DQN en miniature)

L’approximation linéaire sur des tuiles est l’ancêtre du DQN ; remplacer f @ W par un réseau du module L14 donne le DQN. Le rejeu d’expérience casse la corrélation entre transitions successives (les données ne sont plus i.i.d., ce que la descente de gradient suppose) : c’est l’une des deux astuces qui ont fait marcher Atari.

04 / Politiques

Gradient de politique : REINFORCE

Valeur ou politique ?

Q-learning apprend des valeurs et en déduit une politique déterministe : efficace en échantillons, mais limité aux actions discrètes et parfois instable avec des réseaux. Le gradient de politique optimise directement une politique stochastique, marche en actions continues (couples moteurs !), mais souffre d’une variance énorme (un épisode entier pour une estimation). Les méthodes acteur-critique combinent les deux : l’acteur (politique) est corrigé par un critique (valeur) qui remplace G par une estimation moins bruitée. PPO (2017), l’algorithme du RLHF et de la marche des robots, est un acteur-critique qui limite la taille de chaque mise à jour.

04 / Politiques

Le RL pour de vrais robots : ce qui marche et ce qui casse

DifficultéPourquoiRéponse
ÉchantillonsDes millions d’essais ; un vrai robot en fait 1 par minute et s’useSimulation massivement parallèle (Isaac Gym : 4000 robots en parallèle sur un GPU), puis transfert
Sim-to-realLa simulation n’est jamais exacte (frottements, retards, capteurs)Randomisation de domaine : entraîner sur des milliers de simulateurs légèrement différents
Récompense« Atteindre la cible » est rare ; le robot n’apprend rienFaçonnage (distance à la cible), curriculum (tâches faciles d’abord), démonstrations humaines
SécuritéExplorer = parfois se jeter dans le murContraintes, apprentissage hors ligne sur des données passées, bouclier de sécurité (module L21)
Récompense piratéeL’agent trouve une faille : marquer des points sans faire la tâcheSpécifier avec soin, surveiller, préférences humaines (RLHF)

Succès : quadrupèdes qui marchent sur tous terrains (ETH Zurich, 2022), mains qui résolvent un Rubik’s cube (OpenAI, 2019), drones de course qui battent les champions (UZH, 2023), AlphaGo/AlphaZero, contrôle du plasma d’un tokamak (DeepMind, 2022). Le RLHF des LLM est le même algorithme (PPO) avec un « environnement » qui est un modèle de récompense appris sur des préférences humaines.

Cours

Cours 1 — Le MDP en détail : retour, valeur, optimalité, et les deux équations de Bellman

ObjetDéfinitionRemarque
RetourGt = rt+1 + γ rt+2 + γ² rt+3 + … = rt+1 + γ Gt+1La forme récursive est la clé de tout
Valeur d’étatVπ(s) = Eπ[Gt | st = s]Ce que rapporte s en suivant π
Valeur d’actionQπ(s, a) = Eπ[Gt | st = s, at = a]Vπ(s) = Σa π(a|s) Qπ(s, a)
Bellman (évaluation)Vπ(s) = Σa π(a|s) Σs′ P(s′|s,a) [r + γ Vπ(s′)]Système linéaire : (I − γPπ) V = Rπ, résoluble exactement (L10)
Bellman (optimalité)V*(s) = maxa Σs′ P(s′|s,a) [r + γ V*(s′)]Non linéaire (le max) : itération de la valeur
Politique optimaleπ*(s) = argmaxa Q*(s, a)Il en existe toujours une déterministe (MDP fini)
Itération de la politiqueÉvaluer π (système linéaire) puis améliorer (glouton) ; répéterConverge en peu d’itérations ; chaque évaluation est exacte

Cours

Cours 2 — Exemple travaillé : dériver le gradient de politique (REINFORCE)

Objectif. Maximiser J(θ) = Eτ∼πθ[R(τ)], l’espérance du retour sur les trajectoires τ = (s0, a0, s1, …).

Étape 1 — probabilité d’une trajectoire. P(τ | θ) = p(s0) Πt πθ(at|st) P(st+1|st, at). Seuls les facteurs π dépendent de θ.

Étape 2 — l’astuce du log.θ J = ∇ Στ P(τ|θ) R(τ) = Στ P(τ|θ) ∇log P(τ|θ) R(τ) = Eτ[∇log P(τ|θ) R(τ)], car ∇P = P ∇log P.

Étape 3 — ne garder que la politique. ∇log P(τ|θ) = Σt ∇log πθ(at|st) (les termes de dynamique disparaissent : on n’a pas besoin de connaître P). Donc ∇J = E[Σt ∇log πθ(at|st) · R(τ)].

Étape 4 — causalité et ligne de base. L’action at n’influence pas les récompenses passées : on remplace R(τ) par Gt (retour à partir de t) sans changer l’espérance. Retrancher une ligne de base b(st) ne change pas l’espérance non plus (E[∇log π · b] = b ∇Σaπ = 0) mais réduit la variance : d’où l’avantage At = Gt − V(st), et l’acteur-critique quand V est appris.

Résultat. ∇J ≈ (1/N) Σtrajectoires Σt ∇log πθ(at|st) (Gt − b) : une estimation Monte-Carlo (L11) qu’on monte par gradient. Pour un softmax, ∇θlog π(a|s) = onehot(a) − π(·|s) : c’est la ligne grad_log = -p; grad_log[a] += 1 du cours.

Cours

Cours 3 — Concevoir une récompense et un environnement : la partie que personne n’enseigne

QuestionBonne pratiqueAnti-exemple
Que veut-on vraiment ?Récompense terminale sur le résultat (tâche accomplie), éventuellement + un faible coût par pasRécompenser la vitesse des roues (le robot tourne sur place très vite)
Le signal est-il trop rare ?Façonnage potentiel : F = γΦ(s′) − Φ(s) (Ng 1999) ne change pas la politique optimale ; Φ = −distance au but+1 « pour se rapprocher » sans −1 pour s’éloigner : le robot fait des allers-retours
L’état est-il markovien ?Inclure vitesses, dernière action, éventuellement une fenêtre d’observationsPosition seule pour un pendule : impossible de connaître le sens du mouvement
ÉchellesNormaliser observations et récompenses ; γ tel que 1/(1−γ) ≈ horizon utileγ = 0,99 pour une tâche de 10 pas, ou 0,5 pour une tâche de 500
Fin d’épisodeDistinguer « terminé » (état absorbant : pas de bootstrap) et « tronqué » (limite de temps : bootstrap sur V(s′))Traiter la limite de temps comme une fin réelle biaise la valeur
ÉvaluationPolitique gloutonne, sans exploration, sur des graines séparées, courbes avec écart-typeRapporter le retour d’entraînement d’une seule graine
SécuritéContraintes dures hors de l’apprentissage (L21) ; simulation d’abordApprendre par essais-erreurs sur le vrai robot près d’un escalier

TP guidé

TP — Gymnasium et Stable-Baselines3 : de CartPole à un robot simulé (sur PC, 3 h)

Exercices

Exercices auto-corrigés — programmation dynamique

Exercice 1 — Évaluer et améliorer une politique

Sur un MDP à 3 états donné explicitement, écrivez evaluer_politique(P, R, pi, gamma) (système linéaire) et amelioration(P, R, V, gamma) (politique gloutonne). Vérifiez que l’itération de la politique converge vers la même valeur que l’itération de la valeur (que vous écrivez aussi : iteration_valeur_mat).

Correction
def evaluer_politique(P, R, pi, gamma):
    n = len(pi); Ppi = np.array([P[pi[s]][s] for s in range(n)]); Rpi = np.array([R[pi[s]][s] for s in range(n)])
    return np.linalg.solve(np.eye(n) - gamma * Ppi, Rpi)
def amelioration(P, R, V, gamma):
    return np.argmax([R[a] + gamma * P[a] @ V for a in range(len(P))], axis=0)
def iteration_valeur_mat(P, R, gamma, tol=1e-10):
    V = np.zeros(len(R[0]))
    while True:
        V2 = np.max([R[a] + gamma * P[a] @ V for a in range(len(P))], axis=0)
        if np.abs(V2 - V).max() < tol: return V2
        V = V2

Exercice 2 — Le plus court chemin stochastique par itération de la valeur

Un robot sur une ligne de 0 à 10 doit atteindre 10. Action « avancer » : +1 avec probabilité 0,8, −1 sinon (min 0) ; action « sauter » : +3 avec probabilité 0,5, 0 sinon ; coût 1 par pas (récompense −1), γ = 1. temps_attendu() renvoie le nombre de pas espéré depuis 0 sous la politique optimale et la politique elle-même (liste de 10 actions).

Correction
def temps_attendu():
    V = np.zeros(11)
    for _ in range(2000):
        V2 = V.copy()
        for s in range(10):
            av = 1 + 0.8 * V[min(s + 1, 10)] + 0.2 * V[max(s - 1, 0)]
            sa = 1 + 0.5 * V[min(s + 3, 10)] + 0.5 * V[s]
            V2[s] = min(av, sa)
        V = V2
    pol = ["avancer" if 1 + 0.8 * V[min(s + 1, 10)] + 0.2 * V[max(s - 1, 0)] <= 1 + 0.5 * V[min(s + 3, 10)] + 0.5 * V[s] else "sauter" for s in range(10)]
    return V[0], pol

Ici on minimise un coût (temps) : le « max » de Bellman devient un « min ». Sauter vaut 1,5 cases par pas en moyenne contre 0,6 : sauter presque partout, sauf près du but où dépasser ne coûte rien (10 est absorbant).

Exercices

Exercices auto-corrigés — apprentissage

Exercice 3 — SARSA contre Q-learning sur la falaise

Grille 4×12 « cliff walking » (Sutton & Barto) : départ en bas à gauche, but en bas à droite, la ligne du bas entre les deux est une falaise (−100, retour au départ), −1 par pas. Implémentez sarsa (sur-politique : cible r + γ Q(s′, a′) avec a′ l’action réellement choisie ε-gloutonne) et réutilisez q_learning (hors-politique). Avec ε = 0,1 fixe, SARSA apprend le chemin sûr (loin de la falaise) et Q-learning le chemin optimal mais risqué : vérifiez en comptant les chutes pendant l’apprentissage.

Correction
def apprendre(algo, episodes=500, eps=0.1, alpha=0.5, gamma=1.0):
    Q = {(i, j): np.zeros(4) for i in range(H) for j in range(W)}; chutes = 0
    choisir = lambda s: int(rng.integers(4)) if rng.random() < eps else int(np.argmax(Q[s]))
    for _ in range(episodes):
        s = DEP; a = choisir(s); fini = False
        while not fini:
            s2, r, fini, chute = pas_falaise(s, a); chutes += chute; a2 = choisir(s2)
            cible = r + (0 if fini else gamma * (Q[s2][a2] if algo == "sarsa" else Q[s2].max()))
            Q[s][a] += alpha * (cible - Q[s][a]); s, a = s2, a2
    return Q, chutes

Exercice 4 — Un critique appris pour REINFORCE

Sur le bandit contextuel suivant (3 contextes, 3 actions, récompenses moyennes dans R), implémentez reinforce_critique(iters) : politique softmax par contexte, ligne de base V(contexte) apprise par moyenne mobile des récompenses ; comparez la variance de l’estimateur du gradient avec et sans ligne de base (mesurée sur 2000 échantillons sous la politique uniforme, ligne de base = récompense moyenne du contexte), et vérifiez que la politique finale choisit la meilleure action dans chaque contexte.

Correction
def reinforce_critique(iters=4000, lr=0.1):
    theta = np.zeros((3, 3)); V = np.zeros(3)
    for _ in range(iters):
        c = rng.integers(3); p = np.exp(theta[c]) / np.exp(theta[c]).sum(); a = rng.choice(3, p=p)
        r = R[c, a] + rng.normal(0, 0.3); g = -p; g[a] += 1
        theta[c] += lr * g * (r - V[c]); V[c] += 0.05 * (r - V[c])
    c = 0; p = np.ones(3) / 3; b = R[c].mean(); sans, avec = [], []          # variance de l'estimateur sous la politique uniforme
    for _ in range(2000):
        a = rng.choice(3, p=p); r = R[c, a] + rng.normal(0, 0.3); g = -p[0] + (a == 0)
        sans.append(g * r); avec.append(g * (r - b))
    return theta, V, float(np.var(sans)), float(np.var(avec))

05 / Défis

Défi ★ — Sensibilité aux hyperparamètres et à la récompense

Consigne

1) Relancez Q-learning avec γ = 0,5 et γ = 0,99 : comment change la politique ? Avec α = 0,5 ? Sans exploration (ε = 0) ? 2) Changez la récompense par pas de −0,1 à 0 puis à +0,05 : que fait le robot ? 3) Rendez la grille plus glissante (glisse = 0,4) : la politique optimale évite-t-elle davantage les trous ? Comparez itération de la valeur et Q-learning.

Ce qu’on observe

γ petit : myope, ignore la charge lointaine et se contente d’éviter les trous. γ proche de 1 : planifie loin. α grand : bruyant, oscille. ε = 0 : se bloque sur le premier chemin trouvé. Récompense par pas positive : le robot apprend à ne jamais arriver (il collecte +0,05 indéfiniment) — c’est le piratage de récompense le plus simple. Glisse 0,4 : la politique optimale longe les bords loin des trous, quitte à faire plus de pas.

05 / Défis

Défi ★★ — Acteur-critique et le pendule

Consigne

Environnement : le pendule inversé linéarisé du module L12 (état (θ, θ̇) continu, action = force parmi {−5, 0, +5}, récompense +1 par pas tant que |θ| < 0,3, épisode de 200 pas max). 1) Représentez l’état par des tuiles gaussiennes 2D (8×8). 2) Implémentez un acteur-critique : critique V(s) = w·f(s) mis à jour par TD ; acteur softmax(θ·f(s)) mis à jour par ∇log π · (r + γV(s′) − V(s)) (l’avantage TD). 3) Tracez la durée des épisodes : le pendule tient-il 200 pas ? 4) Comparez au PD du module L12 : le RL a-t-il redécouvert un contrôleur ?

Correction (extrait)
cx, cv = np.meshgrid(np.linspace(-0.3, 0.3, 8), np.linspace(-2, 2, 8))
def f(s): return np.exp(-((s[0] - cx.ravel()) / 0.1)**2 - ((s[1] - cv.ravel()) / 0.7)**2)
FORCES = [-5, 0, 5]; w = np.zeros(64); theta = np.zeros((64, 3)); gamma = 0.98; durees = []
for ep in range(600):
    s = np.array([rng.uniform(-0.05, 0.05), 0.0]); k = 0
    while k < 200 and abs(s[0]) < 0.3:
        fs = f(s); p = np.exp(theta.T @ fs - (theta.T @ fs).max()); p /= p.sum()
        a = int(rng.choice(3, p=p)); s2 = pendule_pas(s, FORCES[a]); fini = abs(s2[0]) >= 0.3
        r = 1.0; delta = r + (0 if fini else gamma * w @ f(s2)) - w @ fs        # erreur TD = avantage
        w += 0.02 * delta * fs
        grad = -p; grad[a] += 1; theta += 0.02 * delta * np.outer(fs, grad)
        s = s2; k += 1
    durees.append(k)
print("durée moyenne des 50 derniers épisodes :", np.mean(durees[-50:]))

Après quelques centaines d’épisodes, la politique apprise pousse à droite quand θ > 0 ou θ̇ > 0 : elle a redécouvert la structure d’un régulateur PD, sans connaître la physique. Avec un réseau et PPO, la même recette fait marcher un robot à 12 moteurs.

05 / Défis

Défi ★★★ — Esprit prépa : preuve de convergence et planification par recherche arborescente

Consigne

1) Prouvez que l’opérateur de Bellman est une contraction pour la norme sup et déduisez-en la convergence de l’itération de la valeur avec une borne ‖V_k − V*‖ ≤ γᵏ‖V_0 − V*‖ ; vérifiez numériquement la borne sur la grille. 2) Implémentez la recherche arborescente Monte-Carlo (MCTS, l’algorithme d’AlphaGo) sur la grille : depuis l’état courant, simuler des trajectoires aléatoires, construire un arbre, choisir les actions par UCB (sélection), étendre, simuler, rétropropager les retours ; jouer l’action la plus visitée. Comparez à la politique optimale avec un budget de 200 simulations par décision. 3) Discutez : AlphaZero combine MCTS (planification) et un réseau (valeur + politique appris par auto-jeu). Pourquoi la combinaison bat-elle chacun des deux seuls ?

Correction (extrait : MCTS)
def mcts(env, racine, simulations=200, gamma=0.95, c=1.4, horizon=30):
    N, W = {}, {}                                                # visites et somme des retours par (état, action)
    def deroulement(s, k):
        G, fac = 0.0, 1.0
        for _ in range(k):
            if env.terminal(s): break
            s, r, _ = env.pas(s, int(rng.integers(4))); G += fac * r; fac *= gamma
        return G
    for _ in range(simulations):
        s, chemin, fac, G = racine, [], 1.0, 0.0
        for prof in range(horizon):
            if env.terminal(s): break
            n_s = sum(N.get((s, a), 0) for a in range(4))
            if any((s, a) not in N for a in range(4)):
                a = [a for a in range(4) if (s, a) not in N][0]; N[(s, a)] = 0; W[(s, a)] = 0.0
                s2, r, _ = env.pas(s, a); chemin.append((s, a, fac)); G += fac * r; fac *= gamma
                G += fac * deroulement(s2, horizon - prof); break                    # extension + simulation
            a = max(range(4), key=lambda a: W[(s, a)] / N[(s, a)] + c * math.sqrt(math.log(n_s + 1) / N[(s, a)]))
            s2, r, _ = env.pas(s, a); chemin.append((s, a, fac)); G += fac * r; fac *= gamma; s = s2
        for s_, a_, fac_ in chemin:                                   # rétropropagation
            N[(s_, a_)] += 1; W[(s_, a_)] += G
    return max(range(4), key=lambda a: N.get((racine, a), 0))

s, G, k, fini = (0, 0), 0.0, 0, False
while not fini and k < 50:
    a = mcts(env, s); s, r, fini = env.pas(s, a); G += 0.95**k * r; k += 1
print("MCTS : retour", round(G, 2), "en", k, "pas")

MCTS planifie en ligne à partir d’un simulateur, sans apprentissage ; il est fort quand on peut simuler beaucoup. Un réseau appris guide la sélection (politique) et remplace les déroulements aléatoires (valeur) : l’arbre devient étroit et profond. Réciproquement, MCTS produit des cibles d’entraînement meilleures que le réseau seul : la boucle d’auto-amélioration d’AlphaZero. L’article (Silver et al., 2017, Nature) est lisible avec les outils de ce module.

06 / Vérification

Pourquoi dit-on que Q-learning est « hors-politique » ?

Deux questions supplémentaires

1. Que se passe-t-il avec une récompense de +1 par pas et pas de fin d’épisode ? L’agent maximise la durée : il évite d’arriver. La récompense doit refléter ce qu’on veut vraiment.

2. Pourquoi une ligne de base réduit-elle la variance de REINFORCE sans biais ? E[∇log π · b] = b·∇Σπ = b·∇1 = 0.

Référence

Les mots à retenir

MotDéfinition
MDPÉtats, actions, transitions, récompenses, γ.
Politique / valeur / QQuoi faire / retour espéré d’un état / d’un couple état-action.
BellmanV(s) = max_a Σ p (r + γ V(s′)) ; opérateur contractant.
Exploration / exploitationε-glouton, UCB, Thompson.
Différence temporelleMise à jour vers r + γ V(s′).
Q-learning / DQNHors-politique, tabulaire / avec réseau, rejeu et réseau cible.
REINFORCE / acteur-critique / PPOGradient de politique ; avec critique ; avec pas limité.
Façonnage de récompenseRécompenses intermédiaires guidant l’apprentissage — à manier avec soin.
Sim-to-realTransfert simulation → robot réel ; randomisation de domaine.
MCTSPlanification par simulations et arbre, sélection UCB.
RLHFRL sur un modèle de récompense appris de préférences humaines.

Pour continuer

Vous savez faire apprendre par l’action

Module suivant : recherche et IA symbolique — minimax et alpha-bêta, satisfaction de contraintes, SAT, planification : l’autre moitié de l’IA, celle qui raisonne.

À faire chez soi

← L15SommaireL17 : Recherche et IA symbolique →