Unityプロジェクト「ML-Agents:Penguin」part6
0.はじめに
本記事では、Unityが無料で提供しているプロジェクト「ML-Agents:Penguin」の制作方法を日本語版にして全6回に分けてやっていきます。
第6回(最終回)は、トレーニングと推論です。
1.Trainer Config YAML
(1)trainer_config.yamlの設定
①メモ帳を開く
②「ファイル → 開く」から、「ユーザー名 → UnityPenguin → ml-agents-0.13.1 → config」内にある、『trainer_config.yaml』を開く
※「テキスト文書(*.txt)」の拡張子しか表示しないので、「すべてのファイル(*.*)」に変える。
③『trainer_config.yaml』の最後の行("Basic"の"gamma: 0.9")の後に、次のコードを追加して、保存する
PenguinLearning:
summary_freq: 5000
time_horizon: 128
batch_size: 128
buffer_size: 2048
hidden_units: 256
beta: 1.0e-2
max_steps: 1.0e6
2.Curricula(カリキュラム)の設定
ここでは、ペンギン(エージェント)が困難になっていくタスクを学習するためのカリキュラムを設定します。
(1)「 UnityPenguin → ml-agents-0.13.1 → config → curricula」内に、『penguin』の名前の新規フォルダーを作成
(2)"penguin"フォルダー内で、「右クリック → 新規作成 → テキスト文書」で新しいテキストファイルを作成し、名前を『PenguinLearning.json』に変更する
※メッセージがでたら”はい”を選択する
(3)"PenguinLearning.json"をメモ帳で開き、次のコードを追加し、保存する
{
"measure": "reward",
"thresholds": [ -0.1, 0.7, 1.7, 1.7, 1.7, 2.7, 2.7 ],
"min_lesson_length": 80,
"signal_smoothing": true,
"parameters": {
"fish_speed": [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.5 ],
"feed_radius": [ 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 0.5, 0.2 ]
}
}
(4)補足説明
これは、ペンギンが特定の報酬の閾値(しきいち)を通過したときに、"fish_speed" と "feed_radius"を更新するようにトレーニングコードに指示します。
・開始時は、"feed_radius=6.0"、"fish_speed=0.0"
・トレーニングペンギンが獲得した平均報酬が-0.1より大きくなると、"Feed_radius=5.0"まで減少
・平均報酬=0.7に達すると、"Feed_radius=4.0"に減少
・「min_lesson_length」パラメーターは、変更前に実行する必要のあるレッスンの最小数を指定するので、エージェントが高得点で運がよかったとしても、すぐに難易度が上がるのを防ぐ
3.Pythonを使用したトレーニング
(1)"Anaconda Prompt"を開く
(2)環境をアクティブ化する
conda activate penguin
(3)「ml-agents-0.13.1」ディレクトリに移動する
cd UnityPenguin/ml-agents-0.13.1
(4)次のコマンドを入力して、学習を始める準備をする
mlagents-learn config/trainer_config.yaml --curriculum config/curricula/penguin --run-id penguin_01 --train
コマンド解説:
・mlagents-learn
トレーニングを実行するPythonプログラム
・config/trainer_config.yaml
構成ファイルへの相対パス
・--curriculum config/curricula/penguin
"curricula"ファイルへの相対パス
・--run-id penguin_01
このラウンドのトレーニングに付けるために選択した任意の名前
・--train
単にテストするのではなく、エージェントをトレーニングするようにプログラムに指示します
(5)Unityを実行する
プロンプトが下図のようになったら、スタートの合図です。Unityに戻って実行ボタンを押すと学習が開始されます。
実行したては、魚をなかなか捕まえられず、壁にぶつかってばかりです。魚を取りきらずにリセットされますが、制限時間がきてしまったとおもってください。
30000ステップになると、確実に魚を追えるようになりました。
40000ステップ以降、魚が動き出しますが、捕まえることができています。
(6)学習を終了する
プロンプトの方で「Ctrl + C」、またはUnityの方で、実行ボタンを押して止めます
終了するとプロンプトが次の図のようになり、赤枠で囲まれた部分が『推論モデル』の保存先+データ名となる。
保存先:models → penguin_01-0
保存名:PenguinLearning.nn (←nn形式が推論モデル)
(7)補足(実行中の解説)
〇実行すると、ペンギンの動きは非常に速く、フレームレートは100倍の速度で実行されているため、フレームレートが不安定になります。
〇トレーニングが進むにつれて、定期的な更新が行われます。
・Step: 経過したタイムステップの数
・Time Elapsed: トレーニングが実行されている時間(実時間)
・Mean Reward: 平均報酬(最後の更新以降)
・Std of Reward: 報酬の標準偏差(最後の更新以降)
〇平均報酬が"curricula"ファイルで指定された閾値を超えると、トレーニングログにアカデミーリセットが表示されます。これにより、リセットパラメータが更新されます。
※私の場合は、表示されなかったので、このシリーズ記事の設定内容では出てこないと思われます。
〇最終的に、トレーニングはカリキュラムの最大難易度に達し、ペンギンがこれ以上早く魚を捕まえることができなくなっても、平均報酬は増えなくなります。この時点で、エディタの再生ボタンを押すことで、早めにトレーニングを中止することができます。
4.『推論モデル』を使って実行
ここでは、推論を実行するようにペンギンに設定します。これにより、【3.Pythonを使用したトレーニング】でトレーニングしたニューラルネットワークを使用してペンギン自身が決定を下して動きます。また、これにより、Pythonによる操作も必要なくなります。
(1)『推論モデル』をUnityにコピー
①プロジェクトウィンドウの「Assets → Penguin」内に、『NNModel』と新規フォルダーを作成する。
②「ml-agents → models → penguin_01-0」の中にある、『PenguinLearning.nn』を『NNModel』の中にドラッグしてコピーする。
(2)プレハブに組み込む
①プロジェクトウィンドウより「Assets → Penguin → Prefabs 」にある『Penguin』をダブルクリックで選択し、"Prefab"の編集を有効にする。
②インスペクターウィンドウより「Behavior Parameters(Script) → Model」に先ほど保存した『PenguinLearning.nn』をドラッグして追加する。
(3)実行
実行すると、学習したことを生かして、ペンギンが魚を取りに行き、赤ちゃんペンギンにあげるようになります。
5.最後に
以上で、泳いでいる魚を効率的に捕まえて、赤ちゃんペンギンに与えることができる、訓練されたペンギン(エージェント)ができました。
次は、パラメーターを変更して学習の変化を見たり、新しく環境構築に挑戦してもらえと思います。
ただ、この環境構築を体験してもらってわかるように、実験には時間がかかります。しかし、強化学習の環境構築ができるようになれば、様々なシミュレーションの実現も可能ですので、根気強く頑張ってもらえたらと思います。
ここまで、記事を読んでいただきありがとうございました。
そしてお疲れさまでした。