web-dev-qa-db-ja.com

視覚入力を使用してDiablo 2をプレイするために人工ニューラルネットワークをトレーニングする方法

私は現在、ANNにビデオゲームをプレイしてもらいたいと思っており、ここで素晴らしいコミュニティからの助けを得たいと思っていました。

ディアブロ2に決着しました。したがって、ゲームプレイはリアルタイムで、等尺性の観点から、プレーヤーがカメラの中心となる1つのアバターを制御します。

物事を具体的にするために、タスクは、ヘルスを0に落とさずにキャラクターxの経験値を獲得することです。この場合、経験値はモンスターを殺すことで獲得できます。ゲームプレイの例を次に示します。

here

今、私はネットが画面上のピクセルから取得した情報のみに基づいて動作するようにしたいので、効率的にプレイするには非常に豊富な表現を学習する必要があります。これはおそらく(少なくとも暗黙的に)ゲームの世界をオブジェクトに分割し、それらと対話する方法。

そして、これらの情報はすべてネットに教えなければなりません...どういうわけか。私の人生では、このことをどのように訓練するかを考えることはできません。私の唯一のアイデアは、ゲーム内で生得的に良い/悪いもの(健康、金、経験など)を画面から視覚的に抽出し、その統計を強化学習手順で使用するプログラムです。答えのpartになると思いますが、それで十分だとは思いません。生の視覚入力から目標指向の動作までの抽象化のレベルが多すぎて、このような限られたフィードバックでは、私の生涯内にネットを訓練できません。

だから、私の質問:このタスクの少なくとも一部を行うためにネットを訓練する他の方法を考えることができますか?できれば数千のラベルの付いた例を作成せずに...

もう少し方向性について:この設定で有用な情報を抽出するための強化学習のソースや監視されていない方法を探しています。または、ラベル付きデータを手動でラベル付けせずにゲームワールドから取得する方法を考えることができる場合は、監視付きアルゴリズム。

UPDATE(04/27/12):

奇妙なことに、私はまだこれに取り組んでおり、進歩を遂げているようです。 ANNコントローラを機能させるための最大の秘密は、タスクに適した最も高度なANNアーキテクチャを使用することです。したがって、私は 深い信念ネットを使用してきました 因数分解された 条件付き制限付きボルツマンマシンで構成されています 微調整の前に監視なしで(ゲームをプレイしているビデオで)トレーニングした 時間差バックプロパゲーション (つまり、標準フィードフォワードANNによる強化学習)。

しかし、特にリアルタイムでのアクション選択の問題と、ANN処理用のカラー画像のエンコード方法に関しては、より価値のある入力を探しています:-)

UPDATE(10/21/15):

私はこの質問を過去に聞いたことを思い出し、これはもはやクレイジーなアイデアではないことに言及すべきだと思いました。私の最後の更新以来、DeepMindはその性質を公開しました 視覚的入力からアタリゲームをプレイするニューラルネットワークの取得に関する論文 。実際、Diablo 2の限られたサブセットであるアーキテクチャを使用してプレイできないのは、基盤となるゲームエンジンへのアクセスがないことだけです。画面にレンダリングしてネットワークにリダイレクトするのは、妥当な時間でトレーニングするには遅すぎます。したがって、おそらくこの種のボットはすぐにDiablo 2をプレイすることはありませんが、それは、オープンソースまたはレンダリングターゲットへのAPIアクセスでプレイするからです。 (おそらく地震?)

130
zergylord

ANNのトレーニング方法について心配していることがわかりますが、このプロジェクトは、あなたが気付いていないかもしれない複雑さを隠しています。 画像処理によるコンピューターゲームでのオブジェクト/文字認識は、非常に難しいタスクです(FPSおよびRPGゲームではcrazyとは言いません)。私はあなたのスキルに疑いはありませんし、それができないとも言っていませんが、ANN自体を実装するよりも、物事の認識に10倍以上の時間を簡単に費やすことができます(すでにデジタル画像処理テクニック)。

