DomDomm 发表于 2022-5-5 07:12

【强化学习8】PPO

参考文献:

TRPO: Schulman, John, et al. “Trust Region Policy Optimization.”ArXiv Preprint ArXiv:1502.05477, 2015.
DPPO: Heess, Nicolas, et al. “Emergence of Locomotion Behaviours in Rich Environments.”ArXiv Preprint ArXiv:1707.02286, 2017.
PPO: Schulman, John, et al. “Proximal Policy Optimization Algorithms.”ArXiv Preprint ArXiv:1707.06347, 2017.
batchPPO: Hafner, D. , Davidson, J. , & Vanhoucke, V. . (2017). Tensorflow agents: efficient batched reinforcement learning in tensorflow.
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的损失函数:

https://www.zhihu.com/equation?tex=J%28%5Ctheta%29%3DE_%7B%5Crho_%7B%5Ctheta%7D%28%5Ctau%29%7D%5B%5Csum_%7Bt%7D%5E%7B%7D%7B%5Cgamma%5E%7Bt-1%7D%7Dr%28s_%7Bt%7D%2Ca_%7Bt%7D%29%5D
这个损失函数的gradient为:

https://www.zhihu.com/equation?tex=%5CDelta_%7B%5Ctheta%7DJ%3DE_%7B%5Ctheta%7D%5B%5Csum_%7BT%7D%5E%7B%7D%7B%5CDelta_%7B%5Ctheta%7D%7Dlog%5Cpi_%7B%5Ctheta%7D%28a_%7Bt%7D%7Cs_%7Bt%7D%29%28R_%7Bt%7D-b_%7Bt%7D%29%5D
其中,指reward to go,一般等于https://www.zhihu.com/equation?tex=R_%7Bt%7D%3D%5Csum_%7Bt%5E%7B%27%7D%3Dt%7D%5E%7B%7D%7B%5Cgamma%5E%7Bt%5E%7B%27%7D-t%7D%7Dr%28s_%7Bt%5E%7B%27%7D%7D%2Ca_%7Bt%5E%7B%27%7D%7D%29 ; https://www.zhihu.com/equation?tex=b_%7Bt%7D指baseline,独立于动作 https://www.zhihu.com/equation?tex=a_%7Bt%7D ,一般等于https://www.zhihu.com/equation?tex=b_%7Bt%7D%3DV%5E%7B%5Ctheta%7D%28s_%7Bt%7D%29%3DE_%7B%5Ctheta%7D%5BR_%7Bt%7D%7Cs_%7Bt%7D%5D 。通常,我们使用一条轨迹来估计; 使用一个神经网络来估计 https://www.zhihu.com/equation?tex=V%5E%7B%5Ctheta%7D%28s_%7Bt%7D%29 ,指网络参数。
policy gradient的方差很大,并且对超参数的设置很敏感。常用的解决方法是使用trust region约束,限制gradient的变化量,从而使损失函数单调递增。TRPO就是这样的一种解决方法。它使用了一个代理损失函数:

https://www.zhihu.com/equation?tex=J_%7BTRPO%7D%28%5Ctheta%29%3DE_%7B%5Crho_%7B%5Ctheta_%7Bold%7D%7D%28%5Ctau%29%7D%5B%5Csum_%7Bt%7D%5E%7B%7D%7B%5Cgamma%5E%7Bt-1%7D%7D%5Cfrac%7B%5Cpi_%7B%5Ctheta%7D%28a_%7Bt%7D%7Cs_%7Bt%7D%29%7D%7B%5Cpi_%7B%5Ctheta_%7Bold%7D%7D%28a_%7Bt%7D%7Cs_%7Bt%7D%29%7DA%5E%7B%5Ctheta_%7Bold%7D%7D%28s_%7Bt%7D%2Ca_%7Bt%7D%29%5D
其中 https://www.zhihu.com/equation?tex=A%5E%7B%5Ctheta_%7Bold%7D%7D%28s_%7Bt%7D%2Ca_%7Bt%7D%29%3DQ%5E%7B%5Ctheta%7D%28s_%7Bt%7D%2Ca_%7Bt%7D%29-V%5E%7B%5Ctheta%7D%28s_%7Bt%7D%29 。该代理损失函数有一个约束项:

https://www.zhihu.com/equation?tex=KL%28%5Cpi_%7B%5Ctheta_%7Bold%7D%7D%7C%5Cpi_%7B%5Ctheta%7D%29%3C%5Cepsilon
该约束项的作用是抑制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函数:

https://www.zhihu.com/equation?tex=%5Cbar%7BA%7D_%7Bt%7D%5E%7B%7D%3D%5Csum_%7Bi%3D1%7D%5E%7BK%7D%7B%5Cgamma%5E%7Bi-1%7Dr_%7Bt%2Bi%7D%7D%2B%5Cgamma%5E%7BK-1%7DV_%7B%5Cphi%7D%5E%7B%7D%28s_%7Bt%2BK%7D%29-V_%7B%5Cphi%7D%5E%7B%7D%28s_%7Bt%7D%29
关于用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对样本 https://www.zhihu.com/equation?tex=%28%5Cbar%7BR%7D_%7Bt%7D%2CV_%7B%5Cphi%7D%5E%7B%7D%28s_%7Bt%7D%29%29 进行回归运算从而估计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函数的估计值; https://www.zhihu.com/equation?tex=%5Cbar%7BE%7D_%7Bt%7D 指用有限批次样本的平均值估计期望。在应用中,我们会用自由微分软件来计算policy gradient,只要构造一个目标,使这个目标函数的导数正好等于policy gradient:


虽然使用一条轨迹对 https://www.zhihu.com/equation?tex=L%5E%7BPG%7D%28%5Ctheta%29 进行多步优化很有吸引力,但是它会使policy gradient更新量太大,从而难保损失函数单调递增。
2.2 TRPO
TRPO是一种具有单调递增特性的policy gradient算法。它构造了一个带有约束项的代理objective:


式中, https://www.zhihu.com/equation?tex=%5Ctheta_%7Bold%7D 在未更新前的policy参数。TRPO使用共轭梯度法求解上述约束目标函数。由于TRPO很复杂,openAI提出了PPO。早期的PPO使用一个惩罚项来替代TRPO的约束项,从而把约束优化问题转换为无约束优化问题:


该代理objective的目的是最大化其第一项,以及最小化KL,从而使变化量不会太大并且确保强化学习的目标函数单调递增。该代理objective中的是一个很有争议的正则系数。TRPO不用的原因是因为很难选择一个合适的 ,使算法能够适应不用的问题(TRPO和PPO是同一个作者)。另外,作者通过实验发现如果使用固定的正则系数,PPO的性能好不到哪里。
2.3 PPO原理
(1)版本一
令指概率比例 https://www.zhihu.com/equation?tex=r_%7Bt%7D%28%5Ctheta%29%3D%5Cfrac%7B%5Cpi_%7B%5Ctheta%7D%28a_%7Bt%7D%7Cs_%7Bt%7D%29%7D%7B%5Cpi_%7B%5Ctheta_%7Bold%7D%7D%28a_%7Bt%7D%7Cs_%7Bt%7D%29%7D ,那么 https://www.zhihu.com/equation?tex=r%28%5Ctheta_%7Bold%7D%29%3D1 。TRPO所要最大化的代理objective表示为:


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


式中, https://www.zhihu.com/equation?tex=%5Cepsilon 是一个超参数,一般https://www.zhihu.com/equation?tex=%5Cepsilon%3D0.2 。 min中的第一项是;第二项是 https://www.zhihu.com/equation?tex=clip%28r_%7Bt%7D%28%5Ctheta%29%2C1-%5Cepsilon%2C1%2B%5Cepsilon%29%5Cbar%7BA%7D_%7Bt%7D ,这一项通过clip概率比例从而使的取值在 https://www.zhihu.com/equation?tex=%5B1-%5Cepsilon%2C1%2B%5Cepsilon%5D 之间,即不会远离1。 https://www.zhihu.com/equation?tex=L%5E%7BCLIP%7D 的意义如下:

