Soma Zero Tutorials
🔍 搜索功能尚未开启,敬请期待。

5.3 数学原理:从深度学习到 VLA

5.2 是"从外面看"——把各路模型按时间和路线摆成一张谱系图。这一节是"掀开盖子从里面看":把同一条发展线,从最基础的深度学习开始,一步步用数学讲清楚,一直讲到扩散、流匹配,再到最新的 VLA。

写法约定(和全书一致):每个概念先用一句大白话讲直觉,再把核心公式逐一列出并逐项解释;推导只走最要害的几步,不堆满整页。看到公式不用怕——每条公式旁边都有人话翻译。


5.3.0 导读 · 一条主线

在钻进公式之前,先把"深度学习到底在干嘛"这件事讲清楚。一个深度学习模型,本质就是一个由大量参数组成的巨大函数。参数分两种:权重 W 规定"输入里每一项各占多大分量、怎样被加权组合成下一层的值",偏置 b 再给这个组合加一个平移量;网络就是靠这一层层"加权组合 + 平移",把输入一步步算成输出。一个现代模型动辄有几百万到上千亿个参数,它们一开始是随机值,模型什么都不会;训练就是拿数据反复调整这些参数的取值,让函数的输出越来越接近我们想要的答案。训练好之后,这个函数就能把输入(一张图、一句话、一帧画面)映射到我们想要的输出(类别、文字、动作)。

打个比方帮助记忆:这就像一台装了千百万个旋钮的机器,每个旋钮对应一个参数,训练就是根据数据一点点把每个旋钮拧到合适的位置。

这一节要讲的所有东西,其实围着一条主线在转:深度学习的故事,是从"只能预测一个数"一步步走到"能生成一整套动作"。 把这条主线拆成三幕:

  • 第一幕 · 判别 / 回归(predict):最早的神经网络做的是"给一张图,吐一个答案"——这是猫还是狗(分类)、这套房多少钱(回归)。它学的是"输入 → 一个确定答案"的映射,数学上叫学条件分布 p(答案 | 输入) 里那个"最可能的答案"。语音识别、人脸识别、自动驾驶的感知,大多是这一幕。
  • 第二幕 · 生成(generate):但机器人面对的世界是"多种做法都对"的(往左绕、往右绕都能到),硬让网络吐一个"平均答案"就会出事(5.3.3 会用数学讲明白这个坑)。于是要换成生成模型——它不直接吐答案,而是学会"所有合理答案长什么样",用的时候从中采样出一个完整、自洽的方案。画图 AI、ChatGPT、以及机器人的动作生成,都是这一幕。
  • 第三幕 · 装进机器人(act)扩散(diffusion)流匹配(flow matching)是当今最好用的两种生成模型内核;把它们接到机械臂上、用来生成动作,就是 Diffusion Policy;再把它装进一个"既懂图又懂话"的大模型里,就是 VLA(代表作 π0)
本章脉络:从判别到生成,再到 VLA
图 5.3.0 本章脉络:地基 → Transformer → 判别转生成 → 扩散 → 流匹配 → 机器人策略 → VLA

这七个方框,每一个都是后一个的地基:不懂前向/反向传播,就看不懂 Transformer 怎么训;不懂 Transformer,就看不懂 VLA 的主干;不懂扩散,就看不懂流匹配;不懂流匹配,"π0 是流匹配旗舰"就永远是一句口号。所以这一节我们一层一层往上盖,每盖一层都确保你真懂了再往上。

📐 前置知识(不用怕,够用就行):你只需要知道——向量是一串数(比如一个动作可以写成 7 个关节角组成的向量);矩阵是一张数表,"矩阵乘向量"就是把输入线性地揉成新的一串数;导数 / 梯度是"往哪个方向走,函数值变大最快"(梯度的反方向就是"下山最快"的方向);概率分布是"每种可能各占多大比重"。这四样会一点,本节就能读下来。每条公式我都会配一句人话翻译。

怎么读这一节:建议从头顺着读,不要跳。每个大节内部都是"先讲它要解决什么问题 → 给直觉 → 上公式并逐项拆解 → 小结它留下什么、引出下一节"。读到公式卡住时,先看公式后面的中文翻译,再回头看符号,往往就通了。


5.3.1 深度学习地基:前向、反向、优化

一切的起点是一个最朴素的问题:怎么让一个函数从数据里"学"出来? 先把训练的设定摆清楚:我们手里有一堆成对的例子(输入 x,正确答案 y)——比如几千张图配上"猫/狗"标签,或者几百条遥操作示范配上"当时机械臂的动作"。我们要找一组参数,让网络对这些 x 算出的预测尽量接近 y。整个过程就三步循环:

  1. 前向传播:把 x 送进网络,一层层算出预测 ŷ。
  2. 算损失:用一个"打分函数"量出 ŷ 离真值 y 差多少,得到一个数 L。
  3. 反向传播 + 优化:算出"每个参数往哪调能让 L 变小"(梯度),再让优化器照着微调一小步。

这三步重复成千上万次,损失越来越小,网络就"学会"了。下面逐步拆开。

MLP 的前向传播与反向传播
图 5.3.1 前向(蓝实线)逐层算预测;反向(红虚线)逐层回传梯度

1. 神经元与前向传播

最小的计算单元是一个神经元:它把若干输入加权求和、加一个偏置,再过一个非线性函数。把很多神经元并排成一层、再把多层串起来,就是多层感知机(MLP,multi-layer perceptron),也叫全连接网络。前向传播就是从输入一层层往右算到输出,单层就两步——先线性加权求和、再过激活:

$$z = Wx + b, \qquad a = \sigma(z)$$

其中 $x$ 是这一层的输入、$W$ 是权重矩阵、$b$ 是偏置向量,$\sigma$ 是逐元素作用的激活函数。多层就是把这两步反复套:第 $l$ 层的输出 $a^l = \sigma(W^l a^{l-1} + b^l)$,其中 $a^0$ 就是原始输入、最后一层的 $a^L$ 就是预测 $\hat y$。整个网络要学的,就是每一层的 $W$ 和 $b$。(一句几何直觉:$Wx+b$ 相当于在空间里画了一道分界面,$W$ 定它的朝向、$b$ 定它平移多少,激活再决定"越过这道面之后怎么反应"。)

一个极小的数值例子帮你把符号落地:取输入 $x=(1,2)$,某层把它从 2 维映射到 3 维,算得 $z=(1,\;2,\;1{+}2{-}1)=(1,2,2)$,再过 ReLU 得 $a=\mathrm{ReLU}(z)=(1,2,2)$。换句话说,矩阵乘法负责"把输入重新线性组合成新的一串数",激活负责"掰弯"。

2. 激活函数:为什么非要"掰弯"

先回答一个关键问题:没有激活函数会怎样? 答案是——多层会塌缩成一层。因为线性套线性还是线性:$W_2(W_1 x) = (W_2 W_1)x$,叠一百层也等价于一个矩阵,画不出任何弯曲的分界面。正是激活函数的非线性,才让深层网络能逼近任意复杂的函数。 常见几种:

  • ReLU:$\mathrm{ReLU}(z)=\max(0, z)$。负的全压成 0,正的原样通过。又快又好用,是卷积网络的默认。缺点是某些神经元可能"死掉"(一直落在负区间,梯度恒为 0)。
  • GELU:$\mathrm{GELU}(x) = x\,\Phi(x)$($\Phi$ 是标准正态的累积分布函数,常用近似 $\mathrm{GELU}(x)\approx x\,\sigma(1.702x)$)。可以理解成"软版 ReLU"——不是硬生生砍到 0,而是按"这个值有多大概率该保留"平滑地缩放。Transformer / 大模型基本都用它,因为它处处可导、负区间也有微弱梯度,深层更好训。
  • Sigmoid $\sigma(z)=1/(1+e^{-z})$ 把数压到 $(0,1)$、Tanh 压到 $(-1,1)$。它俩在两端会"饱和"(曲线压平、斜率趋近 0),深层里容易梯度消失(误差传不回去),所以现在主要用在需要"输出当概率/开关"的特定位置,而不是当主力激活。

3. 损失函数:把"错了多少"变成一个数

损失(loss)是一个数,衡量预测离真值有多远。训练就是想办法把它变小。两类经典对应两类任务——回归用均方误差(MSE),分类用交叉熵(CE)

$$\text{MSE:}\quad L=\frac{1}{N}\sum_i (y_i-\hat y_i)^2 \qquad\qquad \text{CE:}\quad L=-\sum_i y_i\log(\hat y_i)$$

MSE 为什么是平方? 平方让"差得越远、罚得越狠",且处处可导好优化。这里有个对后文极其重要的性质:如果同一个输入对应着好几个不同的正确答案,MSE 的最优解是把这些答案求平均。 道理一行:要让 $\sum_i (y_i-\hat y)^2$ 最小,对 $\hat y$ 求导置零,得 $\hat y=\frac1N\sum_i y_i$,正是平均值。请记牢这条——5.3.3 会用它解释机器人为什么不能用朴素回归。

交叉熵衡量"两个概率分布有多不像"。分类时真值 $y$ 是一个 one-hot 向量(正确类是 1、其余是 0),预测 $\hat y$ 是一组概率,由 softmax 把网络打分(logits)$z$ 归一化而来:$\mathrm{softmax}(z)_i = e^{z_i}\big/\sum_j e^{z_j}$。直觉上交叉熵就是"对正确类给的概率越低、越吃惊、罚得越重"。还有个很漂亮、值得记住的结论:softmax + 交叉熵配在一起时,损失对打分的梯度会塌缩成极简形式 $\partial L/\partial z = \hat y - y$(预测减真值)——这正是它俩总是成对出现、且数值稳定的原因。

4. 反向传播:把"错误"反着传回去

知道错多少之后,得知道每个参数该往哪调。直接对几百万个参数挨个数值试错是不可能的;反向传播(backpropagation)用一招把所有梯度一次性算出来——它本质就是链式法则(复合函数求导:外层导数 × 内层导数)在每相邻两层之间反复应用,并且复用中间结果,所以只需"前向一遍 + 反向一遍"就够,不必每个参数重算。

