目录

前言

最近开始接触VLN领域,希望可以站在前人优秀的工作上快速上手这个行业。本文会从基础概念讲起,通过通俗的解释入门VLN。
第一篇要精度的项目是DualVLN/InternVLA-N1.
DualVLN:论文《Ground Slow, Move Fast: A Dual-System Foundation Model for Generalizable Vision-and-Language Navigation》(ICLR2026,后续扩展版本,也叫 InternVLA-N1 DualVLN)

核心思想

DualVLN 的做法频率
System 2Qwen2.5-VL 7B,输入第一视角 RGB 序列 + 指令,输出图像像素坐标形式的中期目标 + 一组 latent query 抽出的隐式目标 + STOP + 视角调整动作2 Hz
System 1轻量 Diffusion Transformer(hidden 384 / 12 层 / 6 头),条件 = S2 的 latent + 自己的高频 RGB,输出 32 个密集轨迹点30 Hz
底层MPC 轨迹跟踪200 Hz

看不懂?没关系下面从基础概念讲起

什么是diffusion transformer

我们从最基础的概念开始。先暂时忘掉“384、12 层、6 头”,把它理解成一个任务:

给机器人当前看到的画面和目标,让模型生成一条未来两秒的行走轨迹。

例如输出 32 个轨迹点:

机器人当前位置
    ● → ● → ●
              ↘
                ● → ● → 目标

Diffusion Transformer 是完成这个任务的一种神经网络。


1. 神经网络最基本在做什么

神经网络本质上是一个复杂的数学函数:

输入数字 → 经过大量计算 → 输出数字

机器人不能直接理解“图像”“前台”“向左绕行”,所以这些信息都会先转换成数字。

例如:

当前图像 → 一组数字
目标位置 → 一组数字
机器人状态 → 一组数字

轨迹同样可以表示成数字:

[
  [0.1, 0.0],
  [0.2, 0.0],
  [0.3, 0.1],
  [0.4, 0.2]
]

每一项是机器人局部坐标系中的 (x, y)

模型需要学习的就是:

图像 + 目标 → 合理轨迹

一、什么是 Transformer

2. Transformer 解决什么问题

Transformer 是一种擅长处理“一组相互关联的信息”的神经网络结构。

例如一句话:

机器人去前台取水

里面有多个词:

机器人 | 去 | 前台 | 取水

理解“去”的方向,需要结合“前台”;理解“取水”,还需要知道执行者是“机器人”。

导航轨迹也是类似的:

轨迹点1 | 轨迹点2 | 轨迹点3 | ... | 轨迹点32

每个轨迹点不能独立生成:

  • 第 10 个点要和第 9 个点连接;
  • 所有点要朝向目标;
  • 所有点都要避开障碍;
  • 整条轨迹不能突然急转弯。

Transformer 的核心能力就是:

让每一项信息查看其他项,并判断哪些信息对自己更重要。

这个过程叫 Attention,即“注意力”。


3. 什么是 Token

Transformer 处理的基本单位叫 token。

在语言模型里,一个 token 可能是一个词或半个词:

机器人 | 前台 | 取水

在导航模型里,一个 token 可能代表:

  • 一个轨迹点;
  • 一小块图像;
  • 一个目标向量;
  • 一帧历史观测;
  • 机器人当前状态。

例如有 32 个轨迹点,就可以把它们表示为 32 个轨迹 token:

Token 1  Token 2  Token 3  ... Token 32
   ●        ●        ●              ●

但是 Transformer 不能直接处理 (x, y) 这样的少量数字,通常会先把每个 token 转换成更长的“特征向量”。


4. 什么是 hidden 384

hidden 384 表示:

Transformer 内部使用 384 个数字描述每个 token。

例如原始轨迹点只有:

(x, y) = (0.3, 0.1)

进入模型后,会被转换为:

[0.18, -0.42, 0.07, ..., 0.31]
             共 384 个数字

这 384 个数字不是我们人工定义的,它们由模型学习。

可以把它们想象成模型对这个轨迹点的内部描述,其中可能隐含:

  • 相对目标方向;
  • 附近是否有障碍;
  • 当前点处于轨迹前段还是后段;
  • 应该直行还是转弯;
  • 与其他轨迹点的关系。

但不能说“第 17 维一定代表障碍物”,因为这些含义通常分散在整个向量中。

类似于人描述一个地点时,可能会综合考虑:

方向、距离、大小、颜色、是否安全、是否拥挤……

