最近研究了很多精妙的transformer资料,发现各大教育机构的对此讲解的讳莫如深,本着求索的态度,所以查了相关的资料和原始文献,结合自己的理解,写一点东西,希望能对你有所帮助。
简单来说,Attention(注意力机制)是一种让模型自动“关注”重要信息、忽略不重要内容的机制,就像人们在阅读一段话时会本能地关注关键字。
我们从最简单的例子讲起,参考很多教学资料的经典的一句话:
“我昨天吃了一个苹果,它非常甜。”
请问这里的“它”是指什么?
你肯定会说:“它”就是“苹果”!
没错!因为你人脑在读“它”这个字时,自动把注意力放回到前面的“苹果”,从而理解整句话的意思。
但计算机并不会自己理解这种“代词指代关系”。
我们让模型读这句话:
“我昨天吃了一个苹果,它非常甜。”
模型可能会懵逼:“‘它’是指昨天?还是我?还是苹果?”
这时候就需要 Attention 机制出马了!
模型在处理某个词(比如“它”)时,能够自动“关注”与它相关的其他词(比如“苹果”),从而更准确地理解句子的语义。
用一句话形象的理解:Attention 能让模型把注意力集中在“有用的词”上。
先看一下Attention的公式:
Attention(Q, K, V) = softmax(Q × K^T / √d) × V
我们逐个拆开。
Q、K、V对应(查询、键、值)
你可以这样理解这三个概念:
术语 | 类比 | 解释 |
---|---|---|
Q(Query) | 你想查什么 | 比如“它” |
K(Key) | 可能的候选项 | 比如“我”“昨天”“苹果” |
V(Value) | 实际的信息内容 | 和每个词相关的向量表示 |
简单说: |
Q 就是你当前处理的词,K 是你要匹配的候选,V 是词的真实信息。
Q × K^T
softmax()函数做归一化处理
对所有相似度做一个 softmax,让它们变成概率分布:
如下:
词 | 相似度(点积) | 归一化后权重 |
---|---|---|
我 | 1.2 | 0.1 |
昨天 | 0.5 | 0.05 |
苹果 | 4.0 | 0.85 |
→ 模型知道“它”与“苹果”关系最大,应该重点关注它。
向量维度 d 很大,比如 512、1024,点积的数值就可能变得非常大,于是就需要做缩放处理,如下步骤。
√d
d 是每个向量的维度(可能是64 或 128或更大的值),√d 是对这个维度进行开方来做缩放处理。
为啥呢?因为softmax 遇到很大的值会“爆炸”,从而导致:
最后公式乘上 V
这个向量就是“它”的最终表示,包含了“苹果”的语义!
#入门简洁版代码
import numpy as np
def softmax(x):
"""对最后一维做 softmax"""
e_x = np.exp(x - np.max(x, axis=-1, keepdims=True)) # 防止溢出
return e_x / np.sum(e_x, axis=-1, keepdims=True)
def attention(Q, K, V):
"""
Q: [n, d] 查询向量
K: [n, d] 键向量
V: [n, d] 值向量
返回: 注意力输出 [n, d]
"""
d_k = Q.shape[-1] # 向量维度 d
scores = np.dot(Q, K.T) / np.sqrt(d_k) # 计算 Q 和 K 的相似度,并缩放
weights = softmax(scores) # 得到注意力权重
output = np.dot(weights, V) # 用注意力权重加权 V
return output, weights
#测试样例
# 假设我们有 3 个词,每个词是 3 维向量
Q = np.array([[1, 0, 0],
[0, 1, 0],
[0, 0, 1]], dtype=np.float32)
K = np.array([[1, 0, 0],
[0, 1, 0],
[0, 0, 1]], dtype=np.float32)
V = np.array([[10, 0, 0],
[0, 10, 0],
[0, 0, 10]], dtype=np.float32)
output, weights = attention(Q, K, V)
print("Attention Weights:\n", weights)
print("Output:\n", output)
#输出结果
Attention Weights:
[[0.843, 0.078, 0.078],
[0.078, 0.843, 0.078],
[0.078, 0.078, 0.843]]
Output:
[[8.43, 0.78, 0.78],
[0.78, 8.43, 0.78],
[0.78, 0.78, 8.43]]
对于每个词,Attention 做了 3 步:
刚刚我们讲的是一组 Q、K、V,其实 Transformer 是多个头一起做 Attention!
自注意力就是自己和自己做 Attention。
每个词都和其他词(包括自己)计算 Attention。
比如句子:“I love you”:
这样每个词都能“看全局”,知道跟自己相关的词有哪些。
特点 | 说明 |
---|---|
全局建模 | 可以一次性看全句所有词 |
并行计算 | 不像 RNN 要一个个处理,可以并行 |
聚焦关键 | 自动抓住关键内容 |
易扩展 | 可堆叠、可组合,非常灵活 |
应用 | 举例 |
---|---|
NLP | 机器翻译、问答系统、对话生成 |
计算机视觉 | 图像分类、图像描述、图像问答 |
多模态任务 | 文本+图像、文本+语音 |
编程任务 | 代码补全、代码解释 |
特别是 ChatGPT、BERT、T5、GPT-4 这些模型,都是用的 Attention 机制!
Attention 就是让模型学会“聚焦重点”的机制,就像你看书时自动划重点一样,它能帮助模型更聪明地理解输入数据的结构和语义。