はじめに
この記事では、文化祭に展示していた、AIがプレイしているゲームのAIをどう作ったかを説明していきます
作ったもの
りんごと爆弾が上から落ちてくるシンプルなゲームを作成し、AIに「りんごを取る」「爆弾を避ける」行動を学習させました。
作品作成の流れ
以下の4つの手順でゲームを作成しました:
- Unityで基本的なゲームを作成する
- ML-Agentsをインストールしてセットアップする
- AIが学習できる環境と設定を作る
- 深層強化学習を使ってAIをトレーニングする
各ステップの詳細を順に説明していきます。
1. Unityでゲームをつくる
本当に少しUnity(およびC#)の知識があれば簡単なゲームは作れます。
プログラム面では今回は、りんご・爆弾を管理するプログラム(FallController.cs)、プレイヤーを操作するプログラム(AgentController.cs)を作成しました。
FallController.csでは、落とすオブジェクトの種類(りんごか爆弾か)や、オブジェクトの位置(プレイヤーとの当たり判定で使う)などを管理し、プレイヤーと当たったかどうかを確認して、当たったら上から落とす関数などを作り、
AgentController.csでは、パソコンの矢印キーで動くようにし、りんごに触れたらポイントを増やし、爆弾に触れたら減らす関数などを作っています。
2. ML-AGentsをインストール
ML-Agentsは、UnityでAIをトレーニングしたり、ゲーム内で動作させたりするためのフレームワークです。これを使用することで、深層強化学習を手軽に導入できます。
現在公開されているのは、「ML-Agents-Release-22」というバージョンなのですが、僕は「ML-Agents-Release-20」を使いました(特に理由はありません)
3.0. 深層強化学習とは
深層強化学習では、AIが動いた動きがどれくらい良いか、どれくらい悪いかを評価していくことでAIの行動をどんどん改善させていく手法です。
まず最初に、AIに情報を与える設定をします。
次に、どんな時に報酬を与えるかの設定を考えます。
これで学習すると、この条件で高得点を取るようにAIが行動を改善していってくれます。
3. AIの設定と学習の準備
AIが学習できるように、ゲームのプログラムを少し変更する必要があります。
全部説明すると長いので、簡単に説明します。
2. AIに与える情報を設定
AIはゲーム環境の情報を元に行動を決定します。そのため、CollectObservations
関数というものをつかってAIに与える情報の設定をしました。
与えた情報としては、今回の場合は、落ちてくるものをとった時のポイント、落ちてくるものの速さ、場所を設定しました。
public override void CollectObservations(VectorSensor sensor)
{
sensor.AddObservation(Apple.transform.position.x); // りんごのx座標
sensor.AddObservation(Bomb.transform.position.x); // 爆弾のx座標
sensor.AddObservation(transform.position.x); // プレイヤーのx座標
}
↑プログラムイメージ
3. AIの行動を受け取る
AIが選んだ行動に応じて、プレイヤーを操作します。
AIは-1~1の値で行動を表してくるので、適切に動くようなプログラムをかきます。
今回はAIは右・左にだけ動くので値が大きいほど右に、小さいほど左に動かすようにしました。
public override void OnActionReceived(ActionBuffers actions)
{
float moveX = actions.ContinuousActions[0]; // AIが選択した行動
transform.Translate(moveX * Time.deltaTime * speed, 0, 0); // プレイヤーを移動
}
↑プログラムイメージ
4. 報酬の設定
AIに行動の良し悪しを教えるために、「報酬」の設定をします。
例えば、今回は、りんごを取ったら+1, 爆弾を取ったら-5, りんごを無視したら-0.1, 爆弾を取ったら+0.5という得点をAIに与えるようにしています。
if (hitApple)
{
AddReward(1.0f); // りんごを取ったら +1
}
if (hitBomb)
{
AddReward(-5.0f); // 爆弾を取ったら -5
}
if (missedApple)
{
AddReward(-0.1f); // りんごを無視したら -0.1
}
if (avoidedBomb)
{
AddReward(0.5f); // 爆弾を回避したら +0.5
}
↑プログラムイメージ
5. エピソードを終了する
ゲームが終了したとき、AIのプレイを強制的に終わらせてあげます
AIは、何千万回もプレイを繰り返す中で少しずつ上達していきます。この1プレイ(エピソード)の間に、どんな行動が良かったか、悪かったかを評価し、それを基に次のプレイで行動を改善していきます。
鬼ごっこなどは鬼に捕まったら終わりなのに対し、今回は明確な終わりが存在しません。なので、AIが~回行動を選択したら終わらせる、のような設定にしました。
if (gameOver)
{
EndEpisode(); // ゲーム終了
}
↑プログラムイメージ
4. AIの学習
あとは先ほどのプログラムと、AIの学習方法(どれくらい複雑な学習をするのか、深層強化学習の中の種類、AIを何回に一回保存するか、AIに何回プレイさせるか)などの設定を作り、それをもとにコマンドで学習したら完成です!
おわりに
どうでしたか?ML-Agentsでは簡単にAIを使ったゲームが作れるような色々なものが用意されているため、相当簡単にゲームにAIを実装することができます!