前回のQiita記事に引き続き、今回もMinecraftで深層強化学習する記事を書きます。
目的
なぜ、改めて書き直すかというと、前回使用したMalmöに比べて、より取り扱いのしやすいMinecraft環境「MineRL」が開発されたからです。MineRLとChainerRLを使って簡単に深層強化学習を試してみましょう。
MineRLについて
MineRLは、Malmöを利用したMinecraftの強化学習環境で、Malmöに比べて同期・安定・高速化などが実現しています。特に、Malmöでは同期性能が低く毎stepごとに行動をできない場合がありましたが、MineRLではそこが改善しています。タスクとしては以下などが用意されています。
- MineRLTreechop
- 64個の「原木 (log)」を集める
- 森で、 鉄の斧を持った状態からスタート
- log を入手するごとに +1 reward
- MineRLNavigate
- 指定されたゴール地点へ向かう
- “compass” を観測可能;ゴール方向を指示してくれる
- ゴール到達で +100 reward
- “Dense” 版では更にゴールにとの距離に応じて毎ステップ報酬を貰える (遠ざかると負の報酬)
- MineRLObtainDiamond
- ダイヤモンドを入手する
- 多くの中間アイテムが必要となる
- ダイヤモンド入手で +1024 reward
- 中間アイテム入手でも (小さめの) 報酬
- デフォルトではアイテムの1回目の入手時のみ報酬が貰える “Dense” 版では何度でも貰える
ベースライン実装
Requirements
- git、makeをインストールしていること。
- Dockerをインストールしていること。
動かし方
ハンズオンのためのコードをフォークしたレポジトリbaselinesで管理しています。
まずはcloneして、chainerrlのディレクトリに移動してください。
$ git clone https://github.com/keisuke-umezawa/baselines.git
$ cd baselines/general/chainerrl
次にDockerfileをビルドしましょう。Makefileに必要なコマンドが定義されているので、make build
とコマンドを打てば良いです。
$ make build
次に、実行してbashでログインしましょう。それもMakefileにコマンドが定義されているので、以下で大丈夫です。
$ make run
$ make bash
すると、環境設定されたDockerコンテナ内にbashでログインすることができます。
以下のコマンドで動かしたいスクリプトを動かすことができます。今回は試しに、dddqn.sh
を動かしてみましょう
# cd baselines
# APP="lxterminal -e 'bash -c /opt/baselines/dddqn.sh'" /usr/bin/graphical-app-launcher.py
実はこのコンテナ内には、VNCサーバーが動いており、ブラウザからlocalhost:6080
にアクセスすると、コンテナ内のGUI環境にアクセスすることができます。
上記のコマンドを実行して10分程度待つと、以下のようにMinecraftの画面も出てくるはずです。
学習済みモデルを使った場合の動かし方
リンク先にそれぞれのタスクとモデルに対して、複数のモデルを用意しています。
例えば、Treechopをdddqnで解きたい場合は、リンク先https://github.com/keisuke-umezawa/baselines/releases/download/v0.0/dddqn1.zip
のモデルを使用するといいでしょう。
$ wget https://github.com/keisuke-umezawa/baselines/releases/download/v0.0/dddqn1.zip
$ unzip dddqn1.zip
そうすると、8000000_finish
のようなディレクトリができているはずです。
dddqn.shを以下に書き換え、上記と同じように動かしてみましょう。
python3 dqn_family.py \
--gpu -1 --env MineRLTreechop-v0 --outdir results/MineRLTreechop-v0/dddqn \
--final-exploration-frames 1000000 --final-epsilon 0.02 --arch dueling --replay-capacity 800000 --replay-start-size 1000 \
--target-update-interval 1000 --update-interval 1 --agent DoubleDQN --monitor --lr 0.001 --gamma 0.99 --batch-accumulator mean \
--always-keys attack --reverse-keys forward --exclude-keys back left right sneak sprint --load ./8000000_finish