Vous pouvez exécuter le code TensorFlow vous-même dans ce lien (ou une version PyTorch dans ce lien), ou continuer à lire pour voir le code sans l’exécuter. Comme le code est un peu plus long que dans les parties précédentes, je ne montrerai ici que les éléments les plus importants. L’intégralité du code source est disponible en suivant le lien ci-dessus.
Voici l’environnement de CartPole. J’utilise OpenAI Gym pour visualiser et exécuter cet environnement. Le but est de déplacer le chariot à gauche et à droite, afin de maintenir le poteau dans une position verticale. Si l’inclinaison du poteau est supérieure à 15 degrés par rapport à l’axe vertical, l’épisode se termine et nous recommençons. La vidéo 1 montre un exemple de déroulement de plusieurs épisodes dans cet environnement en prenant des actions de manière aléatoire.
Pour mettre en œuvre l’algorithme DQN, nous allons commencer par créer les DNN principal (main_nn) et cible (target_nn). Le réseau cible sera une copie du réseau principal, mais avec sa propre copie des poids. Nous aurons également besoin d’un optimiseur et d’une fonction de perte.
Puis, nous allons créer le tampon de relecture d’expérience, pour ajouter l’expérience au tampon et l’échantillonner plus tard pour l’entraînement.
Nous écrirons également une fonction d’aide pour exécuter la politique ε-greedy, et pour entraîner le réseau principal en utilisant les données stockées dans le tampon.
Nous définirons également les hyper-paramètres nécessaires et nous entraînerons le réseau neuronal. Nous jouerons un épisode en utilisant la politique ε-greedy, nous stockerons les données dans le tampon de relecture d’expérience, et nous entraînerons le réseau principal après chaque étape. Une fois tous les 2000 pas, nous copierons les poids du réseau principal dans le réseau cible. Nous allons également diminuer la valeur d’epsilon (ε) pour commencer avec une exploration élevée et diminuer l’exploration au fil du temps. Nous verrons comment l’algorithme commence à apprendre après chaque épisode.
Voici le résultat qui sera affiché :
Episode 0/1000. Epsilon: 0.99. Reward in last 100 episodes: 14.0 Episode 50/1000. Epsilon: 0.94. Reward in last 100 episodes: 22.2 Episode 100/1000. Epsilon: 0.89. Reward in last 100 episodes: 23.3 Episode 150/1000. Epsilon: 0.84. Reward in last 100 episodes: 23.4 Episode 200/1000. Epsilon: 0.79. Reward in last 100 episodes: 24.9 Episode 250/1000. Epsilon: 0.74. Reward in last 100 episodes: 30.4 Episode 300/1000. Epsilon: 0.69. Reward in last 100 episodes: 38.4 Episode 350/1000. Epsilon: 0.64. Reward in last 100 episodes: 51.4 Episode 400/1000. Epsilon: 0.59. Reward in last 100 episodes: 68.2 Episode 450/1000. Epsilon: 0.54. Reward in last 100 episodes: 82.4 Episode 500/1000. Epsilon: 0.49. Reward in last 100 episodes: 102.1 Episode 550/1000. Epsilon: 0.44. Reward in last 100 episodes: 129.7 Episode 600/1000. Epsilon: 0.39. Reward in last 100 episodes: 151.7 Episode 650/1000. Epsilon: 0.34. Reward in last 100 episodes: 173.0 Episode 700/1000. Epsilon: 0.29. Reward in last 100 episodes: 187.3 Episode 750/1000. Epsilon: 0.24. Reward in last 100 episodes: 190.9 Episode 800/1000. Epsilon: 0.19. Reward in last 100 episodes: 194.6 Episode 850/1000. Epsilon: 0.14. Reward in last 100 episodes: 195.9 Episode 900/1000. Epsilon: 0.09. Reward in last 100 episodes: 197.9 Episode 950/1000. Epsilon: 0.05. Reward in last 100 episodes: 200.0 Episode 1000/1000. Epsilon: 0.05. Reward in last 100 episodes: 200.0
Maintenant que l’agent a appris à maximiser la récompense pour l’environnement CartPole, nous allons faire interagir l’agent avec l’environnement une fois de plus, pour visualiser le résultat et voir qu’il est maintenant capable de garder la perche en équilibre pendant 200 images.
Vous pouvez exécuter vous-même le code TensorFlow dans ce lien (ou une version PyTorch dans ce lien).