1.当前StarVLA中封装的视觉语言模型(VLM)骨干

位于starVLA\starVLA\model\modules\vlm\__init__.py

def get_vlm_model(config):

    vlm_name = config.framework.qwenvl.base_vlm

    if "Qwen2.5-VL" in vlm_name or "nora" in vlm_name.lower():  # temp for some ckpt
        from .QWen2_5 import _QWen_VL_Interface

        return _QWen_VL_Interface(config)
    elif "Qwen3-VL" in vlm_name:
        from .QWen3 import _QWen3_VL_Interface

        return _QWen3_VL_Interface(config)
    elif "Qwen3.5" in vlm_name:
        from .QWen3_5 import _QWen3_5_VL_Interface

        return _QWen3_5_VL_Interface(config)
    elif "gemma-4" in vlm_name.lower() or "gemma4" in vlm_name.lower():
        from .Gemma4 import _Gemma4_VL_Interface

        return _Gemma4_VL_Interface(config)
    elif "molmo2" in vlm_name.lower():
        from .Molmo2 import _Molmo2_VL_Interface

        return _Molmo2_VL_Interface(config)
    elif "minicpm-v" in vlm_name.lower() or "minicpmv" in vlm_name.lower():
        from .MiniCPM_V import _MiniCPM_VL_Interface

        return _MiniCPM_VL_Interface(config)
    elif "florence" in vlm_name.lower():  # temp for some ckpt
        from .Florence2 import _Florence_Interface

        return _Florence_Interface(config)
    elif "cosmos-reason2" in vlm_name.lower():
        # Cosmos-Reason2 is architecturally Qwen3-VL (VLM), but implemented
        # in world_model/ for historical reasons. Import directly.
        from starVLA.model.modules.vlm.CosmosReason2 import _CosmosReason2_Interface

        return _CosmosReason2_Interface(config)
    elif "egovla" in vlm_name.lower() or "ego_vla" in vlm_name.lower() or "vila" in vlm_name.lower():
        # EgoVLA (VILA): SigLIP-384 + Qwen2-1.5B + mlp_downsample projector.
        from starVLA.model.modules.vlm.VILA import _EgoVLA_VILA_Interface

        return _EgoVLA_VILA_Interface(config)
    else:
        raise NotImplementedError(f"VLM model {vlm_name} not implemented")

统一工厂 get_vlm_model() 支持:

  • Qwen2.5-VL(含 Nora 类检查点)
  • Qwen3-VL
  • Qwen3.5
  • Gemma 4
  • Molmo2
  • MiniCPM-V
  • Florence-2
  • Cosmos-Reason2
  • EgoVLA / VILA

此外,PI0/PI0.5 专用组合使用 PaliGemma,实现在:

starVLA\starVLA\model\modules\vlm\OpenPIPaliGemma.py

2.当前StarVLA中封装的世界模型骨干

世界模型与VLM都是骨干网络模型

def get_world_model(config):
    """Factory for world model backends.

    Routes to the correct world-model wrapper based on
    ``config.framework.world_model.base_wm`` (or falls back to
    ``config.framework.qwenvl.base_vlm`` for backward compatibility).

    Every world-model wrapper exposes:
      - ``forward(**kwargs)`` → model outputs with hidden_states
      - ``build_inputs(images, instructions)`` → dict of tensors
      - ``generate(**kwargs)`` → generation (optional)
    """

    # Prefer explicit world_model config; fall back to qwenvl for compat
    wm_cfg = config.framework.get("world_model", None)
    if wm_cfg is not None:
        wm_name = wm_cfg.get("base_wm", "")
    else:
        wm_name = config.framework.qwenvl.base_vlm

    if "cosmos-reason2" in wm_name.lower():
        from ..vlm.CosmosReason2 import _CosmosReason2_Interface

        return _CosmosReason2_Interface(config)
    elif "cosmos-predict2" in wm_name.lower() or "cosmos-predict2" in wm_name.lower():
        from .CosmoPredict2 import _CosmoPredict2_Interface

        return _CosmoPredict2_Interface(config)
    elif "wan2" in wm_name.lower() or "ti2v" in wm_name.lower():
        from .Wan2 import _Wan2_Interface

        return _Wan2_Interface(config)
    else:
        raise NotImplementedError(f"World model {wm_name} not implemented")

