On poursuit l'étude du cas des espaces d'états infinis, non dénombrables.
Dans ce TP, on va s'intéresser à un algorithme très simple bien adapté à ce type de problèmes, le Neural Fitted Q-iteration, qui a été introduit par M. Riedmiller en 2005 dans ce papier que je vous encourage à lire.
Comme dans le TP précédent, on utilise le pendule inversé et la voiture dans la montagne.
Vos expériences doivent être reproductibles.
À faire : implanter cet algorithme.
Encore une fois, faire en sorte que l'implantation soit générique.
Le régresseur sera un perceptron multi-couches.
On utilise cette bilbliothèque logicielle. Elle est installée sur les ordinateurs en salle TP. Sur votre ordinateur personnel, il faut peut-être l'installer.
Pour compiler avec gcc
, on spécifiera l'option -lfann
.
La documentation est là.
Je donne un petit exemple d'utilisation de cette bibliothèque dans cette archive pour une tâche de classification supervisée.
On utilise cette bilbliothèque logicielle. Elle est installée sur les ordinateurs en salle TP. Sur votre ordinateur personnel, il faut peut-être l'installer.
La documentation est là.
Je donne un petit exemple d'utilisation de cette bibliothèque dans cette archive pour une tâche de classification supervisée.
Vous résolvez les deux problèmes vus au TP précédent, le pendule inversé et la voiture dans la montagne. Pour chacun, vous essayez d'obtenir les meilleures performances de votre algorithme. Il y a beaucoup de paramètres et de détails qui peuvent être modifiés et qui influencent les performances de l'algorithme.
Lorsque votre algorithme fonctionne, réalisez une vingtaine d'épisodes de test, c'est-à-dire que vous utilisez l'estimation de la qualité \( \widehat{Q} \) et que vous exécutez 20 fois la politique gloutonne. À chaque exécution, vous mesurez le retour, c'est-à-dire la somme des retours immédiats pondérés, \( R = \sum_t \gamma^t r_t \). Quelle est la médiane ? Quelle est la variabilité de \( R \) ?
L'utilisation de réseau de neurones dans un algorithme d'apprentissage par renforcement n'est pas si simple. On l'a vu précédemment, le Q-Learning tabulaire est sensible aux paramètres de l'algorithme et à la manière de le mettre en œuvre. Quand on remplace la table par un réseau de neurones, la sensibilité augmente. Par exemple, la première question que l'on se pose est : quelle architecture choisir pour le MLP ? Je conseille de suivre l'exemple de M. Riedmiller explicité dans son papier cité plus haut : deux couches cachées de 5 neurones chacune, fonction d'activation tangente hyperbolique et un neurone dans la couche de sortie avec une fonction d'activation linéaire. D'une mannière générale, si on ne vous donne pas de conseil, il faut tester plusieurs architectures en réalisant une simple tâche de régression. Dans le cas présent, vous collectez un premier \( {\cal D}_0 \) et vous entraînez un régresseur constitué d'une seule couche cachée avec quelques neurones seulement (5 par exemple, attention la valeur par défaut dans scikit_learn (100) est TOTALEMENT RIDICULE). Si l'erreur est importante, c'est que votre MLP n'est pas assez gros. Vous ajoutez une deuxième couche, etc. Si avec 5 couches cachées l'erreur est toujours importante, il y a un autre problème. Reprendre la même démarche en utilisant 1, puis 2, puis ... avec plus de neurones par couche.
Si ça ne marche toujours pas, il faut regarder les paramètres de l'algorithme d'apprentissage. En utilisant lbfgs, il n'y a pas de paramètre. Cependant, cet algorithme peut être piégé dans un mauvais minimum local mais tant que le jeu de données est petit et le réseau est lui-même petit, en général, lbfgs fonctionne bien.
Pour ce TP, on fait des choses simples, donc un petit réseau doit fonctionner sans difficulté. Et en général, en apprentissage par renforcement, on utilise toujours de petits réseaux de neurones. On entend souvent parler de deep reinforcement learning, c'est une dénommination trompeuse : l'apprentissage par renforcement n'est jamais profond (au sens du deep learning, apprentissage profond). On utilise des réseaux un peu moins superficiels (10 à 15 couches) quand l'état est une donnée complexe, comme une image. Mais dans ce cas, la plupart des couches servent à calculer une représentation de l'image qui est ensuite traitée par un MLP peu profond lequel est le réseau qui est utilisé dans l'algorithme d'apprentissage par renforcement.
À l'issue de ce TP, votre programme doit pouvoir être appliqué à n'importe quel problème de décision de Markov à espace d'états continu.