Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

2.4.1 Self-Attention 机制与 Query/Key/Value

学习导航

  • 本章主题:2.4.1 Self-Attention 机制与 Query/Key/Value
  • 前置知识:建议先完成第 1 章核心内容。
  • 建议用时:70-90 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

关键图示:Transformer 数据流

关键图示:Transformer 数据流

在前面的序列建模部分已经看到,RNN/LSTM 通过“递归地”一格一格地处理序列,这使得长距离依赖不易捕获,也难以并行训练。Self-Attention(自注意力)则直接在序列中任意两个位置之间建立可学习的“相似度连接”,从而在一次运算中融合全局信息,是 Transformer 的核心思想之一。(arXiv)

2.4.1.1 自注意力机制:在序列内部做“加权信息汇总”

设输入序列长度为 \(\displaystyle n\),每个位置的向量维度为 \(d_\text{model}\),将整个序列写成矩阵形式:

\[ X \in \mathbb{R}^{n \times d_\text{model}}. \]

通过三组不同的线性变换,得到 Query(Q)、Key(K)、Value(V):

\[ Q = X W^Q,\quad K = X W^K,\quad V = X W^V, \]

其中 \(W^Q, W^K, W^V \in \mathbb{R}^{d_\text{model} \times d_k}\) 或 \(\mathbb{R}^{d_\text{model} \times d_v}\) 是可训练的权重矩阵。

标准的scaled dot-product attention定义为:(维基百科)

\[ \text{Attention}(Q, K, V) = \text{softmax}!\left(\frac{Q K^\top}{\sqrt{d_k}}\right) V. \]

其中:

  • \(QK^\top \in \mathbb{R}^{n\times n}\) 给出序列中任意两个位置之间的“相关性分数”(内积越大,越相似);
  • 除以 \(\sqrt{d_k}\) 是为了避免维度过大时内积值过大导致 softmax 饱和;
  • softmax 在每一行上做归一化,将相关性分数转为“注意力权重”(非负且和为 1);
  • 将这些权重对 \(\displaystyle V\) 做加权和,得到每个位置融合了整句信息的新表示。

直观地看,每个位置 \(\displaystyle i\) 的输出向量就是“从全序列所有位置的 Value 中,按相关性做加权平均”的结果,自注意力因此可以在单层中捕获任意距离的依赖关系。

【图 2-4-1 占位:自注意力示意图。上方是一行 token(或 patch)向量,中间通过 Q/K/V 线性变换,下面是一个 \(n\times n\) 注意力矩阵热力图;矩阵第 i 行突出显示该位置对其它位置的关注程度。】

2.4.1.2 Query / Key / Value 的含义与类比

Q/K/V 的命名可以类比为“查字典”的过程:(billparker.ai)

+Query(Q,查询):当前想要“查”的词条,如一个位置上的 token 表示; +Key(K,键):所有候选词条的“索引标签”,用于和 Query 做匹配; +Value(V,值):与每个 Key 对应的内容,一旦某个 Key 与 Query 匹配度高,就会更多地读取其对应的 Value 信息。

注意力分数由 Query 与各个 Key 的相似度决定(通常就是向量内积),再通过 softmax 归一化后,作为对 Value 的加权系数。因此:

  • 若 Query 与某个 Key 成“高相似度”,对应 Value 在输出中权重更大;
  • 若 Query 与某些 Key 几乎无关,则它们对应的 Value 在输出中的权重接近 0。

编码器自注意力中,Q/K/V 都来自同一个输入序列;在**解码器的交叉注意力(encoder-decoder attention)**中,Q 来自解码器当前状态,而 K/V 来自编码器输出,这将在 2.4.4 节进一步展开。(维基百科)

从具身智能的角度可以这样理解:机器人在某个时间步要做决策时,它把当前状态向量作为 Query,把过去观测或语言指令编码后的向量作为 Key/Value,通过 attention“查”到与当前状况最相关的信息,再基于这些信息输出动作。

2.4.1.3 注意力矩阵与掩码机制

把自注意力的权重部分单独记为矩阵:

