mlagents (python package) を利用した学習は2つの方法があります。
- Unity Editor と連動して学習を回す
- シングルプロセスで、エディタ自体の実行効率も低いため、学習が遅い
- 設定が簡単
- 学習過程を眺めることができる
- 学習環境をバイナリにビルドして、バックグラウンドでバイナリを複数立ち上げて学習を回す
- マルチプロセス且つレンダリングも省けるため、学習が速い
- 設定に手間がかかる
-
Unityプロジェクトを開いて、学習用のシーン
Assests/meicu/Scenes/Train.unity
を開きます。 -
training
フォルダの位置でターミナルを開きます。セットアップした python 環境に入ります。 -
ターミナルで以下のコマンドを実行します。
今回は長さ(色マスの数)が4固定の問題のみを対象とする簡単な設定(quest4.yaml)で試してみます。
「Start training by pressing the Play button in the Unity Editor.」が出力されるまでお待ち下さい。
mlagents-learn [学習設定yaml] --run-id=[今回の学習のIDを設定]
mlagents-learn config\quest4.yaml --run-id=quest4
-
Unity Editor のプレイボタンを押して、学習を始めます。
-
問題がなければ、Unity Editor 上、迷キューが高速で試行錯誤を始めて、ターミナル上では学習の進捗が定期的に報告されます。
Windows での説明となります。
-
Unityプロジェクトを開いて、学習用のシーン
Assests/meicu/Scenes/Train.unity
を開きます。 -
Train.unity
を Windows にビルドします。
ビルドしたものはtraining/env/
に置いておきます(exeファイルがtraining/env/
の直下にあるように)。 -
training
フォルダの位置でターミナルを開きます。セットアップした python 環境に入ります。 -
ターミナルで以下のコマンドを実行します。
今回は長さ(色マスの数)が4固定の問題のみを対象とする簡単な設定(quest4.yaml)で試してみます。
mlagents-learn [学習設定yaml] --run-id=[今回の学習のIDを設定] --env=[学習環境所在のフォルダ] --num-envs=[プロセス数] --no-graphics
mlagents-learn config\quest4.yaml --env=env --run-id=quest4 --num-envs=8 --no-graphics
- 問題がなければ、学習が始まって、ターミナル上では学習の進捗が定期的に報告されます。
上記手順で学習したモデル(onnxファイル)は training/results/
の下に run-id
を名前としたフォルダに保存されます。
-
onnx ファイルを Unity プロジェクトの Assets 下の任意の位置にコピー&ペーストします。
-
Unity Editor のヒエラルキーウィンドウでゲームオブジェクト
Script
を選択し、プロジェクトウィンドウから onnx ファイルを見つけて、インスペクタで表示された Behavior Parameters -> Model にドラッグ&ドロップします。 -
インスペクタで、Env Paras コンポネントの
Quest Max Scale
Quest Min Scale
を学習設定と一致するように両方ともに 4 に設定します。 -
プレイボタンを押して、迷キューが問題を解けているかを確認します。
ランタイムにモデルをロードするために、モデルファイルを Resources フォルダに移動します。
参考として現在アプリに使われているモデルは Assets/meicu/Resources/meicu-models/
に置いてあります。
迷キューアプリは、レベルごとに異なるモデルを指定していますので、自作のモデルに入れ替えるには、Assets/meicu/Scripts/Config.cs
を開いて、レベルごとに設定されたモデルのパスを自作のモデルのパスに変更します。
モデルの構造(主にレイヤー数)が変更された場合、行動確率を正しく取得するには、対応のレイヤー名を設定し直す必要があります。
Netron
という onnx モデルの構造を表示するツールをインストールします。Barracuda ドキュメント を参照。- 自作のモデルをダブルクリックして Netron で表示します。
Softmax
層を見つけてクリックし、右側のプロパティで input の名前を確認します。(アプリ内蔵のモデルの場合は40
になります)- Unity Editor のヒエラルキーで、Scripts -> Controller -> AI を選択し、インスペクタの Game Agent -> Additional Output Names の Element 0 に、名前を入れます。
注意:現在の実装では、全てのモデルのSoftmaxのinput名を統一する必要があります。
アルゴリズムのハイパーパラメータ設定は ml-agents ドキュメント を参照してください。
Train.unity
で定義された環境パラメータは3つとなります。
questMaxScale
:ランダムに生成されるお題の長さ(色マス数)の上限questMinScale
:ランダムに生成されるお題の長さ(色マス数)の下限colorReward
:お題を解けた報酬が1固定なのに対し、初期の学習を加速させるために、お題通りに色マスを1つ踏む度に追加の報酬を設定します。既定値が0.1
です。randomStart
(bool):スタート位置がランダムか中央固定かを設定します。アプリで推論時は中央固定になりますが、ランダムで学習したほうが精度が良い場合もあります。既定値がfalse
です。
例として、config/quest4.yaml
では、以下の設定になっています。
environment_parameters:
questMaxScale: 4
questMinScale: 4