笔记机器人机器学习常青更新 2026.09阅读约 24 分钟

把"连续动作 → 离散 token → 连续动作"这条链路,拆成每一块需要的前置知识。主线是 π₀-FAST 风格的离散自回归路线[1],并对照 FSQ、Binning 以及连续生成的 flow matching[2]。

全程出现三种标签:

  • DIRECT — 纯数学变换(确定性、无需训练)
  • LEARNED — 从数据拟合(统计 fit 或神经网络)
  • LOSSY — 有信息损失

§1大局观:到底在解决什么问题

一个机器人策略(policy)要做的事:看到观测 oo(图像 + 本体状态),输出一段未来动作 a1:Ta_{1:T}。动作是连续的实数向量(关节角度、末端位姿、夹爪开合)。

建模 p(a1:T∣o)p(a_{1:T}\mid o) 有两条完全不同的路线:

路线动作表示代表类比
连续生成直接吐实数向量π₀(flow matching / 扩散)像图像扩散模型
离散自回归先把动作变成 token,像 LLM 逐个预测π₀-FAST像 GPT 写句子

本笔记聚焦第二条路线。核心魔法:把连续动作"翻译"成一串整数 token,于是机器人控制问题就变成了语言建模问题——可以直接复用 LLM 的全套机器(Transformer、交叉熵、采样)。

概念依赖图:

text
robot action(连续向量序列)
   │  为什么不直接回归? → mode averaging 问题(§3.1)
   ▼
离散化的动机 ───────────────┐
   │                        │
   ├─ FAST 路线:           ├─ 信号处理:DCT(§5)压缩能量
   │   DCT→量化→BPE          ├─ 量化/取整(§6)唯一的有损步
   │                        └─ BPE(§7)无损压缩字典
   │
   ├─ FSQ 路线:神经自编码器 + VQ/FSQ 码本(§9、§10)
   │
   └─ Binning 路线:均匀分桶(§11,最朴素基线)
                ▼
        都接到 自回归 Transformer(§12)
        用 交叉熵 训练 → 天然 多模态(§13)
        靠 采样 + temperature(§13.1)取出不同解
        靠 注意力掩码(§14)区分 prompt / action

§2预备知识:核心概念三元组

正文反复用到的几个概念,先在这里给出中文名 = 英文名 = 最小定义;正文用词与此处一致。

  • 词元化 = tokenization = 把文本或连续信号映射成有限词表(vocabulary)里的整数 ID 序列,供 Transformer 按类别处理[3]。
  • 模式平均 = mode averaging = L2/MSE 回归把多个互斥的正确解平均成一个错误解的现象;它是本文整条离散化路线的核心动机(§3.1)。
  • 离散余弦变换 = DCT (discrete cosine transform) = 把一段离散信号可逆地分解为一组不同频率余弦基之权重(系数)的正交变换;平滑信号的能量集中在低频系数上[4]。
  • 量化 = quantization = 把连续值映射到有限个格点上(如乘 scale 后四舍五入取整)的操作[5];是"连续 → 离散"链路里唯一有损的一步(§6)。
  • 字节对编码 = BPE (byte pair encoding) = 反复合并序列中最频繁相邻 pair、把序列变短的无损压缩算法;合并规则从数据统计得到,不含神经网络[3]。
  • 前缀语言模型 = prefix-LM = 前缀(prompt/条件)用双向注意力、后缀(生成目标)用因果注意力的混合掩码 Transformer 结构[6]。

§3什么是 robot action(被 tokenize 的对象)

一个动作样本是一个二维矩阵:

text
actions.shape == (T, D)
            ┌─ T = action_horizon:一次预测未来多少步(如 50 步 ≈ 1 秒@50Hz)
            └─ D = action_dim:每步的自由度数(如 7 = 6 关节 + 1 夹爪,或 14 = 双臂)

两个关键性质:

  • ① 时间上平滑:相邻时刻动作变化不大(机器人不会瞬移)→ 这是 DCT 能压缩的前提。
  • ② 各维量纲不同:关节角范围可能 ±3 rad,夹爪 0~1 → 必须先归一化到统一范围。

归一化:第一步预处理 LEARNED(统计分位数,近似无损)

把每一维动作缩放到约 [−1,1][-1,1]。常用分位数(quantile)归一化而不是简单的 min-max:取第 1% 和 99% 分位作为边界,对离群值更鲁棒。