统一工厂 get_world_model() 支持:

  • Cosmos-Predict2
  • Wan2 / Wan TI2V
  • Cosmos-Reason2(兼容入口;本质更接近 VLM)

3.当前StarVLA中封装的动作头Action_Model

3.1当前 framework 中实际接入的动作头

动作头统一存放目录:starVLA\starVLA\model\modules\action_model

动作头没有集中式总工厂;每种动作头在自己的文件中提供 get_action_model(),例如:

  • OFT/MLP:get_action_model()
  • FAST:get_action_model()
  • PI/Flow Matching:get_action_model()
  • GR00T:get_action_model()
  • DiT 扩散:get_action_model()

当前实际接入了:

  • FAST:自回归离散动作 token
  • MLP / OFT:并行连续动作回归
  • LayerwiseFM / PI:逐层 Flow Matching
  • GR00T:DiT Flow-Matching 双系统动作头
  • DiT diffusion:扩散动作头
  • LayerwiseDD:逐层离散扩散
  • AML Flow Matching:ABot-M0 风格
  • VLA Adapter:L1 回归适配器
  • EgoVLA trajectory decoder
  • OpenPI0 action head
  • OpenPI0.5 action head

注意:不是任意骨干和动作头都能只改配置以自由组合。Qwen、世界模型与 FAST/OFT/PI/GR00T 的组合较模块化;PaliGemma、EgoVLA、ABot 等存在专用接口,通常要修改对应 framework 的特征维度、token 或调用逻辑。

3.2覆盖了当前主流且较先进的大部分动作生成范式,但不能说囊括所有最新 SOTA 方案。

已覆盖的核心路线:

  • 自回归离散动作:FAST
  • 并行连续回归:OFT / MLP
  • 扩散策略:DiT diffusion、离散扩散
  • Flow Matching:PI、GR00T、AML
  • 双系统架构:VLM 高层语义 + 动作专家低层控制
  • 专用轨迹解码器与适配器:EgoVLA、VLA Adapter

这几类基本代表现代 VLA 动作头的主要技术谱系,尤其 Flow Matching、FAST 和双系统方案属于当前重点方向。

但仓库并未完整覆盖:

  • 基于 consistency/rectified-flow 的少步或单步动作生成
  • 更完整的分层规划器与技能 token 动作头
  • 显式 3D、SE(3)、点云或几何等变动作头
  • 基于 MPC、价值函数或强化学习在线优化的动作选择器
  • 各闭源模型及刚发布论文中的专用实现
  • 多机器人 embodiment 路由、MoE 动作专家等新方案

因此更准确的评价是:它是一套覆盖面较完整的前沿动作头研究平台,而不是所有 SOTA 动作方案的全集。 对学习和横向实验而言已经很有代表性;若针对精细操作、3D 几何控制或在线强化学习,还需要扩展。

3.3 Action_Model简略介绍

  1. FAST(自回归离散) 先将连续动作压缩、量化为 token z,再建模 p(z|c)=∏ₖp(zₖ|z<ₖ,c),以交叉熵 L=−Σlog p(zₖ*|z<ₖ,c) 训练。优点是复用语言模型、能表达多峰分布;缺点是串行解码慢,存在量化误差和误差累积。实现见 fast_ActionHeader.py

  2. OFT/MLP(并行回归) 一次输出 Â=fθ(c)∈R^(T×D),常用 L1:L=||Â−A||₁。速度最快、训练稳定;但点估计容易把多种可行动作平均化。见 L1RegressionActionHead

  3. DiT 扩散 前向加噪:xₜ=√ᾱₜA+√(1−ᾱₜ)ε;网络预测 εθ(xₜ,t,c),损失 E||ε−εθ||²;推理从高斯噪声逐步去噪。多峰能力强但采样较慢。见 ActionModel。离散扩散则先把动作量化成 bin,再通过掩码/离散转移迭代恢复,量化公式见 continuous_to_bins()

  4. PI/Flow Matching 取 ε~N(0,I),xₜ=(1−t)ε+tA,真实速度 v=A−ε;学习 L=E||vθ(xₜ,t,c)−v||²,推理积分 dx/dt=vθ。路径比扩散更直接,通常可减少采样步数。见 LayerwiseFlowmatchingActionHead

  5. GR00T/双系统 System 2 的 VLM 提供语义上下文;System 1 的 DiT/Flow-Matching 动作专家高速生成连续动作。GR00T是条件注入与系统组合,不是全新概率目标。AML改为预测终点 Â,再算 v̂=(Â−xₜ)/(1−t),见 FlowmatchingActionHead

  6. EgoVLA/VLA Adapter EgoVLA用动作查询交叉关注完整VLM记忆和本体状态,分左右手输出专用轨迹,见 TransformerSplitActV2。VLA Adapter通过轻量注意力融合动作/本体与视觉特征,再用L1回归;参数效率高,但通用性弱于生成式动作头。

