apprentissage_par_renforcement
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
apprentissage_par_renforcement [2021/01/21 17:08] – [Constraint Rigid Body Joint] serge | apprentissage_par_renforcement [2022/02/10 07:52] (Version actuelle) – [Apprentissage Par Renforcement] serge | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
====== Apprentissage Par Renforcement ====== | ====== Apprentissage Par Renforcement ====== | ||
- | |||
<WRAP center round box 60% centeralign> | <WRAP center round box 60% centeralign> | ||
**{{tagpage> | **{{tagpage> | ||
Ligne 7: | Ligne 6: | ||
**[[les_pages_intelligence_artificielle_en_details|Les Pages Intelligence Artificielle en détails]]** | **[[les_pages_intelligence_artificielle_en_details|Les Pages Intelligence Artificielle en détails]]** | ||
</ | </ | ||
- | |||
{{ : | {{ : | ||
===== Le Hello World de l' | ===== Le Hello World de l' | ||
+ | <WRAP group> | ||
+ | <WRAP third column> | ||
Linéaire: | Linéaire: | ||
- | |||
- | {{youtube> | ||
{{youtube> | {{youtube> | ||
- | {{youtube>Lt-KLtkDlh8? | + | </WRAP> |
+ | <WRAP third column> | ||
Rotatif: | Rotatif: | ||
- | |||
- | {{youtube> | ||
- | {{youtube> | ||
{{youtube> | {{youtube> | ||
+ | </ | ||
+ | <WRAP third column> | ||
Flying: | Flying: | ||
{{youtube> | {{youtube> | ||
- | {{youtube>XxFZ-VStApo? | + | </WRAP> |
- | + | </WRAP> | |
- | Double pendule: | + | * Rotary Inverted Pendulum: Swing Up and Stabilization |
- | {{youtube>N-yrQu9zuOI? | + | * Double Inverted Furuta Pendulum |
- | + | * Furuta Pendulum avec une belle finition | |
- | ====Documenté mais sans RL==== | + | |
- | {{youtube> | + | |
- | + | ||
- | * Sergey Royz: Stabilizing pendulum on a cart with full state feedback control | + | |
- | * Articles: [[https://habr.com/ru/ | + | |
- | * Hardware used in the project: | + | |
- | * DC motor, 12V, gearbox 5:1 [[https:// | + | |
- | * Incremental rotary encoder LPD3806-600BM-G5-24C 600 PPR (motor) Recherche sur [[https:// | + | |
- | * Incremental rotary encoder OMRON E6B2-CWZ6C 2500 PPR (pendulum) | + | |
- | * Power supply 12V, 4A [[https:// | + | |
- | * 10Amp 5V-30V DC Motor Driver [[https:// | + | |
- | * Arduino Mega 2560 [[https:// | + | |
- | * Source code: https:// | + | |
=====Apprentissage par renforcement===== | =====Apprentissage par renforcement===== | ||
* **[[https:// | * **[[https:// | ||
- | ====Directeur | + | ====Directeur |
{{ youtube> | {{ youtube> | ||
Le directeur de l' | Le directeur de l' | ||
- | |||
{{ : | {{ : | ||
- | =====Ressources===== | ||
- | * [[https:// | ||
- | * [[https:// | ||
- | |||
- | ====Frameworks==== | ||
- | commande de robots | ||
- | |||
- | https:// | ||
=====Q-learning===== | =====Q-learning===== | ||
==== Ressources ==== | ==== Ressources ==== | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
* Le [[https:// | * Le [[https:// | ||
* [[https:// | * [[https:// | ||
* [[https:// | * [[https:// | ||
- | * [[https:// | + | * [[https:// |
- | * KerasRL | + | * [[https:// |
- | * Tensorforce | + | |
- | * Pyqlearning | + | ====Principe vulgarisé d'une boucle PID=== |
- | * RL_Coach | + | |
- | * TFAgents | + | |
- | * MAME RL | + | Dans une boucle de régulation, |
- | * MushroomRL | + | {{ : |
- | + | Une boucle PID (proportionnelle dérivée intégrale) est très performante: | |
+ | {{ : | ||
+ | |||
+ | ====Principe vulgarisé de l' | ||
+ | **RL = Reinforcement Learning = Apprentissage par Renforcement** | ||
+ | {{ : | ||
+ | L'IA (Intelligence Artificielle) dont nous parlons ici n'est pas intelligente, | ||
+ | Dans l' | ||
+ | L'**agent** est le programme de RL de l' | ||
+ | L'**action** est "à droite" | ||
+ | L’**environnement** est l' | ||
+ | La **récompense** est calculée en fonction de l' | ||
+ | Une nouvelle | ||
+ | [[https:// | ||
+ | Dans [[https:// | ||
=====Frameworks possibles===== | =====Frameworks possibles===== | ||
====Gym de OpenAI==== | ====Gym de OpenAI==== | ||
===OpenAI=== | ===OpenAI=== | ||
- | * **[[https://openai.com/|openai.com]]** | + | [[https://fr.wikipedia.org/wiki/OpenAI|fr.wikipedia.org]] **[[https:// |
- | [[https://fr.wikipedia.org/wiki/OpenAI|fr.wikipedia.org]] **OpenAI** | + | |
===Gym=== | ===Gym=== | ||
- | Gym is a toolkit for developing and comparing reinforcement learning algorithms. | + | Gym is a toolkit for developing and comparing reinforcement learning algorithms: [[https:// |
- | * [[https:// | + | |
- | * [[https:// | + | |
- | * [[http:// | + | |
- | + | ||
- | + | ||
====Baselines vs Stable-baselines vs Stable-baselines3==== | ====Baselines vs Stable-baselines vs Stable-baselines3==== | ||
- | OpenAI Baselines is a set of high-quality implementations of reinforcement learning algorithms. **" | ||
- | |||
===Baselines=== | ===Baselines=== | ||
- | [[https:// | + | [[https:// |
===Stable-baselines=== | ===Stable-baselines=== | ||
- | Main differences with OpenAI Baselines. This toolset is a fork of OpenAI | + | Le code de Stable-baselines est le code de Baselines |
- | | + | |
- | | + | |
- | * Documented functions and classes | + | |
- | * More tests & more code coverage | + | |
- | * Additional algorithms: SAC and TD3 (+ HER support for DQN, DDPG, SAC and TD3) | + | |
- | + | ||
- | <code bash> | + | |
- | git clone https://github.com/hill-a/ | + | |
- | pip install -e .[docs, | + | |
- | sudo pip3 install -e .[docs, | + | |
- | sudo pip3 install tensorflow==1.15 | + | |
- | </ | + | |
- | * **[[https:// | + | sudo pip3 install |
===Stable-baselines3=== | ===Stable-baselines3=== | ||
+ | **[[https:// | ||
- | Stable Baselines3 (SB3) is a set of reliable implementations of reinforcement learning algorithms in PyTorch. It is the next major version of Stable Baselines. | + | sudo pip3 install stable-baselines3 stable-baselines3[extra] |
- | * **[[https://stable-baselines3.readthedocs.io/en/master/|Stable-Baselines3]]** | + | =====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 " | ||
+ | Un fichier pour le tester: [[https:// | ||
- | sudo pip3 install stable-baselines3 | + | 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' |
- | sudo pip3 install stable-baselines3[extra] | + | Pour faire des recherches et simuler l' |
+ | =====Le jeu du pendule dans Blender===== | ||
+ | * **[[https:// | ||
+ | ====Installation==== | ||
+ | * Debian 10 Buster | ||
+ | * python 3.7 | ||
+ | * blender game engine 2.79 | ||
+ | * stable-baselines [[apprentissage_par_renforcement# | ||
+ | * [[https:// | ||
+ | * CUDA: Pour une carte graphique, [[https:// | ||
- | * **[[https:// | + | ===gym=== |
+ | gym est installé dans le système avec l' | ||
- | =====Le jeu du pendule dans Blender===== | + | import sys |
+ | sys.path.append(' | ||
+ | import gym | ||
+ | Il faut désinstaller gym | ||
+ | sudo pip3 uninstall gym | ||
+ | |||
+ | ===Modification de my_gym=== | ||
+ | Définition de mon environnement dans: **[[https:// | ||
+ | Un fichier obtenu avec un apprentissage est à: [[https:// | ||
+ | |||
+ | ====Modélisation==== | ||
La modélisation d'un pendule dans Blender avec le moteur physique intégré (Bullet) est délicate. | 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 partir dans l' | ||
- | ====Un axe static et un cube Rigid Body avec un trou==== | + | ===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 | ||
+ | <WRAP group> | ||
+ | <WRAP third column> | ||
+ | **Axe** | ||
+ | {{ : | ||
+ | {{ : | ||
+ | </ | ||
+ | <WRAP third column> | ||
+ | **Rigid Body Joint** | ||
+ | {{ : | ||
+ | </ | ||
+ | <WRAP third column> | ||
+ | **Pendule** | ||
+ | {{ : | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | ===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 important d' | ||
+ | {{ : | ||
- | {{:media_14:axe_axe_1.png?400|}} | + | Exemple d'un reset position et orientation sur 25 frames: [[https://github.com/ |
- | {{:media_14: | + | Le fps est défini à 120 dans le panneau de rendu, le script once.py défini bge.logicsetLogicTicRate(120). Le FPS affiché est calculé avec time(). |
- | {{:media_14: | + | ====Lancement du jeu==== |
- | {{: | + | Lancer blender comme ci-dessus et le script **[[https://github.com/ |
- | 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' | + | blenderplayer ./ |
- | ====Constraint Rigid Body Joint==== | + | et dans un autre terminal, pour l'apprentissage: |
+ | python3 my_cartpole_ppo2_train.py | ||
+ | ou pour le rendu | ||
+ | python3 my_cartpole_ppo2_rendu.py | ||
- | ===Axe=== | + | ===Remarque=== |
- | {{: | + | Le jeu (avec blenderplayer |
- | {{: | + | |
- | ===Rigid Body Joint=== | + | ====Résultat du 1er essai==== |
- | {{ : | + | |
- | ===Pendule=== | + | {{ :media_14:cartpole_avec_blender_game_engine.mp4?500 |}} |
- | {{: | + | |
- | Cette 2ème solution permet | + | Avec un apprentissage |
- | Le Empty a été remplacer | + | =====Comment est définit l' |
+ | **Objectif = target = goal = but**\\ | ||
+ | Le goal est définit | ||
+ | Dans l' | ||
+ | Exemple extrait de Swing Up | ||
+ | <code python> | ||
+ | # La récompense est définie ici, le goal est 0 | ||
- | ==== Source sur Github ==== | + | # 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 | ||
- | * **[[https://github.com/ | + | # Récompense sur x: 1 au centre (x=0), 0 si x = +ou-self.x_threshold |
- | =====Gym CartPole Ressources===== | + | reward_x = np.cos((x |
- | | + | # La récompense totale |
+ | reward = reward_teta | ||
+ | </ | ||
+ | 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 [[https:// | ||
+ | Les sources sont dans le dossier **[[https://github.com/ | ||
+ | Ce pendule a été construit dans l' | ||
- | ====Observation==== | + | {{ : |
- | Liste de 4 items: | + | L' |
- | ^ Num ^ Observation | + | |
- | | 0 | Cart Position | + | |
- | | 1 | Cart Velocity | + | |
- | | 2 | Pole Angle | ~ -41.8° | ~ 41.8°| | + | |
- | | 3 | Pole Velocity At Tip | -Inf | + | |
- | =====pybullet====== | + | =====Quelques explications===== |
- | * **[[pybullet|pybullet]]** est le module | + | ====Relations scripts vs Blender==== |
+ | L' | ||
+ | L' | ||
+ | Dans step(action), | ||
+ | |||
+ | **Dans gym**, dans my_cartpole.py\\ | ||
+ | step() retourne l' | ||
+ | Si done = 1, un [[https:// | ||
+ | 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' | ||
+ | Une récompense (reward) est calculée à chaque step.\\ | ||
+ | Le principe est le même dans my_swing_continuous.py | ||
+ | ====Comment a été amélioré le SwingUp ?==== | ||
+ | ===Actions discrètes ou continues=== | ||
+ | * Dans CartPole, les actions sont discrètes, **une force fixe est appliquée __à chaque step__**, vers la gauche ou vers la droite. Cette action est appliquée par une vitesse dans Blender. | ||
+ | * Pour SwingUp de l' | ||
+ | |||
+ | 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, | ||
+ | |||
+ | ===Algorithme d' | ||
+ | L' | ||
+ | |||
+ | ===Récompense revue pour les débuts des 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, | ||
+ | * Si le pendule est proche de la position verticale avec une vitesse angulaire faible, la récompense " | ||
+ | * Si la vitesse est proche de la vitesse angulaire maxi (environ=5), | ||
+ | |||
+ | reward_total = reward_chariot * reward_balancier * RV | ||
+ | |||
+ | =====Repartir d'un apprentissage terminé et Enregistrement intermédiaire===== | ||
+ | Comment repartir du fichier PPO2_Swing_35.zip, | ||
+ | |||
+ | <code python> | ||
+ | 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(" | ||
+ | env = make_vec_env(' | ||
+ | model = PPO2.load(" | ||
+ | for i in range(20): | ||
+ | model.learn(total_timesteps=100000) | ||
+ | partial = " | ||
+ | model.save(partial, | ||
+ | </ | ||
+ | |||
+ | =====Ressources complémentaires===== | ||
+ | ====Quels sonts les défauts de Gym ?==== | ||
+ | Gym impose un cadre pour tous les chercheurs de RL, ce qui permet de faire des comparaisons entre les solutions.\\ | ||
+ | Mais cela empêche de trouver des solutions originales. En Intelligence Artificielle, | ||
+ | |||
+ | ====Réflexions philosophiques==== | ||
+ | * Ce type d' | ||
+ | * Encore pratiqué dans l' | ||
+ | ====Gym CartPole Ressources==== | ||
+ | |||
+ | * [[https:// | ||
+ | |||
+ | ====pybullet===== | ||
+ | * **[[pybullet|pybullet]]** est un module | ||
+ | |||
+ | Bullet est le moteur physique de Blender | ||
+ | |||
+ | |||
+ | |||
+ | ====Un cartpole réel documenté mais sans RL==== | ||
+ | {{youtube> | ||
+ | |||
+ | * Sergey Royz: Stabilizing pendulum on a cart with full state feedback control | ||
+ | * Articles: [[https:// | ||
+ | * Hardware used in the project: | ||
+ | * DC motor, 12V, gearbox 5:1 [[https:// | ||
+ | * Incremental rotary encoder LPD3806-600BM-G5-24C 600 PPR (motor) Recherche sur [[https:// | ||
+ | * Incremental rotary encoder OMRON E6B2-CWZ6C 2500 PPR (pendulum) | ||
+ | * Power supply 12V, 4A [[https:// | ||
+ | * 10Amp 5V-30V DC Motor Driver [[https:// | ||
+ | * Arduino Mega 2560 [[https:// | ||
+ | * Source code: https:// | ||
- | Mais les exemples de RL appelle baselines, qui a été remplacé par stable-baselines3 | ||
- | ===== Création de votre propre environnement ===== | ||
- | * [[https:// | ||
{{tag>ia sb}} | {{tag>ia sb}} |
apprentissage_par_renforcement.txt · Dernière modification : 2022/02/10 07:52 de serge