🎯 课程主题
自注意力机制的算法流程——从 QKV 映射到注意力得分计算与信息融合。
📝 核心知识点
1. 自注意力机制的核心任务
- 概念说明:自注意力机制完成三件事。
- 关键细节:
- 计算关联程度:计算输入数据 $X$ 中各 token 之间的关联程度
- 提取有用信息:利用关联程度提取输入数据间的有用信息
- 信息融合输出:将不同注意力分配的信息融合输出
2. QKV 映射过程
- 概念说明:输入向量通过三个权重矩阵映射为 Q、K、V。
- 关键细节(以 "我喜欢打篮球" 为例,$A_1, A_2, A_3, A_4$ 为 4 个 token 的词向量):
- $A_1 \times W_Q = Q_1$(Query,查询向量)
- $A_1 \times W_K = K_1$(Key,键向量)
- $A_1 \times W_V = V_1$(Value,值向量)
- 同理计算 $Q_2, K_2, V_2, \ldots, Q_4, K_4, V_4$
- $W_Q, W_K, W_V$ 是可训练的参数矩阵,通过反向传播更新
3. 注意力得分计算
- 概念说明:通过 Q 与 K 的点积计算 token 间的关联程度。
- 关键细节:
- $Q_1 \cdot K_1 = \alpha_{11}$("我"与"我"的关联)
- $Q_1 \cdot K_2 = \alpha_{12}$("我"与"喜欢"的关联)
- $Q_1 \cdot K_3 = \alpha_{13}$("我"与"打"的关联)
- $Q_1 \cdot K_4 = \alpha_{14}$("我"与"篮球"的关联)
- 经 Softmax 归一化:$\alpha'{11} + \alpha'{12} + \alpha'{13} + \alpha'{14} = 1$
- 例如:$[0.5, 0.2, 0.2, 0.1]$ 表示注意力分配权重
4. 信息融合输出
- 概念说明:用注意力得分对 V 加权求和,得到融合信息。
- 关键细节:
- $B_1 = \alpha'{11} V_1 + \alpha'{12} V_2 + \alpha'{13} V_3 + \alpha'{14} V_4$
- $B_1$ 包含 $A_1$ 对所有 token 的关联程度与信息融合
- 同理计算 $B_2, B_3, B_4$
- 每个 $B_i$ 都能看到全局信息,且包含注意力分配
5. 权重矩阵的训练
- 概念说明:$W_Q, W_K, W_V$ 通过反向传播学习。
- 关键细节:
- 模型训练时利用标签计算 Loss
- 通过反向传播更新 $W_Q, W_K, W_V$
- 找到一组合适的参数,使注意力得分能正确表达关联程度
🧮 核心公式与推导
QKV 映射:
$$Q_i = A_i \cdot W_Q, \quad K_i = A_i \cdot W_K, \quad V_i = A_i \cdot W_V$$
注意力得分(缩放点积):
$$\alpha_{ij} = \frac{Q_i \cdot K_j}{\sqrt{d_k}}$$
Softmax 归一化:
$$\alpha'{ij} = \text{Softmax}(\alpha{ij}) = \frac{e^{\alpha_{ij}}}{\sum_k e^{\alpha_{ik}}}$$
信息融合输出:
$$B_i = \sum_j \alpha'_{ij} V_j$$
物理意义:
- $Q$(Query):当前 token 作为"查询者",寻找相关信息
- $K$(Key):每个 token 作为"被查询者",提供匹配信息
- $V$(Value):每个 token 的实际内容信息
- 注意力得分 $\alpha'_{ij}$ 表示第 $i$ 个 token 对第 $j$ 个 token 的关注程度
🏗️ 模型架构与数据流向
💻 代码实战
import torch
import torch.nn.functional as F
def self_attention(Q, K, V):
"""
自注意力机制计算(单个样本示例)
Q: [L, d_k] 查询矩阵
K: [L, d_k] 键矩阵
V: [L, d_v] 值矩阵
return: [L, d_v] 注意力输出
"""
d_k = Q.size(-1)
# 1. 计算注意力得分: Q·K^T / sqrt(d_k)
scores = torch.matmul(Q, K.transpose(-2, -1)) # [L, L]
scores = scores / math.sqrt(d_k) # 缩放
# 2. Softmax归一化
attention_weights = F.softmax(scores, dim=-1) # [L, L]
# 3. 加权求和
output = torch.matmul(attention_weights, V) # [L, d_v]
return output, attention_weights
# 示例: "我喜欢打篮球" 4个token
L = 4 # 序列长度
d_k = 64 # Q,K维度
d_v = 64 # V维度
Q = torch.randn(L, d_k)
K = torch.randn(L, d_k)
V = torch.randn(L, d_v)
output, attn = self_attention(Q, K, V)
print(output.shape) # torch.Size([4, 64])
print(attn.shape) # torch.Size([4, 4]) 注意力得分矩阵
print(attn[0].sum()) # tensor(1.0) 每行和为1
⚠️ 常见问题与避坑指南
- 除以 $\sqrt{d_k}$ 是为了防止 Softmax 饱和导致梯度消失,提升训练稳定性
- $W_Q, W_K, W_V$ 是可训练参数,不是固定的
- 注意力得分经 Softmax 后每行和为 1
- 反向传播是理解权重更新的基础,务必掌握
💡 个人总结与延伸
自注意力机制通过 QKV 映射和缩放点积计算,让序列中每个 token 都能"看到"全局信息并按关联程度加权融合。这是 Transformer 区别于 RNN 的核心——无需递归即可建立长距离依赖。现代大模型(GPT、BERT、LLaMA 等)均以自注意力为基本单元。