【李宏毅深度强化学习笔记】2、深度强化学习算法 Proximal Policy Optimization算法(PPO)

【李宏毅深度强化学习笔记】1、深度强化学习算法 策略梯度方法(Policy Gradient)

https://blog.csdn.net/ACL_lihan/article/details/104020259

【李宏毅深度强化学习笔记】2、深度强化学习 Proximal Policy Optimization (PPO) 算法

https://blog.csdn.net/ACL_lihan/article/details/103989581

-------------------------------------------------------------------------------------------------------

【李宏毅深度强化学习】视频地址:https://www.bilibili.com/video/av63546968?p=2

课件地址:http://speech.ee.ntu.edu.tw/~tlkagk/courses_MLDS18.html

-------------------------------------------------------------------------------------------------------

讲PPO前先铺垫一下On-policy和Off-policy的一点知识

所谓 on-policy (左图)指我们学习的 agent(即actor) 和与环境交互的 agent 是相同的,即 agent 一边和环境互动,一边学习

 off-policy (右图)指我们学习的 agent 与环境交互的 agent 是不同的,即 agent 通过看别人玩游戏来学习

on-policy的过程是这样的:

1、使用actor \pi_\theta 去收集数据,用这些数据来进行参数的更新,此时参数\theta变为\theta^'

2、由于参数\theta变为\theta^',原本actor \pi_\theta收集的数据就不能用了,所以要重新收集数据