hidden 384 就相当于模型内部有 384 个描述维度。


二、什么是 Attention

5. Attention 的直观含义

假设模型正在修改第 10 个轨迹点。

它可能需要关注:

  • 第 9 个点:保证轨迹连续;
  • 第 11 个点:避免突然转向;
  • 目标 token:保证朝正确方向;
  • 图像中的障碍物特征:避免撞墙;
  • 当前机器人位置:不能生成跳跃轨迹。

Attention 会为这些信息计算重要程度。

例如:

第 10 个轨迹点正在做决策:

第 9 个点       重要性 30%
第 11 个点      重要性 25%
目标信息        重要性 25%
障碍物信息      重要性 15%
其他信息        重要性  5%

然后把重要信息综合起来,更新第 10 个轨迹点的内部特征。

需要注意,这些百分比只是帮助理解的示例。


6. Attention 中的 Q、K、V

Attention 内部经常出现三个名字:

  • Query,简称 Q;
  • Key,简称 K;
  • Value,简称 V。

可以用“查询资料”来理解。

Query:我想找什么

例如第 10 个轨迹点发出查询:

“哪些信息能帮助我决定当前位置和方向?”
Key:我是什么信息

其他 token 给自己提供标签:

第9个点:“我是你的前一个轨迹点”
目标token:“我是最终目标”
视觉token:“我是左前方的障碍物”
Value:我具体包含什么
第9个点:具体坐标和方向
目标token:目标的空间和语义特征
视觉token:障碍物的位置、形状等特征

模型通过比较 Q 和 K,判断应该读取哪些 V:

Query 与 Key 越匹配
        ↓
对应 Value 的权重越高

简化公式是:

Attention(Q, K, V)
    = softmax(QKᵀ / √d) V

刚开始不用理解公式,只需要记住:

Q 决定想找什么,K 用来判断匹配程度,V 是真正被读取的信息。


三、什么是 Attention Head

7. 为什么需要多个 Attention Head

如果只有一个注意力计算,它可能难以同时处理多种关系。

所以 Transformer 会并行设置多个 attention head,即“注意力头”。

可以把 6 个 head 想象成 6 位同时观察路线的专家:

Head 1:关注轨迹前后是否连续
Head 2:关注目标方向
Head 3:关注障碍物
Head 4:关注转弯曲率
Head 5:关注历史运动
Head 6:关注停止位置

这是帮助理解的比喻。实际训练中不会明确规定每个 head 做什么,而且不同 head 的功能可能相互重叠。

hidden 384 / 6 heads

模型总特征维度是 384,分给 6 个注意力头:

384 ÷ 6 = 64

因此,每个 head 通常在 64 维空间里计算注意力:

384维输入
   ├─ Head 1:64维
   ├─ Head 2:64维
   ├─ Head 3:64维
   ├─ Head 4:64维
   ├─ Head 5:64维
   └─ Head 6:64维
              ↓
       合并回384维

因此,“6 头”不是有 6 个完整模型,而是一个模型内部并行观察信息的 6 个子空间。


四、什么是 Transformer Block

8. 一个 Transformer Block 里面有什么

Transformer block 可以理解为一个“信息分析和加工单元”。

典型结构大致是:

输入 token
   ↓
Attention
让不同 token 相互交换信息
   ↓
残差连接 + 归一化
   ↓
Feed Forward Network
分别进一步加工每个 token
   ↓
残差连接 + 归一化
   ↓
输出 token

主要包含四个部分。

8.1 Attention

负责 token 之间的信息交流:

轨迹点 ↔ 其他轨迹点
轨迹点 ↔ 目标
轨迹点 ↔ 图像特征
8.2 Feed Forward Network

简称 FFN,可以理解为一个小型普通神经网络。

Attention 完成“从其他 token 获取信息”后,FFN 再对每个 token 的信息进行加工。

Attention:去收集相关资料
FFN:根据资料进行思考和计算
8.3 Residual Connection

中文叫残差连接。

它会把 block 的原始输入直接加到计算结果中:

新结果 = 原始输入 + 网络修改量

这样模型每一层只需要学习“应该修改什么”,而不是每一层都重新生成全部信息。

它能让深层网络更容易训练。

8.4 Normalization

中文叫归一化。

它用于控制数字范围,让训练过程更稳定,避免某些特征数值过大或过小。


9. 什么是 12 层

12 层表示连续堆叠了 12 个 Transformer block:

输入
 ↓
Block 1:初步建立轨迹点之间的关系
 ↓
Block 2:进一步结合目标
 ↓
Block 3:进一步结合障碍物
 ↓
...
 ↓
Block 12:生成最终的去噪预测

同样,这只是直觉上的解释,不代表每一层被人工规定了固定职责。

每经过一层,token 的表示都会被更新一次。

因此:

  • 层数更多:通常表达能力更强;
  • 但计算时间和显存消耗也会增加;
  • 层数过少:可能无法理解复杂关系;
  • 层数过多:对轻量实时模型可能太慢。

所以 hidden 384 / 12 层 / 6 头 描述的是一个相对轻量的 Transformer。


五、什么是 Diffusion

10. 从“给轨迹加噪声”开始理解

Diffusion 中文通常叫扩散模型。

它的核心训练方式很特别:

先故意把正确答案逐渐破坏成噪声,再训练模型把噪声恢复成正确答案。

假设正确轨迹是:

●—●—●—●—●

逐渐加噪声:

少量噪声:
●—●
    ╲●—●—●

更多噪声:
●    ●
  ●      ●
       ●

接近纯噪声:
随机散乱的点

模型训练的任务是反过来:

随机散乱的点
    ↓ 去一点噪声
有一点轨迹形状
    ↓ 再去一点噪声
大致朝向目标
    ↓ 再去一点噪声
平滑且避障的轨迹

11. Diffusion 如何训练

训练数据里有一条人工示范或规划器产生的正确轨迹:

x₀ = 正确轨迹

训练时随机产生噪声:

ε = 随机噪声

把正确轨迹和噪声混合:

xₜ = 正确轨迹的一部分 + 噪声的一部分

t 表示加噪程度:

  • t 小:轨迹还比较清楚;
  • t 大:轨迹几乎是随机噪声。

然后给模型:

带噪轨迹 xₜ
当前图像
目标信息
噪声等级 t

让模型预测:

里面有哪些噪声

或者在 flow matching 方法中,预测:

轨迹应该向哪个方向变化

模型见过大量样本后,就学会了如何把随机轨迹逐渐变成合理轨迹。


12. Diffusion 如何推理

真正运行时没有正确轨迹可供加噪,因此直接从随机轨迹开始:

32个随机轨迹点
       ↓
模型去噪一次
       ↓
模型去噪一次
       ↓
模型去噪一次
       ↓
最终的32个轨迹点

而图像和目标会在每次去噪时提供条件:

随机轨迹
   +
当前图像
   +
S2目标
   ↓
朝向目标并避开障碍的轨迹

所以它不是毫无目的地去噪,而是“根据条件进行去噪”。

这叫 conditional diffusion,即条件扩散模型。


13. 为什么不直接预测轨迹

普通模型也可以直接预测:

图像 + 目标 → 32个轨迹点

但遇到障碍物时,可能存在多条合理轨迹:

       障碍物
          █
路径A:从左边绕
路径B:从右边绕

直接回归容易把两条路线平均:

平均结果:从障碍物中间穿过去

扩散模型可以表达“可能从左边走,也可能从右边走”这种多种合理答案,然后采样其中一条完整轨迹。

这叫多模态分布。


六、Diffusion Transformer 是什么

14. 把两个概念组合起来

现在组合前面的两个概念:

  • Diffusion:规定“从噪声逐渐恢复轨迹”的生成过程;
  • Transformer:负责每一步具体应该怎样去噪。

所以:

Diffusion Transformer 是使用 Transformer 作为去噪网络的扩散模型。

整体流程:

随机的32个轨迹点
        ↓
┌─────────────────────────────┐
│ Diffusion Transformer       │
│                             │
│ hidden = 384                │
│ 12个 Transformer blocks     │
│ 每个 block 有 6个 heads     │
└─────────────────────────────┘
        ↓
更合理一点的轨迹
        ↓
再次调用同一个 Transformer
        ↓
更加合理的轨迹
        ↓
最终轨迹

15. Transformer 在这里具体关注什么

导航模型可能包含这些 token:

32个带噪轨迹 token
当前图像 token
旧图像 token
S2 latent goal token
pixel goal token
扩散时间 t token

Transformer 让它们相互交流:

轨迹点之间:
保证整条轨迹连续、平滑

轨迹点与图像:
根据画面避开墙、桌椅和行人

轨迹点与目标:
让整条轨迹朝向正确位置

