第二讲 Proximal Policy Optimization(PPO)
视频地址:https://www.bilibili.com/video/av24724071
课件地址:http://speech.ee.ntu.edu.tw/~tlkagk/courses_MLDS18.html
第一讲整理:【李宏毅深度强化学习2018】P1 Policy Gradient(Review)
第三讲整理:【李宏毅深度强化学习2018】P3 Q-learning(Basic Idea)
两种策略:on-policy 和 off-policy:
所谓 on-policy 指我们学习的 agent(即actor) 和与环境交互的 agent 是相同的,即 agent 一边和环境互动,一边学习;
而 off-policy 指我们学习的 agent 与环境交互的 agent 是不同的,即 agent 通过看别人玩游戏来学习。
注:RL中的 actor/agent 概念和 policy 概念其实有时候会指代同一个东西。因为 policy 即是 actor 要学习的策略,并在是在学习以后用来生成 action 的依据。actor/policy 都可以代表一个网络/函数,一个用来生成 action 的网络/函数。所以下文有时对二者不加以严格区分。
off-policy 方法,利用 q 分布计算 p 分布下的期望:
上一讲提到的 policy gradient 是指 on-policy 的方法,即跟环境互动的 policy 与要 learn 的 policy 是同一个。
整个 actor 网络的目标是学习参数 生成 【能使 reward 最大的 action】。为了使 最大化,我们需要做gradient ascent。而 是上一讲提到的做 gradient ascent 时需要计算的梯度。
意味着如果更新参数后,要重新 sample 一堆 trajectory ,之前的 trajectory 全部不能用了。所以 policy gradient 会花很多时间做sample,因为 sample 一堆 data 后只够做一次参数更新。
而 off-policy 的好处就是,我们可以用另一个 对应的 policy 来和环境互动,而用其收集到的数据来训练,这样可以把 收集到的数据重复利用。
现在介绍 Importance Sampling 的思想:
代表从分布 p 中取样本 x 送入函数 f(x) 并求期望,这可以近似于 sample N 个 ,然后带入 f(x) 求平均,即。现在假设我们不能从分布 p 中 sample 数据,只能从分布 q 中 sample,这样不能直接套上述近似。而要用:。
就是从 p 中 sample 的期望,现在要改为分布 q,所以同时乘 q 除 q,最后多出一项即为 importance weight,代表分布 p 和分布 q 间的差异。
Importance Sampling 存在的问题:
成立,但是二者的方差(variance)不同,多出来的一项在上图用红框圈出。所以如果对于两个分布p、q sample 得足够多,那么可以用上述公式算期望,但是如果 sample 得不多,二者的方差又相差很大,那么这样算就有问题。
这幅图具体说明了上述问题:蓝线代表 p 的分布,绿线代表 q 分布,红线代表 函数,现在我们要从 p、q 分布中 sample 出 x ,投到 中计算。可以看出 p、q 分布对于 的计算而言差别是很大的,因为在蓝线附近 sample 到的 x 丢到 中算出来的是负值,而绿线附近 sample 到的 x 丢到 中算出的是正值。
现在我们关注右边 这项,如果对 q 分布 sample 得不够多,只在红线右边得到 6 个绿点,那么 、、 都是正的, 恒为正;但是如果 sample 到红线左边的 1 个绿点(概率很小),则f(x)为负,同时 乘上的 importance weight 是一个很大的正值,这样会得到一个比较大的负值,对期望起到平衡作用,期望有可能变成负的。所以我们要求 要比较接近。
现在 off-policy 就是让 给 做示范,即从 的分布 sample 数据,同时用 importance weight 做修正。
使用 off-policy,使用梯度做参数更新时要注意的点:
用 off-policy 要注意的一点就是原来 advantage function中 (见第一讲) 的 也要改为 ,因为现在是 在和环境互动。
我们估计 =1,因为猜测 state 的出现与 关系不大,况且这一项本来就无法计算,因为state出现的概率我们是不能控制或估计的。
由此可以得到新的目标函数 。上标 代表跟环境互动的是 , 是要更新的参数。
可以直接算, 可以根据 sample 到的数据计算。
PPO / TRPO 算法:
我们之前提到要求 比较接近,所以提出了 PPO 算法,在目标函数 后加了一个约束KL散度 ,来保证 的相似性,这个约束就像深度学习中的正则化项。TRPO也是同样的思想,但是很难计算,建议就用PPO。
KL散度在意的是actor行为上的差距而不是参数上的差距。
TODO
其实和学习率有点类似,需要手动设置。我们可以设定两个阈值 和 ,如果算出来的 KL散度 大于 ,说明 相差太大,需要加大 ,加大惩罚。反之则减小 ,减小惩罚。
PPO / PPO2 的目标函数公式:
还有一种PPO2,是PPO的简化。PPO2原始的公式为:
里面是对 和 取最小值 min。
中 clip 函数的意思是如果 小于 ,则取 ;若 大于 则取 ;若介于两者之间,则取 。clip函数的图像为:
其中横轴为 。
现在综合考虑 min 中的两项,第二项对应上图蓝色的折线,第一项对应下图绿色的斜线,若A>0,则取下图左边红线部分,若A<0则取下图右边红色部分。
这个式子其实就是让 和 不要差距太大。如果A(advantage function)>0,代表当前的action是好的,所以我们希望 越大越好(即横轴代表的 增大),但是 和 二者不能相差太多,所以设了一个上界 (上图左边);A<0,则说明当前的按传统不好,所以希望 越小越好,但同样要设一个下界 。
PPO / PPO2 等方法的实验效果:
上图给出了PPO在不同任务上的表现(紫色的线)