Comment former un réseau neuronal artificiel pour jouer à Diablo 2 en utilisant une entrée visuelle?

Je suis actuellement en train d’essayer d’obtenir un ANN pour jouer à un jeu vidéo et j’espérais obtenir de l’aide de la merveilleuse communauté ici.

Je me suis installé sur Diablo 2. Le jeu est donc en temps réel et d’un sharepoint vue isomésortingque, le lecteur contrôlant un seul avatar sur lequel la caméra est centrée.

Pour concrétiser les choses, la tâche consiste à obtenir votre personnage x points d’expérience sans que sa santé ne tombe à 0, où le point d’expérience est gagné en tuant des monstres. Voici un exemple du gameplay:

ici

Maintenant, comme je veux que le réseau fonctionne uniquement sur la base des informations obtenues à partir des pixels à l’écran, il doit apprendre une représentation très riche pour jouer efficacement, car cela exigerait probablement de savoir (au moins implicitement) comment diviser le monde du jeu en objects et comment interagir avec eux.

Et toutes ces informations doivent être enseignées sur le net… en quelque sorte. Je ne peux pas pour la vie penser à comment former cette chose. Ma seule idée est d’avoir un programme séparé pour extraire visuellement quelque chose de bon / mauvais dans le jeu (par exemple, santé, or, expérience) de l’écran, puis utiliser cette statistique dans une procédure d’apprentissage par renforcement. Je pense que cela fera partie de la réponse, mais je ne pense pas que cela suffira; Il y a trop de niveaux d’abstraction, allant de la saisie visuelle brute au comportement orienté vers un objective, pour que le retour d’informations soit limité pour former un réseau au cours de ma vie.

Alors, ma question: comment pouvez-vous penser à former un réseau pour faire au moins une partie de cette tâche? de préférence sans faire des milliers d’exemples étiquetés …

Juste pour un peu plus de conseils: je recherche d’autres sources d’apprentissage par renforcement et / ou des méthodes non supervisées pour extraire des informations utiles dans ce contexte. Ou un algorithme supervisé si vous pouvez imaginer un moyen d’obtenir des données étiquetées hors d’un monde de jeu sans avoir à les étiqueter manuellement.

MISE À JOUR (27/04/12):

Étrangement, je travaille toujours sur ce sujet et semble progresser. Le plus grand secret pour faire fonctionner un contrôleur ANN est d’utiliser les architectures ANN les plus avancées adaptées à la tâche. J’ai donc utilisé un réseau de croyances profondes composé de machines Boltzmann restreintes conditionnelles pondérées que j’ai entraînées de manière non supervisée (sur la vidéo de mon jeu) avant de régler avec la propagation inverse des différences temporelles anticipation des ANN)).

Toujours à la recherche d’intrants précieux, en particulier sur le problème de la sélection des actions en temps réel et sur la manière d’encoder les images en couleurs pour le traitement ANN 🙂

MISE À JOUR (21/10/15):

Rappelez-vous juste que j’ai posé cette question en arrière et pensé que je devrais mentionner que ce n’est plus une idée folle. Depuis ma dernière mise à jour, DeepMind a publié son article sur la nature pour que les réseaux de neurones puissent jouer à des jeux Atari à partir d’entrées visuelles . En effet, la seule chose qui m’empêche d’utiliser leur architecture pour jouer, un sous-ensemble limité de Diablo 2, c’est le manque d’access au moteur de jeu sous-jacent. Le rendu à l’écran, puis sa redirection vers le réseau, sont beaucoup trop lents pour s’exercer dans un délai raisonnable. Ainsi, nous ne verrons probablement pas ce type de bot jouer à Diablo 2 dans un avenir proche, mais uniquement parce qu’il jouera quelque chose d’ouverture ou d’access à la cible de rendu. (tremblement de terre peut-être?)

Je peux voir que vous vous inquiétez de la façon de former l’ANN, mais ce projet cache une complexité que vous ne connaissez peut-être pas. La reconnaissance d’objects / caractères sur les jeux informatiques par le biais du traitement d’images est une tâche très difficile (ne pas dire fou pour les jeux de FPS et de RPG). Je ne doute pas de vos compétences et je ne dis pas que cela ne peut pas être fait, mais vous pouvez facilement passer 10 fois plus de temps à reconnaître des choses qu’à implémenter ANN (en supposant que vous avez déjà ).

Je pense que votre idée est très intéressante et aussi très ambitieuse . À ce stade, vous pourriez vouloir le reconsidérer. Je pense que ce projet est quelque chose que vous prévoyez pour l’université, donc si l’objective du travail est vraiment ANN, vous devriez probablement choisir un autre jeu, quelque chose de plus simple.

