
解锁Transformer核心!手把手带你看懂自注意力机制:三个输入一步步算到底
很多课程都会通过公式来说明Transformer,但是没有给你算过数,也没让你明白一件更重要的事:
“自注意力给出来的输出,实际上表示了什么?”
本文就想用一个质化、好懂、可实际运算的例子,带你真正看懂 Self-Attention 是怎么工作的,并解释它的输出真正意义!
1. 让我们再来回顾下什么是“注意力机制”?
你看一段文字时,总会下意识的想:我要看哪些词?哪些字是我目前理解这句话的关键?
注意力机制就是这样一种方法,它允许模型根据“当前信息”,自动地从全文里找到最关键的部分来作为参考,并给他们分配权重。
不是每个词均分重,而是“重要的看一眼,不重要的算个数”。
但是“自注意力”比较特殊:
每个输入,都在想“我该看谁?” 每个输出,都是它看完周围后,自己新生出的表示
2.自注意机制是怎么计算的?
我们用 3 个 2D 向量(比如词嵌入)作为输入序列:
x₁ = [1, 0] # 可能是词“我”
x₂ = [0, 1] # 可能是词“爱”
x₃ = [1, 1] # 可能是词“你”
把它组成矩阵
X = [[1, 0],
[0, 1],
[1, 1]]
我们手动设定 Q、K、V 的权重矩阵:
W_Q = [[1, 0],
[1, 1]]
W_K = [[1, 2],
[0, 1]]
W_V = [[2, 0],
[0, 1]]
接下来计算QKT:
Q = X · W_Q
K = X · W_K
V = X · W_V
比如计算Q
Q =
[[1, 0], => [1*1 + 0*1, 1*0 + 0*1] = [1, 0]
[0, 1], [0*1 + 1*1, 0*0 + 1*1] = [1, 1]
[1, 1]] [1*1 + 1*1, 1*0 + 1*1] = [2, 1]
由此可得K和V:
K = [[1, 2], V = [[2, 0],
[0, 1], [0, 1],
[1, 3]] [2, 1]]
接下来计算计算 Attention Score(Q·Kᵀ)
计算 Q·Kᵀ(点积)再除以 √2(d=2):
我们用 Q₁ 和所有 K 做 dot product,Q₂ 和所有 K 做 dot product,依此类推:
缩放除以 √2 ≈ 1.414:
S_scaled ≈ [[0.71, 0, 0.71],
[2.12, 0.71, 2.83],
[2.83, 0.71, 3.54]]
计算每一行的 softmax:
softmax([0.71, 0, 0.71]) = [0.401, 0.198, 0.401]
softmax([2.12, 0.71, 2.83]) ≈ [0.289, 0.075, 0.636]
softmax([2.83, 0.71, 3.54]) ≈ [0.288, 0.057, 0.655]
Attention Weight × V:
output₁ = 0.401*[2,0] + 0.198*[0,1] + 0.401*[2,1]
= [0.802 + 0.802, 0 + 0.198 + 0.401] = [1.604, 0.599]
output₂ = 0.289*[2,0] + 0.075*[0,1] + 0.636*[2,1]
= [0.578 + 1.272, 0.075 + 0.636] = [1.85, 0.711]
output₃ = 0.288*[2,0] + 0.057*[0,1] + 0.655*[2,1]
= [0.576 + 1.31, 0.057 + 0.655] = [1.886, 0.712]
我们可以得到最后的输出:
Output =
[[1.604, 0.599],
[1.85, 0.711],
[1.886, 0.712]]
3. 输出到底表示啥?(热点论坛)
它已经不仅仅是原始的词向量了,而是:
1. 考虑了当前词的内容(通过 Query)
2. 也考虑了它和所有其他词的关系(通过与 Key 的点积)
3. 最后通过注意力权重,把相关的词信息从 Value 中“加权融合”了进来
比如:
第一个词“我”,原来是 [1, 0],输出是 [1.604, 0.599]
它在融合了“爱”“你”的信息后,变成了一个更富语义的表示
总结一句话:自注意力输出 = 原词向量 + 上下文理解 = 更聪明的表示!
这就是为什么 Transformer 模型可以强大到理解复杂语义、做翻译、对话、生成等任务。
本文转载自人工智能训练营,作者:人工智能训练营