4.FAST(自回归离散)

FAST 不是逐时刻、逐维分箱,而是先压缩整段动作的时间结构,再离散化。设动作块 A∈R^(T×D)

  1. 归一化:通常以数据分位数把各维缩放至 [-1,1],降低异常值影响。

  2. DCT 时域压缩:对每个动作维度沿时间轴变换: C[k,d]=α(k)Σₜ A[t,d]cos[π(2t+1)k/(2T)] 低频系数描述整体运动趋势,高频系数描述快速细节。机器人轨迹通常平滑,因此多数高频系数接近零。

  3. 量化与展平:将 DCT 系数量化为整数,按低频优先次序展平。量化步长越小,精度越高但 token 更多。

  4. BPE 压缩:统计整数序列中的高频相邻模式,将其合并成一个 token。最终每个动作块通常只需约 30–60 个 token,相比逐元素分箱可压缩约 10 倍。

  5. 自回归学习:给定视觉、语言条件 cp(z|c)=∏ₖp(zₖ|z₍<k₎,c) 训练采用 teacher forcing 与交叉熵: L=−Σₖlog pθ(zₖ*|z₍<k₎*,c)

  6. 解码:生成 token → BPE 逆变换 → 反量化 → IDCT → 反归一化,恢复 [T,D] 连续动作。

StarVLA 中编码器见 Fast_Action_Tokenizer,训练映射见 forward(),生成和解码见 predict_action()

优势:训练快、复用 VLM、兼顾精细动作与多峰性。

局限:自回归推理较慢、存在量化误差、错误会沿 token 序列累积。

连续动作 → 离散 token → Transformer 自回归生成

5.OFT/MLP 并行回归

给定图像、语言指令及可选机器人状态,VLM 先输出条件特征。系统为未来每个动作时刻放置一个动作查询 token:

H=[h₁,h₂,…,h_T],H∈R^(T×hidden_dim)

每个查询特征经过共享 MLP,直接回归连续动作:

â_t=MLP(h_t)∈R^D

因此整个动作块一次前向即可得到:

Â=[â₁,…,â_T]∈R^(T×D)

训练通常采用 L1 损失:

L_L1=(1/(TD)) ΣₜΣ_d |â_(t,d)−a_(t,d)|

例子

若预测未来 4 帧、每帧 7 维机械臂动作:

4 个动作 token → VLM → [4, hidden_dim]
                       → 共享 MLP
                       → [4, 7]

4 帧动作同时产生,不像 FAST 那样逐 token 生成,也不需要扩散模型多步去噪。

StarVLA 实现

  • 动作查询提取与并行预测:forward()
  • MLP 残差网络:MLPResNet
  • 连续动作头:L1RegressionActionHead
  • 并行形状变换:predict_action()
  • L1 损失计算:QwenOFT.py

优点:推理快、结构简单、训练稳定、无量化误差。
缺点:L1 倾向预测条件中位数;当同一场景存在多种合理动作时,可能产生“平均动作”,多模态表达能力通常弱于扩散、Flow Matching 或离散自回归方法。

VLM隐藏特征 → MLP/OFT → 一次性直接回归整个动作轨迹

6.DiT 扩散动作头

DiT(Diffusion Transformer)用 Transformer 充当扩散去噪器。它不是直接回归动作,而是学习把高斯噪声逐步还原成完整连续动作块。

1. 前向加噪

