本文转载自 这里,稍有整理。

下面是演讲的视频。

1 测试新算法的技巧

  1. 简化问题,使用低维变量。
    • 使用类似只有角度和速度两个变量的 Pendulum problem 问题;
    • 这样方便将目标函数、算法的最终状态以及算法的迭代情况可视化出来;
    • 当出现问题时,更容易将出问题的点直观地表达(比如目标函数是否平滑等问题);
  2. 构造一个 Demo 来测试你的算法。
    • 比如:对于一个分层强化学习算法,你应该构造一个算法可以直观学习到分层的问题。
    • 这样能够轻易发现哪里出了问题。
    • 注意:不要在这样的小问题上过分地尝试。
  3. 在熟悉的场景中测试
    • 随着时间的推移,你将能够估计训练所需的是哪。
    • 明白你的奖励是如何变化的。
    • 能够设定一个基线,以便让你知道相对过去改进了多少。
    • 作者使用他的hpper robot,因为他知道算法那应该学多快,以及哪些行为是异常的。

2 快速上手新任务的技巧

  1. 简化问题
    • 简化奖赏函数,这样可以有一个更快的反馈,帮助你知道是不是走偏了。
    • 比如,在击中时给 robot 记一分。这种情况很难学习,因为在开始于奖赏之前有太多的可能。将击中得分改为距离,这样将能够提升学习速率、更快迭代。
    • 距离来说,如果你是想从图片(高维空间)中学习,那么你可能需要先处理特征。举个例子,如果你的算法是想要标定某个事物的位置,一开始使用单一的x, y坐标可能会更好。
    • 一旦起步,逐步还原问题知道解决问题。
    • 从简单的开始,直到回到问题。
    • 途径1:简化特征空间。
    • 途径2:简化奖励函数。

3 将一个问题转化为强化学习的技巧

可能现实是并不清楚特征是什么,也不清楚奖励该是什么。或者问题是什么都不清楚。

  1. 第一步:将这个问题使用随机策略可视化出来。
    • 策略的更细你将会发现里面的行为,并促使稳定下来。
    • 看看哪些部分吸引了你。
    • 如果这个随机策略在某些情况下作了争取的事情,那么很大概率,强化学习也可以。
    • 如果随机策略永远都做不到,那么强化学习也不可能。
  2. 确保可观测
    • 举个例子:亲自查看处理过图片,以确保你没有移出关键信息或者是在某种程度上阻碍算法。
    • 确保你能够掌握系统,且给 agent 的也是同样的系统环境。
  3. 确保所有的事物都在合理的尺度
    • 观测环境:确保均值为0,方差为1
    • 奖励:如果你能控制他,就把他缩放到一个合理的维度。
    • 在所有的数据上都做同样的处理。
    • 经验法则:
    • 检查所有的观测环境以及奖励,以确保没有特别离奇的异常值。
  4. 建立一个好的基线
    • 交叉熵
    • 策略更新
    • 一些类型的 Q-Learning 算法:OpenAI Baselines 或者 RLLab
    • 一开始并不清楚哪些算法会起作用,所以设定一系列的基线(从其他方法)

4 复现论文

某些时候(经常的事),复现论文结果特别困难。有如下一些技巧:

  1. 使用比预计更多的样本
  2. 策略正确,担又不完全正确
    • 如果 Batch size 太小,噪声将会压过真正有用的信号
    • 比如:TRPO,作者使用了一个特别小的batch size,然后不得不训练10万次迭代。
    • 对于DQN,最好的参数:1万次迭代,10亿左右的缓存存储。
    • 尝试让模型运行的久一些。
    • 调整超参数以达到公开的效果。
    • 如果想让他在所有的数据上都奏效,使用更大的 Batch size。

对于训练中的一些处理。

