SAC
1. 概述
探索性与样本利用率的权衡是强化学习算法主要的一对考量。DDPG/TD3的确定性使得算法探索性不足,可能会导致网络参数过早收敛至不理想的局部最优。为提高探索性并保持一定的样本利用率,Soft Actor-Critic(SAC)将随机梯度优化与DDPG类型算法进行结合。 SAC并不直接脱胎于TD3算法(二者几乎同时提出),但SAC有采用TD3中clipped double-Q trick,并且由于SAC中policy内在的随机性,其最终效果近似于TD3中的target policy smoothing。相比于TD3,SAC最为核心的特征就是结合了entropy regularization来实现这种内在的随机性。
不严谨的解释:SAC跟TD3的主要区别就是SAC加入了entropy-regularization来增加早期训练探索性,防止过早收敛至局部最优,这导致需要对V值和Q值重新定义一下。没错!entropy-regularization只是一种增加探索性的trick,跟noisy net、epsilon greedy、boltzmann一样!下面的重点就是entropy-regularization,主要难点在于引入entropy-regularization后,算法的函数(V和Q)都要改一下,不过变动不大。
SAC的核心特征是entropy regularization。policy通过权衡最大化return的期望和entropy进行训练,在策略中有一定量的随机性。这与探索性和样本利用率之间的权衡有着密切关联:entropy的增加可以导致更多的探索性,这可以加速以后的学习,并且可以防止策略过早收敛到不理想的局部最优点。
SAC关键点:off-policy算法、仅被用作连续动作空间环境、稍微改变SAC policy更新规则后可用作解决离散动作空间环境。
2. Entropy-Regularized RL
首先解释entropy-regularization。熵(entropy)是一个量,粗略地说,其表示一个随机变量的随机程度,熵低随机度低,熵高随机度高。令
x
x
x为质量或密度概率密度
P
(
x
)
P(x)
P(x)的一个随机自变量。那么
x
x
x的熵
H
H
H能够被计算为:
H
(
P
)
=
−
∑
x
∼
P
P
(
s
)
log
P
(
s
)
H(P)=-\sum_{x{\sim}P}P(s){\log}P(s)
H(P)=−x∼P∑P(s)logP(s)写成期望形式:
H
(
P
)
=
E
x
~
P
[
−
log
P
(
s
)
]
H(P)=E_{x~P}[-{\log}P(s)]
H(P)=Ex~P[−logP(s)]在policy gradient中,每步都有若干以不同几率执行的action,每个action执行完后都有对应的reward。entropy-regularized RL将该reward加上一个熵entropy用于增加其随机性。从而在一个episode中,优化目标是找到一个policy最大化return,该return则由这些加熵后的reward组合而成(discounted cumulative entropy-reward)。从而RL中的policy求解问题变为:
π
∗
=
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)))]其中
α
>
0
\alpha>0
α>0是一个熵增超参数,该值越大,熵越高,探索性就越高。基于此改动,critic输出的两个值函数也要相应作更正:
V
π
(
s
)
=
E
τ
~
π
[
∑
t
=
0
∞
γ
t
(
R
(
s
t
,
a
t
,
s
t
+
1
)
+
α
H
(
π
(
⋅
∣
s
t
)
)
)
∣
s
0
=
s
]
V^{\pi}(s)=E_{\tau~\pi}[\sum_{t=0}^{∞}\gamma^t(R(s_t,a_t,s_{t+1})+{\alpha}H(\pi(·|s_t)))|s_0=s]
Vπ(s)=Eτ~π[t=0∑∞γt(R(st,at,st+1)+αH(π(⋅∣st)))∣s0=s]
Q
π
(
s
,
a
)
=
E
τ
~
π
[
∑
t
=
0
∞
γ
t
R
(
s
t
,
a
t
,
s
t
+
1
)
+
α
∑
t
=
1
∞
γ
t
H
(
π
(
⋅
∣
s
t
)
)
)
∣
s
0
=
s
.
a
0
=
a
]
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)))|s_0=s.a_0=a]
Qπ(s,a)=Eτ~π[t=0∑∞γtR(st,at,st+1)+αt=1∑∞γtH(π(⋅∣st)))∣s0=s.a0=a]通过以上定义,利用贝尔曼方程,两个值函数的关系为:
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. SAC算法
知道Q函数定义后就能像TD3那样更新critic喽(在旧衍生版本的SAC中还有用到V函数的)
SAC同时训练学习一个policy π θ \pi_{\theta} πθ和两个Q functions Q ϕ 1 , Q ϕ 2 Q_{\phi_{1}},Q_{\phi_{2}} Qϕ1,Qϕ2(跟TD3一样)。且目前标准的SAC有两种变体:1)采用固定entropy-regularization参数 α \alpha α;2)在训练过程中利用entropy约束来变换entropy-regularization参数 α \alpha α。下面版本的SAC为第一种变体。当然SAC跟TD3不止entropy-regularization这一个区别,在接下来会继续从更新的角度阐述。
Learning Q
SAC与TD3相同点:
- 利用MSBE最小化更新,通过对共享的目标方程作回归拟合(此处“共享”指的是两个Q function的回归拟合方程为同一个)。
- 共享的目标方程通过目标Q网络计算而来,并且目标Q网络通过利用polyak平均训练过程的Q网络参数获得。
- 共享的目标方程都利用了clipped double-Q的技巧
SAC与TD3不同点:
- SAC的目标回归拟合方程还增加了一个熵正则项(entropy-regularization)。
- SAC下一state的action来自于当前policy而不是TD3中的目标policy(也就是来自于relay buffer)。
- SAC中没有应用TD3的target policy smoothing trick:对下一action加入服从裁剪标准正态分布的噪声以减少对Q值高估的可能性。SAC训练一个随机policy,可以理解为噪声源自于该随机性当中,其效果跟TD3采用的相当。
先用递归贝尔曼方程来表示熵正则化后的
Q
π
Q^{\pi}
Qπ,然后用熵的定义重写:
Q
π
(
s
,
a
)
=
E
s
′
~
P
[
R
(
s
,
a
,
s
′
)
+
γ
(
Q
π
(
s
′
,
a
′
)
)
+
α
H
(
π
(
⋅
∣
s
′
)
)
]
=
E
s
′
~
P
[
R
(
s
,
a
,
s
′
)
+
γ
(
Q
π
(
s
′
,
a
′
)
)
−
α
log
π
(
a
′
∣
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(Q^{\pi}(s',a'))-{\alpha}{\log}\pi(a'|s')]
Qπ(s,a)=Es′~P[R(s,a,s′)+γ(Qπ(s′,a′))+αH(π(⋅∣s′))]=Es′~P[R(s,a,s′)+γ(Qπ(s′,a′))−αlogπ(a′∣s′)]等式右侧是对下一states(采样自relay buffer)和下一actions(来自当前policy而非relay buffer)所求期望。期望可由样本近似为:
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′))
将下一action a ′ a' a′替换为 a ~ ′ \tilde{a}' a~′,是为强调再下一actions必须从policy中重新采样(相反, r ′ r' r′和 s ′ s' s′应该来自于replay buffer)
上面这一段笔者有点迷糊,直接照搬翻译的spinning up,等我搞懂了再编辑
SAC使用这种目标的样本近似来设置每个Q函数的MSBE损失。与TD3一样,SAC使用了clipped double-Q trick,并且采取两者之间最小Q值的作目标回归拟合方程。综上所述,SAC的Q网络损失函数为:
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′))
Learning the Policy
Policy在对每个state的训练中应最大化return期望与entropy期望的和。因此,最大化
V
π
V^{\pi}
Vπ的式子应被扩展为:
V
π
(
s
)
=
E
α
∼
π
[
Q
π
(
s
,
a
)
+
α
H
(
π
(
⋅
∣
s
)
)
]
=
E
α
∼
π
[
Q
π
(
s
,
a
)
−
α
log
(
π
(
a
∣
s
)
)
]
V^{\pi}(s)=E_{\alpha\sim\pi}[Q^{\pi}(s,a)+{\alpha}H(\pi(·|s))] =E_{\alpha\sim\pi}[Q^{\pi}(s,a)-{\alpha}\log(\pi(a|s))]
Vπ(s)=Eα∼π[Qπ(s,a)+αH(π(⋅∣s))]=Eα∼π[Qπ(s,a)−αlog(π(a∣s))]最优化该值的方式利用了reparameterization trick。其中,通过计算状态、策略参数和独立噪声的确定型函数,从
π
θ
(
⋅
∣
s
)
\pi_{\theta}(\cdot|s)
πθ(⋅∣s)中抽取样本。说明:为遵循SAC原文,使用压缩高斯策略,这意味着样本的获取根据:
a
~
θ
(
s
,
ξ
)
=
tanh
(
μ
θ
(
s
)
+
σ
θ
(
s
)
⊙
ξ
)
,
ξ
∼
N
(
0
,
I
)
.
\tilde{a}_{\theta}(s, \xi) = \tanh\left( \mu_{\theta}(s) + \sigma_{\theta}(s) \odot \xi \right), \;\;\;\;\; \xi \sim \mathcal{N}(0, I).
a~θ(s,ξ)=tanh(μθ(s)+σθ(s)⊙ξ),ξ∼N(0,I).
这个方法与使用在其它policy optimization中的方法有两个关键不同:
- The squashing function:SAC policy中的tanh函数使得actions被约束在有限边界之内,这是VPG/TRPO/PPO都没有用到的。这改变了action的分布:在使用tanh之前,SAC像算法一样是factored gaussion分布,但在tanh处理之后就不是了。
- The way standard deviations are parameterized:在VPG、TRPO和PPO中,利用状态独立的参数向量表示对数标准差。在SAC中将对数标准差作为神经网络的输出,这意味着对数标准差以一种复杂方式依赖于状态。拥有状态独立对数标准差的SAC,在我们的经验中,不能很好的工作。
reparameterization trick允许我们将对actions的期望(包含一个痛点:actions的分布取决于policy的参数)重写为对噪声的期望(这消除了痛点:分布现在不取决于参数):
E
a
∼
π
θ
Q
π
θ
(
s
,
a
)
−
α
log
π
θ
(
a
∣
s
)
=
E
ξ
∼
N
Q
π
θ
(
s
,
a
~
θ
(
s
,
ξ
)
)
−
α
log
π
θ
(
a
~
θ
(
s
,
ξ
)
∣
s
)
E_{a \sim \pi_{\theta}}{Q^{\pi_{\theta}}(s,a) - \alpha \log \pi_{\theta}(a|s)} = E_{\xi \sim \mathcal{N}}{Q^{\pi_{\theta}}(s,\tilde{a}_{\theta}(s,\xi)) - \alpha \log \pi_{\theta}(\tilde{a}_{\theta}(s,\xi)|s)}
Ea∼πθQπθ(s,a)−αlogπθ(a∣s)=Eξ∼NQπθ(s,a~θ(s,ξ))−αlogπθ(a~θ(s,ξ)∣s)
为获得策略损失,最后一步是我们需要去用一个函数逼近器替换
Q
π
θ
Q^{\pi_\theta}
Qπθ:
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,\xi)) - \alpha \log \pi_{\theta}(\tilde{a}_{\theta}(s,\xi)|s)]}
θmaxEs∼D,ξ∼N[j=1,2minQϕj(s,a~θ(s,ξ))−αlogπθ(a~θ(s,ξ)∣s)] SAC通过entropy regularization的方式训练随机性policy,并处于on-policy的方式进行探索。entropy regularization的参数
α
\alpha
α具体控制着样本利用率和探索性的平衡,参数设置越高意味着探索性越高,参数设置越低意味着样本利用率越高,实作中应根据具体环境进行仔细调参。
4. 伪代码
参考资料为:OpenAI Spinning up SAC