python
# 概念:用训练集统计出的分位数把 action 压到 [-1,1]
a_norm = 2 * (a - q01) / (q99 - q01) - 1   # 超出的 clip 掉

§4为什么要把连续动作离散化

最自然的想法是让网络直接输出实数动作,用 L2/MSE 回归监督。那为什么要费劲离散化成 token?三个理由:

  1. 复用 LLM 的整套基础设施:一旦动作是 token,就能直接用预训练 VLM(如 PaliGemma)的 Transformer、词表、交叉熵,省掉重新设计输出头。
  2. 天然支持多模态(§13 详讲):离散分布能同时给"向左"和"向右"高概率,回归不行。
  3. 压缩 + 高效自回归:FAST 用 DCT+BPE 把一段动作压成很短的 token 序列,自回归推理更快。

核心动机:mode averaging(模式平均)灾难

这是理解整条离散化路线最重要的一个直觉。设想机器人面前有个障碍物,绕过去有两种同样正确的方式:向左绕 或 向右绕。训练数据里两种都有。

图 1 · mode averaging vs 多峰分布(交互 demo)
数据里有两个正确动作(蓝点簇=向左,绿点簇=向右)。拖动滑块改变两簇距离,看 L2 回归的"最优预测"(红线)落在哪里。结论:红线始终落在两簇之间的无人区——回归把两个正确解平均成一个错误解,这就是 mode averaging;勾选"显示离散分布"可见多峰分布同时保留两个解。

间距越大,L2 的"最优预测"(两簇均值)越落在无人区——一个谁都没演示过、可能直接撞墙的动作。而离散分布能同时在左右两个 bin 上点亮高概率,完美保留两个模式。这就是为什么要把连续动作切成离散 token + 用分类交叉熵。

§5tokenization 概念(从 NLP 借来的)

在 NLP 里,tokenization = 把一段连续的文字符流切成有限词表里的整数 ID:

text
"机器人很可爱"  →  ["机器","人","很","可爱"]  →  [8123, 442, 19, 5601]
   文本                 子词(subword)            整数 token id

这些整数随后被查 embedding 表变成向量喂进 Transformer。关键点:

  • 词表(vocabulary)是有限的(如 PaliGemma 有 257,152 个 token[6])。
  • 每个 token id 对应词表里一行 embedding 向量。
  • 模型输出是词表上的概率分布(softmax over 257,152 类)。

§6DCT 离散余弦变换 DIRECT

这是 FAST 的第一步,也是很多人最陌生的一块。

直觉:把一条曲线拆成"不同频率的余弦波之和"

任何一段离散信号(比如某个关节角度随时间的 50 个采样点),都可以精确地表示成一堆不同频率余弦波的加权和。DCT 就是算出"每个频率占多少权重"的那组系数[4]。

公式(DCT-II,知道长这样即可)

把长度 NN 的信号 x0,…,xN−1x_0,\dots,x_{N-1} 变成系数 X0,…,XN−1X_0,\dots,X_{N-1}:

Xk=∑n=0N−1xncos⁡ ⁣[πN(n+12)k]X_k = \sum_{n=0}^{N-1} x_n \cos\!\left[\frac{\pi}{N}\left(n+\tfrac12\right)k\right]

k=0k=0 是直流分量(整体平均),kk 越大频率越高。逆变换 IDCT 用同样的余弦基把系数加回去,完全可逆(除浮点误差)。沿时间轴 T 对每个动作维度 D 独立做 DCT。

图 2 · DCT 能量集中(交互 demo)
上图是一段"动作信号"(可调平滑度),下图是它的 DCT 系数;横轴左端为低频、右端为高频。看平滑信号如何把能量挤到最左边几个低频系数上。结论:信号越平滑,非零系数越集中在低频端——这就是能量压缩(energy compaction),是后面取整与 BPE 压缩高效的前提。

§7量化 / 取整 DIRECT LOSSY

这是整条 FAST 链路里唯一真正丢信息的一步,也是"连续 → 离散"真正发生的地方。

连续值有无穷多种取值,token 词表只能表示有限个。量化 = 把连续值映射到最近的"格点"上[5]。最简单的形式:先乘一个缩放系数,再四舍五入取整。

python
q = round(x * scale)        # 连续 x → 整数 q   (编码,有损)
x_hat = q / scale           # 整数 q → 近似连续 x̂(解码,回不到原值)

