Outils pour utilisateurs

Outils du site


apprentissage_par_renforcement

Ceci est une ancienne révision du document !


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

Principe vulgarisé

Boucle PID

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

L'IA (Intelligence Artificielle) dont nous parlons ici n'est pas intelligente, par contre l'auteur est intelligent sinon il n'aurait jamais réussi à faire un truc pareil!

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.com 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.

  • Gym @ en.wikipedia.org
  • Gym @ github.com/openai
  • Gym @ gym.openai.com/docs

Baselines vs Stable-baselines vs Stable-baselines3

Baselines

Baselines est un projet OpenAI. Mal foutu, plus maintenu.

Stable-baselines

Le code de Stable-baselines est nettoyé, amélioré, documenté. Documentation de stable-baselines @ stable-baselines.readthedocs.io

 sudo pip3 install stable-baselines

Stable-baselines3

Stable-Baselines3 est la prochaine version. Mais les exemples ne sont plus compatibles. Documentation de stable-baselines3 @ stable-baselines3.readthedocs.io

sudo pip3 install stable-baselines3 stable-baselines3[extra]

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 20 ms.
Un fichier pour le tester: cartpole_doc_baselines.py

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), qui simule le réel. Les calculs peuvent alors aller beaucoup plus vite, 20 fois par rapport au réel.

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

Axe

Rigid Body Joint

Pendule

Source 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 éteindre votre écran avec le bouton on/off.

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 important d'ajouter des substeps dans Blender Properties Scene Physics  Exemple d'un reset position et orientation sur 25 frames: def reset():
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().

Apprentissage

Définition de mon environnement dans: __init__.py __init__.py my_cartpole.py Le rendu et le script, dans le dossier des sources,

blenderplayer ./balance/balance.blend

et dans un autre terminal:

python3 my_cartpole_ppo2_train.py

Le fichier d'apprentissage est à: ppo2_cartpole250000.zip

Utilisation

Lancer blender comme ci-dessus et le script my_cartpole_ppo2_rendu.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 le script python ou Blender, à son bon vouloir, la reconnexion est automatique. Çà c'est trop fort et super génial!

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. Il 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 ou Rendu en modifiant le script ligne 47.
Ce pendule a été construit dans l'Atelier du C01N de mon salon:

L'apprentissage a duré 88 heures, 17 millions de steps, plus plusieurs semaines de recherche et d'ordinateurs qui calcule 24h/24h.
Le fichier de poids fonctionne sur Xubuntu 18.4 mais pas sur Debian 10: il doit y avoir une version d'une des librairies qui diffèrent.

Quelques explications

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 my_swing_continuous.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 la frame suivante. Cette réponse est une observation à cet instant, position et vitesse du chariot, angle et vitesse angulaire du pendule.

Dans gym, dans my_cartpole.py
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 à 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'exemple ci-dessus, la même méthode est utilisée. Mais les actions sont comprises entre -1 et 1.

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.

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, 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, utilisée pour les 5 premiers millions de steps.

  • 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

Repartir d'un apprentissage terminé et Enregistrement intermédiaire

Comment repartir du fichier PPO2_Swing_35.zip, et enregistrement tous les 100 000 steps: How to create checkpoints ?

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)

Ressources complémentaires

Réflexions philosophiques

  • Ce type d'apprentissage s'appelle la carotte et le bâton: management très pratiqué. On promet des carottes mais on ne donne que des coups de bâtons.
  • Encore pratiqué dans l'enseignement en France, alors que les pays nordiques considèrent les apprenants comme des êtres humains responsables.

Gym CartPole Ressources

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

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

,
apprentissage_par_renforcement.1612979101.txt.gz · Dernière modification : 2021/02/10 17:45 de serge