从Q learning到策略梯度
在解决MDP
问题的算法中,Value Base
类算法的思路将关注点放在价值函数上,传统的Q Learning
等算法是一个很好的例子。Q Learning
通过与环境的交互,不断学习逼近(状态, 行为)
价值函数
Q(st,at),而策略本身即选取使得在特定状态下价值函数最大的动作,即
at=argminaQ(st,a) , 具体算法如图1所示。
![Q Learning](https://img-blog.csdnimg.cn/2019082510421832.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMyOTgzMDA=,size_16,color_FFFFFF,t_70)
其中
Q(S,A)←Q(S,A)+α[R+γmaxaQ(S′,a)−Q(S,A)]一步即时序差分法的价值函数逼近过程,具体原理详见。![格子世界](https://img-blog.csdnimg.cn/20190825104241610.png)
Q learning算法已经能解决许多问题,但最致命的一点是: 在确定环境
st下,策略选择的行动总是确定的,这对于很多场景来说,并不适用。例如玩剪刀石头布的时候,如果出拳的策略是一定的话,就很容易被对手察觉并击破。同时,Q learning也无法解决状态重名的问题。具体地说,状态重名是指在两个现实中的状态,在建模中表现出来的state
是一样的,也就是
st向量的每个维度都相等。如下图中格子世界的例子,如果状态被建模成二维向量,维度分别表示左右是否有墙阻挡,那么图中两个灰色格子的状态向量是一样的,于是他们在Q learning中学习到的策略会选择一样的行动,但矛盾的是: 如果选择向左走,对于第一个格子就是一次失败的决策。如果选择向右走,对于第二个格子来说就是一次失败的决策。特别是如果使用
ϵ−greedy策略时,很可能在第一个灰格子会不停选择向左的行动,直到一次
ϵ概率的事件发生时,才有可能选择一次随机行为,从而有机会跳出这个坏处境。这时候还不如直接使用随机策略管用。
针对上述种种缺点,策略梯度法应运而生。
首先,我们需要明确的是,强化学习的最终目的是最大化价值函数。Q learning算法的思路比较绕,Q learning并没有直接去最大化价值函数,而是思考: 在给定状态
st下,做出动作
at会得到什么样的回报? 得到答案之后,每次都贪婪地选择回报最大的那个动作。 可是为什么我们不直接思考: 在给定状态下,做出什么样的动作,才能让回报最大化? 策略梯度就是这样一个直接的算法。
具体地说,策略梯度算法将策略建模成为
πθ(s,a),表示在
s状态下选择
a动作的概率,其中
θ为参数。并且将负回报函数作为损失函数,应用梯度下降法将期望奖励最大化。定义为
J(θ)=s∑d(s)a∑πθ(s,a)R(s,a)(1)
这样,(1)式对参数
θ求梯度得到
∇θJ(θ)=s∈S∑d(s)a∈A∑πθ(s,a)∇θlogπθ(s,a)Rs,a=Eπθ[∇θlogπθ(s,a)R(s,a)](2)
式子(2)的期望通过均值代替得到
∇θJ(θ)=N1∑∇θlogπθ(s,a)R(s,a)(3)
于是我们得到了蒙特卡洛策略梯度算法
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190825104406169.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMyOTgzMDA=,size_16,color_FFFFFF,t_70)
AC算法
从式子(3)来看蒙特卡洛策略梯度算法在策略梯度更新的过程中,考虑的是即时奖励
vt,而即时奖励具有较大噪声,为了得到更稳定的表现,可以使用长期回报来替代即时奖励。具体如式(4):
∇θJ(θ)=s∈S∑d(s)a∈A∑πθ(s,a)∇θlogπθ(s,a)Gs,a(4)
其中
Gs,a=∑λnRn定义为(s,a)的长期回报, 根据Q函数的定义
Q(s,a)=E[Gs,a∣s,a],于是式子(4)使用长期回报期望
Q(s,a)直接替代长期回报得到式(5)
∇θJ(θ)=Eπθ[∇θlogπθ(s,a)Q(s,a)](5)
于是根据(5)式我们可以得到
Δθ=∇θlogπθ(s,a)Q(s,a),用这种方式更新参数的就是Actor-Critic算法,简称AC算法。其中Critic就是
Q(s,a),本质上就是梯度权值,也可以说是评价梯度的重要性。假设我们使用的Q函数是一个简单的线性函数
Qw(s,w)=ϕ(s,a)Tw,那么AC算法具体的过程可以给出如下图。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190825104456998.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMyOTgzMDA=,size_16,color_FFFFFF,t_70)
A2C算法
AC算法使用的Q函数是一个随机初始化的函数,需要在交互中学习逼近真正的
Q^,这意味着我们在梯度更新中引入了噪声,或者说方差。为了解决这个问题,A2C引入了Baseline的概念。具体地说是通过在(5)式中引入一个Baseline函数
B得到(6)式子
∇θJ(θ)=Eπθ{∇θlogπθ(s,a)[Q(s,a)−B]}(6)
且要求(5)式与(6)相等(期望不变)但方差更低。事实上只要
B 只与s相关而与a无关,即
B(s)就可以达到期望不变的目的。简单地将(6)式子展开即可得到这个结论
∇θJ(θ)=Eθ[∇θlogπθQ(s,a)]−E[∇θlogπθ(s,a)B(s)]=Eθ[∇θlogπθQ(s,a)]−s∈S∑dπθ(s)B(s)∇θa∈A∑logπθ(s,a)=Eθ[∇θlogπθQ(s,a)]
第二个等号交换了求导与求和的顺序,并且将与a无关的
B(s)提到求和符号外,于是根据定义
∑a∈Aπθ(s,a)=1,而常数的梯度等于0。于是现在对于函数
B(s)只剩下让方差更低这一约束了。首先来看方差
Var(X)=E[(X−X)2]=E(X2)−[E(X)]2
接下来我们让方差对函数
B(s)的导数为0
∂B(s)∂Var(X)=∂X∂Var(X)⋅B(s)∂X=2E[X⋅∂B(s)∂X]=0
然后带入
X=∇θlogπθ(s,a)[Q(s,a)−B(s)]得到
s∈S∑dπθ(s)a∈A∑[∇θlogπθ(s,a)]2[Q(s,a)−B(s)]=s∈S∑dπθ(s)a∈A∑[∇θlogπθ(s,a)]2Q(s,a)−s∈S∑dπθ(s)B(s)a∈A∑[∇θlogπθ(s,a)]2=0(7)
解得
B(s)=∑a∈A[∇θlogπθ(s,a)]2∑a∈A[∇θlogπθ(s,a)]2Q(s,a)(8)
式(7)给出了使得方差最小时得
B(s),但也可以看到其计算复杂度十分高。事实上我们可以在计算复杂度和噪声指标上做权衡。从式子(7)中其实我们可以看到只要
B(s)逼近
Q(s,a)且与a无关,即可得到一个接近最优解得方案。可以非常直觉地想到取状态价值函数
V(s)=E[Gs,a∣s]作为
B(s),即
B(s)=V(s)(9)
最后,令
A(s,a)=Q(s,a)−V(s)为优势函数(动作a相对平均表现的优势),可以得到A2C算法的梯度公式
∇θJ(θ)=Eπθ[∇θlogπθ(s,a)A(s,a)](10)
在工程实现上,我们并不需要维持两套参数去分别交互逼近
Q(s,a)和V(s)。具体地说,我们可以使用
δA=r+λV(s′)−V(s)来替代
δ=r+λQ(s′,a′)−Q(s,a),因为根据定义
E(δ)=δA。并且恰好
δA就是
A(s,a)的无偏估计,这是因为根据Q函数的定义有$ \mathbb E[r+\lambda V(s’)|s,a] = Q(s,a)
。所以实际上实现A2C算法的时候,只需要维持一套参数用于估计V(s)$,并且做梯度下降更新参数的时候可以使用
Δθ=α∇θlogπθ(s,a)(r+λV(s′)−V(s))(11)