当前位置: 代码迷 >> 综合 >> 2.深度强化学习------SAC(Soft Actor-Critic)算法资料+原理整理
  详细解决方案

2.深度强化学习------SAC(Soft Actor-Critic)算法资料+原理整理

热度:26   发布时间:2023-12-23 13:13:36.0

SAC是深度强化学习中对于连续动作控制的又一经典。近期简单的看了一下SAC算法的思想,目前尚未深入研究,先把当前的资料整理一波,便于进一步学习。后续再作进一步更新

文章地址:
Soft Actor-Critic: Off-Policy Maximum Entropy Deep Reinforcement Learning with a Stochastic Actor

一. SAC资料

可重点看前三篇

SAC原理讲解BLOG①:这篇blog非常详细的讲解了SAC的实现过程,包括理论推导过程,看懂这篇blog基本就差不多明白SAC了。
SAC原理讲解BLOG②:这篇blog对于SAC的算法思路做了一个很好的梳理,不涉及理论推导。
SAC原理讲解BLOG③:这篇blog与第二篇类似,同时还附带了SAC的pytorch实现。
SAC原理讲解BLOG④
SAC原理讲解BLOG⑤
Spinningup资料

1.1. SAC中的trick

信息熵的概念:暂时把它可理解为一个概率

1.2. 基于PyTorch的SAC的实现

Demo①
Demo②


2020-09-11更新

二、SAC原理介绍
2.1 背景

SAC是off-policy的,且使用的是stochastic policy,SAC的一个主要特征是entropy regularization 熵正则化. policy可以被训练去最大程度上权衡期望回报和熵。是策略随机性的一个衡量。 增加熵也就说明策略的随机性增强,所以会增加更多的探索,从而可以加快后续的学习速度。可以防止policy过早的收敛到局部最优值。上面已经提到,SAC的一个重要特征就是熵正则化,那么首先我们需要了解熵正则化在强化学习中的相关内容。

2.2 entropy-regularized RL

