策略梯度算法简介
本文旨在简要而全面地介绍强化学习中最重要的一类控制算法——策略梯度。 我将逐步讨论这些算法,从头开始得出众所周知的结果。 它面向对机器学习中的任何其他主题具有合理背景的读者。 到最后,我希望你能够大量阅读(如果不是全部)强化学习文献。
1、介绍
强化学习 (RL) 是学习问题和机器学习的子领域,最近有很多原因出现在新闻中。 基于 RL 的系统现在已经击败了围棋世界冠军,帮助更好地运营数据中心并掌握了各种 Atari 游戏。 研究界正在看到许多更有希望的结果。 有了足够的动力,现在让我们来看看强化学习问题。
强化学习是对学习问题的最一般描述,其目的是最大化长期目标。 系统描述由一个代理组成,该代理通过其在离散时间步长的动作与环境交互并获得奖励。 这会将代理转换为新状态。 下图描述了典型的代理-环境反馈回路。
学习问题的强化学习风格与人类有效行为的方式惊人地相似——体验世界、积累知识并利用所学知识来处理新情况。 像许多人一样,问题的这种吸引人的性质(尽管更难表述)让我兴奋,并希望它也能激发你的兴趣。
2、背景和定义
RL 背后的大量理论都基于奖励假设,该假设概括地说,代理的所有目标和目的都可以用一个称为奖励的标量来解释。 这仍然存在争议,但很难反驳。 更正式地说,奖励假设如下:
奖励假设:我们所说的目标和目的的所有含义都可以很好地理解为接收到的标量信号(称为奖励)的累积和的期望值的最大化。
作为 RL 从业者和研究人员,一个人的工作是为给定的问题找到正确的奖励集,称为奖励塑造。
代理必须通过称为马尔可夫决策过程的理论框架正式工作,该框架由在每个状态下做出的决定(采取什么行动?)组成。 这会产生一系列状态、动作和奖励,称为轨迹,
目标是最大化这组奖励。 更正式地说,我们看看马尔可夫决策过程框架。
马尔可夫决策过程:(折扣)马尔可夫决策过程(MDP)是一个元组(S,A,R,p,γ),使得:
其中 S_t , S_(t+1) ∈ S(状态空间), A_(t+1) ∈ A(动作空间), R_(t+1) , R_t ∈ R(奖励空间), p 定义过程的动态,G_t 是贴现回报。
简而言之,MDP 定义了转换到新状态的概率,在给定当前状态和执行动作的情况下获得一些奖励的概率。 这个框架在数学上令人愉悦,因为它是一阶马尔可夫。 这只是一种奇特的说法,即接下来发生的任何事情都只取决于现在而不是过去。 一个人如何到达当前状态并不重要,只要一个人到达即可。 该框架的另一个重要部分是折扣因子 γ。 随着时间的推移,将这些奖励与未来奖励的不同程度的重要性相加,得出贴现回报的概念。 正如人们可能预料的那样,较高的 γ 会导致对未来奖励的更高敏感性。 然而,γ=0 的极端情况根本不考虑来自未来的奖励。
环境 p 的动态不在代理的控制范围内。 为了内化这一点,想象一下站在多风环境中的田野上,每秒朝四个方向之一迈出一步。 风力如此之大,以至于你很难沿着与北、东、西或南完全对齐的方向移动。 这种在下一秒以新状态着陆的概率由风场的动力学 p 给出。 它肯定不在你(代理)的控制范围内。
但是,如果你以某种方式了解环境的动态并朝北、东、西或南以外的方向移动,会怎样呢? 这个策略是代理控制的。 当代理遵循策略 π 时,它会生成状态、动作和奖励的序列,称为轨迹。
策略:策略被定义为给定状态下动作的概率分布
考虑到所有这些定义,让我们看看 RL 问题的形式。
2、策略梯度
强化学习代理的目标是在遵循策略 π 时最大化“预期”奖励。 与任何机器学习设置一样,我们定义了一组参数 θ(例如复数多项式的系数或神经网络中单元的权重和偏差)来参数化此策略 — π_θ (为简洁起见也写为 π)。 如果我们将给定轨迹 τ 的总奖励表示为 r(τ),我们将得出以下定义。
强化学习目标:根据参数化策略最大化“预期”奖励
所有有限的 MDP 都有至少一个最优策略(可以提供最大奖励)并且在所有最优策略中至少有一个是固定的和确定性的。
像任何其他机器学习问题一样,如果我们能找到使 J 最大化的参数 θ⋆,我们就解决了这个任务。 在机器学习文献中解决这个最大化问题的标准方法是使用梯度上升(或下降)。 在梯度上升中,我们使用以下更新规则不断遍历参数
这里的挑战是我们如何找到上面包含期望的目标的梯度。 积分在计算环境中总是不好的。 我们需要找到绕过它们的方法。 第一步是从期望的扩展开始重新制定梯度(略微滥用符号)。
策略梯度定理:期望奖励的导数是策略π_θ 的对数的梯度与奖励的乘积的期望。
现在,让我们展开 π_θ (τ) 的定义。
为了理解这个计算,让我们把它分解——P 表示从某个状态 s_0 开始的遍历分布。 从那时起,我们应用概率乘积规则,因为每个新动作概率都独立于前一个(还记得马尔可夫吗?)。 在每一步,我们都会使用策略 π_θ 和环境动态 p 采取一些行动来决定要转换到哪个新状态。 这些乘以代表轨迹长度的 T 个时间步长。 等价地,取对数,我们有
这个结果本身就很漂亮,因为这告诉我们,我们真的不需要知道状态 P 的遍历分布或环境动态 p。 这一点至关重要,因为对于大多数实际用途而言,很难对这两个变量进行建模。 摆脱它们,当然是好的进步。 因此,所有使用该结果的算法都被称为“无模型算法”,因为我们不对环境进行“建模”。
“期望”(或等效的一个整体术语)仍然存在。 一种简单但有效的方法是对大量轨迹进行采样(我的意思是大!)并将它们取平均。 这是一种近似但无偏的近似,类似于用域中的一组离散点近似连续空间上的积分。 这种技术的正式名称为马尔可夫链蒙特卡洛 (MCMC),广泛用于概率图形模型和贝叶斯网络以近似参数概率分布。
在我们上面的处理中保持不变的一个术语是轨迹 r(τ) 的奖励。 即使参数化策略的梯度不依赖于奖励,这个术语在 MCMC 采样中增加了很多方差。 实际上,有 T 个方差来源,每个 R_t 都有贡献。 然而,我们可以改为使用回报 G_t ,因为从优化 RL 目标的角度来看,过去的回报没有任何贡献。 因此,如果我们将 r(τ) 替换为贴现收益 G_t ,我们就会得到称为 REINFORCE 的经典算法策略梯度算法。 当我们进一步讨论时,这并不能完全缓解问题。
3、强化(和基线)
重申一下,REINFORCE 算法将策略梯度计算为
强化梯度:
我们仍然没有解决采样轨迹的方差问题。 实现该问题的一种方法是将上面定义的 RL 目标重新想象为似然最大化(最大似然估计)。 在 MLE 设置中,众所周知,数据压倒了先验——简单来说,无论初始估计多么糟糕,在数据的限制下,模型都会收敛到真实参数。 然而,在数据样本具有高方差的设置中,稳定模型参数可能非常困难。 在我们的背景下,任何不稳定的轨迹都可能导致政策分布发生次优转变。 奖励的规模加剧了这个问题。
因此,我们改为尝试通过引入另一个称为基线 b 的变量来优化奖励的差异。 为了保持梯度估计无偏,基线独立于策略参数。
有基线的强化:
要了解原因,我们必须证明附加项的梯度保持不变(略微滥用符号)。
使用基线,在理论和实践中都可以减少方差,同时保持梯度仍然无偏。 一个好的基线是使用状态值当前状态。
状态值:状态值定义为给定一个状态遵循策略 π_θ 的预期回报。
4、演员-评论家方法
找到一个好的基线本身就是另一个挑战,计算它又是另一个挑战。 相反,让我们也使用参数 ω 来近似计算 V^ω_(s)。 我们使用可学习的 V^ω_(s) 自举梯度的所有算法都被称为 Actor-Critic 算法,因为这个价值函数估计对“演员”(代理人的政策)表现得像一个“批评家”(好的 v/s 坏的值) . 然而这一次,我们必须计算演员和评论家的梯度。
单步自举回报:单步自举回报采用直接奖励,并通过使用轨迹中下一状态的自举价值估计来估计回报。
Actor-Critic 策略梯度
不用说,我们还需要更新评论家的参数 ω。 那里的目标通常被认为是均方损失(或不太苛刻的 Huber 损失)和使用随机梯度下降更新的参数。
评论家的目标:
5、确定性策略梯度
通常,在机器人技术中,可微分控制策略是可用的,但动作不是随机的。 在这样的环境中,很难建立如前所述的随机策略。 一种方法是将噪声注入控制器。 此外,随着控制器维数的增加,之前看到的算法开始表现更差。 由于这种情况,让我们直接学习给定状态的确定性动作,而不是学习大量的概率分布。 因此,在最简单的形式中,我们需要一个贪婪的最大化目标
确定性行动:
然而,对于大多数实际用途,这种最大化操作在计算上是不可行的(因为除了为给定的动作价值函数搜索整个空间之外别无他法)。 相反,我们可以渴望做的是,构建一个函数逼近器来逼近这个 argmax,因此称为确定性策略梯度 (DPG)。
我们将其总结为以下等式。
DPG目标:
确定性策略梯度:
这个值变成了我们可以再次使用 MCMC 抽样估计的另一个期望,这已经不足为奇了。
6、通用强化学习框架
我们现在可以得出一个通用算法来查看我们所学的所有部分在哪里组合在一起。 所有新算法通常都是下面给出的算法的变体,试图攻击问题的一个(或多个)步骤。
Loop:
Collect trajectories (transitions - (state, action, reward, next state, terminated flag))
(Optionally) store trajectories in a replay buffer for sampling
Loop:
Sample a mini batch of transitions
Compute Policy Gradient
(Optionally) Compute Critic Gradient
Update parameters
7、代码
对于熟悉 Python 的读者来说,这些代码片段旨在更具体地体现上述理论思想。 这些已经脱离了真实代码的学习循环。
策略梯度(同步 Actor-Critic):
# Compute Values and Probability Distribution
values, prob = self.ac_net(obs_tensor)
# Compute Policy Gradient (Log probability x Action value)
advantages = return_tensor - values
action_log_probs = prob.log().gather(1, action_tensor)
actor_loss = -(advantages.detach() * action_log_probs).mean()
# Compute L2 loss for values
critic_loss = advantages.pow(2).mean()
# Backward Pass
loss = actor_loss + critic_loss
loss.backward()
深度确定性策略梯度:
# Get Q-values for actions from trajectory
current_q = self.critic(obs_tensor, action_tensor)
# Get target Q-values
target_q = reward_tensor + self.gamma * self.target_critic(next_obs_tensor, self.target_actor(next_obs_tensor))
# L2 loss for the difference
critic_loss = F.mse_loss(current_q, target_q)
critic_loss.backward()
# Actor loss based on the deterministic action policy
actor_loss = - self.critic(obs_tensor, self.actor(obs_tensor)).mean()
actor_loss.backward()
完整的实现可以在 activatedgeek/torchrl 查看。
原文链接:Policy Gradients in a Nutshell
BimAnt翻译整理,转载请标明出处