主动学习:采集对的机器人数据,而不只是更多
每一条机器人示范都要真人来做,所以聪明的做法不是采得更多,而是采策略最该学的那些。本文讲主动学习:不确定性采样、分歧采样,以及把部署失败接回下一批采集。
一个抓取放置策略在产线上运行,九成多的尝试都顺畅完成。可当你去看那些失败,它们并不是零散分布的,而是扎堆出现:相机定位不了的透明壳、转过某个角度送来的零件、够到机械臂最远处的那个料箱。就那么几种情形,一遍又一遍,而其余一切都正常。
大多数实验室的本能反应是:多采一些示范,再重训一遍。这是个错误的、或者至少是昂贵的本能。每一条机器人示范都得由真人实时地、在真实硬件上做出来,而新采的一万条里,绝大多数会落在策略本就应付得来的情形上。你为一万条示范买了单,只为撬动三种失败模式,而这三种,几百条有针对性的示范就能补上。
有用的问题不是采多少数据,而是:哪些示范能让策略学到最多,以及你能不能就去把那些采回来。这就是主动学习,一个源自经典机器学习、有几十年历史的想法。机器人领域如今才被迫认真对待它,因为在这里,标注不是鼠标一点,而是一个人把一项任务做一遍。
「更多」是错误的坐标轴
先从一条示范的价格说起。在文本流水线里,多一个训练样本几乎是免费的,它早已被写好,就摆在某个网页上。在机器人流水线里,多一条示范意味着一小时熟练的人力、一套工装,以及每次录制之间都要复位的实物。边际成本很高且大致固定,于是唯一还能动的杠杆就是边际价值:每条示范教给模型的、此前示范没教的那部分有多少。
对一个本就大多数时候都成功的策略来说,均匀采样的一批数据边际价值很差。其中大部分只是在重复策略已经掌握的状态,把一份从不成问题的能力磨得更深。信息藏在长尾里,藏在那些失败的抓取和策略从未到过的状态中。「覆盖长尾胜过堆原始时长」这个论点如今已被讲得很熟;主动学习是它缺失的另一半,不是「长尾要紧」这个观察,而是一套找到长尾的方法。
去问模型它在哪里没把握
主动学习的核心动作,是让模型自己提名要用的训练数据。不是由人预先判断什么看上去值得采,而是从当前策略上读出一个信号,指向它薄弱的那些状态,然后就去那里采。两个信号承担了大部分工作。
不确定性。操作策略在它看到的每个状态上,都会预测一个动作,或一个动作上的分布。当这个分布很尖锐,策略是有把握的;当它宽而高熵,策略基本上是在猜。不确定性采样按这个熵给候选状态排序,在熵最高的地方采集示范。实践中,这会浮现出策略定位不了的反光物体,以及三种抓法看起来同样可行的杂乱料箱,正是它把握最薄的地方。
分歧。单个网络的不确定性容易被骗,因为一个策略可能自信地犯错。委员会查询(query-by-committee)绕开了这一点:在同一批数据上训练一个策略集成,观察它们在哪里出现分歧。如果五个模型对动作意见一致,这个状态就已被很好地确定,再采一条便是浪费。如果它们各执一词,说明数据没把它们约束住,这里的一条示范就化解了一个真实的歧义。分歧往往比单纯的置信度更好用,因为它衡量的是数据没能钉死什么,而不是某一个网络碰巧相信什么。
几种采样策略,并排来看
这些信号并不互斥,也没有哪一个适合所有情形。下表把常见策略与它们各自瞄准什么、以及何时才划算,摆在一起。
| 策略 | 瞄准什么 | 何时管用 |
|---|---|---|
| 均匀/随机 | 整个状态分布,均匀铺开 | 早期,策略还没有可利用的能力时;一个稳妥的基线 |
| 不确定性采样 | 预测动作高熵的状态 | 策略大体不错、你想要它犹豫之处时;对「自信的错误」无能为力 |
| 分歧(委员会查询) | 集成模型出现分歧的状态 | 单模型置信度不可靠时;能抓住数据没约束住的缺口 |
| 部署失败采样 | 部署后的策略真正失败、或需要人接管的状态 | 你能在真实场景里跑策略并记录接管时;这是最紧的信号 |
| 新颖性/分布外 | 离当前数据集里任何东西都很远的状态 | 担心覆盖度时;防住策略自己都意识不到的盲区 |
最便宜采的那条示范,和最有价值采的那条,几乎从来不是同一条。主动学习是把两者分辨开来的功夫,而没有一个能真去把有价值那条采回来的采集程序,它便一文不值。
用部署失败闭合回路
机器人里最纯粹的主动学习信号,根本不是离线算出来的。它来自运行策略、看它在哪里崩掉。一个执行真实任务的机器人,会吐出一串正是要紧的状态:那些它自己走进去、又处理不了的状态。当一个人不得不伸手接管,这次接管就是一条带标注的样本:一个策略解不了的状态,配上解得了它的动作。这正是交互式模仿这条线的直觉,DAgger 及其众多后继方法,数据集是靠反复部署当前策略并加以纠正而长大的,而不是一开始就采好固定的一批。
它之所以胜过离线的不确定性,原因在于分布。离线时,你是在猜策略实际会造访哪些状态。部署时,策略直接告诉你:它漂进自己的失败状态、累积自己的误差,于是你收集到的纠正,恰好落在机器人自己诱导出的分布上。Berkeley BAIR 和 Stanford IRIS 这类做真实机器人学习的团队,正是为此才倚重这条交互回路:它瞄准的是策略在自主控制下抵达的状态,而那恰恰是离线批次最不可能包含的状态。Toyota Research Institute 从数据一侧给出一个相容的观点:推动一个大型行为模型前进的,不是它已经做得好的那些的更多重复,而是覆盖它做不好之处的示范。
知道该采什么,只是问题的一半
正是在这里,机器人和教科书版的主动学习分道扬镳。在标注流水线里,一旦你把未标注的池子排好序,获取标注不过是在你早已持有的数据上点一下。在机器人里,池子就是物理世界,而策略最怕的那个状态的「标注」,是那种具体情形的一条新示范,特意搭好场景、真人做出来。主动学习浮现出一个请求,总还得有东西去满足它。
这把运营问题一分为二。首先,你需要一套办法把「下一步该采什么」浮现出来:一个能把失败聚类的评测框架、一个在真实状态上算出的不确定性或分歧分数、一份对「部署分布里哪一片仍然稀薄」的诚实判断。其次,你需要一个能迅速响应这个请求的采集程序,把反光物体的场景或最远处的抓取搭起来,趁着这个发现还热乎,交回几百条干净的示范。只有前者而没有后者的团队,攒下的不过是一张愿望清单。机器人学文献里满是给「该采什么」排序的巧办法,而对「怎么把它采到手」的物流却相对沉默,可后者才是真正卡住大多数项目的地方。
跑在前面的团队,不会是原始日志最多、或孤立地把不确定性数学玩得最花的那些。而是那些把回路闭得最紧的团队:部署、观察策略在哪里没把握或出错、把它变成一个精确的采集请求,并在下一次训练开始之前就把示范拿到手。采更多数据既容易又大多是浪费。有意采对的数据,一次一批有针对性地采,是更难的功夫,也是真正回报你的那一门。