Aidemy 2020/11/22
Bonjour, c'est Yope! Je suis une école littéraire croustillante, mais j'étais intéressé par les possibilités de l'IA, alors je suis allé à l'école spécialisée en IA "Aidemy" pour étudier. Je voudrais partager les connaissances acquises ici avec vous, et je les ai résumées dans Qiita. Je suis très heureux que de nombreuses personnes aient lu l'article de synthèse précédent. Merci! Ceci est le troisième article de Deep Strengthening Learning. Ravi de vous rencontrer.
Quoi apprendre cette fois ・ ・
-Créez un environnement avec la même méthode __ (gym.make ()) __ que dans le chapitre 2. En cas de rupture de bloc, spécifiez __ "Breakout Deterministic-v4" __ comme argument. -Le nombre d'actions peut être confirmé par __ "env.action_space.n" __.
·code
・ Ici, un réseau neuronal multicouche est construit. L'entrée est __ "4 images de l'écran de rupture de bloc" __. De plus, afin de réduire la quantité de calcul, l'image est redimensionnée à __ échelle de gris 84 × 84 pixels __. -Le modèle utilise Sequential (). Comme dans le chapitre 2, lissez l'entrée avec __Flatten () __, ajoutez la couche entièrement connectée avec Dense et la fonction d'activation avec Activation. -Depuis cette fois que nous entrons une image (bidimensionnelle), nous utiliserons __ "Convolution2D ()" __, qui est une couche de convolution bidimensionnelle. Le premier argument est __ "filter" __, qui spécifie le nombre de dimensions __ de l'espace de sortie, et le second argument est __ "kernel_size" __, la largeur et la hauteur de la fenêtre __ réduite. Spécifiez __. __ "foulées" __ spécifie la foulée, c'est-à-dire la largeur et la hauteur de la fenêtre __ qui se déplace en même temps __.
·code
-Similaire au chapitre 2, définissez __History __ et __Measures __ requis pour créer un agent. -Utilisez __ "SequentialMemory ()" __ pour l'historique. Spécifiez limit et window_length comme arguments. -Utiliser __ "BoltzmannQPolicy ()" __ lors de l'utilisation de la politique de Boltzmann, et __ "EpsGreedyQPolicy ()" __ lors de l'utilisation de la méthode ε-greedy. -De plus, lors de la modification du paramètre ε en Linear, utilisez __ "LinearAnnealedPolicy ()" __. Lorsque l'argument est spécifié comme indiqué dans le code ci-dessous, cela signifie que le paramètre ε est transformé en une ligne linéaire avec un maximum de 1,0 et un minimum de 0,1 en 10 étapes pendant l'entraînement, et fixé à 0,05 pendant le test.
·code
-Un agent peut être créé en passant model, memory, policy, nb_actions, nb_steps_warmup à l'argument de __ "DQNAgent ()" __. Après cela, vous pouvez spécifier la méthode d'apprentissage avec __ "dqn.compile ()" __. Spécifiez __optimization algorithm __ dans le premier argument et __evaluation function __ dans le second argument.
・ Code![Capture d'écran 2020-11-20 16.08.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/22bcf494-f1c6-0c09- 0a70-8f2b885c4b41.png)
・ Après avoir terminé les réglages de la section précédente, effectuez l'apprentissage à l'aide de l'algorithme DQN. __ "dqn.fit ()" __, spécifiez l'environnement dans le premier argument et le nombre d'étapes à apprendre dans "nb_steps" dans le deuxième argument. -En outre, le résultat d'apprentissage peut être sauvegardé au format hdf5 avec __ "dqn.save_weights ()" __. Le premier argument est le nom du fichier et le second argument est "écraser" pour spécifier s'il faut écraser.
·code
-Test avec un agent qualifié. __ Faites avec "dqn.test ()" __. L'argument est le même que fit, et le nombre d'épisodes "nb_episodes" est spécifié au lieu du nombre de pas nb_steps. ・ Au fait, dans ce blocage de bloc, c'est un épisode jusqu'à ce que la balle tombe.
Dueling DQN
-__ Dueling DQN (DDQN) __ est une version avancée de DQN, qui est une modification de la fin de la couche réseau DQN. -Dans DQN, la valeur Q a été sortie via la couche entièrement connectée après les trois premières "couches de convolution", mais DDQN divise cette couche __ entièrement connectée en deux __, tandis que l'état . Valeur de sortie V et sortie action A d'autre part. En trouvant la valeur Q de la dernière couche entièrement connectée qui prend ces deux comme entrées, les performances sont supérieures à DQN.
・ Figure![Capture d'écran 2020-11-21 11.32.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/eaf40627-b0cc-5f53- 1bfe-5bf6e6330637.png)
-L'implémentation DQN Dueling est la même que DQN jusqu'à l'ajout de couche. Il peut être implémenté en définissant __ "enable_dueling_network = True" __ comme argument et en spécifiant la méthode de calcul de la valeur Q __ "dueling_type" __ dans __ (DQNAgent ()) __ lors de la configuration de l'agent. __ "'avg', 'max', 'naive'" __ peut être spécifié pour dueling_type.
・ Code![Capture d'écran 2020-11-21 12.12.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/1d6b9e57-b793-07c2- 684c-856785593a98.png)
・ Résultat![Capture d'écran 2020-11-21 12.13.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/3445992d-30e4-50c0- defc-754ab85a2bb4.png)
-Même si le bloc est cassé, l'environnement peut être défini comme dans le chapitre 2. -Pour la construction du modèle, cette fois, nous utilisons la reconnaissance d'image bidimensionnelle, nous utiliserons donc la convolution. __ Utilisez le calque "Convolution 2D" __. ・ Dans cette mesure, la méthode ε-gourmande est utilisée, mais le paramètre ε doit être changé linéairement. Dans ce cas, utilisez __ "LinearAnnealedPolicy ()" __ pour modifier __ linéairement . -Le modèle qui a été formé peut être enregistré au format hdf5 en utilisant __ "dqn.save_weights ()" . - DuelingDQN est un DQN qui divise la liaison __full en deux __, calcule respectivement la valeur d'état V et l'action A, et obtient la valeur Q des deux de la dernière couche. L'implémentation doit spécifier __ "enable_dueling_network" __ et __ "dueling_type" __ dans __DQNAgent () __.
Recommended Posts