1、Sigmoid 和 Tanh 激活函數的局限性
2、ReLU(Rectified Linear Activation Function)
3、如何實現ReLU
4、ReLU的優點
5、使用ReLU的技巧
1. Sigmoid 和 Tanh 激活函數的局限性一個神經網絡由層節點組成,並學習將輸入的樣本映射到輸出。對於給定的節點,將輸入乘以節點中的權重,並將其相加。此值稱為節點的summed activation。然後,經過求和的激活通過一個激活函數轉換並定義特定的輸出或節點的「activation」。
最簡單的激活函數被稱為線性激活,其中根本沒有應用任何轉換。 一個僅由線性激活函數組成的網絡很容易訓練,但不能學習複雜的映射函數。線性激活函數仍然用於預測一個數量的網絡的輸出層(例如回歸問題)。
非線性激活函數是更好的,因為它們允許節點在數據中學習更複雜的結構 。兩個廣泛使用的非線性激活函數是sigmoid 函數和雙曲正切 激活函數。
Sigmoid 激活函數 ,也被稱為 Logistic函數神經網絡,傳統上是一個非常受歡迎的神經網絡激活函數。函數的輸入被轉換成介於0.0和1.0之間的值。大於1.0的輸入被轉換為值1.0,同樣,小於0.0的值被折斷為0.0。所有可能的輸入函數的形狀都是從0到0.5到1.0的 s 形。在很長一段時間裡,直到20世紀90年代早期,這是神經網絡的默認激活方式。
雙曲正切函數 ,簡稱 tanh,是一個形狀類似的非線性激活函數,輸出值介於-1.0和1.0之間。在20世紀90年代後期和21世紀初期,由於使用 tanh 函數的模型更容易訓練,而且往往具有更好的預測性能,因此 tanh 函數比 Sigmoid激活函數更受青睞。
Sigmoid和 tanh 函數的一個普遍問題是它們值域飽和了 。這意味著,大值突然變為1.0,小值突然變為 -1或0。此外,函數隻對其輸入中間點周圍的變化非常敏感。
無論作為輸入的節點所提供的求和激活是否包含有用信息,函數的靈敏度和飽和度都是有限的。一旦達到飽和狀態,學習算法就需要不斷調整權值以提高模型的性能。
最後,隨著硬體能力的提高,通過 gpu 的非常深的神經網絡使用Sigmoid 和 tanh 激活函數不容易訓練。在大型網絡深層使用這些非線性激活函數不能接收有用的梯度信息。錯誤通過網絡傳播回來,並用於更新權重。每增加一層,錯誤數量就會大大減少。這就是所謂的消失梯度 問題,它能有效地阻止深層(多層)網絡的學習。
雖然非線性激活函數的使用允許神經網絡學習複雜的映射函數,但它們有效地阻止了學習算法與深度網絡的工作。在2000年代後期和2010年代初期,通過使用諸如波爾茲曼機器和分層訓練或無監督的預訓練等替代網絡類型,這才找到了解決辦法。
2. ReLU(Rectified Linear Activation Function)為了訓練深層神經網絡,需要一個激活函數神經網絡,它看起來和行為都像一個線性函數,但實際上是一個非線性函數,允許學習數據中的複雜關係 。該函數還必須提供更靈敏的激活和輸入,避免飽和。
因此,ReLU出現了,採用 ReLU 可以是深度學習革命中為數不多的裡程碑之一 。ReLU激活函數是一個簡單的計算,如果輸入大於0,直接返回作為輸入提供的值;如果輸入是0或更小,返回值0。
我們可以用一個簡單的 if-statement 來描述這個問題,如下所示:
if input > 0:
return input
else:
return 0對於大於零的值,這個函數是線性的,這意味著當使用反向傳播訓練神經網絡時,它具有很多線性激活函數的理想特性。然而,它是一個非線性函數,因為負值總是作為零輸出。由於矯正函數在輸入域的一半是線性的,另一半是非線性的,所以它被稱為分段線性函數(piecewise linear function ) 。
3. 如何實現ReLU我們可以很容易地在 Python 中實現ReLU激活函數。
# rectified linear function
def rectified(x):
return max(0.0, x)我們希望任何正值都能不變地返回,而0.0或負值的輸入值將作為0.0返回。
下面是一些修正的線性激活函數的輸入和輸出的例子:
# demonstrate the rectified linear function
# rectified linear function
def rectified(x):
return max(0.0, x)
# demonstrate with a positive input
x = 1.0
print('rectified(%.1f) is %.1f' % (x, rectified(x)))
x = 1000.0
print('rectified(%.1f) is %.1f' % (x, rectified(x)))
# demonstrate with a zero input
x = 0.0
print('rectified(%.1f) is %.1f' % (x, rectified(x)))
# demonstrate with a negative input
x = -1.0
print('rectified(%.1f) is %.1f' % (x, rectified(x)))
x = -1000.0
print('rectified(%.1f) is %.1f' % (x, rectified(x)))輸出如下:
rectified(1.0) is 1.0
rectified(1000.0) is 1000.0
rectified(0.0) is 0.0
rectified(-1.0) is 0.0
rectified(-1000.0) is 0.0我們可以通過繪製一系列的輸入和計算出的輸出,得到函數的輸入和輸出之間的關係。下面的示例生成一系列從 -10到10的整數,並計算每個輸入的校正線性激活,然後繪製結果。
# plot inputs and outputs
from matplotlib import pyplot
# rectified linear function
def rectified(x):
return max(0.0, x)
# define a series of inputs
series_in = [x for x in range(-10, 11)]
# calculate outputs for our inputs
series_out = [rectified(x) for x in series_in]
# line plot of raw inputs to rectified outputs
pyplot.plot(series_in, series_out)
pyplot.show()運行這個例子會創建一個圖,顯示所有負值和零輸入都突變為0.0,而正輸出則返回原樣:
ReLU函數的導數是斜率。負值的斜率為0.0,正值的斜率為1.0。
傳統上,神經網絡領域已經不能是任何不完全可微的激活函數,而ReLU是一個分段函數。從技術上講,當輸入為0.0時,我們不能計算ReLU的導數,但是,我們可以假設它為0。
4. ReLU的優點4.1. 計算簡單性tanh 和 sigmoid 激活函數需要使用指數計算, 而ReLU只需要max(),因此他計算上更簡單,計算成本也更低 。
4.2. 代表性稀疏ReLU的一個重要好處是,它能夠輸出一個真正的零值 。這與 tanh 和 sigmoid 激活函數不同,後者學習近似於零輸出,例如一個非常接近於零的值,但不是真正的零值。這意味著負輸入可以輸出真零值,允許神經網絡中的隱層激活包含一個或多個真零值。這就是所謂的稀疏表示,是一個理想的性質,在表示學習,因為它可以加速學習和簡化模型。
4.3. 線性行為ReLU看起來更像一個線性函數,一般來說,當神經網絡的行為是線性或接近線性時,它更容易優化 。
這個特性的關鍵在於,使用這個激活函數進行訓練的網絡幾乎完全避免了梯度消失的問題,因為梯度仍然與節點激活成正比。
4.4. 訓練深度網絡ReLU的出現使得利用硬體的提升和使用反向傳播成功訓練具有非線性激活函數的深層多層網絡成為可能 。
5. 使用ReLU的技巧5.1. 使用 ReLU 作為默認激活函數很長一段時間,默認的激活方式是Sigmoid激活函數。後來,Tanh成了激活函數。對於現代的深度學習神經網絡,默認的激活函數是ReLU激活函數 。
5.2. 對 MLPs,CNNs 使用 ReLU,但不是 RNNsReLU 可以用於大多數類型的神經網絡,它通常作為多層感知機神經網絡和卷積神經網絡的激活函數 ,並且也得到了許多論文的證實。傳統上,LSTMs 使用 tanh 激活函數來激活cell狀態,使用 Sigmoid激活函數作為node輸出。而ReLU通常不適合RNN類型網絡的使用。
5.3. 嘗試更小的bias輸入值偏置是節點上具有固定值的輸入,這種偏置會影響激活函數的偏移,傳統的做法是將偏置輸入值設置為1.0。當在網絡中使用 ReLU 時,可以將偏差設置為一個小值,例如0.1 。
5.4. 使用「He Weight Initialization」在訓練神經網絡之前,網絡的權值必須初始化為小的隨機值。當在網絡中使用 ReLU 並將權重初始化為以零為中心的小型隨機值時,默認情況下,網絡中一半的單元將輸出零值。有許多啟發式方法來初始化神經網絡的權值,但是沒有最佳權值初始化方案。何愷明的文章指出Xavier 初始化和其他方案不適合於 ReLU ,對 Xavier 初始化進行一個小的修改,使其適合於 ReLU,提出He Weight Initialization,這個方法更適用於ReLU 。
5.5. 縮放輸入數據在使用神經網絡之前對輸入數據進行縮放是一個很好的做法。這可能涉及標準化變量,使其具有零均值和單位方差,或者將每個值歸一化為0到1。如果不對許多問題進行數據縮放,神經網絡的權重可能會增大,從而使網絡不穩定並增加泛化誤差。無論是否在網絡中使用 ReLU,這種縮放輸入的良好實踐都適用。
5.6. 使用懲罰權重ReLU 的輸出在正域上是無界的。這意味著在某些情況下,輸出可以繼續增長。因此,使用某種形式的權重正則化可能是一個比較好的方法,比如 l1或 l2向量範數。這對於提高模型的稀疏表示(例如使用 l 1正則化)和降低泛化誤差都是一個很好的方法 。
推薦閱讀
1. pandas100個騷操作
2. 機器學習原創系列
3. 數據科學乾貨下載
最後給大家分享《10本數據挖掘電子書》,包括數據分析、統計學、數據挖掘、機器學習。
現在免費分享出來,有需要的讀者可以下載學習,在下面的公眾號「數據挖掘工程師」裡回復關鍵字:數據挖掘,就行。