\[ A = \text{softmax}!\left(\frac{QK^\top}{\sqrt{d_k}}\right) \in \mathbb{R}^{n\times n}. \]

  • \(A_{ij}\) 表示“序列中位置 \(\displaystyle i\) 对位置 \(\displaystyle j\) 的注意力权重”;
  • 每一行都是一个概率分布(和为 1),体现了位置 \(\displaystyle i\) 对各个位置的关注程度。

Encoder 层中常用的全连接自注意力,允许每个位置关注序列中任意位置;而在 Decoder 的自回归生成中,为避免“偷看未来”,会对注意力矩阵进行下三角**因果掩码(causal mask)**处理:在 softmax 前将所有“未来位置”的相关性分数置为 \(-\infty\),softmax 之后它们的权重就变为 0,仅允许当前位置看到自己与其之前的 token。(维基百科)

【图 2-4-2 占位:注意力矩阵与掩码示意图。左图为完整的 \(n\times n\) 注意力矩阵热力图;右图为 Decoder 中的下三角掩码矩阵,上三角区域被灰色遮挡(权重为 0)。】

在机器人动作序列建模中,自回归 Decoder-only 架构同样使用这种因果掩码,以保证每一步动作仅依赖过去的观测和动作历史,符合物理因果顺序。


2.4.2 多头注意力(Multi-Head Attention)

单一的自注意力头相当于从一个“投影子空间”里计算相似度和信息汇总。Transformer 引入多头注意力(Multi-Head Attention),并行地在多个子空间中计算注意力,从而提高表达能力。(NeurIPS论文)

2.4.2.1 多头机制的形式化定义

在多头注意力中,我们为每个头 \(\displaystyle i\) 单独学习一组线性变换:

\[ W_i^Q, W_i^K, W_i^V \in \mathbb{R}^{d_\text{model} \times d_k},\quad i = 1,\dots,h, \]

\[ \text{head}_i = \text{Attention}(QW_i^Q,\ KW_i^K,\ VW_i^V). \]

然后将所有头的输出在特征维上拼接,再通过一个线性层 \(W^O\) 做整合:

\[ \text{MultiHead}(Q,K,V) = \text{Concat}(\text{head}_1, \dots, \text{head}_h) W^O. \]

(维基百科)

这样,每个头都在各自的投影子空间中学习不同的相似性模式,最终汇聚为一个更丰富的表示。

【图 2-4-3 占位:多头注意力结构图。上方 Q/K/V 通过多组线性变换分别进入多个 attention 单元(Head 1, Head 2, …, Head h),各自输出后在特征维拼接,再经过一个线性层得到最终输出。】

2.4.2.2 不同注意力头学习不同的关系

大量实证分析表明,不同注意力头往往会“专注”于不同类型的模式:(科学导向)

  • 在自然语言任务中,有的头擅长捕获邻近词之间的局部依赖(如短语结构),有的头捕获长距离依赖(如跨句子的共指、主题联系);
  • 在视觉 Transformer 中,有的头聚焦局部 patch 的几何关系,有的头关注整体场景结构或物体的语义轮廓。

对于具身智能任务,可以预期:

  • 某些头重点关注与目标物体相关的视觉区域;
  • 某些头偏重障碍物和安全边界;
  • 还有一些头可能更关注时间维度上动作的连续性或物体轨迹。

虽然这些“功能分工”不是硬编码的,而是训练过程中自发涌现,但在实践中,可以通过可视化注意力权重来分析模型行为,从而对机器人决策过程获得一定的可解释性(在第 10 章可解释性部分会再回到这一点)。

【图 2-4-4 占位:多头注意力可视化示例。对同一句话(或同一图像 patch 序列),展示多个头的注意力矩阵热力图,每个头关注的模式不同。】

2.4.2.3 计算开销与并行执行

从复杂度角度看,多头注意力虽然引入了多个头,但每个头通常使用较小的 \(d_k\)(例如 \(d_k = d_\text{model} / h\)),因此总的计算量与单个大头的注意力同阶,只是常数因子有所增加。(NeurIPS论文)

更重要的是,各个头之间完全可以在 GPU/TPU 上并行计算,因此在现代硬件上,多头注意力的实际计算效率很高,与标准矩阵乘法的实现高度契合。这也是 Transformer 能够在视觉、语言以及多模态任务上高效扩展到大规模模型的关键工程基础。

