[PYTHON] Apprenez avec un pendule inversé DQN (Deep Q Network)

Résolvons le problème de l'oscillation d'un pendule inversé en utilisant Deep Q Network, communément appelé DQN, qui combine Q-learning, qui est une méthode d'apprentissage amélioré, et un réseau neuronal profond.

Problème de réglage

Le "problème de balancement du pendule inversé" est un tel problème de réglage cette fois.

Premièrement, il y a un moteur stationnaire dans l'air et une extrémité de la tige est reliée à l'arbre du moteur. La tige est une tige commune avec une masse concentrée au centre, une rigidité $ \ infty $ et une épaisseur 0. Dans l'état initial, la tige pend vers le bas en raison de la gravité. Le problème est que vous devez faire basculer le pendule à partir de cet état et le laisser immobile dans un état inversé. Dans la bonne vieille ingénierie de contrôle, vous devrez y faire face en utilisant un contrôleur qui comprend des éléments non linéaires, comme la préparation de deux contrôleurs conçus séparément pour le basculement vers le haut et stationnaire. Non, je ne l'ai jamais fait, mais il semble.

Cette fois, le moteur ne peut tourner que vers la droite ou vers la gauche avec un couple constant. De plus, bien que ce soit un peu désordonné, la condition est que le couple du moteur ne soit pas si important, et même s'il continue de tourner dans un sens à partir de l'état initial, il ne peut pas surmonter la gravité et ne peut pas basculer vers le haut. Ci-dessous, une animation lorsque je suis accro au piège. Le couple est appliqué complètement vers la droite, mais à mesure qu'il avance horizontalement, la contribution de l'accélération gravitationnelle dans la direction angulaire augmente, il est donc repoussé et vibre.

initial.gif

Quant à DQN lui-même, le merveilleux article ici est détaillé, je vais donc expliquer principalement les résultats et les idées autour de la mise en œuvre dans cet article.

D'abord du résultat

L'agent (dans ce cas, le contrôleur du moteur) entreprend une action (instruction du sens de rotation du moteur) sur l'environnement (moteur et tige), et laisse l'agent apprendre la politique optimale à condition d'obtenir une récompense et un résultat d'observation. ..

Pour la récompense, nous avons utilisé la fonction suivante $ r (h) $, qui indique que plus la hauteur de la pointe de la tige vue du moteur est élevée, mieux c'est.

r(h)= \Biggl\{\quad 
\begin{eqnarray}
5h & \mathrm{if} h\ge 0\\
 h & \mathrm{if} h< 0
\end{eqnarray}

J'ai biaisé le côté positif, mais cela a peut-être été une attention particulière. Pour l'observation, l'image de l'écran est directement entrée dans l'exemple d'ATARI, mais cette fois j'ai essayé de saisir l'angle du pendule lui-même. On suppose que la séquence angulaire pour 4 étapes de la simulation peut être obtenue sous forme de séquence.

Voici un graphique de la croissance. L'axe horizontal représente le nombre d'essais et l'axe vertical le score total obtenu dans les essais. Les points bleus sont les résultats de chaque génération et les lignes rouges sont les scores élevés.

bestER.png

Le résultat est très vibrant, probablement à cause du système non linéaire et multimodal, et il vibre avec des résultats positifs et négatifs même après la convergence, mais le résultat du score élevé augmente définitivement. Jetons un coup d'œil au processus de croissance ci-dessous.

Vous êtes coincé dans un piège pour la première fois. 000000.gif

La 120ème fois, je remarque qu'il est possible de se balancer en faisant des va-et-vient, mais je ne peux pas m'arrêter après ça. 000120.gif

Il semble qu'il ait saisi le don de l'immobilité après s'être relevé pour la 6950e fois. Un peu plus! bats toi! 006950.gif

Au 7640e temps, le but était presque atteint. 007640.gif

C'est le meilleur résultat en 30000 itérations. Chi C'est un peu exagéré, mais il semble qu'il vaut mieux faire le premier swing dans les plus brefs délais.

024410.gif

Je suis un peu surpris que cela fonctionne mieux que ce à quoi je m'attendais. Pour le dernier exemple, voici un tracé chronologique de la hauteur et du profil des entrées de commande du moteur. La façon de penser est complètement différente entre se balancer et tenir, mais vous pouvez voir que vous apprenez cela.

profile.png

À propos de la mise en œuvre de DQN

L'article DQN présenté plus tôt montre également l'implémentation, mais cette fois j'ai remonté les roues pour comprendre. Vu. J'ai mis l'implémentation selon cet article dans ici.

Ce que je n'arrivais pas à comprendre en lisant simplement l'article, c'était comment structurer le réseau profond essentiel et comment le mettre à jour. Je vais expliquer à ce sujet.

Deep Neural Net $ Q $ est un réseau qui génère la valeur d'action de chaque action lorsqu'une séquence de résultats d'observation d'état est entrée. Dans ce cas, la valeur d'action est un vecteur qui montre "à quel point il est heureux de faire tourner le moteur vers la droite et la gauche dans la situation indiquée par la séquence d'angle d'entrée".

Bien sûr, dans les premiers stades de l'apprentissage, ce réseau est aléatoire, il renvoie donc des résultats aléatoires. Si vous mettez à jour cela avec la procédure expliquée à partir de maintenant, cela deviendra un bon réseau que vous pourrez obtenir de nombreuses récompenses totales à l'avenir.

Supposons que vous exécutiez une action $ a \ _t $ sur l'état $ s \ _t $ pour obtenir la récompense $ r \ _t $ et la changer en $ s \ _ {t + 1} $. À ce stade, en dehors du vecteur de valeur d'action $ Q (s_t) $, qui est la sortie de $ Q $ lorsque $ s \ _t $ est entré, seule la valeur d'action correspondant à $ a \ _t $ est réécrite selon la formule suivante. Créez $ y \ _t $ (le symbole a été modifié par rapport au papier d'origine).

