Transformer 中 QKV 流向全解析(含注意力机制箭头图示)
QKV 是什么?
在 Attention 机制中,我们通过 Query(查询) 与一组 Key-Value(键-值)对 计算注意力权重,然后用这些权重对 Value 进行加权求和,从而输出当前时刻关注上下文的结果。
Transformer 中注意力模块分布
Transformer 结构中含有三种注意力机制,每个机制都会涉及 Q、K、V 的构建和使用:
-
编码器自注意力(Encoder Self-Attention)
-
解码器自注意力(Decoder Self-Attention)
-
编码器-解码器注意力(Encoder-Decoder Attention)
编码器中的注意力机制(Encoder Self-Attention)
位置:每个 Encoder Layer 内的 Multi-Head Self-Attention 子层
输入:编码器输入(embedding 或上层输出),记作 X
-
Q = X × W_Q:当前词想要“查询”的内容
-
K = X × W_K:当前词能“提供”的信息
-
V = X × W_V:当前词携带的实际信息
因为是 自注意力(Self-Attention),所以 Q、K、V 都是来自同一个输入。
[Encoder Input X]│┌───────────┴───────────┐▼ ▼Linear(W_Q) Linear(W_K, W_V)▼ ▼Q ------------------> K│▼Attention│▼V
解码器中的注意力机制(Decoder Self-Attention)
位置:每个 Decoder Layer 的第一层 Multi-Head Self-Attention 子层
输入:解码器已生成的词(embedding 或上层输出),记作 Y
-
Q = Y × W_Q
-
K = Y × W_K
-
V = Y × W_V
同样是 自注意力机制,Q、K、V 均来自 Y
。
注意:此处需要 mask 掩码,防止看到未来词。
[Decoder Input Y]│┌───────────┴───────────┐▼ ▼Linear(W_Q) Linear(W_K, W_V)▼ ▼Q ------------------> K│▼Masked Attention│▼V
解码器中的编码器-解码器注意力机制(Encoder-Decoder Attention)
位置:每个 Decoder Layer 的第二层 Multi-Head Attention 子层
输入:
-
解码器当前输入
Y
(当前时间步的 query) -
编码器输出
X_enc
(作为 memory 提供上下文) -
Q = Y × W_Q(来自解码器的当前输出)
-
K = X_enc × W_K(来自编码器输出)
-
V = X_enc × W_V(来自编码器输出)
这是典型的 跨注意力机制(Cross-Attention)。解码器在“查询”编码器输出中哪些内容有用。
[Decoder Hidden Y] [Encoder Output X]│ │Linear(W_Q) Linear(W_K), Linear(W_V)│ │▼ ▼Q -----------------------> K│▼Attention│▼V
多头注意力机制(Multi-Head Attention)中的 Q、K、V 计算细节
在每个注意力模块中,会有 num_heads
个独立的头,每个头都有自己的一套 W_Q、W_K、W_V:
Q = input @ W_Q # [batch, seq_len, d_model] @ [d_model, d_k]
K = input @ W_K
V = input @ W_V
然后每个 head 分别进行注意力计算,再合并回去(Concat),再接一个线性变换。
总结对照表
注意力类型 | Q 来源 | K 来源 | V 来源 | 是否 Mask |
---|---|---|---|---|
编码器自注意力 | 编码器输入 X | 编码器输入 X | 编码器输入 X | 否 |
解码器自注意力 | 解码器输入 Y | 解码器输入 Y | 解码器输入 Y | ✅ 是 |
编码器-解码器注意力 | 解码器输入 Y | 编码器输出 X | 编码器输出 X | 否 |