在机器人应用中,多头注意力使得单个 VLA 模型可以同时在不同“视角”下理解环境与任务指令,为后续的动作决策提供更丰富的上下文表征。


2.4.3 位置编码(绝对 / 相对)

自注意力机制本身对输入顺序是“置换不变”的——如果不显式加入位置信息,模型仅将序列视为一个“集合”,无法区分不同排列顺序,从而无法正确建模时间顺序或语序。(ACL Anthology)

为了解决这一问题,Transformer 在输入层或各层内部引入位置编码(Positional Encoding),将位置信息注入到每个 token 或 patch 的表示中。

2.4.3.1 绝对位置编码:正弦/余弦函数形式

原始 Transformer 论文提出了一种固定的正弦–余弦位置编码,给每个位置 (pos) 分配一个维度为 \(d_\text{model}\) 的向量:(arXiv)

\[ \begin{aligned} \text{PE}(pos, 2i) &= \sin\left(\frac{pos}{10000^{2i/d_\text{model}}}\right), \text{PE}(pos, 2i+1) &= \cos\left(\frac{pos}{10000^{2i/d_\text{model}}}\right), \end{aligned} \]

其中 \(i = 0,1,\dots, d_\text{model}/2-1\)。

特点与直觉:

  • 不同维度对应不同波长的正弦波,低频维度编码粗粒度的位置信息,高频维度编码细粒度的局部差异;
  • 由于是解析函数定义,不需要训练额外参数,并且可以自然地外推到比训练时更长的序列长度;
  • 通过线性组合不同维度,模型可以在一定程度上推断两个位置之间的相对距离。

在实现上,常见做法是在输入 embedding 上“相加”位置编码:

\[ X^\text{input}_i = X^\text{embed}_i + \text{PE}(i). \]

【图 2-4-5 占位:若干维度的正弦/余弦位置编码随位置变化的曲线图,展示不同频率、不同波长的波形。】

除正弦编码之外,很多模型也采用可学习的绝对位置 embedding,即像词向量一样为每个位置建立一个可训练表,将其加到输入上。实现更简单,但在泛化到更长序列时往往需要额外技巧。

2.4.3.2 相对位置编码:对相对距离更敏感

绝对位置编码强调的是“某个 token 在整个序列中处于第几位”;然而很多任务更关心的是token 之间的相对距离——例如“当前词前面最近的名词在哪里”,“上一时刻与当前时刻的相对差值”等。(arXiv)

**相对位置编码(Relative Positional Encoding, RPE)**的基本思想,是让注意力分数不仅依赖于内容相似度 \(q_i^\top k_j\),还依赖于位置差值 \(\displaystyle (i-j)\) 对应的一个向量或偏置,例如:(Lilian Weng)

\[ \text{score}_{ij} = \frac{q_i^\top k_j + q_i^\top r_{i-j}}{\sqrt{d_k}}, \]

其中 \(r_{i-j}\) 是与相对位移 \(\displaystyle (i-j)\) 相关的参数向量或标量偏置。

代表性工作包括:

  • Shaw 等人在机器翻译中的相对位置编码;
  • Transformer-XL 使用相对位置编码解决长上下文建模问题;
  • 后续的 T5、RoPE(Rotary Position Embedding)等方法,对相对位置进一步推广,使模型对序列整体平移具有更好的不变性。(Lilian Weng)

在机器人与具身智能任务中,时间维度往往很长,而我们关注的是“前后几步”动作与观测之间的因果关系,相对位置编码因此更加契合时序决策的需求。

【图 2-4-6 占位:相对位置编码示意图。以当前时间步为中心,展示不同相对位移(-k…0…+k)的编码向量,或绘制一个相对位置偏置矩阵。】

2.4.3.3 位置编码的重要性:从“集合”到“有序序列”

如果不给 Transformer 加入任何位置信息,网络对输入的任何排列都将给出相同的输出(只是对应位置发生置换),这会导致:

  • 在语言任务中无法区分 “把红色方块放入盒子” 与 “盒子放入红色方块”;
  • 在机器人控制中无法区分“先抓取后放置”与“先放置后抓取”的时序逻辑。