核心是一个"误差信号" $\delta$(读作 delta),定义为损失对某层线性输出 $z$ 的梯度。它从输出层往输入层逐层倒推,四条公式就够($\odot$ 表示逐元素相乘、$(\cdot)^\top$ 表示转置):

  • ① 输出层误差:$\delta^L = \nabla_a L \odot \sigma'(z^L)$
  • ② 逐层往回传:$\delta^l = \big((W^{l+1})^\top \delta^{l+1}\big)\odot \sigma'(z^l)$
  • ③ 权重的梯度:$\partial L/\partial W^l = \delta^l (a^{l-1})^\top$
  • ④ 偏置的梯度:$\partial L/\partial b^l = \delta^l$

逐条读懂它: 在最后一层,误差 = "损失对预测的梯度" 乘以 "激活的斜率"(softmax+CE 时会直接化简成 $\hat y - y$)。 往回一层时,误差要先穿过下一层的权重(用转置 $W^\top$ 把它"按原路送回来"),再被本层激活的斜率 $\sigma'$ 调制——斜率接近 0 的地方(如 sigmoid 饱和区)误差就传不过去,这就是"梯度消失"的来源。 一旦有了某层的 $\delta$,这层权重该改多少,就等于"误差"和"这层收到的输入"的外积。 偏置相当于输入恒为 1 的权重,所以梯度就是 $\delta$ 本身。

一句话翻译整张图 5.3.1:前向把数据往右推、算出预测;反向把"错误"往左推、顺路算出每个权重该改多少。 同一组连接,正着走一遍、反着走一遍。(一个常被忽略的细节:当一个量同时影响多条下游路径时,要把各路梯度加起来——上面的矩阵乘法已经自动替你做了这件事。)

5. 优化:拿到梯度后怎么迈步

梯度告诉你"往哪个方向改能让损失更小",优化器决定"迈多大一步、怎么迈"。从简单到现代:

  • 随机梯度下降 SGD:$\theta \leftarrow \theta - \eta\,\nabla L$,其中 $\eta$ 是学习率(步长)。
  • 动量 Momentum:$v \leftarrow \mu\,v + \nabla L,\quad \theta \leftarrow \theta - \eta\,v$。累积惯性,少走冤枉路、不乱抖。
  • Adam(现代默认):先攒梯度的一阶矩 $m$(方向)和二阶矩 $v$(幅度),各做偏差校正,再给每个参数定自适应步长——

$$m \leftarrow \beta_1 m + (1-\beta_1)\,g,\qquad v \leftarrow \beta_2 v + (1-\beta_2)\,g^2$$

$$\hat m = \frac{m}{1-\beta_1^{\,t}},\qquad \hat v = \frac{v}{1-\beta_2^{\,t}},\qquad \theta \leftarrow \theta - \eta\,\frac{\hat m}{\sqrt{\hat v}+\epsilon}$$

逐个理解:学习率 $\eta$ 是最关键的超参——太大就在山谷两壁来回弹甚至发散,太小就半天挪不动。SGD 每步只用一小批数据估梯度,所以方向是带噪声的,但这点噪声反而帮它跳出浅坑。Adam 给每个参数单独定步长:某个方向最近梯度一直很大很抖($\hat v$ 大),就把步子放小;一直平稳($\hat v$ 小),就放心迈大步。偏差校正是因为 $m,v$ 从 0 起步、开头偏小,除以 $1-\beta^{\,t}$ 纠正回来。常用默认 $\beta_1=0.9,\ \beta_2=0.999,\ \epsilon=10^{-8}$(注意 $\epsilon$ 在根号)。(打个比方:整个过程就像在一片高低起伏的山地里下山,梯度的反方向是当前最陡的下坡,动量是给你加了惯性、Adam 是按每个方向的"路况"自动调步幅。)

再加一个现代标配:AdamW权重衰减(每步把参数稍微往 0 拉一点,防止权重过大、抑制过拟合)从梯度里解耦出来、单独作用在参数上 $\theta \leftarrow \theta - \eta\lambda\theta$,比把它混进梯度更干净。配套常用学习率预热 + 衰减(warmup:开头几千步把 $\eta$ 从很小慢慢升上去,避免一开始就把刚初始化的网络冲乱,之后再缓慢降下来)。训练 Transformer、扩散、VLA 用的几乎都是 AdamW + warmup。

6. 训练循环与正则化

把上面串成一个循环:每次取一小批数据(minibatch,batch)→ 前向算损失 → 反向算梯度 → 优化器更新参数。常用术语:走完一个 batch 叫一次迭代(iteration),把整个数据集过一遍叫一个 epoch,通常要跑很多个 epoch。数据一般切成训练集 / 验证集 / 测试集三份——训练集用来拧参数,验证集用来盯有没有学跑偏、调超参,测试集留到最后一次性估真实水平。

训练里最常见的敌人是过拟合:网络把训练集的细节甚至噪声都背下来,结果"训练集越来越好、验证集反而变差"。对付它的几招(统称正则化):

  • Dropout:训练时随机把一部分神经元临时"关掉"(置 0),逼网络不要过度依赖某几个神经元;相当于在训练许多个子网络再平均,测试时全部打开。
  • 权重衰减:见上面的 AdamW,惩罚过大的权重。
  • 早停(early stopping):盯着验证集损失,一旦不再下降就停,别再硬训。
  • 归一化层:把每层的数值拉回一个稳定范围,训练更快更稳。这里有个对下一节很重要的区别——

LayerNorm vs BatchNorm(一句话讲清差别):两者都做"减均值、除标准差、再缩放平移",唯一不同是沿哪个方向统计。BatchNorm 是"对一批样本里的同一个特征"统计(依赖批大小、依赖同批别的样本);LayerNorm 是"对单个样本自己的所有特征"统计(不管批多大、不看别人)。Transformer 用 LayerNorm,因为序列长度不一、要补零(padding),还常常一次只处理一个样本——LayerNorm 对这些都免疫,BatchNorm 会被批大小和补零干扰。记住这点,下一节讲 Transformer 的 Add & Norm 时就顺理成章了。


5.3.2 Transformer 与注意力

有了地基,就能搭今天一切大模型的骨架——Transformer(2017 年 Google 论文《Attention Is All You Need》提出)。它的核心只有一个机制——自注意力(self-attention)。不过在直接抛公式之前,先花点篇幅讲清楚它是怎么一步步被"逼"出来的:注意力不是凭空蹦出来的,它是二十多年"问题 → 解法 → 新问题"链条的终点。把这条线走一遍,后面 Q、K、V 那套公式就不会显得突兀。

1. 一段发展史:注意力是怎么被"逼"出来的

把"让机器读懂、生成语言"这件事的历程,拆成几步看,每一步都解决了上一步的痛点、又留下新麻烦:

  • ① n-gram 统计模型(上世纪):用"前几个词预测下一个词"的概率给句子打分。它第一次让语言可统计,但有三个硬伤——看不了长距离(只盯前两三个词)、数据稀疏(长组合在语料里没出现过就概率为零)、不懂词与词相似(每个词是孤立符号,"猫在叫"学到的东西帮不了"狗在叫")。
  • ② 词向量(2013–2014):word2vec(Mikolov 等 2013)、GloVe(Pennington 等 2014)把每个词表示成一个稠密向量,"意义"第一次变成几何空间里的位置——相似的词向量相近,甚至能做"国王 − 男人 + 女人 ≈ 王后"这种类比。它治好了 n-gram 的"不懂相似",但词向量只描述单个词,不处理整句的序列
  • ③ RNN / LSTM(1997, 2014):循环网络从左到右逐词读,用一个滚动的"隐藏状态"把读过的内容带下去;LSTM(Hochreiter & Schmidhuber 1997)用门控让长信息少丢些。它能读变长序列了,但留下两个致命问题——必须顺序算、没法并行(慢),以及梯度消失、长距离依赖仍吃力
  • ④ seq2seq 编码器-解码器(2014)+ 那个瓶颈:Sutskever 等、Cho 等 2014 提出"编码器把整句源语言压成一个固定向量、解码器再从这个向量生成译文",第一次端到端做机器翻译。但瓶颈很致命——无论源句多长,都被硬塞进同一个固定大小的向量,句子一长,解码器写后半句时往往已"忘了"开头。Bahdanau 等 2014 明确点名这就是"性能提升的瓶颈"。

注意力(attention)就是为砸开这个瓶颈而生的。 Bahdanau、Cho、Bengio 在 2014 年提出:别再把源句压成一个向量,而是让解码器在生成每一个词时,回头去"软搜索"源句里相关的部分——给源句每个位置算一个权重、做加权求和。这个权重就是"软对齐"(soft alignment):不是非此即彼的硬选择,而是一片平滑、可微、能被反向传播一起训练的权重分布。它的打分函数是加性(additive)的,$\mathrm{score}(s,h)=v^\top\tanh\!\big(W[s;h]\big)$(把查询 $s$ 和被查项 $h$ 拼起来过一个小网络)。一年后 Luong 等 2015 把打分换成更省更快的点积(dot-product)形式 $\mathrm{score}(s,h)=s^\top h$——这正是后来"缩放点积注意力"的直系祖先。

再往后(2016–2017),有人让序列对自己做注意力(自注意力 / intra-attention,如 Cheng 等 2016、Parikh 等 2016),不再需要两段不同的序列。2017 年的 Transformer 走了最激进的一步——干脆把 RNN 整个扔掉,整个模型只用(自)注意力搭起来,这就是标题"Attention Is All You Need"的由来。一句话串起全链条:n-gram(不懂相似)→ 词向量(意义=向量)→ RNN(能读序列但慢、长程难)→ seq2seq(端到端但固定向量瓶颈)→ 注意力(软对齐砸开瓶颈)→ 自注意力(序列对自己)→ Transformer(注意力就是全部)。

2. 自注意力:把每个词拆成 Q、K、V 三个角色

自注意力要做的事,一句话:让序列里每个位置,根据"自己和其它位置有多相关",从所有位置身上按比例取信息、汇总到自己身上。 难点在于,每个词在这件事里要同时扮演三个不同的角色——

  • 作为提问方:"我现在想找什么样的信息?"
  • 作为被检索方的标签:"我这个词,是凭什么特征被别人匹配到的?"
  • 作为内容载荷:"如果我被选中了,实际要交付什么内容?"

