Transformer 2. Attention 注意力机制
在上一篇 Transformer 1. 讲在 Transformer 之前:序列模型的基本思路与根本诉求
中,我们明确了序列算法的根本诉求是建立样本间关联,而成功的做法都依赖加权求和,核心问题因而转化为如何合理计算权重。并且,我们对 Transformer 起了个头 —— 通过样本间相关性为每个样本赋予权重,自注意力则用 Q×K 等矩阵运算在序列内部完成相关性计算与语义解读。
本文在“序列建模依赖加权求和、权重由注意力机制计算”这一结论之上,系统介绍 Transformer 中的**自注意力(Self-Attention)**运算流程:由词向量经 W Q W_Q WQ、 W K W_K WK、 W V W_V WV 得到 Q、K、V 矩阵;通过 Q K T / d k QK^T/\sqrt{d_k} QKT/dk 计算相关性并做缩放;经 softmax 得到归一化权重;再对 V 做加权求和,完成样本间信息融合。随后讲解 多头注意力(Multi-Head Attention) 的动机、多组 Q/K/V 的并行计算、多头输出的拼接方式及其多角度建模的优势,为理解 Transformer 整体架构提供计算层面的基础。
关键词:注意力机制;自注意力;Query/Key/Value;缩放点积注意力;softmax;多头注意力;Transformer
1 注意力机制
想象一下,当你在阅读一篇文章时,你的大脑会自动关注某些关键词和重要信息,而忽略一些不太重要的细节。这种"选择性关注"的能力,正是注意力机制想要在人工智能中实现的功能。
一句话来形容注意力机制:请把你的注意力放到那些重要的信息上。
QKV的定义和计算:
A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q,K,V) = softmax(\frac{QK^{T}}{\sqrt{d_k}})V Attention(Q,K,V)=softmax(dkQKT)V
d k d_k dk是向量维度,比如GPT3里面12288维。
- Q: Query
- K: Key
- V: Value
我们这里举个例子,来解释 Q, K, V是什么意思。
比如,我们现在一个班里面有很多同学,我们对他们的身高体重进行了记录。现在,新来了一个同学,他的身高是178cm,我们像预估他的体重:

首先我们要根据新来同学的身高,和班里面现有同学的身高做一个比较,算一个相关度系数。我们假定说,身高约接近的同学他们的体重更具有参考性:

然后,我们预估一下新来同学的体重,基于现有同学的体重以及相关度系数。

现在我们来拓展一下,我们新来的同学,我们知道他的身高,胸围和腿长,我们也知道班级里面现有的同学的身高,胸围和腿长数据,我们来预估一下这位新来的同学的体重。一样的道理。但是输入变成了一个三维向量。
这里我们应该对于Q, K, V有一点感觉了。Q(Query)类似于我们的一个输入,K (key) 和 V (Value) 是一对键值,一一对应的关系。
我们再拓展这个输入维度,到大模型的一个例子。

