Emileの備忘録

色々な事をだらだらと

DDPGでPendulum-v0を解く

もし間違っている所やおかしいなと思う所があれば指摘してください

DDPGとは

概要

DDPGは,Actor-Criticの構造を取り,
学習には soft-target や Experiments Replay といった手法を用いる手法で,連続値での制御を行います.


 Criticでは  Q(s,a | \theta^Q) を学習し,  Actor では, \pi_d (s| \theta^\pi)を学習します,


soft-target は fixed-target に含まれる手法であり,

今回であれば  Actor,\ Critic 両方のネットワークにそれぞれ target ネットワークを準備しておきます.



詳しくは後で述べますが, Actor は確率的方策ではなく決定論的方策を学習していて,
行動方策には出力値にノイズを載せた物を使います.

この特徴から, off-policy な手法であると言えます.


※Experiments Replayは,行動方策と学習方策の一致する on-policy な Agentの学習には使えません.
(以前の履歴は以前の方策に基づいているので.)

今回の実装では,ノイズには平均 0 のガウシアンノイズを用いました.


決定論的な方策勾配定理

証明は面倒くさい長いのでこの記事では説明しません.


結果だけを述べると,

方策勾配は,  \mathbb{E}_{s_t \sim \rho^\pi} [\nabla_{\theta^\pi} Q(s,a | \theta^Q)| s = s_t, a = \pi_d (s_t | \theta^\pi)]  として近似されます.


なので,  \theta^{\pi} の学習は,  \theta^\pi_{t+1} = \theta^\pi_t + \alpha \mathbb{E}[ \nabla_{\theta^\pi} Q(s_t, \pi_d(s_t | \theta^\pi)) ]  によって行われます.
(  \alpha : 学習率)


詳細は下記の論文を見てください.

arxiv.org


損失関数

 Criticの損失関数には
 L_{critic} = \sum_{t} \{ r_t + \gamma Q (s_{t+1}, \pi_d(s_{t+1}| \theta^{\pi_{target}})  | \theta^{Q_{target} }) - Q(s_t, a_t | \theta^Q) \}^2  )を用います.


 Actorの損失関数には,
 L_{actor} = - \sum_{t} Q(s_t, \pi_d(s_t | \theta^\pi) | \theta^Q ) を用います.

これを  \theta^\pi について微分してやれば,先程の方策勾配が求まる事に注意してください.



実装時には,
1. targetネットワークには,勾配を流さない様にする
2.方策勾配の計算時に求まった勾配で  Criticを更新しない.

に気をつけてください.


soft-target

fixed-targetでは一定間隔で fixed-target と 本体のネットワークを完全に同期していましたが,


この手法では,

 \theta^{Q_{target}} \longleftarrow \tau \theta^{Q} + (1 - \tau) \theta^{Q_{target}}

 \theta^{\pi_{target}} \longleftarrow \tau \theta^{\pi} + (1 - \tau) \theta^{\pi_{target}}

によって緩やかにネットワークを同期するようにします.
(同期は,ネットワークの更新と同じ位高頻度で行います.)


これによって学習が安定化されるそうです.






実装

Pendulum-v0の問題設定

状態は, ( \cos(\theta),\ \sin(\theta),\ \dot{\theta} )の組で与えられ,

行動は, \ a\ (-2 \leq a \leq 2)の連続値で与えます.

また,報酬は, r = - (\theta^2 + 0.1 \dot{\theta}^2 + 0.001 a^2)で計算されます.


これまでの記事で扱った問題との最大の違いは行動を連続値で扱わなくてはならない事です.


ソースコード

github.com

main.pyとmodel.py に書かれています.


結果

学習回数は200回程度です.






参考文献


arxiv.org


↓方策勾配の導出 (分かりやすい)
sykwer.hatenablog.jp


↓実装が分かりやすい
horomary.hatenablog.com