VLN优秀工作精读|小白学VLN|InternVLA-N1
目录
- 前言
- 核心思想
- 什么是diffusion transformer
- 什么是latent query和cross attention
- 1. 先理解 Cross-Attention
- 2. 生活中的类比
- 3. 为什么叫 Cross-Attention
- Self-Attention
- 4. S2 内部有什么信息
- 5. 什么是 Latent Query
- 6. Latent 是什么意思
- 7. Cross-Attention 里的 Q、K、V
- 8. Cross-Attention 如何工作
- 9. 为什么是“一组”Latent Query
- 10. 一个具体的数字例子
- 11. Latent Query 是怎么学会查询的
- 12. “抽出隐式目标”的完整过程
- 13. 数据形状是什么样的
- 14. 两种“Query”不要混淆
- 15. Cross-Attention 也可以用于 S1
- 16. 隐式目标和 Pixel Goal 的区别
- 17. 最简单的记忆方式
- Cross-Attention 跟上面提到的attention header有什么联系和区别
前言
最近开始接触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 2 | Qwen2.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. 最简记忆方式
可以记住下面五句话:
- Token:模型处理的一项信息,例如一个轨迹点。
- Hidden 384:每个 token 在模型内部用 384 个数字描述。
- Attention head:从不同角度寻找 token 之间的重要关系。
- Transformer block:一次“交换信息 + 加工信息”的单元。
- 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。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)