acecase 发表于 2021-12-4 15:13

强化学习——策略梯度与Actor-Critic算法

1 学习目标


(1) 理解基于值函数的方法(Value-Based method)和基于策略的方法(Policy-Based method)的不同;
(2) 理解策略梯度法(Policy Gradient)的目标函数和优化思路;
(3) 理解蒙特卡洛策略梯度和Actor-Critic方法;

2 基于策略的方法


前面学习的一些强化学习算法比如Q-Learning,SARSA,DQN都是基于价值的算法,即得到Q表或者近似一个价值函数,然后根据这个学到的Q表或者Q函数来制定策略。而本文要介绍的算法就是另一个思路了,直接学习策略函数。


基于价值的方法比如DQN,输入的是状态,输出的是Q值,有了状态-动作对到Q值的映射,在某个状态下做决策的时候就选择Q值最大的动作即可,这就是DQN的策略。但是有这样几个问题:
① 在估计值函数的时候一个任意小的变化可能导致对应动作被选择或者不被选择,这种不连续的变化是致使基于值函数的方法无法得到收敛保证的重要因素。
② 选择最大的Q值这样一个搜索过程在高纬度或者连续空间是非常困难的;
③ 无法学习到随机策略,有些情况下随机策略往往是最优策略。以David Silver课件中的一个例子说明:


agent在迷宫中移动寻找宝藏,由于迷宫的对称结构,当agent处在灰色格子上时是无法分辨自己处于哪个灰色格子上的,所以最后学习到的策略可能是这样:


当初始位置在第一个白格子上,就会陷入死循环,但是随机策略就会好一些:


因为学出来的策略不是确定性输出一个动作,而是动作的概率。
针对以上问题,有人就提出了基于策略的方法,即输入状态,直接学习策略。那我们下面就来揭开策略梯度的面纱。

3 策略梯度


思路很直接,我们的最终目标是使回报最大,于是就冲着这个目标制定目标函数 https://www.zhihu.com/equation?tex=+J%5Cleft%28+%5Ctheta+%5Cright%29+ ,通过训练,得到一个参数化的策略函数 https://www.zhihu.com/equation?tex=+%5Cpi+_%7B%5Ctheta%7D%5Cleft%28+s%2Ca+%5Cright%29+%3D%5Cmathbb%7BP%7D%5Cleft%5B+a%7Cs%2C%5Ctheta+%5Cright%5D+ 。对于不同的问题类型,有不同的目标函数可以选择:
① 在能够产生完整Episode的环境下,可以使用start value

https://www.zhihu.com/equation?tex=%5C%5C+J_1%5Cleft%28+%5Ctheta+%5Cright%29+%3DV%5E%7B%5Cpi+_%7B%5Ctheta%7D%7D%5Cleft%28+s_1+%5Cright%29+%3D%5Cmathbb%7BE%7D_%7B%5Cpi+_%7B%5Ctheta%7D%7D%5Cleft%5B+v_1+%5Cright%5D+%5C%5C
② 在连续的环境下,可以使用average value

https://www.zhihu.com/equation?tex=+%5C%5CJ_%7BavV%7D%5Cleft%28+%5Ctheta+%5Cright%29+%3D%5Csum_s%7Bd%5E%7B%5Cpi+_%7B%5Ctheta%7D%7D%5Cleft%28+s+%5Cright%29+V%5E%7B%5Cpi+_%7B%5Ctheta%7D%7D%5Cleft%28+s+%5Cright%29%7D+%5C%5C
③ 或者使用Average reward per time-step

https://www.zhihu.com/equation?tex=%5C%5C+J_%7BavR%7D%5Cleft%28+%5Ctheta+%5Cright%29+%3D%5Csum_s%7Bd%5E%7B%5Cpi+_%7B%5Ctheta%7D%7D%5Cleft%28+s+%5Cright%29%7D%5Csum_a%7B%5Cpi+_%7B%5Ctheta%7D%5Cleft%28+s%2Ca+%5Cright%29+%5Cmathcal%7BR%7D_%7Bs%7D%5E%7Ba%7D%7D+%5C%5C
有了目标函数,我们当前的任务就是使目标函数最大化,也就是寻得一组参数向量,使得目标函数最大。这实际上做的是改变策略概率而非改变行动轨迹。很自然的,下一步就是使用梯度下降(上升)法来完成这个工作,问题就转向 https://www.zhihu.com/equation?tex=+%5Cnabla+_%7B%5Ctheta%7DJ%5Cleft%28+%5Ctheta+%5Cright%29+ 的求解。

我就不废话了,直接给出策略梯度定理:
对于任何可微的策略,对于任何策略的目标函数 https://www.zhihu.com/equation?tex=J_1%2CJ_%7BavR%7D+ 或者 https://www.zhihu.com/equation?tex=J_%7BavV%7D%2F%5Cleft%28+1-%5Cgamma+%5Cright%29+ ,其梯度都如下式所示,转换成了策略梯度:

