Ceci est une ancienne révision du document !
Table des matières
Apprentissage Par Renforcement
Le Hello World de l'Apprentissage Par Renforcement
Linéaire:
Rotatif:
Flying:
Apprentissage par renforcement
- Apprentissage par renforcement @ fr.wikipedia.org. En intelligence artificielle, plus précisément en apprentissage automatique, l'apprentissage par renforcement consiste, pour un agent autonome (robot, etc.), à apprendre à partir d'expériences, de façon à optimiser une récompense quantitative au cours du temps, positive ou négative. En répétant les expériences, le robot progresse.
Directeur Semour Skinner
Le directeur de l'école des enfants Simpson s'appelle Seymour Skinner, inspiré de Burrhus Frederic Skinner, inventeur de la Boîte de Skinner
Q-learning
Ressources
- Le Q-learning est une technique d'apprentissage par renforcement. La lettre 'Q' désigne la fonction qui mesure la qualité d'une action exécutée dans un état donné du système.
- Dopamine, RLLib, Keras-RL, Coach, TRFL, Tensorforce, Coach and more @ winderresearch.com/
- Apprentissage par renforcement @ larevueia.fr Article général.
- The Best Tools for Reinforcement Learning in Python You Actually Want to Try Posted November 17, 2020, compare KerasRL, Tensorforce, Pyqlearning, RL_Coach, TFAgents, MAME RL, MushroomRL
Principe vulgarisé
Boucle PID
- Régulateur PID sur Wikipedia. 2 images de l'article:
Dans une boucle de régulation, il faut atteindre la valeur de consigne le plus vite possible, mais sans dépasser la valeur, sans à dire “sans pomper”.
Une boucle PID (proportionnelle dérivée intégrale) est très performante:
Apprentissage par renforcement
Dans l'exemple du pendule:
L'agent est le programme de RL de l'IA.
L'action est “à droite” ou “à gauche”.
L’environnement est l'installation du pendule, le capteur de mesure de l'angle du pendule, le moteur droite gauche. Il retourne l'état soit la position et la vitesse du chariot, l'angle et la vitesse de rotation du pendule, mis à jour un peu après l'application d'une action.
La récompense est calculée en fonction de l'état.
Une nouvelle action est calculée par l'agent. L'agent s'optimise pour avoir la plus grande récompense possible.
Des explications sur le calcul de la récompense.
Dans Le jeu du pendule dans Blender, l'environnement est Blender, l'IA sont gym, baselines, les scripts. La communication entre l'IA et Blender se fait en OSC: l'action est envoyée, Blender retourne le résultat de cette action.
Frameworks possibles
Gym de OpenAI
OpenAI
fr.wikipedia.org OpenAI est une entreprise à « but lucratif plafonné » en intelligence artificielle, basée à San Francisco. En 2019, OpenAI a reçu a 1 000 000 000 $ de Microsoft. OpenAi utilise le super Calculateur de Micro$ pour ses apprentissages.
Avant mars 2019, elle était reconnue association à but non lucratif. L'objectif de cette société était de promouvoir et développer une intelligence artificielle à visage humain qui bénéficierait à toute l'humanité. L'objectif actuel est de se faire des $.
Gym
Gym is a toolkit for developing and comparing reinforcement learning algorithms.
Baselines vs Stable-baselines vs Stable-baselines3
Baselines
Baselines est un projet OpenAI. Mal foutu, plus maintenu.
Stable-baselines
Le code de Baselines est nettoyé, amélioré, documenté.
sudo pip3 install stable-baselines
- Documentation de stable-baselines @ stable-baselines.readthedocs.io
Stable-baselines3
Stable Baselines3 est la prochaine version. Mais les exemples ne sont plus compatibles.
sudo pip3 install stable-baselines3 stable-baselines3[extra]
- Documentation de stable-baselines3 @ stable-baselines3.readthedocs.io
Modélisation d'un système physique
Pour les exemples de la doc du pendule, compris dans gym, les calculs physiques sont quelques lignes dans le fichier de “env”. Le rendu est effectué avec pyglet, présenté ici. Un step ici dure 1 ms avec 4 CPU, dans Blender un step dure 200 ms.
Dans le § suivant, un pendule est modélisé dans un moteur de rendu 3D qui représente ce que serait un vrai pendule de la vie réelle: il n'est pas possible d'accélérer la simulation.
Pour faire des recherches et simuler l'influence de nombreux paramètres, il ne faut pas faire de visualisation et utiliser des moteurs physique: Bullet (libre), Mujoco (propriétaire et payant, très cher). Les calculs peuvent alors aller beaucoup plus vite, 10 à 100 fois.
Le jeu du pendule dans Blender
La modélisation d'un pendule dans Blender avec le moteur physique intégré (Bullet) est délicate.
Un axe static et un cube Rigid Body avec un trou
Le pendule fini rapidement par se décrocher de l'axe, si un vertex du trou est dans l'axe sur une frame, la physics va le faire tomber dans l'infini de l'espace.
Constraint Rigid Body Joint
Cette 2ème solution permet de bien faire tourner le pendule, par contre le stabiliser verticalement est corriace. Le Empty a été remplacer par un Cube en Dynamic avec une masse de 1 et le pendule une masse de 0.1
Source sur Github
- Balance sur Github
Installation
- Debian 10 Buster
- python 3.7
- blender game engine 2.79
- gym modifié dans my_gym
- stable-baselines
- oscpy de kivy super pratique pour la com entre le BGE et le script python
CUDA
Pour une carte graphique, Installation de cuda sur Xubuntu 18.04. Il faut configurer la gestion de l'alimentation en définissant la veille à jamais, et étendre votre écran.
gym
gym est installé dans le système avec l'installation de stable-baselines. Balance est construit en modifiant des fichiers sources de gym, dans une copie nommée my_gym, importée dans les fichiers avec:
import sys sys.path.append('my_gym') import gym
Il faut désinstaller gym
sudo pip3 uninstall gym
Bullet dans blender
Le moteur physique de Blender est Bullet. Il vit sa vie en parallèle du moteur de jeu, une commande demandée dans un script python sur une frame agit dans le moteur physique lors des frames suivantes mais en interaction avec la physique en cours. Le script python n'est pas un dictateur qui donne des ordres strictes à Bullet.
Il est possible d'ajouter des substeps dans Blender Properties Scene Physics
Exemple d'un reset position et orientation sur 25 frames: def reset():
Visualisation dans blender
Dans le dossier du projet
blenderplayer ./balance/balance.blend
Le fps est défini à 120 dans le panneau de rendu, le script once.py défini bge.logicsetLogicTicRate(120)
Lancement de l'apprentissage
Définition de mon environnement dans:
blenderplayer ./balance/balance.blend python3 my_cartpole_ppo2_train.py
Le fichier d'apprentissage est à: acktr_blender_250000_1.zip
Utilisation
Lancer blender comme ci-dessus et le script blender_baselines_acktr.py
blenderplayer ./balance/balance.blend python3 my_cartpole_ppo2_rendu.py
Remarque
Le jeu (avec blenderplayer …) ne doit être lancé qu'une seule fois! On peut lancer ou stopper les scripts python, à son bon vouloir, la reconnexion est automatique avec le BGE.
Résultat du 1er essai
Avec un apprentissage de quelques heures ….
Comment est définit l'objectif à atteindre
Objectif = target = goal = but
Le goal est définit par les règles définissant le “reward”, la récompense.
Le goal est le centre d'un intervale.
En dehors de cet intervalle, pas de récompense: reward = 0
Dans l'intervalle, la récompense est une fonction décroissante de l'écart au centre. Idem est (un peu de latin, ça fait prof au Collège de France) plus l'écart est faible, plus la récompense est grande. La récompense est calculée à chaque step.
Exemple extrait de Swing Up
# La récompense est définie ici, le goal est 0 # Reward_teta is 1 when teta is 90 soit np.cos(teta) de 0 to 90 or -90 to 0, # 0 if between 90 and 270 or -270 to -90 # 0 < Reward_teta < 1 reward_teta = max(0, np.cos(teta)) # Récompense sur x: 1 au centre (x=0), 0 si x = +ou-self.x_threshold reward_x = np.cos((x / self.x_threshold) * (np.pi / 2.0)) # La récompense totale reward = reward_teta * reward_x
Ici, il y a une récompense si le pendule est au-dessus du diamètre horizontal. Plus il est près de la position verticale, plus la récompense est grande. Sinon la récompense est nulle.
Relèvement du pendule appelé Swing-up
Les exemples de Gym proposent Pendulum, il faut redresser le pendule en applicant un couple sur l'axe.
Ici nous déplaçons le chariot pour le Swing. Cet exemple est construit à partir deCartPoleSwingUp. Il y a beaucoup d'autres dépôts sur GitHub sur ce problème.
Les sources sont dans le dossier redressement de balance. Training et Rendu.
Un résultat après 6 heures d'apprentissage, soit 1 million de steps.
Repartir d'un apprentissage terminé et Enregistrement intermédiaire
Comment repartir du fichier PPO2_Swing_35.zip, et enregistrement tous les 100 000 steps idem est How to create checkpoint ?
import gym from time import time, strftime from stable_baselines.common.policies import MlpPolicy from stable_baselines.common import make_vec_env from stable_baselines import PPO2 log = strftime("%Y%m%d-%H%M%S") env = make_vec_env('CartPoleSwingUpContinuous-v0', n_envs=1) model = PPO2.load("./weights/PPO2_Swing_35.zip", env=env, cloudpickle=False, verbose=0) for i in range(20): model.learn(total_timesteps=100000) partial = "./weights/SR-" + log + "-" + str(i) model.save(partial, cloudpickle=False)
Quelques explications
Comment améliorer le SwingUp
Actions discrètes ou continue
- Dans CartPole, les actions sont discrètes, une force fixe est appliquée à chaque step, vers la gauche ou vers la droite. Le chariot est toujours en mouvement.
- Pour SwingUp de l'exemple ci-dessus, la même méthode est utilisée. Mais les actions auraient besoin d'être forte pour le relevé et plus faible pour le maintenir en haut. Les actions sont toujours appliquées à chaque step.
Définition des actions, avec 2 valeurs possibles: 0 ou 1, 0 = force à gauche, 1 = force à droite
action_space = spaces.Discrete(2)
Définition des actions de SwingUp, avec des valeurs possibles entre -1 et 1
action_space = spaces.Box(-1.0, 1.0, shape=(1,))
Algorithme d'apprentissage
L'algorithme d'optimisation est PPO2 dans les 2 cas. De longs essais avec DDPG n'a rien donné de bien. D'autres algorithmes sont possibles.
Relations scripts vs Blender
L'apprentissage exécuté avec model.learn() est une boucle qui appelle la méthode step() de my_cartpole.py ou cartpoleswingup.py, avec une action en argument.
L'action possible est définie par action_space: discrète ou continue.
Dans step(action), l'action est envoyée en OSC à Blender, step() attend la réponse qui est envoyée 2 frames plus tard. Cette réponse est une observation à cet instant, position et vitesse du chariot, angle et vitesse angulaire du pendule.
Dans gym,
step() retourne l'observation, la récompense = reward, si c'est fini = done
Si done = 1, un reset() est fait.
done = 1 si 20 < x ou x < 20 ou teta > 0.1 ou teta < -0.1, donc si le chariot est trop décalé, ou si le pendule est parti pour tomber. Il y a aussi un nombre maxi d'itération qui provoque un reset() défini dans __init__.py#L84
Une récompense (reward) est calculée si le pendule n'est pas tombé ou si la boucle est finie.
SwingUp avec une récompense revue et de longs calculs
La plage de récompense sur x a été réduite à +ou- 2. le chariot ne fonce plus en bout de course.
Après un long apprentissage, le pendule ne se stabilise pas en haut, il préfère tourner en rond. La formule de récompense ne favorise pas la stabilisation en haut.
Ajout d'une récompense en haut = RV.
- Si le pendule est proche de la position verticale avec une vitesse angulaire faible, la récompense “vitesse” est 1
- Si la vitesse est proche de la vitesse angulaire maxi (environ=5), la récompense n'est que de 0.8
reward_total = reward_chariot * reward_balancier * RV
Ressources complémentaires
Gym CartPole Ressources
- CartPole-v0 wiki @ github.com
Définition des Observations = Liste de 4 items:
Num | Observation | Min | Max |
---|---|---|---|
0 | Cart Position | -2.4 | 2.4 |
1 | Cart Velocity | -Inf | Inf |
2 | Pole Angle | ~ -41.8° | ~ 41.8° |
3 | Pole Velocity At Tip | -Inf | Inf |
pybullet
Bullet est le moteur physique de Blender
Création de votre propre environnement
- How to create new environments for Gym @ openai / gym
L'étape suivante de la visualisation dans blender serait de créer un environnement spécifique pour ce my_cartpole et l'installer en dur. Puis d'utiliser gym en l'installant et supprimant les imports locaux de gym.
Un cartpole réel documenté mais sans RL
- Sergey Royz: Stabilizing pendulum on a cart with full state feedback control
- Articles: habr.com en russe
- Hardware used in the project:
- DC motor, 12V, gearbox 5:1 Modelcraft IG320005-3AC21R motor s převodem 12 V 5:1 @ conrad.cz et Modelcraft IG320005-3AC21R Moteur à entraînement 12 V 5:1 @ conrad.fr
- Incremental rotary encoder LPD3806-600BM-G5-24C 600 PPR (motor) Recherche sur alibaba.com
- Incremental rotary encoder OMRON E6B2-CWZ6C 2500 PPR (pendulum)
- Power supply 12V, 4A Spínaný zdroj MEAN WELL RD-85A. Une alimentation de PC peut convenir !
- 10Amp 5V-30V DC Motor Driver 10Amp 5V-30V DC Motor Driver
- Arduino Mega 2560 @ gotronic.fr
- Source code: https://github.com/zjor/inverted-pendulum