作成したML-Agentsの学習環境でモデルを作成する
前回はML-Agentsを使ってボール(Agent)を箱(Traget)の方に動かすモデルをつくるための学習環境をつくってみたので、今回はいよいよ学習を実行してモデルを作成する。参考文献の本で言うと2章の2-4の部分にあたる。
学習にはyamlファイルという、学習アルゴリズムやハイパーパラメータ(人間が設定する必要のあるパラメータ)などを指定したファイルを使う。私は本に書かれているサンプルを見て設定したが、以下の公式ドキュメントのrollerball_config.yamlをそのまま使っても問題ないと思う。本のyamlファイルも公式ドキュメントと主要なパラメータは一緒のようなので。
なお、学習アルゴリズムはyamlファイル内で指定することができるが、今回はPPO(Proximal Policy Optimization)という学習アルゴリズムをつかって学習する。そのうち、別のアルゴリズムでも学習を試してみたいと思う。
実行環境
Windows 10
Unity 2020.3.25f1
Anaconda 4.6.11 (Python 3.7.3)
ML-Agents Release 18
yamlファイルの設定
まず、学習のハイパーパラメータを設定するyamlファイルを作成する。といっても今回私は冒頭でも書いた通り、本に書いてあるRollerBall.yamlの内容をそのまま使わせてもらった。
このyamlファイルの中で学習時の各種パラメータを設定し、学習実行時にpythonから指定して参照することで学習を実行する。
pythonから実行するときにディレクトリを指定すればよいのでyamlファイルはどこに置いても良いと思うが、githubからcloneしたml-agentsのconfigディレクトリ内にsampleというディレクトリを作り、この中にyamlファイルを置いた。
これでyamlの準備は完了。前回作成したUnityの学習環境のプロジェクトを開き、いよいよ学習を開始する。
Pythonで学習を実行
あとは以前Exampleプロジェクトを実行した時と同じだが、一応おさらいとして流れを再度書いておく。私はAnacondaを使っているので、まずはAnaconda Promptを起動してcdコマンドでcloneしたml-agentディレクトリに移動する。
以前書いたように私はAnacondaにml-agentsという名前のPython仮想環境をつくってPyTorchをインストールしたので、base環境から仮想環境に切り替える。
# conda activate ml-agents
そのうえで、yamlが置いてあるディレクトリとRun ID名(なんでもOK)を指定して、以下のコマンドを実行する。
# mlagents-learn ./config/sample/RollerBall.yaml --run-id=1stRun
以下のようにErrorなくUnityの文字が表示されて、Untyの実行待ちの状態になったらPython側の準備は完了。
Unityの学習環境でプロジェクト実行&モデル作成
この状態でUnityを実行すると、Game画面が高速で動き出す。これで学習が実行されている状態。
この時、Anaconda Prompt側で問題なく学習が進んでいれば、以下のようにStep数と学習の進捗状況が表示される。Mean Rewardがエピソードで得られた報酬の平均値となり、Std of Rewardが標準偏差となる。報酬の平均値が高くなるほど、標準偏差は低くなるほど学習が進んだことを表しているので、十分に平均値が高く&標準偏差が低くなれば、途中で止めてもうまく動くはず。Unityのプロジェクト実行を止めてやれば、Pythonの方も止まって自動的にモデルが生成される。
生成されたモデルの保存先はターミナルに表示されているが、ml-agents以下のresultsディレクトリに.onnxという拡張子のファイルとして保存される。あとはこのモデルファイルをUnityプロジェクトの適当なディレクトリに置いて(私はAssets以下にML-Modelsという名前のディレクトリをつくった)、RollerAgentのModelにドラッグ&ドロップしてやればOK。
この状態でゲーム実行してやると、Behavior TypeがDefaultになっていれば、自動的にheuristic modeからinference modeに切り替わり、モデルによる推論が行われて自動的にボールが動く。
以下が実際に動かしてみた動画。学習によりうまくボールが箱に当たることをわかりやすくするために、30000step学習したモデルと10000step学習したモデルを準備して比較してみた。
UnityのML-Agentsで新規にプロジェクト作成&学習環境をつくって機械学習をやってみた。
ボールを箱にぶつける動作を学習したモデルで、ボールを動かしてみたのが以下の動画。
左側の方が長く学習をしてるので、より効率的にボールを箱にぶつけられている #Unity pic.twitter.com/YOHI4ObUXO— Wakky (@wakky_free) January 2, 2022
これでプロジェクト作成から学習完了してモデルをつくるまでのプロセスはわかった。ただUnity Editor上でやると結構時間がかかるので、次回は本に書かれている学習高速化の手法を試してみようと思う。
参考文献
基本的には以下の本を読みつつ勉強していき、最終的には自分で何かしらゲームを作っていく予定。最低限ML-Agentsを使うための流れはブログで書いていこうと思っているが、詳細については説明しないので、深く理解するには本を買って勉強してみることをオススメする。
古くなった情報を補完するため、本と合わせて以下のML-Agents Release 18の公式ドキュメントを参照している。
https://github.com/Unity-Technologies/ml-agents/tree/release_18_docs/
日記まとめ
この日記は以下でまとめてます。