第一次看到 Shallow-π 这个名字,我第一反应是:这不是搞反了吗?
最近几年,AI 圈似乎默认了一条铁律:Transformer 的层数越多,模型就越强。从 GPT 一路卷到 ViT,几乎没有人会质疑“深的就是好的”。而这个名字里直接写着“Shallow”(浅)的具身模型,却声称大幅压缩 Transformer 层级之后,模型反而做得更好。作为一个常年泡在真机部署和机器人策略训练里的人,我对这种“反常识”的结论天然有警惕心——所以我花了很长时间,和作者把这个问题从头到尾聊了一遍。
π 这个符号在强化学习里代表策略(Policy),Shallow-π 翻译成人话就是“浅层策略模型”。它不是一个单纯的压缩技巧,而是对“具身智能到底需要多深的表示”这个问题的重新回答。这篇文章不打算复述论文细节,我想以一个实际接触过类似问题的从业者视角,把这次对话里最有价值的部分、我在复现过程中的实操记录,以及那些常规文档里不会写的坑,一并整理出来。如果你也在做机器人控制、边缘端策略部署,或者对 Transformer 在具身场景里的适用性有疑问,这篇应该能给你一些参考。
1. 先把“反直觉”聊透:具身模型凭啥敢删 Transformer 层数?
1.1 从“越深越好”到“越浅越强”的一次认知反转
我一开始是带着找茬的心态去聊的。结果和作者刚碰了十分钟,就发现他不是在做“小而美”的噱头,而是真的拿到了让我坐直身体的对比数据。在同一个机械臂抓取任务里,一个 12 层的 Transformer 策略网络,一旦换了桌面颜色和光照条件,成功率从 85% 直接掉到 20% 出头;而一个只有 2 层的策略网络,在新环境下反而保持了 70% 以上的成功率。
换句话说,深层模型不仅没有带来预期中的更强泛化,反而变成了一个“环境记忆体”,把训练场景里的背景纹理、光照、相机角度这些无关特征一并记住了。这个现象我在自己项目里也见过不少次:仿真里指标漂亮得不得了,真机上换个位置就失灵。但大家通常第一反应是数据不够、域随机化不够,很少有人反过来怀疑是网络太深了。
作者的核心观点其实很朴素:NLP 和 CV 任务追求的是高维语义抽象,句子很长、上下文依赖重、类别复杂,所以层数堆得越深,模型越能从局部特征逐级精炼到全局语义,这个逻辑完全成立。但具身智能的任务,本质上是“在低延迟内把当前观测映射成动作”。动作策略需要的是对空间位置、几何关系、时间连续性的敏感,而不是对高层语义的无限追求。方向不一样,评价标准就不该一样,网络结构自然也不该一味求深。
1.2 具身任务和语言建模的底层差异
我追问了一个很多从业者都在纠结的问题:凭什么语言模型需要几十层,机器人策略就敢用两层?作者给出两个理由,我觉得都比较扎实。
第一个是动作分布的多模态性。机械臂抓一个杯子,既可以从左边绕过去抓,也可以从右边绕过去抓,两条轨迹都是完全正确的最优解。深层网络做行为克隆时,倾向于把训练数据里所有合法动作“平均”成一个中间结果,而这个被平均出来的轨迹,在物理上往往是最不可行的一条——它可能直接穿过桌面,或者让关节角度超出运动学极限。浅层网络由于容量有限,反而更倾向于锁定其中一个可行模态,输出一个物理上真实存在的动作。
第二个是实时性约束。机器人控制是闭环的,感知-决策-执行要在几十毫秒内转一圈。12 层 Transformer 在桌面级 GPU 上可能也要 30 到 40 毫秒,到了 Jetson 这类机载板卡上更是雪上加霜。作者的原话我印象很深:“具身模型缺的从来不是表达能力,而是在线可用性。一个在仿真里跑得飞快的网络,放到真机上每帧都要卡一下,那它在算法上再先进都没有意义。”
这让我想到一个类比:语言模型像写论文,你可以慢慢斟酌;机器人策略像打乒乓球,球到了就必须在零点几秒内回过去。把写论文的思考深度硬套在打乒乓球上,结果只会是动作变形、反应迟钝。具身模型真正需要的,不是在每一层都做语义重铸,而是保证“观测到动作”这条链路足够短、足够直接。
2. Shallow-π 的架构拆解:它不是“阉割版 Transformer”,而是另一套设计哲学
2.1 输入序列怎么组织:多模态 token 的排列没你想的那么简单
先说输入。一个典型的具身策略网络,输入通常包含三样东西:RGB 图像、本体感知数据(关节角度、关节速度、末端位姿等)、历史动作信息。Shallow-π 的做法是把这三类信息都变成 token,塞进同一个序列里。
图像部分走标准的 patch embedding,比如 224×224 的图切成 16×16 的 patch,得到 196 个视觉 token;本体感知数据经过一个小 MLP 投影成一个或者几个 1D token;历史动作也做同样的投影。最后这些 token 拼成一个序列,喂给那个非常浅的 Transformer。
这个环节有几个细节非常关键。首先是量纲问题。本体感知数据和图像 patch 的量纲完全不是一个世界:图像是归一化后的像素值,关节角度是弧度,速度可能是角度的几十倍。直接把原始数值拼进去,注意力计算时这些大数值 token 会把其他位置的注意力权重全部吸走,模型根本学不到跨模态关系。作者的做法是先做 RMSNorm,再统一映射到和视觉 token 相同的维度,确保在同一量纲下做 attention。
其次是序列顺序。视觉 token 按空间位置排列,本体感知和历史动作放在序列的固定位置,且在不同时间步之间保持一致的排列约定。为什么这么讲究?因为浅层 Transformer 没有太多层去盲目摸索序列结构,你必须在 token 排列上把空间和时间先验直接给它,它才能把容量花在真正重要的动作预测上。
2.2 浅层 Transformer 照样做跨模态注意力
很多人听说只有 2 层,第一反应就是:那跨模态注意力还能起作用吗?其实完全能。注意力机制本身没有层数门槛,只要有一组 query、key、value,第一层就可以让任意两个 token 互相交换信息。视觉 token 和本体感知 token 之间的关系,本质上是一种“输入输出对齐”关系:视觉告诉模型“杯子在哪”,本体感知告诉模型“我的手在哪”,这两个信息一次 attention 就能建立关联,不需要多层迭代。
作者做过一个很有意思的对比实验:把视觉 token 喂进一个 12 层网络的第一层,和喂进它的第十层,效果差别很大;但把视觉 token 和本体感知 token 一起从浅层网络的第一层进来,效果反而远超前者。这说明在具身任务里,本体状态和视觉信号需要在早期就完成对齐,而不是先让视觉信息单独做多层语义精炼,最后再来“配准”。跨模态融合的时机会直接影响决策质量,越早融合,模型对空间关系的利用就越充分。
这一点我深有感触。很多做 VLA 的团队把视觉编码器训练得非常深,然后再接一层策略头去预测动作。这样做会有一个隐患:视觉 backbone 抽取的特征是为“分类/检测”这类语义任务设计的,它对边缘、深度、相对位置这种几何信息的保留程度,可能反而不如浅层网络学出来的特征。具身决策需要的是“几何+时序”,不是“语义+类别”。
2.3 头数与隐藏维度的取舍:关键超参为什么这么设
层数少了,参数容量从哪补?Shallow-π 的选择是:把容量主要花在隐藏维度和注意力头数上。比如隐藏维度用 512 或者 768,注意力头数设 8 头,参数量大概落在 20M 到 100M 这个区间。对比现在动辄几 B 参数的 VLA 模型,可以说是非常克制了。
为什么层数浅但维度不能太小?因为多模态信息融合时,每个模态需要足够的表示宽度来保留原始信息。我举个例子大家就明白了:2 层 × 512 维,和 12 层 × 128 维,参数量虽然接近,但结构性质完全不同。前者的单层容量大,适合“一步到位”式的决策;后者的表达路径长,适合渐进式抽象。具身任务要的是前者,因为目标函数是“给定状态,输出动作”,而不是“从原始信号里层层提炼概念”。
我自己在做浅层策略时试过几组配置,直观感受是:维度一旦压到 128 以下,模型就很容易欠拟合,特别是在图像信息复杂的场景里;维度保持在 512 左右,同时把层数控制在 2 到 4 层,训练曲线和泛化表现都比较稳定。这里的核心逻辑是:浅层模型的每一个参数都要“单兵作战”,你不能让它既没有深度又没有宽度。
| 配置风格 | 层数 | 隐藏维度 | 参数量 | 适用场景 |
|---|---|---|---|---|
| 深层基线 | 12 | 512 | 约 200M | 语义抽象重,但延迟高、部署压力大 |
| Shallow-π 风格 | 2 | 512 | 约 60M | 实时控制、真机部署 |
| 极简对照 | 2 | 256 | 约 20M | 低算力边缘设备 |
3. 实验数据说话:浅层模型在哪类任务上反超深层模型
3.1 在具身操作任务上的实测对比
我和作者交流后,自己也搭了一套对照实验,测了两类任务:一类是单步决策,比如根据 RGB 图像判断抓取点;另一类是连续控制,比如机械臂跟踪一个运动的物体。以下是在桌面级 GPU 上的一组典型趋势数据,注意这里的数值不是某个官方 benchmark 的精确结果,而是我们复现时跑出的相对趋势,它足够说明问题。
| 模型配置 | 原始任务成功率 | 换场景成功率 | 单步推理延迟 |
|---|---|---|---|
| 12 层策略网络 | 88% | 23% | 38ms |
| 8 层策略网络 | 85% | 41% | 25ms |
| 4 层策略网络 | 83% | 62% | 16ms |
| 2 层策略网络 | 81% | 75% | 9ms |
最直观的发现是:随着层数减少,原始任务成功率只是轻微下降,但换场景后的成功率大幅上升,推理延迟也几乎呈线性地降下来了。在机器人领域,换场景成功率恰恰是衡量模型是否真正学到技能的关键指标。一个在训练场景里 88% 成功率、换个环境就只剩 23% 的模型,在实际使用中是完全没有价值的——你不可能要求每个部署现场都长成训练场的样子。
我还注意到一个细节:4 层到 2 层这个区间,换场景成功率还有一次明显跃升(从 62% 到 75%)。这说明在某个阈值以下,模型容量小到“记不住环境”,泛化能力反而出现质变。这个阈值和任务复杂度有关,但方向性是稳定的:深度带来的表示冗余,在具身任务里更倾向于被用来记录表面的场景特征,而非被用来提炼可迁移的动作规律。
3.2 深层模型为什么“记忆环境”而不是“理解任务”
深层 Transformer 的每一层都在做特征再编码,理论上它能记住更多的输入分布细节。但在具身任务里,训练数据往往采集自固定的几个场景,深层网络很容易把背景纹理、光照、相机角度这些“环境指纹”当作决策依据。我在自己项目里也踩过类似的坑:有一次给策略网络换了块桌布,抓取成功率直接腰斩,排查了很久才发现模型居然在“看桌布颜色做动作”,而不是在“看物体位置做动作”。
浅层模型因为容量不够去记忆环境指纹,反而被迫去学真正稳定的因果特征——比如物体边缘和机械臂末端执行器之间的相对几何关系。用统计学习的说法叫“容量受限导致的隐式正则化”,我更喜欢用大白话总结:穷孩子更容易学会抓本质,富孩子容易被各种表面现象带偏。
但这里也要说句公道话:深层模型在数据量极大、场景覆盖极广的训练集上,理论上是可以学到更鲁棒特征的。问题在于具身数据的采集成本极高,大部分团队都不可能覆盖足够多的场景分布。在数据规模受限的现实条件下,浅层模型的“记不住”反而成了一种保护机制。
3.3 延迟和资源占用:机载部署的真实约束
再聊一个更现实的问题:部署。12 层的 Transformer 策略在仿真实验里跑得再好,放到机载平台上就是另一副面孔。我们实测把网络部署到一块 Jetson Orin NX 上,4 层的策略模型推理延迟约 15ms,2 层模型能到 7ms 左右,而 12 层的模型直接超过 40ms。对于 30Hz 到 100Hz 的控制周期来说,40ms 已经占了三分之一以上的时间预算,控制回路根本跑不稳。
为什么延迟这么重要?因为机器人控制不是“算一次就完事”,它是一个闭环:感知当前状态、计算动作、执行、再感知新状态。如果策略推理太慢,机械臂还没执行完上一步动作,新的观测已经到了,整个控制环路就进入一种“永远在追赶”的不稳定状态。浅层模型在这方面的优势是结构性的——它的计算图短,访存需求小,留给控制系统的余量自然就大。
除此之外,机载设备的功耗和散热压力也是实打实的。一个几亿参数的网络每秒钟跑 30 帧,芯片温度根本压不住,对电池续航和硬件寿命都是考验。作者说他们的一个核心原则是“算法要为硬件留出余量”,我太赞同了。很多人做项目只盯着算法指标,等真机联调时才发现算力不够、散热不行、电量撑不住,这时候再回头精简模型,成本就高了。
4. 实操手记:复现 Shallow-π 思路时最容易踩的五个坑
4.1 “直接删层”是新手最容易犯的错误
很多人看完 Shallow-π 的思路,第一反应是把自己现成的 12 层网络删掉 10 层,然后拿原来那套训练配置去跑。结果大概率会发现:模型欠拟合、loss 居高不下、动作输出抖动得厉害。这是因为层数减少之后,模型的“学习方式”变了,但你的训练策略还是旧的。
作者的建议是:层数减少后,学习率要从原来的基础上调低一到两个数量级。原因在于浅层网络的梯度路径短,每个参数收到的梯度信号非常直接,同样大小的学习率下更新幅度会比深层网络更猛,非常容易训飞。同时要适当加大 batch size,让每个 step 的梯度更稳定,弥补参数平均路径变短带来的噪声。数据增强策略也要跟着调整:从追求全场景多样性覆盖,改成时序一致性增强——比如对视觉输入做裁剪或颜色扰动时,必须保证同一时刻其他模态信息保持不变,否则容易打乱观测和动作之间的对齐关系。
4.2 Token 拼接时的量纲陷阱
这个坑我印象太深了,因为它是让我整整浪费了两天的元凶。最早我把关节角度、关节速度、图像 patch 直接拼进序列,训练第一个 epoch 就发现 loss 在往上飙,再往下跑直接出了 NaN。排查了很久才发现原因很简单:关节速度的数值可能是角度的几十倍,在注意力 softmax 的计算里,这些大数值 token 直接把其他位置的注意力权重全部压没了,模型等于是瞎的。
解决办法是每个模态先过 RMSNorm,再做 per-token 维度对齐。本质就一句话:别让大数字欺负小数字。另外,历史动作 token 也一定要做同样的处理,因为动作幅度在不同阶段可能差异很大,尤其是学习初期策略还在乱试的时候,动作值域会剧烈变化,不做归一化基本训不出来。
提示:多模态 token 拼接,量纲不统一是头号杀手。任何模态进入注意力之前,先做归一化和维度对齐,否则后期排查的代价远高于一开始多写这两行代码。
4.3 位置编码:绝对位置在连续时间流里不一定能用
语言模型用绝对位置编码没问题,因为句子里词的位置是离散且固定的。但机器人控制是一个连续时间流,策略网络面对的是“当前帧和上一帧之间隔了多久、当前帧在时间窗口里的什么位置”这类连续尺度的信息。
用绝对位置编码会有一个隐患:训练时见过的位置索引范围是固定的,测试时只要序列长度稍微变化,位置编码的分布就和训练时对不上了,模型性能直接下滑。如果你用的是 10 帧的时间窗口,作者的建议是直接用可学习的相对位置偏置,或者干脆让时间信息通过历史动作 token 隐式传递。层数本来就不多,别让模型再去消化一套复杂的位置编码语义,能简则简。
4.4 训练稳定性:浅层网络更容易“训飞”
浅层模型的梯度路径短,每个参数收到的梯度信号更直接,这既是优点也是缺点。缺点在于,它更容易因为单个 batch 的噪声出现剧烈更新。我试过不加梯度裁剪,训练中途 loss 从 0.3 突然跳到 5,之后再也回不到正常水平,整个训练白跑。
后期我按作者建议加了三件套:梯度裁剪(max norm 设 1.0)、权重 EMA、标签平滑。其中权重 EMA 的效果最明显,它相当于给模型参数做了一层低通滤波,把高频抖动抹平了。用过之后训练曲线肉眼可见地稳定下来。另外,浅层模型对初始化也敏感,建议用固定随机种子多试几组初始值,挑一个训练最稳的作为基线。
4.5 量化部署:INT8 对浅层模型伤害更大
到了部署环节,又有一个反直觉的现象:浅层模型因为容量小,对量化的敏感度反而比深层模型高。我们在 Jetson 上试过全 INT8 量化,12 层模型性能大概掉 2%,2 层模型直接掉了 15% 以上。原因也好理解:深层模型参数多,量化误差在各层之间有互相稀释和抵消的空间;浅层模型每一层的每一个参数都身负重责,容错率极低,一点精度损失都会被放大到最终动作输出上。
实操建议是改用混合精度推理:注意力层和最后输出层保留 FP16,其余部分可以走 INT8;如果用的 TensorRT,还可以做逐层精度校准。实测这样配置,精度损失基本能控制在 3% 以内,同时延迟优势仍然保留。总结一句话:浅层模型在量化时,精度敏感层一定要单独保护起来。
5. 后续可以怎么玩:浅层化思路的延展方向
5.1 把大模型蒸馏成浅层策略
很多人听到 Shallow-π 后都会问一个问题:那大语言模型的知识不要了吗?作者的看法很务实——要,但不能让它直接跑在真机上。合理的路径是先在仿真里让大模型做“老师”,产出一批高质量专家轨迹,再用这些轨迹去蒸馏一个浅层策略网络。大模型在离线状态下负责“想清楚”,浅层网络在真机上负责“快执行”。
过去蒸馏出来的策略网络要么太大、上不了真机,要么精度损耗大、动作质量差得没法用。把“Shallow”这一原则引入蒸馏目标,相当于给蒸馏过程加了一个形态约束:你不仅要让模型的输出行为贴近老师,还要让模型的结构贴近部署需求。这个方向我认为是接下去两三年里具身智能落地最现实的一条路。
5.2 实时控制之外:还有哪些场景可以借鉴
浅层化的思路当然不止适用于机械臂。无人机避障、自动驾驶的底层控制、灵巧手操作,这些场景全都被实时性和硬件资源限制得死死的。凡是“从连续观测到连续动作”的任务,都可以从 Shallow-π 里借用“少层数、宽维度、强对齐”的设计原则。
作者还聊到一个没有完全解决的开放问题:层数到底怎么自动确定?目前他主要靠任务复杂度手工调,但理论上可以把它定义成一个带约束的超参搜索问题,用延迟预算和泛化指标做联合优化。这个话题我觉得特别值得跟进,因为手工调层数这件事,终归只是从经验到经验的技巧,还缺少一个系统性的决策框架。
聊到最后我问作者,如果只能带走一条经验,他希望别人记住什么?他想了想说:不要因为大家都在堆层数,就觉得层数是免费的午餐。在具身场景里,每一层延迟、每一兆参数,最终都是真机来买单的。我复现完这一圈,对这句话特别有共鸣——删层不是退步,而是重新想清楚,这个任务真正需要的表示深度到底是多少。