あなたのアイデアは非常に興味深いおよび非常に野心的であると思います。この時点で、あなたはそれを再考したいかもしれません。このプロジェクトはあなたが大学で計画しているものだと思うので、もし仕事の焦点が本当にANNなら、おそらくもっとシンプルな別のゲームを選ぶべきでしょう。

他の誰かが 異なるが何らかの形で似たプロジェクト のヒントを探しに来たのを覚えています。それをチェックする価値があります。

一方、提案を受け入れている場合、ゲーム内のオブジェクトを識別するためのより良い/簡単なアプローチがあるかもしれません。しかし、最初に、このプロジェクトをあなたが望んでいるもののために呼び出しましょう: smart-bot

ボットを実装するための1つの方法ゲームクライアントのメモリにアクセスする画面上のキャラクターの位置などの関連情報を見つけるそれは健康です。コンピュータのメモリの読み取りは簡単ですが、メモリ内のどこを探すかを正確に把握することはできません。 Cheat Engine のようなメモリスキャナーは、これに非常に役立ちます。

別のメソッドは、ゲームの下で機能し、レンダリング情報の操作を伴います。ゲームのすべてのオブジェクトを画面にレンダリングする必要があります。これは、すべての3Dオブジェクトの場所が最終的に処理のためにビデオカードに送信されることを意味します。いくつかの深刻なデバッグの準備をしてください。

この回答では、画像処理で目的を達成するための2つの方法を簡単に説明しました。それらに興味があるなら、 Exploiting Online Games (chapter 6)でそれらについての詳細を見つけることができます。

51
karlphillip

PDATE 2018-07-26:それだけです!私たちは今、この種のゲームが解決できるポイントに近づいています! OpenAIを使用し、ゲームDotA 2に基づいて、チームは 5v5ゲームでセミプロのゲーマーを倒す が可能なAIを作成できます。 DotA 2を知っている場合、このゲームはメカニズムの点でDiabloのようなゲームに非常に似ていることがわかりますが、チームプレイのためにさらに複雑であると主張することができます。

予想通り、これはディープラーニングによる強化学習の最新の進歩と、きちんとしたAPIを取得できるのでAIの開発を容易にするOpenAIなどのオープンゲームフレームワークの使用と、ゲームを高速化できるため(AI毎日の180年間のゲームプレイに相当します!)。

2018年8月5日(10日間!) では、このAIをトップDotA 2ゲーマーと対戦する予定です。これがうまくいけば、Goゲームの解決ほど媒介されていない大きな革命を期待できますが、それでもゲームAIにとって大きなマイルストーンになるでしょう!

PDATE 2017-01: AlphaGoの成功以来、この分野は非常に急速に動いており、ほぼ毎月ゲームの機械学習アルゴリズムの開発を促進する新しいフレームワークがあります。ここに私が見つけた最新のもののリストがあります:

  • OpenAIのユニバース機械学習を使用して事実上すべてのゲームをプレイするのプラットフォーム。 APIはPythonであり、VNCリモートデスクトップ環境の背後でゲームを実行するため、あらゆるゲームの画像をキャプチャできます。おそらくユニバースを使用して、機械学習アルゴリズムを介してDiablo IIをプレイできます!
  • OpenAIのジム :ユニバースに似ていますが、強化学習アルゴリズムを具体的にターゲットにしています(したがって、AlphaGoで使用されているフレームワークをより多くのゲームに一般化したようなものです)。 demyのコース OpenAI Gymを使用したブレイクアウトやDoomなどのゲームへの機械学習の適用をカバーしています。
  • TorchCraftTorch (機械学習フレームワーク)とStarCraft:Brood Warの間の橋渡し。
  • pyGTA5 :画面キャプチャのみを使用してGTA5で自動運転車を構築するプロジェクト(多くの videos online )。

非常にエキサイティングな時代!

重要な更新(2016-06): OPで述べたように、視覚入力のみを使用してゲームをプレイする人工ネットワークを訓練するこの問題は、いくつかの深刻な機関によって現在取り組んでおり、 DeepMind Deep-Qlearning-Network(DQN)

そして今、あなたが次のレベルの挑戦に挑戦したい場合は、さまざまなAIビジョンゲーム開発プラットフォームのいずれかを使用できます。たとえば、高度に最適化されたプラットフォーム ViZDoom (7000 fps)ネットワークをトレーニングして、視覚入力のみを使用してDoomをプレイする:

ViZDoomでは、視覚情報(画面バッファー)のみを使用してDoomをプレイするAIボットを開発できます。主に機械視覚学習、特に深層強化学習の研究を目的としています。 ViZDoomはZDoomに基づいており、ゲームの仕組みを提供します。

そして、結果は非常に素晴らしいです Webページのビデオを参照 および 素敵なチュートリアル (Pythonで)ここに!

Quagents と呼ばれるQuake 3 Arena用の同様のプロジェクトもあります。これは、基礎となるゲームデータへの簡単なAPIアクセスも提供しますが、それを廃棄して、スクリーンショットとAPIをエージェントの制御にのみ使用できます。

スクリーンショットのみを使用する場合、なぜこのようなプラットフォームが役立つのでしょうか?基礎となるゲームデータにアクセスしない場合でも、このようなプラットフォームは以下を提供します。

  • 高性能ゲームの実装(学習アルゴリズムをより速く収束できるように、より少ない時間でより多くのデータ/プレイ/学習世代を生成できます!).
  • シンプルでレスポンシブAPIは、エージェントを制御します(つまり、人間の入力を使用してゲームを制御しようとすると、コマンドの一部が失われる可能性があるため、出力の信頼性に対処することもできます...)。
  • カスタムシナリオの簡単なセットアップ。
  • カスタマイズ可能なレンダリング(処理を容易にするために取得した画像を「単純化」するのに役立ちます)
  • synchronized( "turn-by-turn")play(したがって、最初にリアルタイムでアルゴリズムを動作させる必要はありません。これにより、複雑さが大幅に削減されます)。
  • クロスプラットフォーム互換性、レトロ互換性(新しいゲームの更新があったときにボットがゲームで動作しなくなるリスクはありません)などの追加の便利な機能.

要約すると、これらのプラットフォームの素晴らしいところは、以前の技術的な問題の多くを軽減するに対処する必要があることです(ゲーム入力の操作方法、シナリオの設定方法など)。 学習アルゴリズムを処理する必要があります自体。

だから今、仕事に取り掛かり、私たちを史上最高のAIビジュアルボットにします;)


古い投稿視覚的な入力のみに依存するAIの開発の技術的な問題を説明します。

上記の同僚の何人かとは反対に、この問題は扱いにくいとは思いません。しかし、それは確かに非常に難しいものです!

上記で指摘した最初の問題は、ゲームの状態の表現の問題です。1つの画像だけでは完全な状態を表すことはできません。何らかの種類を維持する必要がありますmemorization(健康だけでなく、装備されたオブジェクトや使用可能なアイテム、クエスト、ゴールなど)。このような情報を取得するには、2つの方法があります。1つは、最も信頼性が高く簡単なゲームデータに直接アクセスする方法です。または、いくつかの簡単な手順(インベントリを開く、スクリーンショットを撮る、データを抽出する)を実装して、これらの情報の抽象的な表現を作成できます。もちろん、スクリーンショットからデータを抽出するには、監視された手順(完全に定義する)または監視されていない(機械学習アルゴリズムを使用します)が必要になりますが、その後、非常に複雑になります...)。教師なし機械学習の場合、構造学習アルゴリズムと呼ばれる非常に最近の種類のアルゴリズムを使用する必要があります(データの分類や値の予測方法ではなく、データの構造を学習します)。そのようなアルゴリズムの1つは、リチャードソーチャーによる再帰ニューラルネットワーク(リカレントニューラルネットワークと混同しないでください)です。 http://techtalks.tv/talks/54422/

次に、別の問題は、必要なすべてのデータを取得したとしても、ゲームは部分的に観測可能のみであるということです。したがって、世界の抽象モデルを注入し、ゲームから処理された情報、たとえばアバターの場所だけでなく、画面外のクエストアイテム、目標、敵の場所をフィードする必要があります。これについては、Vermaak 2003のMixture Particle Filtersをご覧ください。

