始めに
本屋でテキトーに本を見てた時にML-Agentsの新しいバージョンの本があり、秒で買ってしまいました。
Unity ML-Agents 実践ゲームプログラミング v1.1対応版 (Unityではじめる機械学習・強化学習)
- 作者:布留川 英一
- 発売日: 2020/08/14
- メディア: 単行本
実は前のバージョンの本も購入していましたが、出版から1年くらい経っていたのでML-Agentsのバージョンがかなり異なり本を読み進めることが困難となっていました。
今回は同じような失敗をしないよう早速、本の始めに出てくるサンプルを試してみました。
また、今回の内容はネット上でも拝見することが出来ます。
実行環境
基本的にすべて元から自分のPCに入っていたのでそれを元に実行してみました。
OS : windows10
Unity : 2018.4.14f
Python : 3.7.9
Anaconda : 4.8.3
ML-Agents : Release 3
Python側での準備
ここの内容は普段使っていない機能が多いのでまとめます。
Anacondaを使ってPythonの仮想環境を作成
Anacondaのコマンドで仮想環境を作成します。conda create -n "仮想環境の名前" python=x.xで仮想環境が作成できます。
$ conda create -n ml-agents python=3.7
また、作成した仮想環境に切り替える際はconda activate "仮想環境の名前"で行います。
$ conda activate ml-agetns
成功した場合はコマンドプロンプト(ターミナル)の先頭に仮想環境の名前が付きます。
これらのコマンドについてはこちらのサイトが参考になりました。
[Python]Anacondaで仮想環境を作る - Qiita
Pythonパッケージのインストール
次にML-Agentsに必要となるパッケージをインストールします。
先ほど作成した仮想環境内で以下のコマンドを使用して"ml-agents-env"と"ml-agents"をインストールします。
pip install -e ./ml-agents-envs pip install -e ./ml-agents
Unityシーンの作成
今回作るシーンは玉を転がして目標地点まで行くものとなります。
こちらは先ほどのリンク通り行うとこのようなシーンが作成されます。
学習の流れ
訓練設定ファイルの作成
訓練設定ファイルの作成します。拡張子は.yamlです。
まだ訓練設定ファイルについての解説を読んでいないのでどんなことが書かれているか把握していません。
以下、サイトからの引用です。 (Unity ML-Agents Release 3 のチュートリアル (2)|npaka|note)
behaviors: RollerBall: trainer_type: ppo hyperparameters: batch_size: 10 buffer_size: 100 learning_rate: 0.0003 beta: 0.005 epsilon: 0.2 lambd: 0.95 num_epoch: 3 learning_rate_schedule: linear network_settings: normalize: true hidden_units: 128 num_layers: 2 vis_encode_type: simple reward_signals: extrinsic: gamma: 0.99 strength: 1.0 keep_checkpoints: 5 checkpoint_interval: 500000 max_steps: 500000 time_horizon: 64 summary_freq: 1000 threaded: true
作成した.yamlファイルはML-Agents Release3のフォルダ内の./config/sample/に保存します。ここでは"RollerBall.yaml"と保存します。
mlagents-learnの実行
ではここから学習を開始していきます。
学習を開始するコマンドはmlagents-learn "ファイルパス" --run-id="ID名"です。
今回は次のようにコマンドを入力します。
mlagents-learn ./config/sample/Rollerball.yaml --run-id=firstRun
成功した場合はテキストの最後の部分にStart training by pressing the Play button in the Unity Editorと出力されるはずです。
mlagents-learnの実行が上手くいかなかった場合
ここで私は上手く実行できなかったのでその時の対処法を記します。
そもそもStart training by pressing the Play button in the Unity Editorが出力されなかった場合はファイルパスが間違っているか、既存のID名があるか、訓練ファイルのパラメータ名が間違っていないか、インデントがずれていないか確認してください。
次に準備は成功するが学習を始めきれない場合についてです。本では以下のサイトのvc_redist.s64.exeをダウンロード、インストールしてくださいと記載されていました。
私の場合はその通りにしても上手く動作しなかったので、もう一つの方法としてコマンドpip install tensorflow==2.0を行いました。こちらの内容は以下のサイトに記載されています。
インストールをした後は上手く学習を進めることが出来ました。
どちらが学習を進める要因だったかはわかりませんが、どちらかをやってみてそれでも上手くいかなかった場合は両方やるといいかもしれません。
Unityで学習を始める
mlagents-learnが成功したら、あとはUnityの再生ボタンを押すと学習が始まります。
学習が進んでいないときはボールがランダムに動き、すぐにステージから落ちてしまいます。
これが少しずつ目的地に向かうようになり、最終的には一直線に向かうようなります。
また、学習の最中のコマンドプロンプトは途中結果を出力します。Mean Rewardが平均報酬、Std of Rewardが標準偏差を表します。
Mean Rewardが1、Std of Rewardが0になったら学習を終了します。
推論の実行
先ほどの学習の結果を使って、推論を行います。
学習の結果ファイルはml-agetnsファイルの./results/firstRun/RollerBall.nnに保存されており、このRollerBall.nnをUnityのAssetsにコピーします。
あとはBehavior ParametersコンポーネントのModelパラメータにRollerBall.nnをつけて実行すれば推論を実行できます。
感想
サンプルを触った感じとても面白かったです。また、無事実行できたことで勉強するモチベーションを作ることが出来ました。
また本を読み始めたばかりなので全くわかりませんが、これから少しずつ読み進めていこうと思います。また、余力があれば何かしらのサンプルを作ってブログにまとめたいです。