深入了解self-attention
self-attention在《All you need is attention》论文中提及,《All you need is attention》是 2017 年由 Google Brain 团队发表的论文,提出了 Transformer 架构,是现代大语言模型的基础。可以说这是深度学习历史上最有影响力的论文之一。
关键机制
Self-Attention(自注意力)
核心公式:对句子里的每个词,计算它与句子中所有其他词的”相关性权重”,然后根据这些权重加权聚合信息。比如句子 “这个动物并没有过马路,因为它太累了” 中,模型能学会让 “它” 更多地关注 “动物” 而不是 “马路“。
乍看这个公式完全不理解…先一个个拆解下每个参数的意思:
Q、K、V是每个输入词的embedding向量x,分别乘以三个可学习的权重矩阵 得到的。
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个维度,实际模型使用的可能有几百到几千个维度不等。
可学习的权重矩阵
是神经网络的参数矩阵,就是一堆数字(浮点数),存储在模型里。这些矩阵里的具体数值,是模型在训练过程中通过反向传播(backpropagation)自动学习出来的,没有人手工设计里面的数字。我们在和模型对话时,这些参数矩阵是固定的。
Q:Query是查询向量,表示“我在查找什么信息”。
K:Key是键向量,表示“我有什么信息可以被查找”。
V:Value是值向量,表示“我实际携带的内容”。
:缩放参数,是 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如下:
| token | Q | K | V |
| 动物 | [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表示K的维度,这里例子里是2个维度:
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 的向量,在几十层里反复”和上下文交流、更新自己”,最后在顶层被转换成具体任务需要的输出(通常是”预测下一个词”的概率分布)。