entropy可以理解为是一个值,一个什么样的值呢?用来衡量一个随机变量的随机性有多强。举个例子,如果对一个硬币出现正反面的变量进行加权,如果总是出现正面,那么这个变量的熵就很小;反之,如果出现正反面的加权值都接近0.5,那么就说明这个变量的熵很大。
假设x?Px\sim Px?P,P是一个分布,那么x的熵H的计算方式为:
H(P)=Ex?P[?log?P(x)]H(P)=\underset{x\sim P}E\lbrack-\log P(x)\rbrack H(P)=x?PE?[?logP(x)]
在entropy-regulaized的RL中,agent每个step都会获得一个与当前time step对应的policy的熵成比例的一个奖励。这样一来,强化学习中的奖励就变为了:
π?=arg?max?πEτ?π[∑t=0∞γt(R(st,at,st+1)+αH(π(?∣st)))]\pi^{*}=\arg \max _{\pi} \underset{\tau \sim \pi}{\mathrm{E}}\left[\sum_{t=0}^{\infty} \gamma^{t}\left(R\left(s_{t}, a_{t}, s_{t+1}\right)+\alpha H\left(\pi\left(\cdot \mid s_{t}\right)\right)\right)\right]π?=argπmax?τ?πE?[t=0?γt(R(st?,at?,st+1?)+αH(π(?st?)))]
其中α\alphaα就是熵正则化系数。
其值函数对应为:
Vπ(s)=Eτ?π[∑t=0∞γt(R(st,at,st+1)+αH(π(?∣st)))∣s0=s]V^{\pi}(s)=\underset{\tau \sim \pi}{\mathrm{E}}\left[\sum_{t=0}^{\infty} \gamma^{t}\left(R\left(s_{t}, a_{t}, s_{t+1}\right)+\alpha H\left(\pi\left(\cdot \mid s_{t}\right)\right)\right) \mid s_{0}=s\right] Vπ(s)=τ?πE?[t=0?γt(R(st?,at?,st+1?)+αH(π(?st?)))s0?=s]
Q函数对应为:
Qπ(s,a)=Eτ?π[∑t=0∞γtR(st,at,st+1)+α∑t=1∞γtH(π(?∣st))∣s0=s,a0=a]Q^{\pi}(s, a)=\underset{\tau \sim \pi}{\mathrm{E}}\left[\sum_{t=0}^{\infty} \gamma^{t} R\left(s_{t}, a_{t}, s_{t+1}\right)+\alpha \sum_{t=1}^{\infty} \gamma^{t} H\left(\pi\left(\cdot \mid s_{t}\right)\right) \mid s_{0}=s, a_{0}=a\right] Qπ(s,a)=τ?πE?[t=0?γtR(st?,at?,st+1?)+αt=1?γtH(π(?st?))s0?=s,a0?=a]
VπV^{\pi}Vπ and QπQ^{\pi}Qπ 的关系:
Vπ(s)=Ea?π[Qπ(s,a)]+αH(π(?∣s))V^{\pi}(s)=\underset{a \sim \pi}{\mathrm{E}}\left[Q^{\pi}(s, a)\right]+\alpha H(\pi(\cdot \mid s)) Vπ(s)=a?πE?[Qπ(s,a)]+αH(π(?s))
QπQ^{\pi}Qπ 的贝尔曼方程为:
Qπ(s,a)=Es′?Pa′?π[R(s,a,s′)+γ(Qπ(s′,a′)+αH(π(?∣s′)))]=Es′?P[R(s,a,s′)+γVπ(s′)]\begin{aligned} Q^{\pi}(s, a) &=\underset{s^{\prime} \sim P \atop a^{\prime} \sim \pi}{\mathrm{E}}\left[R\left(s, a, s^{\prime}\right)+\gamma\left(Q^{\pi}\left(s^{\prime}, a^{\prime}\right)+\alpha H\left(\pi\left(\cdot \mid s^{\prime}\right)\right)\right)\right] \\ &=\underset{s^{\prime} \sim P}{\mathrm{E}}\left[R\left(s, a, s^{\prime}\right)+\gamma V^{\pi}\left(s^{\prime}\right)\right] \end{aligned} Qπ(s,a)?=a?πs?P?E?[R(s,a,s)+γ(Qπ(s,a)+αH(π(?s)))]=s?PE?[R(s,a,s)+γVπ(s)]?
SAC会同时学习策略(一个策略网络)+两个Q函数(两个Q网络)。目前对于SAC来讲有两种实现方式,一种是使用一个固定的熵正则化系数α\alphaα,另一种是在训练过程中自动求解熵正则化系数。

摘自spinningup
SAC中Q函数的学习与TD3中的Q学习相似,但也有些不同。
相同之处:
①Q函数的学习都是通过最小化MSBE来实现(也就是两个Q网络的loss都是最小化MSBE)
②使用了clipped double-Q trick,两个Q函数共享一个目标,计算时使用两个Q函数中给出的最小Q值得那个:
y(r,s′,d)=r+γ(1?d)min?i=1,2Q?i,targ (s′,a′(s′)),y\left(r, s^{\prime}, d\right)=r+\gamma(1-d) \min _{i=1,2} Q_{\phi_{i, \text { targ }}}\left(s^{\prime}, a^{\prime}\left(s^{\prime}\right)\right), y(r,s,d)=r+γ(1?d)i=1,2min?Q?i, targ ??(s,a(s)),
L(?1,D)=E(s,a,r,s′,d)?D(Q?1(s,a)?y(r,s′,d))2L(?2,D)=E(s,a,r,s′,d)?D(Q?2(s,a)?y(r,s′,d))2\begin{array}{l} L\left(\phi_{1}, \mathcal{D}\right)=E_{\left(s, a, r, s^{\prime}, d\right) \sim \mathcal{D}}\left(Q_{\phi_{1}}(s, a)-y\left(r, s^{\prime}, d\right)\right)^{2} \\ L\left(\phi_{2}, \mathcal{D}\right)=E_{\left(s, a, r, s^{\prime}, d\right) \sim \mathcal{D}}\left(Q_{\phi_{2}}(s, a)-y\left(r, s^{\prime}, d\right)\right)^{2} \end{array} L(?1?,D)=E(s,a,r,s,d)?D?(Q?1??(s,a)?y(r,s,d))2L(?2?,D)=E(s,a,r,s,d)?D?(Q?2??(s,a)?y(r,s,d))2?
对目标使用较小的Q值,逐步回归该值,可以避免Q函数的过高估计。
不同之处:
①SAC中Q函数的学习加入了熵的概念,在最大化回报的同时也要最大化熵
②与TD3不同,SAC计算目标所使用的下一个状态来自于当前策略而不是目标策略。
③与TD3不同,SAC中并没有明确的目标策略平滑处理,TD3训练得到的是确定性策略,因此需要通过对下一状态添加随机噪声来实现平滑。SAC训练得到的是一个随机策略,其随机性所造成的噪声已经足以产生类似的效果了。

