Skip to content

Attention

Attention 的核心不是“给词算相关度”,而是完成动态信息路由:

对当前 token,决定从哪些可访问位置获取多少信息,并把这些位置承载的内容聚合成新的上下文化表示。

核心公式:

Attention(Q,K,V)=softmax(QKTdk+M)V

其中 M 表示可选的 Mask;普通双向 Self-Attention 可以没有 Causal Mask,自回归 Decoder 需要 Causal Mask。

整条链可以先压缩成:

text
Q / K
→ 从哪里取、取多少

V
→ 真正被取走和聚合的内容

Attention Output
→ 聚合上下文后的新 token representation

1. 从 Hidden Representation 到 Q / K / V

设当前层输入:

XRn×dmodel
  • n:token 数量;
  • d_model:每个 token 当前 hidden representation 的维度。

单个 Head 中:

Q=XWQ,K=XWK,V=XWV

若:

WQ,WKRdmodel×dk,WVRdmodel×dv

则:

Q,KRn×dk,VRn×dv

经典 Multi-Head Attention 中通常有:

dk=dv=dhead

2. 参数和 Activation 必须分开

text
模型长期学习和保存:
W_Q, W_K, W_V

一次 Forward 根据输入动态产生:
Q, K, V

同一 Head 中,各 token 共享同一组投影参数:

qi=xiWQ,qj=xjWQ

虽然参数相同,但由于:

xixj

所以不同 token 会得到不同的 q/k/v。

下一 Transformer Layer 也不会“更新上一层的 V”,而是根据上一层得到的新 hidden representation,用这一层自己的投影参数重新计算新的 Q/K/V。


3. Q / K / V 的职责

对于第 i 个 token,它的 Query:

qi

与第 j 个位置的 Key:

kj

做点积:

qikjT

得到匹配分数。

经 Scaling、Mask、Softmax 后:

αij=softmaxj(qikjTdk+Mij)

最终:

oi=jαijvj

所以:

text
Q/K
→ routing weights

V
→ routed content

为什么 K 与 V 分开?

用于判断:

“这个位置是否值得关注?”

的特征,不一定等于:

“关注以后应该传递什么内容?”

的特征。

因此模型可以分别学习:

text
如何判断相关性

相关以后传递什么表示

这也是不要把 Key 当成“返回内容”的原因。


4. Attention Score Matrix 的维度

如果:

Q,KRn×dk

则:

KTRdk×n

所以:

QKTRn×n

矩阵乘法可以记成:

text
Q:   token × feature
K^T: feature × token

feature 维被点积消掉

Attention Score: token × token

(i,j) 个元素:

(QKT)ij=qikjT

表示第 i 个 Query 与第 j 个 Key 的 raw compatibility score。

未经 Softmax 前更准确地称为:

  • attention score;
  • attention logit;
  • compatibility score。

Softmax 后才是归一化的 attention weight。


5. 为什么使用点积

对于:

qi,kjRdk

点积:

qikjT=m=1dkqimkjm

将两个向量压缩成一个标量匹配分数。

这里的“匹配”不是人工固定的语义相似度。因为 WQ,WK 都是可学习参数,训练过程会决定什么表示在 Query-Key 空间中应该具有较高匹配分数。


6. 为什么除以 dk

Scaling 的目的不是形式上的“归一化”,而是控制点积 logits 的数值尺度。

为了理解尺度,采用经典简化假设:各维近似独立,均值为 0、方差为 1。

qk=i=1dkqiki

若每个乘积项方差约为 1,则:

Var(qk)dk

因此标准差约为:

Std(qk)dk

例如:

text
d_k = 64
→ score 标准差量级约 8

d_k = 1024
→ score 标准差量级约 32

维度越高,未经缩放的 logits 越容易被拉开。

除以:

dk

后:

Var(qkdk)1

从而使输入 Softmax 的尺度更稳定。

为什么这会影响 Softmax?

Softmax:

pi=ezijezj

例如:

text
[1, 2]
→ Softmax ≈ [0.27, 0.73]

[10, 20]
→ Softmax ≈ [0, 1]

指数函数会放大 logit 差异。若 logits 过大,分布容易过度尖锐,进入饱和区域,使优化更加困难。

因此:

text
d_k 增大
→ 点积方差增大
→ logits 尺度增大
→ Softmax 更容易过度尖锐

÷ sqrt(d_k)
→ 稳定 score 尺度

上述独立同分布假设只是解释设计动机的简化模型,不代表训练后的真实 Q/K 必须满足精确分布假设。


