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
熵是一个可以粗略地说出随机变量的随机性的量。 如果对硬币进行加权,使其几乎总是出现正面,那么它的熵就很低。 如果权重均等并且有一半机会出现任一结果,则它具有很高的熵。
令为随机变量,服从密度函数。的熵为:在正则熵的强化学习中,代理在每个时间步都获得与该时间步的策略熵成正比的奖金奖励。 这会将RL问题更改为:其中是平衡系数。(请注意:我们在这里假定了无限步长的折扣设置,此页面的其余部分中也执行相同的操作。)现在,我们可以在此设置中定义稍有不同的值函数。每个时间步骤的改变都包含熵奖励:除了第一次,的改变也包含熵奖励:有了这些定义,以下面的方式连接:的Bellman方程为:
我们在熵调整后的设置中设置值函数的方式有些随意,实际上我们可以做得不同(例如,使在第一时间步长包括熵加)。 关于该主题的论文,定义的选择可能略有不同。
Soft Actor-Critic
SAC同时学习一个策略,两个Q-function ,以及一个值函数
- 学习Q. Q-functions用MSBE最小化来学习,使用一个从Bellman方程来的目标值网络(target value network)。他们都用同样的目标(就像TD3里面),有损失函数:目标值网络(就像DDPG和TD3的目标网络那样)在训练的时候通过ployak平均化值网络参数。
- 学习V. 值函数的学习通过(通过基于样板的近似)挖掘之间的联系。在我们谈论学习规则之前,先通过使用熵定义重写联系方程:RHS是对行动的期望,因此我们可以通过从策略中进行抽样来近似得出:SAC基于这个近似给设置了一个均方根误差损失。但是我们用什么Q-值呢?SAC使用像TD3学习值函数那样的 clipped double-Q ,还有取两个近似器的最小 Q-值。因此,值函数参数的SAC损失为:重要的是,这里我们不使用来自重放缓存的动作:这些动作是从当前策略版本中重新采样的。
- 学习策略。在每个状态中,策略应该以未来回报的期望加上未来熵的期望的最大化去选择动作。即它应最大化,我们能将其扩展进:我们优化策略的方法利用了重新参数化技巧,其中通过计算状态、策略参数和独立噪声的确定性函数从中抽取样本。 为了说明:按照SAC论文的作者,我们用一个压缩的高斯策略,这意味着根据以下取样:
该策略与我们在其他策略优化算法中使用的策略有两个主要区别:
1.挤压函数。 SAC策略中的 tanh可确保将动作限制在有限范围内。 VPG,TRPO和PPO策略中没有此功能。 它还会改变分布:在 tanh 之前,SAC策略像其他算法的策略一样是因式高斯分解,但在 tanh之后却不是。 (不过,您仍然可以以封闭形式计算动作的对数概率:有关详细信息,请参见文章附录。)
2.标准偏差的参数化方式。 在VPG,TRPO和PPO中,我们用与状态无关的参数向量表示log std devs。 在SAC中,我们将log std devs表示为神经网络的输出,这意味着它们以复杂的方式依赖状态。 根据我们的经验,具有独立于状态的log std devs的SAC是无效的。 (您能想到原因吗?或者最好:进行实验以进行验证?)
重新参数化技巧使我们可以将对动作的期望(包含一个痛点:分布取决于策略参数)重写为对噪声的期望(这消除了痛点:现在分布不依赖参数):为了避免策略损失,最后一步是我们需要用我们的函数近似器替代。 与TD3相同,我们使用。 因此,策略的优化根据除了随机性和熵项外,它与DDPG和TD3策略优化几乎相同。
Exploration vs. Exploitation
SAC通过熵正则化训练随机策略,并以on-policy方式进行探索。 熵正则化系数明确控制探索-利用权衡,较高的对应于更多的探索,而较低的对应于更多的利用。 正确的系数(导致学习最稳定/最高奖励的系数)可能因环境而异,可能需要仔细调整。
在测试时,要查看该策略如何充分利用其所学知识,我们将消除随机性,并使用均值动作而不是分布中的一个样本。 这往往会提高原始随机策略的性能。
在训练开始时,我们的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:where 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.