引言:從Self-Attention到完整架構
在上一篇文章中,我們深入剖析了Self-Attention機制的核心原理。然而,Transformer的魅力遠不止于此——其Encoder-Decoder架構通過巧妙的模塊化設計,實現了從機器翻譯到文本生成的廣泛能力。本文將以“架構拆解+數學推導+代碼實現”的方式,完整揭示Transformer的工作機制。
一、Transformer整體架構全景圖
Transformer由N個相同的Encoder層和Decoder層堆疊而成(通常N=6)。其核心流程如下:
輸入序列 → Encoder → 上下文表示 → Decoder → 輸出序列
二、Encoder層深度解析
每個Encoder層包含兩個核心子層:
2.1 多頭自注意力(Multi-Head Attention)
\text{MultiHead}(Q,K,V) = \text{Concat}(head_1,...,head_h)W^O
其中每個頭獨立計算Self-Attention:
head_i = \text{Attention}(QW_i^Q, KW_i^K, VW_i^V)
作用:從不同子空間捕捉特征,提升模型表達能力。
2.2 前饋神經網絡(FFN)
\text{FFN}(x) = \max(0, xW_1 + b_1)W_2 + b_2
設計特點:
- 使用ReLU激活函數
- 中間層維度通常為4×d_model(如d_model=512時,中間層為2048)
2.3 殘差連接與層歸一化
每個子層輸出計算為:
x_{out} = \text{LayerNorm}(x + \text{Sublayer}(x))
數學意義:防止梯度消失,加速模型收斂。
三、Decoder層核心技術揭秘
Decoder在Encoder基礎上新增兩個關鍵機制:
3.1 掩碼自注意力(Masked Self-Attention)
通過下三角矩陣掩碼,確保當前位置只能關注之前的位置:
# 生成掩碼矩陣
mask = torch.triu(torch.ones(seq_len, seq_len), diagonal=1).bool()
scores.masked_fill_(mask, -1e9)
作用:防止解碼時“偷看”未來信息,保證自回歸特性。
3.2 Encoder-Decoder注意力
Query來自Decoder上一層的輸出,Key/Value來自Encoder最終輸出:
\text{Attention}(Q_{dec}, K_{enc}, V_{enc})
物理意義:建立輸入序列與輸出序列的語義對齊。
四、核心組件實現詳解
4.1 位置前饋網絡(Position-wise FFN)代碼實現
class FeedForward(nn.Module):def __init__(self, d_model, d_ff=2048):super().__init__()self.linear1 = nn.Linear(d_model, d_ff)self.linear2 = nn.Linear(d_ff, d_model)def forward(self, x):return self.linear2(F.relu(self.linear1(x)))# 輸入維度示例:x.shape = [batch, seq_len, 512]
4.2 層歸一化(LayerNorm)的位置
實驗表明,Transformer使用Post-LN結構(先殘差連接后歸一化):
class Sublayer(nn.Module):def __init__(self, d_model, dropout=0.1):super().__init__()self.norm = nn.LayerNorm(d_model)self.dropout = nn.Dropout(dropout)def forward(self, x, sublayer):return x + self.dropout(sublayer(self.norm(x)))
五、訓練與推理關鍵技術
5.1 動態掩碼技術
在訓練時隨機屏蔽不同位置的token,提升魯棒性:
def create_mask(seq, pad_idx):mask = (seq != pad_idx).unsqueeze(1) # padding掩碼seq_mask = (1 - torch.triu(torch.ones(seq_len, seq_len))).bool() # 序列掩碼return mask & seq_mask
5.2 標簽平滑(Label Smoothing)
緩解過擬合,計算公式:
q_i = \begin{cases}
1-\epsilon+\epsilon/K & \text{if } i=y \\
\epsilon/K & \text{otherwise}
\end{cases}
其中ε=0.1,K為類別數。
六、完整模型實現與效果驗證
使用PyTorch搭建完整Transformer:
class Transformer(nn.Module):def __init__(self, src_vocab, tgt_vocab, N=6, d_model=512):super().__init__()self.encoder = Encoder(N, d_model)self.decoder = Decoder(N, d_model)self.src_embed = nn.Embedding(src_vocab, d_model)self.tgt_embed = nn.Embedding(tgt_vocab, d_model)def forward(self, src, tgt):memory = self.encoder(self.src_embed(src))output = self.decoder(self.tgt_embed(tgt), memory)return output# 示例:英中翻譯任務
model = Transformer(src_vocab=10000, tgt_vocab=8000)
七、總結與延展思考
Transformer通過以下設計革新了序列建模:
- 并行計算:徹底擺脫RNN的時序依賴
- 層次化注意力:從局部到全局的特征抽象
- 統一架構:同一模型處理不同模態任務
思考題:
- 為什么Decoder需要兩個不同的注意力層?
- 如何理解“多頭”注意力中的“頭”維度分配?
下期預告:《Vision Transformer實戰:如何將Transformer應用于圖像分類》
參考資料:
- Vaswani A, et al. Attention Is All You Need. NeurIPS 2017
- Transformer代碼庫
(注:文中部分示意圖需配合代碼運行生成,完整實現代碼可在CSDN資源下載專區獲取)