误差 ∣x−x^∣|x-\hat x| 最大约 12 scale\frac{1}{2\,\text{scale}}。scale 越大 → 格点越密 → 越精确,但整数范围越大、token 越多。这是精度 vs 压缩率的权衡。

图 3 · 量化的精度 / 压缩权衡(交互 demo)
蓝线是原始连续信号,红色阶梯是量化后重建的信号。拖动"量化级数"看:级数越少越省(token 少)但越失真。结论:量化级数就是精度 vs 压缩率的权衡旋钮——级数减少,阶梯变粗、重建误差变大;这一步也是整条链路里唯一的有损环节。

§8BPE 字节对编码 LEARNED(统计 fit,非 NN,无损)

取整后得到一长串整数(含大量重复,尤其是 0)。BPE 是一种无损压缩算法[3],把"高频重复的模式"合并成单个新 token,让序列变短。

反复执行:"找出当前序列里出现最频繁的相邻 pair,把它合并成一个新符号",直到达到目标词表大小。

text
初始: a a b a a b a a b          (a a 这对出现很多)
合并 (a,a)→Z:  Z b Z b Z b        (现在 Z b 这对出现很多)
合并 (Z,b)→Y:  Y Y Y               ← 9 个符号压成 3 个,完全可还原
图 4 · BPE 合并压缩(交互 demo)
下面是一段量化后的整数序列(很多重复)。点"合并一次"执行一步 BPE,看序列如何变短、字典如何增长。结论:每合并一次,序列缩短、字典多一条合并规则;整个过程可逆,压缩完全无损——损失只发生在上一步取整。

"哪些 pair 该合并、合并顺序如何" = BPE 词表/合并规则,它是从训练数据统计出来的(所以是 learned),但只是查表式的统计规则,不含任何神经网络/梯度。给定词表,编码和解码都完全无损。

§9把 FAST 拼起来(全景)

编码方向(连续 → token):

text
归一化的 action 矩阵 A (T, D),约 [-1,1]
   │
   ① DCT(沿时间轴)          DIRECT 无损,能量挤向低频
   ▼
频域系数矩阵 C (T, D),高频≈0
   │
   ② Scale + Round            DIRECT · LOSSY ← 离散化在此发生
   ▼
稀疏整数矩阵(大量 0)
   │
   ③ Flatten 拍平成 1D        DIRECT
   │
   ④ BPE 合并重复模式         LEARNED 词表 · 无损
   ▼
最终离散 token 序列(长度可变,通常远短于 T×D)
   │
   ⑤ 映射到 PaliGemma 词表尾部 128 槽   DIRECT 纯算术

解码方向就是完全反过来:BPE 解码 → reshape → 除以 scale → IDCT → 反归一化。

图 5 · FAST 完整往返流水线(连续 ↔ 离散,可调 scale,交互 demo)
一段平滑的多维动作轨迹,沿时间轴做 DCT → 量化取整 → IDCT 还原。拖动量化 scale 看四个面板同时变化——这是"连续怎么变离散、损失从哪来、token 多少"的最直观演示。结论:scale 越大,重建曲线越贴合原轨迹,但整数系数的幅值范围随之变大;全链路的损失只来自取整这一步。

一个完整的数值示例:看清每一步的 shape 与数据

很多人对"DCT 输入输出到底是什么 shape、scale+round 怎么落地"没有具象感。下面用真实计算的数字走一遍(为看清楚取 D=1 单维、T=8 个时间步;多维时每一列独立重复同样的过程)。

输入:归一化后的动作矩阵 A,形状 (T, D) = (8, 1),值已归一化到 [−1,1][-1,1]:

text
A = [ 1.000, 0.816, 0.494, 0.111, -0.258, -0.555, -0.755, -0.853 ]   # shape (8,1)
     t=0    t=1    t=2    t=3    t=4     t=5     t=6     t=7         ← 时间轴
这是一条平滑下降的曲线(机器人动作的典型样子)。

① DCT —— 沿时间轴变换,输入输出 shape 不变((T,)→(T,),对 (T,D) 就是每列各做一次):

text
C = DCT(A) = [ 0.00, 1.889, 0.159, -0.00, -0.00, 0.00, 0.00, -0.00 ]   # 仍是 (8,1)
              k=0   k=1    k=2    k=3    k=4   k=5   k=6   k=7         ← 频率轴
              直流  低频────────→                       高频
