深入了解self-attention

self-attention在《All you need is attention》论文中提及,《All you need is attention》是 2017 年由 Google Brain 团队发表的论文,提出了 Transformer 架构,是现代大语言模型的基础。可以说这是深度学习历史上最有影响力的论文之一。

关键机制

Self-Attention(自注意力)

核心公式:对句子里的每个词,计算它与句子中所有其他词的”相关性权重”,然后根据这些权重加权聚合信息。比如句子 “这个动物并没有过马路,因为它太累了” 中,模型能学会让 “” 更多地关注 “动物” 而不是 “马路“。

Attention(Q,K,V)=softmax(QKTdk)V\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V

乍看这个公式完全不理解…先一个个拆解下每个参数的意思:

Q、K、V是每个输入词的embedding向量x,分别乘以三个可学习的权重矩阵 WQ,WK,WVW^Q, W^K, W^V得到的。

embedding向量x

embedding向量x是把每个词元(token)映射成一个连续的、固定维度的实数向量。比如:

这个动物没有马路因为

词元(token)embedding向量x
这个[0.12, -0.45, 0.31, 0.08]
动物[0.55, 0.20, -0.11, 0.44]
[-0.09, 0.33, 0.15, -0.22]

以上向量并非真实数据,而是帮助理解的例子。例子中的向量x只有4个维度,实际模型使用的可能有几百到几千个维度不等。

可学习的权重矩阵 WQ,WK,WVW^Q, W^K, W^V

WQ,WK,WVW^Q, W^K, W^V神经网络的参数矩阵,就是一堆数字(浮点数),存储在模型里。这些矩阵里的具体数值,是模型在训练过程中通过反向传播(backpropagation)自动学习出来的,没有人手工设计里面的数字。我们在和模型对话时,这些参数矩阵是固定的。

Q:Query是查询向量,表示“我在查找什么信息”。

K:Key是键向量,表示“我有什么信息可以被查找”。

V:Value是值向量,表示“我实际携带的内容”。

dk\sqrt{d_k}:缩放参数,dkd_k是 Key 向量的维度,防止点积数值过大导致 softmax 梯度消失。

softmax归一化:把所有分数转换成加起来等于 1 的概率分布,就是”权重”。

一个具体的例子

这个动物并没有过马路,因为它太累了
1.先拆分词元(token)

这个动物没有马路因为

词元(token)embedding向量x(示例,维度4)
这个[0.12, -0.45, 0.31, 0.08]
动物[0.55, 0.20, -0.11, 0.44]
[-0.09, 0.33, 0.15, -0.22]
没有[0.41, -0.18, -0.36, 0.19]
[0.07, 0.29, -0.05, 0.33]
马路[0.62, -0.10, 0.24, -0.31]
因为[-0.28, 0.44, 0.09, 0.17]
[0.19, -0.37, 0.28, 0.06]
[0.33, 0.11, -0.19, -0.08]
[-0.15, 0.52, 0.06, -0.29]
[0.03, -0.05, 0.02, 0.01]

2.生成Q、K、V,这里模拟三个模型参数矩阵

模型参数矩阵

WQ[[1, 0], [0, 1], [1, 1], [0, -1]]
WK[[0.5, 0], [0, 0.5], [0.5, 0.5], [0, -0.5]]
WV[[0.1, 0.2], [0.2, 0.1], [-0.1, 0.3], [0.3, -0.2]]

动物这个词的Q=embedding向量x * WQ,即:

[0.55, 0.20, -0.11, 0.44]*[[1, 0], [0, 1], [1, 1], [0, -1]]

乘积结果=[0.44, -0.35]

以此类推,三个token的Q、K、V如下:

tokenQKV
动物[0.44, -0.35][0.22, -0.175][0.238, 0.009]
马路[0.86, 0.45][0.43, 0.225][-0.075, 0.248]
[0.47, -0.15][0.235,-0.075][-0.065, 0.073]

3.计算token之间的乘积来计算分数:Q*KT

KT的意思是将K矩阵转置(原矩阵的第i行第j列,变为新矩阵的第j行第i列),如[0.22, -0.175] -> [[0.22],[-0.175]]

score(它,动物)=[0.47, -0.15] * [[0.22],[-0.175]]=0.47*0.22+(-0.15)*(-0.175)=0.12965

score(它,马路)=[0.47, -0.15] *[[0.43], [0.225]]=0.47*0.43+(-0.15)*0.225=0.16835

score(它,它)=[0.47, -0.15] *[[0.235], [-0.075]]=0.47*0.235+(-0.15)*(-0.075)=0.1217

4.缩放,score除以dk\sqrt{d_k},dk表示K的维度,这里例子里是2个维度:

score()2=0.092\frac{score(它,动物)}{\sqrt{2}}=0.092

5.Softmax 归一化,得到注意力权重(注:e是一个特殊的常数,约等于2.718)

先求和sum([e0.092,e0.119,e0.086])=3.3125069954097492

softmax归一化=[e0.092/sum, e0.119/sum, e0.086/sum]=[0.331, 0.34, 0.329]

至此得到了“它”在3个token“动物”、“马路”和“它”的权重。

6.加权求和得到”它”的新表示向量

output_它 = 0.331*[0.238, 0.009]+0.34*[-0.075, 0.248]+0.329*[-0.065, 0.073]=[0.031,0.111]

最终[0.031,0.111]就是“它”经过这一层 self-attention 后的上下文相关表示——它不再只是”它”本身的孤立向量,而是融合了”动物”和”马路”信息的加权混合。

输出向量不是终点,而是下一层的原料。整个 Transformer 就是让每个 token 的向量,在几十层里反复”和上下文交流、更新自己”,最后在顶层被转换成具体任务需要的输出(通常是”预测下一个词”的概率分布)。

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注