3、再根据actor \pi_{\theta^'}收集的数据,将参数\theta^'变为\theta^''

一直这样循环下去…………

On-policy的不足:

从上面的过程可以看出,更新后的actor \pi_{\theta^'} 的参数变为\theta^',原来的数据就不能用了。就是说每更新一次参数就需要重新去收集数据,这样更新的效率很低,很花时间。

目标:

用 \pi_{\theta^'} 去收集数据,用这些数据去训练 \pi_\theta 。这样就可以更新参数很多次而只用同一批数据,这就是off-policy。

 

那怎么做呢?

 

Importance sampling

代表从分布p中取样本x送入f(x)并求期望,类似于从p中取N个x^i,然后代入f(x)求平均,即

现在假设我们不能从分布 p 中 sample 数据,只能从分布 q 中 sample,这样不能直接套上述近似。而要用:

即从p分布sample数据变为从q分布sample数据,只需在后面乘上一个weight,即\frac {p(x)}{q(x)}

Importance Sampling 存在的问题:

通过上述公式看出,即便两者期望值一样,但是他们的方差(variance)不同,两式的区别在于红框那里多了一项。

这幅图具体说明了上述问题:蓝线代表 p的分布,绿线代表 q 分布,红线代表f(x)函数,现在我们要从 p、q 分布中 sample 出 x ,投到f(x)中计算。

可以看出 p、q 分布对于f(x)的计算而言差别是很大的。如果sample次数不够多,会造成只sample到每一种分布中,数量比较多的那些样本,比如从p中sample,会容易sample到使f(x)小于0的x;从q中sample,会容易sample到使f(x)大于0的x。

 

上面是sample次数不够多的情况,下面是sample次数足够的情况

可以看到,sample次数够多的时候,可能就能sample到左边的点,在这里可以人为给它设定一个很大的weight。

这样sample到左边绿线那个点的时候,\frac {p(x)}{q(x)}会得到一个很大的值,这样就会将原本应该是正的f(x)拉回负的。

但这个前提是sample足够多次。如果sample次数不够多,就会造成有很大的差别,这就是importance sampling的不足。

 

回到一开始,讲了importance sampling后,我们知道如何由θ变为θ’。只需将变成

,这样就能用actor\pi_{\theta^'}收集数据,给actor\pi_\theta去训练了。

使用 off-policy,使用梯度做参数更新时要注意的点:

1、A^\theta(a_t,s_t)是总计的Reward减掉bias,即  A^\theta (s_t,a_t)=R(\tau^n)-b,就是衡量在状态st下采取动作at的回报。A{^\theta^'} (a_t,s_t)是根据 sample 到的数据计算。

2、因为是\pi_{\theta^'}与环境做互动,所以A^\theta(a_t,s_t)要变为A{^\theta^'} (a_t,s_t)

3、这里我们估计\frac {p_\theta(s_t)} {p_{\theta^`} (s_t)}=1,因为猜测 state 的出现与θ关系不大,况且这一项本来就无法计算,因为state出现的概率我们是不能控制或估计的。

4、\frac {p_\theta(a_t|s_t)} {p_{\theta^`} (a_t|s_t)}可以直接算,

由此可以得到新的目标函数

上标\theta^'代表跟环境互动的,\theta是要更新的参数。

 

PPO / TRPO 算法:

进入主题

上面讲了\theta\theta^'相差太多,会导致结果错误。那么为了防止\theta\theta^'相差太多,就可以使用PPO算法。

在原来的目标函数J{^\theta^'}(\theta)后再加一项约束值 \beta KL(\theta,\theta{^'}) ,这个约束就像深度学习中的正则化项

这一项和衡量\theta\theta^'的差距,这里的差距指的是actor行为上的差距而不是参数上的差距。

下面这个是TRPO算法:

TRPO和PPO的区别:

TRPO在作梯度上升的时候,只对求梯度上升,而KL(\theta,\theta{^'})只作为一个额外的约束,很难计算。

而PPO的\beta KL(\theta,\theta{^'})是放到式子中减去的一项,这样作梯度上升的时候就是将一整个式子(\beta KL(\theta,\theta{^'}))一起算,比较容易算。

所以,为了方便使用,而且两者性能差不多,就直接使用PPO吧

\beta要设多少呢?

PPO中\beta 和学习率有点类似,需要手动设置。我们可以设定两个阈值 KL_{max} 和 KL_{min} 。经过一次参数更新后,查看KL的值,如果KL(\theta,\theta{^'}) 大于 KL_{max} ,说明  \theta , \theta^k  相差太大,需要加大\beta ,加大惩罚。反之则减小\beta ,减小惩罚。

上面讲的是PPO,下面要讲的是PPO2。

min(a,b)函数就是取a和b中的最小值。

clip()函数的意思是: \frac{p_\theta(a_t|s_t)}{p_{\theta^k}(a_t|s_t)} 小于 1-\varepsilon,则取 1-\varepsilon;若 \frac{p_\theta(a_t|s_t)}{p_{\theta^k}(a_t|s_t)} 大于 1+\varepsilon 则取 1+\varepsilon ;若介于两者之间,则取 \frac{p_\theta(a_t|s_t)}{p_{\theta^k}(a_t|s_t)} ,即输入等于输出。

上面为clip()函数的图像,横轴指的就是\frac{p_\theta(a_t|s_t)}{p_{\theta^k}(a_t|s_t)}

总的图像:

绿线代表min()函数的第一项的图像,蓝线代表min()函数的第二项的图像,红线代表最终min()函数的输出结果。

若A>0,则取下图左边红线部分,若A<0则取下图右边红色部分。

这个式子其实就是让 \theta 和 \theta^k 不要差距太大。如果A(advantage function)>0,代表当前的action是好的,所以我们希望 p_\theta(a_t|s_t) 越大越好(即横轴代表的 \frac{p_\theta(a_t|s_t)}{p_{\theta^k}(a_t|s_t)} 增大),但是 p_\theta(a_t|s_t) 和 p_{\theta^k}(a_t|s_t) 二者不能相差太多,所以设了一个上界 1+\varepsilon (上图左边);A<0,则说明当前的action不好,所以希望 p_\theta(a_t|s_t) 越小越好(即横轴代表的 \frac{p_\theta(a_t|s_t)}{p_{\theta^k}(a_t|s_t)} 减小),但同样要设一个下界 1-\varepsilon

PPO / PPO2 等方法的实验效果:

这边可能不清晰,可以看论文原文(https://arxiv.org/abs/1707.06347

简单说一下,PPO(Clip)是紫色的线,可以看到每个任务中的效果都是名列前茅。

 

总结

1、介绍了on-policy和off-policy的概念,和on-policy不足

2、为了实现 用 \pi_{\theta^'} 去收集数据,用这些数据去训练 \pi_\theta (即off-policy),使用Importance sampling方法

3、在Importance sampling方法中要求\theta\theta^'不要相差太多,否则会导致结果错误。进而引出PPO算法

4、介绍了PPO和TRPO和PPO2

发布了10 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ACL_lihan/article/details/103989581