前書き
前回、ML-Agents のインストール方法について書きました。実際に自分で環境を作るところまでは書けなかったのですが、今回は実際に使う時のベストプラクティスについて翻訳の記事を書きたいと思います。
自分自身まだ修行中なので、より俯瞰した「使い方はこれです!」みたいなものは書けないのですが、自分で環境を作る際のベストプラクティスが Unity から公開されていますので、これはとりあえず皆んな知っておいた方がいいだろう、という訳で書いてみます。
Unity で ml-agents を使う時のベストプラクティス
全般
- 一般的に、エージェントが学習できる様に最初はごくシンプルな問題から開始し、徐々に複雑な問題にしていくのがよいでしょう。
- ※おそらくカリキュラム学習の事を言っているのではないかと思うが、それを行うには ppo.py を起動する際に
--load
オプションを利用すれば、前回の学習結果を引き継げる。また、ResetParameter をうまく利用すれば、リセット時に環境の難易度を変更する事ができる。Python 側に手を入れる場合は、UnityEnvironment.reset
時にconfig=
でハッシュを与える事で ResetParameter を与える事ができる。
- ※おそらくカリキュラム学習の事を言っているのではないかと思うが、それを行うには ppo.py を起動する際に
- 可能であれば、Player Brain を使ってエージェントをコントロールしてタスクを達成できる事を確認しておくとよいでしょう。
報酬(Reward)
- より安定した学習をさせるためには、基本的には報酬は 1.0 よりも小さく設定されていた方がよいでしょう。
- 一般的に、目標とする振る舞いを形成するためにはマイナスの報酬(罰)よりも、プラスの報酬の方がより効果的でしょう。
- 歩行する様なタスクの場合、前方への移動に対して微小な報酬(+0.1)を与えるという手法が一般的に使われます。
- もしより早くタスクを完了して欲しい場合、ステップ毎に微小な罰(-0.1)を与えるとよいでしょう。
状態(State)
- 各状態の変数の値はおよそ 1.0 に正規化すべきでしょう。
- エージェントがより適切な状況判断をして行動するために必要な全ての変数を状態に含むようにすべきでしょう。
- オブジェクトのタイプ(剣、盾、弓)といったカテゴリの分類を行う様な変数は one-hot な表現にすべきでしょう(例:3 -> 0, 0, 1)。
アクション(Action)
- 連続的な制御を行う場合、アクションの値は適切な範囲にクリップするとよいでしょう。