最朴素的做法是直接拿词向量两两算相似度、加权求和——但那等于逼同一个向量同时干这三件事,太死板。Transformer 的关键一步,就是把这三个角色拆开,各用一个可学的线性投影生成一份专门的向量,按顺序就是:

  • Q(Query,查询) $=XW_Q$:代表"我在找什么",由提问的那个位置发出。
  • K(Key,键) $=XW_K$:代表"我拿什么标签供别人匹配",相当于每个词的索引
  • V(Value,值) $=XW_V$:代表"被选中后我实际交付的内容",是真正流动的载荷。

为什么非要三个独立矩阵、而不是一个?因为"我要找什么""我用什么被找到""我交付什么"是同一个词的三种不同功能,各给一套投影才能解耦、各自学到最合适的表示。(这也不是铁律——后来的 Multi-Query / Grouped-Query Attention 就让多个头共享 K、V 来省显存,说明三者可以部分合并。)

这套"Q 去匹配 K、再取出 V"的思路,本质是一次"软字典查询":硬字典是"拿钥匙精确匹配、取出唯一对应的值";注意力把它软化、可微——拿 Q 跟所有 K 算相似度,再取出所有 V 按相似度的加权混合;当权重塌缩成"只命中一个"时,就退化回普通字典查询。这个"键-值分离 + 按内容寻址"的想法,在 Transformer 之前的记忆网络里就有了——神经图灵机(Graves 等 2014)用"键"按相似度寻址外部记忆,键值记忆网络(Miller 等 2016)更是明确把记忆拆成"用于匹配的 Key"和"用于返回的 Value"。Transformer 的新意,是把这套"外部记忆查询"变成序列对自己的内部查询,且 Q、K、V 全是同一份输入的三种投影。

把三者凑齐,自注意力的核心公式只有一行(原论文称缩放点积注意力):

$$\mathrm{Attention}(Q,K,V) = \mathrm{softmax}\!\left(\frac{QK^\top}{\sqrt{d_k}}\right)V$$

逐项拆开:

  • $QK^\top$:每个位置的 Q 和每个位置的 K 两两做点积,得到一张 $n\times n$ 的相似度打分表(第 $i$ 行第 $j$ 列 = 位置 $i$ 对位置 $j$ 的关注分)。点积越大、两者越"对味"。
  • 除以 $\sqrt{d_k}$(缩放):这一步常被略过,但很关键。如果 Q、K 的每个分量都是均值 0、方差 1 的随机数,它们点积($d_k$ 项相加)的方差大约等于维度 $d_k$,维度越高、点积数值越容易变得很大。数值一大,softmax 就被推进"饱和区"——几乎把全部权重压到一个位置上、其余趋近 0,梯度也随之消失、没法训练。除以 $\sqrt{d_k}$ 正好把方差拉回 1,让 softmax 待在好训练的区间。
  • $\mathrm{softmax}$:把每一行的打分变成加权比例(非负、每行加起来等于 1),这就是"注意力权重"。
  • 乘 $V$:用这组权重去加权汇总所有位置的 V,得到每个位置的新表示——它已经"吸收"了与自己相关的其它位置的信息。

打个比方:这就像一次图书馆检索——拿你的查询 Q 去比对每本书的标签 K,越相关的书、它的内容 V 就被取得越多,最后按相关度把内容混合成"这次检索的结果"。序列里每个位置都并行地做一次这样的检索。

掩码(mask):在"逐词生成"的场景里,第 $i$ 个位置不能偷看它后面(未来)的词,否则训练时等于抄答案。做法是在 softmax 之前把"未来位置"的打分设成 $-\infty$,softmax 之后它们的权重就变成 0。这叫因果掩码(causal mask),是 decoder-only(第 5 小节)和 VLA 的关键。

3. 多头注意力

一组 Q/K/V 只能学一种"关注方式"(比如只盯语法关系)。多头注意力就是并行跑 $h$ 组、每组看一种不同的关系(有的盯语法、有的盯指代、有的盯位置远近),各自在一个较低维的子空间里做注意力,最后把 $h$ 个头的结果拼接起来、再用一个矩阵投影回原维度:

$$\mathrm{MultiHead} = \mathrm{Concat}(\mathrm{head}_1,\dots,\mathrm{head}_h)\,W^O,\qquad \mathrm{head}_i = \mathrm{Attention}(QW_i^Q,\,KW_i^K,\,VW_i^V)$$

原始论文用 $d_{\text{model}}=512,\ h=8,\ d_k=d_v=64$(即 $512/8$)。因为每个头维度小,$h$ 个头合起来的算力和"一个全维度的头"差不多,但能同时从多个角度看序列,表达力强很多。顺带提一句复杂度:自注意力要算 $n\times n$ 的打分表,所以计算量随序列长度 $n$ 平方增长($O(n^2)$)——这也是为什么"超长上下文"一直是大模型的工程难点。

4. 完整框架:编码器 / 解码器

把两种子层——多头注意力(负责"位置之间互通信息")和前馈网络 FFN(负责"逐个位置各自深加工")——交替堆叠,每个子层都套一层残差 + 归一化(Add & Norm):

$$\mathrm{LayerNorm}\big(x + \mathrm{Sublayer}(x)\big)$$

这里的 $x + \mathrm{Sublayer}(x)$(把子层的输入直接加到它的输出上)是残差连接:它给梯度修了一条"高速公路"——反向传播时梯度能沿着这条恒等通路无损地穿过几十层,否则深层网络根本训不动(这正是 5.3.1 说的梯度消失问题在深层的解药)。外面再套 LayerNorm(5.3.1 讲过为什么用它)把数值拉稳。把这套结构重复 $N$ 次(原论文 $N=6$),就是著名的那张框架图:

Transformer 原始框架(Attention Is All You Need)
图 5.3.2 Transformer 原始框架:左编码器、右解码器,每个子层都套 Add & Norm 残差

原始结构分两半:编码器(左,双向,把整句"读懂"成一组表示)和解码器(右,单向,逐词生成输出),中间用一道交叉注意力把编码器的理解送进解码器(解码器出 Q,编码器供 K、V)。围绕这张图,还有几个必须知道的零件:

  • 词嵌入(embedding):先把离散的词/符号查表变成一个稠密向量,网络才好处理。图最底部的 Input/Output Embedding 就是这一步。
  • 位置编码:自注意力把序列当成一个"集合",本身不分先后顺序(打乱词序结果不变),所以必须额外注入"谁在第几位"。原始用正弦式 $\mathrm{PE}(pos,2i)=\sin\!\big(pos/10000^{2i/d}\big)$(不同维度用不同频率的正余弦波编码位置,还能外推到训练时没见过的长度);现代大模型多改用 RoPE(旋转式位置编码:把 Q、K 按位置旋转一个角度,使注意力分数只依赖两个词的相对距离,长序列上更稳)。
  • 前馈网络 FFN:$\mathrm{FFN}(x)=\max(0,\,xW_1+b_1)W_2+b_2$,对每个位置独立地做一次"升维 → 非线性 → 降维"(原论文内层 2048、是 512 的 4 倍)。直觉上,注意力负责"在位置之间搬运信息",FFN 负责"在每个位置上深加工、存知识"。现代变体把里头的 ReLU 换成 GELU / SwiGLU。

(一个常见误区,顺带点破:原始论文的框架图画的是 Post-Norm(先加残差、再归一化),但实际开源代码和几乎所有现代模型都用 Pre-Norm(先归一化、再进子层 $x + \mathrm{Sublayer}(\mathrm{LayerNorm}(x))$),因为它让残差那条"高速公路"保持干净、深层训练更稳。此外现代改动还有 RoPE 取代正弦、SwiGLU 取代 ReLU 等。图 5.3.2 右侧注释把这些都列了。)

5. 三种家族:什么是 decoder-only(VLA 的主干)

原始 Transformer 是"编码器 + 解码器"的完整体,但后来的模型按用途分化成三大家族,区别只在用哪部分、注意力怎么遮

  • 仅编码器(encoder-only,代表 BERT,2018):只保留编码器,注意力双向(每个词能看左右全句、无因果掩码),训练任务是"完形填空"(随机遮住一些词让它还原,叫掩码语言建模 MLM)。它擅长理解(分类、检索、命名实体识别),但因为双向、没有"逐词往下写"的回路,不能自然地生成文本
  • 仅解码器(decoder-only,代表 GPT 系列):只保留解码器那一摞,注意力是因果掩码的(每个词只能看自己和前面的词),训练任务是"预测下一个词"(自回归语言建模)。它擅长生成,是今天几乎所有大语言模型的形态。
  • 编码器-解码器(encoder-decoder,代表原始 Transformer、T5):编码器双向读输入、解码器自回归生成、中间用交叉注意力相连。擅长转换类任务(翻译、摘要)。

那"decoder-only"在结构上到底删掉了什么? 回看图 5.3.2:原版解码器块有三个子层(掩码自注意力 + 交叉注意力 + FFN)。decoder-only 既然没有编码器,交叉注意力就无的可看、被整个拿掉,于是每个块只剩两个子层——因果掩码的多头自注意力 + 前馈网络(各自仍包在残差 + 归一化里)。说白了:decoder-only = 把图 5.3.2 的右半边留下、删掉那条连向左边的交叉注意力。

为什么大模型几乎都收敛到 decoder-only? 主要是经验和工程上的几条(注意:这是经验主导,并非已被证明的定理,编码器-解码器在某些设定下也能打平):① 一个"预测下一个词"的目标就能统一几乎所有任务——任何任务都能写成"把答案当成后续文字生成出来",于是不用为每个任务单独设计输出头,还自然涌现出"给几个例子就会做"的上下文学习能力;② 结构简单同构、好往大里堆;③ 生成时能用 KV-cache 复用历史、逐词推理更省。

