Environment Design Best Practices
この記事はUnityのml-agents Environment Design Best Practicesの和訳になります.
意訳があります.
この記事は強化学習の環境を作る際に役立つ一般的なテクニックについて書かれています.
また,Brainなどのml-agents独自の用語は強化学習の一般的な用語に解釈して翻訳しています.
文末の()には補足を入れてます.
概略
- エージェントがタスクを学習できるかを確認できるように学習するタスクはもっとも簡単なバージョンにし,そこから時間経過に応じてタスクの複雑性を増加させる.
このやり方は,自分で作ることもできるし, ml-agentsに用意されているカリキュラムラーニングの仕組みを用いても作成することができる. (カリキュラムラーニングについて). - 可能であれば,自分でそのタスクが達成できるかを確かめた方が良い.
- 学習させるときは複数のエージェントで学習を回した方が良い. そうすることで経験(学習時に得られる情報)が増えるので学習がより早くなる.
報酬(Reward)
- 学習の安定化のため与える報酬の大きさは1以下にすべき.
- 目的とする振る舞いを形成するためには負の値の報酬よりも正の値を与えた方が良い.
- 移動を行うタスクにおいては, 典型的に,+0.1の小さい報酬を目的地に前進した場合に与える.
- エージェントがタスクを早く終わらせたい場合,タスクが完了するまで-0.05の報酬をペナルティとして与え続けるのが良い.この報酬設定を行う場合,エピソードの終了とタスクの完了は同時に起こるべき.(1エピソードで複数タスクにはこの報酬設定は合わないって感じだと)
- 大きすぎる負の値の報酬はエージェントがより良い報酬を得るために負の報酬を生じる行動のようなことを行わないようになることもある.エージェントが負の報酬に対して過敏になってしまう.(何も行動しない方がいいと学習してしまう感じ)
状態値のベクトル(State)
ml-agentsではStateのことをObservatin(観察)と呼んでいます.
Vector Observations(ベクトルの状態値と訳した)はプレイヤーの速度や位置情報,敵の情報などの数値情報をStateとして渡すことができます.一方VisualObservationは画像をStateとする場合です.
- ベクトルの状態値はエージェントが最適な行動を行わせるために関係のある全ての変数を含むべきである.
- 時間をまたいで状態を記憶する必要があるか状態を時間ごとに比較する場合,
Stacked Vectors
のパラメータを増加させることで過去から現在の複数ステップ状態を持つことができる. - (Sword, Shield, Bow)のような分類的な状態はone-hot で表現するべきである.
(例えば,3
>0, 0, 1
). - 数値ではない値を除いて, 全ての状態値は0~1(or -1~1)に正規化するべき.
- なるべく位置情報は相対座標に変換して状態に渡すべき.
この位置情報はエージェントの位置と関係があることが多い.(エージェント(プレイヤ)との相対位置を状態として渡すといいみたい)
行動のベクトル(Action)
-
行動の値が連続値の時,行動値は適切な値にクリッピングするべき.
ml-agentsで実装している学習アルゴリズムPPOでは連続値である場合行動の値は自動で-1~1にクリップされている.しかし,他の学習システムを使う場合にはクリッピングを行う必要がある. -
出力する行動値のベクトルのサイズはエージェントが使用する行動だけにし,ベクトルのサイズが大きくなりすぎないようにする.
ベクトルのサイズが大きいと学習の効率が落ちることがある.