こんにちは、えんせきです。
金曜日に久々に徹夜でカラオケしてしまいました。若い!ぼくわかい!
金曜日は予定があったので普通に乗り切ったけど、後遺症のせいで土曜日から日曜日にかけて14時間くらい寝ました。スッキリ。
つまりなにしたの?
Environment Design Best Practicesを読んだので適用する時に都度英語を読まないで良いように日本語メモにした。
読んだやつ
github.com
正直、以降の訳文は情報が落ちてるので読めるなら本家のほうが良い。
一般的な話
ステップバイステップ
問題を順に難しくしていくと、短時間でより複雑な課題に対して高い報酬を得られるようになる。カリキュラムラーニングというらしい。
できるタスクをやらせる
Player Brainでエージェントを制御してタスクを完了できるほうがいいみたい。
報酬の話
強化学習のチューニングで、すごく大切な報酬の話。報酬設計を失敗すると全然学習できない。
べた褒めしすぎない
安定した学習のためには、与える報酬は1.0より大きくしない。毎アクションで1.0を超える報酬を与えていたら報酬が爆発して環境のランダム要素に引っ張られすぎたりするのかもしれない。
褒めて伸ばす
エージェントがやるべき行動に正の報酬を与えたほうが、やるべきでない行動に負の報酬を与えるよりも良いらしい。過度に大きな負の報酬は負の報酬を回避することが出来ても、正の報酬を与えている行動に影響を与える可能性がある。
移動運動の適度な報酬
一般に前方速度に対する小さな正の報酬は0.1が使用されるらしい。
完了速度の向上
タスクを完了するまでの速度を上げたい場合、1ステップ毎に-0.05くらいの負の報酬を与えると良いらしい。この場合、タスクが完了したら即時エピソードを終了しないといけない。
状態の話
状態量はエージェントが適切なアクションを決定するために必要な説明変数をすべて含んでいる必要がある。
カテゴリ型の状態変数
カテゴリ(止まる、走る、しゃがむ、ジャンプみたいな)を扱うような状態変数の場合は1ホット型にエンコードしたほうが良い。3とか1ではなく0,0,0,1とか0,1,0,0みたいにする。
値を正規化する
数値を扱う時(角度とか幅のある移動とか)は「0から+1」とか「-1から+1」に正規化する。
位置情報を相対的に扱う
エージェント関連のゲームオブジェクトの位置情報は、可能な限り相対座標でコード化したほうが良い。エージェントの位置を変えたり、コピーを同じシーンに複数配置する時とかは相対座標にしておかないと不思議な値が出てきて困る。
アクションの話
値域を決める
連続値によるコントロールを行う時は、値の範囲を必ずクリップして値域におさめてあげないと意味不明な入力になる。
Action-space-size
学習の効率を妨げる可能性があるため、action-space-sizeには使われたアクションの数を設定する。