深度学习的高昂成本
有没有因为空调太冷而穿上毛衣?在去睡觉之前忘了关掉另一个房间的灯?虽然在办公室所做的一切都可以通过笔记本电脑在家里完成,但是你每天依然会花费半个多小时的通勤时间去上班,目的只是为了 “填充办公室的空位”?
在强化学习中,通过样本和计算效率之间的反直觉权衡,选择正确的进化策略可能比看起来更为有效。
现代生活充斥了各式各样效率低下的事物,然而深度学习的能源成本并不是那么显而易见。在办公桌上搭建一个高功率的工作站,冷却风扇所吹出的热气流不断地提醒人们正在持续耗费大量的能量。但是,如果把工作推送给大厅下面的共享集群,那么要直观地感觉到设计决策对电费的影响程度,便显得有点困难了。如果在大型的项目中用到了云计算,那么能源的使用量和随之而来的后果就会离你关注的对象渐行渐远。但是,看不见、摸不着并不是一个项目可行的决策,在硕大规模的极端情况下,可能意味着这些项目的能源支出要比汽车的整个产品周期内的能耗更大。
Strubell 等人关注了2019年训练现代深度学习模型的实质性能源需求,他们主要针对一种称为transformer的大型自然语言处理模型,其论文中考虑到的因素和讨论得出的结论,与在类似硬件上训练深度学习模型占用的时间基本一致。
他们估计:利用scratch训练具备大量变量的Vaswani transformer,释放出二氧化碳的量,大约为从纽约飞往旧金山航班释放出二氧化碳的量的10%。这个预估值在主要从云提供商公布的能耗假设基础上得出,且财务成本小于1000美元(云计算的假设)。对于商业项目来说,可能这是一笔划算的支出,但是如果把优化和实验等因素一并考虑进来之后,能耗账单便轻易地乘以10或更大的系数了。
Strubell和他的同事估计,在NLP模型开发中添加神经架构搜索(NAS)会增加数百万美元的价格成本,及与之对应的碳足迹。虽然许多大型的模型利用了专用硬件,如谷歌的TPU,进行训练,从而将能源成本降至30~ 80倍,使得训练价格略为降低,但这仍然是一笔巨大的支出。在本文所关注的强化学习领域,效率低下的训练的后果可能会使一个项目、产品或业务胎死腹中。
在过去的44天时间里,经过Deepmind训练的代理,在多人实时策略游戏星际争霸II(Starcraft II)中,分别使用三个游戏种族都达到了大师的段位,Battle.net排名击败了99.8%的所有玩家。OpenAI的主要游戏大师项目Dota2进行了10个月(约800个petaflop/天)的实战训练,目的是为了击败人类玩家的世界冠军。
由于采用了TPU、虚拟工人等技术,要准确地估计这类游戏玩家的能耗成本的确有难度。训练出Alphastar和OpenAI Five的冠军,估计大约需要有1200万至1800万美元的云计算成本。显然,对于一个典型的学术或行业机器学习团队来说,这是遥不可及的。在强化学习领域,低效的学习会引发另一个危险:一个探索性和样本效率低下的中等复杂程度的强化学习任务,可能永远找不到可行的解决方案。
在这里,选取一个中等复杂程度的强化学习任务作为例子:从序列中预测蛋白质结构。一个由100个氨基酸连接在一起的小蛋白质,就像一条有100个链接的链,每个链接是21种独特的链接变体中的一种,根据每个链接之间的角度依次形成结构。假设每个氨基酸/链环之间的键角有9种可能的简化构型,则需要次迭代以查看每个可能的结构。这100个链接蛋白大致类似于一个强化学习环境,每个步长由100个时间步长和9个可能的动作组成,它们组合呈爆炸态势。
当然,强化学习代理不会随机抽取所有可能的游戏状态。相反,代理将通过进行最佳猜测、定向探索和随机搜索的组合来生成学习轨迹。这种生成经验的方法,称之为典型的“on-policy”学习算法。对能找到局部最优方法的代理来说,可能会永远停留在那里,重复相同的错误,永远解决不了整个问题。
从历史上看,强化学习尽可能地将问题表述为类似监督学习的问题,并从中获益,例如让学生带着三个绑在头上的摄像头徒步旅行,左边的摄像头生成一个带有训练标签 “右转”的图像,而右边的摄像头被标记为“左转”,中间的摄像头标签为 “笔直前行”。
最后,将获得一个带标记的数据集,适合于训练导航森林小径(quadcopter to navigate forest trails)。在下面的章节中,我们将讨论类似的概念(例如,模仿学习)和基于模型的RL如何能够大大减少代理学习任务所需的训练示例的数量,以及为什么这并不总是一件有益的事。
深度强化学习是机器学习的一个分支,它受到动物和人类认知、最优控制和深度学习等多个领域的启发。有一个明显的类似动物行为的实验,其中动物(代理)被放置在一个特定情形之下:它必须学会通过解决一个问题来获得食物 (奖励)。在动物开始将一系列动作与食物奖励相关联之前,只需要举出几个类似的示例,然而,为了实现代理参数的稳定更新,对于每个epoch,深度强化学习算法可能需要考虑10到10万个时间步长。
大多数强化学习环境都是按步长制定的。环境会生成一个观察,在此基础上,由代理来决定应用于环境的动作。环境根据其当前状态和智能体(Agent)选择的操作进行更新,在本文中将其称为时间步长。学习所需的时间步长或“样本”越少,算法的效率就越高。
大多数现代强化学习算法的重要程度取决于其核心,这是一种试错的形式。对于一个未使用明确的探索技术的Agent,其随机活动偶尔也会做出一些正确的事情(random activity should occasionally do something right),否则,如果没有得到积极奖励的话,这个Agent可能会与环境(本质上)永远互动下去。事实上,近端策略优化是一种在一系列基准中实现竞争性能的算法,在OpenAI的程序生成的环境套件中,在硬探索模式下完全失败。可以想象,对于广泛的相关任务来说,这将是一个问题。
学习玩电子游戏的Agent可能会经历一个积极的奖励与随机行动(又叫按钮砸),这是便是Atari套件是受欢迎的强化学习基准的原因。对于更为复杂的任务,比如:如何打一个复杂的结,机器人不太可能偶然找出解决方案。无论允许多少次随机交互,达到预期的结果的可能性都不会很大。
正如以前在学习魔方操作的讨论中所看到的,通过手动编程打绳结的自定义绑结机器人,从scratch开始学习这样做的强化学习Agent仍然无法实现。不言而喻,人类也不会通过scratch学习打结。如果将一个蹒跚学步的孩子独自留在满是解开鞋带的运动鞋的房间里,他自己很难打出标准的“兔子”结(“bunny rabbit” knot)。与思维实验中的蹒跚学步的孩子一样,强化学习Agent可以从示例中更好地学习,以便完成诸如打结这样的复杂任务。
通过将物理绳索的自主学习与真人演示相结合,伯克利的研究人员解决了教机器打结的问题。首先,这一部分可以模拟:机器人与桌面上绳子的随机交互,目的是为了了解它们是如何工作的,从而学习出一个合理的模型。在Agent的自主学习周期里,显示出了想要的动作:打一个简单的结。在不出错的情况下,Agent能够模拟所需的动作。自主学习世界动力学模型(在上面的例子中,一个带有绳子的台面)和人类要做的动作紧密结合。模仿学习和相关的逆强化学习代表了一些最符合样本效率的RL方法。
绑结是一项比较深奥的任务(显然超出了许多学习算法的能力),但我们可以通过它,来对不同学习算法应用于更多标准任务的样本效率进行比较。在谢尔盖莱文伯克利的深层RL课程第21课,第29页幻灯片中,通过对比公开发表的HalfCheetah 任务的结论,给出了各种RL算法的相对样本效率。alfCheetah是一个2D运动任务,用机器人模糊地模拟猫的动作。HalfCheetah可以在Mujoco(需要付费许可)和Bullet(开源,免费)物理模拟器中实现。
根据幻灯片的内容,我们期望总时间步长对应的进化策略的样本失效率最低,基于模型/逆向强化学习的效率最高。下面转载了幻灯片中的估值,以及文献中的具体示例。
HalfCheetah机器人在Py Bullet中仿真,目标尽可能快地前行。虽然是在3D中呈现,但运动被限制在2D平面上。就像猎豹一样,却只有半个身子。
表1:各种RL算法的相对样本效率。
样本效率在同一类算法中的实现之间有很大的差异,我发现幻灯片中的估值相对于文献中的特定示例来说可能有些夸大。特别是,OpenAI的进化策略论文提出了一种比TRPO具备更高的样本效率的方法,即一种策略梯度方法,用它来与TRPO作比较。报告称:HalfCheetah 的解决方案花费了300万个时间步长,远远低于Levine的10亿个步长的估值。
此外,UberAI实验室发表的一篇相关论文,将遗传算法应用于Atari游戏,其样本效率约为10亿个时间步长,约为Levine课程估值的5倍。
在上面讨论的示例中,进化策略是样本效率最低的方法之一,通常需要比其他方法至少多出10倍的步长来学习给定的任务。另一个极端情况是,基于模型方法和模仿方法则需要最少的时间步长来学习相同的任务。
乍一看,它似乎是与基于进化的方法相反的案例,但当你对计算进行优化而不是对样本效率进行优化时,会发生一件有趣的事情。由于运行进化策略的开销减少,甚至不需要反向传播通行证,实际上它们需要较少的计算,从本质上来看,计算也是平行的。由于群中的每一episode或单个Agent不依赖于其他Agent/节点的结果,因此学习算法变得相对并行。有了高速的仿真器,它可以在更短的时间内(根据墙壁上的时钟来测量)解决给定的问题。
InvertedPendulumSwingup任务的起始状态和目标状态。绿色胶囊沿着黄色杆滑动,目的是使红色杆平衡直立。
为了对计算效率进行粗略的比较,我在PyBullet中对推车式摆动任务(cart-pole swing-up task )倒置摆摆子BulletEnv-v0上运行了几个不同学习算法的开源实现。具有代表性的进化算法和协方差矩阵自适应的源代码,可在Github上找到,而其他算法都是OpenAI的深度RL资源的一部分。
策略体系结构均保持不变:一个前馈密集的神经网络,共16个神经元,每个神经元有两个隐藏层。我在一个单核Inteli5,2.4GHz CPU上运行全部算法,可以得到对比结果:在没有任何并行化加速情况下,训练时间存在差异。值得注意的是,OpenAI在10分钟内利用进化策略对1,440名工人进行了MujoCo类人训练,得出如下结论:如果具备并行CPU核,并行能真正实现提速,的确有利可图。
表2:不同的学习方法的wall-clock时间和样本效率对比表
上表很好地说明了不同算法所需资源之间的相对关系:样本效率最高的算法(soft actor-critic)需要大约一半的步长,但消耗了34倍的CPU时间。双延迟DDPG(又称TD3)和soft actor-critic算法的稳定性低于其他算法。
由于缺乏开源工具,在运行表2中的实验时没有考虑基于模型的RL算法。对基于模型的RL的进一步研究受到封闭源开发和缺乏标准环境的影响,但许多科学家为基于模型的RL算法标准化做出了不懈的努力。他们发现,大多数基于模型的RL方法能够在大约25,000个步长中解决 “钟摆”的任务,与上表中报告的策略梯度方法(policy gradient methods)类似,但是,训练时长却是策略梯度方法(policy gradient methods)方法的100到200倍。
虽然深度学习似乎仍然倾向于“花哨”的强化学习方法,但基于进化的方法一直在卷土重来。OpenAI的“进化策略是强化学习的一个可扩展的替代”自 2016年起,参与了2017年的大规模演示遗传算法:学玩Atari游戏。在没有高级RL算法的花哨的数学装饰情况下,进化算法的概念十分简单:创建一个人群并为群中每个人设置某些任务,最好的玩家可以成为下一代种子,循环重复,直到满足性能阈值。由于它们背后的一些简单的概念和它们固有的并行化潜力,可以发现进化算法将是您最稀缺的资源:可以大量节省开发人员时间。
在单个任务上,不同RL算法之间的计算和样本效率的直接比较并不完全公平,因为实现起来可能存在许多不同的变量。一种算法可能收敛得更早,但却达不到其它、较慢的算法相同的分数,在通常情况下,我可以和你打个赌,在任何已发表的RL项目中,作者花费了比任何其它算法更多的精力来优化和实验他们的新方法。
通过上文讨论的例子,对于从强化学习Agent中期望获得什么这一问题,给出了一个很好的答案。基于模型的方法虽然很有前途,但与其他选项相比并不成熟,不值得为之付出额外的努力。或许,神奇的是:进化算法在各种任务上都表现得很好,不应该被忽视,即便它们被认为是“过时的”或“太简单”。当考虑到所有可用资源的价值及其消耗时,进化算法的确可以提供最好的回报。