今儿咱们聊一下,Transformer中的Query-Key-Value 矩阵计算与注意力权重生成,还想了一个自认为比较美的标题:手撕Query-Key-Value矩阵的数学之美。
好了,下面咱们聊聊 Transformer 中 Query-Key-Value 矩阵计算与注意力权重生成的原理,以及一个手算例子。
在一次聚会中,每个人都有三张卡片:
-
Query 卡片
:代表“我想知道和谁聊得来”,相当于提出问题;
-
Key 卡片
:代表“我是谁”,用来标记每个人的特性;
-
在 Transformer 中,每个词(或 token)都会经过三个不同的线性变换,分别得到 Query、Key 和 Value 向量。
接下来,我们拿某个词的 Query 去与所有词的 Key 进行匹配(计算点积),匹配得分越高,说明这两个词的“特性”越接近。
为了让这些得分更稳定,还会除以一个缩放因子(Key 向量的维度平方根),然后再经过 softmax 得到一组概率,也就是注意力权重。
最后,用这些权重对所有词的 Value 进行加权求和,就得到了这个词的新表示——它综合了其他词对它的影响。
细节原理
输入及线性变换
设输入矩阵为
(每一行对应一个词的嵌入向量),通过三个不同的线性变换得到:
其中
、
和
是模型学习到的参数矩阵。
注意力权重的计算
-
相似度计算
对于任意一个词
的 Query 向量
,计算它与所有词的 Key 向量
的点积:
-
缩放
为了防止点积值过大(尤其在高维空间中),将结果除以缩放因子
:
其中
是 Key 向量的维度。
-
归一化(softmax)
将缩放后的得分经过 softmax 函数,得到注意力权重:
这表示词
对词
的关注程度。
加权求和生成输出
用注意力权重对所有词的 Value 向量加权求和,得到词
的输出表示:
用矩阵形式表达整个注意力层:
推理总结
-
输入转换
:将输入嵌入
转换为 Query、Key、Value 三个向量。
-
相似度计算与缩放
:用 Query 与 Key 做点积并除以
。
-
归一化
:通过 softmax 得到归一化的注意力权重。
-
信息聚合
:用这些权重对 Value 向量进行加权求和,输出综合上下文信息的表示。
手撕计算
假设我们有两个词,令它们的嵌入向量维度为 2,为了简化计算,我们令所有线性变换矩阵
均为单位矩阵(即直接让
)。
设定输入
令两个词的输入向量为:
因此:
设 Key 向量维度
,则缩放因子为
。
计算 Q 与 K 的点积
计算
得:
缩放后的得分矩阵为:
计算注意力权重(softmax)
对每一行分别计算 softmax:
对于第一行
:
对于第二行
(过程类似):
加权求和生成输出
用注意力权重对 Value 向量求和: