お手軽にゲームプレイAIを試してみる

最近はゲームもAIがプレイしてくれる時代だ。

ゲーム攻略で人間を超えた人工知能、その名は「DQN」

有名なDQN。フルネームはdeep Q-networkと呼ばれる強化学習の一種だ。こういう機械学習系の仕組みはマシンパワーでもって学習をぶん回して動かさないといけないので、それなりの準備が必要なのが普通だ。だけど最近はこの手の物をブラウザ上で簡単に試せるようになっている。

REINFORCEjs

例えばREINFORCEjs。これはDQNJavaScriptで実装したもの。使い方もえらく簡単。

// DQNエージェントにゲームの状態を与えると
var action = agent.act(state); 
// アクションとしてどう行動すればよいかが帰ってくるので
// それに従って行動して
// その行動が正しかったどうかを示す報酬をDQNエージェントに教える
agent.learn(reward);

これだけ。状態、アクション、報酬ってのは例えば以下のようなもの。

  • 状態:プレイヤーから見た敵の方向と距離、ボーナスアイテムの方向と距離
  • アクション:上下左右どっちに動くか
  • 報酬:敵にぶつかると-1、ボーナスアイテムを取ると+1

ディープマインドがAtariのゲームを攻略した時みたいに、画面のピクセル全体を入力として操作を学習する、みたいなことをしようとするとそれなりの学習時間とマシンパワーが必要だが、入力する状態を限定すればそれほど頑張らなくても学習できる。

DQNとは異なるアプローチもある。

Neuroevolution

Neuroevolution。ニューラルネットワークにスコアを与え、それを元に遺伝的アルゴリズムを適用しネットワークを進化させていく。これもブラウザ実装がある。

Flappy Learning

Flappy BirdをNeuroevolutionを使って攻略している。NeuroEvolution.js部分に学習アルゴリズムがまとまっている。これも使い方は簡単。

// 複数のニューラルネットワークを取得して
var networks = ne.nextGeneration();
...
// ネットワークにゲームの状態を与えると、
var action = network.compute(state);
// アクションとしてどう行動すればよいかが帰ってくるので
// それに従って行動
...
// 一通り行動したらそれぞれのネットワークにスコアを与える
ne.networkScore(network, totalReward);

NeuroEvolution.jsは一通り行動してからその行動にまとめてスコア付けして進化、REINFORCEjsは行動のたびに報酬を与えて学習、というふうに動作サイクルは若干異なるけど、両方とも強化学習の一種なので外からみれば使い方はほとんど同じだ。

だからこいつらを一つのゲームに混ぜて競わせることもできる。

dqn-cross-road

dqn-cross-road

いわゆるハイウェイをクロスさせてみた。

  • 状態として周辺3車線の直近の車までの距離と車線のタイプ(普通、スタート地点、ゴール)を与える
  • アクションは前に進む、後ろに戻る、何もしないの3つ
  • 報酬は渡りきると+1、車に当たると-5
  • REINFORCEjsはデフォルト設定のまま、NeuroEvolution.jsはネットワークを入力ノード数6(3車線*距離とタイプ)、中間ノードを10ノード2層、出力ノード数2(前、後ろ)とする
  • 最初にREINFORCEjs5つ、NeuroEvolution.js5つのプレイヤーを作る
  • 2秒ごとに報酬が一番低いプレイヤーが排除される。全プレイヤーが排除されると次の世代へ
  • REINFORCEjsは最後まで生き残っていたエージェントのクローンが次の世代で作られる

こういう学習して動作する系のものってバグ無くうまく動いているかどうかが分からないのが困り者なのだが、一応ちょっとは車を避けているっぽい動作をしているので動いているのではないだろうか。あと状態とか報酬とかネットワーク構成とかは適当。本当はチューニングが必要なのだろうが。

ちょっと動かしてみるとREINFORCEjsはフラフラしながらも一応避けて進めているっぽい。NeuroEvolution.jsは立ち止まる、突っ込むみたいな単純な動作になりがち。これは単純にネットワークの複雑さの差なのかしらん。だけどNeuroEvolution.jsでもたまに賢げに振る舞うのが出てきたりするのが面白い。ただ放っておけばどんどん賢くなっているかと言われるとあんまりそんな風には見えないね。

という感じに簡単にゲームプレイAIを試すことができるように最近はなってきている。これどう使おうかね。とりあえずデモプレイを代わりにやってもらおうか。