深度强化学习技巧 hacks for training deep RL

这是一篇旧文,John Schulman 《深度增强学习研究基础》演讲(Aug 2017)中记录的 tricks。近日重看,发现有些东西在工程中是通用的,值得一读。  

测试新算法的技巧

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

快速上手新任务的技巧

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

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

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

  1. 第一步:将这个问题使用随机策略可视化出来。
  • 看看那些部分吸引了你。

  • 如果这个随机策略在某些情况下做了正确的事,那么很大概率,强化学习也可以做到。

    • 策略的更新将会发现这里面的行为,并促使稳定下来。
  • 如果随机策略永远都做不到,那么强化学习也不可能。    

  1. 确保可观测
  • 确保你能够掌控系统,且给 agent 的也是同样的系统环境。
    • 举个例子: 亲自查看处理过图片,以确保你没有移出掉关键信息或者是在某种程度上阻碍算法。  
  1. 确保所有的事物都在合理的尺度
    • 经验法则:
      • 观测环境: 确保均值为0,方差为1。
      • 奖赏: 如果你能控制它,就把他缩放到一个合理的维度。
      • 在所有的数据上都做同样的处理。
  • 检查所有的观测环境以及奖赏,以确保没有特别离奇的异常值。    
  1. 建立一个好的基线
  • 一开始并不清楚哪些算法会起作用,所以设定一系列的基线(从其他方法)。

复现论文

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

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

对于训练中的一些处理

检查你的训练是否正常:

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

总的训练策略

  1. 数据的白化与标准化(一开始就这样做,对所有数据)
  • 训练数据(Obervation):

    • 计算均值与标准差,然后做标准化转变。
    • 对于全体数据(不仅仅是当前的数据)。
      • 至少它减轻了随时间的变化波动情况。
      • 如果不断地改变对象的话,可能会使优化器迷糊。
      • 缩放(仅最近的数据)意味着你的优化器不知道这个情况,训练将会失败。
  • 奖赏(Rewards):

    • 缩放但不要转变对象。
      • 影响 agent 的继续下去的可能。
      • 将会改变问题(你想让它持续多久)。
  • 归一化目标(Standardize targets)

    • 与 rewards 相同。
  • PCA 白化

    • 可以起作用。
    • 开始时的时候要看看它是否真的对神经网络起作用。
    • 大规模的缩放(-1000,1000)到(-0.001,0.001)必然会使学习减缓。
  1. 衰减因子的调参
  • 判断分配多少权重。
  • 举个例子:如果因子是0.99,那么你将忽略100步以前的事情,这意味着某种程度的短视。
    • 最好是看看对应多少的现实时间。
      • 直觉上,我们通常在强化学习中离散时间。
      • 换句话说,100步是指3秒前吗?
      • 在这个过程中发生了什么?
  • 如果是用于 fx 估计的策略更新 TD 算法,gamma 可以选择靠近1(比如0.999)。
    • 算法将非常稳健。
  1. 观察问题是否真的能被离散化处理
  • 例如:在一个游戏有跳帧。
    • 作为一个人类,你能控制还是不能控制。
    • 查看随机情况是怎么样的。
      • 离散化程度决定了你的随机布朗运动能有多远。
    • 如果连续性地运动,往往模型会走很远。
    • 选择一个起作用的时间离散化分。
  1. 密切关注返回的 episode
  • 不仅仅是均值,还包括极大极小值
    • 最大返回是你的策略能做到的最好程度
    • 看看你的策略是否工作正常?
  • 查看 episode 时长(有时比 episode reward 更为重要)
    • 在一场游戏中你场场都输,从未赢过,但是 episode 时长可以告诉你是不是输得越来越慢
    • 一开始可能看见 episode 时长有改进,但 reward 无反应

策略优化诊断

  1. 仔仔细细地观察 entropy
  • action 层面的 entropy
    • 留意状态空间 entropy 的变化,虽然没有好的计量办法
  • 如果快速地下降,策略很快便会固定然后失效
  • 如果没有下降,那么这个策略可能不是很好,因为它是随机的
  • 通过以下方式补救:
    • KL penalty - 使 entropy 远离快速下降
    • 增加 entropy bonus
  • 如何测量 entropy
    • 对于大部分策略,可以采用分析式方法
      • 对于连续变量,通常使用高斯分布,这样可以通过微分计算 entropy
  1. 观察 KL 散度
  • 观察 KL 散度的更新尺度
  • 例如:
    • 如果 KL 是0.01,那它是相当小的。
    • 如果是10,那它又非常的大。
  1. 通过基线解释方差
  • 查看价值函数是不是好的预测或者给予回报
    • 如果是负数,可能是过拟合了或者是噪声
      • 可能需要超参数调节  
  1. 初始化策略
  • 非常重要(比监督学习更重要)
  • 最后一层取0或者是一个很小的值来最大化 entropy
    • 初始最大化随机 exploration

Q-Learning 策略

  1. 留意 replay buffer 存储的使用情况
  • 你可能需要一个非常大的 buffer,依代码而定
  1. 手边常备 learing rate 表

  2. 如果收敛很慢或者一开始有一个很慢的启动

  • 保持耐心,DQNs 收敛非常慢

Translated by kuhung 2017/08/29


关注微信公众号【谷粒先生】,回复【强化学习】获取 PPT 原版