また、goalsが動的に生成される自律エージェントが必要です。試すことができるよく知られているアーキテクチャはBDIエージェントですが、実際のケースでこのアーキテクチャが機能するには、おそらくそれを微調整する必要があります。代替として、再帰的ペトリネットもあります。これは、非常によく研究された柔軟なフレームワークであり、優れた形式化と証明の手順を備えているため、おそらくペトリネットのあらゆる種類のバリエーションと組み合わせて、必要なものを達成できます。

そして最後に、上記のすべてを行ったとしても、ゲームをエミュレートする方法を見つける必要があります加速速度(ビデオを使用するといいかもしれませんが、問題はアルゴリズムがコントロールせずに観戦し、それ自体を試すことができることは学習にとって非常に重要です。実際、現在の最先端のアルゴリズムは、人間が学習できるのと同じことを学習するのにはるかに時間がかかることはよく知られています(強化学習の場合はなおさらです)。したがって、プロセスを高速化できない場合(つまり、ゲーム時間を短縮できない場合)、1回のライフタイムでアルゴリズムが収束することさえありません...

結論として、ここで達成したいことは、現在の最先端アルゴリズムの限界(そしておそらくそれを少し超えている)にあります。可能かもしれませんが、たとえそうであっても、あなたはかなりの時間を費やします。これは理論的な問題ではなく、実用的な問題あなたですここに近づいているので、それを解決するために、実装する必要がありますさまざまなAIアプローチを組み合わせる.

チーム全体が取り組んでいる数十年の研究では十分ではない可能性がありますので、あなたが一人でパートタイムで作業している場合は(おそらく生計を立てているため)、近くにどこにも到達せずに一生を過ごす可能性があります実用的なソリューション。

したがって、ここでの私の最も重要なアドバイスは、あなたが期待を下げ、複雑さを軽減しようとするできる限りの情報をすべて使用して、スクリーンショットに頼ることをできるだけ避けることです。 、ゲームに直接フックして、DLLインジェクション)を探し、監視された手順を実装することでいくつかの問題を簡素化し、アルゴリズムにすべてを学習させないでください(つまり、今のところ画像処理を落とす可能な場合は内部ゲーム情報に依存し、後でアルゴリズムがうまく機能する場合は、AIプログラムの一部を画像処理に置き換えることができます。そのため、たとえば何かがうまく機能するようになれば、目標を達成することができます。あなたの問題を複雑にし、監視された手順とメモリゲームデータをスクリーンショットの監視されていない機械学習アルゴリズムに置き換えることができます)。

幸運を祈ります。それが機能する場合は、必ず記事を公開してください。このような難しい実用的な問題を解決することで有名になります。

41
gaborous

あなたが追求している問題は、あなたがそれを定義した方法で扱いにくいです。通常、ニューラルネットワークが問題の豊富な表現を「魔法のように」学習すると考えるのは間違いです。 ANNがタスクに適したツールであるかどうかを判断する際に心に留めておくべき事実は、それが補間法であることです。問題を関数の近似値として見つけることができるかどうかを考えてください。関数の多くのポイントがあり、ネットワークの設計とトレーニングに多くの時間を費やしています。

提案する問題は、このテストに合格しません。ゲームコントロールは、画面上の画像の機能ではありません。プレイヤーが記憶しなければならない多くの情報があります。簡単な例として、ゲームのショップに入るたびに画面が同じに見えることがよくあります。ただし、購入するものは状況によって異なります。ネットワークがどんなに複雑であっても、画面のピクセルが入力である場合、ストアに入ると常に同じアクションを実行します。

また、規模の問題もあります。あなたが提案するタスクは、複雑すぎて合理的な時間で学ぶことができません。ゲームAIの仕組みについては、 aigamedev.com が表示されるはずです。人工ニューラルネットワークは一部のゲームで正常に使用されていますが、非常に限られた方法で使用されています。ゲームAIは難しく、多くの場合開発に費用がかかります。機能的ニューラルネットワークを構築する一般的なアプローチがあった場合、業界はおそらくそれをつかんだでしょう。 tic-tac-toeのような、はるかに単純な例から始めることをお勧めします。

26
Don Reba

