Former vos agents 7 fois plus vite avec ML-Agents

Dans les versions 0.9 et 0.10 de ML-Agents, nous avons introduit une série de fonctionnalités visant à réduire le temps de formation, à savoir les environnements asynchrones, l'apprentissage génératif adversarial par imitation (GAIL) et le Soft Actor-Critic. Avec notre partenaire JamCity, nous avons montré précédemment que la fonction d'instance parallèle Unity introduite dans la version 0.8 de ML-Agents nous a permis d'entraîner des agents pour leur jeu de tir à la bulle, Snoopy Pop, 7,5 fois plus vite qu'avec une seule instance. Dans ce billet, nous expliquerons comment les versions 0.9 et 0.10 s'appuient sur ces résultats et montreront que nous pouvons réduire le temps de formation de Snoopy Pop de 7 fois, ce qui permet de former des agents plus performants dans un délai raisonnable.
L'objectif de la boîte à outils Unity ML-Agents est de permettre aux développeurs de jeux de créer des comportements complexes et intéressants pour les personnages jouables et non jouables en utilisant l'apprentissage par renforcement profond (DRL). Le DRL est un outil puissant et général qui peut être utilisé pour apprendre une grande variété de comportements, des personnages basés sur la physique à ceux qui résolvent des jeux d'énigmes. Cependant, le DRL nécessite un volume important de données de jeu pour apprendre des comportements efficaces - un problème pour les jeux réels qui sont généralement limités dans la mesure où ils peuvent être accélérés.
Il y a plusieurs mois, avec la sortie de ML-Agents v0.8, nous avons introduit la possibilité pour les ML-Agents d'exécuter plusieurs instances Unity d'un jeu sur une seule machine, augmentant ainsi considérablement le débit des échantillons d'entraînement (c'est-à-dire les observations, actions et récompenses de l'agent) que nous pouvons collecter pendant l'entraînement. Nous nous sommes associés à JamCity pour former un agent à jouer les niveaux de leur jeu de puzzle Snoopy Pop. En utilisant l'environnement parallèle de la version 0.8, nous avons pu atteindre une vitesse d'apprentissage de 7,5 fois supérieure sur les niveaux les plus difficiles de Snoopy Pop.
Mais les environnements parallèles n'ont qu'une limite : le nombre d'instances Unity simultanées pouvant être exécutées sur une seule machine est limité. Pour améliorer le temps de formation sur des machines aux ressources limitées, nous avons dû trouver un autre moyen. En général, il y a deux façons d'améliorer le temps de formation : augmenter le nombre d'échantillons recueillis par seconde(débit d'échantillons) ou réduire le nombre d'échantillons nécessaires pour apprendre un bon comportement(efficacité des échantillons). Par conséquent, dans la version 0.9, nous avons amélioré notre entraîneur parallèle pour collecter des échantillons de manière asynchrone, augmentant ainsi le débit des échantillons.
En outre, nous avons ajouté l'apprentissage par imitation générative (Generative Adversarial Imitation Learning, GAIL), qui permet d'utiliser des démonstrations humaines pour guider le processus d'apprentissage, améliorant ainsi l'efficacité de l'échantillonnage. Enfin, dans la version 0.10, nous avons introduit Soft Actor-Critic (SAC), un formateur dont l'efficacité d'échantillonnage est nettement supérieure à celle du formateur Proximal Policy Optimization de la version 0.8. L'ensemble de ces changements a permis de diviser par sept le temps de formation sur une seule machine. Pour Snoopy Pop, cela signifie que nous avons pu non seulement créer des agents qui résolvent des niveaux, mais aussi des agents qui les résolvent en autant d'étapes qu'un joueur humain. Grâce à l'augmentation du débit et de l'efficacité des échantillons, nous avons pu former plusieurs niveaux de Snoopy Pop sur une seule machine, ce qui nécessitait auparavant plusieurs jours de formation sur une grappe de machines. Ce billet détaillera les améliorations apportées à chaque version ultérieure de ML-Agents, et la façon dont elles ont affecté les résultats de Snoopy Pop.
Nous avons d'abord présenté notre intégration de ML-Agents avec Snoopy Pop dans notre article de blog ML-Agents v0.8. La figure ci-dessous résume ce que l'agent peut voir, ce qu'il peut faire et les récompenses qu'il a reçues. Par rapport à nos expériences précédentes avec Snoopy Pop, nous avons diminué l'ampleur de la récompense positive et augmenté la pénalité pour l'utilisation d'une bulle, forçant l'agent à concentrer son attention moins sur le simple fait de terminer le niveau et plus sur l'élimination des bulles en un minimum d'étapes, comme le ferait un joueur humain. Il s'agit d'un problème beaucoup plus difficile que de gagner le niveau de justesse, et il faut beaucoup plus de temps pour apprendre une bonne politique.