[*] 可理解为一个权重,PPO和TRPO要解决的是如何合理地最大化 https://www.zhihu.com/equation?tex=%5Cfrac%7B%5Cpi_%7B%5Ctheta%7D%28a_%7Bt%7D%7Cs_%7Bt%7D%29%7D%7B%5Cpi_%7B%5Ctheta_%7Bold%7D%7D%28a_%7Bt%7D%7Cs_%7Bt%7D%29%7D 。
[*]如果当前policy朝好的方向变化,即 https://www.zhihu.com/equation?tex=%5Cbar%7BA%7D_%7Bt%7D%3E0 (adavantage说明当前时刻的动作比平均动作好多少),那么理应让变得更好,但是不能变化太大,因为这样可能使 https://www.zhihu.com/equation?tex=r_%7Bt%7D%28%5Ctheta%29%5Cgg1 ,导致两个概率分布差别太大。因此,最终的 https://www.zhihu.com/equation?tex=r_%7Bt%7D%28%5Ctheta%29%5Cleq1%2B%5Cvarepsilon 。
[*]如果当前policy朝坏的方向变化,即 https://www.zhihu.com/equation?tex=%5Cbar%7BA%7D_%7Bt%7D%3C0 ,那么采样好坏已经不重要了, 该怎么优化就怎么优化。因此,最终的 https://www.zhihu.com/equation?tex=r_%7Bt%7D%28%5Ctheta%29%5Cgeq1-%5Cvarepsilon 。
(2)版本二
另一种surrogate objective是把KL作为惩罚项,并且自适应地调整惩罚项的系数。在实验中,基于KL惩罚项的surrogate objective的性能差于clipped surrogate objective。基于KL惩罚项的surrogate objective的policy更新过程为:

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



[*]计算 https://www.zhihu.com/equation?tex=d%3D%5Cbar%7BE%7D_%7Bt%7D%5BKL%5B%5Cpi_%7B%5Ctheta_%7Bold%7D%7D%2C%5Cpi_%7B%5Ctheta%7D%5D%5D ,进而更新惩罚项系数:


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

https://www.zhihu.com/equation?tex=L_%7Bt%7D%5E%7BCLIP%2BVF%2BS%7D%28%5Ctheta%29%3DE_%7Bt%7D%5BL_%7Bt%7D%5E%7BCLIP%7D%28%5Ctheta%29-c_%7B1%7DL_%7Bt%7D%5E%7BVF%7D%28%5Ctheta%29%2Bc_%7B2%7DS%28s_%7Bt%7D%29%5D
其中, https://www.zhihu.com/equation?tex=L_%7Bt%7D%5E%7BVF%7D%28%5Ctheta%29%3D%28V_%7B%5Ctheta%7D%28s_%7Bt%7D%29-V_%7Bt%7D%5E%7Btarg%7D%29%5E%7B2%7D ;https://www.zhihu.com/equation?tex=S%28s_%7Bt%7D%29 指交叉熵损失,用于提高policy的exploration能力。另外,A3C在每一次迭代中,都要采集T个samples(T远远小于回合长度),计算T个n-step return,然后使用这T个数据更新评价网络:


式中, https://www.zhihu.com/equation?tex=t%5Cin%5B0%2CT%5D 。PPO采用了这个思路,但是它没用n-step return,而是使用GAE:


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

ainatipen 发表于 2022-5-5 07:19

看不到图

HuldaGnodim 发表于 2022-5-5 07:27

讲解非常好

DomDomm 发表于 2022-5-5 07:37

PPO讲解的很到位,有个问题请教:openAI的PPO为什么要用多个ppo采集数据,就是NT个数据,举例:4个worker,T为8,就是采集32个数据吗?这个数据之和达到minibatch就开始集中算梯度吗?我对着4个worker存在的意义不很理解,谢谢!

HuldaGnodim 发表于 2022-5-5 07:40

有没有PPO加入了卷积层的例子?

Mecanim 发表于 2022-5-5 07:50

你可以去看看APE-X DQN,这就是用多个actor去采集数据

zifa2003293 发表于 2022-5-5 07:55

如果当前policy朝坏的方向变化,说明改变不能太小所以要 >
页: [1]
查看完整版本: 【强化学习8】PPO