7. Softmax:把 Score 变成路由权重

定义:

S=QKTdk

按每个 Query 对应的一行做 Softmax:

A=softmax(S)

对第 i 行:

Aij0,jAij=1

因此一行可以理解为:

当前 token 把自己的信息获取权重如何分配给所有可访问位置。

例如:

[0.2,0.3,0.5]

最终会聚合:

0.2v1+0.3v2+0.5v3

8. Causal Mask

Decoder-only 自回归模型需要保证当前 token 不能访问未来 token。

3 个 token 的允许访问关系:

text
T1 → T1
T2 → T1, T2
T3 → T1, T2, T3

可以使用:

M=[000000]

实际计算:

A=softmax(QKTdk+M)

因为:

e=0

被 Mask 的位置经 Softmax 后权重为 0。

注意:

Mask 表示“是否允许访问”,不是“数学上是否相关”。

即使一个未来 Key 与当前 Query 的原始匹配分数很高,也必须被因果规则屏蔽。

训练阶段完整真实序列已经存在,如果没有 Causal Mask,当前位置就可能读取未来真实 token,造成未来信息泄漏;实际生成时这些未来 token 尚未产生。


9. 最小手算:完整走一遍 Attention

设 3 个 token,dk=2

Q=[100111],K=[100111]V=[100231]

Step 1:Score

QKT=[101011112]

Step 2:Scaling

dk=21.414S[0.70700.70700.7070.7070.7070.7071.414]

Step 3:Causal Mask

Smasked[0.70700.7070.7070.7071.414]

Step 4:Softmax

近似得到:

A[1000.330.6700.250.250.50]

Step 5:聚合 V

O=AV

因此:

o1=[1,0]o2=0.33[1,0]+0.67[0,2][0.33,1.34]o3=0.25[1,0]+0.25[0,2]+0.50[3,1][1.75,1.00]

最终:

O[100.331.341.751.00]

这里 O 不是用来“更新 V”的参数,而是这一 Head 为每个 token 产生的新的上下文化表示。


10. Self-Attention 与 Cross-Attention

Self-Attention

Q/K/V 来自同一序列表示:

Q=XWQ,K=XWK,V=XWV

用于序列内部 token 间的信息交互。

Cross-Attention

Q 与 K/V 来自不同表示来源。

经典 Encoder-Decoder 中可以理解为:

text
Q   ← Decoder representation
K/V ← Encoder output

Decoder 根据自己的 Query,从 Encoder 表示中选择和聚合相关信息。


11. Multi-Head Attention

每个 Head 拥有不同的投影子空间:

headi=Attention(Qi,Ki,Vi)

不同 Head 通常拥有不同的:

  • Q/K/V 表示;
  • Attention Score;
  • Attention Weight;
  • 上下文聚合结果。

因此 Multi-Head 不是“同一个 Attention 重复算多遍再平均”。

更准确的理解是:

多个 Head 在不同可学习表示子空间中并行执行信息路由与内容聚合。

不要过度解释成“某个 Head 固定负责语法、另一个固定负责实体”,这种职责并非人工预先指定。


12. Multi-Head 的维度

若:

n=100,dmodel=512,h=8,dhead=64

则单个 Head:

Qi,Ki,ViR100×64

单 Head Attention Score:

QiKiTR100×100

单 Head 输出:

headiR100×64

8 个 Head 拼接:

Concat(head1,,head8)R100×512

之后进入 Output Projection WO,具体见 Transformer Block。

工程实现中通常会将多个 Head 的投影合并成较大的矩阵乘法,再 reshape 成多个 Head,而不是逐 Head 执行大量小矩阵乘法。


13. 高频误区

text
错误:W_Q / W_K / W_V 与 Q/K/V 是同一类对象
正确:W 是参数,Q/K/V 是当前 Forward 的 activation
text
错误:QK^T 的尺寸仍是 n × d_k
正确:(n × d_k)(d_k × n) = n × n
text
错误:K 是实际被返回的内容
正确:K 参与匹配,V 承载被加权聚合的内容
text
错误:Attention Output 用来更新原来的 V
正确:O 是新产生的 contextualized representation
text
错误:Multi-Head 是重复计算相同 Attention
正确:不同 Head 使用不同可学习投影子空间

14. 一句话闭环

Q/K V O 

下一步:

03_transformer-block.md

Mistakes:

05_Mistakes/AI.md

Interview QA:

06_Interview/AI_QA/Transformer.md