Q1:DecoderLayer 包含哪些子层?
A1:DecoderLayer 由三大子层组成:
- 自注意力子层(self‑attn)
- 交叉注意力子层(cross‑attn)
- 前馈网络子层(ffn)
每个子层都有独立的 残差连接 与 LayerNorm(分别为 norm1、norm2、norm3)。
Q2:自注意力子层的输入、输出以及残差/归一化过程是怎样的?
A2:
-
输入:解码器当前时刻的目标序列表示
tgt(形状(batch, tgt_len, d_model))。 -
计算:
self_attn(tgt, tgt, tgt, tgt_mask),即 Q = K = V = tgt。 -
残差 + 归一化:将自注意力的输出
output与原始tgt相加,再经过Dropout与LayerNorm(norm1),得到x₁(残差归一化后的表示),该x₁将作为后续交叉注意力的查询(Q)。
Q3:交叉注意力子层的查询、键、值分别是什么?它们是如何连接的?
A3:
-
查询 Q:来自自注意力子层的残差归一化输出
x₁(而不是原始自注意力输出)。 -
键 K 与值 V:均为 编码器的输出
src(即 memory),二者相等。 -
计算:
cross_attn(x₁, src, src, src_mask)。 -
残差 + 归一化:交叉注意力的输出
output与x₁相加,经过Dropout与LayerNorm(norm2),得到x₂,随后作为前馈网络的输入。
Q4:前馈网络子层的结构与残差/归一化是怎样的?
A4:
-
输入:交叉注意力子层归一化后的输出
x₂。 -
结构:两层全连接层
Linear(d_model → d_ff)→ReLU→Dropout→Linear(d_ff → d_model)。 -
残差 + 归一化:前馈网络的输出
output与x₂相加,经过Dropout与LayerNorm(norm3),得到x₃,即 DecoderLayer 的最终输出。
Q5:每个子层的残差连接和 LayerNorm 是否相互独立?
A5:是的。自注意力、交叉注意力、前馈网络各自拥有独立的残差路径和对应的 LayerNorm(norm1、norm2、norm3),互不共享。
Q6:对原先描述的细节需要哪些更正?
A6:
- 原描述中“使用解码器第一个多头注意力层的输出作为 Q”应更准确地表述为 “使用自注意力子层经过残差连接和 LayerNorm 之后的输出
x₁作为 Q”。 - 其他关于 K、V 均为编码器输出、前馈网络输入为交叉注意力归一化输出的描述是正确的。
结论:DecoderLayer 的工作流程为:
self_attn → norm1 → cross_attn → norm2 → ffn → norm3,每一步均伴随残差连接,确保梯度流通并提升模型表达能力。
附录
Paper: https://arxiv.org/abs/1706.03762
Transformer‑from‑Scratch: https://github.com/Breeze648/Transformer-from-Scratch