本文转载自 这里,稍有整理。
下面是演讲的视频。
1 测试新算法的技巧
- 简化问题,使用低维变量。
- 使用类似只有角度和速度两个变量的 Pendulum problem 问题;
- 这样方便将目标函数、算法的最终状态以及算法的迭代情况可视化出来;
- 当出现问题时,更容易将出问题的点直观地表达(比如目标函数是否平滑等问题);
- 构造一个 Demo 来测试你的算法。
- 比如:对于一个分层强化学习算法,你应该构造一个算法可以直观学习到分层的问题。
- 这样能够轻易发现哪里出了问题。
- 注意:不要在这样的小问题上过分地尝试。
- 在熟悉的场景中测试
- 随着时间的推移,你将能够估计训练所需的是哪。
- 明白你的奖励是如何变化的。
- 能够设定一个基线,以便让你知道相对过去改进了多少。
- 作者使用他的hpper robot,因为他知道算法那应该学多快,以及哪些行为是异常的。
2 快速上手新任务的技巧
- 简化问题
- 简化奖赏函数,这样可以有一个更快的反馈,帮助你知道是不是走偏了。
- 比如,在击中时给 robot 记一分。这种情况很难学习,因为在开始于奖赏之前有太多的可能。将击中得分改为距离,这样将能够提升学习速率、更快迭代。
- 距离来说,如果你是想从图片(高维空间)中学习,那么你可能需要先处理特征。举个例子,如果你的算法是想要标定某个事物的位置,一开始使用单一的x, y坐标可能会更好。
- 一旦起步,逐步还原问题知道解决问题。
- 从简单的开始,直到回到问题。
- 途径1:简化特征空间。
- 途径2:简化奖励函数。
3 将一个问题转化为强化学习的技巧
可能现实是并不清楚特征是什么,也不清楚奖励该是什么。或者问题是什么都不清楚。
- 第一步:将这个问题使用随机策略可视化出来。
- 策略的更细你将会发现里面的行为,并促使稳定下来。
- 看看哪些部分吸引了你。
- 如果这个随机策略在某些情况下作了争取的事情,那么很大概率,强化学习也可以。
- 如果随机策略永远都做不到,那么强化学习也不可能。
- 确保可观测
- 举个例子:亲自查看处理过图片,以确保你没有移出关键信息或者是在某种程度上阻碍算法。
- 确保你能够掌握系统,且给 agent 的也是同样的系统环境。
- 确保所有的事物都在合理的尺度
- 观测环境:确保均值为0,方差为1
- 奖励:如果你能控制他,就把他缩放到一个合理的维度。
- 在所有的数据上都做同样的处理。
- 经验法则:
- 检查所有的观测环境以及奖励,以确保没有特别离奇的异常值。
- 建立一个好的基线
- 交叉熵
- 策略更新
- 一些类型的 Q-Learning 算法:OpenAI Baselines 或者 RLLab
- 一开始并不清楚哪些算法会起作用,所以设定一系列的基线(从其他方法)
4 复现论文
某些时候(经常的事),复现论文结果特别困难。有如下一些技巧:
- 使用比预计更多的样本
- 策略正确,担又不完全正确
- 如果 Batch size 太小,噪声将会压过真正有用的信号。
- 比如:TRPO,作者使用了一个特别小的batch size,然后不得不训练10万次迭代。
- 对于DQN,最好的参数:1万次迭代,10亿左右的缓存存储。
- 尝试让模型运行的久一些。
- 调整超参数以达到公开的效果。
- 如果想让他在所有的数据上都奏效,使用更大的 Batch size。
对于训练中的一些处理。
检查你的训练是否正常:
- 检查每个超参数的鲁棒性
- 如果一个算法太过敏感,那么它可能不太鲁邦,并且不容乐观;
- 有些时候,某个策略生效,可能仅仅是因为巧合而已,并不足以推广。
- 关注优化过程是否正常的指标
- 是否预测正确?
- 它的返回是否正确?
- 每次的更新多大?
- 变动情况
- 关注目标函数是否正确
- 一些标准的深度神经网络的诊断方法
- 有一套能够连续记录代码的系统
- 有些时候,我们关注一个问题,最后却把注意力放在了其他问题上
- 对于一个问题,很容易出现过拟合
- 有成型的规则
- 注意过去所作的所有尝试
- 有一大堆之前时不时测试的基准。
- 有时候会觉得系统运行正常,但是很可能只是巧合。
- 例如:有 3 套算法处理 7 个任务,可能会有一个算法看起来能够解决所有的问题,但是实际上他们不过是一套算法,不同的仅仅是随机种子而已。
- 使用不同的随机种子
- 如果不这样做,那你很有可能是过拟合了。
- 运行多次取平均
- 再多个种子的基础上运行多次。
- 额外的算法修改可能并不重要
- 大部分的技巧都是在正则化处理某些对象,或者是在改进你的优化算法。
- 许多技巧有相同的效果,所有你可以通过移除他们来简化你的算法(很关键)。
- 简化你的算法
- 将会取得很好的泛化效果。
- 自动化你的实验
- 大部分使用 iPython notebooks。
- 数据库对于存储结果来说不是很重要。
- 不要整天盯着你的代码读取和写入数据。
- 将实验部署在云端并分析结果。
- 追踪实验与结果的框架。
5 总的训练策略
- 数据的白化与标准化(一开始就这样做,对所有的数据)
- 可以起作用。
- 开始的时候要看看它是否真的对网络起作用。
- 大规模的缩放(-1000,1000)到(-0.001,0.001)必然使得学习减缓。
- 与 Reward 相同。
- 缩放但是不要转变对象。
- 影响 agent 的继续下去的可能。
- 将会改变问题(你想让它持续多久?)
- 计算均值与标准差,然后做标准化的转变。
- 对于全体数据(不仅仅是当前的数据)。
- 至少它减轻了随时间的变化波动情况。
- 如果不断地改变对象话,可能使得优化器模糊。
- 缩放(仅最近的数据)意味着你的优化器不知道这个情况,训练将会失败。
- 衰减因子的调参
- 算法将非常稳健。
- 最好是看看对应多少的现实时间。
- 观察问题是否真的能被离散化处理
- 离散化程度决定了你的随机布朗运动能有多远;
- 密切关注返回的 Episode
- 在一场游戏中你场场都输,从未赢过,但是 Episode 的时长可以告诉你是不是输的越来越慢。
- 一开始可能看见 Episode 时长有改进,但是 Reward 无反应;
- 最大的返回是你的策略能够做到的最好程度;
- 看看你的策略是否工作正常?
- 不仅仅是均值,还包括极大值和极小值。
- 查看 Episode 的时长有时候比查看 Reward 更重要。
6 策略优化诊断
- 仔仔细细地观察 Entropy
- 对于大部分策略,可以采用分析式方法
- 对于连续边变量,通常使用高斯分布,这样可以通过微分计算 Entropy。
- KL penalty
- 增加 Entropy bonus
- 使 Entropy 远离快速下降
- 留意状态空间 Entropy 的变化,虽然没有好的计量方法
- Action 层面的 Entropy
- 如果快速地下降,策略很快便会固定然后失效
- 如果没有下降,那么这个策略可能不是很好,因为它是随机的
- 如何测量 Entropy
- 观察 KL 散度
- 如果 KL 是 0.01,那么它是相当小的;
- 如果是 10,那么是非常大的;
- 观察 KL 散度的更新尺度
- 通过基线解释方差
- 如果是复数,可能是过拟合了或者是噪声
- 可能需要超参数调节
- 查看价值函数是不是好的预测或者给予回报
- 初始化策略
- 初始最大化随机 Exploration
- 非常重要(比监督学习更重要)
- 最后一层取 0 或者是一个很小的值来最大化Entropy
- 留意 Replay Buffer 存储的使用情况
- 手边常备 Learning Rate 表
- 保持耐心,的 DQNs 收敛非常慢。