149 votes

Comment entraîner un réseau neuronal artificiel à jouer à Diablo 2 en utilisant des données visuelles ?

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

J'ai opté pour Diablo 2. Le jeu se déroule donc en temps réel et selon un point de vue isométrique, le joueur contrôlant un seul avatar sur lequel la caméra est centrée.

Pour être concret, il s'agit d'obtenir x points d'expérience pour votre personnage sans que sa santé ne tombe à 0, les points d'expérience étant obtenus en tuant des monstres. Voici un exemple de gameplay :

here

Maintenant, puisque je veux que le filet fonctionne uniquement sur la base des informations qu'il reçoit des pixels sur l'écran, il doit apprendre une représentation très riche afin de jouer efficacement, puisque cela exigerait vraisemblablement qu'il sache (implicitement au moins) comment diviser le monde du jeu en objets et comment interagir avec eux.

Et toutes ces informations doivent être enseignées au réseau d'une manière ou d'une autre. Je n'arrive pas à trouver comment former cette chose. Ma seule idée est de demander à un programme séparé d'extraire visuellement de l'écran quelque chose d'intrinsèquement bon/mauvais dans le jeu (par exemple santé, or, expérience), puis d'utiliser cette statistique dans une procédure d'apprentissage par renforcement. Je pense que ce sera partie Il y a trop de niveaux d'abstraction, de l'entrée visuelle brute au comportement orienté vers un but, pour qu'un retour d'information aussi limité puisse former un filet de mon vivant.

Ma question est donc la suivante : à quels autres moyens pensez-vous pour entraîner un réseau à effectuer 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 cherche 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 pensez à un moyen d'extraire des données étiquetées d'un univers de jeu sans avoir à les étiqueter manuellement.

MISE À JOUR(04/27/12) :

Étrangement, je travaille toujours sur ce sujet 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 appropriées à la tâche. J'ai donc utilisé un réseau de croyances profondes composé d'éléments facturés machines de Boltzmann restreintes conditionnelles que j'ai entraînée de manière non supervisée (sur une vidéo de moi jouant au jeu) avant de l'affiner à l'aide de rétropropagation de la différence temporelle (c.-à-d. l'apprentissage par renforcement avec des ANN standard à action directe).

Je suis toujours à la recherche d'autres contributions précieuses, notamment sur le problème de la sélection des actions en temps réel et sur la manière de coder les images en couleur pour le traitement ANN :-)

MISE À JOUR(10/21/15) :

Je viens de me rappeler que j'ai posé cette question à l'époque et j'ai pensé que je devais mentionner que ce n'est plus une idée folle. Depuis ma dernière mise à jour, DeepMind a publié sa nature article sur l'utilisation de 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 au moteur de jeu sous-jacent. Le rendu à l'écran, puis la redirection vers le réseau est tout simplement beaucoup trop lent pour être entraîné dans un délai raisonnable. Ainsi, nous ne verrons probablement pas ce type de robot jouer à Diablo 2 de sitôt, mais seulement parce qu'il jouera à un jeu open-source ou avec un accès API à la cible de rendu. (Quake peut-être ?)

2 votes

0 votes

Une grande différence entre le problème de conduite de l'article et un jeu est que dans le problème de conduite, l'entrée visuelle est une représentation d'état suffisamment complète : s'il y a un obstacle à droite, tournez à gauche, s'il y a un obstacle à gauche, tournez à droite. Cependant, dans un jeu, vous devez souvent prendre des décisions en fonction d'éléments qui ne sont pas affichés à l'écran. Chaque fois que vous entrez dans un magasin, il peut sembler identique, mais vous devez acheter des articles différents.

1 votes

Pour autant que je m'en souvienne, Diablo 2 utilise des feuilles de sprites faciles à extraire. Il devrait être assez simple de lier des objets (joueur, ennemis etc...) à une liste de sprites associés. Cela ne résout pas le problème des objets masqués les uns par les autres, mais c'est un début.

61voto

karlphillip Points 46502

