ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

物理AI三大核心模型VLM、VLA与WAM:数学原理与PyTorch实践

物理AI三大核心模型VLM、VLA与WAM:数学原理与PyTorch实践 物理AI这个词最近频繁出现但它不是炒作概念。它要解决的问题非常具体让模型不仅能从图片和文字里提取信息还能理解力、速度、接触、遮挡这些物理量并输出能够在真实环境中执行的连续动作。要承担这种任务单一模型不够需要一组互相配合的组件其中三类模型最核心VLM视觉语言模型、VLA视觉语言动作模型和 WAM世界动作模型。VLM负责看懂世界VLA负责把理解变成动作WAM负责在动作执行前推演后果。下面从数学角度拆解这三类模型的底层逻辑并用最小 PyTorch 示例说明它们各自在做什么、为什么这么设计以及训练和部署时最容易踩的坑。1. 物理AI任务拆解VLM、VLA、WAM 分别承担哪一段1.1 物理AI为什么不能只靠一个大模型物理AI的原始输入很直接摄像头给出像素矩阵关节编码器给出角度力传感器给出力矩语音或文字给出任务指令。输出也很直接电机电流、舵机角度、机械臂关节速度。表面上看这是一个“输入高维观测、输出低维控制”的映射问题用端到端强化学习或行为克隆似乎就够了。但真实物理场景对模型的泛化能力和安全性要求很高。只靠一个端到端网络很难同时处理三件不同性质的事第一理解视觉内容与语义指令之间的关系第二把语义指令映射到机械系统的动作空间第三判断动作执行后环境会怎样变化。这三件事分别对应感知、决策、预测正好对应 VLM、VLA、WAM 三种模型。把模型拆开不是为了让系统更复杂而是为了让每个模块的监督信号更清晰。VLM 用图文数据学习跨模态对齐VLA 用“状态-指令-动作”数据学习策略WAM 用状态转移数据学习物理动态。三者分工之后测试时也能更精确地定位错误是没看懂场景还是动作选错还是预测下一步状态不准。1.2 三种模型以“高维空间映射”统一从数学角度看VLM、VLA、WAM 可以被理解为三类不同的高维空间映射。输入数据和输出数据的形态不同但内部都依赖神经网络构建向量表示并在向量空间里做变换、对齐和优化。模型输入空间输出空间典型数学对象VLM图像像素、文本 token语义特征向量、文本 token 概率分布对比损失、交叉熵VLA图像、文本、机器人状态连续动作向量、动作 token 分布MSE、扩散损失WAM状态、动作、任务目标下一状态、未来状态序列状态转移误差、规划代价这张表可以当作全文的路线图。VLM 解决“文字和图像能不能对齐”VLA 解决“给定观测和指令下一步怎么动”WAM 解决“如果动了这一步环境会变成什么样”。三者不是互斥的强耦合模型而是可以独立训练、联合使用的组件。1.3 物理AI系统的三层分工如果用一个具象流程描述物理AI摄像头先拍到桌面上有杯子语音指令说“把杯子拿到左侧”VLM 需要完成两件事识别杯子在哪理解“左侧”的空间语义。VLA 拿到视觉特征和文本特征生成机械臂末端从当前位置移动到杯子附近的动作序列。在动作真正下发前WAM 会比较“抬手直接抓”和“绕开杯子边缘抓”两条候选轨迹预测哪一条更安全、更接近目标。这就是三层分工VLM 负责从像素到语义VLA 负责从语义到动作WAM 负责从动作到结果预测。理解这一点后再深入各自的数学细节就不会把对比学习、交叉熵、状态转移方程混在一起。2. VLM 的底层数学跨模态对齐、对比损失与自回归生成2.1 模态鸿沟为什么图像特征和文本特征不能直接比较图像经过卷积神经网络后得到的是具有空间结构的特征图文本经过词嵌入后得到的是位置编码后的 token 向量。两类特征分布差异很大直接相加或计算欧氏距离没有意义。VLM 的第一个核心任务就是把图像和文本映射到同一个语义向量空间里让“一只猫的图片”和“cat”这两个不同模态的输入在空间中尽量接近。这个统一空间的维度通常远低于原始像素维度。常见的做法是使用一个视觉编码器 $f_\theta$ 把图片 $x$ 映射为向量 $z_v$使用一个文本编码器 $g_\phi$ 把文本 $y$ 映射为向量 $z_t$。训练目标就是让匹配的图文对满足$$ z_v f_\theta(x), \quad z_t g_\phi(y) $$$$ \text{sim}(z_v, z_t) \gg \text{sim}(z_v, z_t), \quad t \neq t $$其中 $\text{sim}$ 常用余弦相似度。关键是这个相似度不能让两路编码器各自“自由发挥”否则会出现表示坍缩所有图像都映射到同一个点。必须引入对比约束。2.2 对比学习InfoNCE 与温度系数对比学习的思路是让正样本对相似度高、负样本对相似度低。VLM 最常用的损失是 InfoNCE。假设一个 batch 有 $N$ 个图文对第 $i$ 个图像特征与第 $i$ 个文本特征为正样本其余 $N-1$ 个文本都是负样本损失写作$$ L -\frac{1}{N} \sum_{i1}^N \log \frac{\exp(\text{sim}(z_{v_i}, z_{t_i}) / \tau)} {\sum_{j1}^N \exp(\text{sim}(z_{v_i}, z_{t_j}) / \tau)} $$这里 $\tau$ 是温度系数。这个式子可以理解为“把匹配的图文对从 $N$ 个候选中挑出来”的分类任务。温度系数影响分布尖锐程度$\tau$ 较大时所有 logits 被压缩梯度平缓训练稳定但正负样本区分力度弱。$\tau$ 较小时logits 被放大模型会更激进地拉近正样本、推开负样本但容易训练不稳定。实际项目中$\tau$ 通常从 0.01 到 0.1 之间调参。温度退火也是常见技巧。2.3 生成式 VLM把视觉转成 token 再做自回归对比学习只解决“图文特征对齐”的问题还不能生成文字描述或回答复杂问题。生成式 VLM 的做法是把图像也变成序列 token然后用自回归语言模型逐 token 生成文本。给定输入图片 $x$ 和之前已生成的 token $y_1, \dots, y_{t-1}$模型输出下一个 token 的条件概率$$ P(y_t \mid y_1, \dots, y_{t-1}, x) \text{softmax}(W h_t) $$其中 $h_t$ 是语言模型在时间步 $t$ 的隐状态$W$ 是词表映射矩阵。训练时最小化交叉熵$$ L -\sum_{t1}^T \log P(y_t \mid y_{t}, x) $$这里要区分两个层次对比学习对齐向量自回归生成 token。很多开源 VLM 先做图文对比预训练再进行生成式微调两个阶段的数学目标不同不能混为一谈。2.4 最小 PyTorch 示例一个可运行的对比学习骨架下面代码只展示对比学习中最核心的投影头和 InfoNCE 损失。实际 VLM 的视觉编码器和文本编码器通常是大网络这里可以任意替换为 ResNet、ViT、BERT 或 Llama 的 encoder。import torch import torch.nn as nn import torch.nn.functional as F class ProjectionHead(nn.Module): def __init__(self, in_dim, out_dim): super().__init__() self.linear1 nn.Linear(in_dim, out_dim) self.activation nn.GELU() self.linear2 nn.Linear(out_dim, out_dim) def forward(self, x): return self.linear2(self.activation(self.linear1(x))) def info_nce_loss(image_embeds, text_embeds, temperature0.07): # image_embeds, text_embeds: [B, D] image_embeds F.normalize(image_embeds, dim-1) text_embeds F.normalize(text_embeds, dim-1) logits image_embeds text_embeds.T / temperature # [B, B] labels torch.arange(image_embeds.size(0)) return F.cross_entropy(logits, labels)训练时把同一张图片和它对应的文本作为正样本batch 内其他文本作为负样本。logits[i][j]表示第 $i$ 张图片与第 $j$ 条文本的相似度。理想情况下对角线元素应该最大。检查点运行几个 step 后loss应从约 $\log N$ 开始下降对角线 logits 平均值逐渐上升。如果 loss 降不下去先检查样本对是否错位再检查温度系数是否过小导致 NaN。2.5 VLM 常见坑坑现象原因解法正样本对错位Loss 不下降数据预处理时图片和文本没有一一对应打印 batch 中的image_path与text肉眼确认对齐温度系数过小Loss 变成 NaNlogits 数值过大softmax 溢出将 $\tau$ 设为 0.05 以上或添加梯度裁剪图像增强过强对齐效果差裁剪或颜色扰动破坏了物体语义增强强度要控制在能识别物体的范围内3. VLA 的底层数学条件策略、动作 token 与动作回归3.1 从预测下一个 token 到预测下一个动作VLM 输出的最终结果是文本但机械臂需要的是电机角度、关节速度、末端位置这类连续量。VLA 的数学目标是把 VLM 的条件生成能力扩展到动作空间学习一个策略$$ \pi_\theta(a_t \mid o_t, l) $$其中 $o_t$ 是当前视觉观测$l$ 是语言指令$a_t$ 是 $d_a$ 维动作向量。行为克隆BC的训练数据是从真实或仿真轨迹中采样的状态-动作对目标是让模型输出的动作尽量接近专家动作。与 VLM 类似VLA 也需要视觉编码器和文本编码器然后通过一个融合模块把两种特征拼起来再交给动作头。真正复杂的地方在于动作的表示方式连续回归、离散 token 还是扩散策略。3.2 动作表征连续动作、动作 token 与动作分桶动作空间可以是一个连续向量例如机械臂七个关节的目标角度。这个向量适合用回归头输出。但如果存在多模态动作分布比如“从左边绕”和“从右边绕”都能到达目标用单峰高斯回归很难同时拟合两条轨迹模型会输出两者平均的路径动作看起来犹豫不决。另一种做法是把连续动作离散化成 token。根据动作范围划分区间或者用 VQ-VAE 学一个动作码本然后让模型像生成文本一样生成动作 token。RT-2 风格模型就接近这种思路好处是可以复用语言模型的预训练能力缺点是量化误差会让动作不够平滑。扩散策略是第三种方案把动作 $a_t$ 看成从条件分布中采样训练时用 DDPM 的噪声预测损失。三者对比动作表征数学目标优点缺点连续回归MSE实现简单适合低维控制难以表达多模态动作离散 token交叉熵复用语言模型架构量化误差、动作不平滑扩散策略噪声预测 MSE能表达多模态分布采样较慢3.3 损失函数MSE 与交叉熵的边界连续回归的损失是最直接的$$ L_{\text{MSE}} \mathbb{E}{(o_t, l, a_t)} \left[ \left| \pi\theta(o_t, l) - a_t \right|^2 \right] $$但这里有个隐性假设专家动作 $a_t$ 是在当前状态下唯一正确的动作。如果专家轨迹由不同策略混合产生MSE 会让模型学到平均动作导致执行失败。离散动作 token 使用交叉熵。假设动作用 $K$ 个 token 表示每个 token 有 $V$ 个候选值则损失为$$ L_{\text{CE}} -\sum_{k1}^K \log p_\theta(\text{token}k \mid o_t, l, \text{token}{k}) $$扩散策略的损失是$$ L_{\text{diff}} \mathbb{E}{t, \epsilon} \left[ \left| \epsilon - \epsilon\theta(a_t^0 \sigma_t \epsilon, o_t, l, t) \right|^2 \right] $$实际选型时可以先从连续回归开始因为它最容易调试。当模型动作出现“取平均”或“抖动”时再切换到离散 token 或扩散策略。3.4 一个极简 VLA 训练管线下面代码演示一个极简 VLA用视觉特征和文本特征拼接后输出动作。这里不实现完整视觉 encoder只关注“融合动作头”这一段。import torch import torch.nn as nn import torch.nn.functional as F class MinimalVLA(nn.Module): def __init__(self, vision_dim, text_dim, action_dim, hidden_dim256): super().__init__() self.fusion nn.Sequential( nn.Linear(vision_dim text_dim, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, hidden_dim), ) self.action_head nn.Linear(hidden_dim, action_dim) def forward(self, vision_feat, text_feat, action_targetNone): fused self.fusion(torch.cat([vision_feat, text_feat], dim-1)) action_pred self.action_head(fused) if action_target is not None: loss F.mse_loss(action_pred, action_target) return action_pred, loss return action_pred训练循环的关键是先把图像和文本通过各自的 encoder 得到特征再输入MinimalVLA。动作目标要提前做归一化到 $[-1,1]$否则不同动作维度量纲不一致MSE 会被大数值维度主导。3.5 VLA 常见坑坑现象原因解法动作空间未归一化训练 loss 很大动作输出超出物理边界关节角度是角度制末端坐标是米制量纲差异大记录每个动作维度 min/max归一化到 $[-1,1]$推理时反归一化多模态动作取平均机械臂从两个可行路径中间穿过单峰 MSE 无法表达多模态分布改用离散 token 或扩散策略训练与测试动作误差累积每一步动作偏差小最终轨迹偏离大训练时用单一动作预测没有考虑闭环推理时使用 replanning每执行几步重新预测4. WAM 的底层数学隐空间动力学、联合嵌入与规划4.1 WAM 要解决什么问题WAM 在本文中特指 World Action Model也就是面向动作决策的世界模型。它的目标是学习环境状态转移规律$$ s_{t1} \sim p(s_{t1} \mid s_t, a_t) $$在机器人场景里$s_t$ 可以是机械臂关节角、末端位置、物体坐标、速度这些状态量。有了这个转移模型模型就能在“想象”中模拟多条轨迹再根据任务代价选出最优动作。这是 VLA 或者强化学习策略之外的一层安全网。为什么 VLA 不能完全替代 WAMVLA 直接输出动作但无法回答“这个动作执行后杯子会移动到哪”。WAM 补上的正是这种反事实推理能力如果我从左边抓杯子会不会倒如果我从右边推会不会碰到障碍物。4.2 联合嵌入预测避免直接预测像素一个朴素的思路是用神经网络直接预测下一帧图像然后与真实下一帧像素计算重建误差。但像素空间太大一张 $224 \times 224$ 的图有十五万维其中大部分细节对决策没有帮助。直接重建像素还会让模型把精力浪费在纹理、光照这些物理无关信息上。更实用的做法是联合嵌入预测也叫 latent dynamics。用两个编码器分别处理当前状态和下一状态的观测然后让预测头在隐空间里对齐$$ L_{\text{WAM}} \left| f_\theta(z_t, a_t) - g_\phi(z_{t1}) \right|^2 $$其中 $z_t$ 来自状态编码器 $\phi_{\text{state}}$$z_{t1}$ 来自下一观测编码器 $\psi_{\text{next}}$。为了避免表示坍缩可以加入方差正则项或使用不对称的梯度停止。这和 BYOL、VICReg 的思路类似。这里的核心思想是模型只需要学会“特征空间里下一步会怎样”不需要学会“像素级下一步长什么样”。这样训练更加稳定推理也更快。4.3 规划即优化MPC 与隐空间代价函数有了世界模型后动作选择就变成一个优化问题。给定当前状态 $s_0$ 和语言任务目标 $g$在动作序列上搜索一条轨迹使累计代价最小$$ a_{0:H}^* \arg\min_{a_{0:H}} \sum_{h0}^{H-1} \gamma^h C(\hat{s}_{h1}, a_h, g) $$其中 $\hat{s}_{h1}$ 是 WAM 预测的未来状态$C$ 是任务代价函数$\gamma$ 是折扣因子。模型预测控制MPC并不是一次优化完就一直执行而是执行第一步后用新观测重新规划。这能不断修正模型误差。常用优化方式是交叉熵方法CEM从一个高斯分布里随机采样若干动作序列用 WAM 计算每条序列的代价保留代价低的序列更新高斯分布均值与方差迭代若干轮。这个过程中不要求动作可微因此比较适合工程落地。4.4 最小示例一个隐空间状态转移模型和简单规划下面用一个二维点作为玩具状态二维增量作为动作演示 WAM 的“预测规划”骨架。真实系统中状态维度和模型结构会更复杂但思路一致。import torch import torch.nn as nn class ToyWorldModel(nn.Module): def __init__(self, state_dim2, action_dim2, hidden_dim64): super().__init__() self.net nn.Sequential( nn.Linear(state_dim action_dim, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, state_dim) ) def forward(self, state, action): x torch.cat([state, action], dim-1) return self.net(x)假设目标位置是goal_state用 CEM 规划动作序列def cem_plan(model, start_state, goal_state, horizon10, candidates200, iters3): action_dim 2 action_mean torch.zeros(horizon, action_dim) action_std torch.ones(horizon, action_dim) for _ in range(iters): # 采样候选动作序列: [candidates, horizon, action_dim] actions action_mean action_std * torch.randn(candidates, horizon, action_dim) costs [] for a_seq in actions: state start_state.clone() cost 0.0 for t in range(horizon): state model(state, a_seq[t]) cost torch.norm(state - goal_state).item() costs.append(cost) topk torch.topk(torch.tensor(costs), kmax(1, candidates // 10), largestFalse) best_actions actions[topk.indices] action_mean best_actions.mean(dim0) action_std best_actions.std(dim0) return action_mean[0] # 只返回第一步动作规划结束只执行第一步然后重新观测状态重新规划。如果世界模型预测准确整条轨迹会逐步逼近目标。4.5 WAM 常见坑坑现象原因解法长期预测漂移推演 5 步以后状态明显偏离真实误差随步数累积训练时使用多步预测 loss或结合真实观测频繁做 MPC 重规划表示坍缩所有状态被编码成同一个向量没有约束隐空间方差使用方差正则、梯度停止或对比负样本状态表示缺速度预测静止物体时准确运动物体时失准状态只有位置没有速度可观测性不足在状态向量中加入速度、角速度等一阶导数5. 三者串联成一个物理AI系统训练、推理与生产注意事项5.1 训练阶段的数据流转VLM、VLA、WAM 在一个完整物理AI项目中通常分阶段训练原因是数据形态差异很大。阶段数据训练目标主要 lossVLM 预训练图像-文本对、图文问答跨模态对齐InfoNCE、交叉熵VLA 训练图像-语言-动作轨迹模仿专家动作MSE、CE、扩散损失WAM 训练状态-动作-下一状态轨迹预测环境动态隐空间 MSE、状态回归数据顺序上建议先做 VLM 预训练因为 VLA 和 WAM 都要使用视觉特征。之后可以用少量专家轨迹微调 VLA再用大量状态转移轨迹训练 WAM。如果数据充足三者也可以联合微调但对算力和数据处理要求高很多。5.2 推理阶段的一条完整链路物理AI推理时VLM、VLA、WAM 不是串行执行三次而是构成一个闭环摄像头输入当前帧VLM 提取视觉特征得到物体位置、类别和空间关系。语言指令经过文本编码器与视觉特征融合得到任务向量。VLA 基于融合特征生成若干候选动作或动作轨迹。WAM 在隐空间中对每条候选轨迹进行推演计算到达目标和碰撞风险等代价。选择代价最小的动作并下发到执行器。执行后接收新观测回到第 1 步重新规划。这个闭环的价值在于VLA 负责“提出可能性”WAM 负责“筛选可能性”。只靠 VLA 直接输出动作模型一旦遇到训练分布之外的场景往往没有纠错能力。5.3 学习环境与生产环境的差异学习环境里可以自由调整模型大小、batch size、训练步数也可以直接加载预训练权重做实验。生产环境则完全不同。维度学习/实验环境生产环境单幅图像处理不关注延迟必须控制在实时闭环毫秒级模型规模和精度追求精度需要量化、蒸馏、剪枝动作输出允许原始数值必须夹紧在物理安全边界异常处理直接看日志要有紧急停止、默认安全动作模型版本频繁迭代要有灰度发布和回滚机制生产环境还应该增加“代价函数安全项”例如距离障碍物太近时增加惩罚让 WAM 在规划时自动避开危险动作。这比训练阶段在 loss 里硬调权重更可靠。6. 排查清单、参数建议与下一步练习6.1 排错清单当 VLM、VLA、WAM 组合的项目出现异常时按下面的表格逐项排查。问题现象可能原因检查方式处理建议VLM 图文对齐 loss 不降数据配对错位batch 太小打印图文 ID 和文本内容人工抽查修复数据增大 batch 到 256 以上VLA 动作输出抖动动作空间未归一化或连续回归拟合多模态分布查看动作序列曲线是否出现大幅振荡归一化动作改用扩散策略或动作 tokenWAM 预测下一步状态发散模型容量不足状态转移太复杂单独跑 WAM loss观察验证集 loss 是否上升增加隐藏层宽度加入多步预测 loss全局推理轨迹偏离目标只执行一次 VLA 输出没有闭环重规划检查是否每步都更新观测引入 MPC 每步重规划部署后出现安全动作输出动作范围超过机械限位打印动作统计和物理边界在动作头后增加 clamp 或安全层6.2 关键参数选型建议参数不是越多越好训练时要关注几个最影响结果的值。参数常见范围调小影响调大影响对比学习温度系数 $\tau$0.01 ~ 0.1训练不稳定、容易 NaN正负样本区分变弱动作归一化边界$[-1, 1]$动作分辨率降低原始量纲差异影响 lossWAM 隐向量维度64 ~ 512信息丢失预测不准训练变慢容易过拟合MPC 规划 horizon5 ~ 20只看短期容易陷入局部计算量大误差累积CEM 候选动作数100 ~ 1000搜索不充分推理延迟上升这些参数的合理值依赖具体任务。落地前一定要跑一组小规模消融实验不要直接照搬论文里的默认数字。6.3 下一步练习建议如果想系统掌握这三类模型的数学逻辑建议按这个顺序练习在公开图文数据集上用 CLIP 式对比学习跑通 VLM 特征对齐检查 loss 和 top-1 图文检索准确率。在仿真机器人环境中记录“图像-语言-动作”轨迹训练一个连续回归 VLA验证动作误差和任务成功率。用状态转移轨迹训练一个 ToyWorldModel并接入 CEM 做 MPC 规划观察不同 horizon 对轨迹的影响。最后把 VLM 特征接到 VLA再把 WAM 作为规划校验层组合成一个完整物理AI闭环。从 toy 环境到真实机器人之间还有很大距离但数学逻辑是通用的。真正难点不在某个模型内部而是数据、状态表示、动作边界和模型误差如何在一个闭环系统里协同工作。做物理AI项目时先把三个模型各自跑通并量化指标再考虑联合部署是风险最低的路线。
返回列表