技术标签: Lee Hung-yi强化学习
Lee Hung-yi强化学习专栏系列博客主要转载自CSDN博主 qqqeeevvv,原专栏地址
课程视频
课件地址
所谓 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。
代表从分布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)
可以看出 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)] Ex∼p[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)}] Ex∼q[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)}] Ex∼q[f(x)q(x)p(x)]拉回成负的。
但这个前提是sample足够多次。如果sample次数不够多,就会造成 E x ∼ p [ f ( x ) ] E_{x\sim p}[f(x)] Ex∼p[f(x)]和 E x ∼ q [ f ( x ) p ( x ) q ( x ) ] E_{x\sim q}[f(x)\frac{p(x)}{q(x)}] Ex∼q[f(x)q(x)p(x)]有很大的差别,这就是importance sampling的不足。
回到一开始,讲了importance sampling后,我们知道如何由θ变为θ’。只需将:
这样就能用actor π θ ′ \pi_{\theta'} πθ′收集数据,给actor π θ \pi_{\theta} πθ去训练了。
使用 off-policy,使用梯度做参数更新时要注意的点:
上面讲了 θ \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(at∣st)pθ(at∣st) 小于 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(at∣st)pθ(at∣st) 大于 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(at∣st)pθ(at∣st) ,即输入等于输出。
上面为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(at∣st)pθ(at∣st)。
总的图像:
绿线代表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θ(at∣st)越大越好(即横轴代表的 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(at∣st)pθ(at∣st) 增大),但是 p θ ( a t ∣ s t ) p_\theta(a_t|s_t) pθ(at∣st) 和 p θ k ( a t ∣ s t ) p_{\theta^k}(a_t|s_t) pθk(at∣st) 二者不能相差太多,所以设了一个上界 1 + ε 1+\varepsilon 1+ε (上图左边);A<0,则说明当前的action不好,所以希望 p θ ( a t ∣ s t ) p_\theta(a_t|s_t) pθ(at∣st) 越小越好(即横轴代表的 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(at∣st)pθ(at∣st) 减小),同理同样要设一个下界 1 − ε 1-\varepsilon 1−ε 。
最后再放一下PPO和PPO2的对比:
这里有人纠结怎么一开始写的PPO是取期望,而这里的PPO和PPO2怎么变成是累加的?
TRPO / PPO2 等方法的实验效果:
这边可能不清晰,可以看论文原文
简单说一下,PPO(Clip)是紫色的线,可以看到每个任务中的效果都是名列前茅。
文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib
文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang
文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些
文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器
文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距
文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器
文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn
文章浏览阅读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
文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql
文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...
文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120
文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数