お米 is ライス

C#やらUnityやらを勉強していて、これはメモっといたほうがええやろ、ということを書くつもりです

ml-agentsのconfig.yamlの「reward_signals」の中身

 ml-agentsで学習の際に使用する「trainer_config.yaml」の中にある「reward_signals」という項目について、以下のページにまとめてあったので自分なりに理解したメモ。
github.com

reward_signals

 読んで字のごとく、学習させる際の報酬をどういったものにするかというものを定義している。
 具体的には以下のように書かれる。

reward_signals:
    extrinsic:
        strength: 1.0
        gamma: 0.99
    curiosity:
        strength: 0.02
        gamma: 0.99
        encoding_size: 256
    gail:
        strength: 0.01
        gamma: 0.99
        encoding_size: 128
        demo_path: Project/Assets/ML-Agents/Examples/Pyramids/Demos/ExpertPyramid.demo

extrinsic

extrinsic:
    strength: 1.0
    gamma: 0.99

 extrinsicとは「外因的な」という意味。

 以下勝手な用語でかみ砕く。一般に使われている用語ではないので注意。
 強化学習ではゲーム世界そのものである「環境」と環境に対する「行動」があり、強化学習によって得たいのは環境の状態から最適な行動を決定するための「行動決定ロジック」である。
 そしてどのような行動が最適なのかということを判断するために、現在の環境の状態や、行動によって環境に対してどのような変化があったのかに対してゲームの目的に応じて得点をつける。この得点を「環境報酬」とする。
 「外因的な」というのはこの「環境」を指しており、つまりextrinsicの項目では「環境報酬」をどのように「行動決定ロジック」の学習に反映させるかということである。

 くどくどと説明してしまったが、要は一番スタンダードな報酬をどのように重み付けするかということである。

strength

 「環境報酬」はml-agentsではAgent.AddRewardによって決定されていく。
 学習においてAddRewardした値にかけるスケールがこのstrengthの値である。
 デフォルト値は1、つまりAddRewardした値をそのまま学習に用いているということである。

gamma

 基本的に強化学習ではある行動をしたときに未来においてもらえる報酬の総量を最大化していくのだが、はるか未来にもらう報酬を一瞬後にもらう報酬と同列に見なすのは具合が悪そうである。
 したがって、未来の報酬に対しては現在から遠ければ遠いほど重みを減らすのがよさそうだ。
 その重みの減らし方をこのgammaで表している。
 例えば、1秒後の報酬にはgamma=0.99をかけ、2秒後の報酬にはgamma^2≒0.98、100秒後の報酬にはgamme^100≒0.36の重みをかけて学習をさせるという考え方である。
 デフォルト値は0.99であり、0.8 ~ 0.995の範囲の値とするのが典型的とのことである。

curiosity

curiosity:
    strength: 0.02
    gamma: 0.99
    encoding_size: 256

 extrinsicな学習ばかりではいったんある程度の報酬をもらってしまうとそれに味を占めて学習中に同じようなことばかりするようになってしまいがちである。
 それを防ぐために「curiosity」すなわち「好奇心」に対して報酬を与えるためのパラメータがこの項目で定義される。
 この報酬を有効にすると、以下2つのロジックも併せて学習されるようになるらしい。

  1. ある時点での「環境」とその次の時点での「環境」の状態から、その間にとられたであろう「行動」を推測するロジック
  2. ある「環境」の時に、ある「行動」をとった際、その次の時点でどのような「環境」になっているかを推測する「環境予測ロジック」

 1つ目がどのように使われているかはわからなかった。
 「環境予測ロジック」によって実際に行動をとらずとも次の環境を予測できることができるのだが、実際に行動をとったときにその予測を裏切るような結果であればそれは"新しい発見"なのである。
 その新しい発見をしたということに対して報酬を与えるために、次の環境の予測と実際の状態との差異の大きさを「好奇心報酬」として与える。
 こうすることによってより多岐にわたるトライアンドエラーができるようだ。

strength

 extrinsicのものと同様に報酬にかけるスケールの値である、
 新しい発見ばかりを重視して実際のゴールを目指さなければやはり意味がないため、extrinsicのstrength値よりも小さくするというのが典型的なようだ。
 ただ、小さくしすぎて「好奇心報酬」が「環境報酬」に埋もれてしまってはそれはそれで意味が無いので大きすぎず小さすぎずという値を指定するのが肝要なようである。
 0.001 ~ 0.1の範囲の値にするのが典型的とのことである。

gamma

 extrinsicのものと同様なので省略。

encoding_size

 「好奇心報酬」を導くためには「環境予測ロジック」を学習させる必要がある。
 複雑な「環境」の状態値をどれくらい単純化して学習させるのかというのがこのencoding_sizeということらしい。
 デフォルト値は64だが、具体的にこの値によってどれくらい環境の状態値が小さくなるのかはわからなかった。
 多分そのまま64通りの環境に分けるか、2^64通りに分けるかとかだとは思う。

gail

gail:
    strength: 0.01
    gamma: 0.99
    encoding_size: 128
    demo_path: Project/Assets/ML-Agents/Examples/Pyramids/Demos/ExpertPyramid.demo

 人が実際にゲームをプレイした時の様子を学習によって再現するというのがGAILである。
 「行動決定ロジック」が人のプレイと似ているかを判定する「モノマネ判定ロジック」を追加で学習させ、人のプレイと似ている場合はその行動に対して「モノマネ報酬」を与えるのがGAILということらしい。
 demo_pathには「モノマネ判定ロジック」を学習させるための、実際の人のプレイ中の環境と行動のパラメータを保存しておいたファイルのパスを指定する。
 これはこれで濃いので別途調べてほしいが、GAILをすることによってかなり学習速度が速くなるようだ。


 力尽きたのでここまで。