真实动作块为 x₀∈R^(T×D),在随机扩散时刻 t 加噪:

x_t = √ᾱ_t x₀ + √(1−ᾱ_t) ε,ε~N(0,I)

随着 t 增大,动作结构逐渐消失,最终接近纯高斯噪声。StarVLA 在 forward() 中随机采样噪声和时刻,并通过 q_sample 构造 x_t

2. 条件去噪网络

DiT 接收:

  • 含噪动作 x_t
  • 扩散时刻 t
  • VLM 产生的视觉、语言条件 c

预测噪声:

ε̂ = DiTθ(x_t,t,c)

动作序列内部通过 self-attention 建模时间依赖,动作与 VLM 条件可通过 cross-attention 或条件调制融合。StarVLA 调用位置是 ActionModel.forward()

3. 训练目标

采用噪声预测均方误差:

L = E[x₀,t,ε] ||ε−ε̂θ(x_t,t,c)||²

对应 loss()。随机抽一个 t 就能训练,不需要在一次训练中执行完整去噪链。

4. 推理

从纯噪声开始:

x_K~N(0,I)

反复执行:

x_K → x_(K−1) → ... → x₀

每一步 DiT 都根据当前含噪动作、时刻和 VLM 条件预测噪声,再由调度器更新动作。最终一次生成整个 [T,D] 动作块。StarVLA 默认扩散训练步数为 100,并提供 create_ddim() 构造约 10 步的 DDIM 快速采样器。

5. 简单例子

目标是预测未来 8 帧、每帧 7 维动作:

训练:真实动作 [B,8,7]
 → 随机加噪
 → 含噪动作 [B,8,7]
 + VLM 条件 [B,L,H]
 + 时刻 t
 → DiT
 → 预测噪声 [B,8,7]
 → 与真实噪声计算 MSE

推理:随机噪声 [B,8,7]
 → DiT/DDIM 多步去噪
 → 连续动作 [B,8,7]

6. 与 MLP、FAST 的区别

  • MLP/OFT:一次直接回归,速度最快,但容易产生平均动作。
  • FAST:动作离散化后逐 token 生成,训练简单,但有量化误差和自回归延迟。
  • DiT 扩散:连续空间、多步生成,能表达多种合理轨迹且没有离散量化误差,但推理需要多次网络前向。

DiT 特别适合存在多解的任务。例如绕过障碍物时,“从左绕”和“从右绕”都合理;扩散模型可以从不同初始噪声采样出不同完整轨迹,而普通 L1 回归可能输出两条轨迹之间的不安全平均路线。

7.PI / Flow Matching 

PI 一般指 π₀ 系列使用的“VLM + Flow Matching 动作专家”方案。VLM 理解图像和指令;动作专家生成连续动作块。

1. 构造噪声到动作的路径

真实动作块记为 x₁∈R^(T×D),采样高斯噪声:

x₀~N(0,I)

选择时间 t∈[0,1],用线性插值构造中间状态:

x_t=(1−t)x₀+t x₁

其中 t=0 是纯噪声,t=1 是真实动作。该实现位于 forward()

2. 目标速度场

对路径求导:

dx_t/dt=x₁−x₀=v*

动作专家接收当前轨迹、时间与视觉语言条件 c,预测速度:

v̂θ(x_t,t,c)

训练目标为:

L_FM=E||v̂θ(x_t,t,c)−(x₁−x₀)||²

StarVLA 中目标速度构造见 LayerwiseFM_ActionHeader.py,MSE 见 LayerwiseFM_ActionHeader.py

3. 条件动作专家

动作专家通常使用 DiT:

当前含噪动作 x_t
+ 时间嵌入 t
+ 可选机器人状态
+ VLM 多层视觉语言特征
→ 条件 DiT
→ 速度场 v̂

它同时建模动作序列内部的时间关系,并通过交叉注意力读取 VLM 条件。StarVLA 的条件 DiT 调用见 LayerwiseFM_ActionHeader.py

4. 推理:求解 ODE

从随机噪声开始:

x(0)~N(0,I)

求解常微分方程:

dx/dt=v̂θ(x,t,c)

最简单的 Euler 更新为:

x_(k+1)=x_k+Δt·v̂θ(x_k,t_k,c)