https://www.zhihu.com/equation?tex=%5C%5C%5Cnabla+_%7B%5Ctheta%7DJ%5Cleft%28+%5Ctheta+%5Cright%29+%3D%5Cmathbb%7BE%7D_%7B%5Cpi+_%7B%5Ctheta%7D%7D%5Cleft%5B+%5Cnabla+_%7B%5Ctheta%7D%5Clog+%5Cpi+_%7B%5Ctheta%7D%5Cleft%28+s%2Ca+%5Cright%29+Q%5E%7B%5Cpi+_%7B%5Ctheta%7D%5Cleft%28+%5Ctheta+%5Cright%29%7D%5Cleft%28+s%2Ca+%5Cright%29+%5Cright%5D+%5C%5C
回想一下监督学习算法,我们有大量的样本数据,并且数据都有标签,于是在训练的时候知道当前参数下得到的结果是好是坏(能与监督信息对比),然后可以根据对比结果调整参数优化的方向(梯度)。而强化学习里没有一个监督信息告诉我们当前的策略是好是坏,我们得去计算价值函数来起到标签的作用。
一般地,针对离散行为常用softmax策略,即最后得到的是每一个离散行为应该以怎样的概率来执行。而对于连续问题,则使用高斯策略,因为行为对应于某一个数值,所以学习到的策略是一个高斯分布,通常是对该分布的均值进行参数化表示。

4 蒙特卡洛策略梯度(REINFORCE)


算法描述如下:


首先随机初始化参数 https://www.zhihu.com/equation?tex=%5Ctheta+ ,对每个episode,计算其t=1到t=T-1的return https://www.zhihu.com/equation?tex=+v_t+ ,然后使用随机梯度上升法更新参数。对于策略梯度定理公式里的期望,我们通过采样的形式来替代,即使用t时刻的return作为当前策略下动作价值函数的无偏估计。
但是,REINFORCE存在如下三个问题:

① 由于agent在一个episode中会采取很多动作,我们很难说哪个动作对最后结果是有用的,换句话说,这种算法存在高方差(variance);
② 收敛速度慢;
③ 只在这种episodic环境下能用。
为了解决上述问题,于是提出了Actor-Critic算法。

5 Actor-Critic算法


Actor是演员的意思,Critic是评论家的意思,顾名思义,这种算法就是通过引入一种评价机制来解决高方差的问题。具体来说,Critic就类似于策略评估,去估计动作值函数:

https://www.zhihu.com/equation?tex=+%5C%5CQ_w%5Cleft%28+s%2Ca+%5Cright%29+%5Capprox+Q%5E%7B%5Cpi+_%7B%5Ctheta%7D%7D%5Cleft%28+s%2Ca+%5Cright%29+%5C%5C
于是,Actor-Critic算法中就有两组参数:
Critic:更新动作值函数参数;
Actor:以Critic所指导的方向更新策略参数。
所以说,Actor-Critic算法是一种近似的策略梯度