Je me souviens que quelqu’un d’autre est venu chercher des conseils sur un projet différent mais quelque peu similaire il n’y a pas si longtemps. Cela vaut la peine de le vérifier.

D’un autre côté, il y a peut-être des approches meilleures / plus faciles pour identifier des objects dans le jeu si vous acceptez les suggestions. Mais d’abord, appelons ce projet pour ce que vous voulez qu’il soit: un robot intelligent .

Une méthode pour implémenter des robots permet d’ accéder à la mémoire du client du jeu pour trouver des informations pertinentes, telles que l’emplacement du personnage à l’écran et son état de santé. La lecture de la mémoire de l’ordinateur est sortingviale, mais pas la recherche exacte de la mémoire. Des scanners de mémoire tels que Cheat Engine peuvent être très utiles pour cela.

Une autre méthode , qui fonctionne sous le jeu, consiste à manipuler des informations de rendu. Tous les objects du jeu doivent être rendus à l’écran. Cela signifie que les emplacements de tous les objects 3D seront éventuellement envoyés à la carte vidéo pour être traités. Soyez prêt pour un débogage sérieux.

Dans cette réponse, j’ai brièvement décrit 2 méthodes pour accomplir ce que vous voulez grâce au traitement d’image. Si vous êtes intéressé, vous pouvez en apprendre plus sur Exploiting Online Games (chapitre 6), un excellent livre sur le sujet.

MISE À JOUR 2018-07-26: Ça y est! Nous approchons maintenant du point où ce type de jeu pourra être résolu! En utilisant OpenAI et basé sur le jeu DotA 2, une équipe peut créer une IA capable de battre les joueurs semi-professionnels dans un jeu 5v5 . Si vous connaissez DotA 2, vous savez que ce jeu est assez similaire aux jeux de type Diablo en termes de mécanique, mais on pourrait dire que c’est encore plus compliqué à cause du jeu en équipe.

Comme prévu, cela a été réalisé grâce aux dernières avancées en matière d’apprentissage par renforcement avec l’apprentissage en profondeur et en utilisant des frameworks de jeu ouverts comme OpenAI, qui facilitent le développement d’une IA car vous pouvez accélérer le jeu l’équivalent de 180 ans de gameplay contre lui-même tous les jours!).

Le 5 août 2018 (dans 10 jours!) , Il est prévu de placer cette IA contre les meilleurs joueurs de DotA 2. Si cela fonctionne, attendez-vous à une grande révolution, peut-être pas aussi médiatisée que la résolution du jeu Go, mais ce sera néanmoins une étape importante pour les jeux AI!

MISE À JOUR 2017-01: Le domaine évolue très rapidement depuis le succès d’AlphaGo, et de nouveaux frameworks facilitent le développement d’algorithmes d’apprentissage automatique sur les jeux presque tous les mois. Voici une liste des dernières que j’ai trouvées:

  • OpenAI’s Universe : une plate-forme pour jouer à pratiquement tous les jeux en utilisant l’apprentissage automatique . L’API est en Python, et elle exécute les jeux derrière un environnement de bureau distant VNC, afin de pouvoir capturer les images de n’importe quel jeu! Vous pouvez probablement utiliser Universe pour jouer à Diablo II via un algorithme d’apprentissage automatique!
  • OpenAI’s Gym : Similaire à Univers, mais ciblant spécifiquement les algorithmes d’apprentissage par renforcement (c’est donc une sorte de généralisation du framework utilisé par AlphaGo mais pour beaucoup d’autres jeux). Il y a un cours sur Udemy qui couvre l’application de l’apprentissage automatique aux jeux tels que le breakout ou Doom en utilisant OpenAI Gym.
  • TorchCraft : un pont entre Torch (cadre d’apprentissage automatique) et StarCraft: Brood War.
  • pyGTA5 : un projet pour construire des voitures autonomes dans GTA5 en utilisant uniquement des captures d’écran (avec beaucoup de vidéos en ligne ).

Des moments très excitants!

MISE À JOUR IMPORTANTE (2016-06): Comme noté par OP, ce problème de formation de réseaux artificiels pour jouer à des jeux utilisant uniquement des entrées visuelles est maintenant abordé par plusieurs institutions sérieuses, avec des résultats très prometteurs, comme DeepMind Deep-Qlearning-Network ) .

