Apprentissage par renforcement :
compléments au cours 2007-2008

Philippe Preux, cours MRI, automne 2007.

Cette page a pour objet de résumer et préciser ce que l'on a vu en cours. Je mets l'accent sur l'application et le « comment on fait concrètement ? ».

Comme en cours, on commence par un exemple, le problème du chauffeur de taxi, lequel va nous permettre d'introduire l'intuition de pas mal d'idées et d'algorithmes. Ensuite, on généralisera le problème aux problèmes de décision de Markov.

Plan de cette page :

Rappel du problème du chauffeur de taxi

On traite le problème du chauffeur de taxi. Celui-ci travaille sur 3 villes A, B et C. À chaque instant, il doit décider ce qu'il fait. Il peut :

  1. a1 : rouler en espérant être hélé par un client
  2. a2 : s'arrêter à une station de taxis dans la ville où il se trouve et attendre un client
  3. a3 : stationner son taxi et attendre un appel.

Dans les villes A et C, les 3 actions sont possibles ; dans la ville B, l'action a2 est impossible car il il n'y a pas de station de taxis dans B.
En cours, on s'est donné :

Quel est le comportement optimal du chauffeur de taxi ?
Introduction intuitive et algorithmes de programmation dynamique

Résumons la situation :

Notions de retour, de politique et de fonction valeur

Le chauffeur de taxi veut optimiser (maximiser ici) ses gains dans l'avenir. Pour cela, on définit :
Rt = rt + γ rt+1 + γ2 rt+2 + γ3 rt+3 + ...
soit : Rt = Σk γk rt+k
Ce Rt correspond à une expérience vécue par le chaffeur. Face à un système non déterministe, on s'intéresse non pas à une expérience particulière, mais à une expérience typique, autrement dit, à la valeur moyenne de ce Rt, que l'on note ici E (Rt). en cours, je l'ai noté avec un E avec deux barres verticales, symboles que je ne trouve pas en html (-(, donc je mets E.
On a alors défini la valeur d'un état x comme : V (x) = E (Rt | xt = x)
Cette valeur dépend de la politique de l'agent (comment il choisit ses actions).
Plus précisément, une politique, notée π, se définit comme la probabilité d'émettre une action donnée dans un état donné, donc de la forme  π (x, a).
Donc, pour être tout à fait précis, la valeur d'un état dépend de la politique suivie : on note donc Vπ (x).
On a alors montré l'équation de Bellman :
Vπ (x) = Σa π (x, a) [Σx' P (x, a, x') {R (x, a, x') + γ Vπ (x')} ]
Cette équation relie la valeur de la fonction valeur (un peu lourd, désolé) d'un état à la valeur de cette fonction en d'autres états.
En appliquant cette équation de Bellman, on obtient un systèmes de N équations linéaires, N étant le nombre d'états.

Écrire ce système d'équations pour le problème du chauffeur de taxi pour une politique aléatoire et en prenant γ = 0,9.

Réponse.

Néanmoins, pour un problème arbitraire de taille un peu importante (N = 1 million par exemple), la résolution directe d'un système d'équations linéaires (à N inconnues donc) est pratiquement impossible.
D'autres méthodes sont donc possibles. On en voit deux ci-dessous.

Méthode de Monte Carlo pour évaluer une politique fixée

On veut donc calculer Vπ (x) = E (Σk γk rt+k).
Une méthode consiste à simuler la dynamique du système : on a tous les éléments en main : P qui détermine les probabilités de transition ; R qui détermine les retours de chaque transition effectuée ; il faut se donner une politique : prenons la politique aléatoire ; prenons γ = 0,9.
En considérant successivement chaque état comme état initial, on simule un grand nombre (par exemple 1 million) de trajectoires (par exemple, des trajectoires de 100 pas) en calculant tout au long de cette trajectoire Vπ (état initial) = Σk=0k=99 γk rk. On fait la moyenne de ce million de trajectoire partant du même état initial et cela nous fournit une estimation de sa valeur, pour cette π donnée.
Cette procédure est une méthode de Monte Carlo, méthode extrêmement importante pour la résolution concrète de tas de problèmes d'estimation (moyenne, intégrale, ...).

Écrire un programme qui effectue cette simulation Monte Carlo pour le problème du chauffeur de taxi et déduisez-en la valeur de chacun des états pour une politique aléatoire et pour γ = 0,9.


L'idée de l'approche Monte-Carlo est de simuler la dynamique du système, c'est-à-dire :

Le principe est alors de faire cette estimation un grand nombre de fois pour chacun des états pris comme x0. ; on en fait ensuite la moyenne pour chaque x0. Pour être plus précis, notons mc.genere.trajectoire() une fonction qui, pour un P, R, γ et π fixés, genère une liste de triplets (xt, at, rt)t ∈ {0, ..., T}. On aura alors l'algorithme d'évaluation Monte-Carlo d'une politique défini par :

Notez bien que :

