Ismail Ben Alla

MountainCar RL

Toutes les familles de RL sur une seule tâche à récompense rare

Apprentissage par renforcement · oct. 2026 · Terminé

Une voiture trop faible pour gravir la colline, et toutes les familles de RL qui tentent d’apprendre le mouvement de balancier qui la mène jusqu’au drapeau.

Construit avecPyTorchGymnasiumNumPyMatplotlibpytest

MountainCar RL — vue d’ensemble

Présentation

MountainCar donne -1 par pas jusqu’au drapeau : chaque épisode raté vaut donc exactement -200, et l’agent ne reçoit aucun indice tant qu’il n’a pas atteint le drapeau une première fois. Le moteur est plus faible que la gravité, la voiture doit donc se balancer d’avant en arrière pour accumuler de l’énergie. C’est le problème d’exploration classique, et il est assez petit pour que chaque méthode s’entraîne sur un seul thread CPU en quelques secondes à quelques minutes.

J’ai écrit une petite base de code où chaque méthode est un Agent doté des cinq mêmes méthodes, et une seule boucle d’entraînement les exécute toutes : Q-learning et SARSA discrétisés, tile coding, DQN / Double / Dueling DQN avec replay priorisé et retours n-step, REINFORCE, A2C, PPO, DDPG, TD3, SAC et la méthode de l’entropie croisée. Les aides à l’exploration (shaping basé sur un potentiel d’énergie ou de hauteur, bonus de comptage et RND, calendriers d’epsilon) sont des wrappers d’environnement activés par des options : les algorithmes ne savent jamais si la récompense a été modifiée, et chaque tableau rapporte la vraie récompense.

La comparaison répond à une question : quelles méthodes trouvent le drapeau seules, et lesquelles ont besoin d’aide. Le tile coding et CEM résolvent la tâche discrète en environ 25 épisodes sans aide. DQN, Dueling DQN, REINFORCE et A2C n’atteignent jamais le drapeau avec la récompense brute dans leur budget ; avec le shaping énergétique, toutes les méthodes la résolvent, et un bonus de nouveauté fondé sur des comptages, qui ne sait rien de la physique, fait de même pour DQN. En version continue, PPO, DDPG, TD3 et SAC convergent tous vers l’inaction sans shaping, car le seul signal avant une réussite est le coût de l’action.

La question

Sur une tâche où chaque épisode raté vaut exactement -200, quelles méthodes d’apprentissage par renforcement découvrent l’objectif par elles-mêmes, et qu’apporte un signal dense (shaping basé sur un potentiel ou bonus de nouveauté) à celles qui n’y parviennent pas ?

Fonctionnalités clés

Comment ça marche

  1. Représenter l’état

    L’état est (position, vitesse). Les méthodes tabulaires utilisent une grille 16x16, le tile coding utilise 8 pavages 8x8 décalés avec un Q linéaire, et les méthodes neuronales reçoivent l’état normalisé dans [-1, 1]^2.

  2. Modifier la récompense (optionnel)

    ShapingWrapper ajoute gamma * Phi(s') - Phi(s), où Phi est l’énergie mécanique ou la hauteur, ce qui laisse la politique optimale inchangée. IntrinsicWrapper ajoute 0.1 / sqrt(N(cell)) ou une erreur de prédiction RND. La vraie récompense est conservée dans info, et c’est elle que montrent tous les tableaux.

  3. Une seule boucle pour tous les agents

    train.py appelle act et observe sur chaque méthode : une entrée de table pour le Q-learning, 8 poids pour le tile coding, un pas sur un minibatch pour DQN / DDPG / TD3 / SAC, ou une transition stockée jusqu’à ce qu’un rollout soit complet pour A2C, PPO, REINFORCE et CEM.

  4. Évaluer en glouton sur des départs fixes

    evaluate.py réinitialise avec les graines 1000-1019, désactive epsilon, le bruit d’action et le shaping, et enregistre le taux de réussite, le retour et le nombre de pas : chaque méthode affronte les mêmes états de départ.

  5. Comparer

    compare.py lance une suite (tabulaire, deep discret, exploration, continu), écrit les tableaux markdown et trace les courbes d’entraînement, les heatmaps de visites et les cartes de politique à partir des runs sauvegardés.

Exemples

MountainCar-v0 depuis le même état de départ : un agent aléatoire (à gauche) n’accumule jamais assez d’énergie et s’arrête au bout de 200 pas ; après 300 épisodes de tile coding (à droite), la voiture part d’abord vers la gauche et atteint le drapeau au pas 107.
MountainCarContinuous-v0 : un agent aléatoire (à gauche) face à SAC avec shaping énergétique après 30 épisodes d’entraînement (à droite), qui se balance une fois puis grimpe jusqu’au drapeau.
Toutes les méthodes ayant résolu la tâche discrète, politique gloutonne, même état de départ : onze panneaux atteignent le drapeau entre les pas 107 et 169 ; le Q-learning (55 % de réussite en glouton) échoue justement sur ce départ.
Comment le tile coding apprend : l’action gloutonne sur (position, vitesse) tous les 4 épisodes. Elle commence comme du bruit, puis la spirale « pousser dans le sens de la vitesse » (rouge = gauche, bleu = droite) s’étend à partir du drapeau à mesure que les réussites se propagent en arrière.
Tile coding (cible Q) après 300 épisodes : les zones visitées par la voiture pendant l’entraînement, le max Q appris et la politique gloutonne, qui partage le plan en « pousser à gauche quand on va à gauche, pousser à droite quand on va à droite ».
Tile coding (cible Q) après 300 épisodes : les zones visitées par la voiture pendant l’entraînement, le max Q appris et la politique gloutonne, qui partage le plan en « pousser à gauche quand on va à gauche, pousser à droite quand on va à droite ».
Visites pendant l’entraînement des six méthodes neuronales, avec et sans shaping énergétique : les runs qui échouent restent dans une tache autour de la vallée, ceux qui réussissent tracent des spirales jusqu’au drapeau (ligne pointillée).
Visites pendant l’entraînement des six méthodes neuronales, avec et sans shaping énergétique : les runs qui échouent restent dans une tache autour de la vallée, ceux qui réussissent tracent des spirales jusqu’au drapeau (ligne pointillée).
Courbes de contrôle continu : sans shaping, PPO, DDPG, TD3 et SAC restent à un retour de 0 (inaction) ; avec le shaping énergétique, les quatre atteignent 90-95 en quelques épisodes, et CEM résout la tâche sans aide.
Courbes de contrôle continu : sans shaping, PPO, DDPG, TD3 et SAC restent à un retour de 0 (inaction) ; avec le shaping énergétique, les quatre atteignent 90-95 en quelques épisodes, et CEM résout la tâche sans aide.

Entrée

mountaincar-eval runs/tabular/tile-coding_q --episodes 100

Sortie

success 100%, mean return -118.9 (std 15.2), 119 steps

Une évaluation gloutonne plus longue de l’agent tile coding entraîné pendant 300 épisodes (6 secondes sur un seul thread CPU).

Stack technique

Ce que j’ai appris

Limites

Mots-clés

apprentissage par renforcement · MountainCar · récompense rare · exploration · Q-learning · tile coding · DQN · PPO · SAC · méthode de l’entropie croisée · reward shaping · Random Network Distillation · experience replay priorisé · Gymnasium · PyTorch