自注意力机制
请写出缩放点积注意力的完整公式,并解释每个变量的含义。¶
缩放点积注意力是Transformer的核心操作,它将查询(Query)与键(Key)进行匹配,用匹配得分对值(Value)进行加权聚合。其完整公式为:

变量含义:


¶

自注意力机制为什么能捕捉序列内部的全局依赖?与 RNN 相比根本优势在哪?¶
全局依赖捕捉:在自注意力中,序列中每个位置都要计算与序列中所有其他位置的注意力权重(包括自己)。这意味着任意两个位置之间都存在直接的交互路径,无论它们在序列中相距多远。信息可以在单步计算中从一端流向另一端,没有任何距离衰减。相比之下,RNN(包括LSTM、GRU)是逐步递归处理的:信息必须按时间步依次传递,第 tt 步的隐状态只能直接看到第 t−1 步的信息,远处的信息需要经过多个时间步才能间接影响当前状态。随着距离增加,RNN 会遭遇梯度消失/爆炸问题,导致长期依赖难以学习。
根本优势:
-
计算并行化:自注意力中每个位置的输出可以独立、并行计算,因为所有位置之间的注意力分数可以一次性通过矩阵乘法得到。训练时不需要像RNN那样按时间步串行展开,极大提升了训练速度。
-
路径长度短:任意两个位置之间的信息传播路径长度为O(1)(直接注意力连接),而RNN需要O(距离)的时间步,长距离传播困难。
-
动态权重:注意力权重由输入内容动态决定,能够根据上下文灵活地调整关注点;而RNN的隐状态更新虽然也有门控,但其连接模式是固定的递归结构,灵活性较差。
-
可解释性:注意力权重可以直接可视化,展示模型在生成每个输出时依赖于输入的哪些部分,增强了模型的可解释性。
自注意力的计算复杂度是 O(L2d),这里的 L 和 d 分别指什么?为什么复杂度与 L2 成正比?¶
-
L:输入序列的长度(token数量)。
-
d:特征维度(通常等于 dk 和 dv,即每个token的嵌入维度或隐藏维度)。
复杂度分析:

自注意力中 softmax 的温度系数是什么?调整温度会对注意力分布产生什么影响?¶
温度系数 T(通常称为温度,temperature)是softmax函数的一个可调节超参数,用于控制输出分布的平滑程度。在注意力机制中,公式可以写为:


温度的影响:
-
T→0:softmax趋近于argmax,输出分布极度尖锐,注意力几乎全部集中在分数最大的那个位置上,其他位置权重接近0。模型变得非常“硬”,只关注单一位置,丧失多位置聚合能力,梯度也接近零。
-
T=1:标准softmax,分布由输入分数自然决定。
-
T>1:softmax变得更平滑,注意力分布更加均匀(趋近于平均分布)。极端情况下 T→∞,所有位置的注意力权重相等,输出变成了对所有值的简单平均。
在训练中,温度可用于控制模型的学习难度。例如,在知识蒸馏或对比学习中,较低的温度会强调困难样本的区分度,较高的温度会使分布更软,保留更多类别间的相对关系。在Transformer的标准注意力中,通常

在自注意力计算中,Q、K、V 分别代表什么?它们是如何从输入序列得到的?¶
角色:
-
Q(Query,查询):表示“我想从其他位置获取什么信息”。当前正在计算注意力的位置生成查询向量,去与其他所有位置的键进行匹配。
-
K(Key,键):表示“我这里有什么信息供别人查询”。序列中每个位置生成键向量,用于被其他位置的查询匹配。
-
V(Value,值):表示“我实际要传递的信息内容”。注意力权重作用于值向量上,最终输出的是值的加权和。
来源:在自注意力中,Q、K、V 都来自同一个输入序列 X(形状 L×dmodel),但通过三个不同的线性投影矩阵(可学习参数)变换得到:

注意力权重矩阵的每一行有什么含义?可视化注意力权重能告诉我们什么?¶