https://www.zhihu.com/equation?tex=%5C%5C%5Cnabla+_%7B%5Ctheta%7DJ%5Cleft%28+%5Ctheta+%5Cright%29+%5Capprox+%5Cmathbb%7BE%7D_%7B%5Cpi+_%7B%5Ctheta%7D%7D%5Cleft%5B+%5Cnabla+_%7B%5Ctheta%7D%5Clog+%5Cpi+_%7B%5Ctheta%7D%5Cleft%28+s%2Ca+%5Cright%29+Q_w%5Cleft%28+s%2Ca+%5Cright%29+%5Cright%5D+%5C%5C
策略评估在前几讲都有提到,也就是衡量一个策略好坏的过程,可以是MC策略评估,TD或者TD( https://www.zhihu.com/equation?tex=+%5Clambda+ )。举个例子,假设用一个线性函数来近似动作值函数 https://www.zhihu.com/equation?tex=+Q_w%5Cleft%28+s%2Ca+%5Cright%29+%3D%5Cphi+%5Cleft%28+s%2Ca+%5Cright%29+%5ETw+ ,那么Critic过程就是用线性TD(0)来更新 https://www.zhihu.com/equation?tex=+w+ ,Actor过程就是用策略梯度来更新

,具体伪代码如下:


前面提到了,这种算法实际上用了一个近似的策略梯度,这样会引入偏差(bias),导致最后无法收敛到一个合适的策略,一个解决方法就是设计 https://www.zhihu.com/equation?tex=Q_w%5Cleft%28+s%2Ca+%5Cright%29+ 时满足下面两个条件(Compatible Function Approximation Theorem):
① 近似价值函数的梯度完全等同于策略函数对数的梯度

https://www.zhihu.com/equation?tex=%5C%5C%5Cnabla+_wQ_w%5Cleft%28+s%2Ca+%5Cright%29+%3D%5Cnabla+_%7B%5Ctheta%7D%5Clog+%5Cpi+_%7B%5Ctheta%7D%5Cleft%28+s%2Ca+%5Cright%29+%5C%5C
② 值函数参数使得均方差最小

https://www.zhihu.com/equation?tex=+%5C%5C%5Cvarepsilon+%3D%5Cmathbb%7BE%7D_%7B%5Cpi+_%7B%5Ctheta%7D%7D%5Cleft%5B+%5Cleft%28+Q%5E%7B%5Cpi+_%7B%5Ctheta%7D%7D%5Cleft%28+s%2Ca+%5Cright%29+-Q_w%5Cleft%28+s%2Ca+%5Cright%29+%5Cright%29+%5E2+%5Cright%5D+%5C%5C
满足以上两个条件,那么 https://www.zhihu.com/equation?tex=+%5Cnabla+_%7B%5Ctheta%7DJ%5Cleft%28+%5Ctheta+%5Cright%29+%3D%5Cmathbb%7BE%7D_%7B%5Cpi+_%7B%5Ctheta%7D%7D%5Cleft%5B+%5Cnabla+_%7B%5Ctheta%7D%5Clog+%5Cpi+_%7B%5Ctheta%7D%5Cleft%28+s%2Ca+%5Cright%29+Q_w%5Cleft%28+s%2Ca+%5Cright%29+%5Cright%5D+ 。简单的证明如下:


6 Actor-Critic with Baseline


除了引入Critic过程来减小方差,同时也可以采用一种从 https://www.zhihu.com/equation?tex=+Q%5E%7B%5Cpi+_%7B%5Ctheta%7D%7D%5Cleft%28+s%2Ca+%5Cright%29+ 减去Baseline的方法来减小方差。具体地,就是从策略梯度中减去baseline函数,要求这一函数仅与状态有关,与行为无关,因而这样就不会改变梯度本身。



一个比较好的选择是状态值函数 https://www.zhihu.com/equation?tex=+V%5E%7B%5Cpi+_%7B%5Ctheta%7D%7D%5Cleft%28+s+%5Cright%29+ ,基于以上讨论,我们引入一个advantage function函数,定义

https://www.zhihu.com/equation?tex=%5C%5CA%5E%7B%5Cpi+_%7B%5Ctheta%7D%7D%5Cleft%28+s%2Ca+%5Cright%29+%3DQ%5E%7B%5Cpi+_%7B%5Ctheta%7D%7D%5Cleft%28+s%2Ca+%5Cright%29+-V%5E%7B%5Cpi+_%7B%5Ctheta%7D%7D%5Cleft%28+s+%5Cright%29+%5C%5C

https://www.zhihu.com/equation?tex=+%5C%5C%5Cnabla+_%7B%5Ctheta%7DJ%5Cleft%28+%5Ctheta+%5Cright%29+%3D%5Cmathbb%7BE%7D_%7B%5Cpi+_%7B%5Ctheta%7D%7D%5Cleft%5B+%5Cnabla+_%7B%5Ctheta%7D%5Clog+%5Cpi+_%7B%5Ctheta%7D%5Cleft%28+s%2Ca+%5Cright%29+A%5E%7B%5Cpi+_%7B%5Ctheta%7D%7D%5Cleft%28+s%2Ca+%5Cright%29+%5Cright%5D+%5C%5C
好了,接下来的问题就是怎么去近似了,因为它既有动作值函数,又有状态值函数,是不是就需要两组参数来分别近似这两个函数呢?可以这样做,但一般我们用TD error来近似,因为它是的无偏估计。

https://www.zhihu.com/equation?tex=%5C%5C+%5Cdelta+%5E%7B%5Cpi+_%7B%5Ctheta%7D%7D%3Dr%2B%5Cgamma+V%5E%7B%5Cpi+_%7B%5Ctheta%7D%7D%5Cleft%28+s%27+%5Cright%29+-V%5E%7B%5Cpi+_%7B%5Ctheta%7D%7D%5Cleft%28+s+%5Cright%29+%5C%5C

https://www.zhihu.com/equation?tex=+%5Cmathbb%7BE%7D_%7B%5Cpi+_%7B%5Ctheta%7D%7D%5Cleft%5B+%5Cdelta+%5E%7B%5Cpi+_%7B%5Ctheta%7D%7D%7Cs%2Ca+%5Cright%5D+%3D%5Cmathbb%7BE%7D_%7B%5Cpi+_%7B%5Ctheta%7D%7D%5Cleft%5B+r%2B%5Cgamma+V%5E%7B%5Cpi+_%7B%5Ctheta%7D%7D%5Cleft%28+s%27+%5Cright%29+%7Cs%2Ca+%5Cright%5D+-V%5E%7B%5Cpi+_%7B%5Ctheta%7D%7D%5Cleft%28+s+%5Cright%29+%5C%5C+%3DQ%5E%7B%5Cpi+_%7B%5Ctheta%7D%7D%5Cleft%28+s%2Ca+%5Cright%29+-V%5E%7B%5Cpi+_%7B%5Ctheta%7D%7D%5Cleft%28+s+%5Cright%29+%5C%5C+%3DA%5E%7B%5Cpi+_%7B%5Ctheta%7D%7D%5Cleft%28+s%2Ca+%5Cright%29+
因此有 https://www.zhihu.com/equation?tex=%5Cnabla+_%7B%5Ctheta%7DJ%5Cleft%28+%5Ctheta+%5Cright%29+%3D%5Cmathbb%7BE%7D_%7B%5Cpi+_%7B%5Ctheta%7D%7D%5Cleft%5B+%5Cnabla+_%7B%5Ctheta%7D%5Clog+%5Cpi+_%7B%5Ctheta%7D%5Cleft%28+s%2Ca+%5Cright%29+%5Cdelta+%5E%7B%5Cpi+_%7B%5Ctheta%7D%7D+%5Cright%5D+ ,在实际应用中,可以采用近似的TD error,即 https://www.zhihu.com/equation?tex=%5Cdelta+%5E%7B%5Cpi+_%7B%5Ctheta%7D%7D%3Dr%2B%5Cgamma+V%5Cleft%28+s%27+%5Cright%29+-V%5Cleft%28+s+%5Cright%29+ 。
不论是Actor还是Critic,我们都可以在不同时间尺度(time-scales)上近似策略梯度或是值函数。直接引用David课程的几页PPT:




最后课程还提了一下Natural Actor Critic算法,这里就不展开说了。

7 总结


这一节应该是目前最难理解的一个小节了,需要重点掌握的是Actor-Critic算法,其核心是策略梯度定理。简单的说,以前基于值函数近似的算法是先近似出一个Q函数,然后用 https://www.zhihu.com/equation?tex=+%5Cvarepsilon+-greedy+ 策略去选择要执行的动作,由于种种不足,现在我们直接近似出一个策略函数,蒙特卡洛策略梯度算法虽然计算的策略梯度是无偏的,但是方差大,速度慢,因此我们通过减去Baseline来减小方差,并且引入Critic过程进一步优化,形成了Actor-Critic算法,其中也包括了策略梯度的近似,这样我们就可以利用其能够Bootstrapping的性质加快算法速度,并能够在non-episodic环境下得以使用。策略梯度定理帮助我们把Q函数和策略梯度联系了起来,但是我们并不知道真实的Q函数,所以还得去近似估计,想要得到一个无偏的估计,就得满足Compatible Function Approximation Theorem。

Critic实际上就是策略评估,它引导Actor参数梯度方向走向更好。最后引用David的一页PPT作为结束吧。



参考:

Reinforcement Learning: An Introduction -Chapter 13: Policy Gradient Method
David Silver's RL Course Lecture 7 - Policy Gradient
《强化学习》第七讲 策略梯度
深度增强学习之Policy Gradient方法1
Sutton R S. Policy Gradient Methods for Reinforcement Learning with Function Approximation. Submitted to Advances in Neural Information Processing Systems, 1999, 12:1057-1063.
Peters J, Schaal S. Reinforcement learning of motor skills with policy gradients. Neural Netw, 2008, 21(4):682-697.
Siyi LI的回答
What's the difference between Reinforce and Actor-Critic?

DungDaj 发表于 2021-12-4 15:20

非常感谢,baseline那里帮我解答了很重要的问题

BlaXuan 发表于 2021-12-4 15:30

“agent在迷宫中移动寻找宝藏”部分最后一个图是不是放错了?和倒数第二个图一样呢?

kyuskoj 发表于 2021-12-4 15:38

是的 谢谢你 已经修正

ChuanXin 发表于 2021-12-4 15:46

赞!谢谢分享!

acecase 发表于 2021-12-4 15:51

应该是解决高偏差吧 不是方差~

JoshWindsor 发表于 2021-12-4 16:01

请问,最原始的Policy Gradient不应该是回合制的吗,可能我理解有误,请指正

acecase 发表于 2021-12-4 16:08

问一下大佬,蓝色PPT部分是来自哪里啊,想看一下

IT圈老男孩1 发表于 2021-12-4 16:10

看一下参考文献3和4

zifa2003293 发表于 2021-12-4 16:12

你的理解没问题, REINFORCE是回合制的
页: [1] 2
查看完整版本: 强化学习——策略梯度与Actor-Critic算法