On peut pour chaque état écrire une équation de Bellman. Par exemple, pour l'état B :
Ici, l'environnement est particulièrement simple, il n'y a pas de transitions aléatoires.
On pourrait mettre l'ensemble de ces équations sous forme matricielle :
Et résoudre le système linéaire :
C'est ce que fait le code Python ci-desous.
import numpy as np
states = ["I", "B", "R", "BB", "BR", "RR"]
R = np.array([1., 1., 1., 0., 10., 20.])
P = np.array([
[0., 1., 0., 0., 0., 0.],
[0., 0., 0., 1., 0., 0.],
[0., 0., 0., 0., 1., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
])
gamma = 1.
V = np.linalg.pinv(np.eye(P.shape[0]) - gamma*P) @ R
for name, v in zip(states, V):
print("V[%s] = %.5f" % (name, v))
Dans la pratique, on utilisera plutôt une solution itérative. On initialise la valeur de chaque état à 0, puis on répètera la mise à jour suivante :
Pour chaque état. L'algorithme continuera jusqu'à ce que
L'algorithme peut alors s'écrire :
Reinforcement learning: an introduction, second edition, page 97
Dans l'algorithme ci-dessus, la politique est elle aussi aléatoire, d'où l'apparition de
Exécutons cet algorithme sur le problème de l'étudiant :
En vert, la fonction de valeur est initialement à
Voici les itérations successives :
Exemple
En repartant de l'itération 2 ci-dessus, obtenue par l'évaluation d'une politique (médiocre) dans l'environnement de l'étudiant :
On pourrait construire une nouvelle politique en appliquant la logique gourmande pour chaque état.
Par exemple, pour l'état R
, on a le choix entre:
boire
: BR
, retour estimé reviser
: RR
, retour estimé C'est donc cette deuxième action qui est choisie.
Nous pouvons donc suivre l'algorithme suivant :
Bonne nouvelle
En suivant cette alternance (évaluation/amélioration), nous sommes assurés de converger vers une politique optimale.
C'est un schéma que nous retrouverons dans tous les algorithmes d'apprentissage par renforcement.
L'algorithme de policy iteration nécessite une alternance entre calcul de la politique gourmande et calcul de la fonction de valeur. Il est nécessaire d'obtenir la fonction de valeur avant de pouvoir calculer la nouvelle politique gourmande.
Une amélioration possible est de mettre (virtuellement) à jour la politique gourmande à chaque itération de la fonction de valeur. C'est ce que fait l'algorithme de value iteration.
Reinforcement learning: an introduction, second edition, page 105
Exemple
En guise d'exemple au tableau, nous pouvons faire tourner à la main l'algorithme de value iteration sur l'environnement suivant.
-1
à chaque déplacement,