Je kunt de TensorFlow code zelf uitvoeren in deze link (of een PyTorch versie in deze link), of blijf lezen om de code te zien zonder hem uit te voeren. Omdat de code iets langer is dan in de vorige delen, zal ik hier alleen de belangrijkste stukken laten zien. De volledige broncode is beschikbaar via de link hierboven.
Hier is de CartPole omgeving. Ik gebruik OpenAI Gym om deze omgeving te visualiseren en uit te voeren. Het doel is om de kar naar links en rechts te bewegen, om de paal in een verticale positie te houden. Als de helling van de paal meer dan 15 graden afwijkt van de verticale as, zal de episode eindigen en beginnen we opnieuw. Video 1 laat een voorbeeld zien van het uitvoeren van verschillende episodes in deze omgeving door willekeurig acties uit te voeren.
Om het DQN-algoritme te implementeren, beginnen we met het maken van de hoofd- (main_nn) en doel- (target_nn) DNNs. Het doelnetwerk wordt een kopie van het hoofdnetwerk, maar met een eigen kopie van de gewichten. We hebben ook een optimizer en een verliesfunctie nodig.
Volgende zullen we de experience replay buffer maken, om de ervaring aan de buffer toe te voegen en deze later te samplen voor training.
We zullen ook een helperfunctie schrijven om het ε-greedy-beleid uit te voeren en het hoofdnetwerk te trainen met behulp van de gegevens die in de buffer zijn opgeslagen.
We zullen ook de nodige hyperparameters definiëren en we zullen het neurale netwerk trainen. We spelen een episode af met de ε-greedy policy, slaan de gegevens op in de experience replay buffer, en trainen het hoofdnetwerk na elke stap. Eens in de 2000 stappen, kopiëren we de gewichten van het hoofdnetwerk naar het doelnetwerk. We zullen ook de waarde van epsilon (ε) verlagen om met een hoge exploratie te beginnen en de exploratie na verloop van tijd te verlagen. We zullen zien hoe het algoritme begint te leren na elke episode.
Dit is het resultaat dat zal worden weergegeven:
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
Nu de agent heeft geleerd om de beloning voor de CartPole-omgeving te maximaliseren, zullen we de agent nog één keer met de omgeving laten interageren, om het resultaat te visualiseren en te zien dat hij nu in staat is om de paal gedurende 200 frames in balans te houden.
U kunt de TensorFlow-code zelf uitvoeren in deze link (of een PyTorch-versie in deze link).