位置编码正是将**“序列顺序”**显式注入到模型中的关键步骤,使自注意力从“集合运算”转变为真正的“序列建模”。(ACL Anthology)

在后续构建 VLA 模型时,时间步编号、视频帧序号、甚至任务分段(如“示教阶段/执行阶段”)都会通过某种形式的“位置或阶段编码”进入模型,使机器人能够理解“何时发生了什么”。


2.4.4 Encoder–Decoder 架构与纯 Decoder 架构

Transformer 最初以编码器–解码器(Encoder–Decoder)形式提出,用于机器翻译等序列到序列任务。随后,纯Decoder-only架构(如 GPT 系列)成为大语言模型和部分 VLA 模型的主流。理解两者差异,有助于后面选择适合具身智能任务的结构。(arXiv)

2.4.4.1 编码器–解码器架构:典型 Seq2Seq 形式

在 Encoder–Decoder Transformer 中:

+编码器(Encoder):由多层“自注意力 + 前馈网络(FFN)”组成。输入为源序列(例如源语言句子、环境描述、视觉特征序列),经过多层编码后,得到每个位置的上下文表示。 +解码器(Decoder):同样由多层堆叠组成,但每一层一般包括:

  1. 带因果掩码的自注意力(masked self-attention),建模目标序列内部已生成部分;
  2. 编码器–解码器注意力(encoder-decoder cross-attention),使用解码器当前层隐藏状态作为 Query,编码器输出作为 Key/Value,从源序列里“查找”与当前生成位置相关的信息;
  3. 前馈网络。

这种结构天然适合“把一段信息转换为另一段信息”的任务,例如机器翻译、摘要生成等。(arXiv)

【图 2-4-7 占位:Encoder–Decoder 架构总览图。左侧是若干 Encoder 层叠加,右侧是 Decoder 层,Decoder 每层中有 self-attention、cross-attention 两种注意力模块,中间用箭头表示 cross-attention 连接。】

在具身智能场景中,如果希望“根据视觉感知或状态序列生成一整段动作脚本”,也可以将视觉/状态作为编码器输入,把动作序列作为解码器输出,这与机器翻译非常类似,只是“目标语言”换成了“机器人动作语言”。

2.4.4.2 纯解码器(Decoder-only)架构:统一序列建模

Decoder-only架构则去掉了单独的编码器,仅保留一堆带因果掩码的自注意力层。训练时将所有内容串成一个长序列,采用自回归语言建模目标:给定前缀 token 预测下一个 token。(Hugging Face)

其特点是:

  • 所有信息(指令、上下文、历史观测、历史动作等)都以统一 token 序列的形式输入;
  • 模型结构更加简洁——本质上就是一个大号自回归 Transformer;
  • 通过合适的分隔符 token 和位置段编码,可以区分“指令区域”“状态区域”“动作区域”等。

这正是 GPT 系列等大语言模型采用的结构,也是许多最新 VLM/VLA 模型采用的范式 —— 将视觉特征、语言指令、机器人状态和动作都离散化成 token,统一交给一个 Decoder-only 模型处理。(科学导向)

2.4.4.3 架构选择:任务类型与工程需求

总结两者的适用场景:

+Encoder–Decoder 架构

  • 适合“源序列–目标序列”有明显区分的任务,如机器翻译、长文本摘要、将一段视觉/语言描述转换为完整动作脚本;
  • 在具身智能中,可用于“先感知–后离线规划”的场景,例如根据任务描述和环境扫描生成一条完整的执行计划。 +Decoder-only 架构
  • 适合大规模预训练的通用语言/多模态模型。通过把不同模态与任务都统一到 token 序列上,可以用同一套训练目标和基础设施扩展到非常大的规模;
  • 在具身智能中,可通过“指令 + 多模态观测 + 历史轨迹”的统一序列,让同一个基础模型同时学会多种机器人和多种任务的行为模式。

