目录
为了保证DRL算法能够顺利收敛,policy性能达标并具有实用价值,结果有说服力且能复现,需要算法工作者在训练前、训练中和训练后提供全方位一条龙服务。我记得GANs刚火起来的时候,因为训练难度高,有人在GitHub上专门开了repository,总结来自学术界和工业界的最新训练经验,各种经过或未经验证的tricks被堆砌在一起,吸引了全世界AI爱好者的热烈讨论,可谓盛况空前。在玄学方面,DRL算法训练有得一拼。但毕竟在科研领域没有人真的喜欢玄学,只有久经考验的一般化规律才能凝结成知识被更多的人接受和推广。本篇接下来的内容融合了许多个人经验和各种参考资料,算是在DRL训练“去玄学”化上做出的一点微不足道的努力。
训练开始前
环境可视化
如果条件允许,开始训练前最好先可视化一个随机环境,观察是否会出现你希望的状态(即上一篇里的主线事件)。如果靠随机选择action都能以一定概率探索到目标状态,那说明该任务难度比较低,心里就可以更有底;如果从来不会出现目标状态,说明该任务难度较高,需要在状态空间和reward函数设计时特别下功夫,从而更好地引导agent向目标状态前进。
数据预处理
你还可以实时打印出state和reward,看看它们是否在合理范围内取值,是否存在幅值过大的情况,如果是则需要增加必要的归一化操作。事实上,我推荐无条件进行状态空间归一化和reward rescale & clipping,实践证明这两个操作无论在收敛速度还是最终性能上都会带来明显提升。前一个操作很好理解,我只介绍一下reward rescale & clipping,该操作尤其适合基于episode的A3C/A2C/PPO算法,参考形式为
r=clip(r/(std(Return)+ϵ),-10,10)
其中Return是一段episode内reward的折扣累加和,也就是V网络拟合的对象,而V网络输出又为policy优化提供参考,使用该值的统计方差对reward进行rescale,可以反过来有效降低Return的variance,有助于V网络和policy网络进行更加无偏地学习。训练过程中通常采用Return的running std来rescale当前reward。最外层的clip操作可以滤除那些绝对值过大的reward,作用类似。
注意reward只能进行rescale,而不能整体平移(减去均值)。回报函数中各项reward的符号以及它们之间的相对大小唯一确定了回报函数的实际功能,各项reward的整体缩放对其没有影响,但整体平移会改变这种相对大小,也就改变了回报函数的功能。事实上,哪怕是clip操作也在一定程度上存在这种问题,但通常影响不大。
训练进行中
拥抱不确定性
终于要开始调参了!如果你做过CV项目,会发现相对来说DRL训练的不确定性更高,可复现性更差。这是因为DRL算法不仅超参数多,而且对它们非常敏感,这里贴张图给大家感受一下。
上图是三个DRL算法(纵向)在五个Atari游戏(横向)中的得分随学习率变化的趋势。可以看到,以10倍为单位,高性能所对应的学习率区间普遍很窄,要达到最优性能真得靠地毯式搜索。其实原作者本意是想通过这张图表明他们的方法对超参数变化抵抗力较好……,况且这还只是针对学习率这一个超参数。
当我们刚开始尝试用DRL算法解决一个全新问题时,性能好坏甚至都是其次,能否收敛才是最关键的。牛逼闪闪的OpenAI Five都听说过吧?其团队成员在接受采访时承认,他们第一次将训练跑起来后因为心里实在没底,干脆全体度假去了,回来后打开屏幕发现竟然收敛了,上帝保佑!
尽管DRL对超参数如此敏感,也没有必要过分悲观。当我们在心理上接受了这一事实,并开始潜心研究时,就会发现DRL训练还是有迹可循的,尤其是随着实际经验的积累和对算法本质理解的不断深入,将每个超参数的作用都了然于胸,那么训练出优秀policy的可能性就会大很多。接下来我以DQN,DDPG和PPO为例,介绍一下其中的主要超参数和调参技巧。
DRL通用超参数
折扣因子
作用原理
折扣因子通常以符号γ表示,在强化学习中用来调节近远期影响,即agent做决策时考虑多长远,取值范围(0,1]。γ越大agent往前考虑的步数越多,但训练难度也越高