このプロジェクトの核心はANNで可能なことを探求しているようですので、画像処理を扱う必要のないゲームを選ぶことをお勧めします(ここで他の回答からは、reallyリアルタイムゲームでの難しいタスク)。 Starcraft APIを使用してボットを構築できます。これらのボットは、関連するすべてのゲーム状態にアクセスできるようにします。

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

17
tstramer

すべての可能な「動き」のセットから「結果」のセット(確率を含む可能性があります)をいつでも生成でき、ゲームに一貫性の概念があると仮定します(たとえば、レベルXを何度もプレイできます)再び)、ランダムな重みを持つN個のニューラルネットワークから始めて、それぞれに次のようにゲームをプレイさせることができます。

1)考えられるすべての「移動」について、考えられる「結果」のリストを生成します(関連する確率を使用)2)各結果について、ニューラルネットワークを使用して、「結果」の関連する「価値」(スコア)を決定します(例: -1から1までの数字、1が最良の結果、-1が最悪の結果)3)最高の確率*スコアにつながる「移動」を選択4)移動が「勝ち」または「負け」につながった場合、停止するか、手順1に戻ります。

一定時間(または「勝ち」/「負け」)後、ニューラルネットワークが「目標」にどれだけ近づいているかを評価します(これにはおそらくドメインの知識が含まれます)。次に、目標から最も遠いNNの50%(またはその他の割合)を捨て、上位50%のクロスオーバー/突然変異を行い、新しいNNのセットを再度実行します。満足のいくNNが出るまで実行を続けます。

1
tstramer

あなたの最善の策は、いくつかの/ 5月のネットワークを含む複雑なアーキテクチャになると思います:すなわち、アイテムを認識して応答するもの、ショップ用、戦闘用(ここでは、敵の認識用、攻撃用の1つ) 。

次に、おそらく最も簡単なディアブロIIゲームプレイ、おそらく野b人について考えてみてください。次に、最初の領域のみである第1幕のように、最初は単純にします。

それから、貴重な「目標」は敵のオブジェクトの消失とヘルスバーの縮小(逆スコア)になると思います。

これらの個別の「簡単な」タスクを処理したら、「マスター」ANNを使用して、アクティブにするサブANNを決定できます。

トレーニングについては、3つのオプションしかありません。上記の進化的方法を使用できますが、そのために別のプログラム全体をコーディングしない限り、「勝者」を手動で選択する必要があります。誰かがプレイするネットワークを「見る」ことができます。ここでは、プレーヤーまたはプレーヤーのスタイルのグループをエミュレートする方法を学びます。ネットワークはプレーヤーの次のアクションを予測しようとし、正しい推測のために強化されます。実際にANNを取得する場合、ビデオゲームプレイでこれを行うことができ、実際のライブゲームプレイは不要です。最後に、ネットワークにゲームをプレイさせ、敵の死、レベルアップ、回復した体力などを正の強化として、プレイヤーの死、体力の喪失などを負の強化として与えることができます。しかし、単純なネットワークでさえ、単純なタスクでさえ学習するために何千もの具体的なトレーニングステップが必要になるのを見ると、これには多くの忍耐が必要になります。

すべてのプロジェクトはすべて非常に野心的です。しかし、十分な時間を与えられれば、「理論的には」それは可能だと思う。

それが助けて、幸運を祈っています!

最初のステップとして、連続するフレームの違いを調べることができます。背景と実際のモンスタースプライトを区別する必要があります。世界にはアニメーションも含まれていると思います。それらを見つけるために、キャラクターを動かして、世界とともに動くすべてのものを大きな背景画像/アニメーションに集めます。

(FFTを使用して)相関関係のある敵を検出および識別することができます。ただし、アニメーションがピクセル単位で正確に繰り返される場合は、いくつかのピクセル値を見るだけで速くなります。主なタスクは、新しいオブジェクトが画面に表示されるタイミングを識別し、徐々にスプライトフレームのすべてのフレームをデータベースに追加する堅牢なシステムを作成することです。おそらく、武器効果のモデルも構築する必要があります。相手のデータベースが乱雑にならないように、これらを差し引く必要があります。

1
whoplisp