在第 8 章讨论 VLA 架构时,将可以看到两种思路的具体实现:一类是“感知模块 + Decoder 生成动作”的结构(更接近 Encoder–Decoder),另一类则是基于大号 Decoder-only 模型,通过 token 化动作实现统一序列建模的结构。

【图 2-4-8 占位:架构对比图。左侧是 Encoder–Decoder 结构示意,右侧是 Decoder-only 结构示意,下方各自标注典型应用场景(机器翻译 vs GPT 风格生成 vs 多模态 VLA)。】


2.4.5 参数规模与计算复杂度

Transformer 的表达能力很强,但背后对应的是相当可观的参数规模与计算复杂度。本节从参数量和时间/空间复杂度两个角度建立直观认识,这对于后续讨论机器人系统部署、模型压缩与高效注意力尤为重要。(科学导向)

2.4.5.1 Transformer 参数规模估算

以一个标准 Transformer Block 为例,假设:

  • 模型隐藏维度为 \(d_\text{model}\);
  • 前馈网络内部维度为 \(d_\text{ff}\)(通常取 \(4d_\text{model}\) 左右);
  • 注意力头数为 \(\displaystyle h\)。

单层的大致参数量:

1.自注意力部分

  • Q/K/V 三个线性层:约 \(3 d_\text{model}^2\) 参数;
  • 输出线性层 \(W^O\):约 \(d_\text{model}^2\) 参数。 合计 \(\approx 4 d_\text{model}^2\)。 2.前馈网络部分(两层 MLP)
  • 第一层:\(d_\text{model} \times d_\text{ff}\);
  • 第二层:\(d_\text{ff} \times d_\text{model}\)。 合计 \(\approx 2 d_\text{model} d_\text{ff}\),在 \(d_\text{ff} \approx 4d_\text{model}\) 时,同样是 \(\mathcal{O}(d_\text{model}^2)\) 量级。(arXiv)

因此,单层 Transformer Block 的参数规模近似为:

\[ \mathcal{O}\big(d_\text{model}^2\big), \]

整个模型若有 \(\displaystyle L\) 层,则总参数量大致为:

\[ \mathcal{O}\big(L d_\text{model}^2\big). \]

这解释了为何在提升模型能力时,增大 \(d_\text{model}\) 和层数会带来近似“平方级别”的参数增长。现代大语言模型和多模态模型往往具有数十到数百层、数千到上万的隐藏维度,对应参数规模可以轻松达到百亿甚至万亿级别。(科学导向)

对于具身智能而言,大参数模型意味着更强的跨任务、跨场景泛化能力(“一个模型包办很多机器人和任务”),但也意味着更重的训练和部署成本,这在后续“模型压缩与边缘部署”相关章节中会成为反复讨论的话题。

2.4.5.2 自注意力的时间与空间复杂度

从计算复杂度角度,自注意力的瓶颈在于构造和使用 \(n \times n\) 的注意力矩阵,其中 \(\displaystyle n\) 为序列长度。(Proceedings of Machine Learning Research)

假设隐藏维度为 \(\displaystyle d\):

  1. 计算 Q/K/V:需要三次矩阵乘法,复杂度约为 \(\mathcal{O}(n d^2)\);
  2. 计算相关性矩阵 \(QK^\top\):复杂度约为 \(\mathcal{O}(n^2 d)\);
  3. 计算 softmax 并与 V 相乘:同样约为 \(\mathcal{O}(n^2 d)\)。

当 \(n\) 较大时,\(\mathcal{O}(n^2 d)\) 项占主导,因此通常说自注意力在序列长度上的时间和空间复杂度均为 \(\mathcal{O}(n^2)\)。(ACL Anthology)

这在 NLP 中已经构成长文本建模的瓶颈,而在具身智能中,情况往往更加严峻:

  • 机器人控制序列可能包含成千上万步决策;
  • 视觉输入可能是一长段视频(每帧又被切分为多个 patch);
  • 若将语言、视觉、状态、动作 token 统一串成一个长序列 \(n\),则注意力矩阵大小和计算量会极快增长。

