Lee Hung-yi强化学习 | (2) Proximal Policy Optimization算法(PPO)_hung-yi lee ppo-程序员宅基地

技术标签: Lee Hung-yi强化学习  

Lee Hung-yi强化学习专栏系列博客主要转载自CSDN博主 qqqeeevvv,原专栏地址
课程视频
课件地址

1. On-policy vs. Off-policy

在这里插入图片描述
所谓 on-policy (左图)指我们学习的 agent(即actor) 和与环境交互的 agent 是相同的,即 agent 一边和环境互动,一边学习;

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

on-policy的过程是这样的:
在这里插入图片描述
1、使用actor π θ \pi_\theta πθ 去收集数据,用这些数据来进行参数的更新,此时参数 θ \theta θ变为KaTeX parse error: Expected group after '^' at position 7: \theta^̲'
2、由于参数 θ \theta θ变为KaTeX parse error: Expected group after '^' at position 7: \theta^̲',原本actor π θ \pi_\theta πθ收集的数据就不能用了,所以要重新收集数据
3、再根据actor KaTeX parse error: Expected group after '^' at position 12: \pi_{\theta^̲'}收集的数据,将参数KaTeX parse error: Expected group after '^' at position 7: \theta^̲'变为KaTeX parse error: Expected group after '^' at position 7: \theta^̲''
一直这样循环下去…………

  • On-policy的不足
    从上面的过程可以看出,更新后的actor KaTeX parse error: Expected group after '^' at position 12: \pi_{\theta^̲'} 的参数变为KaTeX parse error: Expected group after '^' at position 7: \theta^̲',原来的数据就不能用了。就是说每更新一次参数就需要重新去收集数据,这样更新的效率很低,很花时间。

  • 目标
    KaTeX parse error: Expected group after '^' at position 12: \pi_{\theta^̲'} 去收集数据,用这些数据去训练 π θ \pi_\theta πθ。这样就可以更新参数很多次而只用同一批数据,这就是off-policy。

2. Importance sampling

代表从分布p中取样本x送入f(x)并求期望,类似于从p中取N个 x i x^i xi,然后代入f(x)求平均(近似表示),即
在这里插入图片描述
现在假设我们不能从分布 p 中 sample 数据,只能从分布 q 中 sample,这样不能直接套上述近似。而要用:
在这里插入图片描述
即从p分布sample数据变为从q分布sample数据,只需在后面乘上一个weight,即 p ( x ) q ( x ) \frac {p(x)}{q(x)} q(x)p(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。
在这里插入图片描述
如上图所示,当从p中sample x时,大多数f(x)是负的,因此 E x ∼ p [ f ( x ) ] E_{x\sim p}[f(x)] Exp[f(x)]应该是负的;当sample次数不够多时(上图所示),上式不一定成立,如上图中从q中采样的x,因为sample次数不够多,很可能使得f(x)均为正(只sample到数量多的x),虽然 p ( x ) q ( x ) \frac{p(x)}{q(x)} q(x)p(x)很小,但也是正的,因此 E x ∼ q [ f ( x ) p ( x ) q ( x ) ] E_{x\sim q}[f(x)\frac{p(x)}{q(x)}] Exq[f(x)q(x)p(x)]应该是正的。所以,sample次数不够多时,上式不一定成立。

下面是sample次数足够的情况,此时上式是成立的。
在这里插入图片描述
可以看到,sample次数够多的时候,(在q中)可能就能sample到左边的点(出现数量少/概率低的x)。这样sample到左边绿线那个点的时候,f(x)是负的, p ( x ) q ( x ) \frac {p(x)}{q(x)} q(x)p(x)会得到一个很大的值,这样就会将原本是正的 E x ∼ q [ f ( x ) p ( x ) q ( x ) ] E_{x\sim q}[f(x)\frac{p(x)}{q(x)}] Exq[f(x)q(x)p(x)]拉回成负的。

但这个前提是sample足够多次。如果sample次数不够多,就会造成 E x ∼ p [ f ( x ) ] E_{x\sim p}[f(x)] Exp[f(x)] E x ∼ q [ f ( x ) p ( x ) q ( x ) ] E_{x\sim q}[f(x)\frac{p(x)}{q(x)}] Exq[f(x)q(x)p(x)]有很大的差别,这就是importance sampling的不足。

回到一开始,讲了importance sampling后,我们知道如何由θ变为θ’。只需将:
在这里插入图片描述
这样就能用actor π θ ′ \pi_{\theta'} πθ收集数据,给actor π θ \pi_{\theta} πθ去训练了。

使用 off-policy,使用梯度做参数更新时要注意的点:
在这里插入图片描述

  1. A θ ( a t , s t ) A^\theta(a_t,s_t) Aθ(at,st)是总计的Reward减掉bias(baseline),即 A θ ( s t , a t ) = R ( τ n ) − b A^\theta (s_t,a_t)=R(\tau^n)-b Aθ(st,at)=R(τn)b,就是衡量在状态st下采取动作at的回报。 A θ ′ ( a t , s t ) A^{\theta'} (a_t,s_t) Aθ(at,st)是根据 sample 到的数据计算。
  2. 因为是KaTeX parse error: Expected group after '^' at position 12: \pi_{\theta^̲'}与环境做互动,所以 A θ ( a t , s t ) A^\theta(a_t,s_t) Aθ(at,st)要变为 A θ ′ ( a t , s t ) A^{\theta'} (a_t,s_t) Aθ(at,st)
  3. 这里我们估计 p θ ( s t ) p θ ′ ( s t ) = 1 \frac {p_\theta(s_t)} {p_{\theta'} (s_t)}=1 pθ(st)pθ(st)=1,因为猜测 state 的出现与θ关系不大,况且这一项本来就无法计算,因为state出现的概率我们是不能控制或估计的。
  4. p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) \frac {p_\theta(a_t|s_t)} {p_{\theta'} (a_t|s_t)} pθ(atst)pθ(atst)可以直接算,
    由此可以得到新的目标函数:
    在这里插入图片描述
    上标 θ ′ \theta' θ代表跟环境互动的, θ \theta θ是要更新的参数。

3. PPO / TRPO算法

上面讲了 θ \theta θKaTeX parse error: Expected group after '^' at position 7: \theta^̲'相差太多(p分布和q分布相差太多),会导致结果错误。那么为了防止 θ \theta θ θ ′ \theta' θ相差太多,就可以使用PPO算法。
在这里插入图片描述
在原来的目标函数 J θ ′ ( θ ) J^{\theta'}(\theta) Jθ(θ)后再加一项约束值 β K L ( θ , θ ′ ) \beta KL(\theta,\theta') βKL(θ,θ),这个约束就像深度学习中的正则化项。

这一项和衡量 θ \theta θ θ ′ \theta' θ的差距,这里的差距指的是actor行为上的差距而不是参数上的差距。(不是两个网络参数之间的差距,而是两个网络输出的差距)。

下面这个是TRPO算法:
在这里插入图片描述

TRPO和PPO的区别:

TRPO在作梯度上升的时候,只对在这里插入图片描述求梯度上升,而KaTeX parse error: Expected group after '^' at position 17: …L(\theta,\theta^̲')只作为一个额外的约束,很难计算。(有约束优化问题)

而PPO的 β K L ( θ , θ ′ ) \beta KL(\theta,\theta') βKL(θ,θ)是放到优化目标中(无约束优化问题),这样作梯度上升的时候就是将一整个式子(包括 β K L ( θ , θ ′ ) \beta KL(\theta,\theta') βKL(θ,θ))一起算,比较容易算。

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

β \beta β要设多少呢?

PPO中 β \beta β 和学习率有点类似,需要手动设置。我们可以设定两个阈值 K L m a x KL_{max} KLmax K L m i n KL_{min} KLmin 。经过一次参数更新后,查看KL的值,如果KaTeX parse error: Expected group after '^' at position 17: …L(\theta,\theta^̲') 大于 K L m a x KL_{max} KLmax ,说明 θ \theta θ , θ k \theta^k θk 相差太大,需要加大 β \beta β ,加大惩罚。反之则减小 β \beta β ,减小惩罚。

上面讲的是PPO,下面要讲的是PPO2。
在这里插入图片描述
min(a,b)函数就是取a和b中的最小值。clip()函数的意思是: p θ ( a t ∣ s t ) p θ k ( a t ∣ s t ) \frac{p_\theta(a_t|s_t)}{p_{\theta^k}(a_t|s_t)} pθk(atst)pθ(atst) 小于 1 − ε 1-\varepsilon 1ε,则取 1 − ε 1-\varepsilon 1ε;若 p θ ( a t ∣ s t ) p θ k ( a t ∣ s t ) \frac{p_\theta(a_t|s_t)}{p_{\theta^k}(a_t|s_t)} pθk(atst)pθ(atst) 大于 1 + ε 1+\varepsilon 1+ε 则取 1 + ε 1+\varepsilon 1+ε ;若介于两者之间,则取 p θ ( a t ∣ s t ) p θ k ( a t ∣ s t ) \frac{p_\theta(a_t|s_t)}{p_{\theta^k}(a_t|s_t)} pθk(atst)pθ(atst) ,即输入等于输出。
在这里插入图片描述
上面为clip()函数的图像,横轴指的就是 p θ ( a t ∣ s t ) p θ k ( a t ∣ s t ) \frac{p_\theta(a_t|s_t)}{p_{\theta^k}(a_t|s_t)} pθk(atst)pθ(atst)

总的图像:
在这里插入图片描述
绿线代表min()函数的第一项的图像,蓝线代表min()函数的第二项的图像,红线代表最终min()函数的输出结果。

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

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

最后再放一下PPO和PPO2的对比:
在这里插入图片描述
这里有人纠结怎么一开始写的PPO是取期望,而这里的PPO和PPO2怎么变成是累加的?
在这里插入图片描述
TRPO / PPO2 等方法的实验效果:
在这里插入图片描述
这边可能不清晰,可以看论文原文
简单说一下,PPO(Clip)是紫色的线,可以看到每个任务中的效果都是名列前茅。

4. 总结

  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
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sdu_hao/article/details/108324853

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签