GA将?開発日記~原点回帰~

ネタ勢最強を目指して絶賛開発中。

エントロピー正則化の勾配計算(修正済み)

 Twitterで@mooopanさんに教わった手法ですが、微分がちょいとややこしそうなのでメモも兼ねて書いておきます。

 まず、参考論文は [1602.01783] Asynchronous Methods for Deep Reinforcement Learning です。

 上記論文によると、下記の式を使って評価関数パラメータθを更新すれば良い様です。

\nabla_\theta\log \pi \left( a_t | s_t ; \theta  \right) \left( R_T - V \left( s_t ; \theta_v \right) \right) + \beta \nabla_\theta H \left( \pi \left(s_t ; \theta \right) \right)

 ここで、第一項は通常の方策勾配法の更新式と一緒なので飛ばし、H(・)はエントロピーなので下記の通りになります。

〈2018/11/26 ここから修正(Σの前の-が抜けていました)〉

H \left( \pi \left(s_t ; \theta \right) \right) = - \sum_a \pi \left( a | s_t ; \theta \right) \log \pi \left( a | s_t ; \theta \right)

〈修正ここまで〉

 \sum_aは足し算なので中の項の微分だけしていきます。

\nabla_\theta \left( \pi \left( a | s_t ; \theta \right) \log \pi \left( a | s_t ; \theta \right) \right) = \left( \nabla_\theta \pi \left( a | s_t ; \theta \right) \right)  \log \pi \left( a | s_t ; \theta \right) + \pi \left( a | s_t ; \theta \right)  \left( \nabla_\theta  \log \pi \left( a | s_t ; \theta \right)  \right)

 \nabla_\theta  \log \pi \left( a | s_t ; \theta \right)は既知なので、\nabla_\theta \pi \left( a | s_t ; \theta \right)だけ計算。これは簡単です。

 \nabla_\theta \pi \left( a | s_t ; \theta \right) = \pi \left( a | s_t ; \theta \right) \nabla_\theta  \log \pi \left( a | s_t ; \theta \right)

 んで、代入して整理した最終結果。

  \left( 1 + \log \pi \left( a | s_t ; \theta \right) \right) \pi \left( a | s_t ; \theta \right) \nabla_\theta  \log \pi \left( a | s_t ; \theta \right)

 意外とスッキリした式になりましたね。という訳で、今日はここまで!