转载文章,学习一下强化学习.并且也有申老师关于强化学习的一些精彩论述,在这里和大家汇报一下我的学习情况。
天下苦深度强化学习久矣,这有一份训练与调参技巧手册
https://geek.csdn.net/65d5ab8ab8e5f01e1e460619.html
©作者 | 申岳
单位 | 北京邮电大学
研究方向 | 机器人学习
作者:WYJJYN(申岳 )
链接:https://zhuanlan.zhihu.com/p/95991017
以下是我看过对深度强化学习理解最为清晰客观的一些观点,对于后续学习有极大的帮助。
第一幕
人工智能闯入公众视野不是因为AlexNet的横空出世,而是AlphaGo击败李世石引起的轩然大波。深度强化学习不断展现了其强大的解决问题的能力。并且随着大模型与强化学习的深度结合,有一次震惊了全世界。
如今的DRL已经是图文与公式并茂,paper与代码齐飞。算法工作者面对这样的时代,就更应该保持“知行和一”,也就是需要经历从冲向算法原理,到广泛动手实践再到上升到统一方法论这三个必要阶段,唯有如此才算真正掌握了知识。对这两年DRL落地工作中的一些感悟和心得做些粗略总结,若能对读者启发一二则善莫大焉,如有纰漏谬误也真心期待得到大家的批评指正,我深信持续的交流是进步的源泉,也是我写下这些文字的初衷。
强化学习源于学术高于学术
DRL落地面涉及相当广泛,真正的目标是在现实应用中获得实实在在的性能提升,为企业创造肉眼可见的价值,我们无法自由选择较弱的baseline自欺欺人。没有Gym那样的虚拟环境,我需要自己搭建模拟器,定义状态空间,动作空间和奖励函数。还需要切实考虑算法的实用性,比如模拟器的reality gap是否足够小,对不同应用场景的泛化性如何,模型的训练时间是否可控,inference运算效率能不能更上,对各种异常、延时和误差鲁棒性等等。也就是常说的落地源于学术又高于学术。
第二幕
丑化说在前头,任何机器学习方法都不是包治百病的灵丹妙药,他们也有各自的舒适圈,有时候还相当挑剔。强化学习,无论带不带“深度”二字,也同样有其鲜明的优势和局限性,务必要具体问题具体分析。不管别人吹嘘得多么厉害,我也要摆正心态,不是所有需求都适合用DRL做,适合用DRL做的需求也未必能超越传统方法。
在我看来,算法工程师核心能力总结为以下三点:
一是对各种算法本质及其能力边界的深刻理解
二是对问题内在逻辑的深入分析
三是对两者结合的敏锐直觉
优秀的算法工程师的高光时刻从拒绝不合理的需求开始,其他的都是后话。不经过慎重评估而盲目上马的项目不仅是对资源的巨大浪费,更让每个参与者陷在深坑中痛不欲生。知道一种算法不能干什么与知道它能干什么同样重要,对DRL而言,即使是在最理想的外部条件下,也有绕不过去的七寸——泛化无能。这是DRL的基本原理决定的,任何在这一点上提出过高要求的应用都不适合用DRL解决。
DRL过拟合天性使然,即DRL解决的是从过去的经验中学习有用知识,并用于后续决策的问题。有别于纯视觉应用,DRL不仅仅满足于识别和定位,而是根据这些信息采取针对性的行动以获取最大长期收益。从本质上来说,DRL就是一种依赖过拟合的算法,说白了就是通过暴力搜索把其中的成功经验记下来,并用以知道后续决策。
别嫌露骨,别怕尴尬,岂不闻学术界某大牛的辛辣讽刺仍余音绕梁——强化学习是唯一被允许在训练集上测试的算法。由于缺乏直接监督信号用于训练,DRL还特别“费数据”,以至于需要专门的模拟器源源不断地产生数据供其挥霍。好不容易训出来的policy在训练环境用得好好的,换个环境立马歇菜。
等等,不是说好了DNN有泛化能力吗?ResNet明明能在一张没见过的图片中识别出阿猫阿狗的呀。这是因为任务层次不同,泛化的定义和要求自然也不同。视觉识别层面的泛化可以理解为深度网络学习到了通用的高层语义信息,以至于只要看到类似的像素结构就能与高层语义对应起来。这个层次的泛化能力DRL也可以有,可惜远远不够。我们前边说过,DRL是要根据识别到的信息做出决策以最大化长期收益的,具体地,DRL拟合了一个特定环境、特定reward函数和当前policy下,从特定输入状态(state)到最终收益(episode结束时)的Value函数,再反过来根据这个函数去优化policy,使其输出的action最大化该Value函数。这是一个交替更新的过程,Value函数和policy你中有我我中有你,直到抵达某种纳什均衡。假设探索足够充分,我们可以认为最终的Value函数只由环境特性和reward函数决定。
OK,整理一下DRL的逻辑链条:Value函数过拟合环境特性和reward函数,Policy又过拟合Value函数。一朝天子一朝臣,一种环境一种policy,环境换了,policy废了。在训练环境中agent看到家猫,发现喂食可以得到高回报,于是用policy记了下来,在测试环境中,家猫换成野猫,虽然识别到的还是猫,agent继续喂食,然后就被猫抓了……相信看到这里,你就能明白为什么DRL被允许在训练集上测试了,也明白为什么DRL泛化无能了,因为这个level的泛化要求太TM高了!即使是人类在缺乏相关经验的情况下也会踩坑,但人类能做到吃一堑长一智,甚至从此主动避开所有可能有危险的动物,这得益于人类的两大核心优势:高效学习(只需极少样本)和终身学习(举一反三、融会贯通),而现阶段DRL却只会低效地死记硬背,训练也是一锤子买卖,这是真正的智能对人工智能的降维碾压。
使用RL的建议
太长不看版
- 学习 RL 和 Stable Baselines3
- 如有必要,进行定量的实验和超参数调整
- 使用单独的测试环境评估效果(记得要检查 wrappers!)
- 想要更好的效果,就增加训练预算
目前RL的局限
- Sample Inefficient:Model-free RL 算法通常需要大量样本(有时需要上百万次交互)才能学到有用的信息。
- 对超参数和随机种子敏感:RL 的结果可能因超参数或随机种子的不同而变化。
- Reward Function Design:设计良好的奖励函数需要专业知识和多次迭代。
如何评估RL算法?
- 使用独立的测试环境评估算法,建议每交互 N 次后测试 n 个 episodes,取平均值作为单个 episode 的 reward。
- 在测试时,对于 A2C、PPO 等算法,调用
.predict()
时应设置deterministic=True
。 - 查看 training curve 是一种不错的方式,但可能会低估 agent 的真实表现。
我该使用哪种算法?
- 离散动作空间:DQN
- 连续动作空间:SAC
- 扩展版本:DQN 的连续版本 NAF,SAC 的离散版本 SAC-Discrete
- 并行训练:A2C 和 PPO 适合并行训练,可参考 Vectorized Environment。
创建自定义环境的Tips和Tricks
- Normalization:尽量对 observation space 和 action space 进行归一化。
- Reward Shaping:从 shaped reward 开始,简化问题。
- 测试环境:使用随机动作测试环境是否正常。
示例代码:检查自定义环境是否正常
from stable_baselines3.common.env_checker import check_env
env = CustomEnv(arg1, ...)
check_env(env) # 检查自定义环境并输出警告
示例代码:使用随机动作测试环境
env = YourEnv()
obs = env.reset()
n_steps = 10
for _ in range(n_steps):
action = env.action_space.sample()
obs, reward, done, info = env.step(action)
if done:
obs = env.reset()
实现RL算法的Tips和Tricks
- 步骤:
- 多次阅读原始论文。
- 查看现有实现。
- 在简单环境中测试算法。
- 在更复杂的环境中运行算法,并进行调参。
个人心得
- Normalization:对于机械臂的末端位置,建议使用相对工具系的归一化,增强泛化能力。
- Reward Engineering:先进行 reward shaping,再考虑 sparse reward。
- 网络结构:向量输入时,通常 2~3 层隐藏层(每层 128 或 256 节点)即可。
其他资源
- 深度强化学习调参技巧:知乎专栏
- 深度强化学习落地指南:知乎专栏
- 知乎问题:深度学习调参有哪些技巧?
- **原文参考 **: 知乎
参考文献
- Stable Baselines3 文档
- RL Tips and Tricks
- RL 教程
- RL 教程代码
- RL Zoo
- RL 的困难
- ANYmal 机器人
- Deep Mimic
- Evaluation 模块
- Callbacks 模块
- Deep Reinforcement Learning that Matters
- Cédric Colas 的博客
- Stable Baselines Issues
- NAF 算法
- SAC-Discrete 算法
- Vectorized Environment
- Ape-X 算法
- Stable Baselines3 Pull Request
- RL 算法指南
- HER 算法
- 自定义环境指南
- Colab Notebook 示例
- Stable Baselines Issues
- Stable Baselines Issues
- RL 研究的 Nuts and Bolts
- RL 研究视频
- Spinning Up
- 机械臂环境
- Spinning Up 代码
缘起
随着这波人工智能浪潮的兴起,强化学习(Reinforcement Learning,RL)这坛陈年老酒也借势找到了深度学习这个新瓶子,重新吸引了学术界、工业界乃至吃瓜群众的注意力。对于很多人来说,AI闯入他们视野的标志性事件不是2012年AlexNet的横空出世,而是AlphaGo击败李世石引起的轩然大波。可以这样说,深度强化学习(DRL)不仅点燃了世人对AI的热情,而随着CV方向性能瓶颈的出现,作为一个缺点多多、槽点满满的算法框架,DRL正在吸引越来越多的学者前来填坑,从各大AI顶会RL方向文章数量的逐年上升可见一斑。
算法工作者的“知行合一”
如今网上关于DRL的科普文可谓汗牛充栋,图文与公式并茂,paper与代码齐飞。我自知水平有限,无意在DRL科普界班门弄斧。另一方面我认为算法工作者不应只局限在原理层面,看懂很多公式不代表拥有动手能力;也不应满足于跑通toy tasks的demo,知其然不知其所以然,面对实际问题时可能依旧一头雾水。算法工作者的“知行合一”,需要经历从抽象算法原理到广泛动手实践再上升到统一方法论这三个必要阶段,唯有如此才算真正掌握了知识。