Soft-Actor-Critic-强化学习算法

Background

SAC算法,它以off-policy方式优化随机策略,从而在随机策略优化和DDPG方式之间建立了桥梁。 它不是TD3的直接后继者,但它包含了裁剪过的double-Q技巧,并且由于SAC策略固有的随机性,它还受益于诸如目标策略平滑之类的东西。

SAC的主要特征是熵正则化。 该策略经过训练,可以最大程度地在预期收益和熵之间进行权衡,熵是策略中随机性的一种度量。 这与勘探与开采的权衡关系密切:增加熵会导致更多的勘探,从而可以加快以后的学习速度。 它还可以防止策略过早收敛到不良的局部最优值。

Quick Facts

  • SAC是off-policy的
  • Spinningup 版本的SAC仅能用于连续动作空间的环境
  • 对策略更新规则的改变可以使SAC用于处理离散动作空间
  • Spinningup的SAC不能使用并行运算

Key Equations

为了解释“SAC”,我们首先必须介绍熵正则化的强化学习设置。 在熵正则化的RL中,值函数的方程式略有不同。

Entropy-Regularized Reinforcement Learning

熵是一个可以粗略地说出随机变量的随机性的量。 如果对硬币进行加权,使其几乎总是出现正面,那么它的熵就很低。 如果权重均等并且有一半机会出现任一结果,则它具有很高的熵。

xx为随机变量,服从密度函数PPxx的熵HH为:H(P)=ExP[logP(x)].H(P) = \underset{x \sim P}E[{-\log P(x)}].在正则熵的强化学习中,代理在每个时间步都获得与该时间步的策略熵成正比的奖金奖励。 这会将RL问题更改为:π=argmaxπEτπ[t=0γt(R(st,at,st+1)+αH(π(st)))],\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],其中α>0\alpha>0是平衡系数。(请注意:我们在这里假定了无限步长的折扣设置,此页面的其余部分中也执行相同的操作。)现在,我们可以在此设置中定义稍有不同的值函数。VπV^\pi每个时间步骤的改变都包含熵奖励:Vπ(s)=Eτπ[t=0γt(R(st,at,st+1)+αH(π(st)))s0=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]除了第一次,QπQ^\pi的改变也包含熵奖励: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}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]有了这些定义,Vπ and QπV^\pi\ and\ Q^\pi以下面的方式连接:Vπ(s)=Eaπ[Qπ(s,a)+αH(π(s))]V^{\pi}(s) = \underset{a \sim \pi}E\bigg[{Q^{\pi}(s,a)} + \alpha H\left(\pi(\cdot|s)\right)\bigg]QπQ^\pi的Bellman方程为:Qπ(s,a)=EsP,aπ[R(s,a,s)+γ(Qπ(s,a)+αH(π(s)))]=EsP[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πQ^\pi在第一时间步长包括熵加)。 关于该主题的论文,定义的选择可能略有不同。

Soft Actor-Critic

SAC同时学习一个策略πθ\pi_\theta,两个Q-function Qϕ1,Qϕ2Q_{\phi_1},Q_{\phi_2},以及一个值函数 Vψ.V_\psi.

  • 学习Q. Q-functions用MSBE最小化来学习,使用一个从Bellman方程来的目标值网络(target value network)。他们都用同样的目标(就像TD3里面),有损失函数:L(ϕi,D)=E(s,a,r,s,d)D[(Qϕi(s,a)(r+γ(1d)Vψtarg(s)))2].L(\phi_i, {\mathcal D}) = \underset{(s,a,r,s',d) \sim {\mathcal D}}{{\mathrm E}}\left[ \Bigg( Q_{\phi_i}(s,a) - \left(r + \gamma (1 - d) V_{\psi_{\text{targ}}}(s') \right) \Bigg)^2 \right].目标值网络(就像DDPG和TD3的目标网络那样)在训练的时候通过ployak平均化值网络参数。
  • 学习V. 值函数的学习通过(通过基于样板的近似)挖掘Qπ and VπQ^\pi\ and\ V^\pi之间的联系。在我们谈论学习规则之前,先通过使用熵定义重写联系方程:Vπ(s)=Eaπ[Qπ(s,a)+αH(π(s))]=Eaπ[Qπ(s,a)αlogπ(as)].\begin{aligned}V^{\pi}(s) &= E_{a \sim \pi}[{Q^{\pi}(s,a)} + \alpha H\left(\pi(\cdot|s)\right)] \\ &=E_{a \sim \pi}[{Q^{\pi}(s,a) - \alpha \log \pi(a|s)}]\end{aligned}.RHS是对行动的期望,因此我们可以通过从策略中进行抽样来近似得出:Vπ(s)Qπ(s,a~)αlogπ(a~s),          a~π(s).V^{\pi}(s) \approx Q^{\pi}(s,\tilde{a}) - \alpha \log \pi(\tilde{a}|s), \;\;\;\;\; \tilde{a} \sim \pi(\cdot|s).SAC基于这个近似给VψV_\psi设置了一个均方根误差损失。但是我们用什么Q-值呢?SAC使用像TD3学习值函数那样的 clipped double-Q ,还有取两个近似器的最小 Q-值。因此,值函数参数的SAC损失为:L(ψ,D)=EsD,a~πθ[(Vψ(s)(mini=1,2Qϕi(s,a~)αlogπθ(a~s)))2].L(\psi, {\mathcal D}) = E_{s \sim \mathcal{D}, \tilde{a} \sim \pi_{\theta}}\Bigg[{\Bigg(V_{\psi}(s) - \left(\min_{i=1,2} Q_{\phi_i}(s,\tilde{a}) - \alpha \log \pi_{\theta}(\tilde{a}|s) \right)\Bigg)^2}\Bigg].重要的是,这里我们不使用来自重放缓存的动作:这些动作是从当前策略版本中重新采样的。
  • 学习策略。在每个状态中,策略应该以未来回报的期望加上未来熵的期望的最大化去选择动作。即它应最大化Vπ(s)V^\pi(s),我们能将其扩展进:EaπQπ(s,a)αlogπ(as).E_{a \sim \pi}{Q^{\pi}(s,a) - \alpha \log \pi(a|s)}.我们优化策略的方法利用了重新参数化技巧,其中通过计算状态、策略参数和独立噪声的确定性函数从πθ(s)\pi_\theta(\cdot|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).