Dans ML-Agents v0.8 , nous avons introduit la possibilité d'entraîner plusieurs instances Unity en même temps. Alors que nous sommes limités dans l'accélération d'une seule instance de Snoopy Pop, les processeurs multicœurs nous permettent d'exécuter plusieurs instances sur une seule machine. Étant donné que chaque partie du jeu est indépendante, nous pouvons trivialement paralléliser la collecte de nos données de formation.
Chaque environnement de simulation alimente en données un tampon d'entraînement commun, qui est ensuite utilisé par l'entraîneur pour mettre à jour sa politique afin de mieux jouer le jeu. Ce nouveau paradigme nous permet de collecter beaucoup plus de données sans avoir à modifier l'échelle de temps ou d'autres paramètres du jeu qui pourraient avoir un effet négatif sur les mécanismes du jeu.
Dans la version 0.9 de ML-Agents, nous avons apporté deux améliorations à l'efficacité de l'échantillonnage et au débit de l'échantillonnage, respectivement.
Environnements asynchrones
Dans l'implémentation v0.8 des environnements parallèles, chaque instance Unity fait un pas en synchronisation avec les autres, et le formateur reçoit toutes les observations et envoie toutes les actions en même temps. Dans certains environnements, tels que ceux fournis avec la boîte à outils ML-Agents, les agents prennent des décisions à une fréquence constante à peu près identique, et leur exécution en parallèle ne pose pas de problème. Cependant, pour les jeux réels, certaines actions peuvent prendre plus de temps que d'autres. Par exemple, dans Snoopy Pop, l'élimination d'un grand nombre de bulles entraîne une animation plus longue que l'élimination d'aucune bulle, et gagner le jeu et réinitialiser le niveau prend plus de temps que de tirer. Cela signifie que si l'un des environnements parallèles entreprend l'une de ces actions plus longues, les autres doivent attendre.
Dans la version 0.9 de ML-Agents, nous avons activé les environnements parallèles asynchrones. Tant qu'au moins un des environnements a terminé son action, le formateur peut envoyer une nouvelle action et passer à l'étape suivante. Dans les environnements où les temps de passage varient, cela peut améliorer de manière significative le débit des échantillons.

Apprentissage génératif par imitation adversaire (GAIL)
Dans un processus de formation DRL typique, l'agent est initialisé avec un comportement aléatoire, effectue des actions aléatoires dans l'environnement et peut obtenir des récompenses. Il renforce ensuite les comportements qui produisent des récompenses plus élevées et, avec le temps, le comportement tend à maximiser la récompense dans l'environnement et devient moins aléatoire.
Cependant, il n'est pas toujours facile de trouver un comportement optimal au hasard. Par exemple, la récompense peut être éparse, c'est-à-dire que l'agent doit effectuer de nombreuses actions correctes avant de recevoir une récompense. L'environnement peut également présenter de nombreux optima locaux, c'est-à-dire des endroits où l'agent pourrait se rendre et qui semblent le mener vers la récompense maximale, mais qui constituent en réalité un chemin incorrect. Ces deux problèmes peuvent être résolus à l'aide d'une recherche aléatoire par force brute, mais cela nécessitera un très grand nombre d'échantillons. Ils contribuent aux millions d'échantillons nécessaires à la formation de Snoopy Pop. Dans certains cas, il peut ne jamais trouver le comportement optimal.
Et si nous pouvions faire un peu mieux en guidant l'agent vers un bon comportement en lui fournissant des démonstrations humaines du jeu ? Ce domaine de recherche est appelé apprentissage par imitation et a été ajouté à ML-Agents dans la version 0.3. L'un des inconvénients de l'apprentissage par imitation dans les agents ML était qu'il ne pouvait être utilisé qu'indépendamment de l'apprentissage par renforcement, en formant un agent uniquement sur la base de démonstrations, mais sans récompenses provenant de l'environnement.
Dans la version 0.9, nous avons introduit GAIL, qui répond à ces deux problèmes, en se basant sur les recherches de Jonathan Ho et de ses collègues. Pour en savoir plus sur l'algorithme, consultez leur article.
Pour utiliser l'apprentissage par imitation avec les ML-Agents, vous devez d'abord demander à un joueur humain (ou à un robot) de jouer plusieurs fois au jeu, en enregistrant les observations et les actions dans un fichier de démonstration. Pendant la formation, l'agent est autorisé à agir dans l'environnement comme d'habitude et à recueillir ses propres observations. À un niveau élevé, GAIL fonctionne en formant un deuxième algorithme d'apprentissage(le discriminateur, mis en œuvre avec un réseau neuronal) pour classer si une observation particulière (et une action, le cas échéant) provient de l'agent ou des démonstrations. Ensuite, pour chaque observation que l'agent recueille, il est récompensé en fonction de la proximité de ses observations et de ses actions avec celles des démonstrations. L'agent apprend à maximiser cette récompense. Le discriminateur est mis à jour avec les nouvelles observations de l'agent et devient plus performant. De cette manière itérative, le discriminateur devient de plus en plus dur, mais l'agent devient de plus en plus doué pour "tromper" le discriminateur et imiter les démonstrations.
Étant donné que la GAIL donne simplement une récompense à l'agent, sans modifier le processus d'apprentissage, nous pouvons combiner la GAIL avec la LRD basée sur les récompenses en pondérant et en additionnant simplement la récompense de la GAIL avec celles données par le jeu lui-même. Si nous veillons à ce que l'ampleur de la récompense du jeu soit supérieure à celle de la récompense du GAIL, l'agent sera incité à suivre le parcours du joueur humain dans le jeu jusqu'à ce qu'il soit en mesure de trouver une récompense importante dans l'environnement.