当前图像与旧图像:
估计机器人已经走了多远

轨迹与扩散时间:
知道当前应该做大范围修正还是精细修正

16. 12 层与扩散次数不是一回事

这是最容易混淆的地方。

12 层

表示一次调用模型时,内部经过 12 个 Transformer block:

输入 → Block 1 → ... → Block 12 → 输出

扩散次数

表示生成轨迹时,需要调用整个模型多少次。

假设使用 5 次去噪:

去噪第1次:运行完整12层
去噪第2次:运行完整12层
去噪第3次:运行完整12层
去噪第4次:运行完整12层
去噪第5次:运行完整12层

因此总计算类似于:

5次去噪 × 每次12层

但模型参数是复用的,不是拥有 5 套不同的 12 层网络。


17. 用一个完整例子串起来

机器人看到前方有桌子,S2 要求它去桌子右侧的门。

输入
当前 RGB:前面有桌子和门
S2 latent:目标是右侧门
pixel goal:门在图像右上方
随机轨迹:32个散乱点
Transformer 第一次去噪

Attention 让轨迹点读取图像和目标:

大部分点开始朝右前方移动
第二次去噪

轨迹点关注桌子的位置:

轨迹开始从桌子右边绕
后续去噪

模型继续修正:

点间距更均匀
转向更平滑
终点更接近门
输出
32个连续轨迹点
   ↓
MPC 以更高频率跟踪
   ↓
S0/GWBC 转换成全身关节运动

18. 最简记忆方式

可以记住下面五句话:

  1. Token:模型处理的一项信息,例如一个轨迹点。
  2. Hidden 384:每个 token 在模型内部用 384 个数字描述。
  3. Attention head:从不同角度寻找 token 之间的重要关系。
  4. Transformer block:一次“交换信息 + 加工信息”的单元。
  5. Diffusion Transformer:用 Transformer 多次把随机轨迹修正成合理轨迹。

对应到完整配置:

Diffusion Transformer
├── 输入:图像、目标、带噪轨迹
├── hidden 384:每个 token 有384维内部特征
├── 6 heads:并行分析不同信息关系
├── 12 blocks:连续进行12轮特征加工
└── 输出:对噪声或轨迹变化方向的预测

然后通过若干次去噪,最终得到可执行的 32 点轨迹。

什么是latent query和cross attention

我们继续从直观例子开始。

S2 看到了最近几帧图像,并读懂了指令:

“绕过前面的沙发,走到右侧的前台。”

S2 内部有大量信息:

“沙发”在哪里
“前台”在哪里
目标大概在右侧
应该先绕行
当前执行到哪一步
哪些区域可能可通行
什么时候可能需要停下

S1 不可能每次都接收 S2 内部的全部信息,因为数据量很大。因此需要从中提取一份紧凑的“导航摘要”。

这个摘要就是:

一组 latent query 抽出的隐式目标。


1. 先理解 Cross-Attention

Cross-Attention 中文叫“交叉注意力”。

它的作用是:

让一组信息主动查询另一组信息,并从中抽取自己需要的内容。

例如:

问题:我要去哪里?
资料:S2 内部的全部视觉和语言信息

Cross-Attention 根据问题,从资料里提取相关答案。


2. 生活中的类比

假设桌上有一本很厚的酒店资料:

酒店布局
前台位置
餐厅位置
电梯位置
房间信息
当前客人的指令
机器人走过的路线

现在安排几位助理阅读资料:

助理1:提取目标是什么
助理2:提取目标在什么方向
助理3:提取当前执行进度
助理4:提取路线中的障碍和绕行信息

每位助理都阅读同一批资料,但提取出的重点不同。

对应关系是:

助理提出的问题        = Query
资料的索引/标题        = Key
资料的实际内容         = Value
阅读和提取过程         = Cross-Attention
助理写出的摘要         = Latent token
多位助理的摘要集合     = 隐式目标

3. 为什么叫 Cross-Attention

先对比 Self-Attention。

Self-Attention

Self-Attention 是“一组信息内部互相查看”。

例如32个轨迹点互相查看:

轨迹点1 ─┐
轨迹点2 ─┼─ 相互交换信息
轨迹点3 ─┤
...      │
轨迹点32 ┘

它的 Q、K、V 都来自同一组 token:

Q:轨迹 token
K:轨迹 token
V:轨迹 token

可以理解为:

轨迹内部开会。

Cross-Attention

