本文的目標是解釋為什么現代LLM架構在前饋部分使用 SwiGLU 作為激活函數并且已經放棄了 ReLU。
神經網絡本質上是一系列矩陣乘法,如果我們堆疊線性層而不使用任何激活函數:
無論你堆疊多少層,它仍然只是一個線性變換,網絡只能學習線性關系。
激活函數引入了非線性,使網絡能夠逼近復雜的非線性函數,這是深度學習表達能力的基礎。
ReLU有什么問題?
ReLU 確實徹底改變了深度學習:
它簡單、快速,并且解決了 sigmoid 或 tanh 等函數存在的梯度消失等問題。
雖然人們通常會列出使用 ReLU 時可能遇到的問題,比如神經元死亡等等,但這些問題要么是理論上的,要么在大多數情況下可以通過現代神經網絡技術(批量歸一化、自適應學習權重等)很好的避免。
不過在進入SwiGLU之前,我們先來看一個激活函數Swish,它是SwiGLU的組成部分。
Swish是一個"自門控"激活函數:輸入 \(x\) 乘以其自身的sigmoidσ(x),它充當一個門,控制有多少輸入能夠通過。
看看門的行為:
當x非常負時:σ(x) ≈ 0,所以門是關閉的(抑制輸出)
當x非常正時:σ(x) ≈ 1,所以門是完全打開的(幾乎原樣通過輸入)
盡管公式稍微復雜一些,Swish 的行為與 ReLU 非常相似。
![]()
Swish比ReLU更好嗎?
Swish 被發現比 ReLU 效果更好,但就像深度學習中的許多事情一樣我們并不確切知道為什么 Swish 效果更好,不過倒是可以總結出以下的區別:
沒有硬梯度截斷
看上面的圖,主要區別就是它們如何處理負輸入:
ReLU:在零處硬截斷
當x<0時:輸出 = 0 且 梯度 = 0。這就是神經元死亡問題(盡管如前所述,通常可以通過BatchNorm等現代技術來避免)
Swish:平滑、漸進地趨近于零
對于負x:梯度漸近趨近于零,但對于有限值永遠不會精確等于零/所以理論上神經元總是可以接收更新(盡管對于非常負的輸入,更新可能可以忽略不計)
平滑性
ReLU 在x=0處有不連續性(導數從0跳到1)。Swish 在任何地方都是無限可微的,這意味著梯度景觀是平滑的。這種平滑性是否有助于 Swish 的性能還不是100%清楚但它可能有助于優化
![]()
什么是門控線性單元(GLU)?
下面就是 SwiGLU 的另外一個組件。讓我們來談談GLU。
其中:
x是輸入
W 和 V 是權重矩陣
b和c是偏置向量
⊙是逐元素乘法
σ是sigmoid函數
GLU 使用門控機制在這方面與 Swish 有些相似。而它們區別在于GLU不是對所有特征應用相同的變換(恒等變換)然后用固定函數(sigmoid)進行門控,而是使用兩個獨立的線性投影:
xW+ b這只是取輸入并對其進行變換。它通常被稱為 內容路徑
σ(xV + c):這第二部分說明每個特征的內容應該讓多少通過,因此它被稱為 門路徑
所以GLU實際上可以被認為是Swish` 的泛化
逐元素乘法⊙允許門選擇內容的哪些元素可以通過。當σ(xV + c)接近0時,門可以完全抑制某些特征,而當σ(xV + c)接近1時則完全讓其他特征通過。
門控的具體示例
假設我們有一個4維向量x = [1.0, -0.5, 2.0, 0.3]
GLU對同一個輸入應用2個變換:
- 通過內容路徑對內容進行變換:xW + b。假設它產生[2.0, -1.5, 3.0, 0.5]
- 第2個變換應該扮演門的角色:σ(xV + c)。假設它產生[0.9, 0.1, 0.95, 0.05]
GLU輸出是它們的逐元素乘積:
GLU output = [2.0 × 0.9, -1.5 × 0.1, 3.0 × 0.95, 0.5 × 0.05] = [1.8, -0.15, 2.85, 0.025]
得到的結果如下:
特征1:內容為正(2.0),門值高(0.9)→ 強烈通過(1.8)
特征2:內容為負(-1.5),門值低(0.1)→ 被阻擋(-0.15)
特征3:內容為正(3.0),門值非常高(0.95)→ 完全通過(2.85)
特征4:內容較小(0.5),門值非常低(0.05)→ 被抑制(0.025)
這樣網絡學習了復雜的決策規則:"對于像x這樣的輸入,放大特征1和3,但抑制特征2和4。"
![]()
那么SwiGLU是什么?
現在我們有了所有的組成部分,SwiGLU(Swish門控線性單元)簡單地結合了Swish和GLU:
它不是像GLU那樣使用sigmoid作為門,而是使用Swish。這就是為什么它被稱為Swish +GLU。
那么公式的每個部分做什么呢?這與GLU的邏輯完全相同,改變的只是門控函數。
- Swish(xW):門——決定每個特征有多少可以通過
- xV:內容——正在傳輸的實際信息
- :逐元素乘法——將門應用于內容
![]()
為什么SwiGLU效果這么好?
從經驗上看,SwiGLU在LLM中優于其他激活函數(盡管目前還不確定VLM的情況)。但為什么呢?
乘法交互創建特征組合
考慮每種架構計算的內容:
標準FFN(ReLU/GELU):output = activation(xW?) @ W?
每個輸出維度是激活特征的加權和,激活是逐元素應用的——特征在激活內部不會相互交互。
SwiGLU FFN:output = (Swish(xW) ⊙ xV) @ W?
逐元素乘法⊙在兩條路徑之間創建乘積。如果我們用g = Swish(xW)和c = xV表示,那么在最終投影之前的輸出維度i是g? × c?。
這就是為什么這很重要:g?和c?都是輸入特征的線性組合(在Swish之前)。它們的乘積包含像x? × x?這樣的交叉項。網絡可以學習W和V,使得某些輸入特征組合被放大或抑制。
這類似于為什么注意力機制很強大,注意力計算softmax(QK?)V,其中QK?乘積捕獲查詢和鍵特征之間的交互。SwiGLU為FFN帶來了類似的乘法表達能力。
為什么不在門中使用sigmoid而是使用Swish?
GLU使用sigmoid:σ(xW) ⊙ xV。sigmoid的問題在于它會飽和。對于大的正或負輸入,σ(x) ≈ 1或σ(x) ≈ 0,且梯度?σ/?x ≈ 0,門就會被“凍結”了。
Swish對于正輸入不會飽和,它近似線性增長(就像 ReLU)。這意味著:- 梯度通過門路徑流動得更好 - 門可以調節而不僅僅是開/關切換
平滑性
另外就是SwiGLU是無限可微的,這種平滑性可能有助于優化穩定性。
總結
SwiGLU的強大來自于其門控機制和乘法交互。通過將輸入分成兩條路徑并將它們相乘,網絡可以學習哪些特征組合是重要的——類似于注意力機制如何通過 QK?捕獲交互。
結合Swish的非飽和梯度,這使得SwiGLU對于大型模型特別有效。
https://avoid.overfit.cn/post/3fa28c75fb0b4874aa297defa145ec4a
作者:Safouane Chergui
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.