昨天,我和我们组的data scientist小哥在Google AI Blog上发表了The importance of A/B testing in Robotics. 跟Google AI Blog上大部分高深的研究成果不同,文章讲了一件特别基本的事情:
机器学习研究通常会用一个像ImageNet这样的公开的基准测试数据集进行算法评估,基于相同的测试数据集,可以实现对不同算法的复现和公平的横向比较。机器人AI研究通常也使用这样的方法,用静态数据集或者可重现的模拟环境评估算法效果,若是要在真实物理环境评估算法,则需要用严格的环境重置设计最大限度地让环境和评估结果可复现,再和相同环境下的历史结果进行对比。
但是,真实世界中的机器人面对的是一个开放环境,永远受不可预知也不可控的外界变量影响,所谓「可复现」是非常不可靠的。文章用了一个实验室里最简单可控的机器人任务,将完全相同的软件和模型连续跑了五个月,发现不同时间段策略效果有统计学显著的差别。如果这五个月里我们跑的是不同的策略,根据选取的baseline,我们可能「发现」某个算法有高达 5% 的性能提升,而且这是在真实环境下大量测试,置信区间上相当可靠的结果。但实际上,我们什么都没动,所有的性能差异只不过是不可预知也不可控的环境影响罢了 —— 这还只是一个最简单可控的环境和任务,更真实更复杂的机器人任务受环境不确定性的影响只会更大。要在这样的环境下可靠地比较算法效果,只能使用A/B测试的方法:机器人持续运行,随机在算法策略之间切换,在足够大的样本量下,所有参加的测试的算法都受到了的相同分布的随机环境变量的影响,他们之间的效果比较才是统计学上可靠的结果。
机器学习应用研发往往先在静态数据集和离线环境上开发算法,等算法优化好了再试图把部署到生产环境。这种离线开发方式通常会陷入模型评估怼天怼地生产环境一塌糊涂的窘境,其中一个原因就是忽略、甚至故意剔除真实世界的不确定性,算法优化工作往往陷入错误方向上的过拟合。我来Robotics at Google的目的是让机器人有可落地的,在日常环境帮助普通人的通用能力。在我看来,要尽量降低落地拉垮的风险,必须从研发早期就进入在线模式,在一个尽量接近应用环境的大规模机器人集群上进行快速开发迭代:持续采集真实环境数据训练算法模型;持续对所有算法改进做大规模A/B测试;用可靠的测试比较结果实时引导和修正方向快速投入下一个改进循环,而不去徒劳地追求复现某个绝对指标,也不需要因此而引入的严格环境重置 —— 真实应用环境的不确定性是一个feature而不是bug. 机器人集群规模随着开发进展扩大,并且无限接近真实应用,在这样的大规模持续A/B测试下最终胜出的,才是能够在充满不确定性的环境下保持健壮,更有可能成功落地的机器人系统。
Google在2010年就发表了Overlapping Experiment Infrastructure: More, Better, Faster Experimentation, 这可能是Google最被低估的一篇框架性文章。它给出了一个将数据和计算能力的增长线性转化为产品质量提高的公式:更大的规模,就有更多的数据,就能在更短时间内训练更多的算法模型跑更多的A/B测试,在最短的时间内获得最大的综合质量提升。我相信机器人AI发展和落地也会遵循同样的路径:首先,用有限的运营成本生产出最多的有效机器人时间;再把这些时间最大限度地转化和积累数据价值;最后,用这些数据并行支持尽量多的项目和思路做快速迭代。单位时间内能训练和可靠验证的算法越多,我们跑得就越快。
实现这个目标首先就要提高机器人集群的利用率。对单个机器人来说,这要尽量让它能无需人工干预24x7工作;从集群层面,它则应该是一个动态调度的共享资源池,能够在非常多元化的环境里根据环境状态随时在不同的任务和算法间自由切换。策略模块和算法模型一经发布,就能以一定概率在所有适用的机器人中被随机触发执行进行A/B测试评估和数据收集,在单位机器人时间内,每个策略都接触到了尽量多样的环境和环境的不确定性,在评估中获得更可靠的结果。这样的机器人集群的软件需求就和Borg这样的计算机集群很类似:软件和数据的细粒度快速部署,单机系统上软件模块的资源和失效隔离以及快速热切换;集群层面的实时监控和告警。当然这些机器人不是机架上的计算机,也不是高度可控环境下执行重复任务的工业机器人,它们面对差异性极大的环境,它们会到处乱跑撞墙摔倒,而且它们设计出来就是要执行理想失败率是50%的策略探索的。机器人需要支持可靠的危险动作和失效的探测、防止和自主恢复的软硬件设计,才有可能达成高失败率和无需人工介入这两个看似矛盾的目标。这样的机器人软硬件系统设计是一个非常有趣的新问题。
系统拼图的另一半是把机器人时间转化为数据,并且最终转化为智能的数据系统。这里面最核心也最自然的技术决定是高精度地采集和存储所有可观察的机器人数据。尽管这数据远远超过任何一个特定项目和算法需要,也意味着对Google来说都不是小事的数据量,但这让我们拥有了对机器人世界的无限记忆,能够无数次无比精确地重放机器人经历的一切。这样的能力首先让许多的日常debugging从操作机器人在线调试一次次想办法复现问题变成了大量集群历史数据的统计分析和visualizer里重现场景,机器和人都得到了解放。传统上每个新的机器人项目都要重新针对性地采集数据,但当你积累了巨量的高精度机器人历史数据,开始一个新项目往往只需从来自许多甚至是无关的任务和项目的数据里挑有用的原始数据样本处理来做bootstrap(这本身就是个有趣而且越来越热的研究问题), 立刻投入持续改进循环,把漫长的数据采集过程换成了可扩展和无限次试错的历史数据的筛选、处理和标记。受物理定律制约,机器人时间永远昂贵且无法无限扩张,这是几乎一切机器人AI项目发展的最大瓶颈。一个强大的数据采集、存储和处理系统很大程度地把这个瓶颈转移到便宜得多,也更成熟更容易扩展的后台计算平台上。
我的团队的工作启发了这篇文章。但文章的所有观点都是我自己的,不代表团队和雇主立场。