[PYTHON] Je veux que DQN Puniki frappe un home run
Deep Q-Network (DQN)
J'ai trouvé intéressant Deep Q-Network, qui utilise Deep Learning + apprentissage amélioré pour apprendre les modèles de comportement, alors je l'ai implémenté. Je vais le publier car j'ai un petit résultat.
Le code source est disponible ci-dessous.
https://github.com/dsanno/chainer-dqn
Ce qui suit est détaillé sur DQN.
Histoire de DQN + Deep Q-Network écrite dans Chainer
Objectif d'apprentissage
Le jeu que DQN apprendra cette fois est Homelander Bee de Kuma no Pooh! . (Notez qu'un son sera entendu à la destination du lien)
Le but est de faire en sorte qu'Aniki, également connu sous le nom de Puniki, frappe de nombreux circuits.
Les raisons de choisir ce jeu sont les suivantes
- Règles simples
Frappez la balle lancée par le lanceur avec un journal et frappez le nombre spécifié de circuits pour l'effacer.
- Récompense facile à juger
Puisque le résultat est montré par des images telles que "home run" et "strike", nous donnerons une récompense correspondant à l'image
Il y avait aussi une raison pour laquelle c'était très difficile pour les humains, mais je ne pouvais pas atteindre le point où cela devenait difficile. (Référence: [Niko Niko Encyclopedia](http://dic.nicovideo.jp/a/%E3%81%8F%E3%81%BE%E3%81%AE%E3%83%97%E3%83% BC% E3% 81% 95% E3% 82% 93% E3% 81% AE% E3% 83% 9B% E3% 83% BC% E3% 83% A0% E3% 83% A9% E3% 83% B3% E3% 83% 80% E3% 83% BC% E3% 83% 93% E3% 83% BC!))
Environnement de développement
- Windows 10
- Chainer 1.5.1
- Utilisez PyAutoGUI pour la capture d'écran et le fonctionnement
- GeForce GTX970
Il faut trop de temps pour apprendre avec le processeur et cela ne fonctionne pas bien
Configuration du réseau neuronal
- L'entrée est de 150 x 112 x 3 canaux de données de pixels. La taille de l'écran de jeu est de 600 x 450px, mais l'image capturée est réduite de 1/4 verticalement et horizontalement et en entrée.
- La sortie est un vecteur d'évaluations comportementales.
La longueur du vecteur correspond au nombre de modèles de comportement.
Cette fois, la coordonnée Y du pointeur est fixe et la coordonnée X est modifiée en 33 étapes.
Le bouton a deux états, ON et OFF, et a un total de 66 modèles d'action.
- Les couches intermédiaires sont le réseau neuronal convolutif avec 3 couches, LSTM avec 1 couche et la couche entièrement connectée avec 1 couche.
À propos du jeu
- Sur l'écran titre, l'écran de sélection du lanceur, etc., cliquez sur la position spécifiée.
- Pendant le match, l'écran est capturé toutes les 100 ms et utilisé comme image d'entrée. (Ci-après, l'unité d'intervalle de 100 ms est appelée "trame") Le motif d'action avec la valeur d'évaluation la plus élevée est l'action de la trame suivante.
- Une récompense a été donnée lorsque les conditions suivantes ont été jugées. La récompense pour les autres images est 0.
Selon les règles, les fautes et les coups sûrs sont traités comme des échecs comme des frappes, mais comme il vaut mieux frapper la balle que les coups ratés, la récompense est légèrement plus élevée que les frappes.
- Course à domicile: 100
- Frappe: -100
- Faute: -90
- Coup: -80
- Les 3 modèles suivants sont utilisés pour effectuer des actions aléatoires.
Dans ce jeu, cela n'a pas beaucoup de sens de prendre des actions aléatoires pour une seule image, alors je leur ai fait effectuer des actions aléatoires pour des images consécutives dans la plage de 10 à 30 images.
- Position du pointeur aléatoire uniquement
- Seul l'état du bouton est aléatoire
- Position aléatoire du pointeur et état du bouton
À propos de l'apprentissage
- L'apprentissage a été fait en parallèle avec le jeu dans un fil séparé.
- Afin d'apprendre LSTM, les paramètres sont mis à jour en donnant les valeurs d'entrée de trames consécutives comme indiqué ci-dessous.
m a été graduellement augmenté de 4 à 32.
- Sélectionnez aléatoirement n
- Entrez la valeur d'entrée de l'image n
- Saisissez la valeur d'entrée du cadre n + 1 pour trouver la valeur d'évaluation maximale du cadre n + 1. Utilisez-le pour mettre à jour les paramètres de l'image n
- Entrez la valeur d'entrée de l'image n + m pour trouver la valeur d'évaluation maximale de l'image n + m. Utilisez-le pour mettre à jour les paramètres de l'image n + m -1
Réglage
- Nombre de mini lots: 64
- Gamma DQN: 0,98
- optimizer: AdaDelta
J'ai utilisé AdaDelta dans Reference [2], donc je l'ai adopté.
Les paramètres sont par défaut rho = 0,95, eps = 1e-06.
- Limiter la norme L2 à un maximum de 0,1 en utilisant chainer.optimizer.GradientClipping ()
Si le gradient n'était pas limité, la valeur Q deviendrait trop grande et l'apprentissage ne serait pas stable.
Résultat d'apprentissage
Après avoir continué à étudier au stade 1 pendant environ 10 heures, j'ai pu presque terminer le stade 1.
J'ai téléchargé la vidéo de lecture ci-dessous.
J'essaie de ne pas prendre d'actions aléatoires lors de la prise de vue de vidéos.
https://youtu.be/J4V6ZveYFUM
Après avoir appris y compris d'autres étapes, j'ai pu confirmer que l'étape 3 avait été effacée par un hasard.
Les références
- [1] V. Mnih et al., "Playing atari with deep reinforcement learning"
http://arxiv.org/abs/1312.5602
- [2] M. Hausknecht, P. Stone, "Deep Recurrent Q-Learning for Partially Observable MDPs"
http://arxiv.org/abs/1507.06527
- [3] Histoire de DQN + Deep Q-Network écrite dans Chainer