迭代到 t=1 得到连续动作块。StarVLA 的完整过程在 predict_action(),Euler 更新位于 LayerwiseFM_ActionHeader.py

5. 示例

预测未来 8 帧、每帧 7 维动作:

训练:真实动作 x₁ [B,8,7] + 噪声 x₀ [B,8,7]
 → 随机选 t
 → 得到 x_t
 → DiT 预测速度
 → 对比目标 x₁−x₀

推理:噪声 [B,8,7]
 → 速度更新 1
 → 速度更新 2
 → ...
 → 动作 [B,8,7]

6. 与扩散模型的区别

  • 扩散:定义随机加噪过程,常预测噪声或 score,并按噪声调度反向去噪。
  • Flow Matching:直接学习概率路径上的确定性速度场,再通过 ODE 积分生成样本。
  • 两者都能表达多模态连续动作,也都需要多步推理;Flow Matching 的目标与采样路径通常更直接,较少步骤也可能获得良好结果。

与 MLP 相比,PI/Flow Matching 不会简单平均多种合理动作;与 FAST 相比,它在连续空间生成,没有动作量化误差,但需要多次动作专家前向。

8.GR00T / 双系统

GR00T 将策略拆成两个协同部分:

System 2:视觉语言骨干
图像 + 指令 → 场景理解、目标推理、语义特征

System 1:连续动作专家
语义特征 + 本体状态 + 含噪动作 → 高频动作块

“快慢双系统”主要是功能类比:System 2 负责高层语义,System 1 负责低层运动生成;不一定意味着代码中按两个固定频率独立运行。

1. System 2:高层语义条件

VLM 将图像和语言编码为:

C=VLM(I,L)∈R^(N×H)

这些特征表达物体、空间关系、任务意图等,不直接作为电机指令。StarVLA 在 Qwen_GR00T.forward() 中提取 Qwen 最后一层隐藏状态,在 QwenGR00T.py 得到 last_hidden

2. System 1:Flow Matching 动作专家

真实动作块为 a,高斯噪声为 ε

x_t=(1−t)ε+t·a

目标速度:

v*=a−ε

条件 DiT 预测:

v̂θ(x_t,t | C,s,e)

其中 s 是机器人关节等本体状态,e 是机器人形态或类别信息。损失为:

L=E||v̂θ−(a−ε)||²

StarVLA 的路径与目标速度位于 FlowmatchingActionHead.forward(),损失位于 GR00T_ActionHeader.py

3. 两系统如何融合

动作专家内部包含三类 token:

机器人状态 token
+ 未来规划 token
+ 当前含噪动作 token

DiT 通过 self-attention 建模动作时序,再通过 cross-attention 读取 System 2 的视觉语言特征:

ActionExpert(x_t,t,s) ←CrossAttention→ VLM(I,L)

对应 FlowmatchingActionHead 和条件融合位置 GR00T_ActionHeader.py

4. 推理过程

从完整动作块噪声开始:

x₀~N(0,I)

循环预测速度并积分:

x_(k+1)=x_k+Δt·v̂θ(x_k,t_k|C,s,e)

最终得到 [B,T,D] 连续动作块。StarVLA 的采样入口是 predict_action(),Euler 更新位于 GR00T_ActionHeader.py

5. 多机器人统一

GR00T 的重要目标是跨 embodiment:不同机器人具有不同关节数、动作含义和控制方式。可通过:

  • 统一最大动作维度并使用 mask;
  • 机器人类别嵌入;
  • 类别专属输入/输出投影;
  • 共享中间动作语义空间。

StarVLA 提供类别专属层 CategorySpecificLinear 和多形态编码器 MultiEmbodimentActionEncoder

6. 示例

输入“用右手拿起红杯子”:

System 2:识别红杯、右手、抓取意图及空间关系
      ↓ 语义特征 C
System 1:结合当前关节状态,从噪声生成
      ↓
未来 16 帧 × 7 维连续动作

7. 与 PI 的关系

两者都可采用 Flow Matching 动作专家。主要差异不在基础公式,而在系统设计:GR00T 更强调通用机器人基础模型、多机器人形态适配以及显式的视觉语言推理层与动作专家分工;PI/π₀ 更常用于概括 Physical Intelligence 的 VLM + Flow Matching 策略路线。StarVLA 中 GR00T 是这一思想的可组合实现,并不等同于 NVIDIA 官方完整 GR00T 训练系统。