Depuis sa première version, le ML-Agents Toolkit utilise l'optimisation de la politique proximale (PPO), un algorithme DRL stable et flexible. Dans la v0.10, dans le but d'accélérer votre entraînement sur des jeux réels, nous avons publié un deuxième algorithme DRL, SAC, basé sur les travaux de Tuomas Haarnoja et de ses collègues. L'une des caractéristiques essentielles de SAC, qui a été créé à l'origine pour apprendre sur des robots réels, est l'efficacité de l'échantillonnage. Pour les jeux, cela signifie qu'il n'est pas nécessaire de faire fonctionner les jeux aussi longtemps pour apprendre une bonne politique.
Les algorithmes DRL se répartissent en deux catégories : les algorithmes "on-policy" et les algorithmes "off-policy". Un algorithme "on-policy" tel que PPO collecte un certain nombre d'échantillons, apprend à améliorer sa politique en fonction de ceux-ci, puis met à jour sa politique en conséquence. En collectant des échantillons à l'aide de sa politique actuelle, il apprend à s'améliorer, en augmentant la probabilité d'entreprendre des actions gratifiantes et en diminuant celles qui ne le sont pas. La plupart des algorithmes modernes, tels que PPO, apprennent également une forme de fonction d'évaluation, telle qu'une estimation de la valeur (la somme actualisée attendue des récompenses jusqu'à la fin de l'épisode si l'agent se trouve dans un état donné) ou une fonction Q (la somme actualisée attendue des récompenses si une action donnée est entreprise dans un état donné). Dans un algorithme "on-policy", ces évaluateurs estiment la série de récompenses en supposant que la politique actuelle est adoptée. Sans entrer dans les détails, cette estimation permet à l'algorithme de s'entraîner de manière plus stable.
Les algorithmes hors politique, tels que SAC, fonctionnent un peu différemment. En supposant que l'environnement ait une dynamique et une fonction de récompense fixes, il existe une relation optimale entre l'adoption d'une action particulière à un état donné et l'obtention d'une récompense cumulative (c'est-à-dire ce que la meilleure politique possible serait en mesure d'obtenir). Si nous connaissions cette relation, il serait très facile d'élaborer une politique efficace ! Plutôt que d'apprendre quelle est la qualité de la politique actuelle, les algorithmes hors politique apprennent cette fonction d'évaluation optimale pour toutes les politiques. Il s'agit là d'un problème d'apprentissage plus difficile que dans le cas de la fonction réelle, qui peut être très complexe. Mais comme vous apprenez une fonction globale, vous pouvez utiliser tous les échantillons que vous avez collectés depuis le début du temps pour apprendre votre évaluateur, ce qui rend les algorithmes hors politique beaucoup plus efficaces en termes d'échantillons que les algorithmes avec politique. Cette réutilisation d'anciens échantillons s'appelle le rejeu d'expérience, et tous les échantillons sont stockés dans une grande mémoire tampon de rejeu d'expérience qui peut stocker des centaines (voire des milliers) de jeux de données.
Pour notre boîte à outils, nous avons adapté l'algorithme SAC original, qui a été conçu pour effectuer des tâches de locomotion à action continue, afin de prendre en charge toutes les fonctionnalités auxquelles vous êtes habitués dans les agents ML - réseaux neuronaux récurrents (mémoire), actions discrètes ramifiées, curiosité, GAIL, et bien plus encore.

Dans nos expériences précédentes, nous avons démontré que pour un niveau complexe de Snoopy Pop (niveau 25), nous avons constaté une diminution de 7,5 fois du temps de formation en passant d'un environnement unique (c'est-à-dire la version 0.7 de ML-Agents) à 16 environnements parallèles sur une seule machine. Cela signifie qu'une seule machine pouvait être utilisée pour trouver une solution de base au niveau 25 en moins de 9 heures. Grâce à cette capacité, nous avons formé nos agents à aller plus loin et à maîtriser le niveau 25, c'est-à-dire à résoudre le niveau 25 de la performance humaine. Notez que cela prend beaucoup plus de temps que de simplement résoudre le niveau - une moyenne d'environ 33 heures.
Ici, nous déclarons qu'un agent a "maîtrisé" un niveau s'il atteint une performance humaine moyenne (il résout le niveau avec un nombre de bulles égal ou inférieur à celui utilisé par un humain) sur 1000 étapes. Pour le niveau 25, cela correspond à 25,14 pas/bulles tirées, moyenne calculée à partir de 21 jeux humains du même niveau.
Nous avons ensuite testé chaque amélioration de la v0.9 et de la v0.10 de manière incrémentale, en mesurant le temps nécessaire pour dépasser les performances humaines au niveau concerné. Au total, ces améliorations permettent de multiplier par 7 la vitesse de maîtrise du niveau ! Chaque valeur indiquée est une moyenne sur trois essais, les durées d'entraînement pouvant varier d'un essai à l'autre. Parfois, l'agent a de la chance et trouve rapidement une bonne solution. Toutes les exécutions ont été effectuées sur une machine à 16 cœurs, l'entraînement étant accéléré par un GPU K80. 16 instances ont été exécutées en parallèle pendant la formation.
Pour les expériences GAIL, nous avons utilisé les 21 jeux humains de Snoopy Pop comme démonstrations pour entraîner les résultats. Notez que les couleurs des bulles du niveau 25 sont générées de façon aléatoire, et que les 21 passages ne couvrent donc en aucun cas toutes les configurations possibles du niveau. Dans ce cas, l'agent apprendrait très vite en mémorisant et en copiant le comportement du joueur. Nous avons ensuite mélangé un signal de récompense GAIL avec celui fourni par le jeu Snoopy Pop, de sorte que GAIL puisse guider l'apprentissage de l'agent au début du processus, tout en lui permettant de trouver sa propre solution par la suite.
Environnements parallèles (v0.8) Environnements asynchrones (v0.9) GAIL avec PPO (v0.9) SAC (v0.10) GAIL avec SAC (v0.10) Temps pour atteindre la performance humaine
(heures)
34:03 31:08 23:18 5:58 4:44 Débit d'échantillonnage (échantillons/seconde) 10.83 14.81 14.51 15.04 15.28
Visualisons l'accélération sous forme de graphique ci-dessous. Nous constatons que l'augmentation du débit d'échantillonnage grâce à l'utilisation d'environnements asynchrones entraîne une réduction du temps de formation sans aucune modification de l'algorithme. Toutefois, les réductions les plus importantes du temps de formation proviennent de l'amélioration de l'efficacité de l'échantillonnage de la formation. Notez que le débit d'échantillons n'a pas changé de manière substantielle entre les versions 0.9 et 0.10 de ML-Agents. L'ajout de démonstrations et l'utilisation de GAIL pour guider la formation ont permis à l'agent d'utiliser 26 % d'échantillons en moins pour atteindre le même comportement de formation, et nous constatons une baisse correspondante du temps de formation. Le passage à l'algorithme Soft Actor-Critic, un algorithme hors politique, a permis à l'agent de résoudre le niveau avec 81 % d'échantillons en moins que le PPO vanille, et une amélioration supplémentaire est observée en ajoutant GAIL au SAC.
Ces améliorations ne sont pas propres à la nouvelle fonction de récompense et à l'objectif d'atteindre la performance humaine. Si nous demandons à SAC+GAIL de simplement résoudre le niveau, comme nous l'avions fait dans nos expériences précédentes, nous y parvenons en 1 heure 11 minutes, contre 1 heure et demie pour SAC+GAIL et 1 heure et demie pour SAC+GAIL. 8 heures, 24 minutes.

Si vous souhaitez travailler à cette intersection passionnante de l'apprentissage automatique et des jeux, nous recrutons pour plusieurs postes, n'hésitez pas à postuler!
Si vous utilisez l'une ou l'autre des fonctionnalités proposées dans cette version, nous serions ravis de connaître votre avis. Pour tout commentaire concernant la boîte à outils Unity ML-Agents, veuillez remplir le questionnaire suivant et n'hésitez pas à nous envoyer un courriel directement. Si vous rencontrez des problèmes ou si vous avez des questions, n'hésitez pas à nous contacter sur la page ML-Agents GitHub issues.