直感的な方策勾配法の理解(「方策勾配」と「方策反復&価値反復」の関係)

強化学習では, 方策勾配による学習方法が主流であるが, 方策勾配とは何か??

自分のイメージを文章化してみました.

 

長くなりますが, 言いたいこととしては, 

「方策勾配法とは, ある状態と行動のもっともらしさ(確率)を, 価値関数でガイドしながら修正していくこと.」 

です.

 

~~~~~~~~~~~~~~~~~~~~~~~~  以下数式ゾーン ~~~~~~~~~~~~~~~~~~~~~~~~

方策勾配法の話なので, まずは方策勾配を定義します. 強化学習を以下のように定式化した時,

 

 J_T(\theta) = \sum_{a_t \in A} \sum_{s_t \in S} R(a_t, s_t, s_{t+1})p(s_0)\prod^T_{t=0}(\pi_{\theta}(a_t | s_t)P(s_{t+1} | a_t, s_t))

  

 a_t, s_t  :  時刻  t における, 行動&状態. 

 \pi_{\theta}(a_t | s_t)  :  方策.  a_t, s_tの発生確率. 別名 a_t, s_tのもっともらしさ.

 R(a_t, s_t, s_{t+1})  :  行動  a_t , 状態 s_t , 次時刻の状態  s_{t+1} によって定まる報酬. 

 J_T(\theta)  :   \theta によって決まる, 時刻Tまでに獲得できる報酬の期待値.

 p(s_0)\prod^T_t(\pi_{\theta}(a_t | s_t)P(s_{t+1} | a_t, s_t))  :  初期状態  s_0 から時刻  T までにとった行動と状態の発生確率(同時確率:  P(s_0, a_0, ... s_T, a_T)).

  

この時, 方策勾配  \frac{\partial J}{\partial \theta} は以下のような形をとります.

 

  \frac{\partial J}{\partial \theta} = \sum_{a_t \in A} \sum_{s_t \in S} \log \pi_\theta (a_t, s_t) Q(s_t, a_t)

 

 Q(s_t, a_t) a_t, s_t における状態行動価値(時刻t以降の, 獲得報酬の期待値)です.

~~~~~~~~~~~~~~~~~~~~~~~~ 数式ゾーン終了 ~~~~~~~~~~~~~~~~~~~~~~~~

 

以上の定義の元, 方策勾配の計算式を得ました.

 

  \frac{\partial J}{\partial \theta} = \sum_{a_t \in A} \sum_{s_t \in S} \log \pi_\theta (a_t, s_t) Q(s_t, a_t) 

 

早い話が, この方策勾配の方向に,  \theta を更新すれば J(\theta)がより大きな値をとるように改善できるということです.

 

 実際にこの方策勾配を利用した学習を行う場合,  \log \pi_\theta (a_t, s_t)  と  Q(s_t, a_t) を別々のステップで最適化します. それぞれを方策反復(方策改善)ステップと価値反復(価値関数改善)ステップと言います.

 

方策反復ステップ :

 Q関数を固定し,  \pi_\theta (a_t, s_t) Q(s_t, a_t) \theta について最大化します. その結果, 行動  a_t & 状態  s_t の発生確率が高くなります( \pi_\theta (a_t, s_t) が上昇するように  \theta を更新するため).

 

価値反復ステップ:

     Q(s_t, a_t) を改善します. 価値関数とは, 現在の  a_t, s_t 以降, どれほどの報酬が獲得できそうかを示す関数なので, ヒストリーや方策を元に未来予測の精度を向上させるわけです. 具体的には, TD法やモンテカルロ法などを用いて, これまでのヒストリー(実際に経験した状態と行動の履歴)から, 価値関数を更新します.

 

この二つが組み合わさると, 非常に面白いことが起きます. ステップごとに考えると,

 

1. 方策反復ステップ =>  \pi_\theta (a_t, s_t) Q(s_t, a_t)を最大化する.

 この時,  \pi_\theta (a_t, s_t)がどれくらい改善されるかは,  Q(s_t, a_t) に依存する.

 

  Q(s_t, a_t) \gt 0 のとき

   確率  \pi_\theta (a_t, s_t) は, 上昇するように改善される.

   => 状態行動  a_t, s_t が発生しやすくなる.

 

  Q(s_t, a_t) \lt 0 のとき

   確率  \pi_\theta (a_t, s_t) は, 下降するように改善される.

   => 状態行動  a_t, s_t が発生しにくくなる.

 

2. 価値改善ステップ => ヒストリー(経験)と行動計画(方策  \pi_\theta (a_t, s_t) )を用いて Q(s_t, a_t) の精度をあげる.

 

3. 改善された  Q(s_t, a_t) を用いて, 方策反復を行う.

 

4. 改善された  \pi_\theta (a_t, s_t) を用いて, 価値反復を行う.

 

... (くり返し)

 

この結果として, 方策( \pi_\theta (a_t, s_t)) は  Q(s_t, a_t)によって改善され, 価値関数 Q(s_t, a_t)は, より正確に期待報酬を近似するようなります.

 

---------------------------------------------------------------------------------------------------

 

まとめると,

 

    1. 最初は状態 s_tにおいてどの行動  a_tをとれば良いかわからない. なぜなら方策 \pi_\theta (a_t, s_t) はどの  s_t, a_tの組み合わせも確率的に高いと出力するから. => 何も学習していない状態

 

    2. なので, 価値関数というガイドをつけて, 方策を更新する(方策反復).

 

    3. 経験から価値関数を改善する. (価値反復).

 

    4.  2, 3を繰り返し.

 

によって, 学習が行われているというわけです. 個人的にはこれが方策勾配法による学習の仕組みだと考えております. 数式によって得られた方策勾配が, 人間の直感的にも非常に理解しやすい形になる点が面白いと思いました.

 

---------------------------------------------------------------------------------------------------

 

これまでたくさんの方策勾配法に基づく強化学習アルゴリズムが提案されておりますが, 基本的に改造されている点としては,

 

    DDPG => シンプルに上記ステップを実行する. NNなのでバックプロパゲーションでシンプルに学習できます.

 

    TRPO => 方策反復ステップにおいて  Q(s_t, a_t)の大きさを制限し, 方策改善をゆっくり行いたいという考え. => 学習安定化の狙い.

 

    PPO => TRPOと同じだが,  Q(s_t, a_t)の大きさ制限方法をより単純な計算でできるようにした. => 学習安定化の狙い + 計算簡単化.

 

    A3C => DDPGの並列化. 正則化項として方策のエントロピーも同時最大化 & 並列化による高速化 & 並列化によるリプレイバッファ削除. (メインは並列化フレームワークの提案)

 

    A2C => A3Cより並列度を下げても案外大丈夫じゃん!

 

のように, いかに方策勾配を利用するか&それによる更新を安定化させるかに注目されているように思います.