Q 类似于我们问的一个问题,K就像一个数据库里面有很多很多问题,Q的这个问题虽然和K厘米那的问题不会一样,但我们可以计算相关度,找到和Q比较相关的K,V就是K对应的回答。
这个过程就叫注意力机制。
💡 理解要点:一句话来形容注意力机制:请把你的注意力放到那些重要的信息上。注意力机制的核心思想是让模型学会"关注"输入序列中的不同部分,并为每个部分分配不同的重要性权重。
2 Transformer中的自注意力机制运算流程
2.1 注意力机制和自注意力机制的区别
经典注意力(Attention)做的是跨序列的样本相关性计算:关心的是序列 A 的样本对序列 B 的重要程度。典型场景是序列到序列(Seq2Seq)任务,例如机器翻译——源语言句子中的每个词,对当前正在生成的目标语言词有多大影响;也就是“源序列的样本之于目标序列的重要程度”。
自注意力(Self-Attention)做的是同一序列内部的样本相关性计算:关心的是序列 A 的样本对序列 A 自身的重要程度。例如在一个句子内部,每个词对“理解整句”或“表示当前词”的贡献有多大;Q、K、V 都来自同一输入序列,只是通过不同的权重矩阵 W Q W_Q WQ、 W K W_K WK、 W V W_V WV 得到。
💡 理解要点:前者是“A 对 B 的注意力”(两段序列),后者是“A 对 A 的注意力”(一段序列内部)。Transformer 里用的是自注意力,下文中的 Q、K、V 均来自同一序列。
2.2 Step1:通过词向量得到Q、K、V矩阵
在Transformer中,我们首先需要将原始的特征矩阵转化为三个不同的矩阵:Query(查询)、Key(键)和Value(值)。这个过程就像是在准备一场"信息检索"的准备工作。
具体计算公式:
A
t
t
e
n
t
i
o
n
(
Q
,
K
,
V
)
=
s
o
f
t
m
a
x
(
Q
K
T
d
k
)
V
Attention(Q,K,V) = softmax(\frac{QK^{T}}{\sqrt{d_k}})V
Attention(Q,K,V)=softmax(dkQKT)V
🔍 实际例子:想象你有一个包含4个单词的句子,每个单词被编码成了6维的词向量。那么:
- 原始特征矩阵X的形状是(4, 6)
- 通过三个不同的权重矩阵
W
Q
W_Q
WQ、
W
K
W_K
WK、
W
V
W_V
WV,我们得到:
- Q = X × W Q Q = X × W_Q Q=X×WQ
- K = X × W K K = X × W_K K=X×WK
- V = X × W V V = X × W_V V=X×WV

💡 理解要点: W Q W_Q WQ、 W K W_K WK、 W V W_V WV就像三个不同的"翻译器",它们将原始信息翻译成不同的"语言",用于不同的目的。
2.3 Step2:计算QK相似度,得到相关性矩阵
这一步是注意力机制的核心,我们通过计算Q和K的转置相乘来获得相关性矩阵。这个过程就像是在计算"谁和谁更相似"。
为什么需要除以 d k \sqrt{d_k} dk?
想象一下,当你在计算两个向量的相似度时,如果向量的维度越高,那么相乘后相加的项就越多,最终得到的数值就会越大。这就像是在比较两个人的相似度时,如果你比较的特征越多(比如身高、体重、年龄、性格等),那么最终的相似度分数就会越高。
为了消除这种"维度偏见",Transformer引入了缩放因子 d k \sqrt{d_k} dk:
A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q,K,V) = softmax(\frac{QK^{T}}{\sqrt{d_k}})V Attention(Q,K,V)=softmax(dkQKT)V
🔍 实际例子:假设 d k = 6 d_k = 6 dk=6,那么我们就除以 6 ≈ 2.45 \sqrt{6}≈ 2.45 6≈2.45。这样可以让相关性分数更加稳定,不会因为特征维度的高低而产生过大的波动。
💡 理解要点:缩放操作就像是在给相关性分数"降温",让它们保持在一个合理的范围内,避免数值过大导致的梯度消失或爆炸问题。
2.4 Step3:softmax函数归一化
经过缩放后的相关性分数,我们还需要通过softmax函数将它们转换为概率分布。这个过程就像是在将"相似度分数"转换为"重要性权重"。
softmax的作用:
- 将所有分数压缩到[0,1]区间
- 确保每一行的权重总和等于1
- 让模型能够进行"概率化"的决策
🔍 实际例子:假设我们有两个样本A和B,计算出的相关性矩阵为:
- AA(A与A的相关性)= 0.8
- AB(A与B的相关性)= 0.2
- BA(B与A的相关性)= 0.3
- BB(B与B的相关性)= 0.7
经过softmax后,第一行(A视角)会变成:AA=0.8, AB=0.2(总和=1)
第二行(B视角)会变成:BA=0.3, BB=0.7(总和=1)
💡 理解要点:softmax就像是一个"标准化器",它让每个样本的"注意力分配"都变得合理,确保模型不会过度关注某个特定元素。
2.5 Step4:对样本进行加权求和,建立样本间关系
现在我们已经获得了权重矩阵,接下来就是将这些权重应用到原始信息上,进行加权求和。这个过程就像是在"整合信息",让模型能够综合多个样本的信息来做出决策。
矩阵乘法的意义:

假设我们有以下矩阵:
r = s o f t m a x ( Q K T d k ) = ( a 11 a 12 a 21 a 22 ) , V = ( v 11 v 12 v 13 v 21 v 22 v 23 ) \mathbf{r} = softmax(\frac{QK^{T}}{\sqrt{d_k}}) = \begin{pmatrix} a_{11} & a_{12} \\ a_{21} & a_{22} \end{pmatrix}, \quad \mathbf{V} = \begin{pmatrix} v_{11} & v_{12} & v_{13} \\ v_{21} & v_{22} & v_{23} \end{pmatrix} r=softmax(dkQKT)=(a11a21a12a22),V=(v11v21v12v22v13v23)
相乘结果:
Z ( A t t e n t i o n ) = ( a 11 a 12 a 21 a 22 ) ( v 11 v 12 v 13 v 21 v 22 v 23 ) = ( ( a 11 v 11 + a 12 v 21 ) ( a 11 v 12 + a 12 v 22 ) ( a 11 v 13 + a 12 v 23 ) ( a 21 v 11 + a 22 v 21 ) ( a 21 v 12 + a 22 v 22 ) ( a 21 v 13 + a 22 v 23 ) ) \mathbf{Z(Attention)} = \begin{pmatrix} a_{11} & a_{12} \\ a_{21} & a_{22} \end{pmatrix} \begin{pmatrix} v_{11} & v_{12} & v_{13} \\ v_{21} & v_{22} & v_{23} \end{pmatrix} = \begin{pmatrix} (a_{11}v_{11} + a_{12}v_{21}) & (a_{11}v_{12} + a_{12}v_{22}) & (a_{11}v_{13} + a_{12}v_{23}) \\ (a_{21}v_{11} + a_{22}v_{21}) & (a_{21}v_{12} + a_{22}v_{22}) & (a_{21}v_{13} + a_{22}v_{23}) \end{pmatrix} Z(Attention)=(a11a21a12a22)(v11v21v12v22v13v23)=((a11v11+a12v21)(a21v11+a22v21)(a11v12+a12v22)(a21v12+a22v22)(a11v13+a12v23)(a21v13+a22v23))
🔍 实际例子:式子 ( a 11 v 11 + a 12 v 21 ) (a_{11}v_{11} + a_{12}v_{21}) (a11v11+a12v21)实际上是在说:“我要用样本1的重要性权重 a 11 a_{11} a11乘以样本1的特征 v 11 v_{11} v11,再加上样本2的重要性权重 a 12 a_{12} a12乘以样本2的特征 v 21 v_{21} v21,最终得到一个新的综合特征表示。”
💡 理解要点:这个加权求和的过程实际上是在建立样本之间的"信息桥梁",让每个样本都能够"借用"其他样本的信息来丰富自己的表示。
3 Multi-Head Attention 多头注意力机制
3.1 为什么需要多头注意力?
想象一下,如果只有一个"专家"来分析一段文本,他可能只能从一个角度来理解。但如果我们有8个不同的"专家",每个专家都有自己独特的视角和专长,那么我们对这段文本的理解就会更加全面和深入。
多头注意力机制正是基于这种思想设计的。
3.2 多头注意力的工作原理
Multi-Head Attention 就是在self-attention的基础上,使用多组不同的权重矩阵 W Q W_Q WQ、 W K W_K WK、 W V W_V WV来生成多组Query、Keys、Values,然后每组分别计算得到一个Z矩阵,最后将得到的多个Z矩阵进行拼接。
🔍 实际例子:Transformer原论文使用了8组不同的权重矩阵,就像有8个不同的专家同时分析同一段文本,每个专家都有自己的"专业领域"和"分析角度"。

