ml-agentsのRollerBallを学習させる
Unityにはml-agentsという、UnityプロジェクトをMLの学習環境に使えるようにするツールがある。
こいつのドキュメントには「学習環境を作ってみよう!」という一見フレンドリーな項があるのだがこれが曲者で、デフォルト設定(config/trainer_config.yamlのdefault)では上手くいかず、ML全然わからん人間にはやや難儀だったのでメモ。 詳しい人がPR送ってほしい(他力本願)
環境
- Windows 10 Pro
- Unity 2018.2.18f1 (64bit)
- ml-agents (d6dad11c773a8598540a8896d0d48b2489b222ae)
- Python 3.6.2 (←Anaconda)
- tensorflow 1.7.1
最低限の調整
まず意図される
- ターゲットに素早く到達する
- 床から落ちない
挙動を実現するには、
- 50万以上回す(
max_steps: 5.0e5
) - 隠れ層の数(
num_layers
)を5くらいにする
必要がある。
これで報酬(Mean Reward/cumulative_reward)が0あたりになる。学習の様子を見ていると-4あたりではターゲットに到達するものの、床からは落ちてしまうという状態らしい。
Training PPOという項には隠れ層は1~3個が典型的とあるが、問題の複雑さによりけりのはずで謎だ。
他にした方が良さそうなこと
正規化
Best Practicesにも正規化せよとあるが、ドキュメントのコードはobservationをちゃんと正規化できていない(相対位置は-10~+10の範囲になるのに5で割っている、速度も5が上限ではない)。
適切に書き換えるか、confでnormalize: true
とした方が良いだろう。
observation数を減らす
床のサイズが固定されているこの環境では、両端からの距離を測らなくても絶対位置で事足りる。つまり絶対位置が-5になるのと+5になるのを避けてくれればよい。
AddVectorObs((this.transform.position.x + 5)/5); AddVectorObs((this.transform.position.x - 5)/5); AddVectorObs((this.transform.position.z + 5)/5); AddVectorObs((this.transform.position.z - 5)/5);
↓
AddVectorObs(this.transform.position.x/5); AddVectorObs(this.transform.position.z/5);