策略梯度的简明介绍
本文旨在为强化学习 - 策略梯度中最重要的一类控制算法提供简明而全面的介绍。我将在进展中讨论这些算法,从头到尾得出众所周知的结果。它针对的是具有合理背景的读者,以及机器学习中的其他任何主题。
介绍
强化学习(RL)指的是学习问题和机器学习的子领域,近来出于很多原因而出现在新闻中。基于RL的系统现在已经打败Go的世界冠军,帮助更好地操作数据中心并掌握各种各样的Atari游戏。研究界看到许多更有前途的结果。有足够的动力,让我们现在看看强化学习问题。
强化学习是对学习问题的最一般的描述,其目的是最大化长期目标。系统描述包括一个代理,该代理通过其在不连续时间步骤的行为与环境交互并获得奖励。这将代理转换为新状态。典型代理 - 环境反馈回路如下图所示。
学习问题的强化学习风格与人类如何有效表现行为惊人地相似 - 体验世界,积累知识并利用学习来处理新情况。
背景和定义
RL背后的大量理论都是建立在奖励假设的基础上的,这个假设概括地说,一个代理的所有目标和目的都可以用一个叫做奖励的标量来解释。更正式地说,奖励假设如下
奖励假设:所有我们所说的目标和目标都可以被认为是所接收标量信号(称为奖励)的累积和的期望值的最大化。
作为一个RL的实践者和研究者,一个人的工作是为一个给定的问题找到一套合适的奖励,这个问题被称为奖励塑造。
代理必须通过一个称为马尔可夫决策过程的理论框架进行正式工作,该决策过程由在每个状态下要做出的决策(要采取什么行动?)组成。这就产生了一系列的状态,行为和奖励被称为轨迹,
目标是最大化这套奖励。更正式的,我们看看马尔科夫决策过程框架。
马尔可夫决策过程:(Discounted)马尔可夫决策过程(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给出的。这当然不在你的(代理)控制之下。
但是,如果您以某种方式了解环境的动态,并朝着除北,东,西或南以外的方向移动,该怎么办。该策略是代理控制的。当代理遵循策略π时,它会产生称为轨迹的状态,行为和奖励顺序。
策略:策略被定义为给定状态的行为的概率分布
策略梯度
强化学习代理的目标是在遵循策略π时最大化“预期”奖励。像任何机器学习设置一样,我们定义一组参数θ(例如复杂多项式的系数或神经网络中单位的权重和偏差)来参数化这个策略 - π_θ(为简洁起见也写成π)。如果我们将给定轨迹τ的总回报表示为r(τ),我们得出以下定义。
强化学习目标:根据参数化策略最大化“预期”奖励
所有有限的MDPs至少有一个最优策略(可以给出最大的奖励),在所有最优策略中,至少有一个是平稳和确定性的。
像任何其他机器学习的问题,如果我们能找到参数θ⋆最大化J,我们会解决这个任务。解决机器学习文献中这种最大化问题的标准方法是使用梯度上升(或下降)。在梯度上升中,我们使用以下更新规则不断地遍历参数
挑战来了,我们如何找到包含期望的目标的梯度。积分在计算环境中总是不好的。我们需要找到绕过他们的办法。第一步是从期望的扩展开始重新构造梯度
策略梯度定理:期望回报的导数是策略π_θ对数的回报和梯度乘积的 期望值
现在,让我们扩展π_θ(τ)的定义
为了理解这个计算,让我们把它分解下来 - P代表在某些状态s_ 0 开始的遍历分布。从那时起,我们应用概率乘积法则,因为每个新的行动概率都与前一个概率无关(还记得马尔可夫吗?)。在每一步中,我们采取用策略有所行动π_θ和环境动态p决定哪些新的状态过渡到。这些乘以T时间步长表示轨迹的长度。等同地,取得日志,我们有
这个结果本身很美,因为这告诉我们,我们并不需要知道状态P的遍历分布和环境动力学p。这是至关重要的,因为对于大多数实际目的来说,很难对这两个变量进行建模 摆脱他们,当然是很好的进展。因此,所有使用此结果的算法都被称为“无模型算法 ”,因为我们不会“模拟”环境。
“期望”(或者相当于一个积分项)仍然存在。一个简单而有效的方法是对大量轨迹进行采样并将其平均。这是一个近似值,但是是一个没有偏差的值,类似于近似在连续空间上的一个积分,其中有一组离散的点。这种技术在形式上被称为马尔可夫链蒙特卡罗(MCMC),广泛用于概率图形模型和贝叶斯网络来近似参数概率分布。
我们以上处理中未被触及的一个术语是对轨迹r(τ)的奖励。即使参数化策略的梯度不依赖于奖励,该术语也会在MCMC采样中增加很多方差。实际上,每个R_t都有T个方差来源。然而,我们可以使用回报G_t,因为从优化RL目标的角度来看,过去的回报没有任何贡献。因此,如果用折现回报G_t代替r(τ),我们得到经典算法Policy Gradient算法,称为REINFORCE。随着我们进一步讨论,这并不能完全缓解这个问题。
REINFORCE (and Baseline)
重申一下,REINFORCE算法计算策略梯度为
REINFORCE Gradient
我们仍然没有解决采样轨迹中的方差问题。解决此问题的一种方法是重新设计上面定义的RL目标,即极大似然估计(Maximum Likelihood Estimate)。在MLE设置中,众所周知,数据压倒了以前 - 简单地说,无论初始估计多么糟糕,在数据极限内,模型都会收敛到真实参数。然而,在数据样本具有高方差的情况下,稳定模型参数可能是非常困难的。在我们的情况下,任何不稳定的轨迹都可能导致策略分配出现次优的转变。奖励的规模加剧了这个问题。
因此,我们试着通过引入另一个称为基线b的变量来优化奖励的差异。为了保持梯度估计无偏差,基线独立于策略参数。
基线增强(REINFORCE with Baseline)
要知道为什么,我们必须证明梯度与附加项保持不变
在理论和实践中使用基线可以减少方差,同时保持梯度仍然无偏。一个好的基准是使用状态值当前状态。
状态值:状态值被定义为在策略π_θ之后给定状态的预期回报 。
Actor-Critic方法
找到一个好的基线本身就是另一个挑战,并计算它的另一个挑战。相反,让我们使用参数ω来近似以得到V ^ω_(s)。所有使用可学习的V ^ω_(s)来引导梯度的算法被称为Actor-Critic算法,因为这个值函数估计像“actor”(代理策略)对“ critic”(good v/s bad values) 。然而这一次,我们必须计算actor 和critic的梯度。
One-Step Bootstrapped Return:单步引导回报获取即时回报,并通过使用轨迹中下一状态的引导值估计来估计回报。
Actor-Critic策略梯度
不言而喻,我们还需要更新critic的参数ω。这里的目标通常被认为是均方损失(或较不严重的Huber损失)并且使用随机梯度下降来更新参数。
Critic’的目标
确定性策略梯度
很多时候,在机器人技术中,可用的可控制策略是可用的,但这些行为不是随机的。在这样的环境下,很难像以前看到的那样建立随机策略。一种方法是将噪声注入控制器。更重要的是,随着控制器越来越多的维度,先前看到的算法开始变差。由于这样的场景,我们不是直接学习大量的概率分布,而是直接了解给定状态的确定性行为。因此,以最简单的形式,贪婪的最大化目标就是我们所需要的
确定性行为
然而,对于大多数实际目的而言,这种最大化操作在计算上是不可行的(因为没有其他方式比在整个空间中搜索给定的动作值函数)。相反,我们可以期望做的是构建一个函数逼近器来逼近这个argmax,因此称为确定性策略梯度(DPG)。
我们用下面的等式来总结这一点。
DPG目标
确定性策略梯度
这个数值变成了我们可以用MCMC抽样再次估计的另一个期望值。
通用强化学习框架
现在我们可以得到一个通用的算法,看看我们所学到的所有部分是如何结合在一起的。所有新算法通常都是下面给出的算法的变体
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
Code
对于熟悉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()
深层确定性策略梯度
# 从轨迹获取动作的Q值
current_q = self.critic(obs_tensor, action_tensor)
# 获取目标Q值
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()