3.3 多头注意力的拼接操作
假设每个头的输出 Z i Z_i Zi是一个维度为(2,3)的矩阵,如果我们有 h h h个注意力头,那么最终的拼接操作会生成一个维度为(2, 3h)的矩阵。
两个注意力头的例子:
-
头1的输出 Z 1 Z_1 Z1:
Z 1 = ( z 11 z 12 z 13 z 14 z 15 z 16 ) Z_1 = \begin{pmatrix} z_{11} & z_{12} & z_{13} \\ z_{14} & z_{15} & z_{16} \end{pmatrix} Z1=(z11z14z12z15z13z16) -
头2的输出 Z 2 Z_2 Z2:
Z 2 = ( z 21 z 22 z 23 z 24 z 25 z 26 ) Z_2 = \begin{pmatrix} z_{21} & z_{22} & z_{23} \\ z_{24} & z_{25} & z_{26} \end{pmatrix} Z2=(z21z24z22z25z23z26) -
拼接操作:
Z concatenated = ( z 11 z 12 z 13 z 21 z 22 z 23 z 14 z 15 z 16 z 24 z 25 z 26 ) Z_{\text{concatenated}} = \begin{pmatrix} z_{11} & z_{12} & z_{13} & z_{21} & z_{22} & z_{23} \\ z_{14} & z_{15} & z_{16} & z_{24} & z_{25} & z_{26} \end{pmatrix} Zconcatenated=(z11z14z12z15z13z16z21z24z22z25z23z26)
一般情况:
对于 h h h个注意力头,每个头的输出 Z i Z_i Zi为:
Z i = ( z i 1 z i 2 z i 3 z i 4 z i 5 z i 6 ) Z_i = \begin{pmatrix} z_{i1} & z_{i2} & z_{i3} \\ z_{i4} & z_{i5} & z_{i6} \end{pmatrix} Zi=(zi1zi4zi2zi5zi3zi6)
总拼接操作如下:
Z concatenated = ( z 11 z 12 z 13 z 21 z 22 z 23 ⋯ z h 1 z h 2 z h 3 z 14 z 15 z 16 z 24 z 25 z 26 ⋯ z h 4 z h 5 z h 6 ) Z_{\text{concatenated}} = \begin{pmatrix} z_{11} & z_{12} & z_{13} & z_{21} & z_{22} & z_{23} & \cdots & z_{h1} & z_{h2} & z_{h3} \\ z_{14} & z_{15} & z_{16} & z_{24} & z_{25} & z_{26} & \cdots & z_{h4} & z_{h5} & z_{h6} \end{pmatrix} Zconcatenated=(z11z14z12z15z13z16z21z24z22z25z23z26⋯⋯zh1zh4zh2zh5zh3zh6)
最终的结构为(2,3h)。
💡 理解要点:拼接操作就像是在"收集所有专家的意见",将不同角度的分析结果整合在一起,形成更全面的信息表示。
3.4 多头注意力的优势
- 多角度理解:不同的头可以关注不同的模式和信息
- 并行计算:多个头可以同时进行计算,提高效率
- 信息丰富性:综合多个视角的信息,提高模型的表达能力
🔍 实际例子:假设特征矩阵中,序列的长度为100,序列中每个样本的embedding维度为3,并且设置了8头注意力机制,那最终输出的序列就是(100,24)。

多头注意力的优势
- 多角度理解:不同的头可以关注不同的模式和信息
- 并行计算:多个头可以同时进行计算,提高效率
- 信息丰富性:综合多个视角的信息,提高模型的表达能力
🔍 实际例子:假设特征矩阵中,序列的长度为100,序列中每个样本的embedding维度为3,并且设置了8头注意力机制,那最终输出的序列就是(100,24)。
更多推荐
所有评论(0)