強化学習でゾンビに挑む

はじめに

マインクラフト上での強化学習に関する記事を読んでいて、自分でも試してみたくなったので実験してみました。

 

やったこと

概要

イクラ環境で強化学習を行った例は検索するといくつか出てきますが、敵Mobと戦うことをテーマにしている例は調べた限り見当たらなかったので、今回は強化学習で敵Mobを倒すことを目標にしてみました。ターゲットは代表的な敵であるゾンビです。

 

タスク設定としては以下のようなイメージになります。

 

環境準備

 

実装

作成したコードは以下に置いています。(ワールドデータは除く)

GitHub - ramu-igo/Minecraft-RL

ポイントとしては、

  • 行動空間の制限
    エージェントの行動の選択肢は以下の7通りとしました。
    - 移動 (前、後、左、右)
    - 攻撃
    - 視点移動 (左、右)
    行動空間はDiscrete(7)です。*1

  • 報酬設計
    なるべくダメージを受けずにゾンビを倒せるようになってほしかったので、以下のような報酬の与え方にしてみました。*2
    正の報酬
     - ゾンビにダメージを与えたとき (+3)
     - ゾンビを倒したとき (+10)
    負の報酬
     - ダメージを受けたとき (-0.5)
     - やられたとき (-3)

  • 学習部分
    強化学習ライブラリとしてはStable Baselines3を、アルゴリズムはPPOを使いました。

  • 観察者の追加
    評価時にエージェントの挙動を観察しやすくするため、観察者(別クライアント)を追加しました。これは、mission xmlにObserverセクションを追加することで実現しています。

 

学習と評価

train.pyを実行し、エピソード毎の平均報酬の上昇が落ち着くまで学習を行いました。(1~2時間程度)

評価としては、学習後のモデルを読み込んでエージェントを動かした状態で、別クライアントの観察者で以下のコマンドによりゾンビを召喚してエージェントと戦わせました。*3

summon zombie -2358 4 -237 {ArmorItems:[{},{},{},{id:"iron_helmet",Count:1}]}

 

結果

比較のため、まずは学習前の様子を以下に載せます。小さい方のウィンドウがエージェント視点、大きい方のウィンドウが観察者視点です。

www.youtube.com

学習前なのでエージェントはランダムに行動しています。たまに偶然攻撃がゾンビに当たることはありますが、倒すまではいかずにすぐやられます。

 

続いて学習後の様子が以下です。

www.youtube.com

余裕でゾンビに勝てるようになりました。

ゾンビが視界に入ると、なるべく視界にとらえつづけるようにうまく視点移動をしているようです。

ゾンビの攻撃を避けるように若干後ずさりしつつ反撃するような挙動も見られました。

(自分でプレイするより上手いかもしれない)

 

おわり

以上、強化学習でゾンビと戦う実験をしてみました。報酬の与え方を変えることで、また違った戦い方をするエージェントを育てることもできそうです。

ゾンビは自らエージェントに接近してくるため、強化学習が割と上手くいきやすかったものと思います。遠距離攻撃してくる敵(スケルトン等)が相手になると、もっと難しい問題になる気がします。

 

*1:malmoのContinuousコマンドのOn/OffをActionMgrで管理することで、シンプルなDiscrete(n)の行動空間として扱えるようにしました。

*2:報酬を与える判断に必要な情報(エージェントのライフやゾンビの残数など)はこの辺りを参考にして取得しました。

*3:ゾンビが日光で燃えないように、ヘルメットを被せた状態で召喚しています。