深度强化学习笔记06【总结:DDPG/TD3/SAC】
总结:1)DDPG解决DQN难以处理连续动作空间问题:DDPG = DQN + DPG;2)TD3解决过估计Q值问题:TD3 = DDPG + clipped double-Q learning + "delayed" policy updates + target policy smoothing;3)SAC将SPG与DDPG结合:SAC = DDPG + SPG + clipped doubl
总结:
- DDPG解决DQN难以处理连续动作空间问题:DDPG = DQN + DPG
- TD3解决过估计Q值问题:TD3 = DDPG + clipped double-Q learning + “delayed” policy updates + target policy smoothing
- SAC将SPG与DDPG结合:SAC = DDPG + SPG + clipped double-Q learning + entropy-regularization + reparameterization
目录
一、DDPG
1.1 概述
DQN不便解决连续动作空间环境,这源于critic训练的回归拟合方程存在求解actions中Q value最大值问题。DDPG为解决该问题,训练一个actor输出唯一action,作为critic的输入能输出近似最大Q值:
max
a
Q
∗
(
s
,
a
)
≈
Q
θ
(
s
,
π
θ
(
s
)
)
\max_aQ^*(s,a)≈Q_{\theta}(s,{\pi}_{\theta}(s))
amaxQ∗(s,a)≈Qθ(s,πθ(s)) 因为动作空间是连续的,可以认为policy对action可微,从而利用policy gradient的方法去更新actor,而继续用Q learning的方法去更新critic。DDPG的关键点:off-policy、仅能被用于连续动作空间、可被看作是连续动作空间的deep Q learning。
总之,DDPG主要做了两件事:1)通过Q learning学习一个Q function(critic);2)通过DPG学习一个policy(actor)。并且actor仅输出一个action(确定性),作为critic的输入能输出近似最大Q值。
1.2 Critic 更新
-
贝尔曼最优方程(目标):
Q ∗ ( s , a ) = r s a + γ ∑ s ′ ∈ S P s s ′ a m a x a Q ∗ ( s ′ , a ′ ) Q^*(s,a)=r_s^a+{\gamma}{\sum_{s'∈S}}P_{ss'}^amax_aQ^*(s',a') Q∗(s,a)=rsa+γs′∈S∑Pss′amaxaQ∗(s′,a′) -
基于TD法建立以MSBE为损失的目标函数:
J ( ϕ ) = L ( ϕ ) = E ( s , a , r , s ′ , d ) ~ D [ ( Q ϕ ( s , a ) − ( r + γ ( 1 − d ) Q ϕ ( s ′ , a ′ ) ) ) 2 ] J(\phi)=L(\phi)=E_{(s,a,r,s',d)~D}[(Q_{\phi}(s,a)-(r+{\gamma}(1-d)Q_{\phi}(s',a')))^2] J(ϕ)=L(ϕ)=E(s,a,r,s′,d)~D[(Qϕ(s,a)−(r+γ(1−d)Qϕ(s′,a′)))2] -
利用采样到的batch-size个样本的均值近似该期望并使用gradient descent更新:
▽ ϕ J ( ϕ ) = ▽ ϕ 1 ∣ B ∣ ∑ ( s , a , r , s ′ , d ) ~ B ( Q ϕ ( s , a ) − ( r + γ ( 1 − d ) Q ϕ ( s ′ , a ′ ) ) ) 2 ▽_{\phi}J(\phi)=▽_{\phi}\frac{1}{|B|}{\sum}_{(s,a,r,s',d)~B}(Q_{\phi}(s,a)-(r+{\gamma}(1-d)Q_{\phi}(s',a')))^2 ▽ϕJ(ϕ)=▽ϕ∣B∣1∑(s,a,r,s′,d)~B(Qϕ(s,a)−(r+γ(1−d)Qϕ(s′,a′)))2
1.3 Actor 更新
- 训练目标就是让critic输出的Q值最大: J ( θ ) = E s ~ S [ Q ϕ ( s , π θ ( s ) ) ] J(\theta)=E_{s~S}[Q_{\phi}(s,\pi_{\theta}(s))] J(θ)=Es~S[Qϕ(s,πθ(s))]
- 因为动作空间连续,Q对action可微,结合链导性,利用gradient boosting更新:
▽ θ J ( θ ) = ∂ Q ∂ θ = ∂ Q ϕ ( s , π θ ( s ) ) ∂ π θ ( s ) ∗ ∂ π θ ( s ) ∂ θ ▽_{\theta}J(\theta)=\frac{\partial{Q}}{\partial{\theta}}=\frac{\partial{Q_{\phi}(s,{\pi}_{\theta}(s))}}{\partial{{\pi}_{\theta}(s)}}*\frac{\partial{{\pi}_{\theta}(s)}}{\partial{\theta}} ▽θJ(θ)=∂θ∂Q=∂πθ(s)∂Qϕ(s,πθ(s))∗∂θ∂πθ(s)
Tips
DDPG中有沿用DQN中target network和relay buffer的trick(buffer里面数据是给critic的,policy的目的是最大化critic的输出)
1.4 伪代码
二、TD3
2.1 概述
主要解决DDPG中存在的问题(同样存在于DQN中):过估计Q值。原因在于神经网络本身的输出不稳定,而critic更新中总是要向最大Q值的那一个收敛,所以选择的更新方向总是被高估的Q值,如果episode过长,累积的误差会使得训练效果十分不理想。DQN中采用Double Q network减小选择高估Q值为更新方向概率: y = r + γ ( 1 − d ) Q 1 ( s ′ , a r g max a Q 2 ( s ′ , a ) ) , y=r+\gamma(1-d)Q^1(s',arg\max_{a}{Q^2}(s',a)), y=r+γ(1−d)Q1(s′,argamaxQ2(s′,a)),两个Q网络嵌套,即便里面的选择了高估Q的action,只要外层Q值不高估就行了,即便外层会高估Q值,里面的不选择高估Q值的action就行。TD3中的采用是另一个方式: y = r + γ ( 1 − d ) min i = 1 , 2 Q ϕ i , t a r g ( s ′ , a ′ ( s ′ ) ) , y=r+\gamma(1-d)\min_{i=1,2}Q_{\phi_{i,targ}}(s',a'(s')), y=r+γ(1−d)i=1,2minQϕi,targ(s′,a′(s′)),选择两个Q网络输出Q值最小的那一个作为目标回归拟合,trick被称为clipped double-Q learning。
spinning up介绍的TD3与DDPG主要有三个区别:1)clipped double-Q learning;2)”Delayed” Policy Updates;3)Target Policy Smoothing。其中第2项就是减缓policy的更新频率,原文建议每两次更新critic再更新一次policy,有助于训练稳定性。第3项是向action中加入随机噪声,通过让Q值随着动作平滑变化,让policy难以输出使critic输出的Q值被高估的action,原文中,该噪声为clip处理后的标准高斯噪声(理解:Q值的过估计根本源自于神经网络的扰动性,在此基础上人为加入裁剪后的服从标准正态分布的噪声,可能会抵消或正则化该扰动误差,降低出现过估计Q值的可能)。总之这三种trick加入DDPG提高了其表现性能,并称之TD3。
2.2 更新
具体地,与DDPG相比,TD3在critic和actor的更新中对应有三点变化:
- critic更新中的回归拟合方程y应用clipped double-Q learning: y = r + γ ( 1 − d ) min i = 1 , 2 Q ϕ i , t a r g ( s ′ , a ′ ( s ′ ) ) y=r+\gamma(1-d)\min_{i=1,2}Q_{\phi_{i,targ}}(s',a'(s')) y=r+γ(1−d)i=1,2minQϕi,targ(s′,a′(s′))
- steps循环中,每更新两次critic再更新一次actor。
- critic更新中的回归拟合方程y中的action加入裁剪后的高斯噪声: a ′ ( s ′ ) = c l i p ( π θ t a r + c l i p ( ϵ , − c , c ) , a L o w , a H i g h ) , ϵ ~ N ( 0 , σ ) a'(s')=clip(\pi_{\theta_{tar}}+clip(\epsilon,-c,c),a_{Low},a_{High}),\epsilon~N(0,\sigma) a′(s′)=clip(πθtar+clip(ϵ,−c,c),aLow,aHigh),ϵ~N(0,σ)
2.3 伪代码
三、SAC
3.1 概述
SAC的核心特征是entropy-regularization trick。DDPG/TD3中确定性地收敛策略可能会使得算法探索性不足,导致policy过早收敛至不理想的critical point。SAC的目的是提高DDPG的探索性而又保留一定的样本利用率(exploration-exploitation trade off)。提升探索性的trick很多,包括最经典且简单的epsilon greedy,以及noise network等等。
SAC中用到的是entropy-regularization,利用与action相关联的熵去延缓收敛提升探索性,这种关联性来自于熵的定义:随机程度越高熵值越大。在SPG(stochastic policy gradient)训练早期的时候,actions的概率分布方差较大,随机程度高熵值较大;随着训练进行,policy逐渐收敛,actions的分布方差变小,随机程度变低熵值较小。根据这个特点,在价值函数中加入熵值:训练早期,return所加熵值较大,训练后期,return所加熵值较小,从而soft该收敛过程,使得训练收敛变缓,这可以保留早期policy的探索性防止过早收敛,还可以加速以后的学习(理解:这里的加速指的是更高效的收敛到理想的minimal point)。SAC主要的工作就是把SPG应用于DDPG的更新中并加入entropy-regularization。
加入熵项后,V值和Q值都要再定义,所以critic和actor更新的函数也要作改变。
对于critic的更新,原文作者引理证明:即便加入了熵项,也能确保Q值收敛向可能的最大值(soft policy evaluation)。
对于actor的更新,我还没完全理解清楚:作者用KL散度衡量policy与归一化后的Q function的指数之间的差距,想把这个作为更新目标:
J
π
(
ϕ
)
=
E
s
t
∼
D
[
D
K
L
(
π
ϕ
(
⋅
∣
s
t
)
∣
∣
exp
(
Q
θ
(
s
t
,
⋅
)
)
Z
θ
(
s
t
)
)
]
J_{\pi}(\phi)=E_{s_t\sim{D}}[D_{KL}(\pi_{\phi}(\cdot|s_t)||\frac{\exp(Q_{\theta}(s_t,\cdot))}{Z_{\theta}(s_t)})]
Jπ(ϕ)=Est∼D[DKL(πϕ(⋅∣st)∣∣Zθ(st)exp(Qθ(st,⋅)))]此处笔者存疑:policy跟Q之间只有action作联系,即policy的目标是输出的action作为critic的输入能输出最大Q值,没有直接关系啊,他俩分布差距变小对policy的更新有意义吗?可作者在原文给出了引理证明:这样确实能得到更好的policy (soft policy improvement)。简单来说,证明的过程就是把该KL散度展开计算,增加policy约束并引用soft policy evaluation的证明同证,使用该更新目标能得到更好的policy。
spinning up文档中未用该方法更新,而是继承自DDPG的actor更新方法并采用原文提到的另外一个trick:reparameterization进行actor的更新
3.2 Entropy-regularization
- 将熵项加入reward中,并以最大化重构的return作为RL更新方向,用超参数α控制“探索度”:
π ∗ = a r g max π E τ ~ π [ ∑ t = 0 ∞ γ t ( R ( s t , a t , s t + 1 ) + α H ( π ( ⋅ ∣ s t ) ) ) ] \pi^*=arg\max_{\pi}E_{\tau~\pi}[\sum_{t=0}^{∞}\gamma^t(R(s_t,a_t,s_{t+1})+{\alpha}H(\pi(·|s_t)))] π∗=argπmaxEτ~π[t=0∑∞γt(R(st,at,st+1)+αH(π(⋅∣st)))] - 重定义V值函数: V π ( s ) = E τ ~ π [ ∑ t = 0 ∞ γ t ( R ( s t , a t , s t + 1 ) + α H ( π ( ⋅ ∣ s t ) ) ) ] V^{\pi}(s)=E_{\tau~\pi}[\sum_{t=0}^{∞}\gamma^t(R(s_t,a_t,s_{t+1})+{\alpha}H(\pi(·|s_t)))] Vπ(s)=Eτ~π[t=0∑∞γt(R(st,at,st+1)+αH(π(⋅∣st)))]
- 重定义Q值函数: Q π ( s , a ) = E τ ~ π [ ∑ t = 0 ∞ γ t R ( s t , a t , s t + 1 ) + α ∑ t = 1 ∞ γ t H ( π ( ⋅ ∣ s t ) ) ) ] Q^{\pi}(s,a)=E_{\tau~\pi}[\sum_{t=0}^{∞}\gamma^tR(s_t,a_t,s_{t+1})+{\alpha}\sum_{t=1}^{∞}\gamma^tH(\pi(·|s_t)))] Qπ(s,a)=Eτ~π[t=0∑∞γtR(st,at,st+1)+αt=1∑∞γtH(π(⋅∣st)))]
- 通过以上定义,利用贝尔曼方程,两个值函数的关系为:
V π ( s ) = E α ~ π [ Q π ( s , a ) ] + α H ( π ( ⋅ ∣ s t ) ) V^{\pi}(s)=E_{\alpha~\pi}[Q^{\pi}(s,a)]+{\alpha}H(\pi(·|s_t)) Vπ(s)=Eα~π[Qπ(s,a)]+αH(π(⋅∣st)) Q π ( s , a ) = E s ′ ~ P [ R ( s , a , s ′ ) + γ ( Q π ( s ′ , a ′ ) ) + α H ( π ( ⋅ ∣ s ′ ) ) ] = E s ′ ~ P [ R ( s , a , s ′ ) + γ V π ( s ′ ) ] Q^{\pi}(s,a)=E_{s'~P}[R(s,a,s')+\gamma(Q^{\pi}(s',a'))+{\alpha}H(\pi(·|s'))]=E_{s'~P}[R(s,a,s')+{\gamma}V^{\pi}(s')] Qπ(s,a)=Es′~P[R(s,a,s′)+γ(Qπ(s′,a′))+αH(π(⋅∣s′))]=Es′~P[R(s,a,s′)+γVπ(s′)]
3.3 Critic 更新
- 根据上述加入熵项的Q值,写出其贝尔曼递归方程:
Q π ( s , a ) = E s ′ ~ P , a ′ ∼ π [ R ( s , a , s ′ ) + γ ( Q π ( s ′ , a ′ ) ) + α H ( π ( ⋅ ∣ s ′ ) ) ] = E s ′ ~ P , a ′ ∼ π [ R ( s , a , s ′ ) + γ ( Q π ( s ′ , a ′ ) ) − α log π ( a ′ ∣ s ′ ) ] Q^{\pi}(s,a)=E_{s'~P,a'\sim{\pi}}[R(s,a,s')+\gamma(Q^{\pi}(s',a'))+{\alpha}H(\pi(·|s'))] =E_{s'~P,a'\sim{\pi}}[R(s,a,s')+\gamma(Q^{\pi}(s',a'))-{\alpha}{\log}\pi(a'|s')] Qπ(s,a)=Es′~P,a′∼π[R(s,a,s′)+γ(Qπ(s′,a′))+αH(π(⋅∣s′))]=Es′~P,a′∼π[R(s,a,s′)+γ(Qπ(s′,a′))−αlogπ(a′∣s′)]
其中与TD3不同的除了熵项的增加,最重要的是actions来自于当前policy与环境互动得到的数据,而非从buffer中sample的数据(states仍然是跟TD3一样从buffer里sample),spinning up没解释,个人理解:熵值取决于actions的probability,所以用旧数据的actions对探索的提升就没价值了?
- 用样本近似该期望: Q π ( s , a ) ≈ r + γ ( Q π ( s ′ , a ~ ′ ) − α log π ( a ~ ′ ∣ s ′ ) , a ~ ′ ∼ π ( ⋅ ∣ s ′ ) ) Q^{\pi}(s,a)≈r+{\gamma}(Q^{\pi}(s',\tilde{a}')-{\alpha}\log\pi(\tilde{a}'|s'),~~\tilde{a}'\sim\pi(·|s')) Qπ(s,a)≈r+γ(Qπ(s′,a~′)−αlogπ(a~′∣s′), a~′∼π(⋅∣s′))
- 目标函数: L ( ϕ i , D ) = E ( s , a , r , s ′ , d ) ∼ D [ ( Q ϕ i ( s , a ) − y ( r , s ′ , d ) ) 2 ] L(\phi_i,D)=E_{(s,a,r,s',d){\sim}D}[(Q_{\phi_i}(s,a)-y(r,s',d))^2] L(ϕi,D)=E(s,a,r,s′,d)∼D[(Qϕi(s,a)−y(r,s′,d))2]
- 其中回归拟合方程: y ( r , s ′ , d ) = r + γ ( 1 − d ) ( min j = 1 , 2 Q ϕ t a r g , j ( s ′ , a ~ ′ ) − α log π ( a ~ ′ ∣ s ′ ) ) , a ~ ′ ∼ π ( ⋅ ∣ s ′ ) ) y(r,s',d)=r+{\gamma}(1-d)(\min_{j=1,2}Q_{\phi_{targ,j}}(s',\tilde{a}')-{\alpha}{\log}\pi(\tilde{a}'|s')),~~\tilde{a}'\sim\pi(·|s')) y(r,s′,d)=r+γ(1−d)(j=1,2minQϕtarg,j(s′,a~′)−αlogπ(a~′∣s′)), a~′∼π(⋅∣s′))
跟TD3中一样,也用到了clipped double-Q learning,用gradient descent更新该目标函数(MSBE)即可。
3.4 Actor 更新
原文使用了一种新的更新方式,但spinning up中仍使用DDPG的policy gradient,并加入原文提到的一个trick:reparameterization
- DDPG policy gradient:KaTeX parse error: Can't use function '$' in math mode at position 50: …i_{\theta}(s))]$̲or$J(\theta)=E_…
- SAC policy gradient:
max θ E s ∼ D , ξ ∼ N [ min j = 1 , 2 Q ϕ j ( s , a ~ θ ( s , ϵ ) ) − α log π θ ( a ~ θ ( s , ϵ ) ∣ s ) ] \max_{\theta} E_{s \sim \mathcal{D}, \\ \xi \sim \mathcal{N}}{[\min_{j=1,2} Q_{\phi_j}(s,\tilde{a}_{\theta}(s,\epsilon)) - \alpha \log \pi_{\theta}(\tilde{a}_{\theta}(s,\epsilon)|s)]} θmaxEs∼D,ξ∼N[j=1,2minQϕj(s,a~θ(s,ϵ))−αlogπθ(a~θ(s,ϵ)∣s)]其中,与DDPG不同的有三处:1)熵项的增加;2)reparameterization对action的参数化定义;3)clipped double-Q network(跟TD3一样)。
Reparameterization对action的参数化定义为: a ~ θ ( s , ϵ ) = tanh ( μ θ ( s ) + σ θ ( s ) ⊙ ϵ ) , ϵ ∼ N ( 0 , I ) \tilde{a}_{\theta}(s, \epsilon) = \tanh\left( \mu_{\theta}(s) + \sigma_{\theta}(s) \odot \epsilon \right), \;\;\;\;\; \epsilon \sim \mathcal{N}(0, I) a~θ(s,ϵ)=tanh(μθ(s)+σθ(s)⊙ϵ),ϵ∼N(0,I)该trick的目的是:1)压缩函数,使用tanh函数约束动作空间约束成有界而非无限空间;2)action满足一个高斯分布,其均值与方差由policy定义并具体由state取决,spinning up给出的解释是:在VPG、TRPO或PPO中,policy的标准差(log std devs)是用与状态无关的参数变量表示的,这意味着这些标准差在policy固定的情况下是固定的,基于spinning up开发组的经验,如果在SAC中使用一样的方法会导致算法效果不好,所以引入与神经网络参数有关的状态决定action空间。此外加入的epsilon噪声项是一个独立的超参数用于保持探索性。总之,SAC的actor更新目标就是步骤2,之后按照DDPG那样进行policy gradient即可。
3.5 伪代码
至此,笔者算是完成了spinning up中给出算法的理论学习。欢迎讨论学习
更多推荐
所有评论(0)