转载自公众号:敢敢AUTOHUB
0. 简介
具身 In-Context Learning(ICL)研究的是一个很具体的部署问题:机器人面对训练集中没有出现过的任务、物体或身体配置时,能否只看一段人类或机器人示范,就在不重新训练主模型的情况下开始执行。VIMA 把语言、图像和视频统一成多模态 prompt,KAT 将关键点与动作离散成冻结语言模型可以读取的 token,ICWM 和 LocoFormer进一步让上下文承担相机、形态与动力学辨识,RoboTTT、WAM-TTT 则把长历史写入可更新的快权重;GEN-1.5 与 S1 报告了 3–12 秒视频提示和分钟级长任务上的 one-shot 行为。本文据此解释 ICL 的定义边界、训练与推理流程、代码级实现、实验数字,以及“显式训练出来的 ICL”与“由通用 scaling 诱发的 ICL”之间必须保持的证据区分。
1. 研究问题与现有方法的缺口
1.1 从重新采集数据到部署时适应
传统机器人策略的工作流很容易在实验室里被低估:任务增加以后,需要安排遥操作、清洗轨迹、重新训练或微调,再把新模型部署到对应机器人工位。家庭环境中的杯子位置、光照和摩擦每天都可能变化,工厂里的夹具、零件和相机也不会长期固定。语言指令能说明目标,却很难完整表达接触顺序、手腕姿态和力度变化;一条示范视频却同时携带对象、空间、节奏和结果状态。核心问题在于,模型是否能够把这段上下文当作“临时任务说明”,而不是把它当作必须逐帧复现的录像。
1.2 三类路线与证据边界
当前方法大致分成三类。第一类是显式 episodic training,例如 S1、HOST 和 Zero-WAM,在训练样本中直接把 demonstration 与 target episode 配成监督任务;第二类是长上下文适应,例如 LocoFormer 与 ICWM,让策略利用自身 rollout 或主动探测估计身体和环境;第三类是测试时训练,例如 RoboTTT 与 WAM-TTT,把上下文通过自监督梯度写进快权重。三类方法都可能表现为“看一遍就会”,但泛化证据并不等价:配对数据扩大的是已定义任务生成器的覆盖范围,通用序列预训练才更接近 GPT-3 式的未规划能力。评测时必须把“覆盖更多样本”和“改变泛化类型”分成两条曲线。
2. ICL 的定义、边界与整体框架
2.1 狭义定义与形式化接口
狭义具身 ICL 指的是:模型参数 在测试阶段保持不变,系统把示范、视觉历史、状态—动作片段或失败记录放入上下文 ,再结合当前观测 与语言目标 输出动作 。这里的“学习”发生在 Transformer 的隐藏状态、注意力权重或 KV cache 中,而不是发生在优化器更新的慢权重里。这个定义把行为现象与实现机制分开,使读者可以进一步追问:模型是在上下文中现场归纳规则,还是只是在参数里检索一个训练时已经见过的技能。
其中 是 个 demonstration, 是由视觉、状态和动作组成的上下文, 的主参数在推理期间不更新。对于纯 ICL,改变 demonstration 应该导致动作分布发生可测量变化;如果去掉或替换上下文后行为几乎不动,模型可能只是依靠预训练先验完成任务,而没有真正读取 prompt。
直觉理解:把 ICL 想成驾校里的临时教练。教练不会替学员改写大脑中的驾驶规则,而是在上车前用一段路线示范,让学员根据眼前的路况调整方向;如果学员只会背固定路线,换一个路口就会暴露出没有现场学习能力。
2.2 Pure ICL 与 TTT 的边界
RoboTTT 和 WAM-TTT 在测试时更新轻量的 fast weights,因此严格说属于 Test-Time Training(TTT)或 fast-weight adaptation,而不是零参数更新的 Pure ICL。把两者放在同一张路线图里仍然有价值,因为它们共同解决部署时适应成本问题,只是记忆载体不同:Pure ICL 把信息留在 token 或递归状态中,TTT 把信息压缩进一个正在被自监督训练的小网络。这里要厘清的是,是否更新参数不是术语细节,它决定了系统能否处理超长历史,也决定了灾难性遗忘和安全回滚应当如何设计。
| 范式 | 测试时更新 | 上下文来源 | 主要学习对象 | 代表工作 |
|---|---|---|---|---|
| Pure ICL | 否 | 人类视频、机器人 demo、主动探测 | 任务、行为、系统配置 | VIMA、KAT、ICWM、LocoFormer、GEN-1.5、S1 |
| TTT / Fast Weights | 更新轻量快权重 | 人类视频、失败历史、跨 episode rollout | 长期记忆、恢复、偏好引导 | RoboTTT、WAM-TTT |
3. 从多模态 Prompt 到行为 ICL
3.1 VIMA 建立统一任务接口
VIMA(ICML 2023)的贡献不在于宣称机器人已经获得开放世界学习,而在于把任务指定方式统一成交错的文本和图像序列。它在 VIMA-Bench 中设置 17 个任务模板、六类任务和四级泛化协议,模型把物体级视觉 token 与语言 token送入 encoder,再由 decoder 根据轨迹历史预测离散化动作。物体级表示让模型更容易对齐“哪个杯子”“哪个目标区域”与动作之间的关系;cross-attention 则允许控制器在每个时间步重新查询 prompt。这里的关键是,VIMA 首先把“任务可以由上下文指定”做成了可训练接口,后续工作才有机会讨论更强的现场适应。
VIMA 的训练目标仍是离线行为克隆,成功率提升主要来自 prompt 表示和任务模板泛化。它没有要求模型在测试时从机器人自身失败中更新,也没有处理相机视角或形态发生变化后的系统辨识。换句话说,VIMA 解决的是“如何把任务说清楚”,不是“机器人如何在部署中理解自己当前的身体”。这一区分看似保守,却避免把静态多模态条件化误称为持续学习。统一接口是基础设施,不等于已经获得在线学习算法。
3.2 KAT 把示范变成几何 token
KAT(RSS 2024)用一个很有工程意味的办法让冻结的 GPT-4 Turbo 参与视觉模仿:先用 DINO-ViT 找到演示图像和当前观测中的对应关键点,再把关键点坐标与末端执行器动作编码成文本 token。动作不直接表示为难以处理的旋转矩阵,而是用末端坐标系中的三个虚拟点表达 SE(3) 位姿,使视觉 keypoint 和动作 token 落在同一欧式空间。模型因此可以依靠序列模式匹配完成最多约十个演示的少样本模仿,全程不需要机器人数据微调。
# KAT concept implementation: keypoint/action tokenization
def encode_demo(keypoints_xyz, ee_pose, gripper):
key_tokens = [f"kp:{x:.3f},{y:.3f},{z:.3f}" for x, y, z in keypoints_xyz]
virtual_points = ee_pose[:3, :3] @ LOCAL_POINTS + ee_pose[:3, 3]
act_tokens = [f"p:{x:.3f},{y:.3f},{z:.3f}" for x, y, z in virtual_points]
act_tokens.append(f"g:{int(gripper)}")
return key_tokens + ["->"] + act_tokens
这段代码展示的是 KAT 论文公开方法的最小化实现,而不是某个未提供仓库的复制代码。关键工程细节有两个:坐标量化精度决定 token 长度与动作抖动,关键点匹配质量决定跨物体泛化上限;当演示数量继续增加时,prompt 会膨胀,注意力成本与错误累积都会上升。直观理解是,把十段驾车示范写成十张路线卡片,学员还能逐张比对;卡片增加到几百张,真正有用的路口信息反而容易被淹没。KAT 的价值在于把几何对应关系显式暴露出来,而不是把所有空间推理都交给黑盒语言模型。
4. 系统辨识与长上下文适应
4.1 ICWM:从示范任务到理解身体
ICWM 将上下文来源改成机器人自己产生的 task-agnostic probing。执行目标任务前,机器人先做约五次与任务无关的动作,记录起始观测、动作和结束观测,再把这些片段交给 Transformer 隐式推断相机视角、连杆长度等系统变量。策略形式可以写成 ,其中 不是单独训练的显式标量,而是模型处理交互历史后形成的隐藏状态。180 度错位的假 context 会让性能低于无 context,说明系统确实在使用探测信息,而非把它当作无关噪声。
ICWM 在 LIBERO 的视角外推和真实 UR5e 视角偏移测试中报告了明显收益,机械臂连杆延长 80 mm 时也能保持约三倍于基线的成功率。这里要厘清的是,ICWM 的适应仍是“先探测、后执行”的两阶段流程,主要验证静态系统配置,尚未证明模型能够在负载、摩擦和接触变化中持续更新。它把 ICL 的对象从“任务怎么做”推进到了“我的身体如何工作”,但还没有解决长期记忆的容量问题。主动探测的代价必须计入部署预算,不能只比较执行阶段的成功率。
4.2 LocoFormer:失败经验跨越 episode
LocoFormer(CoRL 2025)把 Transformer-XL 用在腿足机器人上,允许策略跨越多个 trial 保存状态—动作历史。训练时随机采样适应时间预算 ,策略可以在预算内反复试错;奖励函数不只评价第一次行走,而是评价整个适应过程中的累计回报。这样,摔倒、关节锁死和轮子失效不再是需要丢弃的异常数据,而是下一次 trial 可以查询的经验。作者在未见形态机器人上报告零样本平均得分 0.96,约五秒适应后达到 0.98,GRU 基线平均只有 0.37。
难点提示(跨 episode 记忆):普通短历史控制器像只看后视镜最后一秒的司机,前面刚摔过跤也不记得;Transformer-XL 像把前几次练车的路线和失误写在可翻页的驾驶日志里,下一次起步时继续读取,但日志内容本身不参与反向传播。
工程价值:LocoFormer 的递归状态让失败成为可复用信息。类比驾校的并线练习,第一次压线并不会修改教练的整套教材,却会改变下一次并线时的观察顺序和方向盘幅度;机器人也能在不更新慢权重的前提下,利用上一轮 rollout 调整当前控制。
5. 测试时训练:从存 Token 到写 Memory
5.1 RoboTTT 的快权重机制
RoboTTT 针对的是更长、更杂的上下文:人类视频、机器人自身失败轨迹、DAgger 纠正片段都可能成为输入。它在 GR00T N1.7 的 DiT 动作头中插入 TTT 层,用寄存器 token 控制计算量,并通过 tanh 门控让新分支在训练初期接近零。快权重 由自监督损失更新,历史不需要作为每一步注意力的全部 K/V 保存,因此上下文被压缩进固定容量的参数状态。
这段更新式揭示了 TTT 与 Pure ICL 的差异:模型确实在部署时做了梯度下降,但更新对象是小型辅助网络,主干慢权重仍然冻结。论文报告 8K context 相比 1K context 的闭环性能提升 63%,三个长时装配任务的平均完成度为 79%,单步 GR00T 基线为 42%。关键问题在于,快权重的表达能力、学习率与重置策略会直接决定安全边界;一个把错误经验写进去的记忆必须能够被检测、衰减或回滚。
5.2 WAM-TTT:无标注人类视频的自监督适应
WAM-TTT 把普通人类 play video 当作测试时自监督信号,而不是把它硬塞成机器人轨迹。阶段一使用人类—机器人配对数据学习 Key-Value 记忆重建,阶段二冻结 WAM、投影矩阵和初始化,只用无动作标注的人类视频更新视觉侧快权重。动作专家保持不变,视觉表征的改变通过 joint attention 间接影响动作生成。这个不对称设计保护了预训练能力,也降低了人类视频与机器人动作不对齐造成的风险。
# WAM-TTT concept implementation: visual fast-weight update
def adapt_on_human_video(video_tokens, fast_net, lr, steps):
for _ in range(steps):
key = project_key(video_tokens)
value = project_value(video_tokens)
pred = fast_net(key)
loss = ((pred - value) ** 2).mean() + video_prediction_loss(video_tokens)
grad = torch.autograd.grad(loss, fast_net.parameters(), create_graph=False)
with torch.no_grad():
for p, g in zip(fast_net.parameters(), grad):
p -= lr * g
return fast_net
WAM-TTT 的直接对照 WAM-ICL 使用同一批人类视频但不更新快权重,平均完成度只有 7.1%,WAM-TTT 为 46.2%,冻结 WAM 为 32.5%。这组数字说明“把信息放进上下文”并不总能工作,模型训练时是否见过相同的长视频分布、快权重是否学会把视觉线索映射成可用表征,都比 prompt 长度更关键。换句话说,TTT 不是给任何模型加一层梯度就会有效,它依赖阶段一的元训练把人类视觉与机器人行为之间的桥接关系预先学好。WAM-TTT 的关键贡献不是更新参数本身,而是让更新只发生在视觉记忆支路,从而保留动作专家的稳定性。
6. 训练与推理的完整实现流程
6.1 数据组织与训练循环
要实现一个可复现的具身 ICL 系统,数据不能只按“任务名称—动作标签”存储,而要保留 context 与 query 的关系。每个 episode 至少包含观测帧、机器人状态、动作 chunk、示范来源和时间相位;人类视频还需要记录视角、手部或工具是否可见,以及与机器人执行阶段的粗对齐。训练时可以把部分帧标记为 context-only,不计算动作监督,只让它们更新隐藏状态或快权重;这样失败片段才有机会作为经验,而不会被误当成正确动作。
# training_step.py: masked context and action supervision
def training_step(batch, model):
context, query = batch["context"], batch["query"]
state = model.reset_memory()
for frame in context:
state = model.encode_context(frame, state)
pred = model.predict_action(query["obs"], query["lang"], state)
action_mask = query.get("action_mask", torch.ones_like(query["action"]))
bc_loss = ((pred - query["action"]) ** 2 * action_mask).sum() / action_mask.sum()
return bc_loss
这段训练循环把“上下文”和“监督目标”拆开,是 RoboTTT、WAM-TTT 中最重要的工程思想之一。纯行为克隆会迫使模型把每个 context 动作都当作答案,遇到次优 rollout 时会放大错误;mask 允许同一段历史只承担记忆更新作用。实际项目还需要按 episode 切分 batch、截断反向传播、对不同视频帧率重采样,并保证 context 不泄露 query 的未来动作,否则评测成功率会被数据泄漏抬高。数据掩码既是训练技巧,也是区分“经验”与“标签”的因果边界。
6.2 推理时的缓存与动作生成
部署流程通常包含四步:先采集或读取示范视频,再用视觉编码器抽取对象与运动线索,随后把 context 写入 KV cache 或快权重,最后在当前观测上滚动生成动作 chunk。对于长任务,策略必须同时维护任务进度、身体状态和近期失败;如果上下文无限增长,注意力计算与显存都会成为瓶颈,因此需要 segment、检索、摘要或固定容量记忆。动作执行还应设置碰撞检测、速度限幅和人工接管接口,不能把 ICL 的“会推断”误解成“可无条件执行”。
# inference.py: cached context and receding-horizon control
@torch.no_grad()
def rollout(robot, model, context, goal, horizon=16):
memory = model.prefill(context) # KV cache or frozen hidden state
for _ in range(MAX_STEPS):
obs = robot.observe()
action_chunk = model.generate(obs, goal, memory, horizon=horizon)
safe_chunk = safety_filter(action_chunk, robot.limits())
robot.execute(safe_chunk)
if task_done(obs):
break
return robot.log_episode()
这段推理代码体现了 receding-horizon 控制的现实取舍:模型不是一次性生成十分钟动作,而是生成短 chunk,执行后重新读取观测并修正。KV cache 能够避免重复编码固定 context,安全过滤器则把模型输出限制在关节速度、力矩和工作空间内。RoboTTT 的快权重版本需要在 prefill 阶段执行有限步自监督更新,并明确何时重置状态;LocoFormer 的版本则在 episode 边界保留递归状态。两者都要求日志记录“使用了哪段 context”和“何时发生更新”,否则失败难以追溯。
6.3 训练目标与正则项
纯 ICL 的基础目标可以是动作负对数似然或 flow matching;TTT 版本还需要记忆重建、视频预测和稳定性正则。多损失权重不应只靠一次网格搜索决定,因为不同机器人、帧率和动作空间的尺度差异会让某一项主导梯度。这里的关键是让监督目标与部署行为一致:如果希望从失败中恢复,就要让训练数据包含失败—纠正关系;如果希望跨具身迁移,就要让 context 中出现不同相机、形态和动作坐标系。
其中 是动作监督掩码, 表示该时间步只更新记忆而不作为模仿目标; 是快权重初始化,正则项限制测试时更新偏离安全初始状态。直观理解是,主模型像一辆出厂校准的车,快权重像可更换的导航卡;导航卡可以适应当天道路,但不能把刹车系统一起改掉。这条边界是长期部署中避免灾难性遗忘的最低工程要求。
直觉理解(损失装配):多损失训练像给机器人安排四位教练,一位纠正动作,一位检查视频预测,一位整理记忆,一位盯住参数漂移;如果所有教练同时大声指挥,学员反而不知道先听谁。权重、掩码和归一化的作用,就是规定每位教练在不同阶段的优先级。
7. GEN-1.5 与 S1:同一外观下的两种因果解释
7.1 GEN-1.5 的 Physical Prompting
Generalist 对 GEN-1.5 的公开描述是:模型持续在大规模 physical interaction sequence 上做自回归预训练,样本由连续物理序列随机截取,不使用专门的 ICL 架构、meta-learning loop 或辅助损失。部署时把约 3–12 秒 sensorimotor demonstration 放入上下文,再以约 100 Hz 生成动作轨迹;官方在十个短时任务上报告 physical prompt 平均成功率约 59%,少量梯度更新可达到约 83%。由于完整训练配方和权重尚未公开,本文把它定位为“最接近未规划 embodied ICL 的公开案例”,而不是已经证明涌现了通用学习算法。
7.2 S1 的显式 episodic 训练
S1 从训练阶段就把模型构造成 in-context learner,每个 pretraining episode 由 demonstration 指定任务,示范和执行可以跨场景、视角与 embodiment。Skild 官方报告在十万小时规模下,video-conditioned ICL 的 seen-task 成功率约 96%,unseen-task 约 66%,language-conditioned 对照在 unseen task 约 9%;一条视频的效果被估算相当于约 380 个 post-training episode。这个结果说明视频确实是高带宽任务接口,但因训练目标直接要求模型从 demonstration 推断 intent、functional correspondence 和 progress,所以它的证据类型属于显式 meta-learning,而不是 GPT-3 式副产品。
8. HOST、Zero-WAM 与 The Imitator Game
8.1 HOST 与 Zero-WAM 的工程增量
HOST 处理人类视频与机器人执行之间的时间和具身错位,先定位当前机器人处在 demonstration 的哪个 progress,再预测机器人自己的未来观测,最后生成动作。它使用 robot-robot 与 human-robot 配对数据,并通过消融显示 progress localization 与 target coupling 能把成功率从 0.21 推到 0.62。Zero-WAM 则针对 next-chunk prediction 容易忽略视频的 shortcut,引入 In-Context Future Chunk Prediction;在 RoboTwin 的 held-out 任务上,完整模型成功率 46.95%,去掉 IFP 后为 28.55%。这些设计很有效,却也说明 ICL 行为是由数据、目标和结构共同塑造的。
8.2 L0—L3 意图迁移评测
The Imitator Game 把人类示范场景与机器人执行场景的差异分成 L0 到 L3:从相同场景复现、位置变化、实例变化,逐步走向需要替换工具和操作方式的意图保持。IG-10K 包含两万多条人类—机器人配对数据、200 多个任务变种和 340 多个可操作物体,并提供 ManiSkill3/SAPIEN 仿真接口与多类基线。评测重点不再是“动作像不像”,而是同一目标在水壶换成水龙头、茶包换成散茶时能否保持任务意图。这里尤其重要的是,L3 才真正接近普通人理解的“看懂了再做”,也是当前模型最容易失速的层级。
9. 实验如何证明模型真的使用了 Context
9.1 反事实、假 Context 与跨场景
仅报告 unseen-task 成功率不足以证明 ICL,因为模型可能已经把任务规律记在参数中。更有说服力的实验要固定当前 observation,只替换 demonstration,检查动作是否随 context 改变;加入语义冲突或几何错误的假 context,观察性能是否按预期下降;再把示范场景和执行场景分开,测试模型能否保留目标而改变动作。ICWM 的错位视角对照、WAM-TTT 与 WAM-ICL 的差距、The Imitator Game 的 L0—L3 协议,都在朝这个方向推进。
9.2 长度、来源与成本曲线
上下文长度应该被当成可测量的 scaling 轴,而不是宣传口号。需要报告 1K、4K、8K 甚至更长历史下的成功率、显存和延迟,并区分新增 token 带来的收益与检索、摘要或快权重压缩带来的收益。RoboTTT 报告 8K 相比 1K 提升 63%,LocoFormer 展示跨 trial 的失败恢复;KAT 则暴露了演示数量过多后纯注意力容易饱和的现象。进一步看,context 来源也应拆分:人类视频、机器人成功轨迹、失败轨迹和主动探测可能承担完全不同的学习对象。
| 工作 | Context 来源 | 学习对象 | 测试时参数更新 | 代表性证据 |
|---|---|---|---|---|
| VIMA | 文本、图像、视频 prompt | 任务指定 | 否 | 17 模板、四级泛化 |
| KAT | 关键点与动作 demo | 少样本行为 | 否 | 冻结 GPT-4 Turbo,最多约 10 个 demo |
| ICWM | 五次主动探测 | 相机与运动学 | 否 | 假 context 对照、真实 UR5e |
| LocoFormer | 跨 trial rollout | 形态与动力学 | 否 | 0.96 到 0.98 的适应曲线 |
| RoboTTT | 人类视频、失败与纠正 | 长时任务与恢复 | 是 | 8K context 提升 63% |
| WAM-TTT | 无标注人类 play video | 任务变体与偏好 | 是 | 46.2% 对 7.1% WAM-ICL |
| GEN-1.5 | 3–12 秒物理示范 | one-shot 技能组合 | 否 | 官方报告约 59% |
| S1 | 单条视频 demonstration | 未见长时任务 | 否 | unseen 约 66%,语言对照约 9% |
10. 总结
具身 ICL 正在把机器人获得新技能的入口从“为每个任务重新训练一个策略”扩展为“利用示范、探测和历史在部署时完成适应”。VIMA 与 KAT 建立了多模态 prompt 和 token 化模仿接口,ICWM 与 LocoFormer把上下文推进到系统辨识和跨 episode 记忆,RoboTTT 与 WAM-TTT用快权重解决长历史与无标注视频适应,GEN-1.5 与 S1 则把 one-shot physical prompting 推向 foundation-scale。读者只需记住一个判断:把 ICL 写进训练目标可以得到有效的任务接口,但只有在改变任务格式、示范来源和因果关系后仍能从 context 归纳规则,才足以讨论通用学习机制是否真正出现。
总结
In-Context Learning,具身智能的GPT3时刻已经到来了吗?
Ego火了之后,具身开始卷 in-context learning 了,但它的评测该怎么弄?
具身前沿 | Embodied In-Context Learning(ICL)调研综述:从 Few-Shot Imitation 到 Physical Prompting
744