y_t = Q(s_t)  \\
y_t[a_t] \leftarrow r_t + γ max Q(s_{t+1})

Mettez à jour les poids nets d'une étape afin que $ Q (s \ _t) $ soit plus proche de ce $ y \ _t $. Cette récompense est ajoutée à la valeur d'action maximale qui peut être obtenue avec le coup suivant multipliée par un certain taux d'actualisation de $ \ gamma $. Idéalement, la valeur de cette action doit être déterminée à partir de la somme des valeurs d'action jusqu'à la fin de l'épisode, mais comme le temps de calcul est trop court, nous ne passerons qu'à l'étape suivante. Si vous répétez cette procédure de mise à jour indéfiniment, vous obtiendrez une valeur d'action basée sur la récompense totale de l'état. Je me demande si c'est vrai. Au moins je comprends cela, je vais juste le dire.

La composition du deep net lui-même n'a pas été tellement essayée et erronée, mais je pense qu'il n'y a pas d'erreur à l'approfondir. Est-il vraiment préférable d'ajouter Dropout, Batch Normalization, etc. pour améliorer les performances de généralisation? Je pense que cela dépend du problème.

Best Experience Replay

Cette mise en œuvre est fondamentalement la même que le papier, mais je vais l'expliquer parce qu'il y a un point que j'ai conçu.

Il semble qu'il soit préférable d'utiliser un ensemble d '«état / action / récompense» utilisé pour l'apprentissage qui n'est pas corrélé les uns aux autres. Pour cette raison, une méthode appelée ER (Experience Replay) est importante. Cela semble être l'un des plus gros points de DQN. C'est une méthode pour se souvenir des expériences passées et apprendre de l'ensemble qui en a été extrait au hasard.

Un essai s'appelle un épisode, mais dans l'article original, tous les épisodes sont mémorisés dans leur intégralité. Pour obtenir une nouvelle expérience, chaque épisode sera expérimenté d'une manière appelée $ \ epsilon $ -greedy. $ \ Epsilon $ -greedy sélectionne l'action aléatoire et l'action en fonction du filet (action gourmande) avec une certaine probabilité $ \ epsilon $. Au début de l'apprentissage, $ \ epsilon $ est grand et vous apprendrez à partir de mouvements presque aléatoires.

Une fois que vous en avez suffisamment appris, vous pouvez obtenir des résultats avec juste l'action gourmande. Pour cette raison, j'essaye parfois une opération gourmande complète pour voir comment cela fonctionne.

