Ich versuche gerade, eine ANN dazu zu bringen, ein Videospiel zu spielen, und ich hatte gehofft, Hilfe von der wunderbaren Community hier zu bekommen.
Ich habe mich für Diablo 2 entschieden. Das Spiel ist also in Echtzeit und aus isometrischer Sicht, wobei der Spieler einen einzelnen Avatar steuert, auf den die Kamera zentriert ist.
Um die Dinge konkret zu machen, besteht die Aufgabe darin, deinen Charakter x Erfahrungspunkte zu erhalten, ohne dass seine Gesundheit auf 0 sinkt, wobei Erfahrungspunkte durch das Töten von Monstern gewonnen werden. Hier ist ein Beispiel für das Gameplay:
Da ich nun möchte, dass das Netz nur auf der Grundlage der Informationen arbeitet, die es von den Pixeln auf dem Bildschirm erhält, muss es eine sehr reichhaltige Darstellung lernen, um effizient spielen zu können, da dies vermutlich erfordern würde, dass es (zumindest implizit) weiß, wie Teilen Sie die Spielwelt in Objekte auf und wie Sie mit ihnen interagieren können.
Und all diese Informationen müssen irgendwie ins Netz gebracht werden. Ich kann mir für mein ganzes Leben nicht vorstellen, wie ich dieses Ding trainieren soll. Meine einzige Idee ist, ein separates Programm zu haben, das etwas von Natur aus Gutes / Schlechtes im Spiel (z. B. Gesundheit, Gold, Erfahrung) visuell vom Bildschirm extrahiert und diesen Wert dann in einem Verstärkungslernverfahren verwendet. Ich denke, das wird Teil der Antwort sein, aber ich denke nicht, dass es ausreichen wird. Es gibt einfach zu viele Abstraktionsebenen von rohen visuellen Eingaben bis hin zu zielorientiertem Verhalten, als dass ein derart begrenztes Feedback ein Netz in meinem Leben trainieren könnte.
Meine Frage: Welche anderen Möglichkeiten können Sie sich vorstellen, um ein Netz zu trainieren, um zumindest einen Teil dieser Aufgabe zu erledigen? vorzugsweise ohne Tausende von markierten Beispielen zu machen.
Nur für ein bisschen mehr Richtung: Ich suche nach anderen Quellen für verstärkendes Lernen und / oder nach unbeaufsichtigten Methoden, um nützliche Informationen in dieser Umgebung zu extrahieren. Oder ein überwachter Algorithmus, wenn Sie sich eine Möglichkeit vorstellen können, beschriftete Daten aus einer Spielwelt herauszuholen, ohne sie manuell beschriften zu müssen.
UPDATE (27.04.12):
Seltsamerweise arbeite ich immer noch daran und scheine Fortschritte zu machen. Das größte Geheimnis, um einen ANN-Controller zum Laufen zu bringen, ist die Verwendung der fortschrittlichsten ANN-Architekturen, die für die Aufgabe geeignet sind. Daher habe ich ein tiefes Glaubensnetz verwendet, das aus faktorisierten, bedingten, eingeschränkten Boltzmann-Maschinen besteht , die ich unbeaufsichtigt trainiert habe (auf einem Video, in dem ich das Spiel spiele), bevor ich eine Feinabstimmung mit zeitlicher Differenz-Rückausbreitung (dh Verstärkungslernen mit Standard) vorgenommen habe Feed-Forward-ANNs).
Ich suche aber immer noch nach wertvolleren Informationen, insbesondere zum Problem der Aktionsauswahl in Echtzeit und zum Codieren von Farbbildern für die ANN-Verarbeitung :-)
UPDATE (21.10.15):
Ich erinnere mich nur daran, dass ich diese Frage früher gestellt habe und dachte, ich sollte erwähnen, dass dies keine verrückte Idee mehr ist. Seit meinem letzten Update hat DeepMind sein Naturpapier veröffentlicht, in dem es darum geht, neuronale Netze dazu zu bringen, Atari-Spiele über visuelle Eingaben zu spielen . In der Tat ist das einzige, was mich daran hindert, ihre Architektur zum Spielen zu verwenden, eine begrenzte Teilmenge von Diablo 2, der fehlende Zugriff auf die zugrunde liegende Spiel-Engine. Das Rendern auf dem Bildschirm und das anschließende Umleiten an das Netzwerk ist viel zu langsam, um in angemessener Zeit zu trainieren. Daher werden wir wahrscheinlich nicht sehen, dass diese Art von Bot bald Diablo 2 spielt, sondern nur, weil es entweder Open Source oder mit API-Zugriff auf das Rendering-Ziel spielt. (Beben vielleicht?)
quelle
Antworten:
Ich kann sehen, dass Sie sich Sorgen darüber machen, wie Sie die ANN trainieren sollen, aber dieses Projekt verbirgt eine Komplexität , die Sie möglicherweise nicht kennen. Die Erkennung von Objekten / Charakteren bei Computerspielen durch Bildverarbeitung ist eine äußerst herausfordernde Aufgabe (nicht verrückt nach FPS- und RPG-Spielen). Ich zweifle nicht an Ihren Fähigkeiten und ich sage auch nicht, dass dies nicht möglich ist, aber Sie können problemlos 10x mehr Zeit damit verbringen, Dinge zu erkennen, als das ANN selbst zu implementieren (vorausgesetzt, Sie haben bereits Erfahrung mit der digitalen BildverarbeitungBildverarbeitungstechniken ).
Ich finde Ihre Idee sehr interessant und auch sehr ehrgeizig . An dieser Stelle möchten Sie es vielleicht noch einmal überdenken. Ich spüre, dass Sie dieses Projekt für die Universität planen. Wenn der Schwerpunkt der Arbeit also wirklich auf ANN liegt, sollten Sie sich wahrscheinlich ein anderes Spiel aussuchen, etwas Einfacheres.
Ich erinnere mich, dass jemand anderes vor nicht allzu langer Zeit nach Tipps für ein anderes, aber irgendwie ähnliches Projekt gesucht hat. Es lohnt sich, es sich anzusehen.
Andererseits gibt es möglicherweise bessere / einfachere Ansätze zum Identifizieren von Objekten im Spiel, wenn Sie Vorschläge annehmen. Aber zuerst nennen wir dieses Projekt das, was Sie wollen: einen Smart-Bot .
Eine Methode zum Implementieren von Bots greift auf den Speicher des Spielclients zu, um relevante Informationen zu finden, z. B. die Position des Charakters auf dem Bildschirm und seine Gesundheit. Das Lesen des Computerspeichers ist trivial, aber nicht genau herauszufinden, wo im Speicher gesucht werden muss. Speicherscanner wie Cheat Engine können dabei sehr hilfreich sein.
Eine andere Methode , die unter dem Spiel funktioniert, besteht darin, die Renderinformationen zu manipulieren. Alle Objekte des Spiels müssen auf dem Bildschirm gerendert werden. Dies bedeutet, dass die Positionen aller 3D-Objekte schließlich zur Verarbeitung an die Grafikkarte gesendet werden. Seien Sie bereit für ernsthaftes Debuggen.
In dieser Antwort habe ich kurz zwei Methoden beschrieben, um durch Bildverarbeitung das zu erreichen, was Sie wollen. Wenn Sie an ihnen interessiert sind, finden Sie weitere Informationen zu Exploiting Online Games (Kapitel 6), einem hervorragenden Buch zu diesem Thema.
quelle
UPDATE 26.07.2018: Das war's! Wir nähern uns jetzt dem Punkt, an dem diese Art von Spiel lösbar sein wird! Mit OpenAI und basierend auf dem Spiel DotA 2 könnte ein Team eine KI erstellen , die semiprofessionelle Spieler in einem 5-gegen-5-Spiel schlagen kann . Wenn Sie DotA 2 kennen, wissen Sie, dass dieses Spiel in Bezug auf die Mechanik Diablo-ähnlichen Spielen ziemlich ähnlich ist, aber man könnte argumentieren, dass es aufgrund des Teamspiels noch komplizierter ist.
Wie erwartet wurde dies dank der neuesten Fortschritte beim verstärkten Lernen mit Deep Learning und der Verwendung von Open-Game-Frameworks wie OpenAI erreicht, die die Entwicklung einer KI erleichtern, da Sie eine ordentliche API erhalten und das Spiel beschleunigen können (die KI spielte) das entspricht 180 Jahren Gameplay gegen sich selbst jeden Tag!).
Am 5. August 2018 (in 10 Tagen!) Ist geplant, diese KI gegen Top-DotA-2-Spieler auszuspielen. Wenn dies klappt, erwarten Sie eine große Revolution, die vielleicht nicht so mediatisiert ist wie die Lösung des Go-Spiels, aber dennoch ein großer Meilenstein für die KI der Spiele sein wird!
UPDATE 2017-01: Das Feld bewegt sich seit dem Erfolg von AlphaGo sehr schnell und es gibt neue Frameworks, die die Entwicklung von Algorithmen für maschinelles Lernen für Spiele fast jeden Monat erleichtern. Hier ist eine Liste der neuesten, die ich gefunden habe:
Sehr aufregende Zeiten!
WICHTIGES UPDATE (2016-06): Wie von OP festgestellt, wird dieses Problem des Trainings künstlicher Netzwerke zum Spielen von Spielen nur mit visuellen Eingaben jetzt von mehreren seriösen Institutionen angegangen, mit vielversprechenden Ergebnissen wie DeepMind Deep-Qlearning-Network (DQN) ) .
Und jetzt, wenn Sie sich der nächsten Herausforderung stellen möchten, können Sie eine der verschiedenen AI Vision-Spieleentwicklungsplattformen wie ViZDoom verwenden , eine hochoptimierte Plattform (7000 fps), um Netzwerke für das Spielen von Doom zu trainieren, wobei nur visuelle Eingaben verwendet werden ::
Und die Ergebnisse sind ziemlich erstaunlich. Sehen Sie sich die Videos auf ihrer Webseite und das nette Tutorial (in Python) hier an!
Es gibt auch ein ähnliches Projekt für Quake 3 Arena namens Quagents , das auch einen einfachen API-Zugriff auf zugrunde liegende Spieldaten bietet. Sie können es jedoch verschrotten und nur Screenshots und die API verwenden, um Ihren Agenten zu steuern.
Warum ist eine solche Plattform nützlich, wenn wir nur Screenshots verwenden? Selbst wenn Sie nicht auf zugrunde liegende Spieldaten zugreifen, bietet eine solche Plattform:
Zusammenfassend ist das Tolle an diesen Plattformen, dass sie viele der vorherigen technischen Probleme, mit denen Sie sich befassen mussten (wie man Spieleingaben manipuliert, Szenarien einrichtet usw.), lindern , so dass Sie sich nur mit dem Lernalgorithmus befassen müssen selbst.
Also mach dich jetzt an die Arbeit und mache uns zum besten visuellen KI-Bot aller Zeiten;)
Alter Beitrag , der die technischen Probleme bei der Entwicklung einer KI beschreibt, die sich nur auf visuelle Eingaben stützt:
Im Gegensatz zu einigen meiner oben genannten Kollegen halte ich dieses Problem nicht für unlösbar. Aber es ist sicherlich eine harte Sache!
Das erste Problem, auf das oben hingewiesen wurde, ist das der Darstellung des Status des Spiels : Sie können nicht den vollständigen Status mit nur einem einzigen Bild darstellen, sondern müssen eine Art von Bild beibehalten Auswendiglernen(Gesundheit, aber auch ausgerüstete Objekte und verfügbare Gegenstände, Quests und Ziele usw.). Um solche Informationen abzurufen, haben Sie zwei Möglichkeiten: entweder durch direkten Zugriff auf die Spieldaten, die am zuverlässigsten und einfachsten sind; Oder Sie können eine abstrakte Darstellung dieser Informationen erstellen, indem Sie einige einfache Verfahren implementieren (Inventar öffnen, Screenshot machen, Daten extrahieren). Natürlich müssen Sie beim Extrahieren von Daten aus einem Screenshot entweder eine überwachte Prozedur (die Sie vollständig definieren) oder eine unbeaufsichtigte Prozedur (über einen Algorithmus für maschinelles Lernen, aber dann wird die Komplexität erheblich vergrößert ...). Für unbeaufsichtigtes maschinelles Lernen müssen Sie eine neuere Art von Algorithmen verwenden, die als strukturelle Lernalgorithmen bezeichnet werden (die die Struktur von Daten lernen, anstatt sie zu klassifizieren oder einen Wert vorherzusagen).http://techtalks.tv/talks/54422/
Ein weiteres Problem ist, dass das Spiel nur teilweise beobachtbar ist, selbst wenn Sie alle benötigten Daten abgerufen haben . Daher müssen Sie ein abstraktes Modell der Welt einfügen und es mit verarbeiteten Informationen aus dem Spiel füttern, z. B. dem Standort Ihres Avatars, aber auch dem Standort von Questgegenständen, Zielen und Feinden außerhalb des Bildschirms. Vielleicht schauen Sie sich dazu Mixture Particle Filters von Vermaak 2003 an.
Außerdem benötigen Sie einen autonomen Agenten , dessen Ziele dynamisch generiert werden. Eine bekannte Architektur, die Sie ausprobieren können, ist der BDI-Agent. Sie müssen sie jedoch wahrscheinlich anpassen, damit diese Architektur in Ihrem praktischen Fall funktioniert. Alternativ gibt es auch das rekursive Petri-Netz, das Sie wahrscheinlich mit allen Arten von Variationen der Petri-Netze kombinieren können, um das zu erreichen, was Sie möchten, da es sich um ein sehr gut untersuchtes und flexibles Framework mit hervorragenden Formalisierungs- und Beweisverfahren handelt.
Und schließlich müssen Sie, selbst wenn Sie alle oben genannten Schritte ausführen, einen Weg finden, um das Spiel in beschleunigter Geschwindigkeit zu emulieren (die Verwendung eines Videos mag nett sein, aber das Problem ist, dass Ihr Algorithmus nur ohne Kontrolle zuschaut und in der Lage ist es selbst zu versuchen ist sehr wichtig für das Lernen). Es ist in der Tat bekannt, dass der derzeitige Algorithmus nach dem Stand der Technik viel mehr Zeit benötigt, um das zu lernen, was ein Mensch lernen kann (umso mehr beim Lernen mit Verstärkung), wenn er den Prozess nicht beschleunigen kann ( Wenn Sie also die Spielzeit nicht beschleunigen können, konvergiert Ihr Algorithmus nicht einmal in einem einzigen Leben ...
Zusammenfassend lässt sich sagen, dass das, was Sie hier erreichen möchten, an der Grenze (und möglicherweise etwas darüber hinaus) der aktuellen Algorithmen auf dem neuesten Stand der Technik liegt . Ich denke, es mag möglich sein, aber selbst wenn es so ist, werden Sie viel Zeit damit verbringen , denn dies ist kein theoretisches Problem, sondern ein praktisches Problem, das Sie hier angehen, und daher müssen Sie viel implementieren und kombinieren von verschiedenen KI-Ansätzen , um es zu lösen.
Mehrere Jahrzehnte Forschung mit einem ganzen Team, das daran arbeitet, würden möglicherweise nicht ausreichen. Wenn Sie also alleine sind und in Teilzeit daran arbeiten (da Sie wahrscheinlich einen Job haben, um Ihren Lebensunterhalt zu verdienen), verbringen Sie möglicherweise ein ganzes Leben, ohne in die Nähe zu gelangen eine funktionierende Lösung.
Mein wichtigster Rat hier wäre also, dass Sie Ihre Erwartungen senken und versuchen, die Komplexität zu reduzieren Ihr Problem lösen, indem Sie alle Informationen verwenden, die Sie können, und vermeiden, sich so weit wie möglich auf Screenshots zu verlassen (dh versuchen Sie, sich direkt in das Spiel einzubinden, nach DLL-Injection zu suchen) und einige zu vereinfachen Lassen Sie Ihren Algorithmus nicht alles lernen, indem Sie überwachte Prozeduren implementieren (dh lassen Sie die Bildverarbeitung vorerst so weit wie möglich fallen und verlassen Sie sich auf interne Spielinformationen. Wenn Ihr Algorithmus später gut funktioniert, können Sie einige Teile Ihres KI-Programms durch ersetzen Bildverarbeitung, um so Ihr volles Ziel zu erreichen. Wenn Sie beispielsweise etwas zum Laufen bringen können, können Sie versuchen, Ihr Problem zu komplexieren und überwachte Prozeduren und Speicherspieldaten durch unbeaufsichtigte Algorithmen für maschinelles Lernen in Screenshots zu ersetzen.
Viel Glück, und wenn es funktioniert, stellen Sie sicher, dass Sie einen Artikel veröffentlichen. Sie können sicher dafür bekannt werden, ein so schwieriges praktisches Problem zu lösen!
quelle
Das Problem, das Sie verfolgen, ist so unlösbar, wie Sie es definiert haben. Es ist normalerweise ein Fehler zu glauben, dass ein neuronales Netzwerk "magisch" eine reichhaltige Darstellung eines Problems lernen würde. Eine gute Tatsache, die Sie bei der Entscheidung, ob ANN das richtige Werkzeug für eine Aufgabe ist, berücksichtigen sollten, ist, dass es sich um eine Interpolationsmethode handelt. Überlegen Sie, ob Sie Ihr Problem so gestalten können, dass Sie eine Annäherung an eine Funktion finden, bei der Sie viele Punkte aus dieser Funktion und viel Zeit für das Entwerfen und Trainieren des Netzwerks haben.
Das von Ihnen vorgeschlagene Problem besteht diesen Test nicht. Die Spielsteuerung ist keine Funktion des Bildes auf dem Bildschirm. Es gibt viele Informationen, die der Spieler im Speicher behalten muss. Für ein einfaches Beispiel ist es oft richtig, dass der Bildschirm jedes Mal, wenn Sie einen Shop in einem Spiel betreten, gleich aussieht. Was Sie kaufen, hängt jedoch von den Umständen ab. Egal wie kompliziert das Netzwerk ist, wenn die Bildschirmpixel seine Eingabe sind, würde es beim Betreten des Geschäfts immer dieselbe Aktion ausführen.
Außerdem gibt es das Problem der Skalierung. Die von Ihnen vorgeschlagene Aufgabe ist einfach zu kompliziert, um sie in angemessener Zeit zu erlernen. Sie sollten aigamedev.com sehen, wie Spiel-KI funktioniert. Künstliche Neuronale Netze wurden in einigen Spielen erfolgreich eingesetzt, jedoch nur in sehr begrenztem Umfang. Die Entwicklung von Spiel-KI ist schwierig und oft teuer. Wenn es einen allgemeinen Ansatz zum Aufbau funktionaler neuronaler Netze gegeben hätte, hätte die Industrie ihn höchstwahrscheinlich genutzt. Ich empfehle Ihnen, mit viel, viel einfacheren Beispielen wie Tic-Tac-Toe zu beginnen.
quelle
Es scheint, als ob das Herz dieses Projekts darin besteht, zu untersuchen, was mit einem ANN möglich ist. Daher würde ich vorschlagen, ein Spiel auszuwählen, bei dem Sie sich nicht mit Bildverarbeitung befassen müssen (was nach den Antworten anderer hier eine wirklich schwierige Aufgabe zu sein scheint Echtzeitspiel). Sie können die Starcraft-API verwenden, um Ihren Bot zu erstellen. Sie bieten Ihnen Zugriff auf alle relevanten Spielstatus.
http://code.google.com/p/bwapi/
quelle
Als ersten Schritt können Sie den Unterschied zwischen aufeinanderfolgenden Frames betrachten. Sie müssen zwischen Hintergrund- und tatsächlichen Monster-Sprites unterscheiden. Ich denke, die Welt kann auch Animationen enthalten. Um diese zu finden, würde ich den Charakter bewegen und alles, was sich mit der Welt bewegt, in einem großen Hintergrundbild / einer Animation sammeln.
Sie können Feinde mit Korrelation erkennen und identifizieren (mithilfe von FFT). Wenn sich die Animationen jedoch pixelgenau wiederholen, ist es schneller, nur einige Pixelwerte zu betrachten. Ihre Hauptaufgabe besteht darin, ein robustes System zu schreiben, das erkennt, wann ein neues Objekt auf dem Bildschirm angezeigt wird, und nach und nach alle Frames des Sprite-Frames in eine Datenbank überträgt. Wahrscheinlich müssen Sie auch Modelle für Waffeneffekte bauen. Diese können abgezogen werden, damit Ihre gegnerische Datenbank nicht überladen wird.
quelle
Angenommen, Sie könnten jederzeit eine Reihe von "Ergebnissen" (möglicherweise Wahrscheinlichkeiten) aus einer Reihe aller möglichen "Züge" generieren und es gibt eine gewisse Vorstellung von Konsistenz im Spiel (z. B. können Sie Level X immer und immer wieder spielen wieder), Sie könnten mit N neuronalen Netzen mit zufälligen Gewichten beginnen und jedes von ihnen das Spiel auf folgende Weise spielen lassen:
1) Erstellen Sie für jeden möglichen 'Zug' eine Liste möglicher 'Ergebnisse' (mit zugehörigen Wahrscheinlichkeiten). 2) Verwenden Sie für jedes Ergebnis Ihr neuronales Netzwerk, um einen zugehörigen 'Wert' (Punktzahl) des 'Ergebnisses' zu bestimmen (z. B. a Zahl zwischen -1 und 1, wobei 1 das bestmögliche Ergebnis ist, -1 das schlechteste ist) 3) Wählen Sie den 'Zug', der zur höchsten Wahrscheinlichkeit führt * Punktzahl 4) Wenn der Zug zu einem 'Gewinn' oder 'Verlust' führte, Anhalten, andernfalls fahren Sie mit Schritt 1 fort.
Bewerten Sie nach einer bestimmten Zeit (oder einem "Gewinn" / "Verlust"), wie nahe das neuronale Netzwerk am "Ziel" war (dies erfordert wahrscheinlich einige Domänenkenntnisse). Werfen Sie dann die 50% (oder einen anderen Prozentsatz) der NNs weg, die am weitesten vom Ziel entfernt waren, führen Sie eine Überkreuzung / Mutation der oberen 50% durch und führen Sie den neuen Satz von NNs erneut aus. Laufen Sie weiter, bis ein zufriedenstellendes NN herauskommt.
quelle
Ich denke, Ihre beste Wahl wäre eine komplexe Architektur, an der einige / viele Netzwerke beteiligt sind: dh eine, die Gegenstände erkennt und darauf reagiert, eine für den Laden, eine für den Kampf (vielleicht benötigen Sie hier eine für die Erkennung von Feinden, eine für Angriffe) usw. .
Versuchen Sie dann, an das einfachste Diablo II-Gameplay zu denken, wahrscheinlich an einen Barbaren. Halten Sie es dann zunächst einfach, wie in Akt I, nur im ersten Bereich.
Dann denke ich, dass wertvolle "Ziele" das Verschwinden feindlicher Objekte und die Verringerung der Gesundheitsanzeige (umgekehrt erzielt) wären.
Sobald Sie diese separaten, "einfacheren" Aufgaben erledigt haben, können Sie mithilfe eines "Master" -AnN entscheiden, welcher Sub-ANN aktiviert werden soll.
Was das Training betrifft, sehe ich nur drei Optionen: Sie könnten die oben beschriebene Evolutionsmethode verwenden, aber dann müssen Sie die "Gewinner" manuell auswählen, es sei denn, Sie codieren dafür ein ganzes separates Programm. Sie könnten die Netzwerke jemanden spielen lassen. Hier lernen sie, den Stil eines Spielers oder einer Gruppe von Spielern zu emulieren. Das Netzwerk versucht, die nächste Aktion des Spielers vorherzusagen, wird für eine korrekte Vermutung verstärkt usw. Wenn Sie tatsächlich die gewünschte ANN erhalten, kann dies mit Videospielen geschehen, ohne dass ein tatsächliches Live-Gameplay erforderlich ist. Schließlich können Sie das Netzwerk das Spiel spielen lassen, indem Sie feindliche Todesfälle, Level-Ups, wiedererlangte Gesundheit usw. als positive Verstärkung und Todesfälle von Spielern, verlorene Gesundheit usw. als negative Verstärkung haben. Aber selbst wenn ein einfaches Netzwerk Tausende konkreter Schulungsschritte erfordert, um selbst einfache Aufgaben zu erlernen,
Alles in allem ist Ihr Projekt sehr ehrgeizig. Aber ich denke, es könnte "theoretisch getan werden", wenn genügend Zeit zur Verfügung steht.
Hoffe es hilft und viel Glück!
quelle