Q(Query)、K(Key)、V(Value)的分工
角色 | 数学表示 | 作用 | 类比 |
---|---|---|---|
Q | W_q·输入向量 |
主动提问者:表示当前需要关注什么 | 好比"学生举手提问" |
K | W_k·输入向量 |
匹配者:提供被匹配的特征 | 像"书本目录关键词" |
V | W_v·输入向量 |
实际内容:真正传递的信息 | 即"书本正文内容" |
# 伪代码示例
Q = embedding("吃") # Query
K = [embedding("吃"), embedding("苹果")] # Keys
V = [embedding("吃"), embedding("苹果")] # Values
# Step1: 计算注意力分数
scores = [Q·K[0], Q·K[1]] # [1, 2]
# Step2: Softmax归一化
weights = softmax(scores) # [0.27, 0.73]
# Step3: 加权求和
output = 0.27*V[0] + 0.73*V[1] # 新向量[1.46, 0.54, 0]
职责分离原则:
Q/K决定"应该关注谁"(注意力权重)
V决定"实际传递什么"(信息内容)
类比:搜索引擎工作原理
Q = 你的搜索关键词
K = 网页的关键词索引
V = 网页的正文内容
组件 | 作用 | 必要性 |
---|---|---|
Embedding | 将离散符号转为连续向量 | 必须 |
Attention | 建立词间动态关系 | 可选 |
协作流程:
文本 → Embedding → Q/K/V → Attention → 新表示 → 预测输出
类型 | 特点 | 应用场景 |
---|---|---|
多头注意力(MHA) | 并行多个注意力头 | Transformer |
因果注意力 | 掩码防止未来信息泄漏 | GPT生成 |
分组查询注意力(GQA) | 查询头共享键值,提升效率 | GPT-4 Turbo |
稀疏注意力 | 只计算部分位置关系 | 长文本处理 |
超参设置:
d_model = 头数 * d_head
(通常d_head=64)性能优化:
# 使用FlashAttention加速(PyTorch示例)
from flash_attn import flash_attention
output = flash_attention(q, k, v)
Attention的局限性:
最新进展:
本文重点:Attention不是简单的"理解输入",而是通过动态权重分配+信息融合实现上下文感知。实际应用中需与Embedding配合,并根据任务需求选择注意力变体。