Cross-Attention 是“一组信息去查看另一组信息”。

Latent Query ──查询──> S2视觉语言特征

它们来自不同来源:

Q:latent query
K:S2视觉语言特征
V:S2视觉语言特征

可以理解为:

导航摘要员去查阅 S2 的资料库。

这就是“交叉”的含义。


4. S2 内部有什么信息

S2 处理语言和图像后,会生成很多 token。

假设输入是:

指令:“绕过沙发,去右侧前台”

图像:桌子、沙发、前台标牌、墙壁、通道
历史:机器人刚刚从门口进入大厅

经过视觉语言模型后,可能产生几百或几千个内部 token:

语言 token:
“绕过” “沙发” “右侧” “前台”

图像 token:
图像左上区域
图像中间区域
图像右侧区域
沙发所在区域
前台标牌区域

历史 token:
上一帧
之前的位置
已经执行的步骤

每个 token 都是一个向量,例如 384、768 或 3584 维。

可以简化为:

S2_features = [
  沙发特征,
  前台特征,
  右侧通道特征,
  指令特征,
  历史进度特征,
  ...
]

问题是,这些信息太多,S1 不应该全部重新处理。


5. 什么是 Latent Query

Latent query 是模型内部的一组“可学习查询向量”。

例如设置 4 个 latent query:

Query 1 = [0.13, -0.22, ...]
Query 2 = [0.51,  0.08, ...]
Query 3 = [-0.17, 0.34, ...]
Query 4 = [0.02, -0.41, ...]

刚开始训练时,这些数字通常是随机初始化的。

我们不会人工规定:

Query 1 必须寻找目标
Query 2 必须寻找障碍物

而是在整个模型训练过程中,让它们自己学会:

应该从 S2 的大量信息中提取什么,才能帮助 S1 生成正确轨迹。

因此叫“learnable queries”,即可学习的查询。


6. Latent 是什么意思

latent 可以翻译成:

  • 隐变量;
  • 隐式特征;
  • 潜在表示。

它的特点是:

由模型自己学习,不能直接用自然语言解释每一维代表什么。

例如一个 latent query 经过 Cross-Attention 后,输出:

[0.31, -0.82, 0.14, 0.55, ...]

这个向量里可能综合包含:

  • 前台位于右侧;
  • 应该绕过沙发;
  • 当前还没有到达;
  • 右侧通道更合适;
  • 接近前台后需要减速。

但我们不能准确说:

第1维 = 目标方向
第2维 = 沙发位置
第3维 = 是否停止

这些含义通常分布在许多维度中,所以叫“隐式目标”。


7. Cross-Attention 里的 Q、K、V

Cross-Attention 有三个核心输入:

Q:Query
K:Key
V:Value

Q:我想找什么

Q 来自 latent query。

例如可以把某个 query 想象成:

“哪些信息对下一段导航最重要?”

K:你是什么信息

K 来自 S2 的视觉语言 token。

每个 token 都生成一个 Key,相当于它的“检索标签”:

Token A 的 Key:与沙发有关
Token B 的 Key:与前台有关
Token C 的 Key:与历史进度有关
Token D 的 Key:与无关背景有关

这些标签也不是文字,而是向量。

V:你的实际内容是什么

Value 是该 token 真正携带的信息:

沙发在图像中央,距离较近
前台在右前方
右侧通道可通行
当前尚未绕过沙发

同样,它们实际都是向量。


8. Cross-Attention 如何工作

过程可以拆成三步。

第一步:Query 与所有 Key 比较

Query
  ├── 和“沙发 Key”比较
  ├── 和“前台 Key”比较
  ├── 和“历史 Key”比较
  └── 和“墙壁 Key”比较

通过向量点积计算匹配程度。

假设得到:

前台 token:0.9
右侧通道 token:0.8
沙发 token:0.7
历史进度 token:0.5
天花板 token:0.1

第二步:转换成注意力权重

经过 softmax 后,得到总和为 1 的权重:

前台 token:       35%
右侧通道 token:   28%
沙发 token:       22%
历史进度 token:   12%
天花板 token:      3%

第三步:按权重汇总 Value

输出 =
  35% × 前台信息
+ 28% × 右侧通道信息
+ 22% × 沙发信息
+ 12% × 历史进度信息
+  3% × 天花板信息

得到一个新的向量,这就是该 query 抽取出的 latent token。

简化公式是:

CrossAttention(Q, K, V)
    = softmax(QKᵀ / √d) V

