注意力机制 - QKV 简介
1 课程概览
本课详细讲解注意力机制中的 QKV 三个核心概念。QKV 分工明确,协同完成聚焦关键信息的任务。Q 是查询张量(当前要解决的问题),K 是索引(用来与 Q 计算相似度),V 是值(最终要获取的实际内容)。通过文档搜索、问答任务、文本生成等示例加深理解。
2 核心概念与定义
- Q(Query,查询张量):当前要解决的问题,触发注意力机制的需求向量。
- K(Key,键/索引):用来匹配问题的索引,与 Q 计算相似度。
- V(Value,值):最终要获取的实际内容。
- 相似度(Similarity):Q 与 K 的匹配程度,相似度越高说明越接近。
- 聚焦关键信息:QKV 协同完成的任务。
3 模型与算法详解
QKV 分工
| 组件 | 含义 | 作用 |
|---|---|---|
| Q | 查询张量 | 当前要解决的问题,触发注意力机制 |
| K | 键/索引 | 用来与 Q 计算相似度 |
| V | 值 | 最终要获取的实际内容 |
QKV 协同工作流程
Q(查询) → 与 K 计算相似度 → 找到匹配度最高的 K → 根据 K 找到 V
- 输入 Q:触发注意力机制
- Q 与 K 计算相似度:找到匹配度最高的 K
- 根据 K 找 V:类似字典查找,根据键找值
- 获取 V:V 是最终实际要获取的内容
为什么需要 K
防止 Q 直接找 V 的话,运算量太大。
- 如果用 Q 与 V(文章内容)逐字匹配,运算量太大
- K 是文章的标签/分类,数量少,计算快
- 先用 Q 与 K 计算相似度,再根据 K 找 V
文档搜索示例
| 组件 | 含义 | 示例 |
|---|---|---|
| Q | 要搜索的问题 | "给我写一篇关于环保的短文" |
| K | 文章的标签/分类 | "金融"、"汽车"、"环保"、"IT" |
| V | 文章的具体内容 | 文章正文 |
问答任务示例
| 组件 | 内容 |
|---|---|
| Q | "这个新闻的主题是关于什么的?" |
| K | "新闻报道了当地政府的一些政策" |
| V | 新闻的政策内容 |
文本生成示例
| 组件 | 内容 |
|---|---|
| Q | "给我生成一段关于环保的文本" |
| K | 环保相关的关键词/标签 |
| V | 环保相关的具体内容 |
RNN vs 注意力机制
| 对比项 | RNN | 注意力机制 |
|---|---|---|
| 处理方式 | 逐字处理 | 聚焦关键词 |
| 运算量 | 大 | 小 |
| 效果 | 一般 | 更好 |
4 数学原理与推导
QKV 计算流程
- Q 与 K 计算相似度:
$$\text{score}_i = Q \cdot K_i$$
- 相似度转换为权重:
$$\alpha_i = \text{softmax}(\text{score}_i) = \frac{e^{\text{score}_i}}{\sum_j e^{\text{score}_j}}$$
- 根据权重对 V 加权求和:
$$\text{output} = \sum_i \alpha_i V_i$$
矩阵形式
$$\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V$$
5 代码示例
本课为概念介绍,具体代码实现见后续课程。
import torch
import torch.nn.functional as F
# QKV 概念示例
# 假设有 4 篇文章,每篇文章有标签(K)和内容(V)
# Q: 查询张量(当前要解决的问题)
Q = torch.tensor([1.0, 0.0, 0.0]) # 查询"环保"相关
# K: 键/索引(4篇文章的标签)
K = torch.tensor([
[0.1, 0.9, 0.0], # 文章1: 金融
[0.0, 0.1, 0.9], # 文章2: 环保
[0.8, 0.1, 0.1], # 文章3: 汽车
[0.1, 0.0, 0.9], # 文章4: IT
])
# V: 值(4篇文章的内容)
V = torch.tensor([
[1.0, 0.0, 0.0], # 文章1内容
[0.0, 1.0, 0.0], # 文章2内容(环保)
[0.0, 0.0, 1.0], # 文章3内容
[1.0, 1.0, 0.0], # 文章4内容
])
# 1. Q 与 K 计算相似度
scores = torch.matmul(Q, K.T) # [4]
print("相似度:", scores)
# 2. 相似度转换为权重(softmax)
attention_weights = F.softmax(scores, dim=0)
print("注意力权重:", attention_weights)
# 3. 根据权重对 V 加权求和
output = torch.matmul(attention_weights, V) # [3]
print("输出:", output)
6 重难点与易错提醒
- ❗重点:QKV 分工明确,协同完成聚焦关键信息的任务。
- ❗重点:Q 是查询张量,K 是索引,V 是实际内容。
- ⚠️易错:不直接用 Q 找 V,而是先与 K 计算相似度,再根据 K 找 V。
- 💡深入理解:K 类似字典的键,V 类似字典的值,根据键找值。
- 💡深入理解:注意力机制相比 RNN,聚焦关键词,运算量更小。
7 课堂问答精选
Q1:QKV 分别代表什么?
A:Q(Query)是查询张量,当前要解决的问题,触发注意力机制的需求向量;K(Key)是键/索引,用来与 Q 计算相似度;V(Value)是值,最终要获取的实际内容。
Q2:QKV 如何协同工作?
A:①输入 Q 触发注意力机制;②Q 与 K 计算相似度,找到匹配度最高的 K;③根据 K 找到对应的 V(类似字典查找);④获取 V 作为最终结果。
Q3:为什么需要 K,不直接用 Q 找 V?
A:因为如果用 Q 与 V(文章内容)逐字匹配,运算量太大。K 是文章的标签/分类,数量少,计算快。先用 Q 与 K 计算相似度,再根据 K 找 V,减少运算量。
Q4:注意力机制相比 RNN 有什么优势?
A:RNN 逐字处理,运算量大;注意力机制聚焦关键词,运算量小,效果更好。
8 本课小结
- QKV 分工明确,协同完成聚焦关键信息的任务。
- Q:查询张量(当前要解决的问题)。
- K:键/索引(与 Q 计算相似度)。
- V:值(最终要获取的实际内容)。
- 工作流程:Q 与 K 计算相似度 → 根据 K 找 V。
9 延伸思考
- QKV 的计算公式是什么?
- 如何用代码实现 QKV 的计算?