Et maintenant, si vous voulez relever le défi du niveau supérieur, vous pouvez utiliser l’une des plates-formes de développement de jeux AI vision telles que ViZDoom , une plate-forme hautement optimisée (7000 fps) pour former les réseaux à jouer à Doom en utilisant uniquement des entrées visuelles. :

ViZDoom permet de développer des robots AI qui jouent à Doom en utilisant uniquement les informations visuelles (le tampon d’écran). Il est principalement destiné à la recherche en apprentissage visuel par machine et à l’apprentissage par renforcement en profondeur, en particulier. ViZDoom est basé sur ZDoom pour fournir les mécanismes de jeu.

Et les résultats sont assez étonnants, voyez les vidéos sur leur page Web et le bon tutoriel (en Python) ici!

Il existe également un projet similaire pour Quake 3 Arena, appelé Quagents , qui fournit également un access facile aux API aux données de jeu sous-jacentes, mais vous pouvez le supprimer et utiliser uniquement des captures d’écran et l’API pour contrôler votre agent.

Pourquoi une telle plateforme est-elle utile si nous utilisons uniquement des captures d’écran? Même si vous n’accédez pas aux données de jeu sous-jacentes, une telle plate-forme fournit:

  • mise en œuvre de jeux haute performance (vous pouvez générer plus de données / jeux / générations d’apprentissage avec moins de temps pour que vos algorithmes d’apprentissage puissent converger plus rapidement!).
  • une API simple et réactive pour contrôler vos agents (c.-à-d. si vous essayez d’utiliser des entrées humaines pour contrôler un jeu, certaines de vos commandes peuvent être perdues, donc vous devez également gérer le manque de fiabilité de vos sorties …).
  • configuration facile de scénarios personnalisés .
  • rendu personnalisable (peut être utile pour “simplifier” les images que vous obtenez pour faciliter le traitement)
  • lecture synchronisée (“tour par tour”) (vous n’avez donc pas besoin que votre algorithme fonctionne en temps réel au début, ce qui réduit considérablement la complexité).
  • des fonctionnalités supplémentaires telles que la compatibilité cross-plateforme, la rétrocompatibilité (vous ne risquez plus que votre bot ne fonctionne plus avec le jeu lorsqu’il y a une nouvelle mise à jour du jeu), etc.

Pour résumer, la grande chose à propos de ces plates-formes est qu’elles soulagent une grande partie des problèmes techniques que vous aviez à traiter (comment manipuler les entrées du jeu, comment configurer les scénarios, etc.). lui-même

Alors maintenant, commencez à travailler et faites de nous le meilleur robot visuel de l’IA jamais)


Ancien post décrivant les problèmes techniques de développement d’une IA reposant uniquement sur des entrées visuelles:

Contrairement à certains de mes collègues ci-dessus, je ne pense pas que ce problème soit insoluble. Mais c’est sûrement un hella hard!

Le premier problème évoqué ci-dessus est celui de la représentation de l’état du jeu : vous ne pouvez pas représenter l’état complet avec une seule image, vous devez conserver une sorte de mémorisation (santé mais aussi objects équipés et objects disponibles). à utiliser, quêtes et objectives, etc.). Pour récupérer de telles informations, vous avez deux possibilités: soit en accédant directement aux données du jeu, ce qui est le plus fiable et le plus facile; ou bien vous pouvez créer une représentation abstraite de ces informations en mettant en œuvre des procédures simples (inventaire ouvert, capture d’écran, extraction des données). Bien sûr, extraire des données d’une capture d’écran nécessitera soit une procédure supervisée (que vous définissez complètement) ou non supervisée (via un algorithme d’apprentissage automatique, mais cela augmentera considérablement la complexité …). Pour l’apprentissage automatique non supervisé, vous devrez utiliser un type d’algorithme assez récent appelé algorithme d’apprentissage structurel (qui apprend la structure des données plutôt que comment les classer ou prédire une valeur). Un tel algorithme est le réseau neuronal récursif (à ne pas confondre avec le réseau neuronal récurrent) par Richard Socher: http://techtalks.tv/talks/54422/

Un autre problème est que même lorsque vous avez récupéré toutes les données dont vous avez besoin, le jeu n’est que partiellement observable . Ainsi, vous devez injecter un modèle abstrait du monde et le nourrir avec les informations traitées du jeu, par exemple l’emplacement de votre avatar, mais aussi l’emplacement des objects de quête, des objectives et des ennemis en dehors de l’écran. Vous pouvez peut-être rechercher les filtres à particules Mixture de Vermaak 2003 pour cela.

