关于自注意力机制
自注意力机制(Self-Attention)是 Transformer 模型的关键概念,它使模型能够在处理输入序列时,关注到序列的不同部分,并依据这些部分的重要性调整当前位置的表达。
想象一下你在读一个句子:“爱丽丝是一位杰出的软件工程师,她主导开发了公司核心的推荐系统”。当你读到“她”时,你的大脑会自动将“她”与“爱丽丝”联系起来。自注意力机制做的是类似的事情,在较长的句子中,它能让模型在处理“她”这个词时,更多地关注“爱丽丝”这个词。
1.1 Q, K, V:三个重要的矩阵
为了实现自注意力,模型会为输入序列中的每个词生成三个向量:
- Query (查询) 向量 (q): 表示当前处理的词。可以将其视为一个“问题”,它试图找到与其相关的其他词。
- Key (键) 向量 (k): 表示序列中可以被“查询”的词。可以将其看作是每个词的“标识”,用于与“问题”匹配。
- Value (值) 向量 (v): 表示词的实际内容。当 Query 和 Key 成功匹配后,Value 向量会被用来计算最终的输出。
这三个向量是通过将词的嵌入向量(Embedding)与三个不同的权重矩阵(WQ, WK, WV)相乘获得的。这三个权重矩阵是在模型训练过程中学习到的。
1.2 注意力分数的计算
现在我们来看一个具体的例子,假设我们的输入序列是 “Thinking Machines”。
获取 Q, K, V 向量
我们分别为 “Thinking” 和 “Machines” 这两个词计算 Q, K, V 向量。
- 对于 “Thinking”:
- q1 = embedding("Thinking") * WQ
- k1 = embedding("Thinking") * WK
- v1 = embedding("Thinking") * WV
- 对于 “Machines”:
- q2 = embedding("Machines") * WQ
- k2 = embedding("Machines") * WK
- v2 = embedding("Machines") * WV
计算注意力分数 (Attention Score)
接下来,我们计算每个词对其他所有词的注意力分数。这个分数是通过将 Query 向量和 Key 向量进行点积得到的。
当我们计算 “Thinking” 这个词的注意力时:
- score1_1 = q1 · k1 # Thinking 对 Thinking 的分数
- score1_2 = q1 · k2 # Thinking 对 Machines 的分数
缩放 (Scale)
为了防止梯度爆炸,我们会将注意力分数除以一个缩放因子,这个因子通常是 Key 向量维度的平方根 (√dk)。我们将在下一节详细讨论为什么需要这样做。
- # Thinking 对 Thinking 的分数
- score1_1 = score1_1 / sqrt(dk)
- # Thinking 对 Machines 的分数
- score1_2 = score1_2 / sqrt(dk)
Softmax
然后,我们对缩放后的分数进行 Softmax 操作,这样所有分数的总和就为 1。这些 Softmax 之后的分数表示在处理当前词时,应给予其他词多少的“关注度”。
- # Thinking 对 Thinking 和 Machines 的 Softmax 分数
- softmax_scores = softmax([score1_1, score1_2])
加权求和
最后,我们将 Softmax 分数与对应的 Value 向量相乘,然后将它们相加,得到最终的自注意力输出。
- # Thinking 对 Thinking 和 Machines 的加权求和
- z1 = softmax_scores[0] * v1 + softmax_scores[1] * v2
这个输出 z1 就是 “Thinking” 这个词经过自注意力层之后的新表示,它包含了来自 “Thinking” 和 “Machines” 这两个词的信息。
如果我们将整个过程用一个公式来表示,那就是自注意力机制的核心公式:
Attention(Q,K,V) = softmax(QKT/√dk)V
其中 Q, K, V 分别是查询、键、值矩阵,dk 是键向量的维度。
2. 为什么要除以根号 d (The Scaling Factor)
在计算注意力分数时,我们将 Query 向量和 Key 向量进行点积。当向量的维度 dk 增大时,点积的结果也会增大,这可能导致梯度消失或爆炸的问题。因此,我们需要将点积结果除以根号 dk 来稳定梯度。
较大时,点积的结果可能会显著增大。
为了更深入地理解这个问题,我们先介绍一些基础的统计学概念。
2.1 独立随机变量及其方差
假设我们有两个随机变量 X 和 Y,它们的方差分别为 Var(X) 和 Var(Y)。那么它们的和的方差为:
Var(X + Y) = Var(X) + Var(Y) + 2 * Cov(X, Y)
如果两个随机变量 X 和 Y 是相互独立的,那么它们的协方差 Cov(X, Y) 为 0。因此:
Var(X + Y) = Var(X) + Var(Y)
这是个极其重要的属性,表明独立随机变量之和的方差等于各自方差的总和。
2.2 为何要除以根号 d
现在,我们假设 q 和 k 是两个独立的随机向量,它们的每个元素 qi 和 ki 都遵循均值为 0,方差为 1 的标准正态分布。
q = (q1, q2, ..., qdk)
k = (k1, k2, ..., kdk)
其中 E[qi] = 0, Var(qi) = 1,E[ki] = 0, Var(ki) = 1。
它们的点积 q · k 可表示为:
q · k = Σi=1dk qi ki
由于 qi 和 ki 是独立的,我们可以计算 qi * ki 的均值和方差:
均值计算:
E(q · k) = E(Σi=1dk qi ki) = Σi=1dk E(qi * ki) = Σi=1dk E(qi) * E(ki) = 0
方差计算:
Var(q · k) = Var(Σi=1dk qi ki) = Σi=1dk Var(qi ki) = Σi=1dk Var(qi) * Var(ki) = dk
可以看出,点积 q · k 的方差等于 dk。这意味着,当 dk 越大,点积的方差也越大,方差大意味着点积的结果会更加分散,这在后续的 Softmax 操作中可能导致数值不稳定。为了避免这种情况,在计算注意力得分时,我们会将点积结果除以 √dk。
这样可以使点积计算后的结果保持在均值为 0,方差为 1 的分布上,从而避免数值不稳定的问题。


雷达卡


京公网安备 11010802022788号