可视化注意力权重的意义:
-
理解信息流动:可以看到模型在做某个预测时,主要依赖于序列中的哪些其他token。例如在机器翻译中,解码器的某个时间步的注意力权重通常集中在编码器对应的源语言词组上。
-
发现语言结构:注意力图常呈现出特定的模式,如对角线附近关注相邻词(局部依赖),某些头专门关注标点符号,或关注整个句子的起始标记([CLS])以获取全局信息。
-
诊断模型行为:如果模型犯错,通过查看注意力图可以判断它是否关注了错误的源信息。例如在指代消解中,代词应该关注它所指的名词;如果注意力没有集中在正确名词上,就表明模型没有学到该指代关系。
-
多头注意力的多样性:不同注意力头可能学会不同的模式:有的负责句法结构,有的负责语义相关,可视化可以验证多头是否各司其职。
但需注意,注意力权重并不完全等同于模型决策的因果解释(有研究表明高注意力不一定代表高重要性),但它们仍能提供有价值的分析线索。
自注意力如何实现“动态”权重?相比固定窗口或卷积有什么优势?¶
动态权重的实现:自注意力的权重不是固定的参数,而是由输入本身的内容决定的。具体来说,权重是通过查询和键的点积计算得到的,而 Q 和 K 都是输入序列通过可学习的线性投影后产生的,因此不同的输入会产生完全不同的注意力分布。这种内容依赖性就是“动态”的含义。
相比固定窗口或卷积的优势:
-
内容自适应:固定窗口(如局部注意力)或者卷积的权重模式是预定义的(卷积核在空间上共享权重,局部窗口大小固定),与输入的具体内容无关。例如一个卷积层对任何输入图像都使用相同的滤波器。自注意力则不同,即使序列中两个token位置相同,但输入内容不同时,注意力权重也会改变。它能根据具体的语义自动决定哪些token更应该被关注。
-
全局依赖性:卷积受限于感受野大小,需要堆叠多层才能逐渐扩大感受野;而自注意力在一层内即可建立任意两个token之间的直接联系,无论它们在序列中相距多远。
-
更灵活的模式:自注意力可以同时捕捉多种关系(通过多头机制),例如既关注局部上下文,又关注全局主题信息;而固定窗口只能捕捉局部信息。
当然,动态权重的代价是计算复杂度高(平方复杂度),且需要大量数据才能学到有效的注意力模式。
自注意力在处理长序列时的主要瓶颈是什么?时间复杂度和空间复杂度分别是多少?¶

为什么 Transformer 的注意力机制被称为“缩放点积注意力”?和加性注意力有什么不同?¶
缩放点积注意力得名于两个关键操作:
- 点积:使用查询与键的点积来计算相似度,而不是其他函数。

与加性注意力的不同:

在 Transformer 中采用缩放点积注意力的主要原因是效率。现代GPU对矩阵乘法高度优化,点积注意力可以完全利用矩阵运算并行化,训练速度快;而加性注意力在序列长度较大时速度慢很多。同时,通过多头机制和投影矩阵,点积注意力也获得了足够的表达能力。
如果输入序列是“我/爱/你”,计算“爱”对该序列的自注意力输出时,Q、K、V 如何参与?¶
假设序列为 x1,x2,x3 分别对应“我”、“爱”、“你”。当前要计算“爱”(位置2)的自注意力输出向量。
步骤:
生成Q、K、V:
对整个输入序列做线性投影,得到每个位置的查询、键、值向量:

计算注意力分数:

缩放并softmax:

加权聚合值:

请解释自注意力的并行化是如何实现的,为什么训练时比 RNN 快得多?¶
并行化实现:
自注意力计算可以完全通过矩阵运算并行完成,不需要像RNN那样逐步迭代。具体来说:

现代GPU专为大规模矩阵乘法优化,自注意力的这些操作都可以在GPU上高度并行执行。相比之下,RNN必须按时间步展开:第 t步的计算依赖于第 t−1 步的隐状态,无法在时间维度上并行,只能串行处理。因此,对于长度为 L的序列,RNN需要 O(L) 个串行步骤,而自注意力只需要 O(1) 个串行步骤(假设矩阵乘法内部充分并行)。在训练时,自注意力通过一次前向即可得到所有位置的输出,而RNN必须逐时间步计算并存储中间隐状态,反向传播时还要随时间步反向传播(BPTT),无法充分利用GPU并行度,训练速度远慢于自注意力。这就是Transformer训练效率远超RNN的根本原因。
自注意力机制能否捕捉到序列的顺序信息?如果不能,它是如何通过其他组件弥补的?¶
自注意力本身不能捕捉顺序信息。因为自注意力计算的是输入序列中每对token之间的相关性,这个计算过程是对称且置换等变的——如果你将输入序列的顺序打乱,自注意力输出的每个位置的表示也会跟着打乱到对应的新位置,但表示的内容不会改变。也就是说,对于自注意力,“A B C”和“C B A”只是排列不同,它无法感知字母的先后顺序。
弥补方式:位置编码。Transformer通过向输入嵌入中添加位置编码来注入顺序信息。位置编码是一个与输入嵌入相同维度的向量,它按照token在序列中的位置生成,使得每个位置的输入表示不仅包含语义信息,还包含该位置的位置信号。
具体有两种实现:
-
正弦位置编码(Sinusoidal Positional Encoding):原版Transformer使用不同频率的正弦和余弦函数生成固定模式的位置编码。它的好处是可以外推到训练时未见过的序列长度,且不需要额外学习参数。
-
可学习位置编码(Learned Positional Embedding):BERT、GPT等模型直接为每个位置初始化一个可学习的嵌入向量,在训练过程中优化。这种方式更灵活,但最大长度固定。
位置编码与词嵌入相加后进入自注意力,使得每个token的表示同时携带了“是什么”和“在哪里”的信息。这样,即使自注意力计算本身是位置无关的,输入中已经嵌入了位置信息,注意力权重就能间接感知到顺序——例如,相邻位置的token会因为位置编码相似而倾向于获得更高的注意力权重。
后来的变体如相对位置编码(Relative Positional Encoding)直接在注意力计算中注入相对位置偏置,进一步强化了顺序建模能力。例如Transformer-XL和T5使用相对位置编码,将两个token之间的相对距离作为偏置项加到注意力分数中,使得模型更自然地理解“距离近的token更相关”。
如果 Q、K、V 不使用不同的投影矩阵,而是共享同一个矩阵,会有什么影响?¶
标准自注意力中,输入序列 X 分别通过三个不同的线性投影矩阵 W_Q、W_K、W_V 得到 Query、Key、Value。这三个矩阵独立学习,赋予模型不同的表征空间。
如果强制 Q、K、V 共享同一个投影矩阵(即 W_Q = W_K = W_V = W),那么:
-
计算出的 Query、Key、Value 都来自同一个线性变换后的空间,它们在数学上是同一个向量空间的线性投影。这会导致注意力分数矩阵变为 (XW)(XW)^T,本质上就是线性变换后向量之间的点积。
-
模型失去不对称性。Q和K负责计算注意力权重,V负责聚合信息。共享投影后,用于匹配的表示和用于聚合的表示完全相同,模型无法区分“用于查询的特征”和“用于被查询的特征”。这在某些需要非对称交互的任务中会限制表达能力。
-
参数减少,但可能欠拟合。共享矩阵虽然减少了参数量,但也限制了模型从不同角度学习输入的能力。对于复杂任务,这种限制可能导致性能下降。
但共享投影并非全无优点:在一些轻量级模型或特定任务中,共享参数可以作为一种正则化手段,减少过拟合风险,并降低计算和存储开销。例如,ALBERT 共享跨层参数以减少参数量,虽然不是直接共享QKV,但思路类似。如果任务简单或数据量少,共享QKV投影可能仍能取得可接受的效果,但通常标准做法是保持独立。
为什么缩放点积注意力在 d_k 较大时会出现梯度消失问题?结合 softmax 的饱和区分析。¶
缩放点积注意力的计算为:

点积 QK^T 中的元素是两个 d_k 维向量的内积。假设 Q 和 K 的每个分量是独立同分布的零均值、单位方差随机变量,那么点积的均值为0,方差为 d_k。当 d_k 很大时,点积的值会分布在绝对值较大的范围内,极端值(正或负)会非常多。
Softmax 的饱和区:softmax 函数将输入映射到概率分布,当输入向量的某些分量非常大(正)或非常小(负)时,softmax 输出会饱和——极大的正输入对应的输出接近1,极负的输入对应的输出接近0。饱和区的梯度几乎为零(因为 softmax 梯度公式为 p_i(1-p_i) 或 -p_i p_j,当 p_i 接近0或1时梯度趋于0)。
具体过程:
-
当 d_k 很大时,QK^T 的元素方差很大,导致未缩放的注意力分数中存在巨大值,经过 softmax 后,注意力分布变得极度尖锐(接近 one-hot),大部分位置的注意力权重接近0。
-
在反向传播时,由于梯度与注意力权重相关,那些接近0的权重梯度几乎为0,导致前面的参数更新信号微弱,训练困难甚至停滞。
除以 dkdk 的作用:将点积缩放,使其方差保持在大约1的水平,这样 softmax 的输入就落在非饱和区,梯度可以正常流动。这就是为什么需要缩放点积注意力。没有缩放,大 d_k 会导致梯度消失;缩放后,训练稳定。
自注意力的计算中,能否先计算 K^T V 再与 Q 相乘?这种改变有什么优缺点?¶
标准自注意力:先计算 QK^T 得到注意力矩阵(n×n),再与 V 相乘,计算复杂度 O(n^2 d + n^2 d) ≈ O(n^2 d)。
先计算 K^T V:K 是 n×d_k,V 是 n×d_v,K^T V 得到 d_k×d_v 的矩阵,然后 Q(n×d_k)与之相乘得到 n×d_v。复杂度为 O(n d_k d_v + n d_k d_v) ≈ O(n d^2)(设 d_k = d_v = d)。
优点:
-
当序列长度 n 远大于特征维度 d 时,复杂度从 O(n^2 d) 降为 O(n d^2),显著降低计算量。这在处理超长序列但特征维度较小的情况下非常有利。
-
不需要显式存储 n×n 的注意力矩阵,节省显存。
缺点:
-
当 d 很大时,复杂度变为 O(n d^2),可能比 O(n^2 d) 更差。通常 d 是固定的几百到上千,而 n 可变,对于中等长度序列,n^2 可能远大于 d^2,所以这种交换在序列长时有益,序列短时可能反而效率低。
-
更重要的是,K^T V 先计算相当于基于 Key 和 Value 构建了一个全局的“上下文映射”矩阵(d×d),然后每个 Query 通过这个映射直接得到聚合结果。这完全失去了非线性和逐位置的注意力权重分布,因为 Q 与 (K^T V) 相乘相当于用 Q 对 K 和 V 的某种全局统计进行线性组合,没有显式的两两匹配过程。这相当于一个线性化的注意力(Linearized Attention),牺牲了标准注意力的细粒度匹配能力。虽然计算效率高,但可能损失精度,在需要精确 token 级别对齐的任务上表现不佳。
因此,这种改变本质上是线性注意力的一种形式,适用于对效率要求极高、可接受一定精度损失的场景(如 Performer、Linear Transformer 等线性注意力变体)。
在计算注意力权重时,能不能用欧氏距离或余弦相似度替代点积?需要做哪些调整?¶
欧氏距离:衡量两个向量的不相似度,值越小越相似。注意力需要相似度越大权重越高,所以可用负欧氏距离或平方距离的负值。欧氏距离 = ||q - k||^2 = ||q||^2 + ||k||^2 - 2 q·k。它包含了点积项,但也引入了向量的模长。如果使用欧氏距离,需要确保向量模长不主导相似度(例如通过层归一化控制模长)。此外,距离的范围与点积不同,可能需要调整温度系数或缩放因子。
余弦相似度:归一化点积,即 q·k / (||q|| ||k||)。余弦相似度就是点积的归一化版本,如果 Q 和 K 已经经过 L2 归一化,那么点积就等于余弦相似度。所以,可以直接用余弦相似度替代点积,只需先对 Q 和 K 进行 L2 归一化即可。这样做的好处是消除了向量模长的影响,注意力分数只反映方向相似性,可能对异常值更鲁棒。许多变体(如 NormFormer)就在注意力中使用了这种归一化。
需要调整的地方:
-
如果使用欧氏距离,可以令注意力分数 = -||q - k||^2 / τ(τ 为可学习或固定温度),然后过 softmax。但需要确保距离数值不至于过大或过小,可能需要特征归一化。
-
如果用余弦相似度,可以直接应用,通常配合一个可学习的缩放因子(因为余弦值域为[-1,1],方差较小,可能不需要像点积那样除以√d_k,但也可能需要适当缩放以匹配 softmax 的敏感度)。
总体而言,余弦相似度是更直接的替代,因为它就是归一化点积,且在现代 Transformer 中已有采用(如 qk-norm)。欧氏距离与高斯核函数有关,也可用于注意力,但实践中点积因其简单高效而最普遍。
分析一下自注意力在视觉任务(ViT)和 NLP 任务中的不同表现,为什么 ViT 需要更多数据?¶
NLP 中的自注意力:文本序列天然具有强语法和语义结构,token 的上下文依赖很重要。自注意力能够动态地为每个词聚合全局信息,这对于消歧义、指代消解、长程依赖建模非常有效。此外,NLP 中预训练数据量极大(如几十亿词),且迁移学习成熟。
ViT 中的自注意力:图像被切分成 patches,每个 patch 被视为一个 token,整个图像转换为 token 序列进行自注意力。自注意力在图像上有以下几个特点:
-
缺乏卷积的归纳偏置:CNN 具有平移等变性和局部性等归纳偏置,天然适合图像。ViT 没有这些先验,必须从数据中学习空间关系(如相邻 patch 的相关性),这需要更多数据。
-
图像信号更“密集”但冗余:图像 patch 之间相关性高,很多背景区域信息量低。自注意力计算所有 patch 对之间的关联,造成大量计算浪费在没有信息的区域上。CNN 通过局部卷积高效利用空间冗余。
-
对位置信息敏感:图像中的绝对位置和相对位置都很重要。ViT 需要学习合适的位置编码来捕捉空间结构,而 NLP 中相对位置更关键。
为什么 ViT 需要更多数据:
由于没有卷积的强归纳偏置,ViT 在中小规模数据集上容易过拟合且泛化差,无法学到与 CNN 相媲美的特征。只有在大规模预训练(如 JFT-300M 或 ImageNet-21K)时,ViT 才能凭借自注意力的全局感受野和可扩展性超越 CNN。足够的数据让 ViT 从零开始学到类似卷积的局部特征和多层次表示,同时也得益于 Transformer 的大规模扩展能力(scaling law)。简言之,数据是 ViT 弥补缺乏归纳偏置的“养分”。
如果输入序列中大部分 token 是 padding,如何在注意力计算中高效忽略它们?优化手段有哪些?¶
Padding 用于统一批次中不同长度序列。在注意力计算中,需要让模型不关注 padding 位置,通常通过注意力掩码实现:将 padding 位置的注意力分数设为负无穷(或非常大的负数),这样经过 softmax 后权重趋近于 0。
优化手段:
-
提前生成掩码并向量化:直接创建一个二值掩码矩阵(batch×1×seq×seq 或类似形状),在 softmax 之前加到注意力分数上。这是最常用的方法,GPU 上操作高效。
-
避免对 padding 位置计算点积:可以使用稀疏操作或 gather 方式,只计算有效 token 之间的点积,但实现复杂且可能破坏 GPU 的并行性。通常不值得,因为现代 GPU 对稠密矩阵乘法优化极好,即使计算了 padding 位置的点积开销也很小。
-
在 softmax 后乘以掩码:也可以 softmax 后再将 padding 对应权重置零,但不如加 -inf 直接(softmax 内部保证了归一化)。
-
使用 packed sequence:将批次中的多个序列连接成一个长序列,用指针记录每个序列的起止位置,这样完全消除 padding,计算量最小。但需要更复杂的数据加载和注意力 mask 设计(通常采用块对角 mask)。在高效 Transformer 库(如 FlashAttention)中已支持这种格式。
-
FlashAttention 等高效实现:利用分块计算,可以在块内根据变长序列有效跳过 padding,减少计算和显存。
实际中,大多数框架通过加 mask 并依赖 GPU 的稠密计算就足够高效,因为 padding 占比通常不会太大。当 batch 内长度差异极端时,packed sequence 是最优解。
自注意力矩阵通常是低秩的吗?这对设计高效注意力有什么启示?¶
大量研究表明,预训练 Transformer 中的自注意力矩阵(n×n)往往是低秩的,尤其是深层。这意味着注意力权重矩阵可以用少数几个主导特征向量近似,信息主要聚集在少数几种注意力模式上(如关注邻近 token、特定分隔符等)。
原因:
-
softmax 输出具有锐化效应,使得大部分 token 的注意力集中在少数几个 token 上。
-
深层网络中,token 表示逐渐收敛,彼此相似度增高,导致注意力矩阵趋向于一个平滑的、秩较低的矩阵。
-
自注意力的组合方式可能天然鼓励低秩:多个 head 的输出拼接后再投影,每个 head 可能只关注一种模式,总组合呈低秩特性。
启示:
-
低秩近似压缩:可以用低秩分解(如 Linformer)将 n×n 注意力矩阵投影到低维空间(如 n×k 和 k×n 的乘积),使复杂度从 O(n^2) 降为 O(nk)。这是线性注意力的理论基础。
-
混合注意力模式:可以将一部分注意力头设计为局部窗口(稀疏),另一部分使用低秩全局注意力,兼顾效率和长程依赖(如 Longformer、BigBird)。
-
动态核方法:使用核函数近似 softmax(如 Performer 的随机正交特征),避免显式计算 n×n 矩阵,本质上利用了注意力的低秩性质。
-
剪枝与蒸馏:在推理时可以识别并裁剪掉贡献小的注意力头或模式,进一步加速。
注意,自注意力的低秩性并非总是成立,尤其在浅层或训练初期可能秩较高。但这一观察为设计高效 Transformer 提供了重要方向,即不必计算完整的 n×n 注意力,而可以用各种近似来大幅减少计算和显存。