文章目录
Background
SAC算法,它以off-policy方式优化随机策略,从而在随机策略优化和DDPG方式之间建立了桥梁。 它不是TD3的直接后继者,但它包含了裁剪过的double-Q技巧,并且由于SAC策略固有的随机性,它还受益于诸如目标策略平滑之类的东西。
SAC的主要特征是熵正则化entropy regularization。 该策略经过训练,可以最大程度地在预期收益和熵之间进行权衡,熵是策略中随机性的一种度量。 这与探索和利用的权衡关系密切:增加熵会导致更多的探索,从而可以加快以后的学习速度。 它还可以防止策略过早收敛到不良的局部最优值。
Quick Facts
- SAC是off-policy的
- Spinningup 版本的SAC仅能用于连续动作空间的环境
- 对策略更新规则的改变可以使SAC用于处理离散动作空间
- Spinningup的SAC不能使用并行运算
Key Equations
为了解释“SAC”,我们首先必须介绍熵正则化的强化学习设置。 在熵正则化的RL中,值函数的方程式略有不同。
Entropy-Regularized Reinforcement Learning
熵是一个可以粗略地说出随机变量的随机性的量。 如果对硬币进行加权,使其几乎总是出现正面,那么它的熵就很低。 如果权重均等并且有一半机会出现任一结果,则它具有很高的熵。
令 x x x为随机变量,服从密度函数 P P P。 x x x的熵 H H H为: H ( P ) = E x ∼ P [ − log P ( x ) ] . H(P) = \underset{x \sim P}E[{-\log P(x)}]. H(P)=x∼PE[−logP(x)].在正则熵的强化学习中,代理在每个时间步都获得与该时间步的策略熵成正比的奖金奖励。 这会将RL问题更改为: π ∗ = arg max π E τ ∼ π [ ∑ t = 0 ∞ γ t ( R ( s t , a t , s t + 1 ) + α H ( π ( ⋅ ∣ s t ) ) ) ] , \pi^* = \arg \max_{\pi} \underset{\tau \sim \pi}E\bigg[{ \sum_{t=0}^{\infty} \gamma^t \bigg( R(s_t, a_t, s_{t+1}) + \alpha H\left(\pi(\cdot|s_t)\right) \bigg)}\bigg], π∗=argπmaxτ∼πE[t=0∑∞γt(R(st,at,st+1)+αH(π(⋅∣st)))],其中 α > 0 \alpha>0 α>0是平衡系数。(请注意:我们在这里假定了无限步长的折扣设置,此页面的其余部分中也执行相同的操作。)现在,我们可以在此设置中定义稍有不同的值函数。 V π V^\pi Vπ每个时间步骤的改变都包含熵奖励: V π ( s ) = E τ ∼ π [ ∑ t = 0 ∞ γ t ( R ( s t , a t , s t + 1 ) + α H ( π ( ⋅ ∣ s t ) ) ) ∣ s 0 = s ] V^{\pi}(s) = \underset{\tau \sim \pi}E\bigg[{ \left. \sum_{t=0}^{\infty} \gamma^t \bigg( R(s_t, a_t, s_{t+1}) + \alpha H\left(\pi(\cdot|s_t)\right) \bigg) \right| s_0 = s}\bigg] Vπ(s)=τ∼πE[t=0∑∞γt(R(st,at,st+1)+αH(π(⋅∣st)))∣∣∣∣∣s0=s]除了第一次, Q π Q^\pi Qπ的改变也包含熵奖励: 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) = \underset{\tau \sim \pi}E\bigg[{ \left. \sum_{t=0}^{\infty} \gamma^t R(s_t, a_t, s_{t+1}) + \alpha \sum_{t=1}^{\infty} \gamma^t H\left(\pi(\cdot|s_t)\right)\right| s_0 = s, a_0 = a}\bigg] Qπ(s,a)=τ∼πE[t=0∑∞γtR(st,at,st+1)+αt=1∑∞γtH(π(⋅∣st))∣∣∣∣∣s0=s,a0=a]有了这些定义, V π a n d Q π V^\pi\ and\ Q^\pi Vπ and Qπ以下面的方式连接: V π ( s ) = E a ∼ π [ Q π ( s , a ) ] + α H ( π ( ⋅ ∣ s ) ) V^{\pi}(s) = \underset{a \sim \pi}E[{Q^{\pi}(s,a)]} + \alpha H\left(\pi(\cdot|s)\right) Vπ(s)=a∼πE[Qπ(s,a)]+αH(π(⋅∣s)) Q π Q^\pi Qπ的Bellman方程为: Q π ( s , a ) = E s ′ ∼ P , a ′ ∼ π [ R ( s , a , s ′ ) + γ ( Q π ( s ′ , a ′ ) + α H ( π ( ⋅ ∣ s ′ ) ) ) ] = E s ′ ∼ P [ R ( s , a , s ′ ) + γ V π ( s ′ ) ] . \begin{aligned}Q^{\pi}(s,a) &=\underset{s' \sim P,a' \sim \pi}E\bigg[{R(s,a,s') + \gamma\left(Q^{\pi}(s',a') + \alpha H\left(\pi(\cdot|s')\right) \right)}\bigg] \\ &= \underset{s' \sim P}E\bigg[{R(s,a,s') + \gamma V^{\pi}(s')}\bigg]. \end{aligned} Qπ(s,a)=s′∼P,a′∼πE[R(s,a,s′)+γ(Qπ(s′,a′)+αH(π(⋅∣s′)))]=s′∼PE[R(s,a,s′)+γVπ(s′)].
我们在熵调整后的设置中设置值函数的方式有些随意,实际上我们可以做得不同(例如,使 Q π Q^\pi Qπ在第一时间步长包括熵奖励)。 关于该主题的论文,定义的选择可能略有不同。
Soft Actor-Critic
SAC同时学习一个策略 π θ \pi_\theta πθ,两个Q-function Q ϕ 1 , Q ϕ 2 Q_{\phi_1},Q_{\phi_2} Qϕ1,Qϕ2,现在有两种SAC的标准版本:一种使用一个固定的熵正则系数 α \alpha α,另一种用一个熵的限制通过在训练过程中正在变化的 α \alpha α.出于简单,Spiningup使用一个固定熵正则的系数,但是一般地实践者更喜欢用限制熵的那个版本.
经过一些时间,SAC算法有些改变,老版本的sac除了Q-functions之外学习一个值函数 V ψ V_{\psi} Vψ;接下来会聚焦于当前版本,即不用额外的值函数.
学习Q.
Q-functions的学习与TD3的相似,但有某些关键地方不同.
相同点:
1.类似TD3, Q-functins都是通过对一个共同目标的回归,用MSBE最小化来学习的.
2.类似TD3,共同的目标使用目标Q-网络计算的,同时目标Q-网络在训练过程中通过polyak averaging Q-网络的参数而得到.
3.类似TD3,共同的目标使用 the clipped doube-Q技巧.
不同点:
1.不同于TD3,目标包含一项从SAC的熵正则项.
2.不同于TD3,下一个状态的动作不是从目标target策略得来的,而是从当前current策略得来的.
3.不同于TD3,它没有明确的目标策略平滑.TD3修炼一个确定性策略,所以它通过加入随机噪声到下一个状态的动作来达到平滑的效果.SAC训练一个随机策略,所以从概率随机性而来的噪声足以获得一个类似的效果.
在我们构建Q-loss之前,讨论一下熵正则的贡献是怎么产生的.我们考虑之前熵正则的
Q
π
Q^\pi
Qπ从循环的Bellman方程开始,用熵定义重写:
Q
π
(
s
,
a
)
=
E
s
′
∼
R
,
a
′
∼
π
[
R
(
s
,
a
,
s
′
)
+
γ
(
Q
π
(
s
′
,
a
′
)
+
α
H
(
π
(
⋅
∣
s
′
)
)
)
]
=
E
s
′
∼
P
,
a
′
∼
π
[
R
(
s
,
a
,
s
′
)
+
γ
(
Q
π
(
s
′
,
a
′
)
−
α
l
o
g
π
(
a
′
∣
s
′
)
)
]
\begin{aligned}Q^\pi(s,a) &=\underset{s'\sim R,a'\sim\pi}E\bigg[ R(s,a,s')+\gamma\bigg(Q^\pi(s',a')+\alpha H(\pi(\cdot|s'))\bigg)\bigg] \\ & = \underset{s'\sim P,a'\sim\pi}E\bigg[ R(s,a,s')+\gamma\bigg( Q^\pi(s',a')-\alpha log\pi(a'|s')\bigg) \bigg] \end{aligned}
Qπ(s,a)=s′∼R,a′∼πE[R(s,a,s′)+γ(Qπ(s′,a′)+αH(π(⋅∣s′)))]=s′∼P,a′∼πE[R(s,a,s′)+γ(Qπ(s′,a′)−αlogπ(a′∣s′))]
RHS是对下一个状态(来自缓冲区)和下一个操作(来自当前current策略,而不是缓冲区)的期望。因为它是一个期望,我们能用样本来近似它:
Q
π
(
s
,
a
)
≈
r
+
γ
(
Q
π
(
s
′
,
a
~
′
)
−
α
l
o
g
π
(
a
~
′
∣
s
′
)
)
,
a
~
′
∼
π
(
⋅
∣
s
′
)
.
Q^\pi(s,a)\approx r+\gamma(Q^\pi(s',\tilde a')-\alpha log \pi(\tilde a'|s')),\ \ \tilde a'\sim\pi(\cdot|s').
Qπ(s,a)≈r+γ(Qπ(s′,a~′)−αlogπ(a~′∣s′)), a~′∼π(⋅∣s′).
>用
a
~
′
\tilde a'
a~′ 表示下一个动作,而不是
a
′
a'
a′,即接下来的动作必须从当前策略中重新算出(对比之下,
r
和
s
′
r\ 和\ s'
r 和 s′是从缓存中得到).
SAC用这种样本对target的近似即对每个Q-function设置MSBE loss,这里唯一还不确定的是使用哪个Q函数来计算样本backup:类似TD3,SAC使用clipped double-Q技巧,以及在两个Q的近似中取最小的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, {\mathcal D}) =\underset{(s,a,r,s',d) \sim {\mathcal D}}{{\mathrm E}}\Bigg[\bigg( Q_{\phi_i}(s,a)-y(r,s',d)\bigg)^2\Bigg],
L(ϕi,D)=(s,a,r,s′,d)∼DE[(Qϕi(s,a)−y(r,s′,d))2],其中目标为:
y
(
r
,
s
′
,
d
)
=
r
+
γ
(
1
−
d
)
(
m
i
n
j
=
1
,
2
Q
ϕ
t
a
r
g
,
j
(
s
′
,
a
~
′
)
−
α
l
o
g
π
θ
(
a
~
′
∣
s
′
)
)
,
a
~
′
∼
π
θ
(
⋅
∣
s
′
)
.
y(r,s',d)=r+\gamma(1-d)\bigg(\underset{j=1,2}{min}Q_{\phi_{targ,j}}(s',\tilde a')-\alpha log\pi_\theta(\tilde a'|s')\bigg),\ \tilde a'\sim\pi_\theta(\cdot|s').
y(r,s′,d)=r+γ(1−d)(j=1,2minQϕtarg,j(s′,a~′)−αlogπθ(a~′∣s′)), a~′∼πθ(⋅∣s′).
学习策略。
在每个状态中,策略应该以未来回报的期望加上未来熵的期望的最大化去选择动作。即它应最大化 V π ( s ) V^\pi(s) Vπ(s),我们能将其扩展进: V π ( s ) = E a ∼ π [ Q π ( s , a ) + α H ( π ( ⋅ ∣ s ) ) ] = E a ∼ π [ Q π ( s , a ) − α log π ( a ∣ s ) ] . \begin{aligned}V^{\pi}(s) &= \underset{a \sim \pi} E[{Q^{\pi}(s,a)} + \alpha H\left(\pi(\cdot|s)\right)] \\ &= \underset{a \sim \pi}E[{Q^{\pi}(s,a) - \alpha \log \pi(a|s)}].\end{aligned} Vπ(s)=a∼πE[Qπ(s,a)+αH(π(⋅∣s))]=a∼πE[Qπ(s,a)−αlogπ(a∣s)].我们优化策略的方法利用了重新参数化技巧,其中通过计算状态、策略参数和独立噪声的确定性函数从 π θ ( ⋅ ∣ 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).
该策略与我们在其他策略优化算法中使用的策略有两个主要区别:
1.压缩函数。 SAC策略中的 tanh可确保将动作限制在有限范围内。 VPG,TRPO和PPO策略中没有此功能。 它还会改变分布:在 tanh 之前,SAC策略像其他算法的策略一样是factored Gaussian,但在 tanh之后却不是。 (不过,您仍然可以以相近的形式计算动作的对数概率:有关详细信息,请参见文章附录。)
2.标准偏差的参数化方式。 在VPG,TRPO和PPO中,我们用与状态无关的参数向量表示log std devs(对数标准差)。 在SAC中,我们将对数标准差表示为神经网络的输出,这意味着它们以复杂的方式依赖状态。 根据我们的经验,具有独立于状态的对数标准差的SAC是无效的。 (您能想到原因吗?或者最好:进行实验以进行验证?)
重新参数化技巧使我们可以将对动作的期望(包含一个痛点:分布取决于策略参数)重写进对噪声的期望(这消除了痛点:现在分布不依赖参数): 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ξ∼N[Qπθ(s,a~θ(s,ξ))−αlogπθ(a~θ(s,ξ)∣s)]为了得到策略损失,最后一步是我们需要用我们的函数近似器替代 Q π θ Q^{\pi_{\theta}} Qπθ。 与TD3不同(它用 Q ϕ 1 Q_{\phi_1} Qϕ1,即第一个Q近似器),SAC使用 m i n j = 1 , 2 Q ϕ j \underset{j=1,2}{min}{Q_{\phi_j}} j=1,2minQϕj(即两个Q近似中最小的)。 因此,策略的优化根据 max θ E s ∼ D , ξ ∼ N [ m i n j = 1 , 2 Q ϕ j ( s , a ~ θ ( s , ξ ) ) − α log π θ ( a ~ θ ( s , ξ ) ∣ s ) ] , \max_{\theta} E_{s \sim \mathcal{D} , \xi \sim \mathcal{N}}\bigg[{\underset{j=1,2}{min}{Q_{\phi_j}}(s,\tilde{a}_{\theta}(s,\xi)) - \alpha \log \pi_{\theta}(\tilde{a}_{\theta}(s,\xi)|s)}\bigg], θmaxEs∼D,ξ∼N[j=1,2minQϕj(s,a~θ(s,ξ))−αlogπθ(a~θ(s,ξ)∣s)],除了min-double-Q技巧,随机性和熵项外,它与DDPG和TD3策略优化几乎相同。
Exploration vs. Exploitation
SAC通过熵正则化训练随机策略,并以on-policy方式进行探索。 熵正则化系数 α \alpha α明确控制探索-利用权衡,较高的 α \alpha α对应于更多的探索,而较低的 α \alpha α对应于更多的利用。 正确的系数(导致学习最稳定/最高奖励的系数)可能因环境而异,可能需要仔细调整。
在测试时,要查看该策略如何充分利用其所学知识,我们将消除随机性,并使用均值动作而不是分布中的一个样本。 这往往会提高原始随机策略的性能。
在训练开始时,我们的SAC使用了一个技巧来改善探索。 对于开始时有固定数量的步骤(使用start_steps关键字参数设置),代理将执行动作,这些动作是从均匀随机分布的有效动作中采样的。 之后,它将恢复为正常的SAC探索。
Pseudocode
## 之前的版本
## 动作离散型
Documentation
spinup.sac(env_fn, actor_critic=, ac_kwargs={}, seed=0, steps_per_epoch=5000, epochs=100, replay_size=1000000, gamma=0.99, polyak=0.995, lr=0.001, alpha=0.2, batch_size=100, start_steps=10000, max_ep_len=1000, logger_kwargs={}, save_freq=1)
Parameters:
- env_fn – A function which creates a copy of the environment. The environment must satisfy the OpenAI Gym API.
- actor_critic – A function which takes in placeholder symbols for state, x_ph, and action, a_ph, and returns the main outputs from the agent’s Tensorflow computation graph:
- ac_kwargs (dict) – Any kwargs appropriate for the actor_critic function you provided to SAC.
- seed (int) – Seed for random number generators.
- steps_per_epoch (int) – Number of steps of interaction (state-action pairs) for the agent and the environment in each epoch.
- epochs (int) – Number of epochs to run and train agent.
- replay_size (int) – Maximum length of replay buffer.
- gamma (float) – Discount factor. (Always between 0 and 1.)
- polyak (float) – Interpolation factor in polyak averaging for target networks. Target networks are updated towards main networks according to: θ t a r g ← ρ θ t a r g + ( 1 − ρ ) θ \theta_{targ}\leftarrow\rho\theta_{targ}+(1-\rho)\theta θtarg←ρθtarg+(1−ρ)θwhere ρ \rho ρ is polyak. (Always between 0 and 1, usually close to 1.)
- lr (float) – Learning rate (used for both policy and value learning).
- alpha (float) – Entropy regularization coefficient. (Equivalent to inverse of reward scale in the original SAC paper.)
- batch_size (int) – Minibatch size for SGD.
- start_steps (int) – Number of steps for uniform-random action selection, before running real policy. Helps exploration.
- max_ep_len (int) – Maximum length of trajectory / episode / rollout.
- logger_kwargs (dict) – Keyword args for EpochLogger.
- save_freq (int) – How often (in terms of gap between epochs) to save the current policy and value function.