Sur le problème du taxi, en fixant M à 10000 et T à 150, j'obtiens : V (A) ≈ 87,3, V (B) ≈ 98,8 et V (C) ≈ 87,3.
Comme on génère des trajetcoires aléatoirement, si on refait la simulation, on obtient des estimations légérement différentes. On peut (on doit !) en fait faire plusieurs fois ces estimations et les moyenner. En moyennant les résultats de 10 exécutions de cette procédure, j'obtiens : V (A) ≈ 87,38, V (B) ≈ 98,6 et V (C) ≈ 87,37. Et vous ?
4 remarques pour terminer :

Méthode d'évaluation de la politique (policy evaluation)

À partir de l'équation de Belmlman, on peut facilement déduire un algorithme itératif : soit V0 une estimation initiale de la fonction valeur, on itère sur j comme suit :
Vj+1π (x) ← Σa π (x, a) [Σx' P (x, a, x') {R (x, a, x') + γ Vjπ (x')} ]
On boucle simplement sur cette équation (en incrémentant j). Quand la différence entre Vj+1 et Vj+1 est inférieure à un seuil fixé (ε = 10-6 par exemple), on considère que l'algorithme a convergé ; on a l'estimation à ε près de Vπ recherchée.

J'obtiens les estimations V (A) ≈ 87,43, V (B) ≈ 98,56 et V (C) ≈ 87,39. On note que les trois méthodes utilisées trouvent des valeurs très proches les unes des autres.

Remarque : on passe sur le fait que l'algorithme converge et qu'il converge vers ce que l'on veut. Cela se démontre sous des hypothèses qui sont vérifiées par le problème du chauffeur de taxi. On verra plus tard les hypothèses sous lesquelles on a cette si bonne propriété.

Amélioration d'une politique (policy improvement)

Quand on a la fonction valeur d'une politique π, on peut facilement trouver une meilleure politique π' (s'il en existe une). En effet, une politique gloutonne par rapport à Vπ est soit π elle-même, soit meilleure que π.
Précisons que l'on travaille ici avec des politiques déterministes, de la forme π (x) est l'action à effectuer dans l'état x. Si on a π (A) = a2, c'est comme si on a la politique stochastique π (A, a1) = π (A, a3) = 0 et π (A, a2) = 1.
Donc, en résumé : ayant π déterministe, on en déduit π' meilleure ou égale à π comme suit :
forall x in X do
    π' (x) ← argmaxa∈A Σx' P (x, a, x') {R (x, a, x') + γ Vπ (x')}
done

Plus haut, on a calculé la valeur des 3 états pour une politique aléatoire. À partir de là, quel est le résultat fourni par l'algorithme d'amélioration de la politique ?

La politique gloutonne par rapport à l'estimation de V qui a été faite plus haut est :

Détail des calculs pour l'état A :
on cherche l'action qui maximise Σx' P (x, a, x') {R (x, a, x') + γ Vπ (x')}
Prenons x = A, on cherche donc a qui maximise :

soit :

on conclut donc que l'action gloutonne dans l'état A est a1.

Algorithme d'itération de la politique (policy iteration)

Quand on sait évaluer une politique et améliorer une politique, on sait trouver la politique optimale : il suffit d'alterner les deux algorithmes : on converge vers la politique optimale.

Remarque : à nouveau, on passe sur les garanties de convergence et de convergence vers la politique optimale. Le problème du chauffeur de taxi vérifie les hypothèses voulues...

  1. On repart de la politique trouvée plus haut : $\pi_1 (A) = a_1$, $\pi_1 (B) = a_3$ et $\pi_1 (C) = a_2$.
  2. L'algorithme d'itération de la politique en calcule tout d'abord sa valeur : $V^{\pi_1} (A) \approx 119.4, V^{\pi_1} (B) \approx 134.5, V^{\pi_1} (C) \approx 121.9$.
  3. L'amélioration de cette politique donne $\pi_2 (A) = a_2$, $\pi_2 (B) = a_3$ et $\pi_2 (C) = a_2$. On évalue $\pi_2$ : $V^{\pi_2} (A) \approx 121,7, V^{\pi_2} (B) \approx 135.3, V^{\pi_2} (C) \approx 122.8$.
  4. L'amélioration de cette politique donne $\pi_3 (A) = a_2$, $\pi_3 (B) = a_3$ et $\pi_3 (C) = a_2$. On constate que $\pi_3 = \pi_2$. Donc, l'itération de la politique a convergé et ceci est la politique optimale.

En résumé, la politique optimale pour ce problème est :

Algorithme d'itération de la valeur (value iteration)

L'algorithme d'itération de la valeur calcule directement la valeur d'une politique optimale, étant spécifié l'ensemble des états, l'ensemble des actions, P, R et γ. Il s'appuie sur l'équation d'optimalité de Bellman :
V* (x) = maxax' P (x, a, x') {R (x, a, x') + γ V* (x')} ]
L'algorithme d'itération de la valeur consiste à partir d'une estimation quelconque de V0 de V* et d'itérer sur k comme suit :
Vk+1 (x) = maxax' P (x, a, x') {R (x, a, x') + γ Vk (x')} ]
On arrête les itérations quand Vk et Vk-1 sont égales à ε près.