J'ai toujours été sceptique sur les papiers de DQN, mais quand je l'essaie, c'est vrai, surtout dans les premiers jours, avec de plus en plus d'épisodes qui ne valent clairement pas la peine d'être retenus, et les quelques bonnes expériences disparaissent de la mémoire. Après tout, c'est complètement aléatoire. Bien sûr, vous pouvez apprendre des erreurs, mais je pense qu'il vaut mieux utiliser une bonne expérience comme modèle. Alors, cette fois, j'ai décidé de donner la priorité aux épisodes qui ont obtenu un bon score (récompense à vie) et de les mémoriser sans faire de distinction entre les épisodes gourmands $ \ epsilon $ et les épisodes gourmands. J'ai décidé de garder les 100 meilleurs épisodes de tous les temps, et seuls les épisodes avec des points qui entrent dans le classement seront mémorisés. Cependant, même si vous ne le mettez pas dans le classement, vous pouvez vous en souvenir avec une chance de 1%.

Appelons cette méthode Best ER. À partir de l'état initialisé avec la même valeur de départ, j'ai tracé la différence d'état de convergence entre Best ER et simple ER.

compare.png

Cela semble assez efficace. Je ne l'ai pas essayé dans divers cas en raison de ressources informatiques. ..

J'ai essayé une méthode qui ne nécessite aucune nouvelle expérience pendant un certain temps, mais j'ai trouvé qu'elle avait décliné après un certain temps après l'âge d'or. C'est devenu comme suit.

bestER.png

La même chose s'est produite lorsque j'ai changé la graine du nombre aléatoire. Je n'ai pas bien enquêté sur la cause, mais j'imagine que cela se produit après que les réalisations de haut niveau des épisodes gourmands adultes ont rempli le classement, pas parce que les données sont trop corrélées ou perdues dans la diversité. Je pense. Cependant, il semble que la version améliorée n'ait pas atteint l'âge d'or, donc je pense qu'il y a encore place à l'amélioration.

De plus, je pense que Best ER peut être dépassé par de petits succès. Après cela, je ne peux plus faire face aux changements de l'environnement. Parce que je suis piégé dans la gloire du passé. C'est un peu comme l'âge d'or, et cela me donne envie de l'ajouter à ma théorie de la vie, mais cela dépend de la tâche.

C'est peut-être une tendance du DQN, mais il est difficile de dire si l'apprentissage progresse, il est donc essentiel de sauver des candidats qui ont l'air bien. Aussi, comme c'est souvent le cas avec l'optimisation numérique des fonctions multimodales, l'impression est que le temps nécessaire pour produire des résultats dépend beaucoup des valeurs initiales. Cependant, si vous essayez ce cas plusieurs fois, vous pouvez obtenir presque le score le plus élevé autour de 10 000 itérations. Cela a pris environ une heure sur mon PC (MacBook Pro Core i5 2,5 GHz x2 Core).

Résumé

J'ai pu essayer le DQN que j'ai toujours voulu essayer. J'ai également proposé une méthode appelée Best ER comme méthode pour accélérer la convergence. Si vous le mettez en œuvre vous-même, vous pouvez approfondir votre compréhension.

Je suis surpris de voir un tel résultat sans réglage ni commutation côté contrôleur. Il y a différentes choses que je veux faire, comme rendre la quantité de contrôle du moteur continue, double pendule, observer avec des images au lieu d'angles, faire avec la machine réelle et la webcam, etc., mais je vais m'arrêter ici en raison de contraintes de temps.

Cette fois, je l'ai fait avec le processeur, mais après tout, c'est la limite avec le processeur pour les essais et erreurs dans ce domaine. J'attends avec impatience le [Cloud Machine Learning] récemment annoncé (https://cloud.google.com/products/machine-learning/). J'entends des gens me dire d'acheter tranquillement un GPU. .. ..

Recommended Posts

Apprenez avec un pendule inversé DQN (Deep Q Network)
Apprenons Deep SEA avec Selene
DQN avec Chainer. J'ai essayé plusieurs apprentissages par renforcement d'affilée. (Deep Q Network, Q-Learning, Monte Carlo)
Pendule inversé avec contrôle prédictif du modèle
Essayez avec Chainer Deep Q Learning - Lancement