检查你的训练是否正常:

  1. 检查每个超参数的鲁棒性
    • 如果一个算法太过敏感,那么它可能不太鲁邦,并且不容乐观;
    • 有些时候,某个策略生效,可能仅仅是因为巧合而已,并不足以推广。
  2. 关注优化过程是否正常的指标
    • 是否预测正确?
    • 它的返回是否正确?
    • 每次的更新多大?
    • 变动情况
    • 关注目标函数是否正确
    • 一些标准的深度神经网络的诊断方法
  3. 有一套能够连续记录代码的系统
    • 有些时候,我们关注一个问题,最后却把注意力放在了其他问题上
    • 对于一个问题,很容易出现过拟合
    • 有成型的规则
    • 注意过去所作的所有尝试
    • 有一大堆之前时不时测试的基准。
  4. 有时候会觉得系统运行正常,但是很可能只是巧合。
    • 例如:有 3 套算法处理 7 个任务,可能会有一个算法看起来能够解决所有的问题,但是实际上他们不过是一套算法,不同的仅仅是随机种子而已。
  5. 使用不同的随机种子
    • 如果不这样做,那你很有可能是过拟合了。
    • 运行多次取平均
    • 再多个种子的基础上运行多次。
  6. 额外的算法修改可能并不重要
    • 大部分的技巧都是在正则化处理某些对象,或者是在改进你的优化算法。
    • 许多技巧有相同的效果,所有你可以通过移除他们来简化你的算法(很关键)。
  7. 简化你的算法
    • 将会取得很好的泛化效果。
  8. 自动化你的实验
    • 大部分使用 iPython notebooks。
    • 数据库对于存储结果来说不是很重要。
    • 不要整天盯着你的代码读取和写入数据。
    • 将实验部署在云端并分析结果。
    • 追踪实验与结果的框架。

5 总的训练策略

  1. 数据的白化与标准化(一开始就这样做,对所有的数据)
    • 可以起作用。
    • 开始的时候要看看它是否真的对网络起作用。
    • 大规模的缩放(-1000,1000)到(-0.001,0.001)必然使得学习减缓。
    • 与 Reward 相同。
    • 缩放但是不要转变对象。
    • 影响 agent 的继续下去的可能。
    • 将会改变问题(你想让它持续多久?)
    • 计算均值与标准差,然后做标准化的转变。
    • 对于全体数据(不仅仅是当前的数据)。
    • 至少它减轻了随时间的变化波动情况。
    • 如果不断地改变对象话,可能使得优化器模糊。
    • 缩放(仅最近的数据)意味着你的优化器不知道这个情况,训练将会失败。
  2. 衰减因子的调参
    • 算法将非常稳健。
    • 最好是看看对应多少的现实时间。
  3. 观察问题是否真的能被离散化处理
    • 离散化程度决定了你的随机布朗运动能有多远;
  4. 密切关注返回的 Episode
    • 在一场游戏中你场场都输,从未赢过,但是 Episode 的时长可以告诉你是不是输的越来越慢。
    • 一开始可能看见 Episode 时长有改进,但是 Reward 无反应;
    • 最大的返回是你的策略能够做到的最好程度;
    • 看看你的策略是否工作正常?
    • 不仅仅是均值,还包括极大值和极小值。
    • 查看 Episode 的时长有时候比查看 Reward 更重要。

6 策略优化诊断

  1. 仔仔细细地观察 Entropy
    • 对于大部分策略,可以采用分析式方法
    • 对于连续边变量,通常使用高斯分布,这样可以通过微分计算 Entropy。
    • KL penalty
    • 增加 Entropy bonus
    • 使 Entropy 远离快速下降
    • 留意状态空间 Entropy 的变化,虽然没有好的计量方法
    • Action 层面的 Entropy
    • 如果快速地下降,策略很快便会固定然后失效
    • 如果没有下降,那么这个策略可能不是很好,因为它是随机的
    • 如何测量 Entropy
  2. 观察 KL 散度
    • 如果 KL 是 0.01,那么它是相当小的;
    • 如果是 10,那么是非常大的;
    • 观察 KL 散度的更新尺度
  3. 通过基线解释方差
    • 如果是复数,可能是过拟合了或者是噪声
    • 可能需要超参数调节
    • 查看价值函数是不是好的预测或者给予回报
  4. 初始化策略
    • 初始最大化随机 Exploration
    • 非常重要(比监督学习更重要)
    • 最后一层取 0 或者是一个很小的值来最大化Entropy
  5. 留意 Replay Buffer 存储的使用情况
  6. 手边常备 Learning Rate 表
  7. 保持耐心,的 DQNs 收敛非常慢。