ml-agentsでカリキュラム学習を始める際、environment_parametersを使うことが一般的だが、それだと課題を解決していくようなタスクだと実装が面倒。

学習済みのモデルを初期値に設定し、新しく学んでいく方法の備忘録と学習の記録

ちなみにenvironment_parametersを扱う方法ではyamlに「パラメーター」を指定することで、学習の進捗により、UnityのC# Scriptに指定した引数が渡されるようになっている。詳しくはコチラ

方法

新規学習時に、new_idに新しく設定するid, old_idに学習済みのモデルに設定したidを指定する。

mlagents-learn --run-id=new_id --initialize-from=old_id

参考:Githubドキュメント

環境

  • Windows10 64bit home
  • python3-mlagents 0.23.0
  • Unity 2019.4.17f1
  • mlagents release12 1.7.2

実際にやってみる

「かくれんぼゲーム」の例

最終目標、ルール

青を操作して、黄色い物体(ゴール)を発見したらクリア。緑の突起がある方が正面。

青は光を放出し、周囲の状況を把握できる。例えば光があたった物体の種類(壁、ゴール)と距離がわかる。緑の突起から出ている光で3秒間ゴールを見つめられたらクリア。

第一段階

実行コマンドは以下

mlagents-learn --run-id=SeekTarget1

最初はゴールをめちゃめちゃ巨大にし、「ゴールを見つめたらクリア」という条件だけを学習させることを目指す。

青は最初はランダムで動くだけなので、たまたまゴールを見続ける現象が起きた時、青に報酬が与えられ、「良い動きだった」として経験が得られる。

この状態で30万回ほど学習を終えると、ほぼ無駄な動きなくゴールへ直進しクリアできるようになった。

第二段階

次にゴールを通常サイズに戻し、訓練を行う。第一段階の経験が積み上げられた状態であればすぐにゴールを見つけ、クリアすることができた。

実行コマンドは以下。–initialize-from=に第一段階で指定したrun-idを指定している。

mlagents-learn --run-id=SeekTarget2 --initialize-from=SeekTarget1

見にくいので光の表示をOFFにした。わかりやすいよう、ゴールを見ている間は赤くなる。

第三段階

軽い障害物を設置した。障害物の避け方と、「障害物の先のオブジェクトは視ることができない」という当たり前の事象を学習できたらという希望

mlagents-learn --run-id=SeekTarget3 --initialize-from=SeekTarget2

第四段階(本番環境)

mlagents-learn --run-id=SeekTarget4 --initialize-from=SeekTarget3

完成したものがこれ

たまに迷って時間切れになることも有るが、成功率は8割5部でかなり良い結果だと思う。学習回数と学習段階、yamlのパラメーターを調節すればスコアは上がっていくかもしれない。