文章目錄
- 1、ReLU 函數(隱藏層中是一個常用的默認選擇)
- 1.1 優點
- 1.2 缺點
- 2、sigmoid 函數
- 2.1 優點
- 2.2 缺點
- 3、Tanh 函數
- 3.1 優點
- 3.2 缺點
- 4、softmax 函數(多分類任務最后一層都會使用)
- 5、Leaky ReLU 函數
- 5.1 優點
- 5.2 缺點
- 6、PReLU 函數
- 7、ELU 函數
- 搭建神經網絡,應該如何選擇激活函數?
- 總結
1、ReLU 函數(隱藏層中是一個常用的默認選擇)
整流線性單元(Rectified linear unit,ReLU) 是現代神經網絡中最常用的激活函數,大多數前饋神經網絡默認使用的激活函數,它提供了一種非常簡單的非線性變換。給定元素 x
,ReLU 函數被定義為該元素與 0 的最大值。ReLU函數定義如下:
代碼:
import numpy as np
import matplotlib.pyplot as plt# 定義ReLU函數
def relu(x):return np.maximum(0, x)# 生成一些輸入值,這里可以設置成其他的數值
x_values = np.linspace(-5, 5, 100)# 計算對應的ReLU輸出值
y_values = relu(x_values)# 繪制ReLU函數的圖像
plt.plot(x_values, y_values, label='ReLU Function')
plt.title('ReLU Activation Function')
plt.xlabel('Input')
plt.ylabel('Output')
plt.axhline(0, color='black',linewidth=0.5)
plt.axvline(0, color='black',linewidth=0.5)
plt.grid(color = 'gray', linestyle = '--', linewidth = 0.5)
plt.legend()
plt.show()
生成圖像如下:
1.1 優點
- 在
x > 0
區域上,不會出現梯度飽和、梯度消失的問題,梯度永遠是常量; - 它在訓練神經網絡時能夠加速收斂,并且計算相對簡單;
- 計算復雜度低,不需要進行指數運算,只要一個閾值就可以得到激活值。
1.2 缺點
- 容易出現 神經元壞死現象(dead relu problem),最直觀的結果就是,輸入到 relu 函數中的值如果存在負數,則最終經過 relu 之后變成 0,極端情況下是輸入relu的所有值全都是負數,則relu activated之后的結果均為0。
產生這種現象的兩個原因:參數初始化不合理;learning rate 太高導致在訓練過程中參數更新太大。
2、sigmoid 函數
sigmoid 函數又稱 Logistic 函數,用于隱層神經元輸出,它將范圍 (-inf,inf) 中的任意輸入壓縮到區間 (0,1) 中的某個值,可以用來做二分類。sigmoid 函數定義如下:
代碼:
# -*-coding:utf-8-*-
import numpy as np
import matplotlib.pyplot as plt# 定義Sigmoid函數
def sigmoid(x):return 1 / (1 + np.exp(-x))# 生成一些輸入值
x_values = np.linspace(-7, 7, 200)# 計算對應的Sigmoid輸出值
y_values = sigmoid(x_values)# 繪制Sigmoid函數的圖像
plt.plot(x_values, y_values, label='Sigmoid Function')
plt.title('Sigmoid Activation Function')
plt.xlabel('Input')
plt.ylabel('Output')
plt.axhline(0, color='black',linewidth=0.5)
plt.axvline(0, color='black',linewidth=0.5)
plt.grid(color = 'gray', linestyle = '--', linewidth = 0.5)
plt.legend()
plt.show()
生成圖像如下:
2.1 優點
- sigmoid 函數的輸出在 (0,1) 之間,輸出范圍有限,優化穩定,可以用作輸出層;
- 它是個連續函數,便于求導。
2.2 缺點
- sigmoid 函數在變量取絕對值非常大的正值或負值時會出現飽和現象,意味著函數會變得很平,并且對輸入的微小改變會變得不敏感。在反向傳播時,當梯度接近于0,權重基本不會更新,很容易就會出現梯度消失的情況,從而無法完成深層網絡的訓練。
- 計算復雜度高,因為 sigmoid 函數是指數形式。
3、Tanh 函數
Tanh 函數也稱為雙曲正切函數,取值范圍為 (-1,1)。Tanh函數定義如下:
它的導數是:
代碼:
import numpy as np
import matplotlib.pyplot as plt# 定義 tanh 函數
def tanh(x):return np.tanh(x)# 定義 tanh 函數的導數
def tanh_derivative(x):return 1 - np.tanh(x)**2# 生成一些輸入值
x_values = np.linspace(-5, 5, 200)# 計算 tanh 函數的輸出值和導數值
y_tanh = tanh(x_values)
y_derivative = tanh_derivative(x_values)# 繪制 tanh 函數及其導數在同一坐標軸中的圖像
plt.plot(x_values, y_tanh, label='tanh Function')
plt.plot(x_values, y_derivative, label='tanh Derivative')
plt.title('tanh Function and its Derivative')
plt.xlabel('Input')
plt.ylabel('Output / Derivative')
plt.axhline(0, color='black', linewidth=0.5)
plt.axvline(0, color='black', linewidth=0.5)
plt.grid(color='gray', linestyle='--', linewidth=0.5)
plt.legend()
plt.show()
生成圖像如下:
Tanh 函數圖像及導數圖像如上,當輸入接近 0 時,Tanh 函數的導數接近最大值 1。可理解為 sigmoid 函數的變形,輸入在任一方向上遠離 0 點,導數越接近 0。
3.1 優點
- 與 sigmoid 函數相同;
3.2 缺點
- Tanh 仍然存在梯度飽和與 exp 計算復雜的問題。
4、softmax 函數(多分類任務最后一層都會使用)
使用 sigmoid 激活函數可以處理二分類任務,而在處理多分類問題的時,就需要使用 softmax 函數。它將一個實數向量(通常稱為 logits)轉換為概率分布。
輸出規則: 將輸入向量中的每個元素轉換為一個位于 (0, 1) 之間的值,使得所有元素的和等于 1。這種轉換后的好處是向量可以解釋為一個概率分布,其中每個元素表示對應類別的概率。softmax 函數公式如下:
代碼:
import numpy as np
import matplotlib.pyplot as plt# 定義 Softmax 函數
def softmax(x):exp_x = np.exp(x)return exp_x / np.sum(exp_x, axis=-1, keepdims=True)# 生成一些輸入值
x_values = np.linspace(-5, 5, 200)# 計算對應的 Softmax 輸出值
y_values = softmax(x_values)# 繪制 Softmax 函數的圖像
plt.plot(x_values, y_values)
plt.title('Softmax Function')
plt.xlabel('Input')
plt.ylabel('Output Probability')
plt.axhline(0, color='black', linewidth=0.5)
plt.axvline(0, color='black', linewidth=0.5)
plt.grid(color='gray', linestyle='--', linewidth=0.5)
plt.show()
生成圖像如下:
5、Leaky ReLU 函數
滲漏整流線性單元(Leaky ReLU),為了徹底避免 dead ReLU 現象。用一個類似 0.01 的小值來初始化神經元,從而使得 ReLU 在負數區域更偏向于激活而不是死掉。這里的斜率都是確定的,當然,這里的參數是可以調整的。
代碼:
import numpy as np
import matplotlib.pyplot as plt# 定義 Leaky ReLU 函數
def leaky_relu(x, alpha=0.01):return np.maximum(alpha * x, x)# 生成一些輸入值
x_values = np.linspace(-5, 5, 200)# 計算對應的 Leaky ReLU 輸出值
y_values = leaky_relu(x_values)# 繪制 Leaky ReLU 函數的圖像
plt.plot(x_values, y_values, label='Leaky ReLU Function')
plt.title('Leaky ReLU Activation Function')
plt.xlabel('Input')
plt.ylabel('Output')
plt.axhline(0, color='black', linewidth=0.5)
plt.axvline(0, color='black', linewidth=0.5)
plt.grid(color='gray', linestyle='--', linewidth=0.5)
plt.legend()
plt.show()
生成圖像如下:
5.1 優點
- Leaky ReLU 在負數輸入上有一個小的斜率,可以避免神經元“死亡”問題。
5.2 缺點
- 盡管 Leaky ReLU 解決了某些問題,但并非總是最佳選擇。在某些情況下,其他激活函數,如 Parametric ReLU 或者 Exponential Linear Unit (ELU),可能表現更好。
6、PReLU 函數
參數整流線性單元(Parametric Rectified linear unit,PReLU),用來解決 ReLU 帶來的神經元壞死的問題。公式如下:
或者
其中,α 不是固定的超參數,通常初始化為一個小的正數,通過反向傳播學習。它在輸入小于零時允許一個小的斜率,而不是將其置零。
代碼:
import numpy as np
import matplotlib.pyplot as plt# 定義 PReLU 函數
def prelu(x, alpha=0.01):return np.where(x > 0, x, alpha * x)# 生成一些輸入值
x_values = np.linspace(-5, 5, 200)# 計算 PReLU 函數的輸出值
y_values = prelu(x_values)# 繪制 PReLU 函數的圖像
plt.plot(x_values, y_values, label='PReLU Function')
plt.title('PReLU Activation Function')
plt.xlabel('Input')
plt.ylabel('Output')
plt.axhline(0, color='black',linewidth=0.5)
plt.axvline(0, color='black',linewidth=0.5)
plt.grid(color='gray', linestyle='--', linewidth=0.5)
plt.legend()
plt.show()
生成圖像如下:
區別:Leaky ReLU 和 PReLU 在解決激活函數中的問題(如死亡神經元)上有一些相似之處,但 PReLU 提供了更多的靈活性。
7、ELU 函數
指數線性單元(ELU):具有 ReLU 的優勢,沒有 Dead ReLU 問題,輸出均值接近0,實際上 PReLU 和 Leaky ReLU 都有這一優點。有負數飽和區域,從而對噪聲有一些魯棒性。可以看做是介于 ReLU 和 Leaky ReLU 之間的一個函數。當然,這個函數也需要計算 exp,從而計算量上更大一些。公式如下:
代碼:
import numpy as np
import matplotlib.pyplot as plt# 定義 ELU 函數
def elu(x, alpha=1.0):return np.where(x > 0, x, alpha * (np.exp(x) - 1))# 生成一些輸入值
x_values = np.linspace(-5, 5, 200)# 計算 ELU 函數的輸出值
y_values = elu(x_values)# 繪制 ELU 函數的圖像
plt.plot(x_values, y_values, label='ELU Function')
plt.title('ELU Activation Function')
plt.xlabel('Input')
plt.ylabel('Output')
plt.axhline(0, color='black', linewidth=0.5)
plt.axvline(0, color='black', linewidth=0.5)
plt.grid(color='gray', linestyle='--', linewidth=0.5)
plt.legend()
plt.show()
生成圖像如下:
搭建神經網絡,應該如何選擇激活函數?
- 如果搭建的神經網絡的層數不多,優先考慮 sigmoid、tanh、relu 函數,這些都是可以的,如果搭建的網絡層數較多,選擇不當會造成梯度消失的問題,此時一般不宜選擇sigmoid、tanh激活函數,最好選擇 relu 激活函數。
- 在二分類問題中,網絡的最后一層適合使用sigmoid激活函數;而多分類任務中,網絡的最后一層使用softmax激活函數。
總結
ReLU(Rectified Linear Unit):
優勢: 計算簡單,且在許多情況下表現良好。它將負數部分置為零,有助于網絡稀疏性,有利于反向傳播。
注意事項: 對于一些極端情況,可能存在“死神經元”問題,即某些神經元在訓練過程中永遠不會被激活,導致無法更新權重。
Sigmoid 函數:
優勢: 將輸出限制在 (0, 1) 范圍內,適用于二元分類問題。
注意事項: 容易發生梯度消失的問題,尤其是在深層網絡中,導致梯度較小的權重無法有效地更新。
Tanh 函數:
優勢: 類似于 Sigmoid,但輸出范圍在 (-1, 1)。對于中心化的數據,Tanh 可能更適合。
注意事項: 仍然存在梯度消失的問題。
Softmax 函數:
優勢: 用于多類別分類問題,將輸出轉化為概率分布。
注意事項: 對于二元分類問題,通常使用 Sigmoid 而不是 Softmax。
Leaky ReLU:
優勢: 在 ReLU 的基礎上解決了死神經元問題,允許小于零的斜率。
注意事項: 仍然可能存在一些負數輸出。
Parametric ReLU (PReLU):
優勢: 允許負數部分有可學習的參數。
注意事項: 需要更多的計算資源。