强化学习中的调参经验与编程技巧(on policy篇)
©PaperWeekly 原创 · 作者|张恒瑞
单位|北京交通大学
研究方向|强化学习
在强化学习的训练过程中,常常会遇见以下问题:
在某一环境中可以 work 的超参数拿去训练别的环境却训练不出来
训练时熵在增大
训练动作达到边界
本文通过调试几个环境的案例来探究强化学习的调参方法。
pendulum
摆锤这个环境可以看做连续控制中的入门环境了,环境初始时在一个随机的位置,目标是将其摆动以使其保持直立,它的状态维度为 3,动作维度为 1。
拟使用 PPO 解决这个问题,ppo 的流程如下:
使用 Actor 网络与环境交互一定步数,记录下(state, action, reward, v, done)
根据记录下来的值计算优势值 adv(更新 actor 网络使用)和 v_target(更新 critic 网络使用)
计算 loss 更新 actor 网络和 critic 网络
首先说第一步,在和环境交互的过程中,我们往往规定了步数,在规定的 step 内,环境往往没有 done,这会给我们这一次迭代计算 adv 有误差,面对这个问题,往往有两种处理方式:完成这次交互,也就是超过这一次规定的迭代步数直到 done,这样做会使每一次迭代更新时的交互 step 不同,比较不同算法在相同的step性能如何时略显不公平不完成这次交互,这样会使最后 step 采用 gae 对 adv 估值存在近似。
在 John Schulman's 程序中,对 V 估值采用这种方式:
V(s_t+1) = {0 if s_t is terminal {v_s_{t+1} if s_t not terminal and t != T (last step) {v_s if s_t not terminal and t == T
也就是最后一个 step 如果不是终止状态,则它下一状态的 V 估值为当前状态的 V 估值。在有的程序中,也采用 V 神经网络下一状态的值作为对下一状态的 V 函数估值。
第二步流程中计算 v_target 会根据是否采用 gae 有两种计算方式:
根据每一 step 的 reward 按照 gamma return 的方式计算 v_target
根据每一 step 的 adv 和 v 估值累加作为 v_target
第三步中 loss 计算包含有 aloss,vloss 和 entropy。
1.1 初始
我们先使用简单的 PPO 来训练一下环境,参数选择如下:
actor,critic 网络初始化为正交初始化
steps=2048;
batch=64;
lr=3e-4 且经过训练迭代数逐渐减小;
lam = lambda f: 1 - f / train_steps
self.opti_scheduler = torch.optim.lr_scheduler.LambdaLR(self.opti, lr_lambda=lam)
采用 return 方式计算v_target;
adv 计算采用 gae
loss 计算添加熵,系数(self.c_en)为 0.01
loss = aloss - loss_entropy*self.c_en + v_loss*self.c_vf
max_grad_norm=0.5
torch.nn.utils.clip_grad_norm_(self.critic.parameters(), self.max_grad_norm)
torch.nn.utils.clip_grad_norm_(self.actor.parameters(), self.max_grad_norm)
这些都是比较常规的 PPO 参数设置,进行 1000 迭代后(2048*1000 step)reward 变化如下:
算法并没有很好的学习,reward 在 100 iter 以内还有上升趋势,100iter 时突然下降,之后就再也起不来。
我们来看一下学习过程中各个诊断量变化情况。
、
vloss 一开始值很大,接着骤降,之后一直处于比较高的水平。
entropy 的变化幅度过快,最终值小于 0。这里简单提一下在连续密度分布中,熵值可能小于 0,拿高斯分布举例,如果其 sigma 过小,均值点处的密度概率可以远大于 1,熵值也为负数。综合来看,熵值出现小于 0 一般为 Actor 网络更新时sigma参数过小,可能是 actor 更新过快的原因。
1.2 clip V
为了让 critic 更新更合适,一般程序中采用 clipv 的技巧,防止更新前后 V 差距过大,对其进行惩罚,程序代码如下:
clip_v = oldv + torch.clamp(v - oldv, -self.epsilon, self.epsilon)
v_max = torch.max(((v - v_target) ** 2), ((clip_v - v_target) ** 2))
v_loss = v_max.mean()
同时程序中采用 gae 方式计算 v_target。
self.v_target = self.adv + self.v
进行 1000 迭代后(2048*1000 step)reward 变化如下:
reward 最终能呈上升趋势最终达到一个不错的值,但美中不足在于中间出现两次波折。
vloss 最终也能收敛到较小的值,但和 reward 类似在相同的地方出现了波折。
熵值的下降显得平稳多了。
观察 kl 散度变化,发现类似的地方出现 kl 散度过大的现象。
ppo 在一次迭代中使用同一批数据进行策略更新,要求策略变化不能过大,不然重要性采样就不再适用,所以在 ppo 的策略更新中采用了裁剪的技巧,但事实上即使这个技巧也不能保证限制 kl 散度大小,论文 IMPLEMENTATION MATTERS IN DEEP POLICY GRADIENTS: A CASE STUDY ON PPO AND TRPO 也指出裁剪没有起到真正作用。
1.3 kl early stop
为了防止 kl 散度过大,我们设置一个最大 kl 值,在每次迭代中当达到这个最大 kl 就停止这次迭代,继续下次采样数据,这里我们设置 kl_max=0.03。
继续进行 1000 迭代后(2048*1000 step)reward 变化如下:
似乎是有了一定改善,但中间还有一次波动。
看 kl 散度也比较平均。
1.4 normalization
考虑到 state, reward 我们还没有标准化,起初的 vloss 也比较大,我们决定这次从这里入手。
state 和 reward 都是在交互过程中产生的,我们无法在预先知道其平均值和方差,于是我们采用运行时均值和方差作为近似代替。
对每个 state 减去均值并除以标准差。
x = self.pre_filter(x)
if update:self.rs.push(x)
if self.demean:x = x - self.rs.mean
if self.destd:x = x / (self.rs.std + 1e-8)
if self.clip:x = np.clip(x, -self.clip, self.clip)
对 reward 我们只除以标准差。
x = self.pre_filter(x)
self.ret = self.ret*self.gamma + x
if update:self.rs.push(self.ret)x = x/(self.rs.std + 1e-8)
if self.clip:x = np.clip(x, -self.clip, self.clip)
return x
继续进行 1000 迭代后(2048*1000 step)reward 变化如下:
终于,reward 变得比较平稳了。
用最后的结果总结一下,如果 reward 长时间不能很好的上升,需要即时诊断其他重要变量变化情况,一般情况下 vloss 先下降再稍微上升最终平稳,entropy 的曲线则是下降最终平稳,不能太快也不能上升,kl散度变化不能过大。
mujoco
用我们以上学到的经验去调试 mujoco 中的 halfcheetah,hopper 和 walker2d。
这里主要调节每次 early_stop 的 max_kl,采样 3 个随机种子完成实验。
在 halfcheetah 环境中,目标 kl0.07 稳定性最差,可以看出在其他参数保持不变时,0.07 的限制依然导致每次策略更新时幅度过大,整体效果不够稳定。
在 hopper 环境中,依然是 kl0.07 的限制最不稳定。
在 walker2d 环境中,kl0.07 的效果却是最好的,这也说明在不同的任务环境中,超参数的选择也是不同的。
这些结果的表现来看也都达到或超过部分论文上 ppo 的效果了,如果想试试调节超参数的可以看看:
https://github.com/feidieufo/RL-Implementation/blob/master/algos/ppo/run_ppo_torch.py
如果你还不太清楚如何用 seaborn 绘制强化学习训练图,可以参考这篇:
https://zhuanlan.zhihu.com/p/75477750
deepmind control suite
dmc 是谷歌开发的强化学习环境套件(基于物理控制),和 mujoco 有类似的场景,但丰富了其任务设置,同时也提高了难度。
dmc 有相应的 gym 接口库,安装过 dmc2gym 后即可通过下面方式使用。
env = dmc2gym.make(domain_name=args.domain_name,task_name=args.task_name,seed=args.seed,visualize_reward=False,from_pixels=(args.encoder_type == 'pixel'),height=args.image_size,width=args.image_size,frame_skip=args.action_repeat
)
dmc 的状态输入有普通的 state 也有基于图片的 pixel,这里先用普通的 state 测试。
使用 cheetah run 作为任务环境。
先使用 mujoco 训练时使用的超参数,reward 如下:
reward 结果极其不稳定,最终也没有达到比较好的结果。
entropy在训练过程中由原来的8左右逐渐增大,这在以前的实验中都没有遇见。
查看 Actor 网络动作 std 的变化情况,由一开始设置的 1 越变越大,也正是如此导致了 entropy 的不降反升。
在 ppo 的 loss 中熵项的存在确实是希望动作随机保持探索,但最终 entropy 越来越大,也体现出 ppo 策略网络的不自信,我们考虑将 entropy 的系数变小。
试试系数为 0 的效果。
reward 有比较好的上升效果了。
熵也能正常的下降了。
比较这两次的实际运行情况:
可以看出第一次后期翻车了,第二次还是能比较不错的跑下去。
大家也可以试试熵前面系数 0~0.01 之间其他值:
https://github.com/feidieufo/RL-Implementation/blob/master/algos/ppo/run_ppo_dmc_torch.py
尝试总结一下,虽然 dmc 中的 cheetah-run 和 mujoco 的 halfcheetah 有类似的模型和动态转移,一开始的动作熵也在 8 左右,但 dmc 用同样的超参数熵就会上升,可能在于两者的 reward 不同,dmc 只有速度 reward,mujoco 还加上了控制 reward。
如果后面有时间的话还会补充上 dmc pixel 状态和 Atari 的调参过程,全部程序在:
https://github.com/feidieufo/RL-Implementation
欢迎点赞 star 和交流。
参考文献
[1] The 32 Implementation Details of Proximal Policy Optimization (PPO) Algorithm costa.sh/blog-the-32-im
[2] IMPLEMENTATION MATTERS IN DEEP POLICY GRADIENTS: A CASE STUDY ON PPO AND TRPO. ICLR2020
更多阅读
#投 稿 通 道#
让你的论文被更多人看到
如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。
总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。
PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学习心得或技术干货。我们的目的只有一个,让知识真正流动起来。
???? 来稿标准:
• 稿件确系个人原创作品,来稿需注明作者个人信息(姓名+学校/工作单位+学历/职位+研究方向)
• 如果文章并非首发,请在投稿时提醒并附上所有已发布链接
• PaperWeekly 默认每篇文章都是首发,均会添加“原创”标志
???? 投稿邮箱:
• 投稿邮箱:hr@paperweekly.site
• 所有文章配图,请单独在附件中发送
• 请留下即时联系方式(微信或手机),以便我们在编辑发布时和作者沟通
????
现在,在「知乎」也能找到我们了
进入知乎首页搜索「PaperWeekly」
点击「关注」订阅我们的专栏吧
关于PaperWeekly
PaperWeekly 是一个推荐、解读、讨论、报道人工智能前沿论文成果的学术平台。如果你研究或从事 AI 领域,欢迎在公众号后台点击「交流群」,小助手将把你带入 PaperWeekly 的交流群里。
强化学习中的调参经验与编程技巧(on policy篇)相关推荐
- 深度学习这么调参训练_聊一聊深度学习中的调参技巧?
本期问题能否聊一聊深度学习中的调参技巧? 我们主要从以下几个方面来讲.1. 深度学习中有哪些参数需要调? 2. 深度学习在什么时候需要动用调参技巧?又如何调参? 3. 训练网络的一般过程是什么? 1. ...
- 【经验】深度强化学习训练与调参技巧
来源:知乎(https://zhuanlan.zhihu.com/p/482656367) 作者:岳小飞 天下苦 RL 久矣,其中最苦的地方莫过于训练和调参了,人人欲"调"之而后快 ...
- 深度学习训练的小技巧,调参经验。总结与记录。
深度学习训练的小技巧,调参经验.总结与记录. 2016-10-23 23:07 390人阅读 评论(0) 收藏 举报 版权声明:本文为博主原创文章,未经博主允许不得转载. 经常会被问到你用深度学习训练 ...
- 多智能体强化学习:鼓励共享多智能体强化学习中的多样性
题目:Celebrating Diversity in Shared Multi-Agent Reinforcement Learning 出处:Neural Information Processi ...
- 最新综述 | 强化学习中从仿真器到现实环境的迁移
©PaperWeekly 原创 · 作者|李文浩 学校|华东师范大学博士生 研究方向|强化学习 最近 survey 了一下 sim2real 领域最近的相关工作,先整理个第一版(共有七篇论文)的总结. ...
- sklearn中SVM调参说明
写在前面 之前只停留在理论上,没有实际沉下心去调参,实际去做了后,发现调参是个大工程(玄学).于是这篇来总结一下sklearn中svm的参数说明以及调参经验.方便以后查询和回忆. 常用核函数 1.li ...
- 八千字长文深度解读,迁移学习在强化学习中的应用及最新进展
点击我爱计算机视觉标星,更快获取CVML新技术 本文经机器之心(微信公众号:almosthuman2014)授权转载,禁止二次转载. 机器之心原创 作者:Luo Sainan 编辑:H4O 迁移学习通 ...
- 从多臂老虎机开始学习强化学习中的探索与利用
从多臂老虎机开始学习强化学习中的探索与利用 \quad 目录 从多臂老虎机开始学习强化学习中的探索与利用 多臂老虎机问题 形式化描述 估计期望奖励 代码实现 策略中的探索与利用 ϵ\epsilonϵ- ...
- 初探强化学习(10)强化学习中的一些术语(non-stationray,sample efficiency,planning和Learnin,Reward,off-policy和on-policy )
1. 关于stationray 参考博客. Stationary or not 根据环境是否稳定.可以将强化学习问题分为stationary.non-stationary. 1.1 stationar ...
最新文章
- 7-8 Windows消息队列 (25 分)
- 魔域几点服务器重置,服务器维护后第一轮BOSS时间以及每张地图的BOSS点!
- android 网络时区 错误,React native 安卓机器上调试代码报错:网络请求出错TypeError: Network request failed...
- 近期值得读的10篇GAN进展论文
- 用Socket 打造跨语言跨操作系统的网络MORPG游戏(一)
- Stack Overflow引入CROKAGE,搜问题不用再东拼西凑
- 一、数据预处理——数据归一化 数据标准化
- html action能跨域么,ASP.NET MVC 中设置跨域
- 张一鸣回忆7年创业历程:小民宅里诞生第一版推荐引擎
- linux进入uvc目录,Linux uvc驱动分析
- 【读书笔记《Bootstrap 实战》】4.企业网站
- 学习随笔#13 模型预测控制(MPC)
- 自然语言处理核心期刊_中文核心期刊简介及投稿推荐.PDF
- 交换机设备登录账号权限1_h3c交换机设置用户权限
- Eclipse插件(RCP)自定义透视图
- 解决ftp 出现Passive mode refused的办法
- MacBook Pro 16寸 i9-9880H对比 桌面级CPU i7-8700
- 句向量 Sentence Embedding
- 这届铲屎官不错,既舍得花钱,又会科学养猫养狗
- 程序是计算机要执行的指令的集合,计算机基础(示例代码)
热门文章
- 反射如何拿到私有属性_JAVA中反射机制的价值
- python history没有定义_python AttributeError:'Tensor'对象没有属性'_keras_history'_python_酷徒编程知识库...
- python3super用法_Python3中的super()函数详解
- CodeForces 901C Bipartite Segments
- 基于pythonselect.select模块通信的实例讲解
- WannaCry勒索比特币蠕虫病毒解决方案
- 深入基础(一)模块化
- JavaScript系列文章:谈谈let和const
- 项目分析(map复习)
- DotNetNuke与MemberShip的结合(五年版) 三步汇总