Les problèmes de décision de Markov

Le problème du chauffeur est un représentant d'une classe très générale de problèmes, les problèmes de décision de Markov (PDM). Les algorithmes vus jusque maintenant s'applique à n'importe quel PDM pour en calculer une politique optimale.
Le jeu consiste donc, face à un problème de décision séquentiel (un problème où un agent doit réaliser une suite de décisions pour atteindre un objectif), à formuler ce problème sous la forme d'un PDM et d'utiliser ensuite l'un des algorithmes disponibles pour cela.
Un problème de décision de Markov se définit par :

Récréations markoviennes

Les récréations markoviennes sont ici.

À ce stade, il convient d'adapter, si nécessaire, les fonctions que vous avez écrites plus haut pour qu'elles fonctionnenent pour un quintuplet (X, A, P, R, γ) quelconque.

Algorithmes basés sur la différence temporelle

L'algorithme TD(0)

L'algorithme TD(0) est un algorithme d'évaluation d'une politique qui, contrairement à l'algorithme vu plus haut, n'a pas besoin de P ni de R pour effectuer cette évaluation. Au contraire, l'agent apprend en interagissant avec son environnement et n'a pas besoin d'un modèle de celui-ci.

  1. programmez l'algorithme TD(0)
  2. évaluez la politique aléatoire uniforme
  3. comparez avec les résultats précédents

J'obtiens la courbe d'apprentissage suivante :

où l'on voit, au cours des itérations, l'évolution de l'estimation de la valeur de chacun des états (rouge, noir et bleu). On obtient bien les mêmes valeurs que précédemment.

TD(λ)

TD(λ) est une généralisation de l'algorithme précédent qui correspond au cas particulier λ = 0 (donc connu sous le vocable TD(0)).

  1. programmez l'algorithme TD(λ)
  2. évaluez la politique aléatoire uniforme (prenez λ = 0,5)
  3. comparez avec les résultats précédents
  4. faites varier la valeur de λ; que se passe-t-il ? (Par exemple, vous pouvez observer la vitesse avec laquelle l'algorithme s'approche de la bonne valeur.)

Q-Learning et Q (λ)

  1. programmez l'algorithme Q-Learning
  2. trouvez une politique optimale pour le problème du chauffeur de taxi
  3. comparez avec la politique trouvée par l'algorithme d'itération de la politique
  4. résolvez d'autres PDM tels certains de ceux suggérés sur la page des récréations markoviennes (le 421 et le blackjack par exemple)
  5. programmez l'algorithme Q(λ) et refaites les expérimentations

J'ai utilisé un Q-Learning qui sélectionne ses actions par la stratégie ε-gloutonne. ε est initialisé à 0 et croît comme 1/log(numéro de l'épisode courant + 1).
Le taux d'apprentissage est associé à chaque paire état-action, initialisé à 1 et décroît comme 1 / log (nombre de visites à cette paire état-action).
La tâche n'ayant pas de fin, on arrête après 1000 itérations. On effectue 150 épisodes, chacun fixant l'état initial à chacun des trois états, à tour de rôle.
Sur le problème du chauffeur de taxi, on obtient la fonction Q suivante :

Q (x, a)a1a2 a3
A116,2117,7112,8
B121,6-134,2
C116,6119,1113,0

Remarque : naturellement, il est fort improbable que vous obteniez exactement les mêmes nombres puisque le Q-learning est stochastique. Mais vous devriez obtenir le même genre de nombres (au moins, à une unité près). Surtout, la politique gloutonne devrait être la même (150 épisodes suffisent sur ce problème simple à ce que l'ordre relatif des Q-valeurs pour un état donné soit correct ; un rapide test semble montrer que 60 épisodes suffisent à l'obtention d'une politique gloutonne optimale).
Pour chaque état, la politique optimale consiste à choisir l'action gloutonne, celle qui maximise Q. On observe donc que la politique optimale consiste :

On retrouve bien le même résultat qu'avec l'algorithme d'itération de la politique.

Remarque : le - pour Q (B, a2) correspond à une action impossible dans cet état.

Les PDM de grande taille

Description de deux MDP ayant un espace d'états continu :

Pour vous donnez une idée de ce à quoi ressemble une fonction valeur, voici celle pour le pendule inversé :

et pour le mountain-car :

  1. programmez l'algorithme d'itération sur les valeurs approché sur ces deux problèmes. Vous utiliserez une grille régulière, ou une grille de gaussiennes : faire les deux, c'est mieux pour pouvoir comparer.

En utilisant des CMAC sur le mountain car, R. Sutton obtient l'apprentissage suivant de la fonction valeur.

Liens