L’apprentissage par renforcement est avec les réseaux de neurones par convolution et les réseaux de neurones récurrents, celui qui obtient les résultats les plus spectaculaires mais son utilité dans des cas pratiques est discutée (hormis le domaine du jeu).

Pour illustrer l’apprentissage par renforcement, le toolkit choisi est celui de Gym,  et le code celui de Taxi-v2 présenté ici : Reinforcement Q-Learning from Scratch in Python with OpenAI Gym.

L’exercice est le suivant : un taxi (en jaune ci-dessous) doit prendre un passager (en bleu) et le déposer là où il l’a demandé (en magenta). Le taxi peut se déplacer dans un espace de 5 lignes et 5 colonnes (25 possibilités) mais ne peut pas traverser les murs (barres verticales).

Le passager peut appeler le taxi à un des 4 coins (R, G, Y, B) et peut demander à être déposé à un de ces 4 coins. Lorsque le taxi est libre, il est en jaune, lorsqu’il est occupé par le passager, il est en vert. Le but est de faire le trajet en un minimum d’étapes.

L’apprentissage par renforcement est très simple. Il faut maximiser le nombre de récompenses. Dans le cas du taxi, déposer le passager au bon endroit permet d’obtenir 20 points, prendre le passager au mauvais endroit ou le déposer au mauvais endroit se voit attribuer une pénalité de 10 points, et chaque déplacement se voit attribuer une pénalité de 1 point.

Le taxi peut effectuer 6 actions :

  1. déplacement au Nord, Sud, Est, Ouest (4)
  2. Prendre un passager
  3. Déposer un passager

Il y a donc 500 états(5 lignes * 5 colonnes * 4 positions de départ du passager * 5 positions du passager à l’arrivée (4 + 1 quand il est dans le taxi)).

Gym

Gym propose plusieurs environnements de simulation pour s’entraîner à l’apprentissage par renforcement.

env.render() permet d’afficher l’écran présenté ci-dessus.

env.action_space indique le nombre d’actions et env.observation_space le nombre d’états. On ne peut pas agir sur ces valeurs liées à l’environnement, pas plus qu’on ne peut agir sur les récompenses/pénalités.

Par exemple, pour l’état 328, les pénalités sont de -1 pour chaque action, sauf pour les actions 4 et 5 (prendre le passager, déposer le passager) pour lesquels la pénalité est de -10.

q_table

L’apprentissage présenté ici utilise le Q learning.

Comme pour tous les apprentissages par renforcement, il s’agit de maximiser le nombre de récompenses. Une récompense est ce qu’on obtient à court terme (la récompense immédiate lorsqu’on effectue une action, cette récompense est dans la table env.P) et une récompense différée, égale à toutes les récompenses obtenues de l’état courant à l’état final (cette récompense est dans la table Q)

Au départ, la q_table est initialisée à 0.

Ensuite la q_table est mise à jour à partir de la formule suivante :

Q(state,action)←(1−α)Q(state,action)+α(reward+γ max a Q(next state,all actions))

α (alpha) est le pas d’apprentissage (0<α≤1) Son rôle est identique à celui des réseaux de neurones,

γ (gamma) est le poids donné selon l’éloignement temporel (0≤γ≤1) c’est ce qui nous permet d’indiquer l’importance accordée aux récompenses futures.

Une valeur de gamma proche de 1 accorde beaucoup d’importance aux récompenses futures alors que voisine de 0 l’agent considère essentiellement les récompenses immédiates (greedy : avide)

apprentissage

L’apprentissage consiste-, dans notre cas, à itérer 100000 fois et mettre à jour la Q table à chaque itération.

Vous remarquerez un paramètre Epsilon. Il permet de faire en sorte que de manière aléatoire, le logiciel choisisse de temps en temps, d’explorer de nouveaux chemins.

Résultats

On constate que les 10 premières fois de l’apprentissage, le nombre d’étapes moyen pour prendre et déposer le passager au bon endroit est supérieur à 700 fois. Ce nombre est de 400 de la 10ème à la 100ème fois, de 14,2 de la 9000ème à la 10000ème fois et de 14 de la 90000ème à la 100000ème fois.

Après la 100 000ème fois, les résultats sont d’environ 12 étapes en moyenne.

L’apprentissage est réussi.