强化学习:深度确定性策略梯度
介绍
本文概述了Udacity深强化学习Nanodegree的一个项目在reUNK环境的实施。在这个项目中,目标是训练一个有两个关节的acrobat手臂,以便跟踪一个气球。当气球移动时,两个关节调整为跟踪气球。这是一个经典的机器人问题,并且使用model-free强化学习,代理将学习最优策略。使用的方法是深度确定性策略梯度方法(DDPG)。
基于值的强化学习算法(如DQN)在许多领域都表有很好的表现。然而,它们仍局限于离散的动作空间环境和确定性策略(因为它们基本上基于确定性的贪婪策略,因为epsilon仅选择统一随机动作)。此外,使用基于值的方法,我们首先计算每个状态的value-function,并使用它来确定最佳策略。这是寻找最优策略的间接方式。
另一方面,使用基于策略的方法,我们直接找到产生最多回报的策略。策略梯度是更有效的基于策略的学习算法之一,其中我们直接计算关于策略参数的预期奖励的梯度。除此之外,它还适用于持续行动以及随机策略。其他基于策略的方法包括随机优化方法,如random shooting,交叉熵方法等。
我在下面列出了一些关于策略梯度方法的基础知识。本文将向读者介绍强化学习(RL)的基本目标,以及一些高级策略梯度算法,如强化, Actor-Critic, Advantage Actor-Critic, 确定性策略梯度和深度确定性策略梯度。为了全面理解,假设读者精通概率与统计,线性代数,向量微积分和基本强化学习术语。
强化算法
请注意,在下面的分析中,为简单起见,假设贴现因子γ为1。但是所有的分析都可以很容易地扩展到γ不是1的情况。
所有强化学习(RL)的基本目标是最大化预期的总效用Uθ,其定义如下:
可以证明Uθ等于Q的预期值(s 0,a 0)。如果初始状态分布是均匀的,则意味着RL中的目标是找到最大化所有可能的state-action对的q值的策略。
使用expectation的定义,上面的等式1a可以重写为:
使用Policy梯度方法,我们可以通过首先计算相对于θ的梯度来最大化Uθ,这可以很容易地导出为:
改善预期总奖励的一种方法是随机地将噪声添加到当前θ,如果它导致更好的总奖励,那么我们保留它,否则我们忽略它,并且我们不断重复这个过程。该方法称为random shooting方法。还有其他更复杂的方法,如交叉熵方法。所有这些方法都属于随机优化算法的范畴。然而,虽然这些方法实现起来非常简单,但它们效率不高,并且在高维空间下不能很好地扩展。更有效的方法是使用Stochastic Gradient Ascent在最大梯度方向上改变θ,如下所示:
使用上述梯度的基本策略梯度算法称为Reinforce算法,以下是它的工作原理:
基本强化算法:
从随机向量θ开始并重复以下直到收敛:
1.使用Pθ(at | st)收集m个轨迹{τ1,τ2,...,τm},其中每个轨迹如上所定义。
2.使用这些轨迹计算梯度的蒙特卡罗估计如下:
注意,上述估计有效的原因是因为轨迹是通过遵循所学习的策略生成的,即Pθ(τ) - 即它是一种策略上的算法。另一种说法是我们从概率分布Pθ(τ)中采样{τ1,τ2,...,τm}中的每个轨迹。
3.使用上述梯度估算更新策略网络的权重/参数:
强化算法背后的直觉是,如果总奖励是积极的,则在该轨迹中采取的所有动作都得到加强,而如果总奖励是否定的,那么在轨迹中采取的所有动作都被禁止。此外,为了计算效率,通常将m设置为1。
虽然优于随机优化方法,但是Reinforce算法存在一些缺点:
- 1.梯度估计相当嘈杂,特别是对于m = 1的情况,因为单个轨迹可能不代表策略。
- 2.没有明确的信用分配。轨迹可能包含很多好和差的动作,这些动作是否得到加强,这仅取决于从初始状态开始的总回报。
通过梯度的定义,∇θ指向Uθ的最大变化方向。然而,Reinforce算法的缺点是由于∇θ(ĝ)的蒙特卡罗估计具有高方差。如果我们可以减少其方差,那么我们对梯度estimate的估计将更接近真实梯度∇θ。
虽然蒙特卡罗估计的梯度ĝ是无偏的,但它表现出很大的方差。如下所述,有几种方法可以在不引入偏差的情况下减少方差:1)使用因果关系,2)使用基线。
Actor-Critic算法
减少方差的一种方法是利用因果关系:ĝ根据总奖励更新轨迹中的所有动作,而不是奖励。也就是说,未来的动作会影响过去的奖励,这在我们的因果宇宙中是不可能的。因此,我们可以通过使用奖励来使梯度估计更加真实,如下面的等式所示。
请注意,使用奖励而不是总奖励仍然是∇θUθ的无偏估计,因为因果关系是使用Pθ(τ)在等式3中的期望中处理的。此外,这样做会减少方差,因为表达的奖励与总奖励表达相比具有更少的terms(因此具有更低的不确定性)。
值得注意的一点是,要获得的回报实际上是对(sₜ,aₜ)的q值的估计。这是因为q值定义如下:
因此,如果从Pθ(τ)采样轨迹τ,那么QPθ(sₜ,aₜ)的单样本蒙特卡罗估计就是:
如上所示,我们可以使用state-action函数,使用奖励的one-step TD估计(使用较低的方差),而不是使用等式7中的奖励的蒙特卡洛估计。因此,公式7可以重写为:
如果Q hat Pθ(sₜ,aₜ)使用神经网络建模(由w参数化),那么我们得到:
请注意,因为state-action空间可以是非常高的维度,它很快就会遇到贝尔曼的维数诅咒; 因此,在具有复杂状态转移动力学的大多数实际情况中,使用基于神经网络的函数逼近器对QhatPθ(sₜ,aₜ)进行建模。
然后公式10可以重写为:
因此,Pθ(aₜ|sₜ)是由θ参数化的actor网络,而QhatPθ(sₜ,aₜ)是由w参数化的critic 网络。这就是所谓的actor-critic算法。
对于任何访问的state-action对(s,a),使用等式6(利用等式12中的ĝ)更新actor网络,并且通常使用Temporal-Difference学习来更新critic网络(由于其方差低于蒙特卡罗学习)使用以下更新等式:
由此更新权重向量w以减少损失L(w),其定义为:
并使用Q学习(critic基于off-policy算法):
所以
因此
这是actor-critic算法的基础知识。虽然有许多不同之处,但这是它的基本核心。
Advantage Actor-Critic算法
除了使用奖励(由于因果关系)之外,另一种最小化ĝ方差的方法是通过减去不依赖于θ或动作a的基线b - 并且该组合项被称为Advantage函数。可以在数学上证明这种变换不仅是无偏的,而且还可以减少方差。对其减少方差的原因的直观解释是因为term 乘以∇θlog(Pθ(a | s))具有较小的幅度,这实质上减少了整体表达的方差。
基线b有许多选择,理论上,也可以计算b的最佳值。然而,为了简单和直观,常用的基线是在所有动作上平均的q值,即state-value。
Advantage函数定义如下:
使用Advantage函数的基本思想是,在禁止其他动作的情况下,增强q值高于平均值(即状态值)的动作。这比原始的Reinforce算法中使用的梯度方程更直观。因此,它在数学上导致较低的方差并不奇怪。
上述等式的一个问题是,在实践中,很难计算出上述期望 - 特别是对于连续动作或高维动作空间。因此,状态值函数使用单独的神经网络建模,该网络由wᵥ参数化,如下所示:
Advantage函数现在变为:
这个advantage函数的问题是它需要两个独立的神经网络。通过一些巧妙的重新排序,我们可以使用单个神经网络重写Advantage函数。基本上,我们希望拥有的理想Advantage函数是:
如上面的等式8中所定义的, state-action值可以进一步简化为状态值函数的中间值,如下:
如上面的等式中定义的QPθ(sₜ,aₜ)的单样本蒙特卡罗估计是:
所以现在我们只需要使用由w parameter参数化的神经网络来表示状态值函数,如下所示:
因此,现在可以使用用w parameter参数化的单个神经网络来表示Advantage函数。注意上面的Advantage函数的等式,它实际上只是one-step TD误差(即TD(0)误差)。另外,还可以使用TD(λ)误差来表示它。
Advantage Actor Critic的梯度方程现在将是:
这将是对预期梯度的更好估计(公式3),即方差较小且仍然是无偏的,即使对于m = 1。因此,该算法将学得更快。
wᵥ更新如下:
使用one-step TD学习(即TD(0)):
使用来自等式29的梯度估计,Advantage函数的权重更新等式以及来自Reinforce算法的剩余步骤实质上是所谓的Advantage Actor Critic算法。
简要总结一下上面的讨论,Reinforce算法的主要缺点是梯度估计是基于蒙特卡罗估计的初始state-action对的预期总奖励 - 虽然具有低偏差,但它具有高方差。通过使用因果关系并从蒙特卡洛估计中减去基线,我们可以减少方差。通过使用总奖励的TD估计而不是蒙特卡罗估计来进一步减少方差。
确定性策略梯度(DPG)算法
对于连续环境中的随机策略,actor输出高斯分布的均值和方差。并且从该高斯分布中采样动作。对于确定性动作,虽然这种方法仍然有效,因为网络将学会具有非常低的方差,但它涉及不必要的复杂性和计算负担,这会不必要地减慢学习算法的速度。为了解决这些缺点,对于确定性动作,我们可以使用所谓的确定性策略梯度。
在随机情况下,策略梯度在状态和动作空间上进行整合,而在确定性情况下,它仅在状态空间上进行整合。结果,计算确定性策略梯度可能需要更少的样本。但是为了充分探索状态空间,基本思想是根据随机动作策略选择行动,并了解确定性目标策略(即需要off-policy learning)。
DPG本质上是Actor-Critic算法的确定性版本。对于基本DPG算法,我们有两个神经网络,一个网络(由θ参数化)估计最优目标策略,另一个网络(由w参数化)估计对应于目标策略的动作值函数。
如上所述,由于目标策略是确定性的,因此参与者可能无法很好地探索状态空间以找到最优策略。为了解决这个问题,我们使用了与目标策略不同的动作策略(b(sₜ)。它基本上是具有一些额外噪音的目标策略。为简单起见,我们将使用正态分布作为我们的噪声源。但请注意该项类似于超参数,并且在Reacher环境的以下实现中,使用不同的噪声过程。
确定性策略梯度更新:
1.Actor网络更新如下:
根据链式法则,它变成:
2.critic 络更新如下:
TD误差由下式给出:
权重更新:
请注意,为了正确地平衡exploration-exploitation权衡,而目标策略μ是确定性的,行为策略是随机的。这是一个off-policy DPG算法的版本。虽然随机off-policy actor-critic算法通常对actor 和critic使用重要性抽样,因为确定性策略梯度消除了对行为的期望,并且状态转换规律对于目标和行为策略都是相同的(在相同的环境中),重要性抽样比率只有1.因此我们可以避免在actor 中使用重要性抽样,并且在相同的推理下,我们避免在critic中使用重要性抽样。类似的推理适用于为什么我们不使用重要性抽样与Q学习。
深度确定性策略梯度(DDPG)算法
DDPG基本是DQN架构的少量训练变更的DPG。
使用神经网络进行强化学习时的一个挑战是大多数优化算法假设样本是独立且相同的分布。显然,这种假设不成立,因为样本是通过在环境中顺序探索生成的。由于DDPG是一种off policy算法,我们可以像在DQN中一样使用replay buffer(有限大小的缓存)来解决这个问题。在每个时间步,通过从缓冲区均匀地采样小批量来更新actor 和critic。
对于critic来说,由于正在更新的网络也用于计算目标,这可能潜在地导致训练不稳定。解决此问题的一种解决方案是使用单独的目标网络,与DQN一样。给定目标值是使用critic和actor 网络确定的,我们创建这两个网络的副本并且软件将其权重更新到相应的学习网络。有关详细信息,请参阅github代码(https://github.com/gtg162y/DRLND/blob/master/P2_Continuous_Actions/Continuous_Control_UdacityWorkspace.ipynb)。
针对Reacher环境的DDPG实施
现在我们已经看到了一些常用的策略梯度算法,现在我们可以实现Udacity的Reacher项目的实现。在这种环境中,双关节臂(acrobot)可以移动到目标位置(即气球所在的位置)。对于代理的手在目标位置的每一步,提供+0.1的奖励。因此,代理的目标是在尽可能多的时间步长处保持其在目标位置的位置。当气球移动时,两个关节调整为跟踪气球。因此,这是一个经典的机器人项目,并且使用model-free强化学习,代理将学习最优策略。特别地,使用的方法是深度确定性策略梯度方法(DDPG)。观察空间由33个变量组成,对应于位置,旋转,速度,和手臂的角速度。每个动作都是一个带有四个数字的向量,对应于适用于两个关节的扭矩。动作矢量中的每个条目都是-1到1之间的数字。
使用的Reacher环境包含20个相同的代理,每个代理都有自己的环境副本。为了被认为已经解决,代理必须获得30+的平均分数(超过连续100次,20个代理)。特别是,在每次之后,我们将每个代理收到的奖励(without discounting)加起来,以获得每个代理的得分。这产生20个(可能不同)分数。然后我们取这20个分数的平均值。
这产生每个次的平均分数(其中平均分数超过所有20个代理)。当这些平均分数的平均值(超过100次)至少为+30时,环境被认为是已解决的。
DDPG算法使用4个独立的神经网络。一个学习策略,另一个学习值函数,另一个学习目标值函数,一个用于目标动作 - 值函数网络中的目标动作。如前所述,我们使用单独的目标网络而不是局部网络,以防止在TD目标依赖于局部网络时学习中的任何不稳定性。目标网络中的权重非常缓慢地更新,例如在每个时间步骤朝向局部网络0.1%。慢慢改变目标网络确实会降低学习速度,但它有助于学习算法的稳定性。
为了加快学习过程,由于所有20个代理同时处理,输入数据流非常快。为了充分利用这一点,我在每次迭代时执行4次网络参数更新。此外,critic网络的梯度被限制为1.这可以防止critic网络变化太快。此外,初始化目标网络以具有与正在学习的网络相同的(随机)权重。Ornstein-Uhlenbeck噪声过程用于生成行为策略以进行更好的探索,而不是正态分布。所有这些事情共同使得代理能够在超过100次中实现学习目标。有关详细信息,请参阅github代码(https://github.com/gtg162y/DRLND/blob/master/P2_Continuous_Actions/Continuous_Control_UdacityWorkspace.ipynb)。
以下是在所有20个代理上平均的算法的学习性能。
在使用的超参数方面,actor 和critic网络的学习率是1e-4,没有使用正则化,因为网络相当小。我逐渐减少了探索的概率来获得最佳策略。Ornstein-Uhlenbeck噪声过程使用的平均值为0,西格玛为0.2。actor 网络是使用三层神经网络构建的(第一层有256个神经元,第二层有128个神经元,最终输出层有4个神经元)。critic网络也使用三层和相似数量的神经元作为actor 网络构建,除了动作连接到第一层的输出并且最后一层具有单个输出神经元。为了更快地学习,两个网络都使用了elu非线性。
在进一步提高代理性能的方法方面,做的事情有以下几点:
- 1)使用Prioritized Experience Replay训练代理
- 2)使用近端策略优化算法。