418 Chapter 12. 基于自注意力的模型 肖桐 朱靖波
在得到 Q,K 和 V 后,便可以进行注意力的运算,这个过程可以被形式化为:
Attention(Q,K,V) = Softmax(
QK
T
√
d
k
+ Mask)V (12.9)
首先,通过对 Q 和 K 的转置进行矩阵乘法操作,计算得到一个维度大小为 L ×L 的
相关性矩阵,即 QK
T
,它表示一个序列上任意两个位置的相关性。再通过系数 1/
√
d
k
进行放缩操作,放缩可以减少相关性矩阵的方差,具体体现在运算过程中实数矩阵
中的数值不会过大,有利于模型训练。
在此基础上,通过对相关性矩阵累加一个掩码矩阵 Mask,来屏蔽掉矩阵中的无
用信息。比如,在编码器端,如果需要对多个句子同时处理,由于这些句子长度不统
一,需要对句子补齐。再比如,在解码器端,训练的时候需要屏蔽掉当前目标语言位
置右侧的单词,因此这些单词在推断的时候是看不到的。
随后,使用 Softmax 函数对相关性矩阵在行的维度上进行归一化操作,这可以理
解为对第 i 行进行归一化,结果对应了 V 中不同位置上向量的注意力权重。对于 value
的加权求和,可以直接用相关性系数和 V 进行矩阵乘法得到,即 Softmax(
QK
T
√
d
k
+Mask)
和 V 进行矩阵乘。最终得到自注意力的输出,它和输入的 V 的大小是一模一样的。
图12.10展示了点乘注意力的计算过程。
MatMul
Q
K
Scale
Mask(opt.)
SoftMax
MatMul
V
自注意力机制的 Query
Key 和 Value 均来自同一句
子,编码-解码注意力机制
与前面讲的一样
Query 和 Key 的转置进
行点积, 得到句子内部
各个位置的相关性
相关性矩阵在训练中
方差变大,不利于训练
所以对其进行缩放
在编码器端,对句子补齐
填充的部分进行屏蔽
解码时看不到未来的信息
需要对未来的信息进行屏蔽
用归一化的相关性打分
对 Value 进行加权求和
图 12.10 点乘注意力的计算过程
下面举个简单的例子介绍点乘注意力的具体计算过程。如图12.11所示,用黄色、
蓝色和橙色的矩阵分别表示 Q、K 和 V。Q、K 和 V 中的每一个小格都对应一个单词
在模型中的表示(即一个向量)。首先,通过点乘、放缩、掩码等操作得到相关性矩
阵,即粉色部分。其次,将得到的中间结果矩阵(粉色)的每一行使用 Softmax 激活
函数进行归一化操作,得到最终的权重矩阵,也就是图中的红色矩阵。红色矩阵中
的每一行都对应一个注意力分布。最后,按行对 V 进行加权求和,便得到了每个单
词通过点乘注意力计算得到的表示。这里面,主要的计算消耗是两次矩阵乘法,即
Q 与 K
T
的乘法、相关性矩阵和 V 的乘法。这两个操作都可以在 GPU 上高效地完成,
因此可以一次性计算出序列中所有单词之间的注意力权重,并完成所有位置表示的