Module 9 — Acteur-critique, A2C et PPO
REINFORCE fonctionne mais gaspille : haute variance, gradients sur épisode complet, données jetées après chaque mise à jour. Trois avancées successives — l'introduction d'un critique, l'algorithme A2C, puis l'objectif tronqué de PPO — transforment le gradient de politique en méthode compétitive sur les problèmes réels. C'est le canon des algorithmes de renforcement profond aujourd'hui.
L'avantage : la meilleure réduction de variance
Au module 8, la ligne de base était la moyenne des retours. Elle peut mieux : utiliser , la valeur de l'état.
L'avantage répond à une question précise : « en jouant dans , ai-je fait mieux ou moins bien que la moyenne de ce que ferait ici ? ». Un avantage positif renforce l'action, un négatif l'affaiblit. C'est mesurer un écart plutôt qu'une somme, et l'écart varie beaucoup moins.
En pratique on n'a pas . Une estimation TD à un pas donne . Cette estimation biaisée mais peu variable est le point de départ de A2C. La méthode GAE (generalized advantage estimation) interpole entre biais et variance par un paramètre ; redonne Monte-Carlo, redonne TD à un pas.
Acteur-critique : deux réseaux, un signal commun
L'idée est simple : deux réseaux.
L'acteur est la politique . Il apprend par gradient de politique.
Le critique est la fonction de valeur . Il apprend par régression sur les retours observés, comme un problème supervisé standard.
Les deux se nourrissent mutuellement : le critique fournit la ligne de base et le calcul de l'avantage à l'acteur ; l'acteur produit les trajectoires que le critique apprend. La perte totale combine les deux :
Le terme d'entropie récompense les politiques indécises, ce qui maintient l'exploration.
A2C — Advantage Actor-Critic — est cette combinaison exécutée en synchrone sur plusieurs environnements parallèles pour décorréler les échantillons, à la manière du rejeu mais sans stockage.
Le problème que PPO résout
Un gradient de politique met à jour par un pas d'Adam. Si ce pas est trop grand, la nouvelle politique s'éloigne trop de l'ancienne, les échantillons collectés deviennent invalides, et la performance s'effondre. Trop petit, l'apprentissage traîne.
TRPO (Trust Region Policy Optimization, 2015) formalise ce risque par une contrainte KL sur le pas — mais l'algorithme est lourd à implémenter. PPO (Proximal Policy Optimization, 2017) obtient un résultat comparable avec une astuce d'une simplicité déconcertante : tronquer le rapport de probabilités.
L'objectif tronqué de PPO, mot pour mot
Soit le rapport entre nouvelle et ancienne politique. L'objectif à maximiser :
Où vaut typiquement 0,2.
Lecture attentive. Si un avantage est positif, on veut augmenter ; le min avec la version tronquée coupe ce gain une fois que dépasse . Symétriquement, si est négatif, le min empêche de descendre sous . Le résultat : PPO peut faire plusieurs passages de gradient sur les mêmes données sans que la politique dérive trop de celle qui les a produites. Trois à dix époques par lot, contre une seule pour A2C.
Cette astuce simple, combinée à GAE pour l'avantage et à l'entraînement en parallèle sur plusieurs environnements, produit l'algorithme aujourd'hui le plus utilisé — d'OpenAI Five à ChatGPT en passant par les robots de laboratoire.
Les hyperparamètres qui comptent vraiment
Sur PPO, l'expérience du domaine converge :
| Hyperparamètre | Valeur usuelle | Sensibilité |
|---|---|---|
| Taux d'apprentissage | 3e-4 (Adam) | Élevée |
| de troncature | 0,1 à 0,3 | Modérée |
| Époques par lot | 3 à 10 | Élevée |
| Pas par mise à jour | 2048 à 8192 | Modérée |
| de GAE | 0,9 à 0,97 | Faible |
| Coefficient d'entropie | 0,0 à 0,01 | Élevée sur exploration |
| Coefficient du critique | 0,5 | Faible |
Sur LunarLander, ces valeurs par défaut fonctionnent presque toujours. Sur des tâches nouvelles, prévoir un balayage sur taux d'apprentissage et pas par mise à jour avant tout le reste.
Implémentation maison contre Stable-Baselines3
Stable-Baselines3 est la référence de production. Sur LunarLander :
import gymnasium as gym
from stable_baselines3 import PPO
from stable_baselines3.common.env_util import make_vec_env
env = make_vec_env("LunarLander-v2", n_envs=8)
modele = PPO("MlpPolicy", env, learning_rate=3e-4, n_steps=2048,
batch_size=64, n_epochs=10, gamma=0.99, gae_lambda=0.95,
clip_range=0.2, ent_coef=0.01, verbose=1, seed=0)
modele.learn(total_timesteps=1_000_000)
modele.save("ppo_lunarlander")
Cent mille pas suffisent à décoller ; un million donne un pilote convaincant. Une implémentation maison de PPO en 300 lignes atteint des performances comparables, mais demande une attention méticuleuse aux détails que la bibliothèque encapsule : normalisation des observations, écrêtage du gradient, moyenne mobile des récompenses, gestion propre des épisodes tronqués. Comparer les deux courbes, sur les mêmes graines, révèle où l'implémentation maison saigne — c'est un exercice pédagogique irremplaçable.
PPO n'est pas particulièrement efficace en données. Il gagne par sa stabilité : un learning_rate mal choisi ne fait pas exploser l'entraînement, il le ralentit. Sur des budgets serrés en interactions avec l'environnement, SAC (hors politique, non traité ici) est souvent supérieur en actions continues. PPO reste le choix par défaut parce qu'il ne demande pas de réglage fin — dans un domaine où le réglage fin coûte parfois plus cher que l'entraînement lui-même.
En résumé
- L'avantage remplace la ligne de base et réduit encore la variance ; GAE interpole entre biais et variance.
- L'acteur-critique apprend deux réseaux couplés : politique et valeur, avec un terme d'entropie pour l'exploration.
- PPO ajoute une troncature du rapport de probabilités qui autorise plusieurs passages sur les mêmes données sans dérive.
Stable-Baselines3est la référence robuste ; une implémentation maison éduque mais demande de la rigueur sur des détails que la bibliothèque encapsule.
Module suivant : le projet, un pilote LunarLander de bout en bout avec tous les gestes d'un vrai projet — graines, intervalles, vidéo, limites.