01 · Attention 想解决什么问题
一句话中,一个位置的表示需要参考其他位置。例如“苹果发布了新电脑”中,处理“电脑”位置时,可以参考前面“苹果”“发布”等信息。Attention 根据当前位置与其他位置的匹配程度,决定各位置的信息应占多大比重。实际模型学习的是向量关系,不会显式写出一套词语规则。
理解 FlashAttention 时,先把一个查询位置当成一位提问者:它给各个候选信息打分,把分数变成权重,按权重汇总信息。加速方法改变的是这段工作的执行方式。
02 · Q、K、V 各做什么
| 符号 | 直观作用 | 怎样得到 |
|---|---|---|
| Q / Query | 当前位置用什么特征寻找信息 | 当前位置隐藏向量乘训练得到的 Wq。 |
| K / Key | 其他位置用什么特征供匹配 | 各位置隐藏向量乘 Wk。 |
| V / Value | 匹配后真正汇总的信息 | 各位置隐藏向量乘 Wv。 |
同一位置也会产生自己的 K/V。Q 和 K 用于打分;最终加权的是 V。三者都是向量,“提问 / 标签 / 内容”只是理解分工的类比。
03 · 为什么出现 N×N 矩阵
假设 N=4 个位置,每个 Q/K 向量有 d=2 个数。Q 和 K 都可写成 4 行、2 列。转置 Kᵀ 把行列互换,变成 2 行、4 列;QKᵀ 得到 4 行、4 列的分数表。第 i 行、第 j 列表示查询 i 对位置 j 的匹配分数。
Q: [4, 2]
Kᵀ: [2, 4]
QKᵀ: [4, 4]
一个点积:[1, 2] · [3, 4] = 1×3 + 2×4 = 11标准缩放点积 Attention 还会把分数除以 √d,以控制数值尺度。因果掩码禁止当前位置读取未来位置;可在 Softmax 前把对应分数屏蔽。
04 · Softmax 怎样把分数变成权重
对一行分数 s,先取指数 exp(s),再除以这一行指数的总和。exp 是指数函数,例如 exp(0)=1、exp(ln 2)=2。ln 是它的反函数;刚开始可以只看取指数之后的权重,不必手算 ln。
假设取指数后是 [1, 2, 4, 3]
总和 = 10
Softmax 权重 = [0.1, 0.2, 0.4, 0.3]
假设 V 是 [10, 20, 30, 40]
输出 = 0.1×10 + 0.2×20 + 0.4×30 + 0.3×40 = 29真实 V 通常有多个分量,对每个分量做同样的加权求和。最后输出的形状是 [查询数, V 的维度],不是一张新的 N×N 分数表。
05 · 为什么先减去最大值
分数很大时直接计算 exp(s) 可能溢出。把一行所有分数都减去同一个最大值 m,再取指数,可以让最大指数变成 1。所有权重都乘了同一个因子 exp(−m),分子和分母中的因子相消,所以归一化结果不变。
原始强度 [1, 2, 4, 3]
共同除以最大强度 4 → [0.25, 0.5, 1, 0.75]
新总和 2.5
归一化后仍是 [0.1, 0.2, 0.4, 0.3]FlashAttention 的在线 Softmax 就在利用这个“统一改尺度后结果不变”的性质。
06 · 回到优化方法
记住三个动作就可以继续阅读:QKᵀ 产生分数;Softmax 产生相对权重;PV 汇总 V。不要把中间概率矩阵 P 和生成过程中保存的 KV Cache 混为一谈。