GigaBrain-0:用世界模型与具身CoT提升VLA泛化能力
做具身智能的朋友最近应该都经常撞上同一个词VLA。视觉-语言-动作模型这套范式确实把“看懂指令”和“输出动作”拉进了同一个网络里但真拿到真实环境里跑几轮就会发现问题——换一个光照、换一套纹理、换一张没见过的桌子成功率掉得飞快。GigaBrain-0这个项目我们内部代号就叫GigaBrain-0核心是想把两件事塞进VLA的骨架里一个叫GigaWorld的世界模型用来基于RGBD输入做环境建模一个叫具身CoT的推理模块让模型在出动作之前先“想清楚”。这篇文章就围绕这套设计聊聊为什么这么做、GigaWorld怎么建模、CoT怎么用以及我们实际踩过的坑。如果你正在搞机器人操作、抓取或者移动操作相关的策略学习又苦于模型换个场景就失灵那这套“世界模型具身CoT”的思路可以直接参考。1. 先说清楚VLA为什么会在泛化上翻车1.1 常规VLA的套路长什么样现在主流的VLA方案不管是端到端还是两段式大致套路都是拿一个视觉编码器处理相机画面把图像特征和语言指令一起丢给一个大语言模型最后加一个动作头输出连续动作或者离散动作token。训练数据就是“当前RGB图指令历史动作 - 下一步动作”的监督式模仿学习。这个套路最大的优势是简单端到端可微把过去机器人的整个pipeline压缩成了一次前向推理。但它隐含了三个很危险的假设。第一个假设是训练分布已经覆盖了测试分布。你让模型在五个厨房场景里学会开抽屉它可能就把场景特征和“开抽屉”这件事捆绑在一起了换个从来没见过的高柜子它就不知道手该往哪伸。第二个假设是RGB像素里的静态语义足够支撑决策。实际上物体材质、反光、阴影这些因素会强烈干扰特征提取你看上去“同一个抽屉”在像素域里可能是完全不同的分布。第三个假设更隐蔽模型被训练成“看到什么就做什么”的直接映射中间没有任何关于“这个世界接下来会怎么变化”的预测能力。换句话说它没有世界模型只能死记硬背状态到动作的查询表。1.2 为什么把输入换成RGBD我们在GigaBrain-0里坚持用RGBD而不是纯RGB是因为深度通道给了一个非常关键的信息几何尺度。机器人操作本质上是在三维空间里对物体施加力纯RGB缺少真实尺度模型只能靠数据量去猜“这个杯子离手多远”“抽屉把手往外凸多少”。深度图直接把这个几何关系摆出来而且深度信息对纹理、颜色、光照变化不敏感——同样一个物体换了喷漆颜色RGB特征可能剧烈漂移深度特征却基本稳定。这对泛化来说是天然的正则化。当然RGBD不是银弹。真实深度传感器有噪声玻璃和黑色反光物体会产生黑洞深度相机和RGB相机的视角差异会导致不对齐。这些都是工程上的麻烦后面单独讲。但从模型设计的角度看RGBD输入的收益是实打实的尤其是面对“换纹理就翻车”这类典型泛化问题时深度通道让模型不容易被视觉外观带偏。1.3 世界模型GigaWorld到底补上了什么GigaWorld的核心思想是让模型拥有一个“脑内沙盒”。策略网络不再直接面对“状态到底长什么样”的问题而是先学会一个隐空间的动态模型给定当前的具身状态编码和一个候选动作预测下一个状态编码会变成什么。有了这个前向模型机器人就能在动作执行前做模拟推演——在这个沙盒里试几步看到结果不好就换一个动作而不是真的让机械臂在物理世界里试错。这个思路类比一下就是“老司机开车之前先在心里过一遍路线”而不是“撞一次墙然后再退回来”。实际实现上我们没有让世界模型重建像素级的下一帧RGBD而是在隐空间里做预测。因为重建像素太贵、太慢而且对决策没用——你预测出某个像素值从128变成129根本不能直接告诉机械臂该怎么动。重要的是物体位置、遮挡关系、手爪相对目标物体的空间距离这些状态表征的变化。1.4 具身CoT和普通CoT不是一回事大语言模型里的Chain-of-Thought很好理解就是让模型分步推理“先找钥匙再开门再拿杯子”最后给出答案。但把它搬到机器人上不能简单照搬文本推理。普通CoT的问题在于它不绑定任何真实观察。模型完全可能编出一段逻辑通顺但现实中根本不可执行的推理比如“先走到柜子前从左边第三个抽屉拿螺丝刀”——但模型并没有验证过第三个抽屉是否存在。具身CoT要求每一句推理都能回指到当前的RGBD观察例如“看到桌面上有一个红色圆柱体与目标螺丝刀颜色匹配估算距离0.4米因此优先抓取它”。这个“观察-判断-约束-动作”的闭环才是我们能真正用起来的CoT。所以整个GigaBrain-0说白了就是三件事的拼装用RGBD输入解决“看不清几何”的问题用GigaWorld解决“看不到未来”的问题用具身CoT解决“想不清楚”的问题。三者互相配合而不是各自为战。2. 整体设计GigaBrain-0的系统拆解2.1 四个模块各管一段整个系统可以拆成四个模块感知编码器、GigaWorld世界模型、具身CoT推理模块、动作策略头。感知编码器负责把RGBD输入压缩成隐状态输入是128x128或224x224分辨率的四通道图RGB加深度归一化输出是一个状态嵌入向量我们实验里用的是128维或者256维取决于任务复杂度。GigaWorld世界模型负责在隐状态空间里做前向动态预测。输入是当前状态嵌入和动作向量输出是下一时刻的状态嵌入。它可以一次性预测未来K步形成一个“想象轨迹”。具身CoT模块是一个语言推理头负责在动作之前生成一段结构化的推理文本。这段文本不是给人看的是给动作策略头提供条件的。策略动作头最后把感知特征、想象轨迹特征、CoT文本特征融合起来输出动作的均值或离散动作分布。四个模块的接法是先出CoT再出GigaWorld的想象轨迹最后动作头根据两者做最终的决策。这样动作输出不是凭空蹦出来的而是带着“推理过程”和“未来状态预估”的双重上下文。2.2 训练和推理为什么要分开设计设计上我们刻意区分训练阶段和推理阶段。训练阶段分三步走。第一步GigaWorld作为一个自监督模块在大量无标签轨迹数据上训练前向动态预测。第二步具身CoT模块在带推理标注的数据上做语言建模训练。第三步整个系统联合微调让四个模块的接口对齐。推理阶段则更复杂一些。模型先完成CoT推理然后利用当前真实观察得到状态编码再用GigaWorld做几步前向推演。推演时内置一个简单的规划搜索比如CEM或者基于策略先验的采样寻找能让想象轨迹末端状态更接近目标状态的候选动作。最后动作头把规划结果作为额外条件输出真正下发的动作。这么拆分的好处是GigaWorld的预训练完全不依赖动作标签的质量。原始轨迹里哪怕动作有很多噪声世界模型依然能从“状态-动作-新状态”的转移关系里学到规律。而CoT模块的标注又相对独立可以离线批处理生成。两个模块都稳定之后最后联合微调的量并不大不容易出现训练发散。2.3 为什么选择隐式世界模型而不是像素重建这是项目早期我们反复讨论过的一个问题。最初的方案是让GigaWorld像视频预测模型一样预测下一帧RGBD图像。好处是直观看起来“真的会想象”。但跑了几轮实验就发现三个硬伤。第一是计算开销爆炸。预测一张224x224的RGBD图解码器要重构四通道图像显存占用和训练时间都是隐空间预测的好几倍而且对机器人推理的实时性完全不可接受。第二是像素级重建包含大量与决策无关的信息。背景墙面纹理、地面反光、远处物体的微小变化这些在重建loss里占了很大权重模型浪费大量capacity去拟合这些无用细节真正重要的手爪-物体相对位姿反而学得不够好。第三是泛化反而更差。像素重建本质上还是在做外观分布建模换个纹理场景重建误差立刻飙升。而我们在隐空间里预测的是“语义化的状态变化”对纹理变化的敏感度低很多。最终我们决定只保留一个很小的辅助重建枝偶尔从隐状态解码出一张粗糙的深度图用来约束隐状态不要丢失几何信息但主loss还是隐空间的状态预测误差。这个“隐式为主、重建为辅”的组合稳定性和效率都明显更好。3. GigaWorld核心基于RGBD的世界建模细节3.1 输入数据怎么处理才不乱RGBD建模的第一步也是被很多人忽略的一步是输入预处理。深度图和RGB图如果不对齐世界模型学出来的状态转移就是乱的。对RGB相机和深度相机标定后我们先通过相机内参和外参把深度图重投影到RGB视角下生成一个逐像素对齐的深度通道。然后将深度值裁剪到0.2米到2米有效范围再归一化到0到1区间超过范围的截断缺失值用0填充并额外加一个mask通道。也就是说网络输入是RGB三通道深度一通道深度有效mask一通道一共五通道。训练时我们做了一套专门针对深度数据的增强。除了常规的颜色抖动、仿射旋转还加了深度随机mask训练中按一定比例把深度图的局部区域置零模拟真实世界里的玻璃、反光、镜面导致的“黑洞”。这个增强特别重要否则深度噪声一到部署阶段就露馅。另一个容易被忽视的点是相机高度和俯仰角的随机化。同一个任务在训练环境里如果只用一个相机位姿GigaWorld会把视角当成状态的一部分换到稍微高一点或者低一点的视角就懵。我们在模拟环境里对相机高度做均匀采样再加上小角度俯仰扰动相当于让模型看到多个视角下的同一物理状态。3.2 潜在动态模型的结构和loss设计GigaWorld的动态模型结构不复杂就是一个条件变分前向模型。感知编码器把当前观察o_t编码成状态s_t这个s_t是一个256维的向量。然后给定候选动作a_t用一个两层MLP或者一个小型Transformer块预测s_{t1}。为了建模环境中的随机性我们还引入了一个随机噪声变量z_t从重参数化的高斯分布里采样。训练目标是最大化给定s_t和a_t时s_{t1}的对数似然。实际训练时用的是确定性MSE损失加上KL正则让模型不要过度依赖噪声来解释所有状态变化。预测K步的操作是链式的用s_{t1}喂给动态模型预测s_{t2}如此类推。但这里有一个炸雷点多步预测误差会迅速累积。我们解决的办法是训练时也做多步预测不只算一步loss而是让模型在预测序列的每个时间步都计算MSE并用教师强制和自由运行按一定比例混合。所谓“教师强制”就是训练时偶尔把真实观测编码回状态避免误差在训练时就被放大而“自由运行”则让模型学会自己纠正预测轨迹。loss配置大概是一步预测MSE权重0.5多步预测MSE权重0.3深度辅助重建loss权重0.15KL正则权重0.05。这个比例不是随手拍的是在一组任务上调出来的改到重建loss权重超过0.2模型就会把capacity拿去抠深度图细节全局性能下降。3.3 想象轨迹怎么反哺机器人规划GigaWorld训练好以后推理阶段怎么用我们采用了一种类似模型预测控制的策略。具体来说给定当前观测o_t和任务目标gCoT模块先生成一串推理文本。感知编码器得到s_t。然后我们采样N个候选动作序列每个序列长度H一般取8到16步。每个候选动作序列喂给GigaWorld推演出对应的隐状态轨迹。用一个简单的奖励函数打分奖励函数不是学出来的而是规则写的轨迹末端的隐状态与目标物体状态编码的余弦相似度加上中间步骤对碰撞约束的惩罚。选出得分最高的动作序列取第一步动作下发执行。执行完得到真实观测o_{t1}重新编码再次规划。这就是典型的MPC闭环。这个流程看起来多绕了一步但带来的好处非常大。策略网络本身不需要在训练时见过所有可能的失败路径因为GigaWorld已经把很多“不可行的动作”在脑内沙盒里过滤掉了。策略只需要负责“在已过滤后的好动作附近输出合理分布”成功率自然提升。3.4 世界模型训练的伪代码参考下面这段伪代码是我们在项目里实际跑过的简化版可以直接当成参考实现。# GigaWorld training loop (pytorch-style pseudocode) for episode in replay_buffer: # obs_rgbd: B,4,H,W ; actions: B,T,6 ; next_obs: B,4,H,W obs_seq encode_all_frames(episode) # B,T,256 s_t obs_seq[:, :-1, :] # B,T-1,256 s_next_gt obs_seq[:, 1:, :] # B,T-1,256 a_t actions[:, :-1, :] # B,T-1,6 z_t gaussian_sample(prior_net(s_next_gt)) # latent noise # one-step prediction s_next_pred dynamics_mlp(s_t, a_t, z_t) loss_one mse_loss(s_next_pred, s_next_gt) # multi-step free-running s_cur s_t[:, 0, :] loss_multi 0 for k in range(K): s_cur dynamics_mlp(s_cur, a_t[:, k, :], sample_gaussian(batch_size)) loss_multi mse_loss(s_cur, s_next_gt[:, k, :]) loss_multi / K # geometric auxiliary reconstruction depth_pred depth_decoder(s_t) loss_depth mse_loss(depth_pred, depth_gt) loss 0.5 * loss_one 0.3 * loss_multi 0.15 * loss_depth 0.05 * kl_loss loss.backward()这段代码对应的是离线训练阶段。还能看到一点多步自由运行的循环里每一步都重新采样噪声这样模型学到的不是一个确定性函数而是一个可以表达环境随机性的条件分布。4. 具身CoT让模型先想再动4.1 CoT数据从哪儿来具身CoT模块最容易被低估的是数据。千万别觉得随便拿一个大模型生成几段推理文本就能用。我们一开始就是这么试的效果惨不忍睹——模型生成了一段特别漂亮的推理但里面的关键判断和RGBD观察完全对不上策略全被带偏。有效做法分三层。第一层是规则生成。对模拟环境里可程序化检查的任务比如“抓取红色杯子”“打开第三个抽屉”可以直接用规则模板生成CoT。模板包含四个固定段落场景摘要、目标识别、动作约束、决策理由。场景摘要里必须指出检测到的物体颜色、位置、大致距离这些数字可以从模拟器的ground truth拿。第二层是模型生成加规则校验。对复杂一点的指令用大模型生成候选CoT但生成时给足结构化观测数据比如当前所有可见物体的列表、每个物体的三维坐标和类别。然后写一套校验脚本检查CoT里提到的物体名是否真的出现在观测列表里、提到的空间关系是否和坐标一致。不一致的整条丢掉不许修。第三层是人工抽检。每批生成的数据抽10%到20%让标注同学看视频回放重点看CoT里“可疑的描述”有没有误导动作。这个过程很花时间但也是清洗数据毒性的关键一环。4.2 推理时怎么把CoT注入到策略网络训练好CoT模块后推理时的注入方式有两种典型路线。第一种是把CoT当作额外的文本输入。把生成的CoT token序列与语言指令拼接一起送到策略模型的文本编码器里。好处是实现简单坏处是长CoT会占用大量token预算推理时延明显增加。第二种是把CoT转换成语义向量后与动作头做交叉注意力。我们实际用的是折中方案CoT文本先用轻量文本编码器编码然后取最后一层所有token的平均向量再和视觉特征一起过一个cross-attention层最后进入动作头。这样CoT主要起“条件调制”作用不会把整个策略模型的上下文窗口占满。还有一个细节值得注意CoT的生成和动作输出不是串行的而是并行的。我们在同一个Transformer里设置了两个解码头一个头生成CoT token另一个头接收CoT的隐状态结果输出动作。这样虽然总计算量增加但时延只增加少量因为两个头是同时前向计算的。4.3 长链推理的截断与失败恢复具身CoT一旦发挥负面作用通常是因为推理链太长、太绕。模型在一条错误推理链上越走越远动作也跟着越来越偏。我们设置了一个CoT长度上限默认8个句子超过的直接截断。截断也不是硬截而是用一个特殊token提示“推理到此为止开始决策”避免文本在句子中间被掐断导致特征混乱。另一个机制是失败反馈。机器人执行动作后如果检测到目标状态没有变化——比如抓取失败、抽屉没有移动——我们会触发一次“CoT回退”。具体做法是把当前真实观测重新编码连同上次CoT一起送给模块让它生成一段“纠错推理”重点回答“刚才哪一步假设不成立”。这个反馈循环让CoT具备在线自我修正能力也弥补了离线数据里缺乏失败样例的问题。5. 训练管线与关键评估5.1 分阶段训练设定GigaBrain-0的训练必须分阶段不能一上来就端到端全家桶。我们的实际顺序是第一阶段用海量无标签轨迹数据预训练GigaWorld。这个阶段的核心指标是状态预测误差不追求任务的最终成功率。数据来源主要是模拟环境里的随机探索以及部分人工采集的成功轨迹。目标是让世界模型见足够多的物理转移模式。第二阶段训练CoT模块。用带结构化标注的CoT数据目标函数是文本生成loss。但这个阶段使用的视觉特征是冻结的防止语言模型把视觉编码器带偏。第三阶段联合微调。解冻所有模块用少量高质量专家轨迹数据做端到端微调。CoT的loss、GigaWorld的前向loss和动作头的BC loss按1比1比2加权。动作loss权重最高因为最终目标还是执行。第四阶段可选在线自适应。在模拟器里做DAgger式的在线数据收集由专家在模型犯错的边缘进行纠正补充到回放池里。这一步对真实部署帮助很大但成本高不是所有任务都做。5.2 我们用的评估协议评估不能只看一个成功率否则很容易被骗。我们的标准协议是五组测试。第一组是原始训练分布内的任务用作baseline sanity check。第二组是换物体纹理和颜色保持几何结构不变。第三组是换光照角度和强度。第四组是换桌面布局和物体初始位置。第五组是换未见过的物体类别组合。每组至少跑100个episode统计三个指标任务成功率SR、部分进展得分SPL、单次推理平均耗时。SR是最直观的SPL用来衡量“虽然没完全成功但任务推进了多少”推理耗时则用来判断方案有没有实用价值。在我跑的一组典型对比里纯RGB的通用VLA基线在第一组成功率82%到第二组掉到51%到第四组只剩28%。GigaWorldRGBTCoT完整版在第一组是85%第二组还有74%第四组维持在63%左右。虽然绝对数字没有夸张到直接翻倍但泛化曲线平稳了很多这正是我们要的效果。5.3 消融实验三块组件各出了多少力消融实验是理解系统贡献的关键。我们把完整模型拆成三个版本做对比。第一个版本去掉GigaWorld只保留RGBD编码器加CoT。第二个版本去掉CoT只保留RGBD加GigaWorld。第三个版本完整保留。对比一下看得很清楚只加GigaWorld时换纹理场景的成功率提升最明显只加CoT时复杂多步任务的成功率提升更明显两者同时加在“换布局多步任务”这个最难的组合上才出现真正的质变。这说明两件事。其一GigaWorld主要解决的是视觉和物理动态变化带来的泛化问题它让模型不再对特定外观过于敏感。其二CoT主要解决的是任务规划和错误恢复问题它让模型在高层次上保持逻辑清晰。两者是互补的。配置训练分布SR换纹理SR换布局SR多步任务SR平均推耗时RGB VLA基线82%51%34%21%90msRGBDCoT无GigaWorld84%65%49%38%120msRGBDGigaWorld无CoT83%68%52%42%110msGigaBrain-0完整版85%74%63%55%135ms表格来自一组典型模拟环境实验不同任务和环境配置下数字会有浮动但相对趋势很稳定。6. 实践中踩过的坑与排查实录6.1 深度图的“黑洞”是世界模型训练的头号杀手真实深度相机在玻璃杯、黑色亮面物体上经常输出NaN或者0看起来就是图像上一片黑洞。如果不处理这些值进入编码器状态s_t就会包含大量“无意义”信息GigaWorld的前向预测经常学到“状态掉进黑洞里就消失了”这种错误模式。我们做了三层防护。第一层是数据清洗把深度图里无效像素比例超过30%的帧直接丢掉。第二层是深度补全的轻量后处理用周边有效像素插值填充小洞大洞保留mask。第三层是训练时随机mask增强确保世界模型在缺失深度信息的情况下依然能保持合理的状态预测而不是完全依赖深度完整度。6.2 RGB和深度对齐不严会凭空制造状态噪声RGB相机和深度相机如果外参标定不够准同一个物理点在两个图上的坐标会差几个像素。这种误差在图像层面看着不明显但对齐后输入到网络里的“前景物体轮廓”和“深度轮廓”会对不上。模型被迫学习这种不对齐的分布隐状态的方差变大世界模型的预测精度直线下降。后来我们在每次采集数据前都跑一次自动标定检查计算标定板的RGB投影和深度点云之间的平均重投影误差超过1个像素就重新标定。这个检查成本不高但几乎每次都能抓出问题。6.3 CoT数据毒化比想象中的更隐蔽前面说规则校验能解决大部分CoT数据问题但还有一些漏网的。比如模型生成“估计物体距离0.3米”坐标checker一看目标确实在0.3米附近校验通过。但问题是这句话在推理阶段和视觉特征拼接后模型会倾向于直接信任文本里的“0.3米”而不是去重新看一眼视觉特征里的真实深度。一旦深度有噪声或者物体被遮挡导致真实位置变了模型还是照着旧CoT执行就会出大问题。解决办法是训练时对CoT文本做随机dropout以一定概率把CoT中的具体数值替换成“未知”token强迫动作头依赖视觉和世界模型输出而不是死记文本。这是我们最后看重的一招部署后成功率又涨了一截。6.4 多步想象轨迹越滚越漂怎么办GigaWorld在8步、16步的滚动预测里误差会累积尤其是接触类任务比如抓取瞬间手指接触物体之后的动态变化非常难预测。漂移一旦出现MPC搜索出来的“最佳动作”其实是基于一个不存在的未来状态算出来的。我们的经验是两条腿走路一是在训练时做动态长度切换有时只训练1步有时强制训练16步避免模型只在短步长上过拟合二是在推理时引入“状态重置”每次真实观测到达后重新编码一次状态把想象轨迹的起点拉回真实状态绝不拿着上一步预测的隐状态当起点连滚20步。6.5 常见问题速查表现象可能原因处理建议世界模型训练loss下降但任务成功率不涨隐状态冗余信息过多增大KL权重检查状态编码是否只保留任务相关特征换纹理后成功率骤降深度通道未正确参与决策检查是否对深度做了随机mask确认网络没有过度依赖RGBCoT生成了但动作没变化CoT特征没有注入动作头检查cross-attention是否真的收到CoT向量或用梯度探针验证MPC搜索耗时太长候选动作序列太多先用策略网络给出的top-k动作初始化CEM缩小搜索空间部署时深度出现大范围黑边传感器自动曝光参数变化固定相机曝光或者在图像输入层做规范化每个问题我们都在单个受控实验里复现过排查路径基本是“先看输入数据再看隐状态可视化最后看loss曲线”不建议直接调网络结构。7. 从GigaBrain-0延伸后面还能怎么玩7.1 从静态操作到动态场景目前的GigaWorld建模主要针对静态或者准静态操作物体不会自己动。下一步可以扩展成动态场景例如抓取传送带上的物体、接住抛过来的小球。核心改动是动态模型需要建模物体的速度状态而不只是位置的瞬间变化。7.2 把世界模型租借给多机器人协同同一个机械臂身上学到的GigaWorld能不能给另一个不同基座的机械臂用我们做了一组初步实验把状态编码器后面加了一个“机器人本体信息”条件向量GigaWorld就能在有限迁移下适配不同臂长和夹爪尺寸。这意味着世界模型有潜力成为机器人之间的“共享物理常识”。7.3 部署时的轻量化裁剪完整版GigaBrain-0在工业显卡上推理是够用的但放到机载边缘设备就紧张。我们做裁剪时发现真正影响推理速度的不是动作头而是CoT模块好几个百MB的语言部分。换成蒸馏后的小型文本编码器CoT链路能瘦身一半左右成功率在小幅下降后可接受。7.4 我个人实践里的一点体会整套项目做下来我最深的感触是世界模型和CoT都不是万能药它们的价值在于给策略网络建立了一个“反思”的夹层。大规模数据和算力当然能强行把问题砸平但泛化这件事本质上还是得靠模型对物理规律、对任务结构有更深的抽象理解。GigaWorld提供了一个低成本试错的空间具身CoT提供了一个可以回溯推理链条的抓手两者叠加相当于在“看见了就做”的黑箱里开了一扇能看到未来的窗。这套架构的下一步我可能会继续在在线强化学习和闭环纠错上压重注而不是继续堆数据。