De plus, vous devez disposer d’un agent autonome , avec des objectives générés dynamicment. Une architecture bien connue que vous pouvez essayer est l’agent BDI, mais vous devrez probablement le modifier pour que cette architecture fonctionne dans votre cas pratique. Comme alternative, il y a aussi le réseau récursif de Pesorting, que vous pouvez probablement combiner avec toutes sortes de variantes des réseaux de Pesorting pour obtenir ce que vous voulez, car il s’agit d’un framework très bien étudié et flexible, avec d’excellentes procédures de formalisation et de preuve.

Et enfin, même si vous faites tout ce qui précède, vous devrez trouver un moyen d’émuler le jeu à une vitesse accélérée (l’utilisation d’une vidéo peut être intéressante, mais le problème est que votre algorithme ne sera visible que essayer par lui-même est très important pour l’apprentissage). En effet, il est bien connu que l’algorithme actuel de pointe prend beaucoup plus de temps pour apprendre la même chose qu’un humain peut apprendre (encore plus avec l’apprentissage par renforcement), et donc ne peut pas accélérer le processus ( Par exemple, si vous ne pouvez pas accélérer le temps de jeu), votre algorithme ne convergera même pas dans une seule vie …

Pour conclure, ce que vous voulez réaliser ici est à la limite (et peut-être même un peu au-delà) des algorithmes de pointe actuels . Je pense que cela peut être possible, mais même si c’est le cas, vous allez passer beaucoup de temps , car ce n’est pas un problème théorique, mais un problème pratique que vous abordez ici. de différentes approches de l’IA pour le résoudre.

Plusieurs décennies de recherche avec toute une équipe travaillant dessus ne suffiraient peut-être pas. Si vous travaillez seul à temps partiel (car vous avez probablement un emploi pour gagner votre vie), vous risquez de passer toute votre vie une solution de travail.

Donc, mon conseil le plus important serait que vous réduisiez vos attentes et que vous essayiez de réduire la complexité de votre problème en utilisant toutes les informations possibles et en évitant autant que possible de faire appel à des captures d’écran (essayez jeu, recherchez l’injection de DLL), et simplifiez certains problèmes en implémentant des procédures supervisées, ne laissez pas votre algorithme tout apprendre (c.-à-d. supprimer le traitement d’images autant que possible et utiliser des informations de jeu internes si votre algorithme fonctionne bien) , vous pouvez remplacer certaines parties de votre programme IA par un traitement d’image, atteignant ainsi votre objective complet, par exemple si vous pouvez obtenir quelque chose qui fonctionne bien, vous pouvez essayer de complexifier votre problème et remplacer les procédures supervisées algorithmes d’apprentissage automatique sur les captures d’écran).

Bonne chance, et si cela fonctionne, assurez-vous de publier un article, vous pouvez sûrement devenir célèbre pour résoudre un problème aussi difficile!

Le problème que vous poursuivez est insoluble dans la manière dont vous l’avez défini. C’est généralement une erreur de penser qu’un neural network apprendrait “magiquement” une représentation riche d’un problème. Lorsque vous décidez si ANN est l’outil idéal pour une tâche, sachez qu’il s’agit d’une méthode d’interpolation. Pensez, si vous pouvez définir votre problème en trouvant une approximation d’une fonction, où vous avez beaucoup de points de cette fonction et beaucoup de temps pour concevoir le réseau et le former.

Le problème que vous proposez ne passe pas ce test. Le contrôle du jeu ne dépend pas de l’image affichée à l’écran. Il y a beaucoup d’informations que le joueur doit garder en mémoire. Pour un exemple simple, il est souvent vrai que chaque fois que vous entrez dans un magasin dans un jeu, l’écran est identique. Cependant, ce que vous achetez dépend des circonstances. Peu importe la complexité du réseau, si les pixels de l’écran sont son entrée, il effectuerait toujours la même action en entrant dans le magasin.

En outre, il y a le problème de l’échelle. La tâche que vous proposez est simplement trop compliquée à apprendre dans un délai raisonnable. Vous devriez voir aigamedev.com pour savoir comment fonctionne l’IA du jeu. Les réseaux neuronaux artificiels ont été utilisés avec succès dans certains jeux, mais de manière très limitée. Le jeu AI est difficile et souvent coûteux à développer. S’il existait une approche générale de la construction de réseaux neuronaux fonctionnels, l’indussortinge aurait très probablement saisi cette possibilité. Je vous recommande de commencer par des exemples beaucoup plus simples, comme tic-tac-toe.

Il semble que le cœur de ce projet explore ce qui est possible avec un ANN. Je suggère donc de choisir un jeu où vous n’avez pas à traiter avec le traitement d’image (ce qui, d’après les réponses d’autres, semble très difficile dans un jeu en temps réel). Vous pouvez utiliser l’API Starcraft pour créer votre bot, ils vous donnent access à tous les états de jeu pertinents.

