这里主要分享一些Deep Q Learning调参技巧, 即如何使模型更快更稳定地收敛. 关于Deep Q Learning的基本概念, 很多笔记都有, 这里我就不说了.
百度的强化学习训练营提供了很多实战项目, 其中很多参数需要自己设置, 设置不好可能使得模型不收敛.
首先, 个人感觉Deep Q Learning比较重要的参数有:
lr--神经网络的学习率 & 衰减因子
γ--reward的衰减因子,一般取 0.9 到 0.999 不等
ε-greedy--控制模型"探索"的概率 & 衰减因子
假设此时没有衰减因子, 除了mountain-car这种最简单的环境, 经过尝试, 我们训练模型时很难只用一组固定的参数就能将模型训练到收敛, 一般需要在运行完几百/几千个episode之后调整参数后继续训练.
初始学习率需要根据任务的奖励的尺度变化, 或者也可以使用"奖励缩放因子"使得奖励尺度较为统一. 一般来说我会先设为1e-3左右, 根据模型收敛情况进行增/减,
当训练reward/模型损失有上升/下降趋势, 但上升/下降速度相对reward的尺度来说很慢的时候我会选择增大学习率, 一般根据情况放大5-100倍. 同样, 当训练reward一开始下降很快, 但很快开始波动时, 我会选择减小学习率, 一般每次调整缩小5-50倍.
reward衰减因子γ的设置很大程度上根据训练任务来决定, 比如玩Flappy Bird这种短期回报更重要的游戏时, 我会把它设为0.9. 这是一个相对较低的数字, 能使得小鸟更关注眼前的奖励--更多地考虑去通过眼前柱子的缺口, 同时也能加快模型的收敛,
因为: 当前(状态, 动作)的Q值 = 当前奖励+衰减的未来奖励, 而第二项的估计一般是非常麻烦的. 通常当γ非常接近1时, 模型训练很久模型都不收敛.
就像科科老师说的在移动的靶子上训练射箭, 虽然一段时间内靶子被固定住了, 但当靶子换位置时又需要很长时间去适应新靶子, 周而复始还是很难收敛. 因此当γ较低时, 模型对第二项的估计比较容易被训练出来--也就是随着模型被训练, 靶子每次移动的距离变小了, 这样更利于射手的训练.
3}
对于ε-greedy, 初始值一般为0.05-0.1
, 这里做个形象的比喻: 一开始agent是个弱者, 他在弱者的领域里探索, 他手上有一张错误的地图, 它在慢慢探索弱者的领域来更正这张地图,
慢慢地agent把地图更正了, 能走出弱者的世界了, 这时他需要在更强的领域里探索, 而不是继续在弱者的领域里探索, 因此最好的策略就是每次先跟着自己的地图走出弱者领域, 然后再去探索强者的领域.
再比如Flappy Bird, 一开始鸟需要学习如何飞进柱子的间隙里, 且不掉到地上, 学会了之后, 就应该更多地学习如何在间隙中穿梭, 如何飞得更远.
因此, ε-greedy 需要随着训练的进行慢慢变小, 最后无限到达一个较小的值, 比如1e-2
, 但对于Flappy Bird, 我的设置方法是让ε-greedy最后降为0--因为我知道环境只会当小鸟穿过一个柱子间隙时给小鸟一个奖励, 而没有其他更好的奖励, 所以我需要让小鸟更多地探索如何在间隙中穿梭--比如如何从一个高的间隙下降到一个低的间隙, 这样就需要让小鸟一直跟着它现有的飞行规则, 反复地学习自己是怎么死的, 他才能更快更稳定地进步.
注: 当设置了缩放因子时,
学习率与ε-greedy的衰减因子我通常会设置为0.995-0.999
--即每个episode学习率会乘以这个数, 比如0.995, 1000个episode之后学习率减少为原来的0.67%, 0.999为原来的36.78%. 这需要根据模型收敛的快慢来决定--
可以先不设置缩放因子, 看模型损失何时开始波动, 随后由此来设置缩放因子
第一次写帖子, 错误多多还请多指正.