目标条件策略:一个模型,多种目标
目标条件策略把目标当作输入,于是一个模型可以追求多种目标。本文讲清让它奏效的成对数据,以及事后重标注这个技巧。
训练一个机器人把红积木叠到蓝积木上。现在让它把蓝的叠到红的上。如果它是用老办法训练的,一个策略对应一个任务,那你就没辙了:这是另一个任务,得重新训练。而目标条件(goal-conditioned)策略把目标当作输入,而不是烧进权重里的常量,于是同一个模型不必重训就能追求这两个目标。
这一个设计选择,把目标喂进策略,正是如今单个人形模型能尝试上百种任务的悄然原因之一。它也重塑了你的数据集必须包含什么。一个能接受任意目标的策略,必须见过许多目标,且每个目标都与达成它的行为配对,而把这种配对做对,比听上去要难。
目标是输入,而不是假设
普通策略把观测映射到动作。目标条件策略把观测和目标一起映射到动作。目标是网络在每一步都会读取的一个额外参数,同一套权重会根据你的要求产生不同的行为。
回报是复用。一套权重覆盖一族任务,它们共享动力学,只在意图上有别。这是现代多任务系统的骨架,也是为什么像 NVIDIA Isaac GR00T 这样的基础模型,以及 Physical Intelligence blog 上描述的通用策略,被表述为「一个模型服务许多指令」,而不是一排各管一件事的单任务控制器。
把它和另一种做法对比一下。没有目标条件,你就要为每个任务训练一个网络,而关于叠积木学到的一切,对倒水毫无帮助,共享的结构被白白浪费了。目标条件模型则把任务之间共通的部分摊薄,比如触及、抓取、对接触的感知,只把容量花在有差异的地方。这就是为什么一套权重能吸纳上百条指令,而体量不会膨胀。
如何告诉机器人你想要什么
在你选定一种表示之前,目标都是抽象的,而这个选择有实实在在的后果。
- 语言:「把杯子放进水槽」。灵活、对人友好,但有歧义,而且需要成对的语言-动作数据把词语落到动作上。这是像 Gemini Robotics 这类系统走的 VLA 路线。
- 目标图像:一张期望末状态的图片。精确、无歧义,但你需要为每个样例都准备这张图像,而且在测试时指定一张也可能很别扭。
- 坐标或位姿:精确的目标位置。对定义明确的运动很好,对「把桌子收拾整齐」则毫无用处。
每一种表示都要求在每条轨迹上打不同的标签。这种标注负担,是走向多任务的隐藏成本,也是为什么像 Open X-Embodiment 这样的开放语料,要花大量精力去统一几十个贡献数据集里目标和指令的记录方式。
实际中,团队很少只选一种。一个现代系统常常对人接受一条语言指令,再在内部把它落成底层控制器能追踪的图像或坐标目标。这种分层意味着同一条轨迹可能同时需要好几种目标标签,这也抬高了对每次示范记录得有多丰富的要求。
一个目标条件策略,只能像它数据里的目标集合那样通用。目标窄,机器人就窄,无论模型多大。
藏在「许多目标」里的数据难题
陷阱在这里。要训练一个能到达任意目标的策略,你似乎需要为每一个目标都准备示范,这不可能。出路是一个叫「事后(hindsight)」的重标注技巧。
事后目标重标注简单而有力。机器人试图到达目标 A,却最终停在了状态 B。这条轨迹对 A 是失败,但它是「如何到达 B」的完美示范。于是你给它重新贴标签:同样的动作,新的目标,现在是一次成功。一次失败的尝试,变成了没人要求过的那个目标的训练数据。正是这一点,让目标条件学习能从有限的数据里挤出许多目标,也改变了一个数据集应当怎样构建。
这个想法源自强化学习,在那里被称为事后经验回放(hindsight experience replay),它把稀疏奖励的问题彻底翻了个面。机器人不再是失败上千次、直到偶然撞上目标才学到东西,而是每一次尝试都能学到点什么,因为每一次尝试都到达了一个值得贴标签的状态。对数据采集的影响是直接的:只要你记录下它实际停在了哪里,一条轨迹即便示范者没做到,也仍然有价值。
| 目标类型 | 如何指定 | 所需数据标签 | 最适合 |
|---|---|---|---|
| 语言指令 | 文本命令 | 每条轨迹的标注 | 开放式、面向人的任务 |
| 目标图像 | 末状态照片 | 每个示范一张末状态帧 | 精确、视觉清晰的目标 |
| 坐标或位姿 | 数值目标 | 自动记录 | 结构化、度量式运动 |
| 到达态(事后) | 事后重新贴标签 | 无需额外 | 从失败里挤出数据 |
重标注为何改变你采集什么
如果失败的尝试和计划外的末状态都是训练数据,那么一条只保留干净成功的采集管线,就是在扔掉自己一半的产出。事后重标注奖励那些凌乱、探索性、不完美的数据,因为每条轨迹都会到达某个状态,而每个到达的状态,都是那条轨迹的一个有效目标。
这颠覆了「只拍完美镜头」的惯常本能。在事后重标注之下,那次飘到错误货架的笨拙尝试不是废料,而是「有意去够那个错误货架」的一个带标签样例。示范者的失误,成了别人的目标。围绕这个想法搭起来的管线,每小时采到的可用数据,比一个只追求完美无瑕示范的管线更多。
开放框架把这一点讲得很具体。Hugging Face LeRobot 这套栈提供了目标条件和多任务的配方,它们期望数据采用标准的分段(episodic)格式,把目标和结果按段记录。教训是一致的:你用什么格式记录,决定了你之后能否重标注,还是那份信号已经丢了。
是徒有其名的通用,还是数据里的通用
一个模型、许多目标,不只是一个建模技巧。它是一场关于数据的下注。策略只能追它实际见过的目标,而见到更多目标最便宜的办法,就是别再丢掉示范者无意中到达的那些状态。早早定下目标表示,把结果记录得和意图一样仔细,一小堆有限的示范就能铺展到一组宽得多的任务上。跳过这一步,一个强大的多目标架构,最终只会在一小片目标上被训练出来,徒有通用之名。