暂时只需要记住:

Q × K:计算“我应该关注谁”
得到的权重 × V:读取并汇总具体信息

9. 为什么是“一组”Latent Query

一个 query 最终只能生成一个压缩向量,容量可能不够。

因此通常使用多个 query:

Query 1 ──┐
Query 2 ──┤
Query 3 ──┼─ 查询同一批 S2 特征
...       │
Query 32 ─┘

得到:

Latent 1
Latent 2
Latent 3
...
Latent 32

组成一组 latent tokens。

训练后,它们可能自然地产生不同的关注倾向:

Latent 1:更关注目标语义
Latent 2:更关注空间方向
Latent 3:更关注历史进度
Latent 4:更关注障碍物
Latent 5:更关注停止条件
...

这只是可能形成的分工,不是人工定义或严格保证的。

多个 query 的主要作用是:

提供足够的信息容量,让目标不被压缩成一个过于简单的向量。


10. 一个具体的数字例子

假设 S2 只有 4 个信息 token:

Token A:沙发
Token B:前台
Token C:右侧通道
Token D:无关装饰

现在有两个 latent query。

Query 1 的注意力

沙发:      10%
前台:      55%
右侧通道:  30%
装饰:       5%

输出的 Latent 1 主要包含“目标与方向”。

Query 2 的注意力

沙发:      45%
前台:      10%
右侧通道:  40%
装饰:       5%

输出的 Latent 2 主要包含“绕障与通行信息”。

最终隐式目标是:

latent_goal = [Latent 1, Latent 2]

S1 根据它们生成:

先向右绕过沙发,再向右前方前台移动

11. Latent Query 是怎么学会查询的

训练时不会直接告诉模型:

Query 1 请关注前台
Query 2 请关注沙发

训练数据只提供最终正确结果,例如正确轨迹:

图像 + 指令 → 从沙发右侧绕行到前台

模型生成错误轨迹后,计算 loss:

预测轨迹和正确轨迹差多少
是否撞到障碍
是否朝目标前进
轨迹是否平滑

然后通过反向传播同时调整:

  • S2 特征;
  • latent query;
  • Cross-Attention 参数;
  • S1 轨迹生成模型。

经过大量训练后,latent query 会逐渐学会抽取那些能降低轨迹错误的信息。

链路是:

latent query 抽取错误信息
        ↓
S1 生成错误轨迹
        ↓
产生较大的 loss
        ↓
反向传播修改 latent query
        ↓
下次更关注有用信息

12. “抽出隐式目标”的完整过程

完整过程可以表示为:

指令 + 历史图像
        ↓
      S2 VLM
        ↓
大量视觉语言 token
        ↓
一组可学习 latent query
        ↓ Cross-Attention
少量压缩 latent token
        ↓
   latent goal
        ↓
S1 Diffusion Transformer
        ↓
未来两秒的密集轨迹

假设:

S2 原始特征:1024 个 token
latent query:32 个

经过 Cross-Attention 后:

1024 个 token → 压缩成 32 个 latent token

这有点像把一本很厚的资料压缩成 32 条机器可读的摘要。


13. 数据形状是什么样的

假设:

S2 有 1024 个 token
每个 token 维度是 384
latent query 有 32 个

那么:

S2 features:
[1024, 384]

latent queries:
[32, 384]

Cross-Attention 输出:
[32, 384]

过程为:

32 个 Query
    ↓
分别查询 1024 个 S2 token
    ↓
输出 32 个压缩后的 latent token

如果有 batch 维度,则通常写成:

S2 features:  [B, 1024, 384]
queries:      [B,   32, 384]
latent goal:  [B,   32, 384]

其中 B 是一次处理的样本数量。


14. 两种“Query”不要混淆

这里有一个容易混淆的地方。

第一种:可学习的 latent query token

它是一组模型参数:

32个可学习向量

它们负责主动查询 S2 特征。

第二种:Attention 数学计算里的 Q

Cross-Attention 会把 latent query token 再经过一个线性变换,生成真正用于计算的 Q:

latent query token
        ↓ Wq
Attention 里的 Q

同理,S2 features 会生成 K 和 V:

S2 features
   ├─ Wk → K
   └─ Wv → V

完整一些是:

Q = latent_queries × Wq
K = S2_features × Wk
V = S2_features × Wv

output = softmax(QKᵀ / √d) × V

所以日常交流时说“latent query”,通常指可学习的查询 token;公式里的 Q 是它经过变换后的结果。


