常见的注意力计算规则介绍
1 课程概览
本课讲解注意力机制的常见计算规则。用 Q 和 K 算相似度,得到概率分布,再与 V 相乘,得到强大的 Q。常见规则有三种:softmax 加权求和、softmax 后乘 V、scaled dot-product attention。前两种用于一般注意力(软注意力),后一种用于自注意力。
2 核心概念与定义
- 注意力计算规则:用 Q 和 K 算相似度,得到概率分布,再与 V 相乘。
- 一般注意力计算规则:Q、K、V 不相等。
- 自注意力计算规则:Q = K = V。
- 软注意力:前两种计算规则。
- 自注意力:第三种计算规则(scaled dot-product attention)。
3 模型与算法详解
注意力计算流程
用 Q 和 K 算相似度,得到概率分布,再与 V 相乘。
1. 用 Q 和 K 算匹配分(相似度)
2. 用匹配分乘以词向量(V)
3. 相加得到 attention_q(中间语义变量 C)
常见计算规则
三种常见计算规则。
规则 1:加权求和
$$\text{attention_q} = \text{softmax}(\text{Q} \cdot \text{K}) \cdot \text{V}$$
规则 2:softmax 后乘 V
$$\text{attention_q} = \text{softmax}(\text{Q} \cdot \text{K}^T) \cdot \text{V}$$
规则 3:scaled dot-product attention
$$\text{attention_q} = \text{softmax}\left(\frac{\text{Q} \cdot \text{K}^T}{\sqrt{d_k}}\right) \cdot \text{V}$$
分类
| 计算规则 | 应用场景 | 条件 |
|---|---|---|
| 规则 1、2 | 一般注意力(软注意力) | Q、K、V 不相等 |
| 规则 3 | 自注意力 | Q = K = V |
QKV 含义
以汉译英为例。
| 符号 | 含义 | 说明 |
|---|---|---|
| Q | Query(查询) | decoder 的输入 |
| K | Key(键) | encoder 的输出 |
| V | Value(值) | encoder 的输出 |
4 数学原理与推导
注意力计算
$$\text{attention_q} = \text{softmax}\left(\frac{\text{Q} \cdot \text{K}^T}{\sqrt{d_k}}\right) \cdot \text{V}$$
其中:
- $\text{Q}$ 是查询张量
- $\text{K}$ 是键张量
- $\text{V}$ 是值张量
- $d_k$ 是 K 的维度
- $\sqrt{d_k}$ 是缩放因子
缩放因子
除以 $\sqrt{d_k}$ 的原因。
$$\text{scaled} = \frac{\text{Q} \cdot \text{K}^T}{\sqrt{d_k}}$$
- 防止点积结果过大
- 使梯度更稳定
5 代码示例
import torch
import torch.nn.functional as F
def attention_demo():
"""演示注意力计算规则"""
# 1. 创建 Q、K、V 张量
# 假设有 10 个单词,每个单词 32 个特征
Q = torch.randn(1, 10, 32) # 查询张量
K = torch.randn(1, 10, 32) # 键张量
V = torch.randn(1, 10, 32) # 值张量
print(f"Q 形状: {Q.shape}")
print(f"K 形状: {K.shape}")
print(f"V 形状: {V.shape}")
# 2. 规则 1:加权求和
# attention_q = softmax(Q · K) · V
attn_weights_1 = F.softmax(torch.matmul(Q, K.transpose(-2, -1)), dim=-1)
attention_q_1 = torch.matmul(attn_weights_1, V)
print(f"\n规则 1 - attention_q 形状: {attention_q_1.shape}")
# 3. 规则 2:softmax 后乘 V
# attention_q = softmax(Q · K^T) · V
attn_weights_2 = F.softmax(torch.matmul(Q, K.transpose(-2, -1)), dim=-1)
attention_q_2 = torch.matmul(attn_weights_2, V)
print(f"规则 2 - attention_q 形状: {attention_q_2.shape}")
# 4. 规则 3:scaled dot-product attention
# attention_q = softmax(Q · K^T / sqrt(d_k)) · V
d_k = K.size(-1)
scaled_attn = torch.matmul(Q, K.transpose(-2, -1)) / torch.sqrt(torch.tensor(d_k, dtype=torch.float32))
attn_weights_3 = F.softmax(scaled_attn, dim=-1)
attention_q_3 = torch.matmul(attn_weights_3, V)
print(f"规则 3 - attention_q 形状: {attention_q_3.shape}")
# 5. 判断注意力类型
# Q = K = V 时,为自注意力
if torch.equal(Q, K) and torch.equal(K, V):
print("\n类型: 自注意力(Q = K = V)")
else:
print("\n类型: 一般注意力(Q、K、V 不相等)")
# 测试
if __name__ == "__main__":
print("=== 常见的注意力计算规则介绍 ===")
attention_demo()
代码说明
| 代码 | 说明 |
|---|---|
torch.matmul(Q, K.transpose(-2, -1)) | Q · K^T |
F.softmax(..., dim=-1) | softmax 归一化 |
torch.sqrt(torch.tensor(d_k, ...)) | sqrt(d_k) |
torch.equal(Q, K) | 判断 Q 和 K 是否相等 |
6 重难点与易错提醒
- ❗重点:三种常见计算规则。
- ❗重点:前两种用于一般注意力(软注意力),后一种用于自注意力。
- ❗重点:Q = K = V 时为自注意力。
- ⚠️易错:除以 $\sqrt{d_k}$ 是为了防止点积结果过大。
- 💡技巧:面试会问这个公式,需要背诵。
7 课堂问答精选
Q1:常见的注意力计算规则有哪些?
A:三种:①加权求和;②softmax 后乘 V;③scaled dot-product attention(除以 $\sqrt{d_k}$)。
Q2:如何区分一般注意力和自注意力?
A:当 Q、K、V 不相等时,为一般注意力;当 Q = K = V 时,为自注意力。
Q3:为什么要除以 $\sqrt{d_k}$?
A:防止点积结果过大,使梯度更稳定。
8 本课小结
- 注意力计算:用 Q 和 K 算相似度,得到概率分布,再与 V 相乘。
- 三种常见计算规则:加权求和、softmax 后乘 V、scaled dot-product attention。
- 前两种用于一般注意力,后一种用于自注意力。
- Q = K = V 时为自注意力。
9 延伸思考
- 如何用代码实现注意力机制?
- bmm() 函数的作用是什么?