http://code.google.com/p/bwapi/

Eh bien, en supposant à tout moment que vous puissiez générer un ensemble de «résultats» (peut impliquer des probabilités) à partir d’un ensemble de tous les «mouvements» possibles, et qu’il existe une notion de cohérence dans le jeu (par exemple, vous pouvez jouer encore une fois), vous pouvez commencer avec N réseaux de neurones avec des poids aléatoires et faire en sorte que chacun joue le jeu de la manière suivante:

1) Pour chaque «mouvement» possible, générez une liste de «résultats» possibles (avec probabilités associées) 2) Pour chaque résultat, utilisez votre réseau neuronal pour déterminer une «valeur» (score) associée du «résultat» nombre compris entre -1 et 1, 1 étant le meilleur résultat possible, -1 étant le pire) 3) Choisir le «déplacement» menant au prob * score le plus élevé 4) Si le déplacement a conduit à un «gain» ou à une «perte», arrêtez, sinon retournez à l’étape 1.

Après un certain temps (ou un «gain / perte»), évaluez la proximité du réseau neuronal par rapport à l’objective (cela impliquera probablement une certaine connaissance du domaine). Ensuite, jetez les 50% (ou un autre pourcentage) de NN les plus éloignés de l’objective, effectuez un crossover / mutation du 50% supérieur et exécutez à nouveau le nouvel ensemble de NN. Continuez à courir jusqu’à ce qu’un NN satisfaisant sorte.

Dans un premier temps, vous pouvez regarder la différence des images consécutives. Vous devez faire la distinction entre les sprites en arrière-plan et les monstres réels. Je suppose que le monde peut aussi contenir des animations. Pour les trouver, le personnage se déplacerait et rassemblerait tout ce qui bouge avec le monde dans une grande image de fond / animation.

Vous pouvez détecter et identifier les ennemis avec corrélation (en utilisant FFT). Cependant, si les animations répètent exactement les pixels, il sera plus simple de regarder quelques valeurs de pixels. Votre tâche principale sera d’écrire un système robuste qui identifiera l’apparition d’un nouvel object à l’écran et qui intégrera progressivement toutes les images du cadre dans une firebase database. Vous devez probablement construire des modèles pour les effets d’armes. Ceux-ci peuvent être soustraits afin qu’ils n’encombrent pas la firebase database de votre adversaire.

Je pense que votre meilleur pari serait une architecture complexe impliquant quelques / plusieurs réseaux: c’est-à-dire une reconnaissance et une réponse aux objects, un pour le magasin, un pour le combat (peut-être qu’il en faudrait un pour la reconnaissance ennemie, un pour les attaques), etc. .

Ensuite, essayez de penser au jeu de Diablo II le plus simple possible, probablement un Barbare. Alors, gardez les choses simples au début, comme la loi I, premier domaine seulement.

Alors, je suppose que les «buts» précieux seraient la disparition des objects ennemis et la diminution de la barre de santé (notée en sens inverse).

Une fois que vous avez pris en charge ces tâches distinctes, vous pouvez utiliser un ANN “maître” pour décider quel sous-ANN activer.

En ce qui concerne la formation, je ne vois que trois options: vous pouvez utiliser la méthode évolutive décrite ci-dessus, mais vous devez ensuite sélectionner manuellement les «gagnants», sauf si vous codez un programme complet distinct pour cela. Vous pourriez faire en sorte que les réseaux «regardent» quelqu’un jouer. Ici, ils apprendront à imiter un joueur ou un groupe de style de joueur. Le réseau essaie de prédire la prochaine action du joueur, le renforce pour une estimation correcte, etc. Si vous obtenez réellement l’ANN que vous voulez, cela pourrait être fait avec le gameplay vidéo, pas besoin de gameplay réel en direct. Enfin, vous pourriez laisser le réseau jouer le jeu, en ayant des morts, des niveaux supérieurs, une santé retrouvée, etc. en tant que renforcement positif et décès de joueurs, perte de santé, etc. en tant que renforcement négatif. Mais en voyant comment un simple réseau nécessite des milliers d’étapes de formation concrètes pour apprendre des tâches simples, il vous faudra beaucoup de patience pour celui-ci.

Dans l’ensemble, votre projet est très ambitieux. Mais pour ma part, je pense que cela pourrait “en théorie se faire”, avec suffisamment de temps.

J’espère que ça aide et bonne chance!