1,随机策略梯度

1.1,简介

离散动作和连续动作:

(1)要输出离散动作的话,我们就是加一层 softmax 层来确保说所有的输出是动作概率,而且所有的动作概率加和为 1。

(2)要输出连续动作的话,一般可以在输出层这里加一层 tanh,它的作用就是把输出限制到 [-1,1] 之间。拿到这个输出后,就可以根据实际动作的范围再做一下缩放,然后再输出给环境。比如神经网络输出一个浮点数是 2.8,然后经过 tanh 之后,它就可以被限制在 [-1,1] 之间,它输出 0.99。假设小车速度的动作范围是 [-2,2] 之间,那我们就按比例从 [-1,1] 扩放到 [-2,2],0.99 乘 2,最终输出的就是 1.98,作为小车的速度或者说推小车的力输出给环境。

前面那些值函数的方法,当值函数最优时,可以获得最优策略。最优策略是状态 s 下,最大行为值函数对应的动作。当动作空间很大的时候,或者是动作为连续集的时候,基于值函数的方法便无法有效求解了。因为基于值函数的方法在策略改进时,需要针对每个状态行为对求取行为值函数,以便求解 arg\,\underset{a\in A}{max}\,Q(s,a)这种情况下,把每一个状态行为对严格独立出来,求取某个状态下应该执行的行为是不切实际的。

因此,可直接将策略参数化,利用线性函数或非线性函数表示策略,即 \pi_{\theta}(s),以寻找最优的参数 \theta ,使得累计回报的期望 E\left [ \sum_{t=0}^HR(s_t)|\pi_{\theta}\right ] 最大,这就是策略搜索方法。而策略搜索方法中最先发展起来的就是策略梯度方法,即在求解优化目标时,采用梯度上升法。

除了适用于连续动作空间场景外,相较于值函数的方法,策略梯度方法还有如下优点:

  • 策略搜索方法具有更好的收敛性。有些值函数在后期会一直围绕最优值持续小幅度震荡而不收敛。而基于策略的学习遵循的是梯度法,它会一直朝着优化策略的方法进行更新,试图收敛。
  • 策略搜索方法更简单。在某些情况下,使用基于值函数方法求解最优策略非常复杂,甚至无效。例如,接球游戏中,当小球从空中某个位置落下时,需要左右移动接住。计算小球在某个空间位置的行为值函数非常困难,而用基于策略的方法就简单许多,只需要朝着小球落地的方向更新策略即可。
  • 策略搜索方法可以学到随机策略。在某些情况下,如不完美信息MDP模型中,随机策略往往是最优策略。而使用基于值函数的方法学到的大多数策略都是确定性的策略,无法获得最优解。

当然,策略搜索方法也有一些缺点:如在使用梯度法对目标函数进行求解时,容易收敛到局部最小值。并且策略更新时,仅会在策略函数某一参数梯度方向上移动很小的步长,使得整个学习比较平滑,因此不够高效。

确定策略与随机策略:

(1)确定性策略是指给定状态 s ,动作唯一确定。即:\pi_{\theta}(s)=a 。

(2)随机策略是指在状态 s 时,动作符合一个概率分布:\pi_{\theta}(a|s)=P(a|s;\theta) 。

例如,智能体需要在下面的场景中找到钱袋子:5个格子组成5个状态,如果用格子的东南西北4个方向是否有墙壁阻挡这个特征来描述格子状态的话,也就是用这个格子世界状态空间的特征时,就会发生灰色格子状态无法区分的情况(状态重名)

在这种情况下如果采用确定性策略,当智能体处于无论哪个灰色格子时,都只能选取相当的行为。结果就是智能体会一直(贪心策略)很长时间(ε-贪心策略)徘徊在最左侧两个格子之间,无法拿到钱袋子获得回报。

当发生状态重名情况时,随机策略将会优于确定性策略。例如:

\pi_{\theta}(wall\,to\,N\,and \,S\,move\,E)=0.5

\pi_{\theta}(wall\,to\,N\,and \,S\,move\,W)=0.5

之前的理论告诉我们对于任何MDP总有一个确定性的最优策略,不过那是针对状态可完美观测或者使用的特征可以完美描述状态的情况。当发生状态重名无法区分或者使用的近似函数里描述状态的特征限制了对状态的完美描述时,智能体得到的状态信息等效于部分观测的环境信息,问题将不具备马尔可夫性。此时最优策略将不再是确定性的,而直接基于策略的学习却能学习到最优策略,这就是为什么要直接基于策略进行强化学习的原因。

1.2,基于策略和基于值函数

(1)在值函数的方法中,迭代计算的是值函数,并根据值函数对策略进行改进;

(2)在策略搜索方法中,直接对策略进行迭代计算,迭代更新策略函数的参数值,直到累计回报的期望最大,将对应的参数代入策略函数得到最优策略。

(3)行动者-评论家方法同时对值函数和策略函数进行迭代计算,以求得最优策略。

策略梯度这种基于策略算法要做的,就是最大化奖励期望:E\left [ \sum_{t=0}^HR(s_t)|\pi_{\theta}\right ]MC更新方法:REINFOCE 算法;TD更新方法:Actor-Critic算法;

