Chen Shawn's Blogs

╭(●`∀´●)╯ ╰(●’◡’●)╮

0%

从上海到深圳,从研究生到社畜的前三个月

此文写于2020年10月3日,在此时间,公司的系统里我应该已经完成了转正流程,身份从试用期员工变成了正式员工

同时,这也意味着今年来深圳已经整整三个月了,github上的activities页面在三个月内一个小绿点也没有,着实是因为三个月忙碌于工作,日常无暇总结。也正因此,在十一这段时间里,我觉得有必要简单写写这三个月的时间,为了不被淹没在工作的繁忙与压力中变得麻木不仁,为了避免未来有一天回想起这段时间时,难以追溯自己做了些什么,得到了些什么,失去了些什么

为什么我们对RL报以厚望

2013年,ImageNet比赛中神经网络一骑绝尘,成绩远远甩开所有其他非神经网络的ensemble模型,意味着机器学习领域一个新时代的到来;2015年,DeepMind的AlphaGo开始频繁在各种比赛中以碾压局势击败职业棋手,意味着深度强化学习+MCTS的组合攻克了人类有史以来最复杂的棋类运动;在此之后人们常常对RL报以厚望,曾一度有研究者提出AGI=DL+RL,政委Yann Lecun也曾经说RL是当今AI领域中蛋糕最顶端的cherry,研究者们对RL的期望值之高可见一斑

2018年,Tencent王者荣耀团队做出了能够击败职业选手的AI绝悟,Pony在介绍绝悟时曾这样讲道:

绝悟不依赖人类经验,无师自通,从0到1自我学习,我们认为,绝悟的成功是人类迈向AGI的重要一步

从0到1,这是RL研究者们对RL的期望。任何一个现实世界的任务,只要可以建模成MDP,并设计出合理的reward,理论上来说,都可以用RL算法来学习

然而现实真的如此吗?

类似OpenAI,如果我想训练一个在dota中能够打败所有人类玩家的游戏AI,那么AI最终优化的目标可以总结为“推掉敌方远古遗迹”,至于一场对局中间的补刀、打盾、团战、上高地等等过程操作,都可以看作是为了完成这个最终目标的中间辅助过程,如果我只使用最终的输赢结果作为reward,那么这个AI训练的方差会大到无法正常收敛;如果想要模型有比较好的收敛效果,通常需要对reward进行非常细致的定义。最终,大多数AI打法层面的进步都源于reward的调整,细化每一项reward所花费的人力成本相当之高

抽象一下,MOBA类游戏中的reward定义可以分为两类:一类是sparse reward,指的是完成某个目标后一次性发放的reward,如成功补刀、成功推掉对方外塔、成功击杀对方英雄等等;另一类是dense reward,指的是在完成这些目标过程中随进度推进而连续发放的reward,如打掉对方英雄若干血量、或者打掉对方外塔若干血量等等

一般来说,sparse reward代表了我们真正想要让AI完成的目标,但由于sparse reward一次性发放的特点,使用sparse reward进行训练是非常高方差的。举个栗子:如果某AI的探索过程中先做了若干蠢事,后面又机缘巧合地推掉了对方的外塔,那么推外塔的sparse reward就会让AI认为是因为它做了若干蠢事所以可以推掉外塔的,做蠢事的value期望值反而会被加强——所以这就是为什么我们一定要在训练中加入dense reward辅助训练,因为这样才能将策略梯度的方差降低到一个合理的可以接受的范围

然而,模型训练越是依赖dense reward,往往就意味着RL学习的目标越接近“某种监督学习的结果”,只不过这种监督学习的label是由人类精心设计的dense reward定义的,因此AI的表现也就不会超出人类的认知范围,AI会严格按照人类给定的dense reward来行动——如果补刀的reward权重较大,AI就会沉迷补刀;如果击杀的reward权重较大,AI就会疯狂越塔——最终设计reward就会变成一件类似于人类编写规则的事情,AI绝对不会去做人类设计的dense reward以外的事情,这样的AI与RL研究者们对未来攻克AGI的期望相去甚远

那么能否仅使用sparse reward进行学习,但是又可以借助dense reward学习一些prior呢,这个问题我们这边有一些比较深入的实验探索:

  • OpenAI的办法,训练前期使用dense+sparse reward训练,在训练后期逐渐衰减dense reward比重,在我们的任务上效果不佳,一旦开始衰减dense reward,模型的能力就会开始退化,dense reward占比越低,则模型能力退化越多
  • 在衰减dense reward的同时调整GAE中的lambda参数,让模型的value补偿一部分dense reward被衰减的影响,有比较微弱的效果,其显著性之低让我怀疑这部分效果是不是为了周报诌出来的
  • Multi-head value,把原来模型中的一个value换成多个value的子网络,每个value子网络拟合一项具体的dense reward或sparse reward,数学上很容易证明multi-head value的累加与原本的single-head value是等价的,但由于分成多个value之后模型更容易学习不同state下value的变化,客观上对value的预测更准了,所以实际效果会有可观的提升
  • Reward shaping / Potential function,训练potential function来拟合dense reward,而模型优化的目标中reward只包含sparse reward,Andrew Ng的理论证明可以保障TD-update的过程中加不加potential function,最终的全局最优还是不变的。目前不太清楚这部分的实验结果,因为这个理论性质在policy gradient的场景下是无法满足的,需要把模型换成value-based方法才能继续实验,而项目前期代码里很多地方都写死成PPO,导致换模型成本极高

mhv我认为是一种治标不治本的方法,其本质还是在尽可能利用神经网络的拟合能力降低策略梯度的方差,训练中你确实可以通过衰减dense reward的head来取得方差更低且更加贴合sparse reward的policy gradient,但dense reward仍然会影响到全局最优策略,除了自己脑子里不靠谱的业务经验,没有任何理论可以证明dense reward层面的微小衰减在全局最优处仍然还是微小的,sparse与dense的矛盾很可能不是一个可以通过优化解决的问题

就没有什么比较通用的办法可以解决sparse与dense的矛盾呢?就目前的一些尝试结果来看,似乎冥冥中RL的reward设计也存在着no-free-lunch theorem:相同的算力条件下,业务人员细化dense reward为模型能力带来的收益总是大于RL研究者们在模型侧为sparse reward加各种乱七八糟的trick,目前还没有找到一个可以有效降低人力设计与验证dense reward成本的方法

这样的实验结果,与学术界蒸蒸日上的RL研究相互映照,总是让我对RL的未来悲观不已

分布式RL的边界

近两年来,学术界有关RL训练速度的研究相对减缓下来,更多的研究者开始研究一些细分领域的问题,比如:

  • RL with pixel-based input:输入是图像格式,这类RL模型的训练一直是学术界的一个大难题,因为image特征(即Atari游戏中说的RGB输入)包含的信息实际要比vector特征(即Atari游戏里说的RAM输入)sparse很多,而RL训练不像SL训练那么稳定,可以仅靠gradient back-propagation学习到丰富的representation,很多研究都尝试借助无监督学习的一些方法来提升RL学习representation的能力,比如VAE,比如self-imitation learning等
  • RL with memory aggregation:工程中遇到这个问题大多是直接扔一个LSTM到模型里完事,但仔细思考实际并不trivial,NLP中采用RNN是因为词与词之间有非常明显的顺序关系,即使有时会存在相隔较远的词之间有较高关联性的现象,但RL中顺序往往不那么重要,重要的是”到了某个关键时刻你能不能回忆起过去某个时间节点的某条关键线索“的能力,比如Montezuma's Revenge中到了某个门的地方,AI就应当回想起来过去曾经在xxx拿到过钥匙,至于拿到钥匙到开门之间的这段时间发生了什么,不重要
  • RL with distributed system

这里详细说说感触颇多的distributed RL吧

我想应该不只有我一个人看到APE-X的实验效果时感到惊讶,只是把experience replay buffer改成distributed实现,就可以给模型能力带来非常可观的提升

过去几年里,我们部门做实验需要的算力水平也在随着对模型能力的要求上升而水涨船高。毫无疑问,算力已经成为了提升RL模型能力的银弹,什么策略梯度高方差,什么exploration效率低,什么模型效果对随机数种子或者replay buffer的size等参数极其敏感,我们的实验结果显示,这些都是可以用算力碾过去的问题——如果碾不过去,就再加一千台8核的CPU Docker和一台八卡的P40机器——能用算力碾过去的问题,为什么一定要要让人类绞尽脑汁,用有限的人生追求无限的渐进能力?