Je vois que vous êtes inquiet sur la façon de former le ANN, mais ce projet cache une complexité dont vous n'avez peut-être pas conscience. Reconnaissance des objets et des personnages dans les jeux vidéo par traitement des images il s'agit d'une tâche très difficile (sans 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 n'est pas faisable, mais vous pouvez facilement passer 10x plus de temps à travailler sur la reconnaissance que sur l'implémentation de l'ANN elle-même (en supposant que vous ayez déjà de l'expérience avec l'ANN). traitement des images numériques techniques).

Je pense que votre idée est très intéressant et également très ambitieux . A ce stade, vous pourriez vouloir le reconsidérer. Je sens que ce projet est quelque chose que vous prévoyez pour l'université, donc si l'objectif 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 une projet différent mais en quelque sorte similaire il n'y a pas si longtemps. Ça vaut le coup de vérifier.

D'un autre côté, il pourrait y avoir des approches meilleures/faciles pour identifier les objets dans le jeu si vous acceptez des suggestions. Mais tout d'abord, appelons ce projet pour ce que vous voulez qu'il soit : une robot intelligent .

Une méthode pour la mise en œuvre des bots accède à 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é. Lire la mémoire d'un ordinateur est trivial, mais savoir exactement où chercher dans la mémoire ne l'est pas. Les scanners de mémoire comme Moteur de triche peut être très utile pour cela.

Une autre méthode qui fonctionne sous le jeu, consiste à manipuler 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 finalement 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 par le traitement d'image. Si elles vous intéressent, vous pouvez trouver plus d'informations à leur sujet sur le site suivant Exploitation des jeux en ligne (chapitre 6), un excellent ouvrage sur le sujet.

46voto

user1121352 Points 1066

MISE À JOUR 2018-07-26 : C'est ça ! Nous approchons maintenant du point où ce type de jeu sera soluble ! En utilisant OpenAI et en se basant sur le jeu DotA 2, une équipe pourrait créer une IA qui peut battre des joueurs semi-professionnels dans un match 5v5 . Si vous connaissez DotA 2, vous savez que ce jeu est assez similaire aux jeux de type Diablo en termes de mécanismes, mais on pourrait dire qu'il est encore plus compliqué en raison du jeu en équipe.

Comme prévu, ce résultat a été obtenu grâce aux dernières avancées en matière d'apprentissage par renforcement et d'apprentissage profond, ainsi qu'à l'utilisation de cadres de jeu ouverts tels qu'OpenAI, qui facilitent le développement d'une IA en offrant une API soignée et en permettant d'accélérer le jeu (l'IA a joué l'équivalent de 180 ans de jeu contre elle-même chaque jour !)

Le 5 août 2018 (dans 10 jours !) il est prévu d'opposer cette IA aux 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 de Go, mais ce sera néanmoins une étape importante pour l'IA des jeux !

