Ismail Ben Alla

Pong RL

Pong à partir des pixels avec sept méthodes de deep RL

Apprentissage par renforcement · oct. 2026 · Terminé

Sept méthodes de deep RL apprennent Pong uniquement à partir des pixels, côte à côte, sur les mêmes images et avec le même score.

Construit avecPyTorchNumPyGymnasiumMatplotlibpytest

Pong RL — vue d’ensemble

Présentation

Pong à partir des pixels est le problème qui a rendu célèbre l’apprentissage par renforcement profond, et « Pong from Pixels » de Karpathy a été mon point de départ : un notebook de cours avec son gradient de politique en numpy et une réécriture en PyTorch. En faire un package a demandé de corriger onze problèmes dans ce notebook, le principal étant une fonction de perte qui donnait un gradient nul à chaque action DOWN.

J’ai ensuite implémenté chaque méthode principale sur les mêmes images prétraitées : le gradient de politique de Karpathy (un MLP sur des différences d’images), REINFORCE avec une baseline apprise, A2C avec 16 parties en parallèle, PPO avec GAE et ratio clippé, et DQN avec têtes double et dueling, replay priorisé et retours n-step. Chaque règle d’apprentissage tient dans un fichier de 60 à 120 lignes ; le jeu, le CNN, l’évaluation et la journalisation sont partagés.

Comme un agent sur pixels a besoin de millions d’images Atari pour gagner, j’ai écrit un Pong numpy 40x40 avec les trois mêmes actions, le frame skip et un adversaire scripté, prétraité en images binaires 20x20. Chaque méthode l’apprend en 2 à 6 minutes sur un seul thread CPU, ce qui rend les différences visibles : la famille DQN bat l’adversaire après 75k-100k pas, PPO après 125k, et les méthodes Monte Carlo ont besoin de 175k à 400k. Le même code s’entraîne sur ALE/Pong-v5 dans le notebook Kaggle / Colab.

La question

Lorsque sept méthodes de deep RL voient les mêmes images prétraitées et sont notées par la même évaluation, dans quelle mesure une baseline apprise, le bootstrapping et l’experience replay changent-ils le nombre d’échantillons nécessaires pour gagner à Pong ?

Fonctionnalités clés

Comment ça marche

  1. Prétraiter l’image

    Les images ALE sont recadrées, sous-échantillonnées d’un facteur 2 et binarisées exactement comme dans le prepro de Karpathy (80x80). Le petit jeu est sous-échantillonné de 40x40 à 20x20 avec un max sur des blocs 2x2, pour que la balle 2x2 ne puisse jamais disparaître.

  2. Encoder le mouvement

    Une seule image montre où se trouve la balle, pas où elle va. diff soustrait l’image précédente, si bien qu’un objet en mouvement devient une tache +1 à côté d’une tache -1 ; stack conserve les 4 dernières images et laisse le réseau les comparer.

  3. Apprendre, de trois façons

    pg et reinforce attendent la fin des parties et utilisent des retours Monte Carlo (réinitialisés à chaque point), avec ou sans V(s) appris. a2c et ppo bootstrappent après 5 ou 64 pas avec un critique, PPO réutilisant chaque batch pendant 4 époques avec un clip du ratio à 10 %. La famille DQN régresse Q vers un réseau cible à partir d’un replay buffer avec une perte de Huber et une action epsilon-greedy.

  4. Évaluer sur des services fixes

    La copie i du jeu est réinitialisée avec la graine 10000 + i : chaque méthode affronte les mêmes services et le même bruit de l’adversaire ; les agents à gradient de politique échantillonnent leurs actions, la famille DQN joue argmax Q.

  5. Comparer

    scripts/compare_all.py entraîne les sept méthodes l’une après l’autre et construit le tableau de résultats, les courbes en fonction des pas et des minutes, et le GIF avec un panneau par méthode.

Exemples

Même graine de partie sur le petit Pong, l’agent est la raquette verte à droite : un DQN aux poids aléatoires (à gauche) perd 0-5 ; la même architecture après 3.6 minutes d’entraînement DQN sur un seul thread CPU (à droite) gagne 5-0.
Un panneau par méthode sur une même graine de partie, après le run du tableau de résultats : l’agent non entraîné perd 2-5, les trois variantes de DQN gagnent 5-0, PPO et pg 5-3, REINFORCE 5-1, A2C 5-4 (les agents à gradient de politique échantillonnent leurs actions, donc une partie n’est qu’un échantillon bruité du score sur 30 parties).
Courbes d’apprentissage sur le petit Pong, score d’entraînement (à gauche) et évaluation périodique sur 10 parties (à droite) en fonction des pas d’environnement : la famille DQN passe 0 en premier, puis PPO, puis A2C et REINFORCE, le pg de Karpathy en dernier vers 400k pas.
Courbes d’apprentissage sur le petit Pong, score d’entraînement (à gauche) et évaluation périodique sur 10 parties (à droite) en fonction des pas d’environnement : la famille DQN passe 0 en premier, puis PPO, puis A2C et REINFORCE, le pg de Karpathy en dernier vers 400k pas.
Prétraitement sur le petit jeu : l’image brute 40x40, l’image binaire 20x20 et la différence d’images où la balle en mouvement devient une paire +1 / -1.
Prétraitement sur le petit jeu : l’image brute 40x40, l’image binaire 20x20 et la différence d’images où la balle en mouvement devient une paire +1 / -1.
ALE/Pong-v5 avec l’agent PPO issu du run de vérification local de 4,096 pas : à peine entraîné, il perd, comme prévu ; il montre seulement que le même code tourne sur le jeu Atari.

Entrée

pong-train --algo dqn && pong-eval runs/dqn/model.pt --episodes 30

Sortie

mean score +4.60 ± 0.55 over 30 games, win rate 100% (180,000 steps, 3.6 min on one CPU thread)

Le run DQN à l’origine du tableau de résultats ; le score est le nombre de points gagnés moins les points perdus dans une partie en 5 points, sur des services fixes (graines 10000-10029).

Stack technique

Ce que j’ai appris

Limites

Mots-clés

apprentissage par renforcement · Pong à partir des pixels · Atari · gradient de politique · REINFORCE · A2C · PPO · DQN · dueling DQN · experience replay priorisé · retours n-step · empilement d’images · Arcade Learning Environment · Gymnasium · PyTorch