能量几乎全集中在 k=1(=1.889)!k≥3 的高频系数已经≈0。

② Scale + Round —— 离散化在这里发生(取 scale = 8):

text
C × scale = [ 0.00, 15.115, 1.273, -0.00, -0.00, 0.00, 0.00, -0.00 ]
round(·)  = [   0,    15,     1,     0,     0,    0,    0,    0    ]   = Cq(整数!)
                                                                       8 个里只有 2 个非零

这一步:① 把连续小数变成整数(真正的"离散化");② 那些 ≈0 的高频系数被压成恰好 0。损失就来自这里(15.115→15、1.273→1 的舍入)。

③ Flatten 把 (T,D) 拍平成 1D 整数序列 [0, 15, 1, 0, 0, 0, 0, 0](D>1 时按 T×D 拉直)。

④ BPE 把高频重复模式(如"连续 5 个 0")合并成单个 token,序列更短,最后 ⑤ 映射到词表最高 128 个槽位的 id。

解码:原路返回,看损失有多小

text
token → BPE解码 → [0,15,1,0,0,0,0,0] → reshape(8,1) → ÷scale → IDCT → 反归一化
重建 A_rec = [0.977, 0.803, 0.497, 0.125, -0.241, -0.545, -0.756, -0.862]
原始 A     = [1.000, 0.816, 0.494, 0.111, -0.258, -0.555, -0.755, -0.853]
重建 MSE ≈ 1.7e-4   ← 仅用 2 个非零系数就几乎完美还原 8 个值!

§10VQ-VAE 与码本(理解 FSQ 的前置)LEARNED(真神经网络)

FSQ 路线是真正的神经网络方案。要懂 FSQ,先懂它的前身 VQ-VAE 的"码本"思想。

VQ-VAE(Vector Quantized VAE)[7]的想法:维护一本可学习的"码本"——比如 256 个向量,每个叫一个 codeword(码字),编号 0~255。

text
编码器(NN) → 连续向量 z
         ↓ 在码本里找最近的码字
