- 深度 | David Silver 全面解读深度强化学习:从基础概念到 AlphaGo
- 深度 | 深度学习漫游指南:强化学习概览
- 重磅 | 详解深度强化学习,搭建DQN详细指南(附论文)
- 独家 | 吴恩达NIPS 2016演讲现场直击:如何使用深度学习开发人工智能应用?
- 深度 | 迁移学习全面概述:从基本概念到相关研究
- 深度 | 理解深度学习中的卷积
- 专访 | 东南大学漆桂林教授:知识图谱不仅是一项技术,更是一项工程
- 综述 | 知识图谱研究进展
- 盘点 | 机器学习入门算法:从线性模型到神经网络
- 深度神经网络全面概述:从基本概念到实际模型和硬件基础
- 想了解概率图模型?你要先理解图论的基本定义与形式
- 机器理解大数据的秘密:聚类算法深度详解
- 图灵测试通过事件的噱头以及沉思
- 重磅 | DeepMind 最新生成模型 WaveNet,将机器合成语音水平与人类差距缩小 50%(附论文)
- 谷歌最新的全端到端语音合成系统
- 人工智能能骗过人类吗?愚人节特写:这不是玩笑
- 三张图读懂机器学习:基本概念、五大流派与九种常见算法
- LSTM 入门必读:从基础知识到工作方式详解
- 从语言学到深度学习 NLP 一文概述自然语言处理
- 最全的 DNN 概述论文:详解前馈、卷积和循环神经网络技术
- 从贝叶斯定理到概率分布:综述概率论基本定义
- 追根溯源!一图看尽深度学习架构谱系
- 徒手实现 CNN:综述论文详解卷积网络的数学本质
- 读懂概率图模型:你需要从基本概念和参数估计开始
- 从零开始:教你如何训练神经网络
- 开发者必读:计算机科学中的线性代数
- 学界 | 定量研究:当前机器学习领域十大研究主题
- 机器学习和深度学习引用量最高的 20 篇论文(2014-2017)
- 从贝叶斯角度,看深度学习的属性和改进方法
- 良心 GitHub 项目:各种机器学习任务的顶级结果(论文)汇总
- 深度 | 从朴素贝叶斯到维特比算法:详解隐马尔科夫模型
- 揭秘深度学习成功的数学原因:从全局最优性到学习表征不变性
- 深度 | 从 AlexNet 到残差网络,理解卷积神经网络的不同架构
- 从 Pix2Code 到 CycleGAN:2017 年深度学习重大研究进展全解读
- OpenAI 详解进化策略方法:可替代强化学习
- 从自编码器到生成对抗网络:一文纵览无监督学习研究现状
- 资源 | 从文本到视觉:各领域最前沿的论文集合
- 从决策树到随机森林:树型算法的原理与实现
- 从概率论到多分类问题:综述贝叶斯统计分类
- 从遗传算法到 OpenAI 新方向:进化策略工作机制全解
- 综述 | 一文帮你发现各种出色的 GAN 变体
- 资源 | 生成对抗网络及其变体的论文汇总
- 生成对抗网络综述:从架构到训练技巧,看这篇论文就够了
- 干货 | 物体检测算法全概述:从传统检测方法到深度神经网络框架
- 重磅 | 自动驾驶计算机视觉研究综述:难题、数据集与前沿成果(附 67 页论文下载)
- 神经风格迁移研究概述:从当前研究到未来方向(附论文和代码)
- 深度学习目标检测模型全面综述:Faster R-CNN、R-FCN 和 SSD
- 计算机视觉这一年:这是最全的一份 CV 技术报告
- 计算机视觉这一年:2017 CV 技术报告 Plus 之卷积架构、数据集与新趋势
- 深度 | 2017 CV 技术报告之图像分割、超分辨率和动作识别
- 深度 | 2017CV 技术报告:从 3D 物体重建到人体姿态估计
- 语音合成到了跳变点?深度神经网络变革 TTS 最新研究汇总
- 资源 | 从全连接层到大型卷积核:深度学习语义分割全指南
- 学界 | 词嵌入 2017 年进展全面梳理:趋势和未来方向
- 深度 | 一文概述 2017 年深度学习 NLP 重大进展与趋势
- 学界 | 一文综述所有用于推荐系统的深度学习方法
- 使用深度学习构建先进推荐系统:近期 33 篇重要研究概述
- 业界|谷歌 TensorFlow 的一份全面评估报告:好的坏的及令人讨厌的
- 初学者怎么选择神经网络环境?对比 MATLAB、Torch 和 TensorFlow
- 业界 | 剖析用于深度学习的硬件:GPU、FPGA、ASIC 和 DSP
- 神经形态计算与神经网络硬件最全调查:从研究全貌到未来前景
- 从 GPU、TPU 到 FPGA 及其它:一文读懂神经网络硬件平台战局
- 从浅层模型到深度模型:概览机器学习优化算法
- 综述论文:当前深度神经网络模型压缩和加速方法速览
- 深度 | 从修正 Adam 到理解泛化:概览 2017 年深度学习优化算法的最新研究进展
- 一文概览深度学习中的五大正则化方法和七大优化策略
- 从强化学习基本概念到 Q 学习的实现,打造自己的迷宫智能体
- 回归、分类与聚类:三大方向剖解机器学习算法的优缺点(附 Python 和 R 实现)
- 基于 TensorFlow 理解三大降维技术:PCA、t-SNE 和自编码器
- 一文读懂遗传算法工作原理(附 Python 实现)
- 10 大深度学习架构:计算机视觉优秀从业者必备(附代码实现)
- 从算法到训练,综述强化学习实现技巧与调试经验
- 2017 年度盘点:15 个最流行的 GitHub 机器学习项目
从算法到训练,综述强化学习实现技巧与调试经验
本文整理自 John Schulman 题为「深度强化学习研究的具体内容」的演讲,主要内容是作者在加州大学伯克利分校参加夏季深度强化学习训练营时写下的技巧。
GitHub 地址:https://github.com/williamFalcon/DeepRLHacks
调试新算法的技巧
1. 通过低维状态空间环境的使用简化问题。
- John 建议使用钟摆问题,因为它具有 2 维状态空间(摆角与速度)。
- 便于得到值函数的形式和算法应处的状态,以及它们随时间如何演化。
- 直观地了解为什么某些参数不起作用(也可以说,价值函数是否足够平滑等)
2. 为了测试你的算法是否合理,你要构造一个适用于该算法的问题。
- 例如:对于分层强化学习,你要构建一个它应该会学习的明显的分层结构的问题。
- 该问题可以简单测试出算法是否合理。
- 警告:不要使算法过度拟合你这个玩具问题(你要知道玩具问题并不具有实际意义)。
3. 熟悉你知道的某些环境。
- 随着时间的推移,你将会知道训练应该花费多长时间。
- 知晓奖励信号的演化过程等。
- 允许你设置一个基准,以了解你过去试验的效果。
- John 使用弹跳机器人,通过这个机器人他知道应该采取多快的学习速度,并且可以很容易地发现奇怪的行为。
调试新任务的技巧
1. 简化任务
- 开始简化直到曙光降临。
- 方法 1 :简化特征空间:
◦ 例如,如果你正在使用图像(巨大的维度空间)学习,那么可能先要手动处理图像特征。示例:如果你觉得你的函数正在尝试近似得到某个参数的位置,请使用 x,y 坐标位置作为步骤 1 的特征。
◦ 一旦前一步开始工作,将使问题更加复杂,直到你解决所有的问题。
- 方法 2:简化奖励函数。
◦ 这样你就可以快速地得到反馈,从而知道算法是否正确。
◦ 例如:当机器人击中目标时有奖励(+1)。这通常很难学习,因为在开始和奖励函数之间的不确定因素太多了。将问题重新定位为目标的距离,这将增加学习,并带来更快的迭代速度。
在强化学习中构建问题的技巧
也许现在还不清楚这些特征是什么,奖励是什么,甚至它是否可行。
1. 第一步:可视化处理这个问题的随机策略。
- 看看它的效果。
- 如果随机策略奏效过,那么很有可能强化学习会得到预期的效果。
◦ 策略梯度会发现这种行为,并使其更有可能。
- 如果随机策略从未奏效,那么强化学习基本也不用考虑了。
2. 确保评论有用:
- 通过给个体同样的评论来测试你能否控制这个系统。
◦ 示例:自己查看预处理的图像,以确保没有删除必要的细节或某种程度上阻碍了算法。
3. 确保合理地缩放特征。
经验法则:
◦ 评论:取特征均值为 0,标准差为 1。
◦ 奖励: 如果你能控制它,就把它放缩到一个合理的值。
◦ 对当前所有数据进行处理。
- 观测所有的评论和奖励,确保没有过度的异常值。
4. 每当你碰到一个新问题,都要找好出发点。
- 目前还不清楚哪种算法可行,因此有一组出发点(从其他方法)
◦ 交叉熵法
◦ 策略梯度法
◦ 某种 Q-learning 方法 (点击 OpenAI Baselines 或 RLLab 开始学习)
重现论文代码
依托论文来重现其中的实验结果有时(很多时候)很难。下面有一些技巧可能帮到你:
1. 使用多于你当前所需的样本。
2. 采用正确的策略,但这并非绝对。
- 循序渐进,一点一点的改进算法。
- 然后微调超参数使其具有泛化能力。
- 使用更大的批量可以使算法作用于所有数据。
◦ 如果批量太小,噪声会掩盖信号。
◦ 例如:TRPO,John 用的批量太小,只好设置时间步为 100k。
◦ DQN 的最佳超参数为:10k 时间步,1mm 帧置于 replay buffer。
训练指导手册
全面检查你的训练是否奏效。
1. 查看每个超参数的灵敏度
- 如果算法过于敏感,那么就是算法不够鲁棒,我们不应该满足于此。
- 有时一个莫名的变动会使算法奏效,但这并不具有泛化能力。
2. 监测优化过程中的指标是有益的。
- 变化值
- 观察价值函数是否精确。
◦ 预测是否有效?
◦ 预测的返回值正常吗?
◦ 更新范围有多大?
- 来自深度网络的标准诊断
3. 有一个连续的基准测试系统。
- 需要惩罚。
- 比较你尝试过的所有问题的性能。
◦ 有时,它对于一个问题有效,但对别的问题就错乱了。
◦ 容易过拟合某一个问题。
- 有一套你偶尔运行的基准测试系统。
4. 误以为你的算法有效,但实际上看到的是随机噪音。
- 例子:7 个任务的 3 个算法图,看起来像 1 个算法,可能在适用于所有问题,但事实证明却是随机种子不同的相同算法罢了。
5. 尝试不同的随机种子!!
- 多次运行并取平均值。
- 在多个种子上运行多个任务。
◦ 否则,算法可能会过拟合。
6. 算法大可不必修改。
- 大多数技巧实际上是以某种方式规范化特征或改进你的优化过程。
- 很多技巧也有同样的效果…所以你可以删除其中的一些,简化你的算法(非常关键)。
7. 简化你的算法
- 泛化能力更佳
8. 实验过程自动化
- 不要花一整天的时间看你的代码输出结果。
- 在云服务上进行实验并分析结果。
- 使用框架跟踪实验和结果:
◦ 大多使用 iPython notebooks。
◦ 似乎不需要将结果存进数据库。
通用的训练策略
1. 白化(Whiten)和标准化数据(一开始就对所有数据进行处理)。
- 评论:
◦ 通过计算运行平均值和标准差来计算。然后对所有数据进行 z 变换。处理所有数据(不仅仅是最近的数据)。
◦ 评论所有看到的数据(不只是最近的数据)
◦ 至少它会随着时间的推移而缩小,它随时间变化的很快。
◦ 如果你不断改变目标,可能会误导优化器。
◦ 缩放(用新数据)意味着你的优化器可能不认识这些数据,并且性能将大打折扣。
- 奖励:
◦ 缩放但不转移数据。
◦ 影响代理发展的意愿。
◦ 会改变问题(换句话说,你想要代理生存多久)。
- 规范目标:
◦ 与奖励相同。
- PCA 白化?
◦ 有用
◦ 首先看看它是否真的有助于神经网络。
◦ 过度的缩放(-1000,1000)或(-0.001,0.001)肯定会使学习缓慢。
2. 表示折扣因子的参数。
- 确定你的信用分配。
- 例如:如果因子是 0.99,那么你就会忘记 100 步之前发生了什么... 这意味着你目光短浅。
◦ 最好去关注它如何应用于实时数据。
◦ 为了更好的感受,在强化学习中我们通常将时间离散化。
◦ 这 100 步是实际时间的 3 秒吗?
◦ 那段时间里会发生什么?
- 如果 TD 方法用于估计值函数 fx 的策略梯度,则 gamma 可以接近 1(如 0.999)
◦ 算法变得非常稳定。
3. 这个问题可以在离散化的层次上真正解决。
- 例如:在游戏中,如果你正在做跳帧。
◦ 作为一个人,你是否能控制它?
◦ 看看随机探索的样子
◦ 离散化决定你的布朗运动走多远。
◦ 如果连续做许多动作,那么算法就倾向于进一步探索。
◦ 用一种有效方式来将你的时间离散化。
4. 密切关注每段训练返回值。
- 不只是看看最大值和最小值。
◦ 最好的回馈是你的策略可以得到很好的磨合。
◦ 你的策略总是按预期来的吗??
- 看 episode 长度(有时比它的奖励更有用)。
◦ 如果在游戏中你每次都输,所以你可能永远赢不了,但是…episode 长度可以告诉你,如果你输的速度较慢。
◦ 你可能在开始时看到 episode 长度的改进,但不一定是奖励。
策略梯度方法调整
1. 密切关注熵
- 动作空间的熵
◦ 更关注状态空间中的熵,但没有很好的计算方法。
- 如果梯度下降得太快,那么策略就会变得确定而不再探索。
- 如果梯度不下降,那么策略就不正确,因为它实际上是随机的。
- 可以修复:
◦ KL 惩罚
◦ 防止梯度下降过快。
◦ 为熵加权重。
- 如何测量熵。
◦ 对于大多数策略,可以解析地计算熵。
◦ 如果熵连续,通常是高斯的,所以可以计算微分熵。
2. KL 散度
- 从 KL 散度看更新的大小。
- 例子:如果 KL 是 0.1,更新过小。如果是 10 更新又过大。
3. 以方差为基准。
- 看看价值函数是否真的是一个好的预测器或奖励。
◦ 如果方差为负可能是过拟合或噪声过大。
◦ 可能需要调整超参数。
4. 初始化策略
- 非常重要(比在监督学习还重要)。
- 最终层输出 0 或极小值以最大化熵
◦ 在开始时最大限度地随机探索
Q-学习策略
1. 谨慎使用 replay buffer 的内存。
- 你可能需要一个巨大的缓冲区,因此需要相应地修改代码。
2. 指定一份学习率表。
3. 如果收敛缓慢或有一个缓慢的启动期
- 耐心等待,DQN 收敛速度极慢。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论