X-VLA 模型架构
1. 整体架构概览
X-VLA (Extended Vision-Language-Action) 是一个基于扩散的跨具身视觉-语言-动作模型,将 Florence2 视觉语言模型作为感知主干网络,配合软提示 Transformer (SoftPromptedTransformer) 动作头进行机器人动作预测。其核心设计思路为:Florence2 的 Vision Tower 和 BART 编码器提取多模态特征(移除 BART 解码器以降低计算量),再通过域感知线性层 (DomainAwareLinear) 实现多机器人具身支持,最终以扩散去噪方式生成动作序列。模型支持多视角图像输入、多种动作空间(ee6d / joint / auto 等),并通过可学习的软提示 token 实现域特定的知识注入。
(pixel_values)
[B, num_views, C, H, W]"] TXT["语言指令
(input_ids)
[B, seq_len]"] STATE["本体感受状态
(proprio)
[B, state_dim]"] DID["域 ID
(domain_id)
[B]"] end subgraph VLM["Florence2 视觉语言模型 (VLM)"] VT["DaViT Vision Tower
图像编码"] PROJ["多模态投影层"] BART_ENC["BART 编码器
文本-图像融合"] BART_DEC["BART 解码器
❌ 已移除"] end subgraph ActionHead["SoftPromptedTransformer 动作头"] TE["时间步编码器
(正弦编码)"] AE["DomainAwareLinear
(动作编码器)"] VLP["VLM 投影层"] AUXP["辅助视觉投影层"] SP["软提示 Hub
(num_domains x 32 tokens)"] BLOCKS["24层 TransformerBlock
(Pre-LN, MHSA + MLP)"] AD["DomainAwareLinear
(动作解码器)"] end subgraph Output["输出"] ACT["预测动作轨迹
[B, chunk_size, action_dim]"] end IMG --> VT VT --> PROJ --> BART_ENC TXT --> BART_ENC BART_ENC -->|"vlm_features
[B, T_vlm, D]"| VLP BART_ENC -->|"aux_visual_inputs
[B, T_aux, D]"| AUXP STATE --> AE DID --> AE DID --> SP DID --> AD TE --> AE VLP -->|"投影特征"| BLOCKS AUXP -->|"辅助视觉特征"| BLOCKS AE -->|"动作 token"| BLOCKS SP -->|"32个软提示 token"| BLOCKS BLOCKS --> AD --> ACT style Input fill:#e8f4fd,stroke:#2196F3 style VLM fill:#fff3e0,stroke:#FF9800 style ActionHead fill:#e8f5e9,stroke:#4CAF50 style Output fill:#fce4ec,stroke:#E91E63
2. 核心组件详解
2.1 Florence2 视觉语言模型 (Vision Tower + BART 编码器)
Florence2 作为 X-VLA 的感知主干网络,负责将多视角图像和语言指令编码为统一的多模态特征。X-VLA 仅使用编码器部分,在初始化时显式移除了 BART 的解码器 (lm.model.decoder) 和语言模型头 (lm.lm_head),以节省显存和计算量。
多视角处理流程: 第一个视角图像与文本 token 在 BART 编码器中融合,产生 vlm_features;其余视角图像作为辅助视觉输入 (aux_visual_inputs) 直接传递给 Transformer 动作头。
[B, num_views, C, H, W]"] FLAT["展平 & 掩码过滤
仅处理有效视角"] DAVIT["DaViT 视觉编码器
_encode_image()"] RESHAPE["重塑为
[B, num_views, tokens, D]"] PIX --> FLAT --> DAVIT --> RESHAPE end subgraph TextEnc["BART 文本-图像融合"] IDS["input_ids
[B, seq_len]"] --> EMB["词元嵌入
get_input_embeddings()"] V0["第0视角特征
[B, tokens, D]"] EMB --> MERGE["_merge_input_ids_with_image_features()
图像 token 插入文本序列"] V0 --> MERGE MERGE --> ENC["BART 编码器
language_model.model.encoder"] end subgraph Outputs["输出"] ENC -->|"vlm_features
[B, T_vlm, D]"| OUT1["主视觉语言特征"] AUX["辅助视角特征
[B, (num_views-1)*tokens, D]"] RESHAPE -->|"image_features[:, 1:]"| AUX end RESHAPE -->|"image_features[:, 0]"| V0 style ImageEnc fill:#e3f2fd,stroke:#2196F3 style TextEnc fill:#fff3e0,stroke:#FF9800 style Outputs fill:#e8f5e9,stroke:#4CAF50
关键设计:BART 解码器移除
DaViT"] UPROJ["多模态投影层"] UENC["BART 编码器
输出多模态特征"] UVT --> UPROJ --> UENC end UENC -->|"vlm_features"| XVLA["SoftPromptedTransformer"] style Full fill:#ffebee,stroke:#f44336 style Used fill:#e8f5e9,stroke:#4CAF50
移除逻辑 (见
modeling_xvla.py:79-84):python if hasattr(self.vlm, "language_model"): lm = self.vlm.language_model if hasattr(lm, "model") and hasattr(lm.model, "decoder"): del lm.model.decoder if hasattr(lm, "lm_head"): del lm.lm_head
冻结策略:
| 组件 | 默认状态 | 配置项 |
|---|---|---|
| Vision Tower | 可配置冻结 | freeze_vision_encoder (默认 False) |
| BART 编码器 | 可配置冻结 | freeze_language_encoder (默认 False) |
| BART 解码器 | 已删除 | N/A |
| LM Head | 已删除 | N/A |
2.2 SoftPromptedTransformer (软提示 Transformer)
SoftPromptedTransformer 是 X-VLA 的核心动作生成模块。它接收 VLM 特征、辅助视觉特征、含噪动作、本体感受状态和时间步信息,通过 24 层标准 Transformer 块进行处理,最终解码出预测动作。
核心特色: 每个域 (embodiment) 拥有独立的 32 个可学习软提示 token,通过 nn.Embedding(num_domains, len_soft_prompts * hidden_size) 存储,在前向传播时按 domain_id 索引并拼接到序列末尾。
[B, T, dim_action]"] PROP["本体感受
[B, dim_propio]"] TIME["时间步 t
[B]"] TIME --> TE["正弦时间步编码
timestep_embedding()"] TE -->|"[B, dim_time]"| EXPAND_T["扩展至
[B, T, dim_time]"] PROP --> EXPAND_P["扩展至
[B, T, dim_propio]"] ACT_N --> CAT_IN["Concat
[action, proprio, time]
[B, T, dim_action+dim_propio+dim_time]"] EXPAND_T --> CAT_IN EXPAND_P --> CAT_IN end subgraph Encode["动作编码 (DomainAwareLinear)"] CAT_IN --> AE["action_encoder
DomainAwareLinear"] DID1["domain_id"] --> AE AE -->|"[B, T, hidden_size]"| ACT_TOK["动作 token"] end subgraph VisualProj["视觉投影"] VLM_F["vlm_features
[B, T_vlm, D]"] --> VP["vlm_proj
(Linear 或 DomainAwareLinear)"] AUX_F["aux_visual_inputs
[B, T_aux, D]"] --> AP["aux_visual_proj
(Linear 或 DomainAwareLinear)"] end subgraph SeqBuild["序列构建"] ACT_TOK --> CONCAT["Concat 所有 token"] VP --> CONCAT AP --> CONCAT CONCAT -->|"[B, T+T_vlm+T_aux, H]"| POS["+ 位置编码
pos_emb[:, :seq_len]"] POS --> SOFT["拼接软提示 token
[B, 32, hidden_size]"] DID2["domain_id"] --> SOFT end subgraph TransBlocks["24层 TransformerBlock"] SOFT --> B0["Block 0: LN->MHSA->残差->LN->MLP->残差"] B0 --> B1["Block 1"] B1 --> DOTS["..."] DOTS --> B23["Block 23"] end subgraph Decode["动作解码"] B23 --> NORM["LayerNorm"] NORM --> SLICE["取前 T 个 token
x[:, :num_actions]"] SLICE --> ADEC["action_decoder
DomainAwareLinear"] DID3["domain_id"] --> ADEC ADEC -->|"[B, T, dim_action]"| OUT["预测动作"] end style InputPrep fill:#e3f2fd,stroke:#2196F3 style Encode fill:#f3e5f5,stroke:#9C27B0 style VisualProj fill:#fff3e0,stroke:#FF9800 style SeqBuild fill:#e0f7fa,stroke:#00BCD4 style TransBlocks fill:#e8f5e9,stroke:#4CAF50 style Decode fill:#fce4ec,stroke:#E91E63
序列拼接顺序
[T 个]"] S2["VLM 特征 token
[T_vlm 个]"] S3["辅助视觉 token
[T_aux 个]"] S4["软提示 token
[32 个]"] S1 --> S2 --> S3 --> S4 end subgraph Output["输出提取"] ONLY["仅解码前 T 个 token
(动作位置)"] end S1 -.->|"action_decoder"| ONLY style Sequence fill:#e8f4fd,stroke:#2196F3 style Output fill:#fce4ec,stroke:#E91E63
设计要点: 软提示 token 拼接在序列末尾,但最终只解码序列开头的动作 token 位置。这使得软提示通过注意力机制间接影响动作预测,而非直接参与解码。
单个 TransformerBlock (Pre-LN)
[B, T, H]"] --> LN1["LayerNorm"] LN1 --> MHSA["多头自注意力
(16 heads, head_dim=64)
支持 Flash Attention"] MHSA --> ADD1["+ 残差连接"] IN --> ADD1 ADD1 --> LN2["LayerNorm"] LN2 --> MLP["MLP
Linear(H, 4H) -> GELU -> Dropout(0.1)
-> Linear(4H, H) -> Dropout(0.1)"] MLP --> ADD2["+ 残差连接"] ADD1 --> ADD2 ADD2 --> OUT["输出
[B, T, H]"] style IN fill:#e3f2fd,stroke:#2196F3 style OUT fill:#e8f5e9,stroke:#4CAF50
2.3 DomainAwareLinear (域感知线性层)
DomainAwareLinear 是 X-VLA 实现多具身支持的核心机制。每个域 (embodiment) 拥有独立的权重矩阵和偏置向量,通过 nn.Embedding 存储,在前向传播时按样本级别的 domain_id 索引选择对应的权重进行计算。
每个域一个完整权重矩阵"] B["bias: Embedding(num_domains, output_size)
每个域一个偏置向量"] end subgraph Forward["前向传播"] X["输入 x
[B, T, input_size]"] DID["domain_id
[B]"] DID --> IDX["索引选择"] W --> IDX B --> IDX IDX -->|"weight [B, I, O]"| BMM["批量矩阵乘法
y = matmul(x, weight) + bias"] IDX -->|"bias [B, O]"| BMM X --> BMM BMM --> OUT["输出
[B, T, output_size]"] end subgraph Usage["在 X-VLA 中的使用位置"] U1["action_encoder:
DomainAwareLinear(action+propio+time, hidden_size)"] U2["action_decoder:
DomainAwareLinear(hidden_size, dim_action)"] U3["soft_prompt_hub:
Embedding(num_domains, 32*hidden_size)"] U4["vlm_proj (可选):
DomainAwareLinear(multi_modal_dim, hidden_size)"] end style WeightStore fill:#fff3e0,stroke:#FF9800 style Forward fill:#e8f5e9,stroke:#4CAF50 style Usage fill:#e3f2fd,stroke:#2196F3
与 GR00T 的 CategorySpecificLinear 对比: 两者设计思路一致——通过 Embedding 存储多组权重,按 embodiment ID 索引选择。X-VLA 的 DomainAwareLinear 支持 2D 和 3D 输入(自动 squeeze/unsqueeze),且使用 Xavier 均匀初始化权重、零初始化偏置。
2.4 动作空间管理器 (ActionSpace Registry)
X-VLA 通过注册表模式管理多种动作空间,每种动作空间定义了维度、损失计算、预处理和后处理逻辑。
动作维度"] I2["gripper_idx: tuple
夹爪通道索引"] I3["compute_loss(pred, target)
-> dict[str, Tensor]"] I4["preprocess(proprio, action)
-> (proprio, action)"] I5["postprocess(action)
-> action"] end Registry --> Builder Builder --> Interface style Registry fill:#f3e5f5,stroke:#9C27B0 style Builder fill:#e0f7fa,stroke:#00BCD4 style Interface fill:#e8f5e9,stroke:#4CAF50
3. 训练流水线
训练时,模型使用扩散过程(Flow Matching)对动作进行加噪和去噪预测。时间步 t 在 [0, 1) 范围内均匀采样(带批次内偏移以增强多样性),含噪动作通过线性插值生成。
多视角图像堆叠 + 填充"] BATCH --> STATE_P["_prepare_state()
本体感受状态填充"] BATCH --> ACT_P["_prepare_action_targets()
动作目标填充至 chunk_size"] BATCH --> LANG["input_ids
语言 token"] BATCH --> DID_P["_get_domain_id()
域 ID"] end subgraph VLMEnc["VLM 编码"] IMG_P --> FWD_VLM["forward_vlm()"] LANG --> FWD_VLM FWD_VLM -->|"vlm_features"| ENC_OUT["编码输出"] FWD_VLM -->|"aux_visual_inputs"| ENC_OUT end subgraph Diffusion["扩散加噪"] direction TB T_SAMPLE["时间步采样
t = (rand(1) + arange(B)/B) % (1-1e-5)
均匀分布, 批次内偏移"] ACT_GT["真实动作
[B, chunk_size, dim_action]"] NOISE["高斯噪声
randn_like(action)"] T_SAMPLE --> INTERP["线性插值
action_noisy = noise * t + action * (1-t)"] ACT_GT --> INTERP NOISE --> INTERP INTERP --> PREPROC["action_space.preprocess()
预处理 (如清零夹爪通道)"] end subgraph TransFwd["Transformer 前向"] ENC_OUT --> TRANS["SoftPromptedTransformer"] PREPROC -->|"action_noisy_m"| TRANS STATE_P -->|"proprio_m"| TRANS DID_P --> TRANS T_SAMPLE -->|"t"| TRANS TRANS -->|"pred_action
[B, chunk_size, dim_action]"| PRED["预测动作"] end subgraph LossCalc["分通道损失计算 (ee6d 模式)"] PRED --> LOSS_POS["Position MSE
XYZ 通道 * 500"] PRED --> LOSS_ROT["Rotation MSE
6D旋转通道 * 10"] PRED --> LOSS_GRIP["Gripper BCE
夹爪通道 * 1"] ACT_GT --> LOSS_POS ACT_GT --> LOSS_ROT ACT_GT --> LOSS_GRIP LOSS_POS --> TOTAL["total_loss =
position_loss + rotate6D_loss + gripper_loss"] LOSS_ROT --> TOTAL LOSS_GRIP --> TOTAL end style DataPrep fill:#e3f2fd,stroke:#2196F3 style VLMEnc fill:#fff3e0,stroke:#FF9800 style Diffusion fill:#f3e5f5,stroke:#9C27B0 style TransFwd fill:#e8f5e9,stroke:#4CAF50 style LossCalc fill:#fce4ec,stroke:#E91E63
扩散加噪公式
t ~ Uniform[0, 1) (带批次内偏移)
noise ~ N(0, I)
action_noisy = noise * t + action_gt * (1 - t)
模型预测的目标是直接预测去噪后的动作(而非预测噪声或速度),损失计算在原始动作空间中进行。
4. 推理流水线
推理时,模型从纯随机噪声出发,通过迭代去噪逐步恢复动作轨迹。默认使用 10 步去噪。
~ N(0, I)
[B, 32, dim_action]"] A0["初始动作 = 0
[B, 32, dim_action]"] S["去噪步数 = 10"] end subgraph VLMOnce["VLM 编码 (仅一次)"] IMG["图像"] --> VLM["forward_vlm()"] TXT["文本"] --> VLM VLM --> ENC["vlm_features
aux_visual_inputs"] end subgraph Loop["迭代去噪循环 (10步)"] direction TB STEP10["步骤 10: t=1.0
x_t = x1*1.0 + action*0.0 = x1
-> Transformer -> action"] STEP9["步骤 9: t=0.9
x_t = x1*0.9 + action*0.1
-> Transformer -> action"] STEP8["步骤 8: t=0.8
x_t = x1*0.8 + action*0.2
-> Transformer -> action"] DOTS["..."] STEP1["步骤 1: t=0.1
x_t = x1*0.1 + action*0.9
-> Transformer -> action"] STEP10 --> STEP9 --> STEP8 --> DOTS --> STEP1 end subgraph Post["后处理"] STEP1 --> PP["action_space.postprocess()
(如 sigmoid 夹爪)"] PP --> FINAL["最终动作轨迹
[B, 32, action_dim]"] end Init --> STEP10 ENC --> Loop style Init fill:#e3f2fd,stroke:#2196F3 style VLMOnce fill:#fff3e0,stroke:#FF9800 style Loop fill:#e8f5e9,stroke:#4CAF50 style Post fill:#fce4ec,stroke:#E91E63
单步去噪展开
[B, num_views, C, H, W]"] FLAT["展平 & 掩码过滤
仅处理有效视角"] DAVIT["DaViT 视觉编码器
_encode_image()"] RESHAPE["重塑为
[B, num_views, tokens, D]"] PIX --> FLAT --> DAVIT --> RESHAPE end subgraph TextEnc["BART 文本-图像融合"] IDS["input_ids
[B, seq_len]"] --> EMB["词元嵌入
get_input_embeddings()"] V0["第0视角特征
[B, tokens, D]"] EMB --> MERGE["_merge_input_ids_with_image_features()
图像 token 插入文本序列"] V0 --> MERGE MERGE --> ENC["BART 编码器
language_model.model.encoder"] end subgraph Outputs["输出"] ENC -->|"vlm_features
[B, T_vlm, D]"| OUT1["主视觉语言特征"] AUX["辅助视角特征
[B, (num_views-1)*tokens, D]"] RESHAPE -->|"image_features[:, 1:]"| AUX end RESHAPE -->|"image_features[:, 0]"| V0 style ImageEnc fill:#e3f2fd,stroke:#2196F3 style TextEnc fill:#fff3e0,stroke:#FF9800 style Outputs fill:#e8f5e9,stroke:#4CAF50
与 GR00T 的区别: GR00T 使用欧拉积分 (
action += dt * v) 逐步更新动作;X-VLA 则在每一步直接用模型输出替换 action,下一步再以新的 action 与噪声插值。两者都属于 Flow Matching 框架,但积分方式不同。
动作选择策略 (Action Chunking)
[B, num_views, C, H, W]"] FLAT["展平 & 掩码过滤
仅处理有效视角"] DAVIT["DaViT 视觉编码器
_encode_image()"] RESHAPE["重塑为
[B, num_views, tokens, D]"] PIX --> FLAT --> DAVIT --> RESHAPE end subgraph TextEnc["BART 文本-图像融合"] IDS["input_ids
[B, seq_len]"] --> EMB["词元嵌入
get_input_embeddings()"] V0["第0视角特征
[B, tokens, D]"] EMB --> MERGE["_merge_input_ids_with_image_features()
图像 token 插入文本序列"] V0 --> MERGE MERGE --> ENC["BART 编码器
language_model.model.encoder"] end subgraph Outputs["输出"] ENC -->|"vlm_features
[B, T_vlm, D]"| OUT1["主视觉语言特征"] AUX["辅助视角特征
[B, (num_views-1)*tokens, D]"] RESHAPE -->|"image_features[:, 1:]"| AUX end RESHAPE -->|"image_features[:, 0]"| V0 style ImageEnc fill:#e3f2fd,stroke:#2196F3 style TextEnc fill:#fff3e0,stroke:#FF9800 style Outputs fill:#e8f5e9,stroke:#4CAF50
5. 动作空间详解
各模式对比
| 动作空间 | 维度 | 布局 | 夹爪索引 | 损失函数 | 适用场景 |
|---|---|---|---|---|---|
| ee6d | 20D | [XYZ(3)+Rot6D(6)+Gripper(1)] x2 臂 | (9, 19) | Pos MSE500 + Rot MSE10 + Grip BCE*1 | 末端执行器双臂 |
| joint | 14D | [Joints(6)+Gripper(1)] x2 臂 | (6, 13) | Joints MSE1 + Grip BCE0.1 | 关节空间双臂 |
| auto | 可配置 | 前 real_dim 维有效, 填充至 max_dim | 无 | MSE*1 (仅前 real_dim 维) | 任意维度自适应 |
| agibot_ee6d | 20D | 同 ee6d | (9, 19) | Pos MSE500 + Rot MSE10 + Grip MSE*10 | AGI-Bot (全 MSE) |
| franka_joint7 | 20D (实际7D) | 7关节 + 13维填充 | 无 | MSE*1 (仅前7维) | Franka Panda |
| so101_bimanual | 20D (实际12D) | [5关节+Gripper] x2 + 8维填充 | (5, 11) | MSE1 + Grip MSE1 | SO-101 双臂 |
ee6d 动作布局 (20D)
[B, num_views, C, H, W]"] FLAT["展平 & 掩码过滤
仅处理有效视角"] DAVIT["DaViT 视觉编码器
_encode_image()"] RESHAPE["重塑为
[B, num_views, tokens, D]"] PIX --> FLAT --> DAVIT --> RESHAPE end subgraph TextEnc["BART 文本-图像融合"] IDS["input_ids
[B, seq_len]"] --> EMB["词元嵌入
get_input_embeddings()"] V0["第0视角特征
[B, tokens, D]"] EMB --> MERGE["_merge_input_ids_with_image_features()
图像 token 插入文本序列"] V0 --> MERGE MERGE --> ENC["BART 编码器
language_model.model.encoder"] end subgraph Outputs["输出"] ENC -->|"vlm_features
[B, T_vlm, D]"| OUT1["主视觉语言特征"] AUX["辅助视角特征
[B, (num_views-1)*tokens, D]"] RESHAPE -->|"image_features[:, 1:]"| AUX end RESHAPE -->|"image_features[:, 0]"| V0 style ImageEnc fill:#e3f2fd,stroke:#2196F3 style TextEnc fill:#fff3e0,stroke:#FF9800 style Outputs fill:#e8f5e9,stroke:#4CAF50
预处理与后处理
[B, num_views, C, H, W]"] FLAT["展平 & 掩码过滤
仅处理有效视角"] DAVIT["DaViT 视觉编码器
_encode_image()"] RESHAPE["重塑为
[B, num_views, tokens, D]"] PIX --> FLAT --> DAVIT --> RESHAPE end subgraph TextEnc["BART 文本-图像融合"] IDS["input_ids
[B, seq_len]"] --> EMB["词元嵌入
get_input_embeddings()"] V0["第0视角特征
[B, tokens, D]"] EMB --> MERGE["_merge_input_ids_with_image_features()
图像 token 插入文本序列"] V0 --> MERGE MERGE --> ENC["BART 编码器
language_model.model.encoder"] end subgraph Outputs["输出"] ENC -->|"vlm_features
[B, T_vlm, D]"| OUT1["主视觉语言特征"] AUX["辅助视角特征
[B, (num_views-1)*tokens, D]"] RESHAPE -->|"image_features[:, 1:]"| AUX end RESHAPE -->|"image_features[:, 0]"| V0 style ImageEnc fill:#e3f2fd,stroke:#2196F3 style TextEnc fill:#fff3e0,stroke:#FF9800 style Outputs fill:#e8f5e9,stroke:#4CAF50
6. 关键超参数表
| 参数 | 默认值 | 说明 |
|---|---|---|
hidden_size |
1024 | Transformer 隐藏层维度 |
depth |
24 | Transformer 层数 |
num_heads |
16 | 注意力头数 (head_dim = 64) |
mlp_ratio |
4.0 | MLP 隐藏层倍数 (MLP dim = 4096) |
chunk_size |
32 | 预测的未来动作步数 |
n_action_steps |
32 | 每次推理使用的动作步数 |
num_denoising_steps |
10 | 推理时去噪步数 |
num_domains |
30 | 最大支持的机器人域数量 |
len_soft_prompts |
32 | 每个域的可学习软提示 token 数 |
dim_time |
32 | 时间步嵌入维度 |
max_len_seq |
512 | 最大序列长度 (位置编码) |
max_state_dim |
32 | 最大本体感受状态维度 |
max_action_dim |
20 | 最大动作维度 (auto 模式填充目标) |
action_mode |
"ee6d" | 动作空间模式 |
dtype |
"float32" | 模型精度 ("bfloat16" / "float32") |
tokenizer_name |
"facebook/bart-large" | 语言分词器 |
tokenizer_max_length |
64 | 最大文本 token 长度 |
use_proprio |
True | 是否使用本体感受状态 |
use_hetero_proj |
False | 是否使用域感知视觉投影 |
optimizer_lr |
1e-4 | 基础学习率 |
optimizer_grad_clip_norm |
10.0 | 梯度裁剪范数 |
scheduler_warmup_steps |
1,000 | 学习率预热步数 |
scheduler_decay_steps |
30,000 | 余弦衰减总步数 |
Attention dropout |
0.1 | 注意力 Dropout 率 |
MLP dropout |
0.1 | MLP Dropout 率 |
优化器配置
X-VLA 使用差分学习率策略:
| 参数组 | 学习率 | 说明 |
|---|---|---|
| VLM 参数 (vision + language) | lr * 0.1 |
1/10 基础学习率, 稳定优化 |
| Transformer / 动作头 | lr |
完整学习率 |
| 软提示 | lr * soft_prompt_lr_scale |
可配置缩放, 支持独立 warmup |
7. 关键源文件表
| 组件 | 类名 | 文件路径 |
|---|---|---|
| 主模型 | XVLAModel |
lerobot/policies/xvla/modeling_xvla.py:43 |
| LeRobot 策略封装 | XVLAPolicy |
lerobot/policies/xvla/modeling_xvla.py:271 |
| 模型配置 | XVLAConfig |
lerobot/policies/xvla/configuration_xvla.py:41 |
| 软提示 Transformer | SoftPromptedTransformer |
lerobot/policies/xvla/soft_transformer.py:292 |
| Transformer 模块 | TransformerBlock |
lerobot/policies/xvla/soft_transformer.py:258 |
| 多头自注意力 | Attention |
lerobot/policies/xvla/soft_transformer.py:92 |
| 域感知线性层 | DomainAwareLinear |
lerobot/policies/xvla/soft_transformer.py:215 |
| 时间步嵌入 | timestep_embedding() |
lerobot/policies/xvla/soft_transformer.py:183 |
| MLP 模块 | Mlp |
lerobot/policies/xvla/soft_transformer.py:47 |
| 动作空间注册表 | ACTION_REGISTRY |
lerobot/policies/xvla/action_hub.py:27 |
| 动作空间基类 | BaseActionSpace |
lerobot/policies/xvla/action_hub.py:55 |
| ee6d 动作空间 | EE6DActionSpace |
lerobot/policies/xvla/action_hub.py:113 |
| joint 动作空间 | JointActionSpace |
lerobot/policies/xvla/action_hub.py:175 |
| auto 动作空间 | AutoActionSpace |
lerobot/policies/xvla/action_hub.py:345 |
| Florence2 配置 | Florence2Config |
lerobot/policies/xvla/configuration_florence2.py |
| Florence2 模型 | Florence2ForConditionalGeneration |
lerobot/policies/xvla/modeling_florence2.py |