最近码字的编号 = token(如 #42)          ← 离散化
         ↓
解码器(NN) 用 #42 对应的码字向量重建动作

整个编码器、解码器、码本里的 256 个向量本身都是梯度训练出来的(用重建 MSE 损失)。这就是真正的"端到端学习的离散表示"。

straight-through estimator(直通梯度)

"取最近邻 / 四舍五入"是阶梯函数,导数处处为 0,梯度传不回编码器。技巧:前向用离散值,反向假装它是恒等函数(梯度直接穿过去)[8]。

python
z_q = z + stop_gradient(quantize(z) - z)
#   前向:z_q == quantize(z)(离散)
#   反向:d z_q / d z == 1   (梯度像没量化一样直通回去)

§11FSQ 有限标量量化 LEARNED

FSQ(Finite Scalar Quantization)[9]是 VQ-VAE 的优雅替代:砍掉可学习码本,改成"在极少数几维上各自做固定网格的四舍五入"。它无需学习码本,却天然不会坍缩。

核心 trick:

  1. 编码器把动作投影到极低维(比如只有 3 维)。
  2. 每一维用 tanh⁡\tanh 压到 [−1,1][-1,1],然后四舍五入到该维固定的几个格点(如第 1 维 8 个格点、第 2 维 6 个、第 3 维 5 个)。
  3. 多维格点的组合用混合进制编码成单个整数 token(8×6×5=240≈2568\times6\times5=240\approx256 个码字)。
python
# FSQ encode(概念)
x = proj_down(z)                      # 投影到 ~3 维      [LEARNED]
zc = tanh(x)                          # 压到 [-1,1]
digits = round((zc+1)*(bases-1)/2)    # 每维四舍五入到格点 [DIRECT, LOSSY]
token = undigitize(digits)            # 多维 digit → 单整数(混合进制)[DIRECT]
图 6 · FSQ 的 2D 固定网格码本(交互 demo)
把动作压到 2 维后,FSQ 的"码字"就是这些规则网格点。移动鼠标(或拖动),看连续点被吸附到最近的网格码字(=一个整数 token)。调每维格点数看码本大小变化。结论:FSQ 的码本就是固定的规则网格本身——不用学习、天然不会坍缩,码本大小 = 各维格点数之积。

§12Binning 均匀分桶(最朴素基线)DIRECT

RT-2[10] / OpenVLA[11] 风格,零学习:每个维度、每个时间步独立地把 [−1,1][-1,1] 均匀切成 256 个桶,取整成桶编号。

python
token = round((a+1)/2 * n_bins)     # 编码
a_hat = token / n_bins * 2 - 1      # 解码
  • 优点:简单、无需任何训练、完全可逆(除取整)。
  • 缺点:token 数 = T×D(不压缩,序列很长);精度只有 256 级且不利用时间相关性。是论文里的对照基线。

三者放一起看:

BinningFASTFSQ
连续→离散均匀分桶取整DCT→取整→BPETransformer→FSQ 量化
是否 NN❌❌(统计 fit)✅
需预训练❌仅 BPE 词表/分位数✅ 需 checkpoint
token 数多(T×D)少(压缩)中(固定)
利用时间相关性❌✅(DCT)✅(注意力)

§13自回归建模 + 交叉熵

无论用哪个 tokenizer,动作变成 token 后,训练目标和 GPT 一模一样:预测下一个 token。

序列长什么样:

text
Task: pick up the cup, State: <离散化的本体状态>;
Action: <a₁><a₂>...<aₙ>|
└──────── 前缀 prefix(条件,不算损失)───────┘└─ 后缀 postfix(算损失)─┘

注意:连本体 state 也被离散化(切 256 桶)一起塞进 prompt。

训练目标 = next-token 交叉熵(负对数似然):

L=−1∣mask∣∑t  maskt⋅log⁡pθ(at∣a<t,o)\mathcal{L} = -\frac{1}{|\text{mask}|}\sum_{t}\; \text{mask}_t \cdot \log p_\theta(a_t \mid a_{<t}, o)
python
targets = one_hot(tokens[:, 1:], vocab=257152)   # 右移一位当 target
logp    = log_softmax(logits)
token_logp = sum(targets * logp, axis=-1)        # 正确 token 的 log 概率
loss = -sum(token_logp * loss_mask) / sum(loss_mask)  # 只在 action 段算损失

§14多模态是怎么"免费"得到的

回到 §3.1 的 mode averaging 问题。离散 token + 交叉熵从三个层面解决它:

  1. 离散 categorical 天然多峰:每个 token 位置输出整个词表的 softmax,可以同时给"向左对应的 token"和"向右对应的 token"高概率。不再被迫平均。
  2. 自回归分解表达联合多模态:p(a1:n∣o)=∏tp(at∣a<t,o)p(a_{1:n}\mid o)=\prod_t p(a_t\mid a_{<t},o)。一串 categorical 的连乘能表示复杂的多峰联合分布——"向左"是一条连贯 token 序列,"向右"是另一条。
  3. 推理时靠采样取出不同的解(下一节)。

采样与 temperature

有了多峰分布,怎么取出动作?对每个 token 的 logits 做带温度的采样:

pi=exp⁡(zi/τ)∑jexp⁡(zj/τ)p_i = \frac{\exp(z_i/\tau)}{\sum_j \exp(z_j/\tau)}
  • τ=0\tau=0:取 argmax → 确定性、单一最可能解。
  • τ>0\tau>0:从分布随机采样 → 不同 RNG 得到不同可行解;τ\tau 越大越多样。
图 7 · temperature 如何调节多模态采样(交互 demo)
某个 token 位置的双峰 logits("向左"和"向右"两个高概率区)。拖动 temperature 看 softmax 分布怎么变;点"采样 20 次"看实际抽到的 token 分布。结论:τ 小时分布坍缩成单一尖峰(只剩最高峰的解),τ 大时两个峰都有机会被抽中——多模态的不同解正是靠随机采样取出来的。

§15注意力掩码:prefix 双向 vs action 因果

序列里 prompt/state(前缀)和 action(后缀)扮演不同角色,用不同的注意力掩码(ar_mask):

  • 前缀 = 双向注意力(像 encoder):prompt + state 是已知条件,互相都能看到(BERT 式),让模型充分理解任务上下文。
  • 后缀 = 因果注意力(像 decoder):action token 只能看到自己左边的(GPT 式),保证自回归生成时"不偷看未来"。

这种"前缀双向 + 后缀因果"的混合掩码是 prefix-LM 结构,PaliGemma[6] / π₀-FAST[1] 都用它。

§16对比:另一条路线 flow matching(π₀)

为了把离散路线放进坐标系,简单看看连续路线。π₀[2] 不 tokenize,用 flow matching[12](扩散家族)直接生成连续动作:从高斯噪声出发,沿学到的"速度场"积分,逐步把噪声"流"成动作。

π₀-FAST(本笔记主线)π₀(flow matching)
动作表示离散 token连续向量
建模自回归 + 交叉熵速度场 + 积分
多模态来源多峰 categorical + 采样从噪声出发的随机积分路径
复用 LLM✅ 直接复用词表/Transformer需专门的 flow 头
推理逐 token(快慢取决于 token 数)少步积分

§17三种 tokenizer 重建效果对比

"连续 → token → 连续"必然有损(来自量化取整)。三种 tokenizer 的重建误差和token 数各有取舍。先看一张实测对比,再亲手调参验证。

图 8 · FAST vs Binning vs FSQ 重建往返对比(交互 demo)
同一段动作(可调平滑度/噪声),三种方法各自编码再解码。上图叠加三条重建曲线(颜色区分方法,与下图柱色一致),下图用柱状对比「重建 MSE」和「token 数」。FSQ 为示意(无训练 checkpoint,用「固定 token 数 + 网格量化」近似其行为)。结论:信号越平滑,FAST 用越少的 token 拿到越低的重建误差;Binning 的误差不随平滑度改善且 token 最多——是否利用时间相关性是三者的关键差别。
FASTFSQBinning
重建误差来源DCT 系数取整FSQ 网格量化 + 神经重建误差每个标量独立 256 桶取整
误差随平滑度改善✅ 越平滑越准(DCT 利用时间相关性)✅ 编码器能学到时间结构❌ 与平滑度无关,固定量化地板
token 数少且可变(压缩,≪ T×D)中且固定(=num_tokens)多且固定(=T×D,每标量一个)
同等 token 预算下精度高(平滑信号)高(需训练好)低(浪费在高频)
是否需训练仅 BPE 词表/分位数(统计 fit)✅ 需训练神经 checkpoint❌ 零训练

怎么读这张表:核心权衡是「token 数 ↔ 精度 ↔ 是否利用时间结构」。Binning 最朴素:每标量一个 token、误差恒定但 token 最多、不懂时间相关性。FAST 用 DCT 把时间相关性变成低频稀疏,用更少 token 拿到更高精度(前提:动作平滑)。FSQ 用神经网络学一个紧凑潜空间,token 数固定可控,但要先训练。

§18π₀-FAST 模型全貌:基础模型 / 输入 / 输出

tokenizer 把动作变成 token 之后,是谁在消费这些 token?这一节把 π₀-FAST 的模型骨架讲清楚。

基础模型:PaliGemma(Gemma-2B 解码器 + SigLIP 视觉)

π₀-FAST 的骨干是 PaliGemma[6]——一个视觉语言模型(VLM),由两部分组成:

组件是什么规格
视觉编码器SigLIP So400m/14(ViT)[13]patch=14,224×224 → 16×16 = 256 个图像 token / 张
语言模型 (LLM)Gemma-2B,decoder-onlywidth=2048, depth=18, heads=8, vocab=257,152

输入与多模态 embed 顺序

模型输入含:多路相机图像、各自的 mask、本体 state、以及已 tokenize 的文本 prompt。它们被拼成一条 token 序列,顺序是:

输入 token 序列(沿序列轴 concat):左→右① 图像 tokenbase_0 / base_1 / wrist_0② 文本前缀"Task: …, State: ⟨离散化state⟩;\nAction: "③ action token + "|"FAST 离散 token(要预测的)前缀 prefix · 双向注意 · 不计损失后缀 suffix · 因果 · 计损失embed 来源:SigLIP 视觉编码器Gemma 词表 embedding(文本 + action 共享同一张表)注:state 不是单独向量,而是被离散成 256 桶后写进文本 prompt 里(字符串)。
图 9 · π₀-FAST 输入序列结构:先图像、后文本前缀,再 action。绿色块 = 前缀(图像 token + 文本 prompt/state,双向注意、不计损失),蓝色块 = 后缀(action token + "|",因果注意、计损失);紫色标注每段 embedding 的来源。结论:前缀双向、后缀因果,文本与 action 共享同一张 Gemma 词表 embedding。
  • 先图像、后文本:先把每张图过 SigLIP 得到一串图像 token,再把 tokenized 文本 prompt 的 embedding 接在后面。
  • state 在文本里:本体 state 被离散成 256 桶、转成字符串拼进 "State: …;",所以它走的是文本 embedding,不是单独通道。
  • 图像与文本/action 共享同一个 Transformer,但图像 token 之间是双向注意。

输出:每步预测一个 token,自回归直到结束

模型输出是词表(257,152 类)上的概率分布,即"下一个 token 是谁"。生成是逐 token 自回归的:

text
while 未遇到 EOS 且 步数 < 上限(256):
    token = 从 last_logit 采样          # 每步只产出【1 个】token(argmax 或带温度采样)
    把 token embed 回去,预测下一个     # 接回输入,继续
遇到 EOS 或到达上限则停止

解码完是不是 (T, D)?——是

生成的一串变长 action token 被还原:取 "Action: " 与 "|" 之间的 token → 映射回 FAST token 空间 → 用 time_horizon=T, action_dim=D 解码,reshape 成 (T, D)。

§19术语表(速查)

术语含义
action chunk / horizon (T)一次预测的未来动作步数
action_dim (D)每步动作的自由度数
tokenization连续/文本 → 有限词表的整数 ID
DCT / IDCT离散余弦(逆)变换,时域↔频域,可逆 direct
quantization连续值映射到有限格点(取整),唯一有损步
BPE字节对编码,合并高频 pair 的无损压缩
codebook / codeword码本 / 码字,离散表示的"字典"及其条目
VQ-VAE带可学习码本的离散自编码器
FSQ有限标量量化,用固定网格代替可学习码本
straight-through estimator前向离散、反向恒等的梯度直通技巧
mode averaging回归把多个正确解平均成错误解的现象
categorical 分布离散类别上的概率分布,可多峰
cross-entropy分类任务的负对数似然损失
temperature τ采样温度,调节分布尖锐度/多样性
ar_mask区分双向(prefix)/因果(action)注意力的掩码
prefix-LM前缀双向+后缀因果的混合 Transformer
flow matching连续动作生成路线(π₀),扩散家族

§20延伸阅读


§21References

  1. K. Pertsch, K. Stachowicz, B. Ichter, D. Driess, S. Nair, Q. Vuong, O. Mees, C. Finn, S. Levine. FAST: Efficient Action Tokenization for Vision-Language-Action Models. arXiv:2501.09747, 2025.
  2. K. Black et al. π₀: A Vision-Language-Action Flow Model for General Robot Control. RSS 2025. arXiv:2410.24164.
  3. R. Sennrich, B. Haddow, A. Birch. Neural Machine Translation of Rare Words with Subword Units. ACL 2016. arXiv:1508.07909.
  4. N. Ahmed, T. Natarajan, K. R. Rao. Discrete Cosine Transform. IEEE Transactions on Computers, 1974.
  5. A. Gersho, R. M. Gray. Vector Quantization and Signal Compression. Kluwer Academic Publishers, 1992.
  6. L. Beyer et al. PaliGemma: A versatile 3B VLM for transfer. arXiv:2407.07726, 2024.
  7. A. van den Oord, O. Vinyals, K. Kavukcuoglu. Neural Discrete Representation Learning. NeurIPS 2017. arXiv:1711.00937.
  8. Y. Bengio, N. Léonard, A. Courville. Estimating or Propagating Gradients Through Stochastic Neurons for Conditional Computation. arXiv:1308.3432, 2013.
  9. F. Mentzer, D. Minnen, E. Agustsson, M. Tschannen. Finite Scalar Quantization: VQ-VAE Made Simple. ICLR 2024. arXiv:2309.15505.
  10. A. Brohan et al. RT-2: Vision-Language-Action Models Transfer Web Knowledge to Robotic Control. arXiv:2307.15818, 2023.
  11. M. J. Kim et al. OpenVLA: An Open-Source Vision-Language-Action Model. arXiv:2406.09246, 2024.
  12. Y. Lipman, R. T. Q. Chen, H. Ben-Hamu, M. Nickel, M. Le. Flow Matching for Generative Modeling. ICLR 2023. arXiv:2210.02747.
  13. X. Zhai, B. Mustafa, A. Kolesnikov, L. Beyer. Sigmoid Loss for Language Image Pre-Training. ICCV 2023. arXiv:2303.15343.
搜标题、小节与正文,本语言内检索。
    ↑↓ · Enter · Escastro-inkstone