CI : Deep Reinforcement Learning
Bienvenue dans ce cinquième TP consacré à l'Apprentissage par Renforcement Profond (Deep Reinforcement Learning). Jusqu'à présent, vous avez manipulé des modèles supervisés ou génératifs travaillant sur des ensembles de données statiques. Aujourd'hui, vous allez concevoir un agent autonome capable d'interagir avec son environnement, de prendre des décisions séquentielles et d'apprendre de ses erreurs pour accomplir une tâche complexe : faire atterrir un module lunaire en douceur.
Dans cette session orientée ingénierie, nous allons nous concentrer sur le déploiement pragmatique. Vous utiliserez les standards de l'industrie : Gymnasium pour la simulation physique de l'environnement (LunarLander-v3) et Stable Baselines3 pour instancier un modèle PPO (Proximal Policy Optimization). Avant de commencer, assurez-vous de créer un répertoire TP5 dans le dépôt Git de votre module et d'y initialiser votre fichier de rapport (rapport.md).
- Appréhender l'API standard de l'écosystème RL (Gymnasium) en manipulant les espaces d'états et d'actions.
- Déployer et entraîner un algorithme de Deep RL de l'état de l'art (PPO) en quelques lignes de code.
- Analyser et interpréter les métriques d'apprentissage spécifiques au RL (récompense moyenne) pour valider la convergence.
- Évaluer quantitativement et qualitativement un agent en inférence (déploiement).
Comprendre la Matrice et Instrumenter l'Environnement (Exploration de Gymnasium)
Avant de demander à une IA de résoudre un problème, un ingénieur doit d'abord s'assurer qu'il comprend parfaitement les entrées, les sorties, et savoir comment mesurer la performance de son système. Créez un fichier random_agent.py et complétez les trous pour initialiser l'environnement LunarLander-v3, faire agir un agent de manière aléatoire, enregistrer une vidéo (GIF), et calculer des métriques de vol (carburant, crash, score).
Exécutez votre script. Dans votre rapport Markdown, intégrez le GIF généré random_agent.gif ainsi qu'une copie du rapport de vol affiché dans votre terminal. Un agent est considéré comme "résolvant" l'environnement s'il obtient un score moyen de +200 points. À quel point votre agent aléatoire en est-il loin ?
Entraînement et Évaluation de l'Agent PPO (Stable Baselines3)
Il est temps de remplacer notre générateur aléatoire par un véritable cerveau artificiel. Vous allez construire un pipeline complet ("End-to-End") : initialiser l'environnement, configurer l'algorithme PPO, lancer l'apprentissage, sauvegarder les poids, puis évaluer l'agent entraîné avec la même télémétrie que précédemment.
Créez un fichier train_and_eval_ppo.py et complétez les trous pour réaliser ce pipeline.
Exécutez votre script. Pendant l'entraînement, observez les logs affichés dans le terminal. Cherchez la ligne ep_rew_mean (Récompense moyenne par épisode). Dans votre rapport, indiquez comment cette valeur a évolué entre le début et la fin de l'entraînement.
Une fois le script terminé, intégrez le nouveau GIF trained_ppo_agent.gif et le nouveau "Rapport de vol PPO" dans votre markdown. Comparez l'utilisation du carburant (allumages moteurs) et l'issue du vol par rapport à l'agent aléatoire. L'agent a-t-il atteint le seuil de +200 points ?
L'Art du Reward Engineering (Wrappers et Hacking)
Pour illustrer cela, nous allons pénaliser très lourdement la consommation de carburant. Dans Gymnasium, la manière la plus propre de modifier un environnement existant sans toucher à son code source est d'utiliser un Wrapper. C'est un design pattern très utilisé en ingénierie MLOps pour injecter des règles métier.
Créez un script reward_hacker.py et complétez la classe Wrapper pour intercepter l'action. Si l'agent allume le moteur principal, infligez-lui une pénalité colossale (-50 points au lieu des -0.3 standards). Entraînez ensuite un nouvel agent sur cet environnement modifié et observez sa télémétrie.
Exécutez ce nouveau script. Regardez le fichier hacked_agent.gif généré et le rapport de vol dans le terminal. Dans votre rapport Markdown, intégrez la copie du terminal et décrivez la stratégie adoptée par l'agent. Expliquez d'un point de vue mathématique et logique pourquoi l'agent a choisi cette solution "optimale" (du point de vue de la fonction de récompense modifiée) qui nous paraît pourtant aberrante.
Robustesse et Changement de Physique (Généralisation OOD)
Par défaut, l'environnement LunarLander-v3 possède une gravité simulée fixée à -10.0 (très proche de la Terre). Nous allons évaluer comment notre "bon" agent de l'Exercice 2 réagit si nous l'envoyons sur un corps céleste avec une gravité beaucoup plus faible (par exemple la vraie Lune), sans l'avoir ré-entraîné pour cette nouvelle physique.
Créez un script ood_agent.py et complétez-le pour charger l'agent de l'Exercice 2 et le tester dans un environnement où la gravité est altérée.
Exécutez ce script. Dans votre rapport Markdown, intégrez la copie du terminal et le fichier ood_agent.gif. Observez le comportement du vaisseau. L'agent parvient-il toujours à se poser calmement ? Décrivez ce qui se passe et expliquez techniquement pourquoi le modèle échoue ou peine à accomplir sa tâche.
Bilan Ingénieur : Le défi du Sim-to-Real
Dans l'exercice précédent, votre agent a échoué face à un simple changement de gravité car il a "surappris" (overfit) la physique de son environnement d'origine. En tant qu'ingénieur IA, votre manager vous demande de concevoir un système capable de se poser sur différentes lunes (avec des gravités et des vents variables), mais les ressources de calcul sont limitées : vous ne pouvez pas vous permettre de stocker et d'entraîner un modèle PPO spécifique pour chaque lune existante.
Dans votre rapport Markdown, proposez au moins deux stratégies concrètes (modifications de l'environnement, des données ou de la méthode d'entraînement) pour rendre votre agent robuste à ces variations physiques, sans avoir à inventer un nouvel algorithme mathématique.
Pensez à la façon dont vous pourriez modifier l'environnement pendant la phase d'entraînement (Exercice 2). Que se passerait-il si la gravité n'était pas fixe ? Pensez également à ce que vous pourriez ajouter aux capteurs de l'agent (l'espace d'observation).Ceci conclut ce TP sur le Deep Reinforcement Learning. Assurez-vous d'avoir bien commité et poussé (git push) votre dossier TP5 contenant :
- Vos scripts Python complétés.
- Vos fichiers GIF générés (télémétrie aléatoire, entraînée, hackée, et OOD).
- Votre fichier de rapport Markdown contenant vos analyses et les copies des rapports de vol du terminal.
Félicitations pour avoir entraîné vos premiers agents autonomes !