MISE À JOUR 2017-01 : Le domaine évolue très vite depuis le succès d'AlphaGo, et il y a de nouveaux cadres pour faciliter le développement d'algorithmes d'apprentissage automatique sur les jeux presque tous les mois. Voici une liste des derniers que j'ai trouvés :

  • L'univers d'OpenAI : une plateforme pour jouer à pratiquement tous les jeux grâce à l'apprentissage automatique . 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 Universe pour jouer à Diablo II grâce à un algorithme d'apprentissage automatique !
  • Gymnase d'OpenAI : Similaire à Universe mais ciblant spécifiquement les algorithmes d'apprentissage par renforcement (il s'agit donc d'une sorte de généralisation du cadre utilisé par AlphaGo mais à beaucoup plus de jeux). Il y a un cours sur Udemy couvrant l'application de l'apprentissage automatique à des jeux comme Breakout ou Doom en utilisant OpenAI Gym.
  • TorchCraft : un pont entre Torche (cadre d'apprentissage automatique) et StarCraft : Brood War.
  • pyGTA5 : un projet visant à construire des voitures autopilotées dans GTA5 en utilisant uniquement des captures d'écran (avec beaucoup de vidéos en ligne ).

Une période très excitante !

MISE À JOUR IMPORTANTE (2016-06) : Comme l'a noté OP, ce problème de formation de réseaux artificiels pour jouer à des jeux en utilisant uniquement des données visuelles est maintenant abordé par plusieurs institutions sérieuses, avec des résultats assez prometteurs, tels que Réseau d'apprentissage profond DeepMind (DQN) .

Et maintenant, si vous voulez relever le défi du niveau suivant, vous pouvez utiliser l'un des différents moyens suivants Plateformes de développement de jeux avec vision d'IA comme ViZDoom Une plateforme hautement optimisée (7000 images par seconde) pour entraîner des réseaux à jouer à Doom en utilisant uniquement des entrées visuelles :

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

Et les résultats sont assez étonnants, voir 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 accès facile par API aux données de jeu sous-jacentes, mais vous pouvez l'abandonner et n'utiliser que des captures d'écran et l'API pour contrôler votre agent.

Pourquoi une telle plateforme est-elle utile si nous n'utilisons que des captures d'écran ? Même si vous n'avez pas accès aux données sous-jacentes du jeu, une telle plateforme permet :

  • haute performance mise en œuvre de jeux (vous pouvez générer plus de données/jeux/générations d'apprentissage en moins de temps afin que vos algorithmes d'apprentissage puissent converger plus rapidement !)
  • une méthode simple et API réactive pour contrôler vos agents (c'est-à-dire que si vous essayez d'utiliser des entrées humaines pour contrôler un jeu, certaines de vos commandes peuvent être perdues, et vous devrez donc faire face à un manque de fiabilité de vos sorties...).
  • installation 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 ("turn-by-turn") (vous n'avez donc pas besoin que votre algorithme fonctionne en temps réel au départ, c'est une énorme réduction de la complexité).
  • des fonctions pratiques supplémentaires telles que la compatibilité multiplateforme, la rétrocompatibilité (vous ne risquez pas que votre robot ne fonctionne plus avec le jeu lorsqu'il y a une nouvelle mise à jour du jeu), etc.

Pour résumer, l'avantage de ces plateformes est que ils atténuent une grande partie des problèmes techniques précédents que vous avez dû gérer (comment manipuler les entrées du jeu, comment mettre en place des scénarios, etc. vous devez juste vous occuper de l'algorithme d'apprentissage lui-même.

Alors maintenant, mettez-vous au travail et faites de nous le meilleur robot visuel d'IA qui soit ;)


Vieux poste décrivant les problèmes techniques liés au développement d'une IA reposant uniquement sur des donné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 problème très difficile !

Le premier problème, tel que souligné 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 d'interface entre les images. mémorisation (santé, mais aussi objets équipés et objets disponibles à utiliser, quêtes et objectifs, etc.) Pour récupérer ces 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 ; soit en créant une représentation abstraite de ces informations en mettant en place quelques procédures simples (ouvrir l'inventaire, faire une capture d'écran, extraire les données). Bien sûr, l'extraction de données à partir d'une capture d'écran vous obligera à mettre en place une procédure supervisée (que vous définissez complètement) ou non supervisée (via un algorithme d'apprentissage automatique, mais alors 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 la façon de les classer ou de prédire une valeur). L'un de ces algorithmes est le réseau neuronal récursif (à ne pas confondre avec le réseau neuronal récurrent) de Richard Socher : http://techtalks.tv/talks/54422/

Ensuite, un autre problème est que même lorsque vous avez récupéré toutes les données dont vous avez besoin, le jeu est seulement partiellement observable . Vous devez donc injecter un modèle abstrait du monde et l'alimenter avec des informations traitées provenant du jeu, par exemple l'emplacement de votre avatar, mais aussi l'emplacement des objets de quête, des objectifs et des ennemis en dehors de l'écran. Pour ce faire, vous pouvez peut-être consulter Mixture Particle Filters de Vermaak 2003.

De plus, vous devez avoir un agent autonome avec objectifs généré dynamiquement. Une architecture bien connue que vous pouvez essayer est l'agent BDI, mais vous devrez probablement la modifier pour qu'elle fonctionne dans votre cas pratique. Comme alternative, il y a aussi le réseau de Petri récursif, que vous pouvez probablement combiner avec toutes sortes de variations des réseaux de Petri pour obtenir ce que vous voulez, car c'est un cadre très bien étudié et flexible, avec de grandes procédures de formalisation et de preuves.

Et enfin, même si vous faites tout ce qui précède, vous devrez trouver un moyen d'émuler le jeu en vitesse accélérée (l'utilisation d'une vidéo peut être intéressante, mais le problème est que votre algorithme ne fera que regarder sans contrôle, et la possibilité d'essayer par lui-même est très importante pour l'apprentissage). En effet, il est bien connu que les algorithmes actuels prennent beaucoup plus de temps pour apprendre la même chose qu'un humain (encore plus avec l'apprentissage par renforcement), donc si vous ne pouvez pas accélérer le processus (c'est-à-dire si vous ne pouvez pas accélérer le temps de jeu), votre algorithme ne convergera même pas en une seule vie...

En conclusion, ce que vous voulez réaliser ici est à la limite (et peut-être un peu au-delà) des algorithmes actuels de pointe . Je pense que c'est possible, mais même si ça l'est, vous allez passer beaucoup de temps parce qu'il ne s'agit pas d'un problème théorique, mais d'un problème de santé publique. problème pratique que vous abordez ici, et vous devez donc mettre en œuvre et combiner un grand nombre d'approches différentes de l'IA afin de le résoudre.

Plusieurs décennies de recherche avec toute une équipe travaillant sur le sujet ne suffiraient peut-être pas. Si vous êtes seul et que vous travaillez sur le sujet à temps partiel (car vous avez probablement un emploi pour gagner votre vie), vous risquez de passer toute une vie sans parvenir à une solution fonctionnelle.

Donc mon conseil le plus important ici serait que vous revoir vos attentes à la baisse et essayer de réduire la complexité. Vous pouvez aussi simplifier certains problèmes en implémentant des procédures supervisées, ne laissez pas votre algorithme tout apprendre (par exemple, laissez tomber le traitement d'image pour l'instant et reposez-vous sur les informations internes du jeu), plus tard, si votre algorithme fonctionne bien, vous pourrez remplacer certaines parties de votre programme d'IA par le traitement d'images, ce qui vous permettra d'atteindre progressivement votre objectif, par exemple, si vous arrivez à faire fonctionner quelque chose assez bien, vous pouvez essayer de complexifier votre problème et remplacer les procédures supervisées et les données de jeu en mémoire par des algorithmes d'apprentissage automatique non supervisés sur des captures d'écran).

Bonne chance, et si ça marche, n'oubliez pas de publier un article, vous pourrez sûrement être renommé pour avoir résolu un problème pratique aussi difficile !

26voto

Don Reba Points 6642

Le problème que vous poursuivez est insoluble de la manière dont vous l'avez défini. C'est généralement une erreur de penser qu'un réseau neuronal apprendrait "par magie" une représentation riche d'un problème. Il est bon de garder à l'esprit, au moment de décider si un réseau neuronal est le bon outil pour une tâche donnée, qu'il s'agit d'une méthode d'interpolation. Demandez-vous si vous pouvez formuler votre problème comme la recherche d'une approximation d'une fonction, où vous disposez de nombreux points de cette fonction et de beaucoup de temps pour concevoir le réseau et l'entraîner.

Le problème que vous proposez ne passe pas ce test. Le contrôle du jeu n'est pas une fonction de l'image sur l'écran. Il y a beaucoup d'informations que le joueur doit garder en mémoire. Pour prendre un exemple simple, il est souvent vrai que chaque fois que vous entrez dans une boutique dans un jeu, l'écran a la même apparence. Cependant, ce que vous achetez dépend des circonstances. Quelle que soit la complexité du réseau, si les pixels de l'écran constituent son entrée, il effectuera 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 tout simplement trop compliquée pour être apprise en un temps raisonnable. Vous devriez voir aigamedev.com pour le fonctionnement de l'intelligence artificielle des jeux. Les réseaux neuronaux artificiels ont été utilisés avec succès dans certains jeux, mais de manière très limitée. L'IA des jeux est difficile et souvent coûteuse à développer. S'il existait une approche générale de la construction de réseaux neuronaux fonctionnels, l'industrie s'en serait très probablement emparée. Je vous recommande de commencer par des exemples beaucoup, beaucoup plus simples, comme le tic-tac-toe.

0 votes

C'est normal. On pourrait qualifier d'ANN tout ce qui ressemble à un réseau, mais cela pourrait difficilement mener à une discussion de fond. :)

0 votes

Heh ouais... J'aurais dû expliquer ma motivation plus en profondeur. Je sais qu'il existe de meilleures façons de créer des IA de jeu, mais je fais cela pour repousser les limites du simulateur ANN que j'ai amélioré. Voir : stanford.edu/groupe/pdplab/pdphandbook

1 votes

Quoi qu'il en soit, Don Reba a raison, je ne pense pas non plus qu'il soit possible d'apprendre une stratégie pour quelque chose comme Diablo sans incorporer beaucoup de connaissances préalables et extraire des caractéristiques utiles sur lesquelles une approche d'apprentissage par renforcement pourrait se baser. L'apprentissage à partir de l'entrée vidéo sera extrêmement difficile, voire impossible, avec les ordinateurs d'aujourd'hui.

18voto

tstramer Points 221

Il semble que le cœur de ce projet soit d'explorer ce qui est possible avec un ANN, donc je suggérerais de choisir un jeu où vous n'avez pas à vous occuper du traitement d'images (ce qui, d'après les réponses des autres ici, semble être une tâche difficile). vraiment tâche difficile dans un jeu en temps réel). Vous pouvez utiliser l'API de Starcraft pour construire votre robot, elle vous donne accès à tous les états de jeu pertinents.

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

