找回密码
 立即注册
查看: 282|回复: 6

【强化学习8】PPO

[复制链接]
发表于 2022-5-5 07:12 | 显示全部楼层 |阅读模式
参考文献

[1] TRPO: Schulman, John, et al. “Trust Region Policy Optimization.”ArXiv Preprint ArXiv:1502.05477, 2015.
[2] DPPO: Heess, Nicolas, et al. “Emergence of Locomotion Behaviours in Rich Environments.”ArXiv Preprint ArXiv:1707.02286, 2017.
[3] PPO: Schulman, John, et al. “Proximal Policy Optimization Algorithms.”ArXiv Preprint ArXiv:1707.06347, 2017.
[4] batchPPO: Hafner, D. , Davidson, J. , & Vanhoucke, V. . (2017). Tensorflow agents: efficient batched reinforcement learning in tensorflow.
[5] Implementation Matters in Deep Policy Gradients: a Case Study on PPO and TRPO.
1. DPPO(Deepmind PPO)

1.1 PPO原理
openAI的研究员曾经在线下社区分享PPO,当时并未正式发表,随后Deepmind抢先发表。Deepmind所发表的PPO继承于openAI的早期版本,和openAI正式发表的PPO有点不同。我简单地描述Deepmind PPO原理。
简单回顾policy gradient的损失函数:


这个损失函数的gradient为:


其中,  指reward to go,一般等于指baseline,独立于动作 ,一般等于 。通常,我们使用一条轨迹来估计  ; 使用一个神经网络  来估计 ,指网络参数。
policy gradient的方差很大,并且对超参数的设置很敏感。常用的解决方法是使用trust region约束,限制gradient的变化量,从而使损失函数单调递增。TRPO就是这样的一种解决方法。它使用了一个代理损失函数:


其中 。该代理损失函数有一个约束项:


该约束项的作用是抑制policy的变化量不要太大,从而使policy的损失能够单调递增。
TRPO需要使用对偶梯度法进行优化,有很大难度。因此,openAI提出了一个简化的TRPO,也就是PPO——PPO使用一个正则项作为trust region约束,该正则项的系数是根据trust region约束是否被遵守来设定,从而避免使用对偶法。Deepmind PPO伪代码如下:


Note1: 先运行当前policy一段时间,采集T个sample,比如spinningup的T设为4000,再更新policy和critic。所以,ppo是一种on policy算法;
Note2: 子循环1中的KL是一个约束项,避免  变化太大;
Note3: 子循环2的作用是估计state value函数  的参数  ,它使用了一条轨迹上的样本来估计,详情可看“【CS285第6讲】Actor-critic”;
Note4: Algorithm 1通过判断  的大小来调整  约束项的系数,如果  大于某个数,则增大约束项系数(即加大惩罚);否则,减小约束项系数(即较小惩罚);再有,由于使用了important sampling,2个子循环多次使用了一个数据,而policy gradient只能使用一次,也就算说PPO的数据利用率提高了。
1.2 DPPO
DPPO是一种同步并行PPO算法。同步并行算法的原理可用下图来表示。DPPO把网络参数存在到一个服务器上,并且会在每一个gradient step后同步地更新workers的参数。


DPPO使用k-steps return和bootstrap来估计advantage函数:


关于用bootstrap法估计advantage和state value函数的内容,可参见“【CS285第6讲】Actor-critic”。
DPPO的算法流程如下图所示,其中W是workers的数量;D是一个阈值,它指定更新全局网络参数时所需的workers的数量,也就是说如果有一定数量的worker的梯度是available时,就同步地更新全局网络参数,这一个全局网络参数等于各个worker的梯度的均值;M和B是在给定一把mini batch数据的条件下,更新actor和critic网络的迭代步数;T是每一个worker在参数更新之前的date points数量;K是K-steps return的数量。




Algorithm 2是DPPO的服务器端,用于同步地更新actor和critic参数。
Algorithm 3是DPPO的worker端,有3个子循环。第1个子循环是计算每一个time step的期望return  和advantage函数  ,其中  使用K-steps return和bootstrap法来计算。第2个子循环的作用是优化PPO损失函数  ,把梯度发送给服务器端,并且等待服务器端反馈更新后的参数。第3个子循环使用T对样本 进行回归运算从而估计critic  的参数。这里大家可能有一个疑问:  实质上就是  ,为什么能用样本  进行回归呢?因为  是  的平均值,如果我们用很多的  来进行回归运算,所得到的  就是  的平均值了。
1.3 实验
把DPPO和几个baseline算法进行比较,下图显示了它们在Planar walker、Humanoid和Memory reacher3个任务上的效果。可以看到:DPPO快于A3C;DPPO的性能和TRPO一致,甚至更好。