DQN这种基于价值要做的,就是最大化奖励:R(s_t)=\sum_{t^{'}=t}^T\gamma^{t^{'}-t}r_{t^{'}}

基于策略和基于值函数的区别:

  • 使用动作概率表示:在目标网络最后一层输出使用softmax,用动作概率而不是动作价值来表示。
  • 回合更新:在一个回合结束之后才学习,而不像DQN一样几步一学习。回合更新的优点是准确。对于深度强化学习来说,前期的标签可能具有欺骗性?这时的过早学习可能会误导网络的参数,使用回合更新可以使这种趋势减小;回合更新的缺点是相对耗时。对于一些需要长步数的回合,需要较长时间才可以学习到新的参数。
  • 使用梯度上升来反向传播,并且直接使用奖励而不是计算误差来作为反向传播的输入。
  • 策略梯度的网络输出是动作概率而不是动作价值,问题类似于分类问题,即对于输入的图像(state)判断属于某种类型(要使用某种action)的概率,因此构造的网络的输出函数可以用分类问题常用的softmax。

1.3,策略梯度方法分类

根据策略是随机策略还是确定性策略,分为策略梯度方法(SPG,用PG表示)确定性策略梯度方法(DPG)。因为,随机策略梯度方法(SPG)存在学习率难以确定的问题,就有了置信域策略优化(TRPO),它能够确定一个使得回报函数单调不减的最优步长。确定性策略梯度方法(DPG)使用的是线性函数逼近行为值函数和确定性策略,如果将线性函数扩展到非线性函数——深度神经网络,就有了深度确定性策略梯度方法(DDPG)。

  • 之前强化学习方法使用的都是广义策略迭代框架,它包括两步:策略评估和策略改进。
  • 行动者-评论家(AC)框架,评论家用来对行为值函数参数进行更新,行动者根据更新后的行为值函数对策略函数参数进行更新。根据采用的策略不同,可分为随机行动者-评论家方法和确定性行动者-评论家方法。
  • 如果用优势函数代替行为值函数,评论家直接对优势函数的参数进行更新就有了行动者-评论家方法(A2C)。
  • 如果进一步,在进行行为探索(采样)时,同时开启多个线程,每个线程相当于一个智能体在随机探索,多个智能体共同探索,并行计算策略梯度,维持一个总的更新量,就有了异步优势行动者-评论家方法(A3C)。

1.4,随机策略梯度简介

首先考虑是随机策略的情况,策略表示为 \pi_{\theta}(a|s)=P(a|s,\theta),确定了在给定的状态 s 和一定的参数设置 \theta 下,采取任何可能行动的概率。

比如,常用的高斯分布的概率公式为:

\pi_{\theta}(a|s,\theta)=\frac{1}{\sqrt{2\pi}\delta (s,\theta)}exp\left ( -\frac{\left ( a-\mu(s,\theta) \right )^2}{2\delta (s,\theta)^2} \right )

一般而言:

\mu(s,\theta)=\theta^T_{\mu}x(s)

\delta (s,\theta)=exp(\theta_{\sigma }^Tx(s))

将策略参数向量 \theta ,分成两部分:\theta=[\theta_{\mu},\theta_{\sigma }]^T\theta_{\mu} 用来近似均值,\theta_{\sigma} 用来近似方差。可见,当采用此随机策略进行采样时,在同样的状态 s 处,所采取的动作也会不一样。遵循此策略函数采样得到的动作 a 服从均值为 \mu(s,\theta)、方差为 \delta (s,\theta)^2 的正态分布。

利用参数化的策略产生的行为能够得到较多的回报。具体的机制是设计一个与策略参数 \theta 相关的目标函数 J(\theta) ,对其使用梯度上升策略算法优化参数 \theta ,使得 J(\theta) 最大。

\theta_{t+1}=\theta_{t}+ \alpha \triangledown J(\theta_t)

此方法是基于目标函数 J(\theta) 的梯度进行策略参数更新的,在更新过程中无论是否同时对值函数进行近似,任何遵循这种更新机制的方法都叫作策略梯度法。

1.5,随机策略梯度定理

在定义目标函数时,针对不同的问题类型,有不同的目标函数可供选择。在能够产生完整轨迹的环境下,也就是智能体总是从某个状态 s_0 开始,或者以一定的概率分布从 s_0 开始可以从起始状态 s_0 到终止状态的累计回报来衡量整个策略的优劣。即:找到一个策略,当把智能体放在这个状态 s_0 时,让它执行当前的策略,能够获得 J(\theta) 的回报,并使得这个J(\theta)最大化:

J(\theta)=V_{\pi_{\theta}}(s_0)

s_0 作为初始状态的概率是一个与策略无关的常数,在使用梯度上升法进行策略参数更新时,将被吸收至步长 a 中,因此可忽略。

对于没有终止状态的情况,使用每一个时间步下的平均回报来衡量策略的好坏。这个平均回报就等于在一个确定的时间步长内,智能体处于所有状态的可能性与每一种状态下采取所有行为能够得到的立即回报之积:

J(\theta)=\sum_{t=1}u_{\pi_{\theta}}(s)\sum_{a}\pi_{\theta}(a|s,\theta)R_t^a

其中,u_{\pi_{\theta}}(s) 是基于策略 \pi_{\theta} 生成的马尔科夫链关于状态的分布。

可见,目标函数同时取决于状态分布和所选择的动作,而两者又同时受策略参数影响。给定状态下,策略参数对行为选择的影响,可以用策略函数以相对直接的方式计算。但是策略对状态的影响是环境的一个特性,并且通常是未知的,无法计算。在策略对状态分布影响未知的情况下,计算目标函数对策略参数的梯度十分困难。

策略梯度定理很好地解决了这个问题,提供给我们一个关于目标函数梯度的表达式。将完整轨迹和持续时间步定义的两种目标函数 J(\theta) 的梯度,理论上统一成一种表达式。并且,表达式中不涉及关于状态分布对策略参数的导数,表示如下:

\triangledown J(\theta)\propto \sum_s\mu(s)\sum_aQ_{\pi}(s,a)\triangledown_{\theta}\pi_{\theta}(a|s,\theta)

可见,目标函数梯度与等式右边成正比,在完整轨迹的情况下,比例常数为轨迹长度。连续时间步情况下,比例常数为 1。因为更新时,常数可以被步长 \alpha 吸收,所以上式可写为:

\triangledown _{\theta}J(\theta)\propto \sum_su_{\pi_{\theta}}(s)\sum_aQ_{\pi}(s,a)\triangledown_{\theta}\pi_{\theta}(a|s,\theta)

=\sum_au_{\pi_{\theta}}(s)\sum_a\pi_{\theta}(a|s,\theta)Q_{\pi}(s,a)\frac{\triangledown _{\theta}\pi_{\theta}(a|s,\theta)}{\pi_{\theta}(a|s,\theta)}

=E_{s\sim u,a\sim \pi}\left [Q_{\pi}(s,a)\frac{\triangledown _{\theta}\pi_{\theta}(a|s,\theta)}{\pi_{\theta}(a|s,\theta)} \right ]

=E_{s\sim u,a\sim \pi}\left [\triangledown _{\theta}\, log\, \pi_{\theta}(a|s,\theta)Q_{\pi}(s,a)\right ]

2,蒙特卡罗策略梯度

2.1,REINFORCE方法

由策略梯度定理 \triangledown _{\theta}\,J(\theta)=E_{s\sim u,a\sim \pi}\left [ \triangledown _{\theta}\,log\,\pi_{\theta}(a|s,\theta)Q_{\pi}(s,a) \right ] 可知,需要通过采样,以使样本梯度的期望与目标函数的实际梯度相等。

又因为:

E_{s\sim u,a\sim \pi}[G_t|s_t,a_t]=Q_{\pi}(s_t,a_t)

则有:

\triangledown_{\theta} J(\theta)=E_{s\sim u,a\sim \pi}\left [\triangledown _{\theta}\, log\, \pi_{\theta}(a_t|s_t,\theta)Q_{\pi}(s_t,a_t)\right ]=E_{s\sim u,a\sim \pi}\left [G_t\triangledown _{\theta}\, log\, \pi_{\theta}(a_t|s_t,\theta)\right ]

结合策略参数的随机梯度上升公式:\theta_{t+1}=\theta_{t}+\alpha \triangledown J(\theta_t) ,得到 REINFORCE 方法:

\theta_{t+1}=\theta_{t}+\alpha G_t\,\triangledown _{\theta}log\,\pi_{\theta}(a_t|s_t,\theta)

由公式可见,REINFORCE 使用的是从时间 t 开始到结束的完整轨迹的回报,因此属于一种蒙特卡罗算法,并且适用于完整轨迹情况。

参数 \gamma ^{'} 是用来修饰步长 \alpha 的,随着更新的进行,步长越来越小。

2.2,带基线的 REINFORCE 方法 

REINFORCE 方法通过采样的方式用 t 时刻的回报作为当前策略下行为价值的无偏估计。每次更新时使用的 G 都是通过对 t 之后所有时间步回报采样获得,因此此算法收敛速度慢,需要的迭代次数长,还存在较高的方差。但是可以通过引入基线的方式来减少方差。

由于之前的策略梯度定理我们知道,策略参数化后优化目标函数得到的策略梯度为:

\triangledown J(\theta)\propto \sum_s\mu(s)\sum_aQ_{\pi}(s,a)\triangledown_{\theta}\pi_{\theta}(a|s,\theta)

现在在回报中引入基线 b 函数,也就变成了:

\triangledown J(\theta)\propto \sum_s\mu(s)\sum_a\left ( Q_{\pi}(s,a)-b(s) \right )\triangledown_{\theta}\pi_{\theta}(a|s,\theta)

基线 b 函数可以与状态相关,但一定要与行为无关,这样设置的基线 b 函数不会改变梯度本身。

\sum_s\mu_{\pi_{\theta}}(s)\sum_ab(s)\triangledown _{\theta}\pi_{\theta}(a|s,\theta)=\sum_{s}\mu_{\pi_{\theta}}(s)b(s)\triangledown _{\theta}\sum_a\pi_{\theta}(a|s,\theta)

=\sum_su_{\pi_{\theta}}(s)b(s)\triangledown _{\theta}1

=0

可见,基线函数在保证更新的策略梯度不变的同时,能够明显减少方差。一般令基线为一个关于状态的函数,基线值随状态而变化。在某些状态,所有行为都具有较高的价值 Q(s,a),这时候需要一个比较高的基线来区分较高价值的行为和一般价值行为。在其他状态,所有行为的值函数 Q(s,a) 都比较低,因此通常会设置一个较低的基线。

使用得最多的基线函数是值函数 V(s,w) 。其中 w 是值函数的参数向量,也可以通过蒙特卡罗方法进行学习。

3,AC方法

3.1,AC方法简介

通俗地理解 Actor-Critic 的结构:

  • 策略网络扮演的就是 actor 的角色,它负责对外展示输出,输出舞蹈动作。
  • Q 网络就是评论家(critic),它会在每一个 step 都对 actor 输出的动作做一个评估,打一个分,估计一下 actor 的 action 未来能有多少收益,也就是去估计这个 actor 输出的这个 action 的 Q 值大概是多少, Q_w(s,a)。 Actor 就需要根据舞台目前的状态来做出一个 action。
  • Actor 根据评委的打分来调整自己的策略,也就是更新 actor 的神经网络参数 θ, 争取下次可以做得更好。
  • Critic 则是要根据观众的反馈,也就是环境的反馈 reward 来调整自己的打分策略,也就是要更新 critic 的神经网络的参数 w。Critic 的最终目标是让 Actor 的表演获得观众尽可能多的欢呼声和掌声,从而最大化未来的总收益。

最开始训练的时候,这两个神经网络参数是随机的。所以 critic 最开始是随机打分的,然后 actor 也跟着乱来,就随机表演,随机输出动作。但是由于我们有环境反馈的 reward 存在,所以 critic 的评分会越来越准确,也会评判对应 actor 的表现会越来越好。

既然 actor 是一个神经网络,是我们希望训练好的策略网络,那我们就需要计算梯度来去更新优化它里面的参数 θ 。简单的说,我们希望调整 actor 的网络参数,使得评委打分尽可能得高。注意,这里的 actor 是不关注观众的,它只关注评委,它就是迎合评委的打分 Q_w(s,a) 而已。

使用蒙特卡罗策略梯度方法方差比较高,引入基线可以在一定程度上减小方差。除此之外,还有一种降低方差的方法,使用相对精准的函数 Q_w(s,a) 对行为值函数 Q_{\pi}(s,a) 近似,避免了对数据的采样,也就避免了来自环境的噪声。用近似的值函数来指导策略参数更新,这就是 Actor-Critic 策略梯度的主要思想。

Actor-Critic 算法的引入,主要是为了解决 Policy Gradient 算法中回合更新效率低的问题,即它仅能在一个回合完成之后,才能更新参数。Actor-Critic 算法可以实现单步更新,收敛要快很多。其次,基于值函数的方法(DQN)和基于策略的方法(REINFORCE),其中基于值函数的方法只学习一个价值函数,而基于策略的方法只学习一个策略函数。那么一个很自然的问题,有没有什么方法既学习价值函数,又学习策略函数呢?答案就是 Actor-Critic。

Actor-Critic 的字面意思“行动者-评论家”,相当于行动者在行动的同时有评论家指点继而行动者做的越来越好。即使用 Critic 来参数化行为值函数,并对其进行评估:

Q_w(s,a)\approx Q_{\pi_{\theta}}(s,a)

一个完整的行动者-评论家(AC)包含两部分:

  • 一个是 Actor 角色,也称其为“演员,行动者”。这个角色是一个相对独立的模型。 你仍然可以把它理解为一个神经网络,任务就是学动作。优化它的过程和优化一个普通 DQN 里面的网络没有太大的区别。行动者遵循随机策略梯度定理,在评论家的指导下,通过梯度上升法,对随机梯度 \pi(s|a,\theta) 的参数 \theta 进行迭代更新。
  • 另一个是 Critic 角色,或者称作“评论家”。这个角色也是一个独立的模型。它的目的是学习估值的大小。在这种思维的指导下,估值学习也是一个独立的、可优化的任务,需要通过一个模型进行拟合。动作输出也是一个模型,通过一个模型进行拟合。评论家引入近似值函数 Q_w(s,a) 通过时序差分法更新参数 w ,对真实值函数 Q_{\pi}(s,a) 近似。

虽然带基线REINFORCE(REINFORCE-with-baseline)方法,也同时学习了策略函数和值函数,但它并不是一个行动者-评论家(Actor-Critic)方法,因为它的值函数仅作为基线函数(Baseline),而不是作为评论者(Critic)直接估计 Q_{\pi}(s,a) 。

评论者(Critic)通过自举(根据后续状态值更新当前状态值)的方式估计 Q_{\pi}(s,a) ,不可避免地为算法引入了偏差,并且算法严重依赖近似函数的质量。想想看:如果 Critic 模型学 出来的东西都是错的,那么 Actor 模型根本不可能学到一个好的动作策略。当然,自举的方法也有它的好处,它减少了算法的方差,提高了学习的速度,并且它克服了蒙特卡罗只能学习完整轨迹的限制。通过对评论家引入时序差分(TD(0))法,可以实现对不完整轨迹的在线增量学习。当然也可以采用 TD(\lambda) 来灵活选择自举程度。

根据生成采样数据所使用的的策略和评估改进的策略是否为同一个策略,行动者-评论家(AC)方法又可分为在线策略AC和离线策略AC。同之前的Sarsa一样,引入离线策略是为了保证对环境的充分探索。

3.2,在线策略AC方法

在线策略的行动者-评论家(AC)方法表示用来采样的策略同时也需要评估改进的策略,记为 \pi(s|a,\theta) 。行动者Actor遵循随机策略梯度定理对策略参数进行更新,评论家 Critic 做的事情其实就是策略评估。关于策略评估,之前介绍的时序差分法 TD(0),TD(\lambda) 等都可以直接使用。

评论家采用线性函数

线性函数近似函数为:Q_w(s,a)=w^T\Phi (s,a) ,\Phi (s,a) 可以是任意一个基函数。如果,评论家(Critic)通过 TD(0) 更新 w,行动者(Actor)通过策略梯度更新 \theta ,则有:对于一给定的样本,存在这样的 TD 残差:

\delta _t=r_s^a+\gamma w^T\Phi (s_{t+1},a_{t+1})-w^T\Phi (s_t,a_t)

则评论家的近似值函数参数 w 更新公式为:

w_{t+1}=w_t+\beta\delta _t\Phi (s_t,a_t)

行动者策略参数更新为:

\theta=\theta+\alpha \triangledown _{\theta}\,log\,\pi_{\theta}(a|s)\,Q_w(s,a)

评论家采用神经网络

实际场景中,用得比较多的是通过神经网络来逼近评论家(Critic)Q_w(s,a)w 表示的是神经网络的参数,对网络参数的更新等价于更新评论家 Q_w(s,a) 。具体的算法流程通线性逼近基本一致。其中,网络参数 w 按照下式更新:

w\leftarrow w+\beta\delta \triangledown _w\,Q_w(s,a)

在更新参数 \theta 时,可使用 TD 残差代替 Q_w(s,a) 作为轨迹回报的轨迹。此方法在减少计算量和减少方差方面有一定的优势。则 Actor 网络更新公式为:

\theta = \theta+\alpha \triangledown _\theta\,log\,\pi_{\theta}(a|s)\,Q_w(s,a)

AC算法针对每一个时间步进行更新,属于单步更新法。它不需要等到轨迹结束,是一个在线实时更新的算法。而单纯的策略梯度方法(REINFORCE)是回合更新,只能等到回合结束才开始更新,严重降低了学习效率。

3.4,离线策略AC方法

实际中,因为在线策略方法对环境探索能力十分有限,因此离线策略方法被广泛使用。离线策略算法中,一般使用行为策略 \beta(a|s) 来进行采用生成轨迹,\beta(a|s)\ne\pi(s|a,\theta) 。并基于此轨迹来进行目标策略 \pi(s|a,\theta) 的评估和改进。  

在离线策略环境中,通常将目标函数修改为:

J_{\beta}(\pi_{\theta})=\int _{s^{'}}\rho^{\beta}(s)V_{\pi}(s)ds=\int _s\int_{A}\rho^{\beta}\pi_{\theta}(a|s)Q_{\pi}(s,a)dads

V_{\pi}(s) 表示状态 s 遵循目标策略 \pi(s|a,\theta) 的状态值函数。\rho^{\beta}(s) 为在 \beta(a|s) 下的状态分布。可见,J_{\beta}(s) 表示的是利用在策略 \beta(a|s) 下采样的数据,评估策略 \pi(s|a,\theta) 。

对离线策略的目标函数基于 \theta 求梯度,可得:

\triangledown _{\theta}J_{\beta}(\pi_{\theta(a|s)}Q_{\pi}(s,a))=\triangledown _{\theta}\pi_{\theta}(a|s)Q_{\pi}(s,a)+\pi_{\theta}(a|s)\triangledown _{\theta}Q_{\pi}(s,a)

=E_{s\sim \rho^{\beta},\alpha \sim\beta}\left [ \frac{\pi_{\theta}(a|s)}{\beta_{\theta}(a|s)}\triangledown _{\theta}log\,\pi_{\theta}(a|s)Q_{\pi}(s,a) \right ]

根据乘法求导法则,\triangledown _{\theta}(\pi_{\theta}(a|s)Q_{\pi}(s,a))=\triangledown _{\theta}\pi_{\theta}(a|s)Q_{\pi}(s,a)+\pi_{\theta}(a|s)\triangledown _{\theta}Q_{\pi}(s,a) 。\triangledown _{\theta}Q_{\pi}(s,a) 在离线策略情况下难以估计和求解,等式右边省略了 \triangledown _{\theta}Q_{\pi}(s,a) 这一项,得到一个近似的离线策略梯度法。此近似值被 Degris 等人证明可以在梯度上升方法中收敛到局部最优解。

  • 离线策略行动者-评论家(AC)算法使用行为策略 \beta(a|s) 来产生采样轨迹,评论家通过对这些数据进行学习,采用时序差分法,用近似值函数 Q_w(s,a) 逼近真实值函数 Q_{\pi}(s,a) 。
  • 行动者也是通过这些数据来对策略参数进行更新的,它采用的是随机梯度上升法。

在算法中,针对采样数据的来源(来自 \beta(a|s) 而不是 \pi_{\theta}(a|s) ),行动者和评论家都使用了重要采用比例 \frac{\pi_{\theta}(a|s)}{\beta(a|s)} 来进行调整(假设 Q_w(s,a) 为一个线性近似函数,参数为 w )。

Q_w(s,a)=w^T\Phi(s,a)

则对于一给定样本,如果使用时序差分 TD(0) 方法,存在这样的 TD 残差(TD 目标):

\delta _t(w)=r_s^a+\gamma w^T\Phi(s_{t+1},a_{t+1})-w^T\Phi(s_t,a_t)

则评论家的近似值函数参数 w 更新公式为:

w_{t+1}=w_t+\eta \frac{\pi_{\theta}(a|s)}{\beta(a|s)}\delta _t(w)\Phi(s_t,a_t)

行动者策略参数更新公式为:

\theta=\theta+\alpha \triangledown _{\theta}log\,\pi_{\theta}(s,a)\,Q_w(s,a)

评论家在进行策略评估时,除了可以使用 TD(0) ,还可以使用 Sarsa,TD(\lambda) 等。但是时序差分方法在离线策略的情况下,容易出现不稳定和发散的情况,尤其是Sarsa,TD(\lambda)为了解决这个问题,Sutton 在 2009年提出了时序差分梯度方法(GTD)。Maei 于2011年在 GTD 方法的基础上引入了梯度修正项,提出了带梯度修正项的时序差分法(TDC),证明了此方法在离线策略情况下的收敛性,并且通过试验论证了它的效率。

TDC 以 V_{\theta}(s) 作为真实值 V_{\pi}(s) 的近似函数,它的目标是最小化均方投影贝尔曼误差 MSPBE(v)

J(\theta)=||V_{\theta}-\prod T^{\pi}V_{\theta}||^2_{p}

=(P_{\mu}^{\pi}\delta (\theta)\Phi)^TE[\Phi_t,\Phi_t]^{-1}(P_{\mu}^{\pi}\delta (\theta)\Phi)

=E[\rho_t\delta _t(\theta)\Phi_t ]^TE[\Phi_t\Phi_t]^{-1}E[\rho_t\delta _t(\theta)\Phi_t]

对值函数参数更新时,需要同时更新两组参数,分别是 \theta 和 w 。

\theta_{t+1}=\theta_t+\alpha_t\rho_t(\delta _t\Phi_t-\gamma\Phi_{t+1}(\Phi^T_tw_t))

w_{t+1}=w_t+\beta(\rho_t\delta _t-\Phi_t^Tw_t)\Phi_t

其中 \delta _t=r_s^a+\gamma w ^T \Phi (s_{t+1})-w^T\Phi(s_t)

\rho_t=\frac{\pi_{\theta}(a|s)}{\beta(a|s)}

因此,可将TDC方法引入AC的框架中,评论家在更新值函数参数时使用它,行动者在更新策略函数时依旧使用随机策略梯度公式。

3.5,A2C方法

同之前介绍的 REINFORCE 方法一样,行动者-评论家方法也可以采用引入基线的方式来进一步减小方差。其基本思想是从策略梯度里减去一个基线函数 B(s) ,要求这一函数仅与状态有关,与行为无关,因而不改变梯度本身。基线函数的特点是能在不改变策略梯度的同时降低其方差。

\triangledown_{\theta}J(\theta)=\sum_su_{\pi_{\theta}}(s)\sum_aQ_{\pi}(s,a)\triangledown _{\theta}\,\pi_{\theta}(a|s,\theta)

=\sum_su_{\pi_{\theta}}(s)\sum_a\left ( Q_{\pi}(s,a)-B(s) \right )\triangledown _{\theta}\,\pi_{\theta}(a|s,\theta)

原则上,与行为无关的函数都可以作为基线函数 B(s)。一个很好的基线函数 B(s) 就是基于当前状态的值函数 V_{\pi_{\theta}}(s) 。

B(s)=V_{\pi_{\theta}}(s)

这样就可以通过优势函数对策略梯度进行修改,其中优势函数的定义如下:

A_{\pi_{\theta}}(s,a)=Q_{\pi_{\theta}}(s,a)-V_{\pi_{\theta}}(s,a)

目标函数的梯度可以写成:

\triangledown _{\theta}J(\theta)=E_{\pi_{\theta}}\left [ \triangledown _{\theta}log\,\pi_{\theta}(a|s)\left ( Q_{\pi_{\theta}}-V_{\pi_{\theta}}(s) \right ) \right ]

=E_{\pi_{\theta}}\left [ \triangledown _{\theta}log\,\pi_{\theta}(a|s)A_{\pi_{\theta}}(s,a) \right ]

评论家 Critic 部分是一个优势函数,对应的 AC 方法也变成了 Advantage Actor-Critic 方法。

理论上,在进行评论家 Critic 部分的计算时,需要两个近似函数,同时更新两套参数。一套用来近似值函数,一套用来近似行为值函数。

V_v(s)\approx V_{\pi_{\theta}}(s)

Q_w(s,a)\approx Q_{\pi_{\theta}}(s)

A(s,a)=Q_w(s,a)-V_v(s)

不过实际操作时,一般用 TD 误差代替优势函数进行计算,因为 TD 误差是优势函数的无偏估计。

\delta _{\pi_{\theta}}=r+\gamma V_{\pi_{\theta}}(s^{'})-V_{\pi_{\theta}}(s)

E_{\pi_{\theta}}\left [ \delta _{\pi_{\theta}}|s,a \right ]=E_{\pi_{\theta}}\left [ r+\gamma V_{\pi_{\theta}}(s^{'})|s,a \right ]-V_{\pi_{\theta}}(s)

=Q_{\pi_{\theta}}(s,a)-V_{\pi_{\theta}}(s)

=A_{\pi_{\theta}}(s,a)

实际运用时,使用一个近似的 TD 误差,即可用状态函数的近似函数来代替实际的状态函数,并且近似 TD 误差只需一套参数即可完成计算。

\delta _v=r+\gamma V_v(s^{'})-V_v(s)

最后,策略梯度计算公式变为:

\triangledown _{\theta}J(\theta)=E_{\pi_{\theta}}\left [ \triangledown _{\theta}\, log\,\pi_{\theta}(a|s)\, \delta _{\pi_\theta} \right ]

4,A3C算法

4.1,异步方法

深层神经网络提供了丰富的表示方式,使强化学习算法能够更加有效地执行。但是当利用神经网络逼近行为值函数时,因为数据之间存在强关联使得神经网络训练很不稳定,因此很多研究者提出各种解决方案来稳定算法。例如,DQN利用经历回放的技巧打破数据之间相关性。基本思路是将采样数据存储于记忆库中,然后通过批量或随机的方式获取不同的时间步的数据,以这种方式减少数据间的关联,降低训练过程的非平稳性。

基于经历回放的深度强化学习算法在许多挑战性领域(Atari2600)取得空前成功,然而它同时存在缺点:

  • 每次交互的时候都需要更多的内存和计算。
  • 需要使用离线策略算法来产生训练数据进行更新,而同样的条件下,离线策略算法不如在线策略算法稳定。

打破数据的相关性,经历回放并非是唯一方法。Volodymyr Mnih 等于2016年提出了一个轻量级的深度强化学习框架,使用异步梯度下降优化深度神经网络。所谓异步的方法是指:通过在多个环境实例中并行地执行多个智能体,来产生多样化的数据。因为在任何给定的时间步,并行的智能体将经历各种不同的状态,从而避免了数据之间的相关性,使得强化学习的序列满足独立同分布。异步方法可以在不使用经历回放的前提下,很好地解决神经网络不稳定的问题。因为不需要存储样本,异步方式需要内存比非异步方法少。在引入异步方法之前,深度强化学习严重依赖专用硬件,如GPU或大规模分布式架构。而异步方法仅需一台电脑,再此机器上运行一个多核CPU来启动多个线程,就可以完成深度强化学习任务。因此与基于GPU的方法相比,异步方式的运行时间和运行资源要少很多。

综上所述,异步的诸多好处使得它被广泛应用在各种强化学习方法中,包括在线策略强化学习,如 Sarsa、TD(λ)、AC以及离线策略强化学习,如 Q-learning。通过采用异步方法,大部分的强化学习算法在训练神经网络时,其鲁棒性和有效性都得到了明显的提升。这里面最大的功劳在于它们使用了CPU的多核属性,也可以说高效率地使用了计算资源。

异步方法的核心思想:并行的交互采样和训练。在异步方法中,同时启动多个线程,智能体将在多个线程中同时进行环境交互。只要保证每一个线程中的环境设定不同,线程间交互得到的转换序列就不会完全一样。样本收集完成以后,每一个线程将独立完成训练并得到参数更新量,并以异步的方式更新到全局的模型参数中。下一次训练时,线程的模型参数将和全局参数完成同步,再使用新的参数进行新一轮的训练。

在使用异步方式训练深度神经网络时,需要注意:

  • 在单个机器上使用多个CPU线程进行异步学习,而不是针对每个学习者(智能体)分别使用单个机器和参数服务器。保持学习者在同一台机器上,可以消除发送梯度和参数的通信成本。
  • 多个学习者需要使用不同的探索策略。多样化的探索策略可以最大化数据的多样性,大大地削弱了采样数据在时间上的相关性,异步方法正是通过这种方式代替了经历回放的角色。除了能够保持神经网络的训练稳定外,多并行学习者还可以减少训练时间,其训练时间与学习者数量大致呈线性关系。
  • 因为不再依赖经历回放,异步方式的应用范围从离线策略方法被扩展到了在线策略方法中,如 Sarsa方法和Actor-Critic方法等。也就是说,异步方法可以应用在各种标准强化学习算法中。

4.2,异步Q-learning方法

异步 Q-learning 的算法流程如下。在一台机器里同时运行多个线程,每个线程都与自己的环境进行交互,并在每个时间步计算 Q 学习损失梯度:

d\theta\leftarrow d\theta+\frac{\partial (y-Q(s,a;\theta))^2}{\partial \theta}

其中,y 为 TD 目标。同 DQN 一样,异步 Q-learning 也有两个神经网络:目标网络和更新网络,分别使用了不同的网络参数 \theta^{-},\theta ,这两个参数作为多个学习者的共享参数被缓慢更新。

类似于批量更新方式,单个学习者将固定时间步内的更新量进行积累,每隔一定的时间步将积累的更新量更新给共享参数 \theta 。这种多个时间步累计更新的方式减少了多个学习者彼此覆盖的可能,还提高了算法的计算效率。

4.3,异步Sarsa方法

异步 Sarsa 算法与异步 Q-learning 算法大致相同,区别在于 TD 目标不同。异步 Q-learning 的目标值为:r+\gamma\,\underset{a^{'}}{max}Q(s^{'},a^{'};\theta^{-}) ;而异步 Sarsa 目标值为:r+\gamma\,Q(s^{'},a^{'};\theta^{-}),其中 a^{'} 是在状态 s^{'} 上采取的行动。同样地,异步 Sarsa 也使用了两个神经网络,并通过多个时间步长累计更新来学习网络参数。

4.4,异步 n 步 Q-learning 方法

n 步 Q-learning 算法同样使用了两个神经网络,一个作为更新的目标,参数为 \theta^{-};一个用来表示当前值函数,参数为 \theta ;与异步 Q-learning 所不同的是,它在更新网络参数时,用到的是 n 步回报。

为了计算单线程的更新量,算法首先使用 ε 贪心策略选择行为,产生 t_{max} 步(或达到终止状态),从环境中获得 t_{max} 步立即回报。接着使用得到的训练数据,计算 t_{max} 步的累计梯度。

d\theta\leftarrow d\theta+\frac{\partial (R-Q(s_i,a_i;\theta^{'}))^2}{\partial \theta^{'}}

累计梯度从t_{max} 开始到 t ,一共 t_{max} 步的梯度更新量之和。其中,R 表示的是 n 步回报。

R_t^n=r_{t+1}+\gamma r_{t+2}+...+\gamma^{n-1} r_{t+n}+\gamma^{n} R_{t+n}

最后使用累计梯度 d\theta,异步更新网络参数。

单线程算法流程:

4.5,A3C算法

A3C(Asynchronous Advantage Actor-Critie)是Google DeepMind 为解决Actor-Critic难以收敛问题提出来的优化算法,整个算法采用了异步并发的学习模型。

A3C算法有两套模型,可以看作是中央大脑的全局模型和在子线程中运行的本地模型该算法创建了多个并行的环境,并将多个本地模型放入多个线程中同步训练,使其分别和本地环境交互学习。本地模型完成各自参数更新量的计算后,会向全局模型推送更新。同时也会从全局模型那里获取综合版的更新以知道自己和环境的交互学习。并行中的本地模型(AC算法)互不干扰,而全局网络的参数更新受到子线程提交更新的不连续性数据的影响,更新的相关性被降低,收敛性提高。

例如:整个部门的员工都在有条不紊、循环多次地执行同一个任务。每执行完一次,都会将经验教训异步地上传给部门领导,然后又从部门领导那里获取最新的最完整的执行任务的方法。可见,部门领导哪里汇集了所有人的经验教训,成为最会执行任务的人。而普通员工也可以从部门领导那里得到最新的方法,用在自己的场景中。这种方式消除了基于一个人推送更新带来的连续性。使A3C不必像DQN、DDPG那样使用记忆库,也能很好地进行更新。

无论是全局模型,还是本地模型,其本质都是AC算法。此算法需要更新计算两个参数:策略函数 \pi(a_i|s_i;\theta) 的参数 \theta (行动者 Actor)、值函数 V(s_i;\theta_v) 的参数 \theta_v(评论家 Critic)。涉及的公式有两条,一条是梯度下降法更新值函数参数 \theta_v ,同异步 n 步 Q-learning 方法一样,这里也使用了 n 步累计梯度。

d\theta_v\leftarrow d\theta_v+\frac{\partial (R-V(s_i;\theta^{'}_v))^2}{\partial \theta_v^{'}}

其中,\theta_v^{'} 是本地 Critic 网络参数。

另一条是梯度上升法更新策略参数 \theta ,可以看成是公式:

d\theta\leftarrow d\theta+\triangledown _{\theta^{'}}log\pi(a_t|s_t;\theta^{'})A(s_t,a_t;\theta^{'},\theta_v^{'})

其中,\theta^{'} 是特定线程的策略网络参数。

根据优势函数的定义,A(s_t,a_t;\theta^{'},\theta^{'}_v)=Q(s_t,a_t;\theta_v^{'})-V(s_t;\theta_v^{'})

运行一次样本数据,可以得到一个行为值函数 Q(s_t,a_t;\theta_v^{'}) 的无偏轨迹。这样就可以通过当前回报和下一时刻的值函数来估计目标价值:

Q(s_t,a_t;\theta_v^{'})=r_{s_t,a_t}+\gamma V(s_{t+1};\theta_v^{'})

因为异步的时序差分更新速度太慢,一个训练样本仅能影响一个价值函数的更新。为了使得模型更新速度加快,并且更好地平衡偏差和方差,使用 n 步回报估计法,将上面的式子进一步展开。不仅使用下一时刻的回报,而且将此后更多时刻的回报加入目标值当中。

A(s_t,a_t;\theta^{'},\theta_v^{'})=r_{t+1}+\gamma r_{t+2}+...+\gamma^{k-1}r_{t+k-1}+\gamma ^{k}V(s_{t+k},\theta_v^{'})-V(s_t;\theta_v^{'})

=\sum_{i=0}^{k-1}\gamma^{i}r_{t+i}+\gamma ^kV(s_{t+k};\theta_v^{'})-V(s_t;\theta_v^{'})

可见,这时候,仅需要知道值函数 V 就可以计算优势函数 A 了,而这个值函数 V 很容易用神经网络来计算。

值得注意的是,在训练本地模型时,并不直接对本地网络参数进行更新,而是在每个回合对其梯度累计求和。在整个轨迹结束后,利用累计梯度对全局网络参数进行更新。然后在轨迹重新开始时,将最新的全局网络参数同步给各个本地网络。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