はじめに
DeepMind が発表した MuZero という AlphaZero をより一般化した手法があります。ルールが明確な対人ゲームだけでなく、 Atariゲームのような一人用ゲームにも同じように適用できるというのが非常に強力で、性能もかなり高いようです。
(個人的に育休とか取っていたのもあって)1年くらいその存在すらしらず(...)、最近になってまたニュースになっていてやっと知ることができて、最近色々遊んでみているのでその共有をします。
すでに muzero-general という PyTorchベースの非常に素晴らしい実装のリポジトリが公開されているので、主にその紹介です。
muzero-general
良いところ
- 色々なゲームが最初から付いていて、自分で追加するのも非常に簡単にできる(1ファイル追加するだけ)
- Hyperparameterの調整も簡単
- GPUが使えるなら使ってくれる
- TensorBoardで Rewardの獲得状況やLossの推移、学習&SelfPlayの消化速度 がリアルタイムで見られる
- 使い始めるのが簡単
- ソースコードも読みやすい
導入&試しかた
Getting started を見ると良いですが、こんな感じで始められます。
git clone https://github.com/werner-duvaud/muzero-general.git
cd muzero-general
pip install -r requirements.txt
python muzero.py
# -> Menu が表示される
# -> Gameの種類選択
# -> 何をするか: Training, LoadModel, TestPlay(MuZero vs Human), ViewPlay(MuZero Vs MuZero), etc
最初は tictactoe
という日本語で言うなら「マルバツゲーム」 くらいを眺めるのが良いんじゃないかと思います。
Gameの追加方法
games/
ディレクトリにファイルを追加するだけです。
Game
というクラスに reset
, step
, to_play
, legal_actions
のようなメソッドを実装していきます。同ディレクトリに参考になるGame実装がいくつもあるので、何をすべきかは理解しやすいかと思います。
2人対戦ゲーム用のPatch
たぶん2人対戦ゲームの実装にはバグがあって、うまくいかない場合はこのPullRequestを適用してみてください。
最初 tictactoe を半日かけても弱いままだったのが、このPRを適用すると2~3時間で納得のいく強さになりました。
ちょっと作ったゲーム
スマホのゲームアプリによくあるゲームを追加したので、興味があればどうぞ。
2048
- ファイル: make2048.py
X2 Blocks
- ファイル: x2blocks.py
さいごに
とても楽しいおもちゃを手に入れた気分です。
connect4 とか 1〜2日くらい学習させるとかなり強くなります。適当にやっていると嫌なTrapでやられます...