hasht's notes

ゲームAIやUnityの話題

ml-agentsのRollerBallを学習させる

Unityにはml-agentsという、UnityプロジェクトをMLの学習環境に使えるようにするツールがある。

github.com

こいつのドキュメントには「学習環境を作ってみよう!」という一見フレンドリーな項があるのだがこれが曲者で、デフォルト設定(config/trainer_config.yamlのdefault)では上手くいかず、ML全然わからん人間にはやや難儀だったのでメモ。 詳しい人がPR送ってほしい(他力本願)

環境

最低限の調整

まず意図される

  • ターゲットに素早く到達する
  • 床から落ちない

挙動を実現するには、

  • 50万以上回す(max_steps: 5.0e5
  • 隠れ層の数(num_layers)を5くらいにする

必要がある。

f:id:hasht:20181206174219p:plain
TensorBoardでの様子

これで報酬(Mean Reward/cumulative_reward)が0あたりになる。学習の様子を見ていると-4あたりではターゲットに到達するものの、床からは落ちてしまうという状態らしい。

f:id:hasht:20181206175807g:plain
まだやや危なっかしい

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);