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:

Double pendule:

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

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.

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

Baselines vs Stable-baselines vs Stable-baselines3

OpenAI Baselines is a set of high-quality implementations of reinforcement learning algorithms. “Chef, Le meilleur des meilleurs, chef”

Baselines

Baselines est un projet OpenAI. Les dépendances sont anciennes, l'installation est quasi impossible et Stable-baselines est mieux!

Stable-baselines

Main differences with OpenAI Baselines. This toolset is a fork of OpenAI Baselines, with a major structural refactoring, and code cleanups:

  • Unified structure for all algorithms
  • PEP8 compliant (unified code style)
  • Documented functions and classes
  • More tests & more code coverage
  • Additional algorithms: SAC and TD3 (+ HER support for DQN, DDPG, SAC and TD3)
 sudo pip3 install stable-baselines

Successfully installed Pillow-7.2.0 atari-py-0.2.6 cloudpickle-1.6.0 cycler-0.10.0 future-0.18.2 gym-0.18.0 joblib-1.0.0 kiwisolver-1.3.1 matplotlib-3.3.3 opencv-python-4.5.1.48 pandas-1.1.5 pyglet-1.5.0 pyparsing-2.4.7 python-dateutil-2.8.1 pytz-2020.5 scipy-1.5.4 stable-baselines-2.10.1

Stable-baselines3

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
sudo pip3 install stable-baselines3[extra]

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

Si vous avez une carte graphique, (mais elle n'est pas du tout nécessaire), installation_de_cuda.

Installation avec cuda sur Xubuntu 18.04

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. Exemple d'un reset position et orientation sur 100 frames:

def reset():
    gl.num_reset += 1
    x, x_dot, teta, teta_dot = gl.reset
 
    # Blocage des positions
    if 1 < gl.num_reset < 200:
        gl.cube.suspendDynamics()
        gl.pendulum.disableRigidBody()
        gl.cube.worldPosition = [x, 0.738772, 0]
        gl.cube.worldLinearVelocity[0] = 0
 
    # Blocage du pendule
    if 200 < gl.num_reset < 400:
        gl.cube.restoreDynamics()
        gl.pendulum.enableRigidBody()
        xyz = gl.pendulum.worldOrientation.to_euler()
        # Le pendule est à teta=0 en haut
        xyz[1] = teta
        gl.pendulum.worldOrientation = xyz.to_matrix()
        gl.pendulum.worldAngularVelocity[1] = 0
 
    # Vitesse initiale
    if 400 < gl.num_reset < 450:
        gl.cube.worldLinearVelocity[0] = x_dot
        gl.pendulum.worldAngularVelocity[1] = teta_dot
 
    # Fin
    if gl.num_reset == 450:
        gl.num_reset = 0
        gl.reset = 0
        gl.first = 1

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)
Cela devrait faire tourner le rendu et le moteur physique à 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.

Un résultat après 6 heures d'apprentissage, soit 1 million de steps.

Vous pouvez remarquer que maintenant c'est en couleurs!

Les sources sont dans le dossier redressement de balance. Training et Rendu.

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.

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

Ressources complémentaires

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.1612191827.txt.gz · Dernière modification : 2021/02/01 15:03 de serge