
有段时间,我对Transformer的“神力”是又敬又怕。GPT、BERT、ChatGPT、LLM,这些爆款模型都离不开一个核心部件:Self-Attention。
但你是不是也曾像我一样,盯着一堆公式发呆:
Attention(Q, K, V) = softmax(QK^T / √d_k) V明明数学没挂科,可就是读不懂它到底在干啥。后来我一边写代码,一边画图,一边做实验,才真正搞明白一件事:
Self-Attention的本质就是——让每个词根据“整体上下文”来重新给自己赋值,而不是只看邻居。
别怕,我们今天就从头到尾梳理清楚这个机制到底在“算”什么,我还会用代码 + 举例让你一口气通透理解它的逻辑!
简单说,Self-Attention 就是:
对输入序列中的每个词来说,它都会“关注”一遍所有其他词(包括自己),计算一个“加权平均值”作为自己的新表示。
这就好比你开会发言前,会先看看在座每个人的态度、表情、观点,然后再调整自己怎么说话。Self-Attention 就是这种“全局考虑”的机制。
我们一步步讲解。
假设我们的输入是 3 个词,每个词是一个维度为 4 的向量:
import torch
import torch.nn.functional as F
# 假设我们有3个词的输入,维度是4
x = torch.tensor([[1.0, 0.0, 1.0, 0.0],
[0.0, 2.0, 0.0, 2.0],
[1.0, 1.0, 1.0, 1.0]]) # (3, 4)我们会对它们分别乘上权重矩阵,得到 Query (Q)、Key (K) 和 Value (V)。
W_q = torch.randn(4, 4)
W_k = torch.randn(4, 4)
W_v = torch.randn(4, 4)
Q = x @ W_q
K = x @ W_k
V = x @ W_vQuery 是“我要关注什么” Key 是“我对别人来说有多重要” Value 是“我的信息值”
这就像一个社交场合:Q是你发出关注的“雷达”,K是别人身上的“吸引力”,而V是真正的内容。
接下来,我们计算每个词对其他词的关注程度——这就是 Q 和 K 做点积:
scores = Q @ K.T # (3, 3)这个得分越大,说明这个词越值得被关注。
为了数值稳定,还要除以 √d:
dk = Q.shape[-1]
scores = scores / dk ** 0.5为了把这些得分变成“权重”,我们对每行做 softmax:
attn_weights = F.softmax(scores, dim=1)现在每一行是一个加权系数,表示当前这个词对每个输入词的注意力权重。
最后,每个词根据权重去加权V(Value矩阵),得到新的表示:
output = attn_weights @ V这一步非常关键:它决定了“你最终怎么被表示”——不是靠你自己,而是靠你对其他人的关注!
假设我们有句子:
“小明 去了 学校”
我们对“去了”这个词进行Self-Attention,它会看“小明”和“学校”对它的影响力。
所以 Self-Attention 就像是一个动态的关注分配器,让模型不再死记硬背顺序,而是灵活地理解语义。
其实,我们上面讲的只是 Single Head Attention。
真实的Transformer中,每一层往往有多个注意力头(比如8个),每个头学习不同的关注模式:
# 多头就是多个W_q, W_k, W_v 并行计算
head_outputs = []
for _ in range(num_heads):
Q_i = x @ W_q_i
K_i = x @ W_k_i
V_i = x @ W_v_i
...
head_outputs.append(output_i)
# 拼接所有头的输出
final_output = torch.cat(head_outputs, dim=-1)这么做的好处是:有的头专注语法结构,有的头专注情感,有的头关注主谓宾,能力分工明确。
相比传统的 RNN、CNN,Self-Attention 有几个超能力:
这就是为啥现在语音识别、图像理解、机器翻译、甚至代码补全,统统用上了Transformer结构。
你现在再看:
Attention(Q, K, V) = softmax(QK^T / √d_k) V是不是不再头疼了?
我们其实就是:
这套逻辑,就是Self-Attention的本质。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。