为此,近几年出现了大量高效 Transformer 变体,如 Linformer、Performer、Longformer 等,通过低秩近似、稀疏注意力、窗口注意力等机制,将复杂度从 \(\mathcal{O}(n^2)\) 降低到近似线性的 \(\mathcal{O}(n)\) 或 \(\mathcal{O}(n \log n)\),使得长序列任务(包括视频、长轨迹建模)变得可行。(arXiv)

【图 2-4-9 占位:复杂度对比曲线。横轴为序列长度 \(n\)(对数尺度),纵轴为计算/显存开销(对数尺度),画出标准自注意力的 \(n^2\) 曲线与若干近似方法的线性或次线性曲线,标出典型 Transformer 变体名称。】

在本书后面更偏工程实践的章节,将会简要介绍这些高效注意力结构的使用场景,帮助读者在实际机器人项目中根据环境复杂度与硬件条件做出合理选择。

2.4.5.3 模型规模与性能:缩放效应与资源约束

大量工作表明,在足够的数据和计算资源下,Transformer 模型的性能往往随着参数量、训练数据量和训练算力的增加呈现近似幂律关系,即“缩放定律(scaling laws)”:更大模型在语言理解、视觉感知和多模态任务上往往获得更好的泛化能力和少样本学习能力。(科学导向)

然而,在具身智能与机器人领域,还必须严肃考虑以下现实因素:

+训练数据与成本限制 真实机器人互动数据极其昂贵,仿真数据也需要大量算力生成。很难像语言模型那样简单地“堆数据、堆算力”。因此实践中往往采用“互联网多模态预训练 + 少量机器人数据微调”的方式,让大模型在丰富的视觉–语言知识基础上学习具身技能。 +推理延迟与实时性要求 机器人控制通常需要在几十毫秒级内完成一次决策,超出这个延迟可能会明显影响动作平滑性甚至安全性。过大的模型虽然能力强,但若推理速度不足,就只能用于离线规划或云端辅助,而难以直接用于实时闭环控制。 +部署位置与算力约束 在云端运行大模型可以使用强大 GPU/TPU,但极度依赖网络连接,且存在安全与隐私问题;在机器人本体或边缘设备上,则必须结合嵌入式 GPU、专用加速芯片等选择合适规模的模型。这些问题将在第 10 章“部署与评测”和第 10.4 节“工程优化与压缩”中进一步展开。

因此,在实际的 VLA 系统设计中,“尽可能大”并不总是最佳答案。更合理的策略通常是:

  • 利用大规模模型作为“通用基础模型”或云端规划者;
  • 同时通过蒸馏、量化和架构简化,在机器人本体上部署较小的实时控制模型;
  • 在任务复杂度、泛化能力、实时控制、安全性和成本之间寻找平衡点。

这也是本书从理论到实践不断强调的一条主线:Transformer 和大模型为具身智能提供了前所未有的表达能力,但要真正落地到物理机器人上,必须在模型能力与系统工程之间进行精心权衡与设计。


以上就是 2.4.1–2.4.5 的完整展开稿,后续在第 8 章你就可以直接把这里的 Self-Attention、多头、位置编码、架构差异自然嫁接到具体 VLA 模型的输入输出与训练设计上。

本章小结与自测

三行小结

  1. 本章建立深度学习训练与 Transformer 的工程认知。
  2. 核心是结构、目标函数、优化与稳定性联动理解。
  3. 学完后应能从训练日志定位主要问题来源。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 只看模型结构,不看训练配置。
  2. 出现 NaN 时只降学习率而不查数据。
  3. 把单次结果当作稳定结论。

公式到代码(最小示例)

import torch

model = torch.nn.Linear(16, 4)
opt = torch.optim.AdamW(model.parameters(), lr=1e-3)
x = torch.randn(8, 16)
y = torch.randint(0, 4, (8,))
loss = torch.nn.CrossEntropyLoss()(model(x), y)
loss.backward()
torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)
opt.step(); opt.zero_grad()

本章外部参考(集中)

  1. arXiv
  2. 维基百科
  3. billparker.ai
  4. NeurIPS论文
  5. 科学导向
  6. ACL Anthology
  7. arXiv
  8. Lilian Weng
  9. Hugging Face
  10. Proceedings of Machine Learning Research
  11. ACL Anthology
  12. arXiv