15. Cross-Attention 也可以用于 S1

前面说的是:

latent query → 查询 S2 features

得到隐式目标。

S1 的 Diffusion Transformer 还可能再次使用 Cross-Attention:

带噪轨迹 token → 查询 latent goal

此时:

Q:轨迹 token
K/V:latent goal token

意思是:

每个轨迹点都去查询 S2 提供的目标信息,判断自己应该如何移动。

因此系统中可能有两次不同的 Cross-Attention:

第一次:
learned queries → S2 features
作用:压缩出隐式目标

第二次:
trajectory tokens → latent goal
作用:用隐式目标指导轨迹生成

16. 隐式目标和 Pixel Goal 的区别

Pixel Goal

pixel_goal = [420, 260]

含义明确:

目标大约位于图像中的这个像素位置。

优点:

  • 可以画在图像上;
  • 人能检查对不对;
  • 接口简单。

缺点:

  • 只有位置;
  • 很难表达历史和语义;
  • 看不出应该左绕还是右绕;
  • 目标暂时被遮挡时不稳定。

Latent Goal

latent_goal = [32, 384]

它可能包含:

  • 目标是什么;
  • 目标大概在哪里;
  • 当前处于哪个导航步骤;
  • 应该怎样接近;
  • 历史中看到了什么;
  • 哪些视觉线索重要。

优点是信息丰富,缺点是难以解释和人工检查。

因此同时使用两者:

Pixel Goal:
“去画面中这个位置”

Latent Goal:
“为什么去那里、结合历史应该怎样去”

17. 最简单的记忆方式

可以把整个过程记成:

S2 = 一本很厚的视觉语言资料

Latent Query = 一组会学习如何提问的摘要员

Cross-Attention = 摘要员查阅资料、挑选重点的过程

Latent Goal = 摘要员最后写出的机器可读摘要

S1 = 根据摘要规划短时轨迹的执行者

一句话总结:

“一组 latent query 抽出的隐式目标”就是:使用多个可学习查询,通过 Cross-Attention 从 S2 的大量视觉语言特征中提取少量、紧凑、不可直接解释但对 S1 轨迹生成有用的目标 token。

Cross-Attention 跟上面提到的attention header有什么联系和区别

你说的 attention header 应该是 attention head(注意力头)。

最关键的关系是:

Self-Attention / Cross-Attention 描述“向谁查询”;Attention Head 描述“同时从几个角度查询”。

它们不是同一级别、互斥的概念。Cross-Attention 通常也由多个 Attention Head 组成。


1. Attention Head 是计算单元

一个 Attention Head 完成一次:

Q:我想查什么
K:资料的检索标签
V:资料的实际内容

Q 与 K 匹配
    ↓
按匹配程度汇总 V

也就是:

Attention(Q, K, V)

如果只有一个 head,就只有一个注意力计算空间。

如果有 6 个 head,就是并行进行 6 组不同的注意力计算:

输入
 ├─ Head 1
 ├─ Head 2
 ├─ Head 3
 ├─ Head 4
 ├─ Head 5
 └─ Head 6
      ↓
  合并结果

2. Self-Attention 和 Cross-Attention 决定 Q、K、V 来自哪里

两者使用的 Attention 计算基本相同,主要区别是数据来源。

Self-Attention

Q、K、V 都来自同一组 token:

轨迹 token ──生成──> Q
轨迹 token ──生成──> K
轨迹 token ──生成──> V

所以叫“自注意力”:

一组 token 在观察自己这一组里的其他 token。

例如32个轨迹点互相交流:

轨迹点1 ─┐
轨迹点2 ─┤
轨迹点3 ─┼─ Self-Attention
...      │
轨迹点32 ┘

它主要学习:

  • 轨迹点之间是否连续;
  • 转弯是否平滑;
  • 前后点是否矛盾;
  • 整条轨迹形状是否合理。

Cross-Attention

Q 来自一组 token,K、V 来自另一组 token:

Latent Query ──生成──> Q

S2 Features ──生成──> K
S2 Features ──生成──> V

所以叫“交叉注意力”:

一组 token 去查询另一组 token。

例如:

32个 Latent Query
        ↓ 查询
S2 的1024个视觉语言 Token

它主要完成:

  • 从 S2 中找到目标信息;
  • 找到与当前指令相关的视觉区域;
  • 找到导航进度;
  • 压缩出隐式目标。

