注意力机制概述
Transformer先将文本划分为token,再通过Embedding将每个token转换成向量。所有token向量组合后得到一个矩阵,并加入位置编码,使模型能够感知token的顺序和位置。
之后,输入矩阵通过三个可学习的权重矩阵W_Q、W_K、W_V,分别映射为Q、K、V:
Q = X × W_Q
K = X × W_K
V = X × W_V
其中,X是加入位置编码后的输入矩阵,W_Q、W_K、W_V都是模型训练过程中学习得到的参数。
注意力计算流程:
输入矩阵X
↓
映射得到Q、K、V
↓
Q × K^T,得到注意力分数
↓
除以sqrt(d_k)
↓
Softmax,得到注意力权重
↓
注意力权重 × V
↓
得到上下文增强后的输出矩阵
最终输出仍然是一个矩阵,其中每一行对应一个token的上下文表示。单个token对应一个向量,整个序列对应一个向量矩阵。
Q、K、V的作用
-
Q(Query,查询向量):表示当前token想从其他token中获取什么信息。
-
K(Key,键向量):表示当前token具有什么特征,可以和其他token的Q进行匹配。
-
V(Value,值向量):表示当前token真正需要传递和聚合的信息。
可以简单理解为:
Q:我想找什么
K:我有什么特征
V:我能提供什么内容
例如某个token的输入向量为E1,则:
Q1 = E1 × W_Q
K1 = E1 × W_K
V1 = E1 × W_V
单头注意力的计算
一个token的Q会与所有token的K进行点积:
Q_i × K_1
Q_i × K_2
...
Q_i × K_n
点积结果叫作注意力分数(Attention Score),表示当前token与其他token的匹配程度。
注意力分数经过Softmax后,转换为0到1之间且总和为1的注意力权重(Attention Weight)。
然后根据这些权重,对所有V进行加权求和:
output_i = weight_1 × V_1
+ weight_2 × V_2
+ ...
+ weight_n × V_n
得到当前token融合上下文信息后的新向量。所有token的新向量组合起来,就得到注意力输出矩阵。
注意力输出与原始输入相加属于残差连接,不是注意力计算本身:
残差输出 = 原始输入X + Attention输出
为什么要除以sqrt(d_k)
缩放点积注意力的公式可以写为:

其中,d_k是每个注意力头中Q和K的向量维度。
Q和K的维度越高,点积需要累加的项越多,点积结果的方差也会增大。如果直接输入Softmax,注意力分数之间的差异会被明显放大,使注意力权重过于尖锐:
某个权重接近1
其他权重接近0
此时Softmax容易进入饱和区域,反向传播时梯度会变得很小,影响Q、K等参数的更新,导致训练不稳定。
因此除以sqrt(d_k),可以控制注意力分数的尺度,避免Softmax过度饱和。
多头注意力机制
多头注意力包含多个Attention Head,每个Head都有不同的Q、K、V映射参数:
Head1:W_Q1、W_K1、W_V1
Head2:W_Q2、W_K2、W_V2
...
不同的Head可以从不同的表示子空间学习不同类型的关系,例如语法关系、指代关系或语义关系。
每个Head分别完成注意力计算后,将结果拼接起来,再通过输出矩阵W_O进行线性映射:
MultiHead = Concat(Head1, Head2, ..., Head_h) × W_O
之后再通过残差连接,将多头注意力输出与原始输入相加:
输出 = 原始输入X + MultiHead输出