再来看一下熵正则化的贡献,重写基于熵正则化的RL的Q函数贝尔曼方程:
Qπ(s,a)=Es′?Pa′?π[R(s,a,s′)+γ(Qπ(s′,a′)+αH(π(?∣s′)))]=Es′?Pa′?π[R(s,a,s′)+γ(Qπ(s′,a′)?αlog?π(a′∣s′))]\begin{aligned} Q^{\pi}(s, a) &=\underset{s^{\prime} \sim P \atop a^{\prime} \sim \pi}{\mathrm{E}}\left[R\left(s, a, s^{\prime}\right)+\gamma\left(Q^{\pi}\left(s^{\prime}, a^{\prime}\right)+\alpha H\left(\pi\left(\cdot \mid s^{\prime}\right)\right)\right)\right] \\ &=\underset{s^{\prime} \sim P \atop a^{\prime} \sim \pi}{\mathrm{E}}\left[R\left(s, a, s^{\prime}\right)+\gamma\left(Q^{\pi}\left(s^{\prime}, a^{\prime}\right)-\alpha \log \pi\left(a^{\prime} \mid s^{\prime}\right)\right)\right] \end{aligned} Qπ(s,a)?=a?πs?P?E?[R(s,a,s)+γ(Qπ(s,a)+αH(π(?s)))]=a?πs?P?E?[R(s,a,s)+γ(Qπ(s,a)?αlogπ(as))]?
求期望是对下一个状态(来自于replay buffer)和下一个动作(来自于当前策略而不是replay buffer)求期望,(这里的动作需要强调指出,不是从replay buffer采样得到的,而是基于当前策略计算得到的新的action),因此可以使用样本进行近似估算Q值:
Qπ(s,a)≈r+γ(Qπ(s′,a~′)?αlog?π(a~′∣s′)),a~′?π(?∣s′)Q^{\pi}(s, a) \approx r+\gamma\left(Q^{\pi}\left(s^{\prime}, \tilde{a}^{\prime}\right)-\alpha \log \pi\left(\tilde{a}^{\prime} \mid s^{\prime}\right)\right), \quad \tilde{a}^{\prime} \sim \pi\left(\cdot \mid s^{\prime}\right) Qπ(s,a)r+γ(Qπ(s,a~)?αlogπ(a~s)),a~?π(?s)
SAC中Q网络的损失函数(这里用到了clipped double-Q trick):
L(?i,D)=E?(s,a,r,s′,d)?D[(Q?i(s,a)?y(r,s′,d))2]L\left(\phi_{i}, \mathcal{D}\right)=\operatorname{E}_{\left(s, a, r, s^{\prime}, d\right) \sim \mathcal{D}}\left[\left(Q_{\phi_{i}}(s, a)-y\left(r, s^{\prime}, d\right)\right)^{2}\right] 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,2Q?targ,j(s′,a~′)?αlog?πθ(a~′∣s′)),a~′?πθ(?∣s′)y\left(r, s^{\prime}, d\right)=r+\gamma(1-d)\left(\min _{j=1,2} Q_{\phi_{\mathrm{targ}, j}}\left(s^{\prime}, \tilde{a}^{\prime}\right)-\alpha \log \pi_{\theta}\left(\tilde{a}^{\prime} \mid s^{\prime}\right)\right), \quad \tilde{a}^{\prime} \sim \pi_{\theta}\left(\cdot \mid s^{\prime}\right) y(r,s,d)=r+γ(1?d)(j=1,2min?Q?targ,j??(s,a~)?αlogπθ?(a~s)),a~?πθ?(?s)
学习策略:最大化 Vπ(s),V^{\pi}(s),Vπ(s), 在每个state熵最大化期望回报与期望entropy的和。
Vπ(s)=Ea?π[Qπ(s,a)]+αH(π(?∣s))=Ea?π[Qπ(s,a)?αlog?π(a∣s)]\begin{aligned} V^{\pi}(s) &=\underset{a \sim \pi}{\mathrm{E}}\left[Q^{\pi}(s, a)\right]+\alpha H(\pi(\cdot \mid s)) \\ &=\underset{a \sim \pi}{\mathrm{E}}\left[Q^{\pi}(s, a)-\alpha \log \pi(a \mid s)\right] \end{aligned} Vπ(s)?=a?πE?[Qπ(s,a)]+αH(π(?s))=a?πE?[Qπ(s,a)?αlogπ(as)]?
优化策略的方法使用:reparameterization trick,
a~θ(s,ξ)=tanh?(μθ(s)+σθ(s)⊙ξ),ξ?N(0,I)\tilde{a}_{\theta}(s, \xi)=\tanh \left(\mu_{\theta}(s)+\sigma_{\theta}(s) \odot \xi\right), \quad \xi \sim \mathcal{N}(0, I) a~θ?(s,ξ)=tanh(μθ?(s)+σθ?(s)ξ),ξ?N(0,I)
通过计算状态、策略参数以及独立噪声的确定性函数,从中抽取样本。
reparameterization trick使得我们可以将对动作的期望(这里有一个痛点:动作分布取决于策略参数)重写为对噪声的期望(消除痛点:此时动作分布不依赖于策略参数)
Ea?πθ[Qπθ(s,a)?αlog?πθ(a∣s)]=Eξ?N[Qπθ(s,a~θ(s,ξ))?αlog?πθ(a~θ(s,ξ)∣s)]\underset{a \sim \pi_{\theta}}{\mathrm{E}}\left[Q^{\pi_{\theta}}(s, a)-\alpha \log \pi_{\theta}(a \mid s)\right]=\underset{\xi \sim \mathcal{N}}{\mathrm{E}}\left[Q^{\pi_{\theta}}\left(s, \tilde{a}_{\theta}(s, \xi)\right)-\alpha \log \pi_{\theta}\left(\tilde{a}_{\theta}(s, \xi) \mid s\right)\right] a?πθ?E?[Qπθ?(s,a)?αlogπθ?(as)]=ξ?NE?[Qπθ?(s,a~θ?(s,ξ))?αlogπθ?(a~θ?(s,ξ)s)]
policy的loss:
max?θEξ?N[min?j=1,2Q?j(s,a~θ(s,ξ))?αlog?πθ(a~θ(s,ξ)∣s)]\max _{\theta} \underset{\xi \sim \mathcal{N}}{\mathrm{E}}\left[\min _{j=1,2} Q_{\phi_{j}}\left(s, \tilde{a}_{\theta}(s, \xi)\right)-\alpha \log \pi_{\theta}\left(\tilde{a}_{\theta}(s, \xi) \mid s\right)\right] θmax?ξ?NE?[j=1,2min?Q?j??(s,a~θ?(s,ξ))?αlogπθ?(a~θ?(s,ξ)s)]
伪代码如下(在连续任务下):
在这里插入图片描述

  相关解决方案