1voto

tstramer Points 221

En supposant qu'à tout moment, vous puissiez générer un ensemble de "résultats" (pouvant impliquer des probabilités) à partir d'un ensemble de tous les "mouvements" possibles, et qu'il existe une certaine notion de cohérence dans le jeu (par exemple, vous pouvez jouer le niveau X encore et encore), vous pourriez commencer avec N réseaux neuronaux avec des poids aléatoires, et faire en sorte que chacun d'eux joue le jeu de la manière suivante :

1) Pour chaque "coup" possible, générez une liste de "résultats" possibles (avec les probabilités associées). 2) Pour chaque résultat, utilisez votre réseau neuronal pour déterminer une "valeur" associée (score) du "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" conduisant au score prob * le plus élevé. 4) Si le coup a conduit à une victoire ou à une défaite, arrêtez-vous, sinon retournez à l'étape 1.

Après un certain temps (ou une "victoire"/"défaite"), évaluez dans quelle mesure le réseau neuronal s'est rapproché de l'"objectif" (cela nécessitera probablement une certaine connaissance du domaine). Puis, on élimine les 50 % (ou un autre pourcentage) de réseaux neuronaux les plus éloignés de l'objectif, on effectue un croisement/mutation des 50 % supérieurs et on exécute à nouveau le nouvel ensemble de réseaux neuronaux. Continuez jusqu'à ce que vous obteniez un NN satisfaisant.

0 votes

Ah, ajouter une AG dans le mélange, intéressant. Malheureusement, puisque le réseau envoie les touches et les mouvements de la souris en tant qu'actions, j'aurais besoin d'un ordinateur physique par réseau >.< Un autre problème est que l'espace d'état de l'environnement n'est pas discret (techniquement, il l'est, mais à un grain très fin). Par exemple, imaginez le résultat possible associé à un clic de souris : Un personnage sous le contrôle du réseau pourrait se déplacer ou attaquer, mais les ennemis pourraient également se déplacer, et il y aurait des différences au pixel près dans l'environnement provenant de choses comme les ombres et les effets météorologiques.

0 votes

De mon point de vue, on ne peut pas faire grand-chose avec un réseau neuronal. Il semble qu'au mieux, il pourrait être utilisé comme une fonction heuristique apprenable d'une certaine notion d'espace d'état discret. Pour intégrer la variabilité de l'ennemi, il faudrait probablement utiliser une autre heuristique, puis l'utiliser pour créer un ensemble d'états de résultat possibles par mouvement avec les probabilités associées. En outre, tant qu'il existe une notion statique de configuration initiale et finale, vous pouvez simplement exécuter chaque réseau neuronal un par un.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X