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