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/25 16:10] – [Résultat du 1er essai] 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' | ||
- | |||
{{ : | {{ : | ||
Ligne 61: | Ligne 41: | ||
* [[https:// | * [[https:// | ||
* [[https:// | * [[https:// | ||
- | * [[https:// | + | * [[https:// |
- | * KerasRL | + | |
- | * Tensorforce | + | |
- | * Pyqlearning | + | |
- | * RL_Coach | + | |
- | * TFAgents | + | |
- | * MAME RL | + | |
- | * MushroomRL | + | |
* [[https:// | * [[https:// | ||
+ | |||
+ | ====Principe vulgarisé d'une boucle PID=== | ||
+ | * [[https:// | ||
+ | |||
+ | Dans une boucle de régulation, | ||
+ | {{ : | ||
+ | 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' | ||
+ | L' | ||
+ | L’**environnement** est l' | ||
+ | La **récompense** est calculée en fonction de l' | ||
+ | Une nouvelle **action** est calculée par l' | ||
+ | [[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' |
- | + | ||
- | + | ||
- | * **[[https://stable-baselines3.readthedocs.io/ | + | |
=====Le jeu du pendule dans Blender===== | =====Le jeu du pendule dans Blender===== | ||
- | + | | |
- | La modélisation d'un pendule dans Blender avec le moteur physique intégré (Bullet) est délicate. | + | ====Installation==== |
- | + | ||
- | ====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' | + | |
- | ====Constraint Rigid Body Joint==== | + | |
- | + | ||
- | ===Axe=== | + | |
- | {{: | + | |
- | {{: | + | |
- | + | ||
- | ===Rigid Body Joint=== | + | |
- | {{ : | + | |
- | + | ||
- | ===Pendule=== | + | |
- | {{: | + | |
- | + | ||
- | 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 ==== | + | |
- | + | ||
- | | + | |
- | + | ||
- | ===Soft utilisé=== | + | |
* Debian 10 Buster | * Debian 10 Buster | ||
* python 3.7 | * python 3.7 | ||
* blender game engine 2.79 | * blender game engine 2.79 | ||
- | | + | * stable-baselines |
- | | + | * [[https:// |
- | * [[https:// | + | * CUDA: Pour une carte graphique, [[https:// |
===gym=== | ===gym=== | ||
- | gym n'est pas installé dans le système. | + | gym est installé dans le système |
import sys | import sys | ||
Ligne 165: | Ligne 112: | ||
import gym | import gym | ||
- | ===Bullet dans blender=== | + | Il faut désinstaller gym |
- | Le moteur physique de Blender est Bullet. | + | sudo pip3 uninstall gym |
- | <code python> | + | |
- | def reset(): | + | |
- | gl.num_reset += 1 | + | ===Modification de my_gym=== |
- | x, x_dot, teta, teta_dot | + | Définition de mon environnement dans: **[[https:// |
+ | Un fichier obtenu avec un apprentissage est à: [[https:// | ||
- | if 1 < gl.num_reset < 100: | + | ====Modélisation==== |
- | gl.cube.worldPosition | + | La modélisation d'un pendule dans Blender avec le moteur physique intégré (Bullet) est délicate. |
- | gl.cube.worldLinearVelocity[0] = x_dot | + | ===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' | ||
- | xyz = gl.pendulum.worldOrientation.to_euler() | + | ===Constraint Rigid Body Joint=== |
- | xyz[1] | + | 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 |
- | gl.pendulum.worldOrientation | + | <WRAP group> |
- | gl.pendulum.worldAngularVelocity[1] = teta_dot | + | <WRAP third column> |
- | + | **Axe** | |
- | if gl.num_reset == 100: | + | {{ : |
- | gl.num_reset = 0 | + | {{ :media_14: |
- | gl.reset = 0 | + | </ |
- | </code> | + | <WRAP third column> |
- | + | **Rigid Body Joint** | |
- | ===Visualisation dans blender=== | + | {{ : |
- | Dans le dossier du projet | + | </WRAP> |
- | blenderplayer | + | <WRAP third column> |
+ | **Pendule** | ||
+ | {{ : | ||
+ | </WRAP> | ||
+ | </WRAP> | ||
| | ||
- | Le fps est défini à 120 dans le panneau | + | ===Bullet dans blender=== |
- | Cela devrait faire tourner le rendu et le moteur physique à 120 ! | + | Le moteur physique de Blender |
+ | Il est important d' | ||
+ | {{ : | ||
- | ===Lancement de l'apprentissage=== | + | Exemple d'un reset position et orientation sur 25 frames: [[https:// |
- | Définition de mon environnement dans: | + | 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(). |
- | * **[[https:// | + | |
- | * **[[https:// | + | |
- | * **[[https:// | + | |
- | python3 ./ | + | ====Lancement du jeu==== |
- | + | Lancer blender comme ci-dessus et le script **[[https:// | |
- | Le fichier d' | + | |
- | ===Utilisation=== | + | blenderplayer |
- | Lancer blender comme ci-dessus et le script **[[https:// | + | et dans un autre terminal, pour l' |
+ | python3 my_cartpole_ppo2_train.py | ||
+ | ou pour le rendu | ||
+ | python3 my_cartpole_ppo2_rendu.py | ||
- | python3 blender_baselines_acktr.py | + | ===Remarque=== |
+ | Le jeu (avec blenderplayer | ||
====Résultat du 1er essai==== | ====Résultat du 1er essai==== | ||
+ | |||
+ | {{ : | ||
+ | |||
Avec un apprentissage de quelques heures .... | Avec un apprentissage de quelques heures .... | ||
- | {{ vimeo> | ||
=====Comment est définit l' | =====Comment est définit l' | ||
- | **Objectif = target = goal = but** | + | **Objectif = target = goal = but**\\ |
- | + | Le goal est définit par les règles définissant le " | |
- | Le goal est définit par les règles définissant le " | + | Dans l' |
- | + | ||
- | Le goal est le centre d'un intervale.\\ | + | |
- | En dehors de cet intervalle, pas de récompense: | + | |
- | Dans l' | + | |
Exemple extrait de Swing Up | Exemple extrait de Swing Up | ||
<code python> | <code python> | ||
# La récompense est définie ici, le goal est 0 | # La récompense est définie ici, le goal est 0 | ||
- | # Reward_teta is | + | |
- | # 1 when teta is 90 | + | # Reward_teta is 1 when teta is 90 soit np.cos(teta) de 0 to 90 or -90 to 0, |
- | # np.cos(teta) de 0 to 90 or -90 to 0, | + | |
# 0 if between 90 and 270 or -270 to -90 | # 0 if between 90 and 270 or -270 to -90 | ||
# 0 < Reward_teta < 1 | # 0 < Reward_teta < 1 | ||
reward_teta = max(0, np.cos(teta)) | reward_teta = max(0, np.cos(teta)) | ||
- | # Reward_x is 0 when cart is at the edge of the screen, | + | # Récompense sur x: 1 au centre |
reward_x = np.cos((x / self.x_threshold) * (np.pi / 2.0)) | reward_x = np.cos((x / self.x_threshold) * (np.pi / 2.0)) | ||
Ligne 238: | Ligne 191: | ||
reward = reward_teta * reward_x | 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 [[https:// | ||
+ | Les sources sont dans le dossier **[[https:// | ||
+ | Ce pendule a été construit dans l' | ||
- | ===== Relévement du pendule appelé Swing-up===== | + | {{ :media_14: |
- | + | ||
- | Question: Comment est défini l' | + | |
- | * https://github.com/ | + | L' |
+ | =====Quelques explications===== | ||
+ | ====Relations scripts vs Blender==== | ||
+ | L' | ||
+ | L' | ||
+ | Dans step(action), | ||
- | =====Ressources===== | + | **Dans gym**, dans my_cartpole.py\\ |
- | ===Gym CartPole Ressources=== | + | 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==== | ||
- | Définition des Observations = Liste de 4 items:\\ | + | * [[https://github.com/ |
- | ^ Num ^ Observation | + | |
- | | 0 | Cart Position | + | |
- | | 1 | Cart Velocity | + | |
- | | 2 | Pole Angle | ~ -41.8° | ~ 41.8°| | + | |
- | | 3 | Pole Velocity At Tip | -Inf | + | |
====pybullet===== | ====pybullet===== | ||
Ligne 263: | Ligne 271: | ||
Bullet est le moteur physique de Blender | Bullet est le moteur physique de Blender | ||
- | ==== Création de votre propre environnement ==== | ||
- | * [[https:// | ||
- | L' | + | |
+ | ====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:// | ||
{{tag>ia sb}} | {{tag>ia sb}} |
apprentissage_par_renforcement.txt · Dernière modification : 2022/02/10 07:52 de serge