J'essaie actuellement d'obtenir un ANN pour jouer à un jeu vidéo et j'espérais obtenir de l'aide de la merveilleuse communauté d'ici.
J'ai opté pour Diablo 2. Le jeu se fait 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 personnage x points d'expérience sans que sa santé ne tombe à 0, où les points d'expérience sont gagnés en tuant des monstres. Voici un exemple de gameplay:
Maintenant, puisque je veux que le net fonctionne uniquement sur la base des informations qu'il obtient des pixels à l'écran, il doit apprendre une représentation très riche afin de jouer efficacement, car cela exigerait vraisemblablement qu'il sache (implicitement au moins) comment divisez le monde du jeu en objets et comment interagir avec eux.
Et toutes ces informations doivent être enseignées au net d'une manière ou d'une autre. Je ne peux pas pour la vie de moi penser à comment entraîner cette chose. Ma seule idée est d'avoir un programme séparé pour extraire visuellement quelque chose d'innéement 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 ce sera suffisant; il y a tout simplement trop de niveaux d'abstraction, de l'entrée visuelle brute au comportement axé sur les objectifs, pour que des commentaires aussi limités entraînent un réseau au cours de ma vie.
Alors, ma question: à quelles autres façons pouvez-vous penser pour former un réseau à 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 recherche d'autres sources d'apprentissage par renforcement et / ou des méthodes non supervisées pour extraire des informations utiles dans ce cadre. Ou un algorithme supervisé si vous pouvez penser à un moyen d'extraire des données étiquetées d'un monde de jeu sans avoir à les étiqueter manuellement.
MISE À JOUR (27/04/12):
Étrangement, je travaille toujours là-dessus et 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 réseau de croyances profondes composé de machines Boltzmann conditionnelles et restreintes factorisées que j'ai entraînées de manière non supervisée (sur une vidéo de moi jouant au jeu) avant de peaufiner la rétro-propagation des différences temporelles (c'est -à- dire l'apprentissage par renforcement avec le standard). ANN à action directe).
Toujours à la recherche d'une contribution plus précieuse, en particulier sur le problème de la sélection des actions en temps réel et comment encoder des images couleur pour le traitement ANN :-)
MISE À JOUR (21/10/15):
Je viens de me souvenir que j'avais posé cette question dans le passé et que je devais mentionner que ce n'était plus une idée folle. Depuis ma dernière mise à jour, DeepMind a publié son article sur la nature pour amener les réseaux de neurones à jouer aux 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 le redirection vers le réseau est tout simplement beaucoup trop lent pour s'entraîner dans un laps de temps raisonnable. Ainsi, nous ne verrons probablement pas ce type de bot jouer à Diablo 2 de si tôt, mais uniquement parce qu'il jouera quelque chose soit open-source, soit avec un accès API à la cible de rendu. (Un tremblement peut-être?)
la source
Réponses:
Je peux voir que vous vous inquiétez de la façon de former l'ANN, mais ce projet cache une complexité dont vous n'êtes peut-être pas conscient. La reconnaissance d'objets / personnages sur les jeux informatiques par le biais du traitement d'image est une tâche très difficile (pas fou pour les jeux FPS et RPG). Je ne doute pas de vos compétences et je ne dis pas non plus que cela ne peut pas être fait, mais vous pouvez facilement passer 10 fois plus de temps à reconnaître des choses qu'à mettre en œuvre l'ANN lui-même (en supposant que vous ayez déjà une expérience des techniques de traitement d'images numériques ).
Je pense que votre idée est très intéressante et aussi très ambitieuse . À ce stade, vous voudrez peut-être le reconsidérer. Je sens que ce projet est quelque chose que vous planifiez 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 un projet différent mais similaire il n'y a pas si longtemps. Cela vaut la peine de le vérifier.
D'un autre côté, il peut 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 robot intelligent .
Une méthode pour implémenter des bots accède à la mémoire du client du jeu pour trouver des informations pertinentes, telles que l'emplacement du personnage sur l'écran et sa santé. La lecture de la mémoire de l'ordinateur est triviale, mais déterminer exactement où chercher dans la mémoire ne l'est pas. Les scanners de mémoire comme Cheat Engine peuvent être très utiles pour cela.
Une autre méthode , qui fonctionne sous le jeu, consiste à manipuler les 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 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 grâce au traitement d'image. Si vous êtes intéressé par eux, vous pouvez en trouver plus sur Exploiting Online Games (chapitre 6), un excellent livre sur le sujet.
la source
MISE À JOUR 2018-07-26: Voilà! Nous approchons maintenant du point où ce genre de jeu pourra être résolu! En utilisant OpenAI et sur la base du jeu DotA 2, une équipe pourrait créer une IA capable de battre des 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 qu'il 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 apprentissage en profondeur et en utilisant des cadres de jeu ouverts comme OpenAI qui facilite le développement d'une IA puisque vous obtenez une API soignée et aussi parce que vous pouvez accélérer le jeu (l'IA a 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 confronter 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 Go, mais ce sera néanmoins une étape importante 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 frameworks 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:
Des moments très excitants!
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 entrées visuelles est maintenant abordé par plusieurs institutions sérieuses, avec des résultats assez prometteurs, tels que DeepMind Deep-Qlearning-Network (DQN ) .
Et maintenant, si vous voulez relever le défi de niveau suivant, vous pouvez utiliser l'une des différentes plates-formes de développement de jeux de vision IA 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. :
Et les résultats sont assez étonnants, regardez les vidéos sur leur page web et le joli tutoriel (en Python) ici!
Il existe également un projet similaire pour Quake 3 Arena, appelé Quagents , qui fournit également un accès API facile 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 n'utilisons que des captures d'écran? Même si vous n'accédez pas aux données de jeu sous-jacentes, une telle plate-forme fournit:
Pour résumer, la grande chose à propos de ces plates-formes est qu'elles atténuent une grande partie des problèmes techniques précédents que vous avez dû traiter (comment manipuler les entrées de jeu, comment configurer des scénarios, etc.) afin que vous n'ayez qu'à gérer l'algorithme d'apprentissage. lui-même.
Alors maintenant, mettez-vous au travail et faites de nous le meilleur robot visuel IA de tous les temps;)
Ancien article décrivant les problèmes techniques liés au 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 très dur!
Le premier problème comme 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 de 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 moyens: soit en accédant directement aux données du jeu, ce qui est le plus fiable et le plus simple; ou bien vous pouvez créer une représentation abstraite de ces informations en implémentant des procédures simples (ouvrir l'inventaire, prendre une capture d'écran, extraire les données). Bien sûr, extraire des données d'une capture d'écran vous obligera soit à mettre en place une procédure supervisée (que vous définissez complètement), soit non supervisée (via un algorithme d'apprentissage automatique, mais cela augmentera beaucoup la complexité ...). Pour l'apprentissage automatique non supervisé, vous devrez utiliser un type d'algorithme assez récent appelé algorithmes d'apprentissage structurel (qui apprennent la structure des données plutôt que comment les classer ou prédire une valeur).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 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 objectifs et des ennemis en dehors de l'écran. Vous pouvez peut-être regarder dans les filtres à particules de mélange de Vermaak 2003 pour cela.
De plus, vous devez disposer d'un agent autonome , avec des objectifs générés dynamiquement. Une architecture bien connue que vous pouvez essayer est l'agent BDI, mais vous devrez probablement la modifier pour que cette architecture 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 à une vitesse accélérée (utiliser une vidéo peut être bien, mais le problème est que votre algorithme ne regardera que sans contrôle et ne pourra essayer par 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 pour apprendre la même chose qu'un humain peut apprendre (encore plus avec l'apprentissage par renforcement), donc s'il 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 convergera même pas en une seule vie ...
Pour conclure, 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 peut-être possible, mais même si c'est le cas, vous allez passer énormément de temps , car ce n'est pas un problème théorique mais un problème pratique que vous abordez ici, et donc vous devez mettre en œuvre et combiner beaucoup de différentes approches de l'IA afin de le résoudre.
Plusieurs décennies de recherche avec toute une équipe travaillant dessus ne suffiraient peut-être pas, donc si vous êtes seul et que vous y travaillez à temps partiel (car vous avez probablement un emploi pour vivre), vous pouvez passer toute une vie sans atteindre n'importe où une solution de travail.
Donc, mon conseil le plus important ici serait de réduire vos attentes et d'essayer de réduire la complexitéde votre problème en utilisant toutes les informations que vous pouvez, et évitez autant que possible de vous fier aux captures d'écran (c'est-à-dire essayez de vous connecter directement au jeu, recherchez l'injection de DLL), et simplifiez certains problèmes en implémentant des procédures supervisées, ne laissez pas votre L'algorithme apprend tout (c'est-à-dire, abandonne le traitement d'image pour le moment autant que possible et s'appuie sur les informations internes du jeu, plus tard, si votre algorithme fonctionne bien, vous pouvez remplacer certaines parties de votre programme d'IA par un traitement d'image, atteignant ainsi en général votre objectif complet, par exemple, si vous pouvez 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 de mémoire par des algorithmes d'apprentissage automatique non supervisés sur les captures d'écran).
Bonne chance, et si cela fonctionne, assurez-vous de publier un article, vous pouvez sûrement vous faire connaître pour avoir résolu un problème pratique aussi difficile!
la source
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 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 le bon outil pour une tâche est qu'il s'agit d'une méthode d'interpolation. Pensez à savoir si vous pouvez définir votre problème comme la recherche d'une approximation d'une fonction, où vous avez de nombreux 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 n'est pas fonction de l'image à l'écran. Il y a beaucoup d'informations que le joueur doit garder en mémoire. Pour un exemple simple, il est souvent vrai qu'à chaque fois que vous entrez dans une boutique dans un jeu, l'écran est le même. Cependant, ce que vous achetez dépend des circonstances. Quelle que soit 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 tout simplement trop compliquée à apprendre dans un laps de temps raisonnable. Vous devriez voir aigamedev.com pour savoir comment fonctionne l'IA du jeu. Les réseaux de neurones artificiels ont été utilisés avec succès dans certains jeux, mais de manière très limitée. L'IA de jeu est difficile et souvent coûteuse à développer. S'il y avait eu une approche générale de la construction de réseaux neuronaux fonctionnels, l'industrie l'aurait probablement saisi. Je vous recommande de commencer par des exemples beaucoup plus simples, comme le tic-tac-toe.
la source
On dirait que le cœur de ce projet est d'explorer ce qui est possible avec un ANN, donc je suggérerais de choisir un jeu où vous n'avez pas à gérer le traitement d'image (qui, d'après les réponses des autres ici, semble être une tâche très difficile dans un jeu en temps réel). Vous pouvez utiliser l'API Starcraft pour créer votre bot, ils vous donnent accès à tous les états de jeu pertinents.
http://code.google.com/p/bwapi/
la source
Dans un premier temps, vous pouvez examiner la différence entre les images consécutives. Vous devez faire la distinction entre l'arrière-plan et les sprites de monstres réels. Je suppose que le monde peut également contenir des animations. Pour les trouver, je demanderais au personnage de se déplacer et de rassembler tout ce qui bouge avec le monde dans une grande image / animation d'arrière-plan.
Vous pouvez détecter et identifier les ennemis avec corrélation (en utilisant FFT). Cependant, si les animations se répètent exactement au pixel, il sera plus rapide de ne regarder que quelques valeurs de pixel. Votre tâche principale sera d'écrire un système robuste qui identifiera quand un nouvel objet apparaîtra à l'écran et mettra progressivement toutes les images du sprite dans une base de données. Vous devez probablement également construire des modèles pour les effets d'armes. Celles-ci doivent être soustraites afin de ne pas encombrer votre base de données d'opposants.
la source
En supposant qu'à tout moment, vous pouvez 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 y a une certaine notion de cohérence dans le jeu (par exemple, vous pouvez jouer au niveau X encore et encore à nouveau), vous pouvez commencer avec N réseaux de neurones avec des poids aléatoires, et faire jouer chacun d'eux au jeu de la manière suivante:
1) Pour chaque `` mouvement '' 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 de neurones pour déterminer une `` valeur '' (score) associée 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 `` coup '' menant au score de prob * le plus élevé 4) Si le mouvement a conduit à une `` victoire '' ou à une `` perte '', arrêtez, sinon revenez à l'étape 1.
Après un certain temps (ou une «victoire» / «perte»), évaluez à quel point le réseau de neurones était proche du «but» (cela impliquera probablement une certaine connaissance du domaine). Jetez ensuite les 50% (ou un autre pourcentage) de NN qui étaient les plus éloignés de l'objectif, effectuez un croisement / mutation des 50% supérieurs et exécutez à nouveau le nouvel ensemble de NN. Continuez à courir jusqu'à ce qu'un NN satisfaisant sorte.
la source
Je pense que votre meilleur pari serait une architecture complexe impliquant quelques / peut réseaux: c'est-à-dire un pour reconnaître et répondre aux objets, un pour la boutique, un pour le combat (peut-être que vous en auriez besoin ici pour la reconnaissance de l'ennemi, un pour les attaques), etc. .
Essayez ensuite de penser au gameplay le plus simple possible de Diablo II, probablement un barbare. Alors restez simple au début, comme l'acte I, premier domaine seulement.
Ensuite, je suppose que les «objectifs» précieux seraient la disparition des objets ennemis et la diminution de la barre de santé (score inversement).
Une fois que vous avez pris en charge ces tâches distinctes et «plus simples», 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», à moins que vous ne codiez un programme entièrement séparé pour cela. Vous pourriez demander aux réseaux de «regarder» 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, se renforce pour une estimation correcte, etc. Si vous obtenez réellement l'ANN que vous voulez, cela pourrait être fait avec un jeu vidéo, pas besoin de jeu réel en direct. Enfin, vous pouvez laisser le réseau jouer le jeu, avoir des morts d'ennemis, des augmentations de niveau, une santé retrouvée, etc. en tant que renforcement positif et des décès de joueurs, des pertes de santé, etc. en tant que renforcement négatif. Mais en voyant comment même un simple réseau nécessite des milliers d'étapes de formation concrètes pour apprendre même des tâches simples,
Dans l'ensemble, votre projet est très ambitieux. Mais pour ma part, je pense que cela pourrait «en théorie être fait», avec suffisamment de temps.
J'espère que cela aide et bonne chance!
la source