一文深度了解 ReLU 激活函數!

2022-01-06 Python數據科學

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,但不是 RNNs

ReLU 可以用於大多數類型的神經網絡,它通常作為多層感知機神經網絡和卷積神經網絡的激活函數 ,並且也得到了許多論文的證實。傳統上,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本數據挖掘電子書》,包括數據分析、統計學、數據挖掘、機器學習。

現在免費分享出來,有需要的讀者可以下載學習,在下面的公眾號「數據挖掘工程師」裡回復關鍵字:數據挖掘,就行。

相關焦點

  • 原來ReLU這麼好用!一文帶你深度了解ReLU激活函數!
    最後,隨著硬體能力的提高,通過 gpu 的非常深的神經網絡使用Sigmoid 和 tanh 激活函數不容易訓練。在大型網絡深層使用這些非線性激活函數不能接收有用的梯度信息。錯誤通過網絡傳播回來,並用於更新權重。每增加一層,錯誤數量就會大大減少。
  • TF2.0-五種優化器,激活函數(sigmoid,tanh,relu,leaky relu的優缺點),損失函數,正則化等
    ,採用的激活函數relu第7行:最後的輸出層,採用的激活函數sigmoid第9~11行:compile彙編器中,optimizer優化器用的:Adam,損失函數用的二分類的交叉熵binary_crossentropy。
  • 從ReLU到GELU,一文概覽神經網絡的激活函數
    選自mlfromscratch作者:Casper Hansen機器之心編譯參與:熊貓、杜偉激活函數對神經網絡的重要性自不必多言,機器之心也曾發布過一些相關的介紹文章,比如《一文概覽深度學習中的激活函數本文同樣關注的是激活函數。來自丹麥技術大學的 Casper Hansen 通過公式、圖表和代碼實驗介紹了 sigmoid、ReLU、ELU 以及更新的 Leaky ReLU、SELU、GELU 這些激活函數,並比較了它們的優勢和短板。在計算每一層的激活值時,我們要用到激活函數,之後才能確定這些激活值究竟是多少。
  • 大貝貝,激活函數 sigmoid、tanh、relu
    激活函數是連續的(continuous),且可導的(differential)。激活函數常見的激活函數:sigmoid,tanh,relu。sigmoidsigmoid是平滑(smoothened)的階梯函數(step function),可導(differentiable)。sigmoid可以將任何值轉換為0~1概率,用於二分類。
  • 從Sigmoid到GELU,一文概覽神經網絡激活函數
    這裡的擬合能力,主要來自於非線性激活函數。最近我總結了7個深度學習訓練中常用的激活函數,並對它們的特點和優劣做了整理。激活函數也是算法面試中常考主題,建議同學們提前收藏備需!sigmoid 是最基礎的激活函數,可以將任意數值轉換為概率(縮放到0~1之間),在分類等場景中有廣泛的應用。
  • 為什麼ReLu激活函數要好於tanh和sigmoid?
    當然現在也有一些對relu的改進,比如prelu,random relu等,在不同的數據集上會有一些訓練速度上或者準確率上的改進,具體的大家可以找相關的paper看。多加一句,現在主流的做法,會多做一步batch normalization,儘可能保證每一層網絡的輸入具有相同的分布[1]。
  • 異軍突起的激活函數:ReLU | 小白深度學習入門
    ReLu是激活函數的一種,其實在前面章節裡面我們就已經見過它了:就是這麼簡單的一個函數,在DNN時代代替了NN時代的激活函數王者:Sigmod,成了「調參俠」的最愛。為什麼要用ReLU呢?這個問題有點像問,吃涮羊肉為什麼蘸芝麻醬?
  • 總結|激活函數之sigmoid、ReLU、ELU 以及更新的 Leaky ReLU、SELU、GELU
    ,本文關注的是激活函數。來自丹麥技術大學的 Casper Hansen 通過公式、圖表和代碼實驗介紹了 sigmoid、ReLU、ELU 以及更新的 Leaky ReLU、SELU、GELU 這些激活函數,並比較了它們的優勢和短板。在計算每一層的激活值時,我們要用到激活函數,之後才能確定這些激活值究竟是多少。根據每一層前面的激活、權重和偏置,我們要為下一層的每個激活計算一個值。
  • Relu函數的優點是啥
    問題引入常見的激活函數有sigmoid, relu,Leaky ReLU等,上次我們介紹了sigmoid
  • 人工智慧-深度學習-激活函數ReLU,Sigmoid,TanH,ELU,MaxOut
    在每一層疊加完後,我們為輸出與輸入之間加上一個激活函數,此時的方程就變成了這樣:這樣也許就能將這個線性不可分的問題解決了。最後也許就是這個樣子:常見的激活函數:1. ReLU是目前使用最頻繁的一個函數(Rectified Linear Unit),如果你不知道你的激活函數應該選擇哪個,那麼建議你選擇ReLU試試。
  • 一文概覽深度學習中的激活函數
    本文介紹了多種激活函數,並且對比了激活函數的優劣。1. 什麼是激活函數?生物神經網絡啟發了人工神經網絡的發展。但是,ANN 並非大腦運作的近似表示。不過在我們了解為什麼在人工神經網絡中使用激活函數之前,先了解生物神經網絡與激活函數的相關性是很有用處的。
  • 一文看盡26種神經網絡激活函數(從ReLU到Sinc)
    本文轉載自:機器之心  作者:David Sheehan在本文中,作者對包括 Relu、Sigmoid 在內的 26 種激活函數做了可視化,並附上了神經網絡的相關屬性,為大家了解激活函數提供了很好的資源。
  • 深度學習中的四種激活函數
    這篇文章用來整理一下入門深度學習過程中接觸到的四種激活函數
  • Python深度學習之卷積函數CNN
    激活函數的選擇上一節中,我們介紹了激活函數的相關知識,了解了常見的激活函數有哪些。那麼當我們進行神經網絡訓練的時候應該如何選擇激活函數呢?當輸入數據特徵相差比較明顯時,用tanh的效果會很好,且在循環過程中會不斷擴大特徵效果並顯示出來。當特徵相差不明顯時,sigmoid的效果比較好。
  • 深度學習理論分享之——激活函數與Dropout機制
    因此,不論是在機器學習領域還是更為細分的深度學習領域,其實都是有概率的市場存在。而Sigmoid函數,在分類問題中,剛好可以用作激活函數來表示某個類別被判定的概率。而從圖2來看,則很容易看出,絕大多數有意義的導數值似乎都聚集在以x軸坐標上的原點為中心的一定區域內。這就有比較像我們在概率論中所學習到的某些概率分布。
  • 一文總結深度學習中的激活函數
    本文介紹了多種激活函數,並且對比了激活函數的優劣。1. 什麼是激活函數?生物神經網絡啟發了人工神經網絡的發展。但是,ANN 並非大腦運作的近似表示。不過在我們了解為什麼在人工神經網絡中使用激活函數之前,先了解生物神經網絡與激活函數的相關性是很有用處的。
  • Mish:一個新的SOTA激活函數,ReLU的繼任者
    >對激活函數的研究一直沒有停止過,ReLU還是統治著深度學習的激活函數,不過,這種情況有可能會被Mish改變。Diganta Misra的一篇題為「Mish: A Self Regularized Non-Monotonic Neural Activation Function」的新論文介紹了一個新的深度學習激活函數,該函數在最終準確度上比Swish(+.494%)和ReLU
  • 神經網絡中的激活函數解析:Sigmoid, tanh, Softmax, ReLU, Leaky ReLU
    激活函數基本上分為兩種類型:線性激活函數非線性激活函數供參考: 下面有速查表>線性或者說恆等激活函數你可以看到函數是一條直線,或者說線性的。非線性激活函數非線性激活函數是最常用的激活函數,非線性的圖看起來像下面這樣:非線性激活函數
  • Pytorch_第九篇_神經網絡中常用的激活函數
    神經網絡中常用的激活函數Introduce理論上神經網絡能夠擬合任意線性函數,其中主要的一個因素是使用了非線性激活函數(因為如果每一層都是線性變換,那有啥用啊,始終能夠擬合的都是線性函數啊)。本文主要介紹神經網絡中各種常用的激活函數。以下均為個人學習筆記,若有錯誤望指出。
  • 如何選擇神經網絡激活函數:有效的改善模型學習模式的能力
    應用AF後的非線性輸出如下:那麼激活函數有什麼需求?對這些激活函數的需求包括將線性輸入轉換為非線性輸出,這有助於更深層網絡學習高階多項式。 非線性激活函數的一個特殊屬性是它們是可微的,否則它們在深度神經網絡的反向傳播期間將無法工作。 深度神經網絡是具有多個隱藏層和一個輸出層的神經網絡。 了解多個隱藏層和輸出層的構成是我們的目標。