Q1:DecoderLayer 包含哪些子層?
A1:DecoderLayer 由三大子層組成:
- 自注意力子層(self?attn)
- 交叉注意力子層(cross?attn)
- 前饋網(wǎng)絡(luò)子層(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相加,再經(jīng)過Dropout與LayerNorm(norm1),得到x?(殘差歸一化后的表示),該x?將作為后續(xù)交叉注意力的查詢(Q)。
Q3:交叉注意力子層的查詢、鍵、值分別是什么?它們是如何連接的?
A3:
-
查詢 Q:來自自注意力子層的殘差歸一化輸出
x?(而不是原始自注意力輸出)。 -
鍵 K 與值 V:均為 編碼器的輸出
src(即 memory),二者相等。 -
計算:
cross_attn(x?, src, src, src_mask)。 -
殘差 + 歸一化:交叉注意力的輸出
output與x?相加,經(jīng)過Dropout與LayerNorm(norm2),得到x?,隨后作為前饋網(wǎng)絡(luò)的輸入。
Q4:前饋網(wǎng)絡(luò)子層的結(jié)構(gòu)與殘差/歸一化是怎樣的?
A4:
-
輸入:交叉注意力子層歸一化后的輸出
x?。 -
結(jié)構(gòu):兩層全連接層
Linear(d_model → d_ff)→ReLU→Dropout→Linear(d_ff → d_model)。 -
殘差 + 歸一化:前饋網(wǎng)絡(luò)的輸出
output與x?相加,經(jīng)過Dropout與LayerNorm(norm3),得到x?,即 DecoderLayer 的最終輸出。
Q5:每個子層的殘差連接和 LayerNorm 是否相互獨立?
A5:是的。自注意力、交叉注意力、前饋網(wǎng)絡(luò)各自擁有獨立的殘差路徑和對應(yīng)的 LayerNorm(norm1、norm2、norm3),互不共享。
Q6:對原先描述的細節(jié)需要哪些更正?
A6:
- 原描述中“使用解碼器第一個多頭注意力層的輸出作為 Q”應(yīng)更準確地表述為 “使用自注意力子層經(jīng)過殘差連接和 LayerNorm 之后的輸出
x?作為 Q”。 - 其他關(guān)于 K、V 均為編碼器輸出、前饋網(wǎng)絡(luò)輸入為交叉注意力歸一化輸出的描述是正確的。
結(jié)論: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