Comment former un réseau de neurones artificiels pour jouer à Diablo 2 en utilisant une entrée visuelle?
j'essaie actuellement d'obtenir une 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 point de vue isométrique, le joueur contrôlant un seul avatar sur lequel la caméra est centrée.
pour rendre les choses concrètes, la tâche est d'obtenir votre caractère X points d'expérience sans avoir sa chute de santé à 0, où l'expérience le point est gagné en tuant des monstres. Voici un exemple du gameplay:
maintenant, puisque je veux que le net fonctionne sur la base uniquement de l'information qu'il obtient à partir des pixels sur l'écran, il doit apprendre une représentation très riche afin de jouer efficacement, puisque cela lui demanderait probablement de savoir (implicitement au moins) comment diviser le monde du jeu en objets et comment interagir avec eux.
et toute cette information doit être enseignée sur le net... d'une certaine manière. Je ne peux pas penser à la façon d'entraîner cette chose. Ma seule idée est d'avoir un programme séparé visuellement extraire quelque chose de bon/mauvais innately dans le jeu (par exemple la santé, l'or, l'expérience) de l'écran, puis utiliser cette stat dans une procédure d'apprentissage de renforcement. Je pense que ce sera partie de la réponse, mais je ne pense pas que ce sera suffisant; il ya tout simplement trop de niveaux d'abstraction de l'input visuel brut au comportement orienté vers le but pour un feedback aussi limité pour former un filet dans ma vie.
alors, ma question: quelles autres façons pouvez-vous penser à former un filet 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 direction: je suis à la recherche d'autres sources d'apprentissage de renforcement et/ou des méthodes non supervisées pour extraire des informations utiles dans ce paramètre. Ou un algorithme supervisé si vous pouvez penser à un moyen d'obtenir des données étiquetées d'un monde de jeu sans avoir à manuellement label.
mise à JOUR(04/27/12):
étrangement, je travaille encore là-dessus et je semble faire des progrès. 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. Par conséquent, j'ai utilisé un Deep belief net composé de factored conditional restricted Boltzmann machines que j'ai formé d'une manière non supervisée (sur la vidéo de moi jouant le jeu) avant de peaufiner avec Temporal difference back-propagation (c.-à-d. l'apprentissage de renfort avec des ANNs d'avance standard).
toujours à la recherche de données plus utiles, en particulier sur le problème de la sélection de l'action en temps réel et la façon d'encoder images en couleur pour le traitement ANN: -)
UPDATE (21/10/15):
je viens de me rappeler que j'ai posé cette question dans la journée, et j'ai pensé que je devrais mentionner que ce n'est plus une idée folle. Depuis ma dernière mise à jour, DeepMind a publié leur nature papier sur Obtenir des réseaux neuronaux pour 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 est le manque d'accès à la sous-jacentes moteur de jeu. Le rendu à l'écran, puis rediriger vers le réseau est juste trop lent à se former dans un laps de temps raisonnable. Ainsi, nous ne verrons probablement pas ce genre de bot jouer Diablo 2 de sitôt, mais seulement parce qu'il jouera quelque chose soit en open-source ou avec un accès API à la cible de rendu. (tremblement de terre peut-être?)
7 réponses
je peux voir que vous êtes inquiet sur la façon de former L'ANN, mais ce projet cache une complexité dont vous pourriez ne pas être au courant. Reconnaissance des objets / caractères sur les jeux informatiques par traitement d'image c'est une tâche très difficile (ne pas dire fou pour les jeux FPS et RPG). Je ne doute pas de vos compétences et je ne dis pas non plus que ce ne peut pas être fait, mais vous pouvez facilement passer 10 fois plus de temps à travailler sur la reconnaissance la mise en œuvre de L'ANN elle-même (en supposant que vous avez déjà de l'expérience avec traitement d'image numérique techniques).
je pense que votre idée est très intéressant et également très ambitieux . À ce stade, vous pourriez vouloir reconsidérer. Je sens que ce projet est quelque chose que vous planifiez pour l'université, donc si le centre D'intérêt 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 en quelque sorte similaire il n'y a pas trop longtemps. Il vaut la peine de le vérifier.
d'un autre côté, il pourrait y avoir des approches meilleures/plus faciles pour identifier les objets dans le jeu si vous acceptez les suggestions. Mais d'abord, appelons ce projet pour ce que vous voulez qu'il soit: un smart-bot .
la méthode pour la mise en œuvre de robots accède à la mémoire du client du jeu pour trouver des informations pertinentes, telles que l'emplacement du personnage sur l'écran et c'est la santé. Lire la mémoire de l'ordinateur est trivial, mais trouver exactement où dans la mémoire de chercher n'est pas. Les scanners mémoire comme moteur de tricherie peut être très utile pour cela.
une autre méthode , qui fonctionne sous le jeu, implique la manipulation des informations de rendu. Tous les objets du jeu doivent être rendus à l'écran. Cela signifie que les emplacements de tous les objets 3D seront éventuellement envoyés à la carte vidéo pour traitement. 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 par le traitement d'image. Si vous êtes intéressé par eux, vous pouvez en savoir plus sur eux sur exploitation de jeux en ligne (chapitre 6), un excellent livre sur le sujet.
mise à jour 2018-07-26: C'est ça! Nous approchons maintenant du point où ce genre de jeu sera soluble! En utilisant OpenAI et basé sur le jeu DotA 2, une équipe pourrait faire un AI qui peut 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 avancer que c'est encore plus compliqué en raison du jeu d'équipe.
Comme prévu, cela a été réalisé grâce aux dernières avancées dans l'apprentissage de renforcement avec Deep learning, et en utilisant des cadres de jeu ouverts comme OpenAI qui facilite le développement d'une IA depuis que vous obtenez une API soignée et aussi parce que vous pouvez accélérer le jeu (L'IA joué 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 lancer cette AI contre les meilleurs joueurs DotA 2. Si ce fonctionne, s'attendre à une grande révolution, peut-être pas aussi médiatisé que la résolution du jeu de Go, mais il sera néanmoins un jalon énorme pour les jeux AI!
mise à jour 2017-01: le domaine évolue très vite depuis le succès D'AlphaGo, et il existe de nouveaux cadres pour faciliter le développement d'algorithmes d'apprentissage machine 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 n'importe quel jeu en utilisant la machine d'apprentissage . L'API est en Python, et il exécute les jeux derrière un environnement de bureau à distance VNC, de sorte qu'il peut capturer les images de n'importe quel jeu! Vous pouvez probablement utiliser univers pour jouer Diablo II à travers un algorithme d'apprentissage automatique!
- Openai's Gym : similaire à L'univers mais ciblant spécifiquement les algorithmes d'apprentissage de renforcement (so it's kind d'une généralisation du framework utilisé par AlphaGo mais à beaucoup plus de jeux). Il y a un cours sur Udemy couvrant l'application de la machine à apprendre à des jeux comme l'évasion ou la mort en utilisant OpenAI Gym.
- TorchCraft : un pont entre Torche (machine learning), et un cadre de StarCraft: Brood War.
- pyGTA5 : un projet de construction auto-conduite dans GTA5 en utilisant seulement des captures d'écran (avec beaucoup de vidéos en ligne ).
des temps très excitants!
mise à jour importante (2016-06): comme le note L'OP, ce problème de formation de réseaux artificiels pour jouer à des jeux n'utilisant que des entrées visuelles est désormais abordé par plusieurs institutions sérieuses, avec des résultats très prometteurs, tels que DeepMind Deep-QLE Learning-Network (DQN) .
et maintenant, si vous voulez prendre sur le prochain défi de niveau, vous pouvez utiliser l'un des divers AI vision game development platforms tel que ViZDoom , une plate-forme hautement optimisée (7000 fps) pour former des réseaux pour jouer à Doom en utilisant seulement des entrées visuelles:
ViZDoom permet de développer des bots AI qui jouent Doom en utilisant uniquement l'information visuelle (le tampon d'écran). Il est principalement destiné à: pour la recherche dans la machine de l'apprentissage visuel et la profondeur de l'apprentissage par renforcement, en particulier. ViZDoom est basé sur ZDoom pour fournir la mécanique du jeu.
et les résultats sont assez étonnants, voir les vidéos sur leur page web et le joli tutoriel (en Python) ici!
Il ya aussi un projet similaire pour Quake 3 Arena, appelé Quagents , qui fournit également facile L'accès API aux données sous-jacentes du jeu, mais vous pouvez le supprimer et juste utiliser des captures d'écran et L'API seulement pour contrôler votre agent.
Pourquoi une plate-forme utile si nous n'utilisons que des captures d'écran? Même si vous n'ACCÉDEZ PAS aux données sous-jacentes du jeu, une telle plate-forme fournit:
- haute performance mise en œuvre de jeux (vous pouvez générer plus de données/Jeux/générations d'apprentissage avec moins de temps afin que vos algorithmes d'apprentissage peuvent converge plus vite!).
- une simple et API responsive pour contrôler vos agents (c'est-à-dire, 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...).
- installation facile scénarios personnalisés .
- Rendu personnalisable (peut être utile pour "simplifier" les images que vous obtenez à l'aise traitement)
- synchronisé ("tour à tour") jouer (donc vous n'avez pas besoin de votre algorithme pour fonctionner en temps réel au début, c'est une énorme réduction de la complexité).
- des fonctionnalités supplémentaires telles que la compatibilité crossplatform, la rétrocompatibilité (vous ne risquez pas que votre bot ne travaille 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 que ils soulagent une grande partie des problèmes techniques précédents vous aviez à traiter avec (comment manipuler les entrées de jeu, comment configurer les scénarios, etc.), de sorte que vous avez juste à composer avec l'algorithme d'apprentissage lui-même.
alors maintenant, au travail et faire de nous le meilleur bot visuel AI jamais ;)
ancien post décrivant les questions techniques de développer une IA s'appuyant uniquement sur les entrées visuelles:
Contrairement à certains de mes collègues ci-dessus, je ne pense pas que ce problème est insoluble. Mais c'est sûrement un dur hella!
le premier problème comme indiqué 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 maintenir une sorte de mémorisation (santé, mais aussi objets équipés et articles disponibles à utiliser, quêtes et objectifs, etc.). Pour obtenir de telles informations, vous avez deux moyens: soit en accédant directement aux données du jeu, ce qui est le plus fiable et facile; soit vous pouvez créer une représentation abstraite de ces informations en mettant en œuvre quelques procédures simples (open inventory, prendre une capture d'écran, extraire les données). Bien sûr, extraire des données d'une capture d'écran vous permettra de mettre en place une procédure supervisée (que vous définissez complètement) ou non supervisée (via un algorithme d'apprentissage machine, mais alors il va augmenter beaucoup la complexité...). Pour l'apprentissage automatique sans supervision, vous aurez besoin d'utiliser un type assez récent d'algorithmes appelés algorithmes d'apprentissage structurel (qui apprennent la structure des données plutôt que la façon de les classer ou de prédire une valeur). Un de ces algorithmes est le réseau neuronal récursif (à ne pas confondre avec le réseau neuronal récursif) de Richard Socher: http://techtalks.tv/talks/54422 /
alors, un autre problème est que même si 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 des informations traitées du jeu, par exemple l'emplacement de votre avatar, mais aussi l'emplacement des objets de quête, des buts et des ennemis en dehors de l'écran. Vous pouvez peut-être regarder dans les filtres à particules de mélange par Vermaak 2003 pour cela.
aussi, vous devez avoir un agent autonome , avec objectifs généré dynamiquement. Une architecture bien connue que vous pouvez essayer est BDI agent, mais vous devrez probablement le modifier pour que cette architecture fonctionne dans votre cas pratique. Comme une alternative, il ya aussi le réseau Petri récursive, que vous pouvez probablement combiner avec toutes sortes de variations des filets petri pour atteindre ce que vous voulez, car il est très bien étudié et flexible cadre, avec de grandes procédures de formalisation et de preuve.
et enfin, même si vous faites tout ce qui précède, vous aurez besoin de trouver un moyen d'imiter le jeu dans vitesse accélérée (l'utilisation d'une vidéo peut être agréable, mais le problème est que votre algorithme ne sera spectate sans contrôle, et être en mesure d'essayer pour lui-même est très important pour l'apprentissage). En effet, il est bien connu que l'algorithme de pointe actuel prend beaucoup plus de temps à apprendre le même chose qu'un humain peut apprendre (encore plus avec l'apprentissage de renforcement), donc si ne peut pas accélérer le processus (c'est-à-dire, si vous ne pouvez pas accélérer le temps de jeu), votre algorithme ne sera même pas convergent dans une vie simple...
pour conclure, ce que vous voulez réaliser ici est à la limite (et peut-être un peu au-delà) des algorithmes de pointe actuels . Je pense que c'est possible, mais même si c'est le cas, vous allez passer beaucoup de temps , parce que ce n'est pas un problème théorique mais un problème pratique vous approchez ici, et donc vous avez besoin de mettre en œuvre et combiner un grand nombre d'approches AI différents afin de le résoudre.
plusieurs décennies de recherche avec une équipe entière travaillant dessus ne suffiraient peut-être pas, donc si vous êtes seul et travaillez dessus à temps partiel (comme vous avez probablement un emploi pour vivre) vous pouvez passer une vie entière sans atteindre n'importe où près d'une solution de travail.
donc mon conseil le plus important ici serait que vous baisser vos attentes, et essayer de réduire la complexité de votre problème en utilisant toutes les informations que vous pouvez, et éviter autant que possible en se basant sur des captures d'écran (c'est-à-dire, essayer de s'accrocher directement dans le jeu, chercher l'injection DLL), et simplifier certains problèmes en mettant en œuvre des procédures supervisées, ne laissez pas votre algorithme tout apprendre (c'est-à-dire, laisser tomber l'image traitement pour l'instant autant que possible et de compter sur les informations de jeu internes, plus tard, si votre algorithme fonctionne bien, vous pouvez remplacer certaines parties de votre programme AI avec le traitement d'image, ainsi atteindre votre objectif complet, par exemple si vous pouvez obtenir quelque chose à travailler tout à fait bien, vous pouvez essayer de complexifier votre problème et de remplacer les procédures supervisées et les données de jeu de mémoire par des algorithmes d'apprentissage machine non supervisés sur des captures d'écran).
Bonne chance, et si ça fonctionne, assurez-vous de publier un article, vous pouvez sûrement obtenir de renom pour résoudre un tel problème pratique!
Le problème que vous poursuivez est intraitable dans la façon dont vous l'avez défini. C'est généralement une erreur de penser qu'un réseau neuronal apprendrait "par magie" une riche représentation d'un problème. Un bon fait à garder à l'esprit lorsque vous décidez si ANN est l'outil approprié pour une tâche est qu'il s'agit d'une méthode d'interpolation. Pensez, si vous pouvez encadrer votre problème comme trouver une approximation d'une fonction, où vous avez de nombreux points de cette fonction et beaucoup de temps pour concevoir le réseau et de la formation.
Le problème que vous proposez ne passe pas ce test. Contrôle du jeu n'est pas une fonction de l'image sur l'écran. Il y a beaucoup d'informations, 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 semble le même. 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 l'action en entrant dans le magasin.
D'ailleurs, il y a le problème de l'échelle. La tâche que vous proposez est tout simplement trop compliqué à apprendre, en tout temps raisonnable. Vous devriez voir aigamedev.com pour combien de jeu de l'IA fonctionne. Les réseaux neuronaux artificiels ont été utilisés avec succès dans certains jeux, mais de manière très limitée. Jeu AI est difficile et souvent coûteux à développer. S'il y avait une approche générale de la construction de réseaux neuronaux fonctionnels, l'industrie aurait probablement saisis sur elle. Je vous recommande de commencer par des exemples beaucoup, beaucoup plus simples, comme tic-tac-toe.
semble comme le cœur de ce projet explore ce qui est possible avec une ANN, donc je suggérerais de choisir un jeu où vous n'avez pas à traiter le traitement d'image (qui d'autres réponses sur ici, semble comme un vraiment tâche difficile dans un jeu en temps réel). Vous pouvez utiliser L'API Starcraft pour construire votre bot, ils vous donnent accès à tous les états de jeu pertinents.
bien en supposant à tout moment que vous pourriez générer un ensemble de 'résultats' (pourrait impliquer des probabilités) à partir d'un ensemble de tous les 'mouvements' possibles, et qu'il y a une certaine notion de cohérence dans le jeu (par exemple, vous pouvez jouer au niveau X encore et encore), vous pourriez commencer avec N réseaux neuronaux avec des poids aléatoires, et avoir chacun d'eux jouer le jeu de la manière suivante:
1) pour chaque 'mouvement' possible, produire une liste des 'résultats' possibles (avec les probabilités associées) Deux) Pour chaque résultat, utilisez votre réseau neuronal pour déterminer la "valeur" (score) associée au "résultat" (par exemple un nombre entre -1 et 1, 1 étant le meilleur résultat possible, -1 étant le pire).) 3) Choisissez le "mouvement" menant au score prob * le plus élevé 4) Si le mouvement a conduit à une "gagner" ou "perdre", arrêter, sinon revenir à l'étape 1.
après un certain temps (ou une "victoire" /une "défaite"), évaluez à quel point le réseau neuronal était proche du " but " (cela impliquera probablement un domaine connaissance.) Ensuite, jeter les 50% (ou un autre pourcentage) de NNs qui étaient le plus loin de l'objectif, faire le crossover/mutation du top 50%, et exécuter la nouvelle série de NNs à nouveau. Continuez à courir jusqu'à ce qu'une NN satisfaisante sorte.
comme première étape, vous pouvez regarder la différence de cadres consécutifs. Vous devez faire la différence entre le fond et les sprites de monstre réel. Je suppose que le monde peut aussi contenir des animations. Pour trouver ceux-là, je voudrais que le personnage se déplace et de recueillir tout ce qui se déplace 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 pixel-exact il sera plus rapide de simplement regarder quelques valeurs de pixel. Votre tâche principale sera d'écrire un système robuste qui identifiera quand un nouvel objet apparaît sur l'écran et qui progressivement transformera tous les cadres du cadre sprite en base de données. Probablement vous devez construire des modèles pour les effets d'armes aussi bien. Ceux - ci peuvent être soustraits afin qu'ils ne encombrent pas votre base de données de l'adversaire.
je pense que votre meilleur pari serait une architecture complexe impliquant quelques réseaux/mai: un pour reconnaître et répondre aux articles, un pour le magasin, un pour le combat (peut-être ici vous en auriez besoin d'un pour la reconnaissance de l'ennemi, un pour les attaques), etc.
alors essayez de penser au gameplay Diablo II le plus simple possible, probablement un barbare. Alors faites simple au début, comme L'Acte I, Premier domaine seulement.
alors je suppose que de précieux "buts" serait disparition des objets ennemis et diminution de la barre de santé (note inverse).
une fois que vous avez pris soin de ces tâches 'simples' séparées, vous pouvez utiliser un ANN 'maître' pour décider quel sub-ANN à activer.
quant à la formation, je ne vois que trois options: vous pourriez utiliser la méthode évolutive décrite ci-dessus, mais alors vous devez sélectionner manuellement les "gagnants", à moins que vous ne codez un programme séparé entier pour cela. Vous pourriez avoir les réseaux de surveillance quelqu'un jouer. Ici, ils apprendront à imiter le style d'un joueur ou d'un groupe de joueurs. Le réseau essaie de prédire la prochaine action du Joueur, est renforcé 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. Enfin, vous pourriez laisser le réseau jouer le jeu, avoir des morts ennemis, des mises à niveau, retrouvé la santé, etc. comme le renforcement positif et les décès de joueurs, perte de santé,etc. comme renfort négatif. Mais, en voyant comment même un réseau simple nécessite des milliers d'étapes concrètes de formation pour apprendre même des tâches simples, vous auriez besoin de beaucoup de patience pour celui-ci.
dans l'Ensemble de votre projet est très ambitieux. Mais je pense qu'il pourrait en théorie être fait", étant donné assez de temps.
Espérons que cela aide, et bonne chance!