该策略与我们在其他策略优化算法中使用的策略有两个主要区别:
1.挤压函数。 SAC策略中的 tanh可确保将动作限制在有限范围内。 VPG,TRPO和PPO策略中没有此功能。 它还会改变分布:在 tanh 之前,SAC策略像其他算法的策略一样是因式高斯分解,但在 tanh之后却不是。 (不过,您仍然可以以封闭形式计算动作的对数概率:有关详细信息,请参见文章附录。)
2.标准偏差的参数化方式。 在VPG,TRPO和PPO中,我们用与状态无关的参数向量表示log std devs。 在SAC中,我们将log std devs表示为神经网络的输出,这意味着它们以复杂的方式依赖状态。 根据我们的经验,具有独立于状态的log std devs的SAC是无效的。 (您能想到原因吗?或者最好:进行实验以进行验证?)

重新参数化技巧使我们可以将对动作的期望(包含一个痛点:分布取决于策略参数)重写为对噪声的期望(这消除了痛点:现在分布不依赖参数):Eaπθ[Qπθ(s,a)αlogπθ(as)]=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)}]为了避免策略损失,最后一步是我们需要用我们的函数近似器替代QπθQ^{\pi_{\theta}}。 与TD3相同,我们使用Qϕ1Q_{\phi_1}。 因此,策略的优化根据maxθEsD,ξN[Qϕ1(s,a~θ(s,ξ))αlogπθ(a~θ(s,ξ)s)],\max_{\theta} E_{s \sim \mathcal{D} , \xi \sim \mathcal{N}}[{Q_{\phi_1}(s,\tilde{a}_{\theta}(s,\xi)) - \alpha \log \pi_{\theta}(\tilde{a}_{\theta}(s,\xi)|s)}],除了随机性和熵项外,它与DDPG和TD3策略优化几乎相同。

Exploration vs. Exploitation

SAC通过熵正则化训练随机策略,并以on-policy方式进行探索。 熵正则化系数α\alpha明确控制探索-利用权衡,较高的α\alpha对应于更多的探索,而较低的α\alpha对应于更多的利用。 正确的系数(导致学习最稳定/最高奖励的系数)可能因环境而异,可能需要仔细调整。

在测试时,要查看该策略如何充分利用其所学知识,我们将消除随机性,并使用均值动作而不是分布中的一个样本。 这往往会提高原始随机策略的性能。

在训练开始时,我们的SAC实施使用技巧来改善探索。 对于开始时有固定数量的步骤(使用start_steps关键字参数设置),代理将执行动作,这些动作是从均匀随机分布的有效动作中采样的。 之后,它将恢复为正常的SAC探索。

Pseudocode

Soft-Actor-Critic-强化学习算法

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:Soft-Actor-Critic-强化学习算法
  • 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:θtargρθtarg+(1ρ)θ\theta_{targ}\leftarrow\rho\theta_{targ}+(1-\rho)\thetawhere ρ\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.