第一次读注意力公式时,最困惑的往往不是矩阵乘法,而是 Q、K、V 这三个名字。 后来换了一个说法就好理解多了:把每个词想象成一个参会的人,Q 是他想问的问题, K 是他挂在胸前的标签,V 是他真正能提供的信息。注意力做的事,就是让每个词拿着自己的问题, 去和其他所有词的标签比对,再按匹配程度把信息取回来。
Q、K、V 在做什么
一句话里的每个 token 先被投影成三个向量。用 Q 和 K 做点积得到相似度,经过缩放和 softmax 变成一组权重,再用这组权重对 V 加权求和。输出的每一行,都是「当前这个词从整句话里取回的信息」。
缩放因子 1/sqrt(d_k) 的作用容易被忽略:当维度变大时,点积的方差也会变大,
softmax 会退化成接近 one-hot 的分布,梯度变得很小。除以维度的平方根,是为了把分布拉回一个
更平滑的范围。
多头注意力
单个注意力头只能学到一种匹配关系,可能只关注相邻词,也可能只关注句法依赖。多头把
d_model 切成若干份,每个头在更低的维度上独立做一次注意力,最后拼接再投影。
形状上可以这样记:输入 [batch, seq, d_model],拆成 h 个头后每个头是
[batch, h, seq, d_head],其中 d_head = d_model / h,算完再合并回原维度。
位置编码为什么不能省
注意力本身对顺序是不敏感的:把 token 打乱,只要同时打乱对应的 K 和 V,结果完全一样。 但语言是有顺序的。所以必须额外注入位置信息,无论是正弦位置编码、可学习的位置向量, 还是后来的旋转位置编码(RoPE)。
小结
把注意力理解成「带权重的信息检索」,比死记公式更容易迁移到具体问题上。 之后再看到 KV Cache、多头、分组查询这些概念,也能顺着同一套直觉去理解。