非双系统的 VLM 和 Action Head 是紧耦合的。

VLM负责:

  1. 看懂环境
  2. 理解任务
  3. 提取动作相关信息

然后交给动作头。


双系统VLM输出不再直接面向动作。

它输出:高层认知结果

例如:

输入:

拿起桌上的红色杯子

以前:

可能输出:

action token

或者

action feature

GR00T:

输出:

目标:

grasp cup


对象:

red cup


位置:

table


约束:

avoid obstacle


任务阶段:

reach → grasp → lift

9.EgoVLA:双手专用轨迹解码

核心是 TransformerSplitActV2.forward()

  1. 将动作查询从 [B·T,H] 还原为 [B,T,H]
  2. 可把位置、旋转、指尖本体状态投影为 token,拼入查询序列。
  3. 将 VLM memory 与动作查询共同送入 Transformer,使动作查询获得视觉语言条件。
  4. 偶数查询输出左手,奇数查询输出右手: [ A_L=f_L(H_{0,2,4...}),\quad A_R=f_R(H_{1,3,5...}) ]
  5. 每只手 24 维:3 平移 + 6D 旋转 + 15 手部姿态;双手共 48 维。

它是确定性连续轨迹回归,优势是左右手结构先验明确;不足是任务和动作格式较专用。

VLA Adapter:逐层轻量条件融合

入口是 predict_action()。它初始化每个未来时刻的可学习动作块查询,再经过 24 层残差注意力模块,同时融合:

  • 动作查询特征 h_a
  • 视觉任务特征 h_t
  • 本体状态 p
  • 动作块自身特征 x

基本注意力可写为: [ Y=\operatorname{softmax}(Q_x[K_x,K_t,gK_a]^T/\sqrt d)[V_x,V_t,V_a] ] 其中可学习门控 g=tanh(α) 控制条件注入强度。Pro 版本还加入 RoPE 和独立的视觉、Adapter 投影,见 MLPResNetBlock_Pro.forward()。最后直接输出 [B,T,D] 连续动作并以 L1 训练。

区别:EgoVLA 强调双手结构化解码;VLA Adapter 强调从 VLM 多层特征中逐层提取并融合控制信息。两者都不是扩散或 Flow Matching,无需迭代采样,推理通常更快,但多模态动作表达能力弱于生成式动作头。

10.StarVLA中的framework

10.1 VLM4A:Vision-Language Model for Action

输入通常为图像、语言、状态;VLM负责视觉语言对齐,动作头负责控制:

图像+指令 → VLM token特征 → 动作查询/动作专家 → [B,T,D]

例如 Qwenvl_OFT.forward() 插入动作 token,从Qwen隐藏状态提取查询,再以MLP和L1预测动作。该类还覆盖FAST、PI/Flow Matching、GR00T、Adapter、EgoVLA等。

优点:语义理解、开放词汇和任务泛化强。缺点:模型大、延迟和训练成本高。

10.2 VM4A:Vision Model for Action

这里不是VLM,而是传统视觉策略;目前主要是ACT和Diffusion Policy:

图像+机器人状态 → CNN/策略编码器 → 动作块

ACT.forward() 使用LeRobot ACT;DiffusionPolicy.forward() 使用ResNet18、条件1D UNet和DDPM。

优点:结构紧凑、闭集任务高效。缺点:基本不理解自然语言,跨任务迁移弱。

10.3 WM4A:World Model for Action

以视频/物理推理世界模型替代普通VLM骨干:

图像/视频+指令 → 时空世界特征 → OFT/PI/GR00T动作头

CosmoPredict2_OFT.forward() 提取世界模型隐藏状态,经池化生成动作查询并做L1回归。当前组合包括CosmoPredict2或Wan与OFT、PI、GR00T。

优点:时序动态和物理预测潜力更强。缺点:计算最重,且“世界模型特征更丰富”不等于当前框架显式预测未来视频。

选择原则:语言泛化选VLM4A;固定任务和低成本选VM4A;强调动态、物理与长时序建模选WM4A。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