强化学习PPO从理论到代码详解(2)---PPO1和PPO2

article/2025/9/21 8:10:24

在线或离线学习

 

上一节我们了解了什么是策略梯度,本节开始讲PPO理论之前,我们先提出一个概念,什么在线学习,什么离线学习。

On-policy: Then agent learned and the agent interacting with Environment is the same

Off-policy: Then agent learned and the agent interacting with Environment is not the same

英语确实不好理解,用中文讲就是说,你训练agent需要数据,这些数据可能是你训练的agent和环境交互产生的,那么这就是在线,也可能不是训练的agent产生的,而是另外的agent产生的,这就是离线。

对于一个策略梯度来说在线,离线有什么区别呢?

策略梯度根据上一节的结论,理论上的公式如下,这是一个在线学习的梯度:

 (这里多了一个上一节没有的公式,就是用了一个均值符号)

  • 现在我们用一个\pi_{\theta}去收集数据,但是更新了一次\theta之后,就要重新去收集数据,因为之前用的是\theta,梯度上升完了参数就变了\theta^{1},这就是驴唇不对马嘴🙄🙄。而且这样效率也低,为什么,因为强化学习大部分的时间都不是消耗在GPU上,而是和环境的互动上,好不容易互动出来点数据,更新一下又得扔了,能不低效吗。
  • 那么转成离线off policy好像就可以解决这个问题,也就是说我们可以从\pi_{\theta{}'}收集数据取更新\theta,因为\theta'是固定的,就可以重复利用,大大提升效率。

****************

( 这里插一嘴,李宏毅老师在这里称作是从on-policy 到 off-policy。PPO给我的感觉也是一个离线的算法,但是easy-rl和很多其他博主都说PPO是一个在线,包括PPO2的论文原文也说PPO比其他的on-policy策略要叼。这里也欢迎讨论)

****************

重要性采样Important Sampling

我们找到了一个提升训练效率的方法, 可以从\pi_{\theta{}'}收集数据取更新\theta,因为\theta'是固定的,就可以重复利用,大大提升效率。但是凭什么\pi_{\theta{}'}可以训练\theta啊,你的上一章梯度公式里明明只有一个\theta,你这公式保熟吗?🍉🍉

这里就不得不提到重要性样Important Sampling

 先看这个公式,假设我们有一个函数f(x),我们从一个分部p中采样,把采样到的的x在带入f(x)。这样即使我们不能对f(x)积分,只要采样够多,我们就可以f(x)在p分布中的均值得到一个均值。

现在我们在假设一种情况,如果我们不能从p中去采样,我们只能从另外一个分部q(x)去采样,可以得到f(x)在p分布中的均值吗? 答案是肯定的,具体的推导如下:

最后结论是这样:

这里看不懂的可以复习下概率论,如果你比较懒也不影响你理解,这里要记住的是,我们已经成功的把从p的采样,改为了从q中的采样。

我们把这个\frac{p(x)}{q(x)}称为重要性权值。如果我们 sample非常多,那么这个重要性权不会有什么影响。但是,but,这是很理想的情况,真是情况不太可能sample的非常均匀且足够,如果这两个分布的方差非常大的话,sample的次数一旦不足,最后结果误差就会非常大!

所以现在提问Q:从p中采样和从q中采样方差Variance一样吗?

根据公式(还是概率论中的公式)Var[x] = E[x^2]-(E[x])^2来计算一下。

 其实p采样和q采样的方差就差了一项重要性权值,\frac{p(x)}{q(x)},也就是说只要我们保证这两个差别不要太大,结果就还是理想的。举个经典例子,上图

简单来说就是,q分布再右侧概率较大,sample时候容易偏向右,sample出来的正值的点多可能会计算错误,把f(x)均值计算成正的,但实际上它是负值。如果能采样到左边,\frac{p(x)}{q(x)}是一个绝对值很大的负值,就可以很好的纠正最后的计算结果。

on-policy在线 → off policy 离线

经过了这么多的验证,那么我们怎么把PPO从在线推到离线呢,就像这样。其实跟上面说的一样

这样整个策略梯度中,我们就可以用\theta'来更新\theta。这样就可以让\theta'采样大量数据,然后更新多次\theta,大大提升了效率。实际上做策略梯度时,我们并不是用整条轨迹\tau来做更新,而是根据每一个状态-动作(s_{t},a_{t}) 对来分别计算。实际更新梯度的过程用的其实就是下式:

然后在从在线推到离线:

A^{\theta}(s_{t},a_{t})上的\theta,代表是策略参数为\theta与环境交互,但实际上现在我们用的是\theta'来采样,现在这个优势就是用\theta'来估算的,这里先不管那么多,假设A^{\theta}(s_{t},a_{t})\approx A^{\theta'}(s_{t},a_{t})

然后我们在拆分这两项p_{\theta}(s_{t},a_{t})p_{\theta'}(s_{t},a_{t})

Q:这里恰一个问题:为什么要拆分呢?如果不拆分,p_{\theta}(s_{t},a_{t})或者 p_{\theta'}(s_{t},a_{t}),是什么,是我们输入一个动作-状态对,然后输出一个概率,但实际上我们的策略网络并不是这个结构,想一想策略网略是输入一个状态然后输出一个动作的概率分布啊。如果不懂可以接着往后看,看完代码在会后看看以这个问题。

现在梯度下降就可以看做是:

蓝框中的这一项可以消掉,原因可以说是不管是用\theta,还是\theta'看到同一状态的概率是一样的,又或者是这两项不好计算,想一想玩游戏时候,游戏画面复杂众多,好像计算某一个画面的出现概率很难计算,这里就直接消掉了,反正最后效果很好,神奇而玄学吧😂😂。

我们把要优化的目标的函数成为J(\theta),\theta是其中要优化的参数

再根据链式法带入,则得到最后的目标函数。(终于得到可以用的目标的函数了🤪🤪,是不是很easy)

  • θ 代表我们要去优化的参数
  • θ′ 是指我们用θ′ 做示范,就是现在真正在与环境交互的是θ′

近端策略优化

还记得开始的时候我们写的重要性采样原理吗?里面有很重要的一条的就是θ,θ′ 两个采样样本差异要小,这里就用KL散度(KL divergence)来衡量这个差异,如果你不知道KL散度是什么,可以看这篇。但是,这里我们只要记得KL散度就是用来衡量θ,θ′的差异大小
初学机器学习:直观解读KL散度的数学概念 - 知乎选自 http://thushv.com,作者:Thushan Ganegedara,机器之心编译。机器学习是当前最重要的技术发展方向之一。近日,悉尼大学博士生 Thushan Ganegedara 开始撰写一个系列博客文章,旨在为机器学习初学者介绍一些…https://zhuanlan.zhihu.com/p/37452654

 PPO的公式就是在上面策略梯度的基础上加上一个KL散度的限制

这里KL可以当做一个函数,注意这里θ 与 θ′ 的距离并不是参数上的距离,而是输出动作上的差异。

 PPO 有一个前身:信任区域策略优化(trust region policy optimization,TRPO)。TRPO 可表示为如下:

RPO 是很难处理的,因为它把 KL 散度约束当作一个额外的约束,没有放在目标(objective)里面,所以它很难计算。因此我们一般就使用 PPO,而不使用 TRPO 。PPO 与 TRPO 的性能差不多,但 PPO 在实现上比 TRPO 容易得多。

PPO1(近端策略优化惩罚

PPO 算法有两个主要的变种:近端策略优化惩罚(PPO-penalty)近端策略优化裁剪(PPO-clip)

PPO1 是近端策略优化惩罚(PPO-penalty),在 PPO 的论文里面还有一个自适应KL散度(adaptive KL divergence)。这里会遇到一个问题就,即β 要设置为多少?这里easy-rl解释的非常清楚了,我就直接引用了

KL 散度的值太大,这就代表后面惩罚的项βKL(\theta,\theta^{k}) 没有发挥作用,我们就把β 增大。另外,我们设一个 KL 散度的最小值。如果优化上式以后,KL 散度比最小值还要小,就代表后面这一项的效果太强了,我们怕他只优化后一项,使\theta与 \theta^{k} 一样,这不是我们想要的,所以我们要减小 β。β 是可以动态调整的,因此我们称之为自适应KL惩罚(adaptive KL penalty)。我们可以总结一下自适应KL惩罚:

 具体不再延伸,因为实际问题我们基本都会用PPO2而不是PPO1。本文的代码也是PPO2,所以向更具体了解的童鞋们可以再去看相关的论文。

 PPO2(近端策略优化剪裁)

PPO2可以说是简单粗暴,为什么这么说呢,看公式

计算KL散度太复杂,我干脆直接限定输出动作概率分布比值的最大最小值,就用min,和clip中的这一串,整个式子中:

  • min 是在第一项与第二项里面选择比较小的项
  • 有一个裁剪clip函数(代码中非常好实现,比如用numpy就有对应的api),裁剪函数是指,在括号里面有3项,如果第一项小于第二项,那就输出 1−ε;第一项如果大于第三项,那就输出 1+ε
  • ε 是一个超参数,是我们要调整的,

就是这么简单粗暴,但是,实际效果却非常好!对于clip函数,再放一张图让大家便于理解:

那么A是如何影响结果的呢,直接放图:

PPO2用了min,用了clip其实还是不想让  p_{\theta}(s_{t} \mid a_{t})p_{\theta^{k}}(s_{t} \mid a_{t}),差距过大,那么PPO2是怎么做到的?

  • 如果 A > 0,也就是某一个状态-动作对是好的,我们希望增大这个状态-动作对的概率。也就是,我们想让 p_{\theta}(s_{t} \mid a_{t})越大越好,但它与 p_{\theta^{k}}(s_{t} \mid a_{t})的比值不可以超过1+ε。根据重要性采样,如果比值过大很可能会导致结果不准确。
  • 如果 A < 0,也就是某一个状态-动作对是不好的,那么我们希望把 p_{\theta}(s_{t} \mid a_{t}) 减小。如果p_{\theta}(s_{t} \mid a_{t})比 p_{\theta^{k}}(s_{t} \mid a_{t})还大,那我们就尽量把它减小1−ε 的时候停止,此时不用再减得更小。

这样p_{\theta}(s_{t} \mid a_{t})p_{\theta^{k}}(s_{t} \mid a_{t})差距就不会太大。

这一章节我们分析了PPO1,PPO2,基本上所用到的理论都覆盖到了,下一章我们将一步步的写PPO2的代码。


http://chatgpt.dhexx.cn/article/emnr714O.shtml

相关文章

强化学习PPO代码讲解

阅读本文前对PPO的基本原理要有概念性的了解&#xff0c;本文基于我的上一篇文章&#xff1a;强化学习之PPO 当然&#xff0c;查看代码对于算法的理解直观重要&#xff0c;这使得你的知识不止停留在概念的层面&#xff0c;而是深入到应用层面。 代码采用了简单易懂的强化学习…

PPO算法(附pytorch代码)

这里写目录标题 一、PPO算法&#xff08;1&#xff09;简介&#xff08;2&#xff09;On-policy&#xff1f;&#xff08;3&#xff09;GAE &#xff08;Generalized Advantage Estimation) 三、代码代码解析&#xff1a; 一、PPO算法 &#xff08;1&#xff09;简介 PPO算法…

论文笔记之PPO

15年OpenAI发表了TRPO算法&#xff0c;一直策略单调提升的算法&#xff1b;17年DeepMind基于TRPO发表了一篇Distributed-PPO&#xff0c;紧接着OpenAI发表了这篇PPO。可以说TRPO是PPO的前身&#xff0c;PPO在TRPO的基础上进行改进&#xff0c;使得算法可读性更高&#xff0c;实…

PPO实战学习总结

PPO used in go-bigger 前段时间一直在学习ppo算法&#xff0c;写了 一点总结&#xff0c;记录一下自己对ppo算法的一些理解与RL实战时候容易遇到的一些问题。代码地址如下&#xff0c;需要的可以自取&#xff1a; https://github.com/FLBa9762/PPO_used_in_Gobigger.git一般…

PPO算法

在线学习和离线学习 在线学习:和环境互动的Agent以及和要学习的Agent是同一个&#xff0c; 同一个Agent&#xff0c;一边和环境做互动&#xff0c;一边在学习。离线学习: 和环境互动及的Agent以和要学习的Agent不是同一个&#xff0c;学习的Agent通过看别人完来学习。 利用新的…

PPO2代码 pytorch框架

PPO2代码玩gym库的Pendulum环境 2022-8-02更新 我发现这篇文章浏览量惨淡啊。 咋滴&#xff0c;是不相信的我代码能用是吗&#xff1f; 所以&#xff0c;我给出reward的收敛曲线图&#xff1a; 开玩笑&#xff0c;出来混&#xff0c;我能卖你生瓜码子吗&#xff1f; ———…

PPO实战

哈哈初学&#xff0c;复现龙龙老师的实例&#xff01; state&#xff1a;是平衡小车上的杆子&#xff0c;观测状态由 4 个连续的参数组成&#xff1a;推车位置 [-2.4&#xff0c;2.4]&#xff0c;车速 [-∞&#xff0c;∞]&#xff0c;杆子角度 [&#xff5e;-41.8&#xff0c…

PyTorch实现PPO代码

原理&#xff1a;Proximal Policy Optimization近端策略优化&#xff08;PPO&#xff09; 视频&#xff1a;Proximal Policy Optimization (PPO) is Easy With PyTorch | Full PPO Tutorial 代码来自github&#xff1a; Youtube-Code-Repository EasyRL 网站&#xff1a;Neural…

优化PPO

优化PPO 介绍core implementation details1.Vectorized architecture 量化结构Orthogonal Initialization of Weights and Constant Initialization of biases 算法权重的初始化以及恒定偏差的初始化The Adam Optimizer’s Epsilon Parameter Adam优化器的ε参数Adam Learning …

PPO Algorithm

‘‘目录 PPO ALGORITHM 进行看别人文章&#xff1a; 如何直观理解PPO算法?[理论篇] - 知乎 (zhihu.com) 【强化学习8】PPO - 知乎 (zhihu.com) PPO(OpenAI) Proximal Policy Optimization(PPO)算法原理及实现&#xff01; - 简书 (jianshu.com) 1-Critic的作用与效果.m…

PPO算法实战

原理简介 PPO是一种on-policy算法&#xff0c;具有较好的性能&#xff0c;其前身是TRPO算法&#xff0c;也是policy gradient算法的一种&#xff0c;它是现在 OpenAI 默认的强化学习算法&#xff0c;具体原理可参考PPO算法讲解。PPO算法主要有两个变种&#xff0c;一个是结合K…

Proximal Policy Optimization(近端策略优化)(PPO)原理详解

本节开始笔者针对自己的研究领域进行RL方面的介绍和笔记总结&#xff0c;欢迎同行学者一起学习和讨论。本文笔者来介绍RL中比较出名的算法PPO算法&#xff0c;读者需要预先了解Reinforcement-Learning中几个基础定义才可以阅读&#xff0c;否则不容易理解其中的内容。不过笔者尽…

【强化学习PPO算法】

强化学习PPO算法 一、PPO算法二、伪代码三、相关的简单理论1.ratio2.裁断3.Advantage的计算4.loss的计算 四、算法实现五、效果六、感悟 最近再改一个代码&#xff0c;需要改成PPO方式的&#xff0c;由于之前没有接触过此类算法&#xff0c;因此进行了简单学习&#xff0c;论文…

【深度强化学习】(6) PPO 模型解析,附Pytorch完整代码

大家好&#xff0c;今天和各位分享一下深度强化学习中的近端策略优化算法&#xff08;proximal policy optimization&#xff0c;PPO&#xff09;&#xff0c;并借助 OpenAI 的 gym 环境完成一个小案例&#xff0c;完整代码可以从我的 GitHub 中获得&#xff1a; https://gith…

autoit连接mysql数据库

原链接点我 一,准备工作 1, 下载mysql.au3(这个点击就下载了) 把mysql.au3放入到autoit的include目录下 2, 下载mysql驱动(根据自己系统选,下载完之后,双击运行会自动安装,一路next就行) 二,使用 #include "mysql.au3" #include <Array.au3> ;弹窗 Func aler…

AutoIt-v3的安装,和robotframework-autoitlibrary的导入

AutoIt 最新是v3版本&#xff0c;这是一个使用类似BASIC脚本语言的免费软件,它设计用于Windows GUI&#xff08;图形用户界面)中进行自动化操作。它利用模拟键盘按键&#xff0c;鼠标移动和窗口/控件的组合来实现自动化任务。而这是其它语言不可能做到或无可靠方法实现的。 Au…

selenium 上传下载调用windows窗口--AutoIT

AutoIT解决自动化上传下载文件调用Windows窗口 AutoIT下载安装使用AotuIt 操作windows上传窗口1. 打开AutoIt定位窗口组件2. 定位上传窗口属性 &#xff08;鼠标选中Finder Tool 拖拽至属性窗口&#xff09;3. 打开autoIt编辑器&#xff0c;编写代码4. 将脚本文件转成exe文件5.…

软件质量保证与测试 实验十一:AutoIt的使用

目录 实验概述实验内容1. 下载安装AutoIT。2. 测试win系统自带计算器程序&#xff0c; 246&#xff0c;是否正确&#xff1f; 写出Script。&#xff08;小提示&#xff1a;使用WinGetText获得输出&#xff09;3.测试win系统自带计算器程序&#xff0c; 写出3个以上的测试用例的…

selenium 用autoIT上传下载文件

一、下载安装AutoIT 下载并安装AutoIT&#xff0c;下载链接&#xff1a;https://www.autoitscript.com/site/autoit/AutoIT安装成功后&#xff0c;可以在开始菜单下看到AutoIT的所有工具&#xff0c;如下图所示&#xff1a; 其中分为几类&#xff0c;AutoIT Window Info用来识…

selenium autoit java_selenium+java利用AutoIT实现文件上传

转载自&#xff1a;https://www.cnblogs.com/yunman/p/7112882.html?utm_sourceitdadao&utm_mediumreferral 1、AutoIT介绍 AutoIT是一个类似脚本语言的软件&#xff0c;利用此软件我们可以方便的实现模拟键盘、鼠标、窗口等操作&#xff0c;实现自动化。 2、实现原理 利用…