什麼是激活函數?——神經網絡的「神經」之所在
在深度學習的神經網絡中,激活函數(Activation Function)是模型中一個至關重要的非線性組件。它們被引入到神經元的輸出端,用於對神經元的輸入信號進行轉換和映射,決定該神經元是否應該被「激活」以及其輸出的強度。如果沒有激活函數,或者只使用線性激活函數,無論神經網絡有多少層,它都只能學習到輸入與輸出之間的線性關係,這將大大限制模型的表達能力,使其無法處理複雜的非線性問題,例如圖像識別、自然語言處理等。
我們可以將激活函數形象地比喻為生物神經元中的一個「閥門」或「開關」。當接收到的信號(加權和)達到一定閾值時,閥門打開,神經元被激活並傳遞信息;反之,則保持關閉或傳遞微弱信號。這種非線性特性賦予了神經網絡學習複雜模式和表示的能力,使其能夠逼近任意複雜的函數。
為什麼神經網絡需要激活函數?
神經網絡的本質是通過組合一系列簡單的線性變換和非線性變換來學習複雜的函數映射。其中,線性變換通常由權重和偏置的乘加運算完成。然而,僅僅堆疊線性層是無法構建深度網絡的,原因如下:
- 打破線性組合的限制: 假設我們沒有激活函數,或者使用恆等激活函數(f(x) = x)。那麼,無論堆疊多少層,例如:
第一層輸出:Y1 = W1 * X + B1
第二層輸出:Y2 = W2 * Y1 + B2 = W2 * (W1 * X + B1) + B2 = (W2 * W1) * X + (W2 * B1 + B2)
可以看到,多層線性變換的組合仍然可以表示為一個單一的線性變換。這意味着一個多層網絡將退化為單層網絡,其學習能力和表達能力與單層感知機無異,無法解決異或(XOR)等非線性問題。
- 引入非線性特性: 現實世界中的數據和問題往往是非線性的。激活函數的核心作用就是引入非線性,使得神經網絡能夠學習和模擬任意複雜的非線性關係,從而提高模型的表達能力和泛化能力。
- 允許梯度下降和反向傳播: 大多數激活函數都是可導的(或在幾乎所有點上可導),這使得我們可以使用基於梯度的優化算法(如梯度下降)來訓練神經網絡,通過反向傳播算法調整權重和偏置,從而最小化損失函數。
激活函數有哪些?——主流類型與特性詳述
隨着深度學習的發展,研究人員提出了多種激活函數,每種都有其獨特的優點和缺點,適用於不同的場景。以下是當前主流的激活函數及其詳細介紹:
1. Sigmoid 函數 (Logistic Function)
Sigmoid 函數是最早被廣泛使用的激活函數之一,其數學表達式為:
f(x) = 1 / (1 + e^(-x))
它的輸出值介於0到1之間,形狀類似一個「S」形曲線。
- 優點:
- 將輸入值映射到0-1之間,可以解釋為概率或某種「激活程度」。
- 輸出值光滑,可導,這對於基於梯度的優化算法至關重要。
- 缺點:
- 梯度消失問題(Vanishing Gradient Problem): 當輸入值 x 很大或很小時,Sigmoid 函數的導數接近於0。這意味着在反向傳播過程中,傳遞給前一層的梯度會變得非常小,導致神經網絡的參數更新緩慢,尤其是在深層網絡中,訓練會變得非常困難。
- 輸出不以0為中心(Not Zero-Centered): Sigmoid 的輸出值恆為正數。這意味着下一層的輸入總是正數,可能導致梯度更新的「鋸齒」效應,從而減慢收斂速度。
- 計算開銷較大: 包含指數運算,計算相對耗時。
- 應用場景: 由於梯度消失和非零中心問題,Sigmoid 在隱藏層中已較少使用。它主要用於二分類問題的輸出層,將輸出轉化為0-1之間的概率值。
2. Tanh 函數 (Hyperbolic Tangent Function)
Tanh 函數是Sigmoid 函數的變體,其數學表達式為:
f(x) = (e^x - e^(-x)) / (e^x + e^(-x))
它的輸出值介於-1到1之間,形狀也類似「S」形曲線,但關於原點對稱。
- 優點:
- 輸出以0為中心: Tanh 的輸出值在-1到1之間,均值為0,這有助於解決Sigmoid的非零中心問題,使得梯度更新方向更穩定,加速收斂。
- 梯度消失問題比Sigmoid稍緩解,但本質上仍然存在。
- 光滑、可導。
- 缺點:
- 梯度消失問題: 與Sigmoid 類似,當輸入值 x 很大或很小時,Tanh 函數的導數仍然接近於0,深層網絡中梯度消失問題依然顯著。
- 計算開銷相對較大。
- 應用場景: 在早期深度學習中,Tanh 在隱藏層中的表現通常優於Sigmoid,因為它解決了輸出非零中心的問題。但隨着ReLU的出現,其使用頻率也大幅下降。
3. ReLU 函數 (Rectified Linear Unit)
ReLU 函數是目前最常用、最流行的激活函數之一,其數學表達式為:
f(x) = max(0, x)
當輸入 x 大於0時,輸出 x;當輸入 x 小於或等於0時,輸出0。
- 優點:
- 緩解梯度消失問題: 當 x > 0 時,導數恆為1,這使得梯度可以無衰減地傳播,有效緩解了Sigmoid和Tanh的梯度消失問題,從而加速了模型的收斂。
- 計算效率高: 只需要判斷正負,計算非常簡單,遠快於Sigmoid和Tanh。
- 引入稀疏性: 當 x <= 0 時,神經元輸出為0,這導致一部分神經元的激活值為0,從而在網絡中創建稀疏性。稀疏激活有助於減少參數之間的相互依賴,從而減少過擬合的風險。
- 缺點:
- 「死亡ReLU」問題(Dying ReLU Problem): 當輸入 x 永遠為負數時(例如,如果學習率設置過大,導致權重更新后神經元輸出始終為負),ReLU 的梯度在 x <= 0 時恆為0。這意味着該神經元將不再對任何輸入進行激活,權重也無法再更新,就好像「死掉」了一樣。一旦一個神經元「死亡」,它將永遠無法被激活。
- 輸出不以0為中心。
- 應用場景: 在絕大多數深度神經網絡的隱藏層中,ReLU 及其變體是首選的激活函數。它在圖像識別、自然語言處理等領域取得了巨大成功。
4. Leaky ReLU 函數 (Leaky Rectified Linear Unit)
Leaky ReLU 是為解決「死亡ReLU」問題而提出的一種變體,其數學表達式為:
f(x) = max(αx, x) 或 f(x) = x (if x > 0), αx (if x <= 0)
其中,α 是一個小的正數常數,通常取 0.01。當輸入 x 小於或等於0時,Leaky ReLU 不會像ReLU那樣直接輸出0,而是輸出一個很小的負值(αx)。
- 優點:
- 解決了「死亡ReLU」問題,因為在 x <= 0 時仍然有一個小的非零梯度,允許負輸入有一些信息流過,從而避免神經元完全「死亡」。
- 計算效率依然很高。
- 缺點:
- 儘管解決了死亡ReLU,但效果不總是比標準ReLU好很多,且 α 的選擇有時需要憑經驗。
- 應用場景: 當發現ReLU模型出現大量「死亡」神經元時,可以嘗試使用Leaky ReLU。
5. PReLU 函數 (Parametric Rectified Linear Unit)
PReLU 是 Leaky ReLU 的進一步泛化,將 α 設置為一個可學習的參數,而不是固定的常數。其數學表達式與Leaky ReLU 相同,但 α 是通過反向傳播學習得到的。
- 優點:
- PReLU 允許模型根據數據自適應地學習負半軸的斜率,從而可能獲得比固定 α 更好的性能。
- 解決了「死亡ReLU」問題。
- 缺點:
- 引入了一個額外的可學習參數,增加了模型的複雜性。
- 應用場景: 適用於需要模型更靈活地學習激活行為的場景,尤其是在深度網絡中。
6. ELU 函數 (Exponential Linear Unit)
ELU 函數旨在結合ReLU的優點並解決其缺點,其數學表達式為:
f(x) = x (if x > 0)
f(x) = α * (e^x - 1) (if x <= 0)
其中 α 是一個正數常數,通常設置為1.0。
- 優點:
- 解決了「死亡ReLU」問題: 在負輸入區域,ELU 具有一個負的輸出,避免了輸出為0導致神經元死亡。
- 輸出接近0均值: 使得ELU的輸出均值更接近0,有助於緩解非零中心問題,加速收斂。
- 在負區域具有飽和特性(趨近於-α),使得對噪聲更魯棒。
- 缺點:
- 包含指數運算,計算複雜度高於ReLU和Leaky ReLU。
- 應用場景: 在某些情況下,ELU 表現優於ReLU和Leaky ReLU,尤其是在訓練深層網絡時,因為它能夠更好地處理負輸入和零均值輸出。
7. GELU 函數 (Gaussian Error Linear Unit)
GELU 函數是近期在Transformer模型中非常流行的激活函數,它結合了ReLU的稀疏性和ELU的平滑性。其數學表達式為:
f(x) = x * P(X <= x)
其中 P(X <= x) 是標準正態分佈的累積分佈函數(CDF)。
- 優點:
- 平滑性: GELU 是一個平滑的非單調函數,在負值部分更加平滑,有助於梯度下降。
- 與Dropout兼容: GELU 的設計是基於輸入乘以一個「門控」值,這個門控值取決於輸入。它被認為是ReLU和Dropout的一個自然替代品,在某些隨機正則化方式下表現更好。
- 在Transformer模型中表現出色,尤其是在大規模預訓練模型(如BERT, GPT)中被廣泛採用。
- 缺點:
- 計算比ReLU更複雜,需要計算CDF。
- 應用場景: 主要用於Transformer和大型語言模型中,在自然語言處理領域取得了顯著成功。
8. Swish 函數
Swish 函數是由谷歌大腦團隊提出的一種激活函數,其數學表達式為:
f(x) = x * Sigmoid(βx)
其中 β 是一個可學習的參數或固定為1。
- 優點:
- 平滑性: Swish 是一個平滑的非單調函數,這意味着它在某些區域可以同時增加和減少,這使得它能夠更好地捕獲數據中的複雜模式。
- 無上限且有下限: 與ReLU不同,Swish 在正向無上限,在負向有下限,這有助於防止梯度爆炸並提供一定的稀疏性。
- 在大量實驗中,Swish 及其變體(如 h-Swish)在圖像分類等任務上表現優於ReLU。
- 缺點:
- 包含Sigmoid 函數,計算複雜度高於ReLU。
- 應用場景: 在圖像分類任務中取得了不錯的成果,尤其是在MobileNet V3等輕量級網絡中使用了其近似版本h-Swish。
9. Softmax 函數
Softmax 函數通常用於神經網絡的輸出層,特別是多分類問題。它將一個包含 K 個實數的向量歸一化為 K 個概率值,這些概率值的和為1。其數學表達式為:
S_i = e^(z_i) / Σ(e^(z_j)) (for j from 1 to K)
其中 z 是網絡的原始輸出向量(logits),S_i 是第 i 個類別的預測概率。
- 優點:
- 將任意實數向量轉換為概率分佈,使得所有輸出值的和為1。
- 「贏者通吃」特性:最大的輸入值會得到最高的概率,同時抑制其他較小的值,使得分類結果更清晰。
- 可導,方便梯度下降。
- 缺點:
- 主要用於輸出層,不適用於隱藏層。
- 包含指數運算,計算相對複雜。
- 應用場景: 多分類問題的輸出層。
如何選擇合適的激活函數?
選擇合適的激活函數沒有一勞永逸的規則,通常需要根據具體問題、網絡架構和經驗進行嘗試。以下是一些通用的指導原則:
- 隱藏層:
- ReLU 是首選: 在大多數情況下,ReLU 及其變體(Leaky ReLU、PReLU、ELU)是隱藏層的最佳選擇。它們計算效率高,且能有效緩解梯度消失問題。
- 處理「死亡ReLU」: 如果發現 ReLU 模型訓練不穩定或出現大量「死亡」神經元,可以嘗試使用 Leaky ReLU、PReLU 或 ELU 來解決。
- 嘗試較新的函數: 對於特定任務(如NLP中的Transformer),GELU 和 Swish 可能會帶來更好的性能,值得嘗試。
- 避免 Sigmoid 和 Tanh: 在深度網絡的隱藏層中,應盡量避免使用 Sigmoid 和 Tanh,因為它們容易導致梯度消失,使得網絡難以訓練。
- 輸出層:
- 二分類問題: 通常使用 Sigmoid 函數,將輸出映射到0-1的概率值。
- 多分類問題: 使用 Softmax 函數,將輸出映射為各類別的概率分佈。
- 回歸問題: 通常不使用激活函數(即使用恆等函數或線性激活),因為輸出可以是任意實數值。
- 實驗與調優: 最佳的激活函數選擇往往需要通過實驗來確定。在實際項目中,可以嘗試不同的激活函數組合,並通過交叉驗證來評估其性能。
- 考慮計算資源: 雖然某些複雜的激活函數可能提供更好的性能,但其計算開銷也可能更大,需要權衡模型的性能和計算效率。
常見問題 (FAQ)
「為何激活函數是非線性的?」
如果激活函數是線性的,那麼無論神經網絡有多少層,它都只能表示一個線性的變換。多層線性變換的組合仍然是線性的,這將導致深層網絡退化為單層網絡,無法學習和逼近現實世界中複雜的非線性關係。非線性激活函數賦予了神經網絡學習複雜模式的能力。
「如何避免ReLU的「死亡」問題?」
避免ReLU「死亡」問題的方法包括:使用較小的學習率;初始化權重時避免過大的負值;或者採用ReLU的變體,如Leaky ReLU(在負半軸有一個小的斜率,使負輸入也能有非零梯度)、PReLU(負半軸斜率可學習)或ELU(在負半軸趨於飽和,但有非零值)。
「為何不同的網絡層可能需要不同的激活函數?」
通常情況下,隱藏層和輸出層對激活函數的需求不同。隱藏層主要用於引入非線性、提取特徵,因此需要像ReLU及其變體這樣能有效傳播梯度、計算高效的函數。而輸出層則需要根據任務類型(如二分類、多分類或回歸)將網絡輸出轉換為有意義的形式,例如概率值(Sigmoid/Softmax)或連續值(線性函數)。
「如何選擇適合自己模型的激活函數?」
選擇激活函數沒有絕對的「最佳」答案。通常的策略是:首先嘗試ReLU,因為它在大多數情況下表現良好且計算高效。如果遇到梯度消失或「死亡ReLU」問題,可以考慮Leaky ReLU、PReLU或ELU。對於特定任務(如NLP中的Transformer模型),可以嘗試GELU或Swish。最終的選擇往往需要通過實際的模型訓練和性能評估來確定。
「為何Sigmoid和Tanh在深層網絡中表現不佳?」
Sigmoid和Tanh函數在輸入值過大或過小時,其導數會趨近於0,這導致在反向傳播時,梯度會變得非常小,難以傳遞到網絡的深層,從而出現梯度消失問題。這使得深層網絡的權重更新非常緩慢,甚至停滯,導致模型難以收斂和學習。