这就接回了 VLA。 一个 VLA 要做的,是"看着图像 + 语言指令,往下生成一段动作"——这本质就是 decoder-only 模型最擅长的"续写"。所以最早几代 VLA(RT-2、OpenVLA)直接拿一个预训练的 decoder-only 视觉-语言大模型当主干,把机器人动作离散成 token,像续写文字一样把动作 token 一个个自回归地吐出来。⚠️ 但要补一句精确的:到了 π0 这一代,主干仍是 decoder-only,末端却不再用"自回归吐动作 token",而是换成流匹配的"动作专家"来直接生成连续动作(5.3.7 会细讲)——这正是"VLA 把动作头从离散自回归升级成流匹配"的那一跳。

📖 拓展阅读 · 归纳偏置(inductive bias)与 AGI

归纳偏置=一个架构"出厂自带的先验假设",它限定了模型默认认为数据该长什么样:CNN 假设"邻近像素才相关 + 平移不变",RNN 假设"时间有先后",都是偏置。Transformer 的偏置极弱——几乎只假设"把输入当成无序集合、按内容算两两关系",连顺序、局部性都得靠位置编码和数据自己补回来。

这让它更接近 AGI 吗?比较稳妥的看法是"是,但不充分":

  • :弱偏置="让数据说话",正是"苦涩的教训"(The Bitter Lesson, Sutton)偏爱的形态——通用、能跨模态(文字/图像/动作都同一套)、随算力与数据持续变强。它是当前大模型浪潮的底座,也是"同一个架构通吃一切"的根本原因。
  • :弱偏置=吃数据、吃算力(注意力是 $O(n^2)$),且在严谨推理、组合/分布外泛化上偏弱;而人脑自带很强的先验(物体、空间、因果),却能从极少样本学会——这暗示真正的 AGI 可能仍需要"某些正确的结构先验",而"弱"不等于"对"。

一句话:弱归纳偏置很可能是通用智能的必要底座,但不是充分条件。更现实的路径是"通用 Transformer 底座 + 有选择地把先验重新注回去"(记忆、世界模型、工具使用、具身接地)——这跟 5.2 那个螺旋回归(学习派做到极致后,FALCON 又把 3D 几何先验注回 VLA)其实是同一个道理。


5.3.3 从判别到生成:为什么非要生成模型

到这里,网络已经很能"预测一个答案"了。但机器人一上场,这套就不够用了——这是全章的转折点,值得讲透。

1. 判别式 vs 生成式:两种根本不同的目标

先把两类模型的"世界观"分清楚:

  • 判别式(discriminative):学的是"输入 → 答案"的映射,目标是给定输入、挑出最可能的那一个答案(数学上是学条件分布 $p(y\mid x)$ 的众数/均值)。分类、回归、目标检测都是这类。它默认"答案基本唯一"。
  • 生成式(generative):学的是"合理的样本整体长什么样"这一整片分布 $p(x)$ 或 $p(x\mid c)$($c$ 是条件,比如当前画面),然后能从中采样出新的、自洽的样本。画图、写文章、生成动作都是这类。它天生能容纳"答案不止一个"。

机器人的动作恰恰是"答案不止一个"的典型,所以必须从判别式转向生成式。原因是一个绕不开的事实:同一个画面,正确的动作往往不止一个。

多峰动作分布与取平均的失败
图 5.3.3 往左绕、往右绕都对;MSE 回归学的是平均,落进谷底反而撞上障碍

2. 多峰难题:为什么"取平均"会撞墙

回忆 5.3.1 那个结论:MSE 回归的最优解,是把所有正确答案求平均。 现在把它放到机器人场景:面前有个障碍,人类示范里"往左绕"和"往右绕"都出现过、都对。一个用 MSE 训练的判别式网络,会努力去同时接近这两条示范——而最接近两者的那个解,就是它俩的中点,一条直直撞上障碍的废动作(图 5.3.3 左)。

换成概率语言看得更清楚:在这个画面下,"正确动作"的概率分布是双峰(多峰,multimodal)的——一个峰在"往左"、一个峰在"往右",中间的谷底是"撞上去"。判别式回归只会输出那个均值,正好落在谁都不对的谷底(图 5.3.3 右)。这个坑不是机器人独有的:让判别式网络"预测下一帧画面"也会得到一片模糊的平均图,道理一模一样。只要答案是多峰的,取平均就是错的。

3. 出路:让模型"采样"而不是"取平均"

解决办法是改用生成模型:它不直接吐一个答案,而是学会"这一整片合理答案长什么样",用的时候从分布里采样出其中一个完整、自洽的峰(要么干脆往左、要么干脆往右),绝不取平均。这样既保留了"多种做法都对"的灵活性,又每次都给出一个能执行的完整方案。常见的生成模型家族(按思路分):

  • VAE(变分自编码器):训练一个"编码器把数据压成一个低维隐变量 z、解码器再从 z 还原数据"的概率模型,生成时从 z 的先验里采样、过解码器即可。ACT 用的就是它的条件版(CVAE)(5.3.6 会讲)。
  • GAN(生成对抗网络):让"生成器"造假、"判别器"打假,两者博弈到生成器能以假乱真。出图惊艳,但训练不稳、容易模式崩塌(只会生成少数几种样本,丢掉了多样性)。
  • 归一化流(normalizing flow):用一串可逆变换把简单噪声"精确地"变成复杂数据,好处是能算出精确概率,但对网络结构限制多。流匹配可以看作它的"连续化 + 免模拟"升级版(5.3.5 会接上)。
  • 自回归模型(autoregressive):把数据拆成一串、一个接一个地预测下一个(GPT 写文字、早期 VLA 把动作当 token 都属此类)。简单通用,但生成要一步步来、慢。
  • 扩散 / 流匹配:当今最稳、最主流的一类——从噪声一步步变出数据。它兼顾了"训练稳"和"能表达复杂多峰分布",正是 Diffusion Policy 和 π0 的内核。下面两节就专门讲它俩。

5.3.4 扩散模型(Diffusion / DDPM)

扩散模型最初是 AI 绘图的当家技术(Stable Diffusion 那一类),思路特别朴素,分两步走:前向——把一块干净数据一步步加噪,最后磨成一团毫无信息的纯噪声(这步是固定规则,不用学);反向——训练一个网络,学会把加噪过程一步步倒回去,从噪声里还原出数据。把"反向"练成了,就能从一团随机噪声里生成一张全新的清晰图——或者,一段干净的动作。

打个比方:这就像雕塑——前向加噪是把一座塑像磨成一堆碎屑,反向去噪是训练网络学会从碎屑里一刀刀把塑像刻回来;手艺练成之后,给它任意一堆碎屑,它都能刻出一座完整的像。

扩散模型的前向加噪与反向去噪
图 5.3.4 前向加噪(固定、无需学习)与反向去噪(网络预测每步噪声 ε)

1. 前向:加噪(不用学)

前向过程是一条固定规则的马尔可夫链:从干净数据 $x_0$ 出发,每一步往里掺一点点高斯噪声,掺到第 $T$ 步(通常 $T\approx 1000$)就成了几乎纯噪声 $x_T$。单步规则是

$$q(x_t\mid x_{t-1})=\mathcal N\big(x_t;\ \sqrt{1-\beta_t}\,x_{t-1},\ \beta_t I\big)$$

其中一串预先设定的小数 $\beta_t$ 叫噪声调度(noise schedule),控制每步掺多少。早期 DDPM 用线性调度($\beta_t$ 从 $10^{-4}$ 缓慢升到 $0.02$);后来 Improved-DDPM 提出余弦调度,让信号衰减更平缓、生成质量更好。整条链不含任何可学参数

逐步加噪要循环上千次太麻烦,幸好有一个非常方便的"一步到位"闭式——记 $\alpha_t=1-\beta_t$、$\bar\alpha_t=\prod_{s=1}^{t}\alpha_s$,把前面所有步合并,任意时刻 $t$ 的带噪样本可以直接由 $x_0$ 和一份噪声 $\epsilon$ 算出(这一步叫重参数化,把"采样"写成"确定式 + 一个标准噪声",从而可导、好训):

$$x_t=\sqrt{\bar\alpha_t}\,x_0+\sqrt{1-\bar\alpha_t}\,\epsilon,\qquad \epsilon\sim\mathcal N(0,I)$$

$\bar\alpha_t$(读作 alpha-bar)是"到第 $t$ 步还剩多少原始信号"的累积系数,随 $t$ 增大从接近 1 降到接近 0:$t$ 小时 $\sqrt{\bar\alpha_t}\approx1$、样本基本是原图掺点噪,$t$ 大时 $\sqrt{\bar\alpha_t}\approx0$、几乎全是噪声。这个闭式让训练时能随机抽一个 $t$、一步生成带噪样本,是扩散高效训练的关键。

还有一个反推时要用的关键量——已知带噪样本 $x_t$ 和原图 $x_0$ 时,上一步 $x_{t-1}$ 的真实后验,它也是个高斯,均值方差有闭式(贝叶斯反推得到):

$$q(x_{t-1}\mid x_t,x_0)=\mathcal N\big(x_{t-1};\ \tilde\mu_t(x_t,x_0),\ \tilde\beta_t I\big),\qquad \tilde\beta_t=\frac{1-\bar\alpha_{t-1}}{1-\bar\alpha_t}\beta_t$$

$$\tilde\mu_t(x_t,x_0)=\frac{\sqrt{\bar\alpha_{t-1}}\,\beta_t}{1-\bar\alpha_t}\,x_0+\frac{\sqrt{\alpha_t}\,(1-\bar\alpha_{t-1})}{1-\bar\alpha_t}\,x_t$$

这条后验是训练目标的"标准答案"——网络的任务就是去逼近它。

2. 反向:去噪,以及训练目标的由来

反向是真正要训练的网络 $p_\theta(x_{t-1}\mid x_t)=\mathcal N\big(x_{t-1};\mu_\theta(x_t,t),\Sigma_t\big)$,要让它的均值去对齐上面那个真实后验的 $\tilde\mu_t$。严格的训练目标是变分下界(ELBO),它能拆成一串可算的 KL 散度:

$$L=\underbrace{D_{\mathrm{KL}}\big(q(x_T\mid x_0)\,\Vert\,p(x_T)\big)}_{L_T}+\sum_{t>1}\underbrace{D_{\mathrm{KL}}\big(q(x_{t-1}\mid x_t,x_0)\,\Vert\,p_\theta(x_{t-1}\mid x_t)\big)}_{L_{t-1}}-\underbrace{\log p_\theta(x_0\mid x_1)}_{L_0}$$

逐项看:$L_T$ 没有可学参数(前向终点就是纯噪声,恒定),$L_0$ 是最后一步的重构,真正在学的是中间那一大堆 $L_{t-1}$——每一项都是"网络预测的高斯"与"真实后验高斯"的 KL,而两个高斯的 KL 就是它们均值差的平方。把 $x_0$ 用闭式换成 $\epsilon$ 表示后,$L_{t-1}$ 化简成"预测噪声"的形式。DDPM 的关键工程发现是:把前面那些复杂的加权系数 $\tfrac{\beta_t^2}{2\sigma_t^2\alpha_t(1-\bar\alpha_t)}$ 统统丢掉、设成 1,效果反而更好。于是落地训练目标极其简单,就是一个 MSE 回归:

扩散训练损失(DDPM 的 $L_{\text{simple}}$)

$$L_{\text{simple}}=\mathbb E_{\,t,\,x_0,\,\epsilon}\Big[\big\lVert \epsilon-\epsilon_\theta(x_t,t)\big\rVert^2\Big],\qquad x_t=\sqrt{\bar\alpha_t}\,x_0+\sqrt{1-\bar\alpha_t}\,\epsilon$$

随机抽个噪声水平 $t$、把样本加噪到 $x_t$、让网络把"掺进去的噪声 $\epsilon$"猜回来。$t$ 通过"时间嵌入"告诉网络现在噪声多重。

几个要点补全:(1) 参数化等价——让网络预测噪声 $\epsilon$、预测原图 $x_0$、或预测一个混合量 $v$,三者数学等价(互相能换算),但预测 $\epsilon$ 训练最稳,是 DDPM 的默认。(2) 主干——图像扩散的去噪网络一般是 U-Net(带时间嵌入),动作扩散则常用 1D 时序 U-Net 或 Transformer(见 5.3.6)。(3) 条件生成——要"按文字/按观测"生成,可用 classifier-free guidance:同时训有条件和无条件两版,采样时按 $\tilde\epsilon=\epsilon_\theta(x_t,t,\varnothing)+w\big(\epsilon_\theta(x_t,t,c)-\epsilon_\theta(x_t,t,\varnothing)\big)$ 把两者外推,$w$ 越大越贴合条件。

3. 采样:从纯噪声刻出数据

训练好后,把网络预测的 $\epsilon_\theta$ 代回后验均值,就得到反向每一步的更新式(祖先采样):

$$x_{t-1}=\frac{1}{\sqrt{\alpha_t}}\Big(x_t-\frac{\beta_t}{\sqrt{1-\bar\alpha_t}}\,\epsilon_\theta(x_t,t)\Big)+\sigma_t\,z,\qquad z\sim\mathcal N(0,I)$$

其中 $z$ 是每步新掺的随机噪声、到最后一步($t=1$)取 $z=0$。从纯高斯噪声 $x_T$ 出发,照这条式子走 $T$ 步就得到干净样本 $x_0$。后来 DDIM 把每步的随机项 $\sigma_t z$ 去掉、改成一条确定性轨迹,能用少得多的步数(如 20~50 步)得到相近质量——这是扩散"提速"的第一波努力。

4. 另一个视角:得分(score)与那座通向流匹配的桥

扩散还有一个等价但更深刻的视角叫得分匹配(score matching):网络其实在学"数据概率密度的梯度方向" $\nabla_x\log p_t(x)$——空间里每一点"往哪个方向走、数据更像真的"的指针。它和预测噪声只差一个系数:

$$s_\theta(x_t,t)=\nabla_x\log p_t(x_t)\approx -\frac{\epsilon_\theta(x_t,t)}{\sqrt{1-\bar\alpha_t}}$$

沿着这个指针反复挪小步去逼近高概率区,叫 Langevin 动力学:$x\leftarrow x+\tfrac{\eta}{2}\nabla_x\log p(x)+\sqrt{\eta}\,z$。更进一步,宋飏(Yang Song)等人证明:整个扩散可写成一条随机微分方程(SDE),其反向过程是

$$dx=\big[f(x,t)-g(t)^2\,\nabla_x\log p_t(x)\big]\,dt+g(t)\,d\bar w$$

而它有一个边缘分布完全一致的确定性版本——概率流常微分方程(probability-flow ODE)

$$dx=\Big[f(x,t)-\tfrac{1}{2}\,g(t)^2\,\nabla_x\log p_t(x)\Big]\,dt$$

(留意那个 $\tfrac12$:反向 SDE 用的是 $g^2\cdot\text{score}$,概率流 ODE 用的是 $\tfrac12 g^2\cdot\text{score}$——差一个因子 2,是常见抄错点。)这条 ODE 就是通向 5.3.5 流匹配的桥:流匹配做的也正是"学一个向量场、把噪声沿一条 ODE 流成数据",只不过它换了一种更直接、更直的走法。记住这个伏笔。

5. 小结:强在哪、弱在哪

扩散的强项是训练稳(就是个 $\epsilon$ 回归,没有 GAN 的对抗不稳)、能表达复杂多峰分布(采样会坚定落进某一个峰)。它的代价是采样慢:反向那条链要一步步串行走,往往几十到上千步才出一个结果(DDIM 能压到几十步,但仍嫌多)。这个"慢"正是下一节流匹配要解决的问题——它把弯弯绕绕的路修成近乎直线,几步就能到。


5.3.5 流匹配(Flow Matching)—— 本节重头

终于到了你最初卡住的那个词。先把一句话结论放前面:流匹配和扩散是同源近亲——都是"从噪声出发、顺着一个学到的方向场,一步步变成数据"。区别在于,扩散走的是弯弯绕绕的路、学的是"噪声/得分";流匹配走的是近乎直线的路、学的是"速度场",所以更快更稳。 π0 选的就是流匹配。这一节我们从头把它建起来。

先约定时间方向(不同论文方向相反,不说清楚一定看晕):本节统一采用 $t=0$ 是噪声、$t=1$ 是数据,采样就是把时间从 0 积分到 1。(注:Stable Diffusion 3 等论文把方向反过来写成 $t=0$ 是数据,数学完全一样,只是镜像,别被绕进去。)

1. 用"速度场"把噪声流成数据

先讲清这套机制:我们要把整团噪声"流"成整团数据。办法是给空间里每一点、每个时刻都规定一个移动方向和速度,让点顺着它挪——这一大片方向构成的场叫速度场(velocity field) $v$,点的运动就是一个常微分方程(ODE)——从噪声 $x(0)$ 出发、沿场积分到 $t=1$ 就得到数据:

$$\frac{dx}{dt}=v_\theta(x,t)$$

(打个比方:$v$ 就像河面上每一点的水流方向,把一片浮萍从上游均匀地冲成下游某个图案。)这里 $v_\theta$ 就是要训练的网络。这类"用 ODE 把简单分布连续变形成复杂分布"的模型,学名叫连续归一化流(CNF)。速度场怎么把"分布"搬动,由连续性方程(输运方程)精确刻画——它保证概率质量既不凭空产生也不消失:

$$\frac{\partial p_t(x)}{\partial t}+\nabla\!\cdot\!\big(p_t(x)\,v_t(x)\big)=0$$

2. 老办法为什么贵:训练里要反复解 ODE

CNF 的传统训法是"最大化数据的对数似然"。沿轨迹的对数密度变化有个公式(瞬时变量替换),但它带一个散度(雅可比矩阵的迹)

$$\frac{d}{dt}\log p_t(x_t)=-\nabla\!\cdot\! v_t(x_t)=-\operatorname{tr}\!\Big(\tfrac{\partial v_t}{\partial x}\Big)$$

要算这个似然,每一步梯度都得在训练循环里把整条 ODE 数值求解一遍,还要估那个迹(常用 Hutchinson 随机估计,又慢又有噪声)。等于训练每一小步里都套一次完整模拟,根本放不大。流匹配的全部价值,就是把"训练里解 ODE"彻底干掉——做到"免模拟(simulation-free)"。

3. 流匹配的目标,和它"算不出来"的麻烦

我们真正想要的,是让网络去拟合那个"能把整团噪声搬成整团数据"的理想速度场 $u_t$,最直白的回归就是:

$$L_{\mathrm{FM}}(\theta)=\mathbb E_{\,t,\,x\sim p_t}\big\lVert v_\theta(x,t)-u_t(x)\big\rVert^2$$

问题是——这个 $u_t$(连同边际路径 $p_t$)是对整个数据分布求积分得来的,根本写不出闭式、算不出来。卡在这,流匹配就只是个漂亮空想。

4. 点睛之笔:条件流匹配(CFM)

流匹配最聪明的一步在这里:别去拟合那个算不出来的"整体"场,改成针对单个数据点设计一条简单路径。先把整体路径写成"一堆条件路径的混合"——对每个真实数据 $x_1$ 设一条好算的条件路径 $p_t(x\mid x_1)$,整体就是它们按数据分布的加权:

$$p_t(x)=\int p_t(x\mid x_1)\,q(x_1)\,dx_1$$

对应地,整体速度场恰好是条件速度场的密度加权平均

$$u_t(x)=\int u_t(x\mid x_1)\,\frac{p_t(x\mid x_1)\,q(x_1)}{p_t(x)}\,dx_1$$

每条 $u_t(x\mid x_1)$ 都有闭式、好算。Lipman 等人证明的关键定理是:回归"单点条件场"和回归"那个算不出来的整体场",两者梯度完全一样

$$L_{\mathrm{CFM}}(\theta)=\mathbb E_{\,t,\,x_1\sim q,\,x\sim p_t(\cdot\mid x_1)}\big\lVert v_\theta(x,t)-u_t(x\mid x_1)\big\rVert^2,\qquad \nabla_\theta L_{\mathrm{FM}}=\nabla_\theta L_{\mathrm{CFM}}$$

