在神經網絡中使用?ReLU(Rectified Linear Unit)?作為激活函數的主要目的是引入非線性,這是神經網絡能夠學習復雜模式和解決非線性問題的關鍵。
1. 為什么需要非線性?
1.1 線性模型的局限性
如果神經網絡只使用線性激活函數(如?),那么無論網絡有多少層,整個模型仍然是一個線性模型。這是因為多個線性變換的組合仍然是線性變換:
這樣的模型無法學習復雜的非線性關系,表達能力非常有限。
1.2 非線性激活函數的作用
非線性激活函數(如 ReLU、Sigmoid、Tanh)能夠打破線性關系,使神經網絡能夠學習復雜的非線性模式。通過堆疊多個非線性層,神經網絡可以逼近任意復雜的函數。
2. ReLU 的定義
ReLU 的定義非常簡單:
-
當輸入?x>0?時,輸出?x。
-
當輸入?x≤0?時,輸出?0。
3. ReLU 的優勢
3.1 緩解梯度消失問題
-
在 Sigmoid 或 Tanh 激活函數中,當輸入值較大或較小時,梯度會趨近于零,導致梯度消失問題。
-
ReLU 的梯度在正區間恒為 1,避免了梯度消失問題,使得深層網絡的訓練更加穩定。
3.2 計算高效
-
ReLU 的計算非常簡單,只需要比較和取最大值操作,計算速度遠快于 Sigmoid 和 Tanh。
-
在訓練大規模神經網絡時,ReLU 的高效計算能夠顯著加快訓練速度。
3.3 稀疏激活
-
ReLU 會將負值輸出為零,這使得神經網絡的激活變得稀疏。
-
稀疏激活可以減少參數之間的依賴性,提高模型的泛化能力。
4. ReLU 的變體
盡管 ReLU 有很多優點,但它也存在一些問題(如神經元“死亡”問題)。因此,研究者提出了多種 ReLU 的變體:
4.1 Leaky ReLU
在負區間引入一個小的斜率,避免神經元“死亡”:
其中?α?是一個小的正數(如 0.01)。
4.2 Parametric ReLU (PReLU)
將 Leaky ReLU 的斜率?α?作為可學習參數,動態調整負區間的輸出。
4.3 Exponential Linear Unit (ELU)
在負區間引入指數函數,平滑過渡:
5. ReLU 的代碼實現
以下是 ReLU 及其變體的 PyTorch 展示:
import torch
import torch.nn as nn# 標準 ReLU
relu = nn.ReLU()
x = torch.tensor([-1.0, 2.0, -3.0, 4.0])
print(relu(x)) # 輸出: tensor([0., 2., 0., 4.])# Leaky ReLU
leaky_relu = nn.LeakyReLU(negative_slope=0.01)
print(leaky_relu(x)) # 輸出: tensor([-0.0100, 2.0000, -0.0300, 4.0000])# ELU
elu = nn.ELU(alpha=1.0)
print(elu(x)) # 輸出: tensor([-0.6321, 2.0000, -0.9502, 4.0000])