3. Cross-Attention 也可以有 6 个 Head

假设配置是:

hidden = 384
heads = 6

那么 Cross-Attention 会把 384 维分成 6 份:

384 ÷ 6 = 64维/Head

结构类似:

Latent Query
    │
    ├─ Head 1:查询S2信息
    ├─ Head 2:查询S2信息
    ├─ Head 3:查询S2信息
    ├─ Head 4:查询S2信息
    ├─ Head 5:查询S2信息
    └─ Head 6:查询S2信息
                ↓
         合并成384维结果

每个 head 都有自己独立的参数:

Head 1:Wq₁、Wk₁、Wv₁
Head 2:Wq₂、Wk₂、Wv₂
...
Head 6:Wq₆、Wk₆、Wv₆

因此,不同 head 可以学会关注不同关系。

例如在 Cross-Attention 中,可能形成:

Head 1:更关注指令中的目标
Head 2:更关注目标的视觉位置
Head 3:更关注路线方向
Head 4:更关注历史进度
Head 5:更关注障碍物
Head 6:更关注停止线索

这只是便于理解的例子,不是人为指定或严格保证的分工。


4. 一个生活类比

假设“Cross-Attention”是一场资料查询工作。

有一本很厚的 S2 资料:

语言指令
历史图像
前台位置
沙发位置
导航进度

现在安排 6 位专家同时阅读。

Cross-Attention

描述的是:

专家组去查询 S2 资料。

6 Attention Heads

描述的是:

专家组里有 6 位使用不同方法查资料的专家。

因此:

Cross-Attention = 查询关系
Attention Heads = 并行查询角度

同样,Self-Attention 也可以有 6 位专家,只不过他们查询的是自己组内的信息。


5. 二者的组合关系

可以有以下组合:

单头 Self-Attention

同一组 token 互相查询
只有一个查询视角

多头 Self-Attention

同一组 token 互相查询
有多个并行查询视角

单头 Cross-Attention

一组 token 查询另一组 token
只有一个查询视角

多头 Cross-Attention

一组 token 查询另一组 token
有多个并行查询视角

现代 Transformer 通常使用:

Multi-Head Self-Attention
Multi-Head Cross-Attention

6. 在当前 VLN 架构里的位置

可能存在下面几种 Attention。

第一步:S2 内部 Self-Attention

图像与语言 token 在 S2 内部交流

让 S2 理解:

“绕过沙发,去右侧前台”

第二步:Latent Query 对 S2 做 Cross-Attention

Latent Query     → Q
S2 Features      → K、V

从大量 S2 信息中抽出隐式目标。

第三步:轨迹 token 做 Self-Attention

32个轨迹点互相查询

保证轨迹连续、平滑。

第四步:轨迹对目标做 Cross-Attention

轨迹 Token       → Q
Latent Goal      → K、V

让每个轨迹点根据目标进行调整。

每一种 Attention 都可能配置 6 个 head。


7. Transformer Block 中的关系

一个用于轨迹生成的 Transformer Block 可能包含:

轨迹 Token
    ↓
Multi-Head Self-Attention
让轨迹点互相交流
    ↓
Multi-Head Cross-Attention
让轨迹点读取目标/图像条件
    ↓
Feed Forward Network
进一步加工每个轨迹点
    ↓
输出到下一个 Block

如果配置为 12 层 / 6 头,通常意味着:

12 个 Transformer Block

每个 Block 内的 Attention:
使用 6 个 Attention Head

但具体论文可能采用不同结构,例如:

  • 每层都有 Self-Attention 和 Cross-Attention;
  • 先把条件拼成 token,只使用 Self-Attention;
  • 使用 AdaLN 将目标注入,而没有独立 Cross-Attention。

所以仅看到“6 heads”时,不能确定它特指 Self-Attention 还是 Cross-Attention,需要看网络结构或代码。


8. 最简单的区分方法

记住两句话:

Self / Cross:
决定 Q、K、V 从哪里来。

Head 数量:
决定这次 Attention 并行分成几个特征空间计算。

具体来说:

Self-Attention:
Q、K、V 来自同一组 token。

Cross-Attention:
Q 来自 A,K、V 来自 B。

6 Attention Heads:
上述计算并行做 6 份,最后再合并。

因此,“Cross-Attention”和“Attention Head”不是二选一,而是:

一个 Cross-Attention 模块内部可以包含 6 个 Attention Heads。

Logo

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

更多推荐