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édenteDernière révisionLes deux révisions suivantes | ||
apprentissage_par_renforcement [2021/02/08 14:50] – [Source sur Github] serge | apprentissage_par_renforcement [2022/02/10 07:52] – [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 group> | ||
<WRAP third column> | <WRAP third column> | ||
Ligne 17: | Ligne 14: | ||
{{youtube> | {{youtube> | ||
</ | </ | ||
- | |||
<WRAP third column> | <WRAP third column> | ||
Rotatif: | Rotatif: | ||
Ligne 27: | Ligne 23: | ||
</ | </ | ||
</ | </ | ||
- | + | * Rotary Inverted Pendulum: Swing Up and Stabilization https:// | |
- | + | * Double Inverted Furuta Pendulum https:// | |
- | + | * Furuta Pendulum avec une belle finition https:// | |
- | + | ||
- | + | ||
=====Apprentissage par renforcement===== | =====Apprentissage par renforcement===== | ||
* **[[https:// | * **[[https:// | ||
- | ====Directeur | + | ====Directeur |
{{ youtube> | {{ youtube> | ||
Le directeur de l' | Le directeur de l' | ||
- | |||
{{ : | {{ : | ||
Ligne 52: | Ligne 44: | ||
* [[https:// | * [[https:// | ||
- | ====Principe vulgarisé==== | + | ====Principe vulgarisé |
- | ===Boucle | + | |
* [[https:// | * [[https:// | ||
Ligne 61: | Ligne 52: | ||
{{ : | {{ : | ||
- | + | ====Principe vulgarisé de l'Apprentissage par Renforcement==== | |
- | ===Apprentissage par renforcement=== | + | **RL = Reinforcement Learning = Apprentissage par Renforcement** |
{{ : | {{ : | ||
+ | L'IA (Intelligence Artificielle) dont nous parlons ici n'est pas intelligente, | ||
Dans l' | Dans l' | ||
- | L' | + | L'**agent** est le programme de RL de l'**IA**.\\ |
- | L' | + | L'**action** est "à droite" |
- | L’environnement est l' | + | L’**environnement** est l' |
- | La récompense est calculée en fonction de l' | + | La **récompense** est calculée en fonction de l' |
- | Une nouvelle action est calculée par l' | + | Une nouvelle |
[[https:// | [[https:// | ||
- | |||
Dans [[https:// | Dans [[https:// | ||
Ligne 78: | Ligne 68: | ||
====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==== | ||
Ligne 92: | Ligne 78: | ||
===Stable-baselines=== | ===Stable-baselines=== | ||
- | Le code de Baselines | + | Le code de Stable-baselines |
sudo pip3 install stable-baselines | sudo pip3 install stable-baselines | ||
- | |||
- | * **[[https:// | ||
===Stable-baselines3=== | ===Stable-baselines3=== | ||
+ | **[[https:// | ||
- | Stable Baselines3 est la prochaine version. Mais les exemples ne sont plus compatibles. | + | 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 stable-baselines3[extra] | + | 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' |
- | + | 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==== | + | |
- | 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** | + | |
- | {{: | + | |
- | </ | + | |
- | </ | + | |
- | + | ||
- | + | ||
- | + | ||
- | ==== Source sur Github ==== | + | |
- | | + | |
- | + | ||
- | ===Installation=== | + | |
* 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:// | |
- | ===CUDA=== | + | |
- | Pour une carte graphique, [[https:// | + | |
===gym=== | ===gym=== | ||
Ligne 162: | Ligne 114: | ||
Il faut désinstaller gym | Il faut désinstaller gym | ||
sudo pip3 uninstall 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. Exemple d'un reset position et orientation sur 100 frames: | ||
- | <code python> | ||
- | def reset(): | ||
- | gl.num_reset += 1 | ||
- | x, x_dot, teta, teta_dot = gl.reset | ||
- | # Blocage des positions | + | ===Modification de my_gym=== |
- | if 1 < gl.num_reset < 200: | + | Définition de mon environnement dans: **[[https:// |
- | gl.cube.suspendDynamics() | + | Un fichier obtenu avec un apprentissage est à: [[https:// |
- | gl.pendulum.disableRigidBody() | + | |
- | gl.cube.worldPosition = [x, 0.738772, 0] | + | |
- | gl.cube.worldLinearVelocity[0] = 0 | + | |
- | # Blocage du pendule | + | ====Modélisation==== |
- | if 200 < gl.num_reset < 400: | + | La modélisation d'un pendule dans Blender avec le moteur physique intégré (Bullet) est délicate. |
- | gl.cube.restoreDynamics() | + | ===Un axe static et un cube Rigid Body avec un trou=== |
- | gl.pendulum.enableRigidBody() | + | {{: |
- | xyz = gl.pendulum.worldOrientation.to_euler() | + | {{: |
- | # | + | {{: |
- | xyz[1] = teta | + | {{: |
- | gl.pendulum.worldOrientation = xyz.to_matrix() | + | Le pendule |
- | gl.pendulum.worldAngularVelocity[1] = 0 | + | |
- | # Vitesse initiale | + | ===Constraint Rigid Body Joint=== |
- | if 400 < gl.num_reset < 450: | + | 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.cube.worldLinearVelocity[0] = x_dot | + | <WRAP group> |
- | gl.pendulum.worldAngularVelocity[1] = teta_dot | + | <WRAP third column> |
- | + | **Axe** | |
- | # Fin | + | {{ :media_14: |
- | if gl.num_reset == 450: | + | {{ : |
- | gl.num_reset = 0 | + | </ |
- | gl.reset = 0 | + | <WRAP third column> |
- | gl.first = 1 | + | **Rigid Body Joint** |
- | </code> | + | {{ : |
- | + | </WRAP> | |
- | ===Visualisation dans blender=== | + | <WRAP third column> |
- | Dans le dossier du projet | + | **Pendule** |
- | blenderplayer | + | {{ : |
+ | </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' | ||
+ | {{ : | ||
- | ===Scene Physics=== | + | Exemple d'un reset position et orientation sur 25 frames: [[https://github.com/ |
- | De nombreux paramètres modifiable ! | + | 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:scene_physics.png? | + | |
- | ===Lancement | + | ====Lancement |
- | Définition de mon environnement dans: | + | Lancer blender comme ci-dessus et le script |
- | * **[[https:// | + | |
- | * **[[https:// | + | |
- | * **[[https:// | + | |
blenderplayer ./ | blenderplayer ./ | ||
+ | et dans un autre terminal, pour l' | ||
python3 my_cartpole_ppo2_train.py | python3 my_cartpole_ppo2_train.py | ||
- | + | ou pour le rendu | |
- | Le fichier d' | + | |
- | + | ||
- | ===Utilisation=== | + | |
- | Lancer blender comme ci-dessus et le script **[[https:// | + | |
- | + | ||
- | blenderplayer ./ | + | |
python3 my_cartpole_ppo2_rendu.py | python3 my_cartpole_ppo2_rendu.py | ||
===Remarque=== | ===Remarque=== | ||
- | Le jeu (avec blenderplayer ...) ne doit être lancé qu'une seule fois! On peut lancer ou stopper | + | Le jeu (avec blenderplayer ...) ne doit être lancé qu'une seule fois! On peut lancer ou stopper |
====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> | ||
Ligne 258: | 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. | 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===== | ===== Relèvement du pendule appelé Swing-up===== | ||
+ | Les [[https:// | ||
+ | Les sources sont dans le dossier **[[https:// | ||
+ | Ce pendule a été construit dans l' | ||
- | Les [[https:// | + | {{ :media_14:swingup_dans_le_blender_game_engine.mp4? |
- | Ici nous déplaçons le chariot pour le Swing. Cet exemple est construit à partir de[[https://github.com/ | + | |
- | Les sources sont dans le dossier **[[https://github.com/ | + | L' |
- | Un résultat après 6 heures d' | + | =====Quelques explications===== |
- | {{ vimeo>504768109?large }} | + | ====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===== | =====Repartir d'un apprentissage terminé et Enregistrement intermédiaire===== | ||
- | Pour repartir du fichier PPO2_Swing_35.zip, | + | Comment |
<code python> | <code python> | ||
import gym | import gym | ||
- | |||
from time import time, strftime | from time import time, strftime | ||
- | |||
from stable_baselines.common.policies import MlpPolicy | from stable_baselines.common.policies import MlpPolicy | ||
from stable_baselines.common import make_vec_env | from stable_baselines.common import make_vec_env | ||
Ligne 282: | Ligne 246: | ||
log = strftime(" | log = strftime(" | ||
- | |||
env = make_vec_env(' | env = make_vec_env(' | ||
model = PPO2.load(" | model = PPO2.load(" | ||
- | |||
for i in range(20): | for i in range(20): | ||
model.learn(total_timesteps=100000) | model.learn(total_timesteps=100000) | ||
Ligne 291: | Ligne 253: | ||
model.save(partial, | model.save(partial, | ||
</ | </ | ||
- | | ||
- | | ||
- | | ||
- | =====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' | ||
- | Définition des actions, avec 2 valeurs possibles: 0 ou 1, 0 = force à gauche, 1 = force à droite | + | =====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, | ||
- | action_space | + | ====Réflexions philosophiques==== |
- | + | * Ce type d'apprentissage s' | |
- | Définition des actions de SwingUp, avec des valeurs possibles entre -1 et 1 | + | * Encore pratiqué dans l'enseignement |
- | + | ||
- | action_space | + | |
- | + | ||
- | ===Algorithme d' | + | |
- | + | ||
- | L' | + | |
- | ====Relations scripts vs Blender==== | + | |
- | L' | + | |
- | L' | + | |
- | Dans step(action), | + | |
- | + | ||
- | **Dans gym,**\\ | + | |
- | 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 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 | + | |
- | Après un long apprentissage, | + | |
- | Ajout d'une récompense | + | |
- | * 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 | + | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | =====Ressources complémentaires===== | + | |
====Gym CartPole Ressources==== | ====Gym CartPole Ressources==== | ||
- | * [[https:// | + | * [[https:// |
- | + | ||
- | Définition des Observations = Liste de 4 items:\\ | + | |
- | ^ Num ^ Observation | + | |
- | | 0 | Cart Position | + | |
- | | 1 | Cart Velocity | + | |
- | | 2 | Pole Angle | ~ -41.8° | ~ 41.8°| | + | |
- | | 3 | Pole Velocity At Tip | -Inf | + | |
====pybullet===== | ====pybullet===== | ||
Ligne 351: | 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==== | ====Un cartpole réel documenté mais sans RL==== |
apprentissage_par_renforcement.txt · Dernière modification : 2022/02/10 07:52 de serge