FeedForward Network
-
論文地址
https://arxiv.org/pdf/1706.03762
前饋網絡介紹
-
前饋網絡是Transformer模型中的關鍵組件,每個Transformer層包含一個多頭注意力模塊和一個前饋網絡模塊。該模塊通過兩次線性變換和激活函數,為模型提供非線性建模能力。其核心設計是通過中間隱藏層的維度擴展(d_ff > d_model),增強模型的特征表達能力。
典型配置中d_ff=2048(當d_model=512時),這種"擴展-收縮"結構幫助模型捕獲更復雜的模式。前饋網絡獨立作用于每個位置,與注意力機制形成功能互補。
數學公式
-
前饋網絡FFN(FeedForward Network)的計算過程可表示為:
FFN ( x ) = ReLU ( x W 1 + b 1 ) W 2 + b 2 \text{FFN}(x) = \text{ReLU}(xW_1 + b_1)W_2 + b_2 FFN(x)=ReLU(xW1?+b1?)W2?+b2?
在標準實現中:- 第一層將維度從 d _ m o d e l d\_model d_model擴展到 d _ f f d\_ff d_ff
- 第二層將維度從 d _ f f d\_{ff} d_ff恢復為 d _ m o d e l d\_{model} d_model
- 實際實現中常省略偏置項(bias=False)
帶Dropout的改進公式:
FFN ( x ) = Dropout ( ReLU ( x W 1 ) W 2 ) \text{FFN}(x) = \text{Dropout}(\text{ReLU}(xW_1)W_2) FFN(x)=Dropout(ReLU(xW1?)W2?)
代碼實現
-
前饋網絡模塊實現
import torch from torch import nnclass FeedForward(nn.Module):def __init__(self, d_model, d_ff, dropout_prob=0.1):""":param d_ff: 中間隱藏層維度"""super(FeedForward, self).__init__()self.ffn = nn.Sequential(nn.Linear(in_features=d_model, out_features=d_ff, bias=False),nn.ReLU(),nn.Linear(in_features=d_ff, out_features=d_model, bias=False),nn.Dropout(dropout_prob))def forward(self, x):output = self.ffn(x)return output
-
參數說明
參數名稱 說明 典型值 d_model 輸入/輸出維度(embedding維度) 512 d_ff 中間層擴展維度 2048 dropout_prob Dropout概率(輸出層之后應用) 0.1
維度變換流程
-
數據流經各層的形狀變化:
操作步驟 張量形狀變化示例 輸入數據 [batch_size, seq_len, d_model] 第一線性層(d_model→d_ff) [batch_size, seq_len, d_ff] ReLU激活 [batch_size, seq_len, d_ff] 第二線性層(d_ff→d_model) [batch_size, seq_len, d_model] Dropout [batch_size, seq_len, d_model]
使用示例
-
測試代碼
if __name__ == "__main__":batch_size = 4seq_len = 100d_model = 512d_ff = 2048x = torch.randn(batch_size, seq_len, d_model)ffn = FeedForward(d_model=d_model, d_ff=d_ff)out = ffn(x)print("輸入形狀:", x.shape) # torch.Size([4, 100, 512])print("輸出形狀:", out.shape) # torch.Size([4, 100, 512])print("輸出均值:", out.mean().item()) # ≈0(受初始化影響)