✅ 原始設計沒有最後一層 ReLU 的原因 在原始的 Transformer 架構(見 Attention is All You Need)中,Feed Forward 的部分長這樣: $FFN(x) = max(0, xW₁ + b₁)W₂ + b₂$ 也就是: ```python nn.Linear(k, 4*k) nn.ReLU() nn.Linear(4*k, k) ``` 👉 第二層後沒有 ReLU,是因為: 最後一層的輸出需要保留負值與線性範圍。 若再加 ReLU,會強迫所有輸出變為非負,這樣會損失表達能力。 注意力機制後的輸出,經過殘差與 LayerNorm,要保持對稱性(zero-centered)。 多加一個非線性函數可能會破壞這種平衡。 實驗證明這樣的設計效果最好。 原始論文、BERT、GPT 等都遵循這個設計。 🔬 如果加上 ReLU 會怎樣? 假如你這樣寫: ```python nn.Linear(k, 4*k), nn.ReLU(), nn.Linear(4*k, k), nn.ReLU() ``` 這樣會讓 整個 block 的輸出只會是非負數,導致: 破壞原本 LayerNorm 所需的 zero-centered input。 殘差機制(skip connection)可能因為激活函數剪裁掉資訊,導致效果下降。 雖然在某些特定任務可能不致命,但在通用場景下會 降低模型穩定性與泛化能力。 🧠 總結 你看到的這個 Feed Forward 設計: ```python nn.Linear(k, 4*k), nn.ReLU(), nn.Linear(4*k, k ``` 是 Transformer 的經典設計,最後不加 ReLU 是為了保留輸出信息的完整性與符號性,配合 LayerNorm、殘差連接達成穩定學習。