2. PPO (OpenAI)

openAI PPO paper晚于deepmind PPO paper发表。可能记恨在心,openAI PPO paper数落了deepmind所抄来的PPO的正则系数。我们来看看这两家的恩怨吧。
2.1 policy gradient
谈起PPO,我们都得了解它的前身policy gradient。policy gradient的更新梯度表示为:


式中,  指policy,  指在时刻t时advantage函数的估计值; 指用有限批次样本的平均值估计期望。在应用中,我们会用自由微分软件来计算policy gradient,只要构造一个目标,使这个目标函数的导数正好等于policy gradient:


虽然使用一条轨迹对 进行多步优化很有吸引力,但是它会使policy gradient更新量太大,从而难保损失函数单调递增。
2.2 TRPO
TRPO是一种具有单调递增特性的policy gradient算法。它构造了一个带有约束项的代理objective:


式中, 在未更新前的policy参数。TRPO使用共轭梯度法求解上述约束目标函数。由于TRPO很复杂,openAI提出了PPO。早期的PPO使用一个惩罚项来替代TRPO的约束项,从而把约束优化问题转换为无约束优化问题:


该代理objective的目的是最大化其第一项,以及最小化KL,从而使  变化量不会太大并且确保强化学习的目标函数单调递增。该代理objective中的  是一个很有争议的正则系数。TRPO不用  的原因是因为很难选择一个合适的 ,使算法能够适应不用的问题(TRPO和PPO是同一个作者)。另外,作者通过实验发现如果使用固定的正则系数,PPO的性能好不到哪里。
2.3 PPO原理
(1)版本一
令  指概率比例 ,那么 。TRPO所要最大化的代理objective表示为:


如果没有KL约束项,  的最大化会导致policy更新幅度过大,为此,提出了一种clipped surrogate objective,以惩罚变化大的policy,这些policy的  通常远离1:


式中, 是一个超参数,一般 。 min中的第一项是  ;第二项是 ,这一项通过clip概率比例  从而使  的取值在 之间,即  不会远离1。 的意义如下:

  • 可理解为一个权重,PPO和TRPO要解决的是如何合理地最大化
  • 如果当前policy朝好的方向变化,即 (adavantage说明当前时刻的动作比平均动作好多少),那么理应让  变得更好,但是不能变化太大,因为这样可能使 ,导致两个概率分布差别太大。因此,最终的
  • 如果当前policy朝坏的方向变化,即 ,那么采样好坏已经不重要了, 该怎么优化就怎么优化。因此,最终的
(2)版本二
另一种surrogate objective是把KL作为惩罚项,并且自适应地调整惩罚项的系数。在实验中,基于KL惩罚项的surrogate objective的性能差于clipped surrogate objective。基于KL惩罚项的surrogate objective的policy更新过程为:

  • 使用几个epochs的数据优化基于KL惩罚项的surrogate objective:



  • 计算 ,进而更新惩罚项系数  :


这个方法就是deepmind所用的。
2.4 PPO算法流程
PPO算法参考了A3C很多东西。如果策略网络和评价网络贡献网络参数的话,PPO参考A3C采用了一个多任务损失函数:


其中, 指交叉熵损失,用于提高policy的exploration能力。另外,A3C在每一次迭代中,都要采集T个samples(T远远小于回合长度),计算T个n-step return,然后使用这T个数据更新评价网络:


式中, 。PPO采用了这个思路,但是它没用n-step return,而是使用GAE:


PPO的算法流程为,这里说明一下:N指平行运行的actor数量;T是一个小于回合长度的数;在每一次网络参数更新过程中,所有actor共产生了NT个数据,对这些数据进行epochs为K,batchsize为M的网络更新(经典的actor critic只利用数据一次,这里利用了数据K次,因此有点off-policy的感觉)。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2022-5-5 07:19 | 显示全部楼层
看不到图
发表于 2022-5-5 07:27 | 显示全部楼层
讲解非常好
 楼主| 发表于 2022-5-5 07:37 | 显示全部楼层
PPO讲解的很到位,有个问题请教:openAI的PPO为什么要用多个ppo采集数据,就是NT个数据,举例:4个worker,T为8,就是采集32个数据吗?这个数据之和达到minibatch就开始集中算梯度吗?我对着4个worker存在的意义不很理解,谢谢!
发表于 2022-5-5 07:40 | 显示全部楼层
有没有PPO加入了卷积层的例子?
发表于 2022-5-5 07:50 | 显示全部楼层
你可以去看看APE-X DQN,这就是用多个actor去采集数据
发表于 2022-5-5 07:55 | 显示全部楼层
如果当前policy朝坏的方向变化,说明改变不能太小所以要 >
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-22 11:26 , Processed in 0.097034 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表