直觉是:整体场就是条件场在后验下的条件期望,所以逐条件做回归、在大量样本上平均,自然收敛到整体场(两个损失只差一个与 $\theta$ 无关的常数)。于是那个"算不出来"的目标,被换成一个普通到不能再普通的最小二乘回归——这就是条件流匹配(CFM)

5. 选什么条件路径:从一般高斯到直线

条件路径取高斯 $p_t(x\mid x_1)=\mathcal N\big(x;\mu_t(x_1),\sigma_t(x_1)^2 I\big)$ 时,它的条件速度场有统一闭式(Lipman 定理 3):

$$u_t(x\mid x_1)=\frac{\sigma_t'(x_1)}{\sigma_t(x_1)}\big(x-\mu_t(x_1)\big)+\mu_t'(x_1)$$

扩散路径和最优传输(OT)路径都是它的特例——选不同的 $(\mu_t,\sigma_t)$ 就得到不同走法。取 OT 位移路径 $\mu_t(x_1)=t\,x_1,\ \sigma_t(x_1)=1-(1-\sigma_{\min})t$,再令 $\sigma_{\min}\to0$,就退化成最干净的直线路径

$$x_t=(1-t)\,x_0+t\,x_1,\qquad \frac{dx_t}{dt}=x_1-x_0$$

速度是个常向量 $x_1-x_0$,简单得离谱。代进 CFM,就得到那条要背下来的核心损失

流匹配核心损失(记住这一条就够)

$$L(\theta)=\mathbb E\big\lVert v_\theta(x_t,t)-(x_1-x_0)\big\rVert^2,\qquad x_t=(1-t)\,x_0+t\,x_1$$

网络只需在直线上任意一点 $x_t$,预测出"从噪声指向数据"的那个固定方向 $x_1-x_0$。简单、稳、好放大。

这种"直线 + 常速度"的流匹配,又叫 rectified flow(整流流)。它的训练循环可以一眼写完:

训练一步(伪代码):
  1. 抽一个真实数据 x₁,抽一份噪声 x₀ ∼ N(0,I),抽一个时间 t ∈ [0,1]
  2. 合成直线上的点:xₜ = (1−t)·x₀ + t·x₁
  3. 让网络预测速度 v_θ(xₜ, t),目标是 (x₁ − x₀)
  4. 算 MSE 损失、反向传播、更新参数(就是 5.3.1 那一套)

它和扩散训练有多像——都是"抽个噪声水平、合成带噪样本、让网络回归一个目标",差别只在目标是"速度方向"而不是"噪声"、路径是直线而不是弯的。全程没在循环里解 ODE,这就是免模拟。(工程细节:SD3 发现 $t$ 不要均匀抽,而按 logit-normal 分布偏重中间时段——因为两端的最优速度接近常量、信息少,中段才是难学的部分。)

6. 采样:顺着箭头积分回数据

采样时网络已训好,从噪声出发、用最简单的 Euler 法把 ODE 一小步步积分到 $t=1$:

x ← x₀ ∼ N(0,I)
重复 N 步:  x ← x + Δt · v_θ(x, t),  t 从 0 走到 1   (Δt = 1/N)
输出 x(就是生成的数据/动作)

为什么流匹配步数少? ODE 数值积分的误差主要来自路径的弯曲程度:路越弯,每步直线近似的误差越大、就得切得越碎。流匹配的条件路径特意设计成直线,很粗的步数就能积分得准;理想全直时一步就到。扩散那条概率流 ODE 是弯的,自然要走很多步。下面这张图把两者并排画出来,正好回答你最初的疑问:

流匹配直线路径 vs 扩散弯曲路径
图 5.3.5 同样从噪声到数据:流匹配走直线(少数步)、扩散走弯路(多步)

拉直技巧 reflow:单独训一版流时,噪声和数据是随机配对的,所以整体路径其实还会有点弯、会交叉。reflow 的三步是——① 先训一版流 $v^{(1)}$;② 用它把噪声 $x_0$ 沿 ODE 积分出配对的 $x_1^{\text{sim}}=\mathrm{ODE}[v^{(1)}](x_0)$;③ 拿这些"已配好对"的样本,用同样的核心损失重训出 $v^{(2)}$。每做一次 reflow,整体路径就更直一截,逼近真正的"一步生成"。这是 rectified flow 的招牌招式。

7. 和扩散的精确关系

回收 5.3.4 埋的伏笔:扩散的概率流 ODE $dx=[f-\tfrac12 g^2\nabla\log p_t]\,dt$ 本身就是一个 CNF,它的速度场就是"与得分有关的那个式子"。所以扩散其实是流匹配的一个特例——只不过它的路径是的(由加噪过程定)、学的是得分/噪声;rectified flow 主动选了路、直接学速度。它俩是"同一类方法的两种走法"。一张表对清楚:

对比项扩散 Diffusion(DDPM)流匹配 Flow Matching(直线/rectified)
网络学什么噪声 $\epsilon$(等价于得分 $\nabla\log p$)速度场 $v=x_1-x_0$
路径形状弯曲(概率流 ODE)近乎直线(最优传输方向)
训练目标$\mathbb E\lVert\epsilon-\epsilon_\theta(x_t,t)\rVert^2$$\mathbb E\lVert v_\theta(x_t,t)-(x_1-x_0)\rVert^2$
采样步数几十 ~ 上千步少数步(甚至 1~4 步)
训练成本免模拟(回归噪声)免模拟(回归速度,无需在循环里解 ODE)
关系同源近亲:扩散的概率流 ODE 是"弯曲版"的特例;流匹配换成直线 + 速度场,换了引擎没换大方向

一句话收口:流匹配保留了扩散"学一个向量场、把噪声沿 ODE 变成数据"的骨架,但扔掉了弯曲的加噪路径和"预测噪声"的写法,换成直线条件路径 + 速度回归,靠 CFM 那个"梯度等价"定理保证训练又便宜又稳。这就是 π0 选它的全部理由。


5.3.6 落到机器人:Diffusion Policy 与 ACT

把上面的生成模型接到"动作"上,就是 2023 年立住的两大模仿学习骨架。先回顾设定:模仿学习 / 行为克隆(behavior cloning)就是人先遥控机械臂把任务做几十上百遍(每遍叫一条示范 demo),录下"看到的画面 → 当时做的动作",再让网络去模仿这个映射。最朴素的做法是用 MSE 回归——但我们在 5.3.3 已经看到,这会因为"多种动作都对"而取平均撞墙。Diffusion Policy 和 ACT 干的就是同一件事——用生成模型替掉朴素回归,解决多峰难题——只是用了不同的生成内核(一个用扩散、一个用 CVAE)。

Diffusion Policy 架构
图 5.3.6 Diffusion Policy:以观测为条件,从噪声去噪出一整段动作,再退却视野执行

1. Diffusion Policy:用扩散生成一段动作

它把 5.3.4 的扩散直接搬来生成一段未来动作序列:从一段纯噪声出发、以当前观测为条件,迭代去噪,最后"刻"出一段合理的动作。几个要点逐一讲清:

  • 去噪的是动作、观测只作"条件"且不被加噪:这是最容易讲错的地方。扩散只作用在动作序列上;观测(最近几帧图像 + 关节状态)只是旁边的条件,告诉去噪网络"现在是什么局面",它本身不加噪、不去噪。观测通过 FiLM(feature-wise linear modulation,逐通道地对网络特征做缩放和平移)注入。把观测当条件而不是一起扩散,是它训练稳定的关键。
  • 训练目标:就是 5.3.4 那条 ε 预测损失,只不过去噪对象换成动作序列、并多了观测这个条件:$L=\mathbb E\big\lVert\epsilon-\epsilon_\theta(O,\,A^0+\epsilon,\,k)\big\rVert^2$($O$ 是观测、$A^0$ 是干净动作、$k$ 是噪声步)。
  • 两种网络架构CNN 版把动作序列当成沿时间的一维信号,用 1D 时序 U-Net + FiLM 注入观测,开箱即用、对超参不敏感,是默认推荐;Transformer 版表达力更强、适合动作变化剧烈的任务,但对超参更敏感。
  • 退却视野(receding horizon control):三个长度要分清——用最近 T_o 步观测作条件、一次预测未来 T_p 步动作、但只执行前 T_a 步,然后拿新观测重新预测。"预测长"让动作有全局一致性、抗误差累积;"执行短"让它能及时吸收新画面、对扰动有反应。这套"预测长、执行短、不断重规划"是它鲁棒性的来源之一。

因为是生成模型,一次 rollout 会坚定地落进某一个峰(这次就往左绕),天然避开了"取平均撞障碍",并且对高维、多步的动作序列也建模得很好。这三点(多峰、高维、训练稳)合起来,让它成了后续大量工作直接复用的"默认骨架"。

2. Diffusion Policy 完整拆解:网络结构 · 训练 · 推理

上面讲的是"它干什么"。这一小节把它从头到尾拆开,回答三个最实在的问题:网络长什么样、输入输出各是什么维度(图 5.3.6b);训练时一步一步在算什么、batch 多大、梯度从哪来(图 5.3.6c);用的时候一次动作是怎么生成出来的(图 5.3.6d)。下面的具体数字都取自原论文最常用的设置(观测看 2 帧、一次预测 16 步、执行前 8 步、训练去噪 100 步)。

(1) 网络结构与输入输出维度

先记住一句话定调全局:网络要去噪的只有"动作",观测和扩散步只是旁边的"条件"。 默认架构是一个 1D 时序 U-Net(5.3.4 讲图像扩散用 2D U-Net,这里把它降到一维、沿"动作的时间轴"做卷积)。把输入输出逐个说清:

Diffusion Policy 网络结构与输入输出维度
图 5.3.6b 输入:带噪动作块 + 观测 + 扩散步 k;输出:与动作块同形状的"预测噪声"
  • 输入一 · 带噪动作块 A^k:这是真正被去噪的东西,形状是 [预测步数 Tp=16,动作维度]。动作维度看任务:平面推物 Push-T 是 2(x,y),单臂操作常是 10(3 位置 + 6 旋转 + 1 夹爪)。训练时它=干净动作加了噪声;推理时它=一团纯随机噪声。
  • 输入二 · 观测 O_t(条件,不加噪):最近 To=2 帧图像 + 当时的关节/末端状态。图像每路相机各过一个 ResNet-18 编码(两处改动:用 spatial softmax 池化保留"东西在画面哪个位置"、用 GroupNorm 替掉 BatchNorm 才能和后面的权重滑动平均配合稳定),再把空间关键点压成一个特征向量,和状态拼在一起。
  • 输入三 · 扩散步 k:一个整数(1 到 100),告诉网络"现在噪声多重",先过一个正弦嵌入变成 256 维向量。
  • 条件向量:把"观测特征"和"k 的嵌入"拼成一个全局向量,通过 FiLM 注入 U-Net 的每一个卷积层——所谓 FiLM,就是用这个条件向量算出一组"逐通道的缩放 γ 和平移 β",对卷积后的特征做 out = γ·特征 + β。这是观测"指挥"去噪的方式。
  • 输出 · 预测噪声 ε_θ:形状和输入的动作块完全一样 [16,动作维度]。它不是直接吐动作,而是吐"这一步该减掉的噪声"。减掉它,动作块就干净一点点。

除了上面的 CNN 版,架构还有一个 Transformer 版,做的事一模一样(以观测为条件、给带噪动作块预测噪声),唯一的区别是"怎么吃条件":CNN 版靠 FiLM 把条件逐通道注入卷积层,Transformer 版则把它当成 5.3.2 的解码器来用——

Diffusion Policy 的 Transformer 版架构
图 5.3.6e Transformer 版:带噪动作当 token、扩散步 k 当首 token、观测走交叉注意力进来
  • 带噪动作变成 token 序列:16 步动作排成 16 个 token 送进解码器,扩散步 k 的嵌入当作开头第一个 token 拼在最前面。
  • 观测走交叉注意力:观测编码成一组 token 当 memory,解码器出 Q、观测供 K/V——这就是 5.3.2 讲的交叉注意力,等价于"动作回头去查观测里相关的部分"。
  • 因果掩码:动作 token 之间用因果 mask(每个只看自己和前面),和 5.3.2 的 decoder-only 一脉相承。
  • 输出:每个动作 token 各吐一个预测噪声,拼起来同样是 [16,动作维度]。

取舍很清楚:Transformer 版表达力更强、适合动作变化剧烈的任务,但更挑超参;CNN 版开箱即用、对超参不敏感,是默认推荐。(顺带说一句——这个"把动作当 token、扩散步当首 token、观测走交叉注意力"的解码器结构,几乎就是 5.3.7 里 π0 动作专家的雏形,区别只在 π0 把内核从扩散换成了流匹配、并挂到了一个大 VLM 上。)

(2) 训练流程:一个"猜噪声"的回归,梯度从 MSE 来

训练循环和 5.3.4 的 DDPM 几乎一字不差,只是去噪对象换成动作块、并且多塞了观测这个条件。一步训练就六个动作:

Diffusion Policy 训练流程六步
图 5.3.6c 取示范 → 抽 t,ε → 一步加噪 → 网络猜噪声 → 算 MSE → 反向传播;重复成千上万次
  1. 取一条示范:从遥操作录下的数据里取一段,得到"观测 O_t + 干净动作块 A⁰"(A⁰ 形状 [16,动作维度])。
  2. 随机抽两样:抽一个扩散步 $t\in\{1,\dots,100\}$,再抽一份和动作块同形状的高斯噪声 $\epsilon\sim\mathcal N(0,I)$。
  3. 一步到位加噪:用 5.3.4 那条闭式,把干净动作直接加噪到第 $t$ 步:$A^t=\sqrt{\bar\alpha_t}\,A^0+\sqrt{1-\bar\alpha_t}\,\epsilon$(噪声调度用 squaredcos 余弦版)。
  4. 网络猜噪声:把"带噪动作块 + 观测 + t"喂进网络,让它预测刚才掺进去的噪声 $\epsilon_\theta(O_t,A^t,t)$。注意观测只作条件、自己不加噪
  5. 算损失:就是一个均方误差——$L=\big\lVert\epsilon-\epsilon_\theta(O_t,A^t,t)\big\rVert^2$,比"真噪声"和"猜的噪声"差多少。
  6. 反向传播 + 更新梯度的唯一来源就是这条 MSE 损失(回到 5.3.1:对损失求每个参数的偏导,再用 AdamW 迈一小步)。同时维护一份权重的滑动平均(EMA),推理时用 EMA 版更平滑。
常用训练设置(原论文)

batch = 256(低维状态输入)/ 64(图像输入);优化器 AdamW,学习率 1e-4,余弦衰减 + warmup;训练去噪步数 K=100;预测目标是噪声 ε;视觉 ResNet-18 从零训(不借 ImageNet),动作归一化到 [−1,1]。

一句话抓住要害:Diffusion Policy 的训练,本质就是 5.3.1 讲的那套"前向算损失 → 反向传梯度 → AdamW 更新",只不过损失是"猜噪声的 MSE"。 它没有 GAN 的对抗、没有强化学习的回报,稳就稳在这里。

(3) 推理流程:一次动作是怎么生成出来的

训练好之后,真正"用"的时候分两层——里层是一次生成(在动作块上反复去噪),外层是退却视野(生成一整段,只执行前几步再重来)。

Diffusion Policy 推理流程与退却视野
图 5.3.6d 上:从纯噪声反复去噪出一段动作;下:只执行前 Ta 步,再重新观测、重新预测

里层 · 一次生成(逐步)

  1. 读当前观测 O_t:拍最近 2 帧、读关节状态,编码成条件。这条件在整条去噪链里固定不变
  2. 抽一团纯噪声当起点:$A^K\sim\mathcal N(0,I)$,形状 [16,动作维度]——此刻它还是一段毫无意义的乱动作。
  3. 反复去噪:每一步把"当前带噪动作 + 观测 + 当前步号"喂进网络,得到预测噪声,按 5.3.4 的反向更新式减掉一部分,动作就干净一点。如此重复。
  4. 得到干净动作块 A⁰:走完所有去噪步,浮现出一段连贯、可执行的未来 16 步动作。

关于步数:训练时是 100 步(DDPM);推理时改用 DDIM 加速,约 10~16 步就能出相近质量,一次约 0.1 秒(RTX 3080),足够撑 50Hz 的闭环控制。

外层 · 退却视野(receding horizon,一句口诀"预测长、执行短、勤重规划"):一次预测出 16 步,但只执行前 Ta=8 步,剩下的先丢掉;执行完这 8 步就重新观测、重新生成下一整段。为什么这么做?"预测长"让动作有全局连贯性、不容易抖、能抗误差累积;"执行短"让它能及时吸收新画面、对扰动有反应。这一长一短的配合,正是它鲁棒的来源之一。

(4) 承上启下:Diffusion Policy 动作头 ↔ π0 流匹配动作头

把上面这套拆解记牢,5.3.7 的 π0 就基本不用重学了——因为 π0 末端那个"流匹配动作专家",本质就是把这里的"条件去噪动作头"换了内核、再挂到一个大模型上。两者的骨架(以观测为条件、从噪声迭代精炼出一整段动作、绝不取平均)完全一致,真正变的只有三处。先用一句话概括:同一套"条件生成一段动作"的思路,内核从扩散升级成流匹配、条件从小编码器升级成大 VLM 的全部上下文、网络从独立小网升级成挂在 VLM 上的动作专家。 列表对清:

对比项Diffusion Policy 动作头(5.3.6)π0 流匹配动作专家(5.3.7)
生成内核扩散 / DDPM,学噪声 ε流匹配,学速度场 v = ε − A
迭代路径弯路,去噪 DDPM 100 步 / DDIM 约 10~16 步近直线,Euler 积分 10 步(步长 δ=0.1)
观测条件怎么进小编码器(ResNet-18)→ FiLM / 交叉注意力整个 VLM 的图文上下文,经共享注意力进来
网络体量独立的小网络(U-Net / 小 Transformer)约 300M 动作专家,挂在约 3B 的 VLM 主干上
动作块长度预测 Tp=16、执行 Ta=8一次生成约 50 步连续动作
共同骨架以观测为条件,从纯噪声迭代精炼出一整段动作,天然表达多峰、绝不取平均——这一条两者完全一样

所以从 5.3.6 到 5.3.7 不是另起炉灶,而是同一个动作头的三级跳:① 内核 扩散 → 流匹配(5.3.5 已铺好,更快更直);② 条件 小编码器 → 大 VLM(把"懂图懂话"的常识也喂给动作);③ 形态 独立小网 → 大模型上的动作专家。理解了这三处变化,再去看 5.3.7 的 π0 公式(带噪动作 $q(A^\tau\mid A)=\mathcal N(\tau A,(1-\tau)I)$、目标速度 $u=\epsilon-A$、损失 $\lVert v_\theta-u\rVert^2$、10 步 Euler 积分),你会发现它和本节的训练/推理流程是一个模子刻出来的。

3. ACT:用 CVAE 生成动作块

同期的 ACT(Action Chunking with Transformers,来自 ALOHA 项目)走的是另一条生成路线——条件变分自编码器(CVAE)(就是 5.3.3 提的 VAE 的条件版)。两个招牌设计:

  • 动作分块(action chunking):不预测下一个瞬间,而是一口气预测未来一整段(原文 chunk = 100 步、在 50Hz 下约 2 秒),当成一个"块"打包输出。好处是把决策次数缩短上百倍——本来 500 步的任务要做 500 次决策、误差层层累积,分块后只需约 5 次决策,大幅抑制累积误差,也更能跨过示范里的停顿犹豫。
  • 风格变量 z:一个低维隐变量(维度 32),由 CVAE 编码器从示范里提取,负责吸收"这条示范是用哪种风格/哪个峰做的"——这正是它表达多峰的方式。训练时让 z 承接这份不确定性;推理时把 z 置零(取先验均值),就得到一个干净、一致、确定性的动作块。

架构上,ACT 是个 transformer 编码器-解码器:图像用 ResNet 编码、配上关节状态和 z 作条件,解码出一段 k×动作维 的动作块。训练损失是 CVAE 标准的两项——动作重构(实际用 L1)+ 一个把 z 拉向标准正态的 KL 正则(权重 β=10)。再配合时间集成(temporal ensembling):让相邻 chunk 重叠、对同一时刻的多次预测做指数加权平均,让轨迹更平滑、衔接不跳。

4. 这两个骨架留下了什么

Diffusion Policy 和 ACT 一起立起了两条被后人整体继承的地基——"分块预测一整段动作" + "用生成模型表达多峰"。下一节会看到,VLA(尤其 π0)末端那个吐动作的模块,本质就是把 Diffusion Policy 的"条件去噪动作头"升级、再装到一个大模型上。所以这一节不是支线,而是通向 VLA 的最后一级台阶。


5.3.7 VLA:把一切装进一个大模型

最后一跳:把"读懂指令、理解画面、决定动作"全部交给一个大模型,这就是 VLA(Vision-Language-Action,视觉-语言-动作模型)。它的通用配方是——拿一个预训练好的视觉-语言模型(VLM)当主干,再接一个动作输出机制。具体的前端流水线几乎都长这样:

图像 → 视觉编码器(SigLIP/DINOv2) → 投影成 token ┐
语言指令 → 分词器 → 文字 token              ├→ 大语言模型主干(decoder-only) → 动作输出头 → 动作
机器人状态 → 线性投影 → 状态 token           ┘

视觉编码器把图切成小块、每块变成一个向量;投影层把这些视觉向量映射到和文字 token 同一个空间;于是图像 token 和文字 token 排成一串,丢进大模型用自注意力(5.3.2)融合理解,最后由动作头吐动作。各家 VLA 真正分化的地方只有一处:动作怎么吐出来。发展线就是 5.2 那条传承,下面就从"动作怎么吐"的角度把它串起来。

1. RT-2 / OpenVLA:把动作当 token 吐(离散自回归)

最早的想法很直接:把动作也当成"文字"来写。把每个关节的数值量化成 256 个离散档位,每个档位对应词表里的一个 token,于是大模型就能像写句子一样,把动作一个 token 一个 token 地"写"出来。

RT-2(Google,2023)是开山者,它最大的贡献是用网上的图文问答数据和机器人数据一起训(co-fine-tuning),让模型把从互联网学到的常识、识物、读符号的能力"迁移"到动作上,涌现出认生物体、看懂数字符号等泛化能力。OpenVLA(2024)是它的开源复现版,结构具体:Llama 2 7B 当主干、双视觉编码器 DINOv2 + SigLIP(一个偏几何、一个偏语义)、动作切成 7 个离散 token、在 Open X-Embodiment 这个约 97 万条轨迹的大数据集上训练。

但这条路有个硬瓶颈:吐一步动作要把 7 个 token 一个接一个地自回归挤出来(每个 token 都要把整个 7B 大模型完整跑一遍),慢到只有约 5Hz——根本扛不住机器人 50Hz 的闭环控制。这个"离散自回归太慢"的瓶颈,直接催生了下面两条改进路线。

2. π0:把动作头换成流匹配动作专家(旗舰)

π0(Physical Intelligence,2024–2025)是当前旗舰,也是"流匹配旗舰"这个称呼的由来。它的结构正好把本节前面所有东西——Transformer、生成模型、流匹配、Diffusion Policy——全串了起来:

π0 式 VLA 架构
图 5.3.7 π0:VLM 主干 + 流匹配动作专家,两套权重按 token 类型分工
  • 主干:用 PaliGemma(约 3B)这个现成 VLM 读"图像 + 语言指令"(就是 5.3.2 的 decoder-only transformer)。
  • 动作专家:再挂一套约 300M 的独立权重,专门处理"机器人状态 + 动作 token",用流匹配(5.3.5)输出连续动作。两套权重共享同一套注意力、但按 token 类型走不同的权重——图像/文字 token 走主干那 3B、状态/动作 token 走动作专家那 300M。这种"按 token 类型分工"就是一种 MoE(mixture of experts,混合专家)
  • 三段式注意力掩码:序列分三块——① 图像+文字(块内双向看)→ ② 机器人状态(隔离)→ ③ 动作 token(能看前面全部)。这样动作能参考一切信息,又不会反过来污染 VLM 预训练好的语言表示。
  • 流匹配的具体公式(和 5.3.5 完全一致,只是换了记号,注意它的 $\tau$ 是"1 表示干净、0 表示纯噪"):带噪动作 $q(A^\tau\mid A)=\mathcal N(\tau A,\,(1-\tau)I)$,目标速度 $u=\epsilon-A$,损失 $L=\mathbb E\big\lVert v_\theta(A^\tau,o)-u\big\rVert^2$。推理时从纯噪声出发、做 10 步 Euler 积分(步长 δ=0.1),去噪出一段 50 步的连续动作块,再交给最底层的 PD 控制器直接跟踪,全程没有轨迹规划、没有碰撞检测,控制频率可达 50Hz。

看出来了吗——π0 末端那个"流匹配动作头",本质就是 5.3.6 的 Diffusion Policy 动作头,被换成更快的流匹配、再装到一个大 VLM 上。 这就是 5.2 那句"流匹配旗舰"的全部含义。它的升级版 π0.5 进一步用海量异构数据(约 100 个家庭的移动操作 + 多环境静态臂 + 网页数据等)共训,并改成"先用文字推理出子任务、再让流匹配专家生成动作"的分层结构,主打开放世界、陌生家庭里的泛化。

3. OpenVLA-OFT:另一条提速路(并行 + 连续 + L1)

面对同一个"离散自回归太慢"的瓶颈,OpenVLA-OFT(2025)选了和 π0 不同、但殊途同归的解法:不换流匹配,而是直接改造 OpenVLA 的解码方式——并行解码(一次把整段动作全解出来,不再一个 token 一个 token 挤)+ 动作分块(继承自 ACT)+ 连续动作表示(用 L1 回归直接输出连续数值,丢掉 256 档离散化)。结果:推理提速约 26 倍,LIBERO 仿真平均成功率从 76.5% 提到 97.1%。它和 π0 一个用流匹配、一个用并行 L1 回归,但都在逃离"离散自回归"、都验证了"连续动作 + 分块 + 一次性出整段"是对的方向。

4. 空间感的螺旋回归

早期 VLA 都建在 2D 图像编码器上,空间定位偏弱(论文称之为"空间推理鸿沟"——能听懂"放那个空格子",却算不准它到底在三维空间的哪个毫米)。于是新一代把 5.2 路线 A 的 3D/空间能力重新注回来SpatialVLA前端给输入注入 3D 位置编码、用自适应空间网格表示动作;FALCON 则在后端的动作头注入由单张 RGB 提取的几何先验,并特意不把这些空间 token 塞进语言主干(怕稀释了主干的语言推理能力)。这正是 5.2 那张螺旋图的内涵——B 路学习派发展到 VLA 之后,回头把 A 路几何派的长处吸收了进来,不是单线超越,而是层层汇流。


5.3.8 收口 · 一张血缘图

到这里,整条线已经盖完了。把全节压成一张血缘图,你就能从最底层的地基一路看到今天的旗舰,每一层都"踩在"前一层身上:

会预测一个数(MLP · 前向/反向传播 · 优化器)          ← 5.3.1 地基
   └─ Transformer 自注意力:能并行处理序列、能被放大成大模型   ← 5.3.2
         └─ 判别 → 生成:因为"多种动作都对",取平均会撞墙       ← 5.3.3
               └─ 扩散:从噪声去噪出数据(学噪声/得分,弯路、多步) ← 5.3.4
                     └─ 流匹配:直线路径 + 速度场(更快更稳)——π0 选它 ← 5.3.5
               └─ 接到机械臂:Diffusion Policy / ACT(生成一整段动作) ← 5.3.6
                     └─ 装进大模型:VLA(π0 = VLM 主干 + 流匹配动作头) ← 5.3.7
                           └─ 把空间感吸回来:SpatialVLA / FALCON

这张图也解释了 5.3.0 那条主线为什么成立:判别(预测一个数)→ 生成(采样一整片合理答案)→ 装进机器人(生成动作)→ 装进大模型(VLA)。中间那个最关键的转折——从判别到生成——是被机器人"多种做法都对"的现实逼出来的;而扩散和流匹配,就是把这个"会采样"的能力做到又稳又快的两代内核。

1. 落回我们的下棋项目

今天 VLA 末端那个吐动作的模块,本质就是被升级、被装上大模型的 Diffusion Policy。理解了这条血缘,再回头看 4.x 的"VLA 策略替换"、5.2 的"流匹配旗舰",它们就不再是一堆并列的名词,而是一条你能从头讲到尾、也能在简历和面试里讲透的技术主线——这正是这一节的目的:不是记住模型名字,而是讲清楚每一步为什么会这样发展。

2. 别忘了 5.2 那个诚实的结论

最后要把这一节和 5.2 接上,避免一个常见误读:这条漂亮的技术线,并不意味着单个模型已经够强了。 5.2 反复用真机数据说明——哪怕是最强的 π0.5、OpenVLA-OFT,真机单次抓放也只有 78%~94%,没有任何一条路线能靠"单次"摸到 98%。所以本节讲的这些先进生成式策略,在我们的下棋项目里是执行端的骨架,要达标还得叠上 5.2 第 7、10 节那套闭环纠错 + 失败检测 + 重试。换句话说:5.3 解决"动作怎么生成得又快又像样",5.2 的重试机制解决"怎么把中高成功率补到 98% 达标"——两者缺一不可。

提醒:本节的公式都对照原始论文核对过(DDPM、Flow Matching、Rectified Flow、SD3、Diffusion Policy、ACT、π0、OpenVLA-OFT、SpatialVLA/FALCON 等)。几个最容易抄错的点已特意写对——Adam 的 $\epsilon$ 在根号外、流匹配核心损失是 $\lVert v_\theta-(x_1-x_0)\rVert^2$、π0 推理是 10 步 $\delta=0.1$、Diffusion Policy 里观测只作条件不加噪。若要深挖每个模型的真机成功率与边界,回看 5.2 的横向对比表与能力边界两节。