原來ReLU這麼好用!一文帶你深度了解ReLU激活函數!

2022-02-06 Python數據科學
在神經網絡中,激活函數負責將來自節點的加權輸入轉換為該輸入的節點或輸出的激活。ReLU 是一個分段線性函數,如果輸入為正,它將直接輸出,否則,它將輸出為零。它已經成為許多類型神經網絡的默認激活函數,因為使用它的模型更容易訓練,並且通常能夠獲得更好的性能。在本文中,我們來詳細介紹一下ReLU,主要分成以下幾個部分:

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本數據挖掘電子書》,包括數據分析、統計學、數據挖掘、機器學習。

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

相關焦點

  • TF2.0-五種優化器,激活函數(sigmoid,tanh,relu,leaky relu的優缺點),損失函數,正則化等
    ,採用的激活函數relu第7行:最後的輸出層,採用的激活函數sigmoid第9~11行:compile彙編器中,optimizer優化器用的:Adam,損失函數用的二分類的交叉熵binary_crossentropy。
  • 大貝貝,激活函數 sigmoid、tanh、relu
    激活函數是連續的(continuous),且可導的(differential)。激活函數常見的激活函數:sigmoid,tanh,relu。sigmoidsigmoid是平滑(smoothened)的階梯函數(step function),可導(differentiable)。sigmoid可以將任何值轉換為0~1概率,用於二分類。
  • 一文深度了解 ReLU 激活函數!
    此外,函數隻對其輸入中間點周圍的變化非常敏感。無論作為輸入的節點所提供的求和激活是否包含有用信息,函數的靈敏度和飽和度都是有限的。一旦達到飽和狀態,學習算法就需要不斷調整權值以提高模型的性能。最後,隨著硬體能力的提高,通過 gpu 的非常深的神經網絡使用Sigmoid 和 tanh 激活函數不容易訓練。在大型網絡深層使用這些非線性激活函數不能接收有用的梯度信息。錯誤通過網絡傳播回來,並用於更新權重。每增加一層,錯誤數量就會大大減少。
  • 從ReLU到GELU,一文概覽神經網絡的激活函數
    選自mlfromscratch作者:Casper Hansen機器之心編譯參與:熊貓、杜偉激活函數對神經網絡的重要性自不必多言,機器之心也曾發布過一些相關的介紹文章,比如《一文概覽深度學習中的激活函數根據每一層前面的激活、權重和偏置,我們要為下一層的每個激活計算一個值。但在將該值發送給下一層之前,我們要使用一個激活函數對這個輸出進行縮放。本文將介紹不同的激活函數。在閱讀本文之前,你可以閱讀我前一篇介紹神經網絡中前向傳播和反向傳播的文章,其中已經簡單地提及過激活函數,但還未介紹其實際所做的事情。
  • Relu函數的優點是啥
    問題引入常見的激活函數有sigmoid, relu,Leaky ReLU等,上次我們介紹了sigmoid
  • 為什麼ReLu激活函數要好於tanh和sigmoid?
    當然現在也有一些對relu的改進,比如prelu,random relu等,在不同的數據集上會有一些訓練速度上或者準確率上的改進,具體的大家可以找相關的paper看。多加一句,現在主流的做法,會多做一步batch normalization,儘可能保證每一層網絡的輸入具有相同的分布[1]。
  • 總結|激活函數之sigmoid、ReLU、ELU 以及更新的 Leaky ReLU、SELU、GELU
    來自丹麥技術大學的 Casper Hansen 通過公式、圖表和代碼實驗介紹了 sigmoid、ReLU、ELU 以及更新的 Leaky ReLU、SELU、GELU 這些激活函數,並比較了它們的優勢和短板。在計算每一層的激活值時,我們要用到激活函數,之後才能確定這些激活值究竟是多少。根據每一層前面的激活、權重和偏置,我們要為下一層的每個激活計算一個值。
  • Batch Normalization應該放在ReLU非線性激活層的前面還是後面?
    想像一下,如果我們把網絡中的某一個隱藏層前面的網絡層全部砍掉,那麼這個隱藏層就變成了輸入層,傳給它的輸入需要normalization,就在這一層之間,這個位置,就是原本的BN層的位置。從這方面來說,BN層放非線性激活之後,是很自然的。然後,我們再來考慮一些具體的激活函數。我們看到,無論是tanh
  • 從Sigmoid到GELU,一文概覽神經網絡激活函數
    這裡的擬合能力,主要來自於非線性激活函數。最近我總結了7個深度學習訓練中常用的激活函數,並對它們的特點和優劣做了整理。激活函數也是算法面試中常考主題,建議同學們提前收藏備需!sigmoid 是最基礎的激活函數,可以將任意數值轉換為概率(縮放到0~1之間),在分類等場景中有廣泛的應用。
  • 異軍突起的激活函數:ReLU | 小白深度學習入門
    ReLu是激活函數的一種,其實在前面章節裡面我們就已經見過它了:就是這麼簡單的一個函數,在DNN時代代替了NN時代的激活函數王者:Sigmod,成了「調參俠」的最愛。為什麼要用ReLU呢?這個問題有點像問,吃涮羊肉為什麼蘸芝麻醬?
  • 人工智慧-深度學習-激活函數ReLU,Sigmoid,TanH,ELU,MaxOut
    在每一層疊加完後,我們為輸出與輸入之間加上一個激活函數,此時的方程就變成了這樣:這樣也許就能將這個線性不可分的問題解決了。最後也許就是這個樣子:常見的激活函數:1. ReLU是目前使用最頻繁的一個函數(Rectified Linear Unit),如果你不知道你的激活函數應該選擇哪個,那麼建議你選擇ReLU試試。
  • Python深度學習之卷積函數CNN
    激活函數的選擇上一節中,我們介紹了激活函數的相關知識,了解了常見的激活函數有哪些。那麼當我們進行神經網絡訓練的時候應該如何選擇激活函數呢?當輸入數據特徵相差比較明顯時,用tanh的效果會很好,且在循環過程中會不斷擴大特徵效果並顯示出來。當特徵相差不明顯時,sigmoid的效果比較好。
  • 【專知國慶特刊-PyTorch手把手深度學習教程系列01】一文帶你入門優雅的PyTorch
    < 一文帶你入門優雅的Pytorch >< 快速理解系列(一): 圖文+代碼, 讓你快速理解CNN>< 快速理解系列(二): 圖文+代碼, 讓你快速理解LSTM>NLP系列(二) 基於字符級RNN的姓名分類 >< NLP系列(三) 基於字符級RNN的姓名生成 >一文帶你入門優雅的Pytorch1、說明建議:如果你是學生, 隨便選一個學, 或者稍稍偏向 PyTorch, 因為寫代碼的時候應該更好理解.
  • Mish:一個新的SOTA激活函數,ReLU的繼任者
    >對激活函數的研究一直沒有停止過,ReLU還是統治著深度學習的激活函數,不過,這種情況有可能會被Mish改變。每條記錄都是用Mish而不是ReLU。Mish檢查了理想的激活函數應該是什麼(平滑、處理負號等)的所有內容,並提出了一套泛化的初始測試。在過去的一年裡,我測試了大量新的激活函數,其中大多數都失敗了,從基於MNIST的論文,到基於更真實的數據集的測試。因此,Mish可能最終會為深度學習實踐者提供一種新的激活功能,並有很大的機會超過長期佔據主導地位的ReLU。
  • 神經網絡中的激活函數解析:Sigmoid, tanh, Softmax, ReLU, Leaky ReLU
    >線性或者說恆等激活函數你可以看到函數是一條直線,或者說線性的。sigmoid函數可能會造成神經網絡訓練的時候卡住。softmax函數是更加一般性的logistic激活函數,用在多類分類上。2.這個函數可微的。這個函數是單調的,不過函數的導數不是單調的。tanh函數主要用在區分兩個類別的時候。
  • 面試題:人工神經網絡中為什麼ReLu要好過於tanh和sigmoid?
    第一,採用sigmoid等函數,算激活函數時(指數運算),計算量大。反向傳播求誤差梯度時,求導涉及除法和指數運算,計算量相對大,而採用Relu激活函數,整個過程的計算量節省很多。第二,對於深層網絡,sigmoid函數反向傳播時,很容易就會出現梯度消失的情況(在sigmoid接近飽和區時,變換太緩慢,導數趨於0,這種情況會造成信息丟失。)
  • 一文看盡26種神經網絡激活函數(從ReLU到Sinc)
    本文轉載自:機器之心  作者:David Sheehan在本文中,作者對包括 Relu、Sigmoid 在內的 26 種激活函數做了可視化,並附上了神經網絡的相關屬性,為大家了解激活函數提供了很好的資源。
  • 2020ECCV|FReLU--曠視提出的超越ReLU的激活函數!
    開源地址:https://github.com/megvii-model/FunnelAct Funnel Activation本文提出的FReLU激活函數超越ReLU及其改進,在圖像分類任務上更加有效,並且遷移到目標檢測和圖像分割任務上泛化性更強,如圖1所示。
  • 深度學習中的四種激活函數
    這篇文章用來整理一下入門深度學習過程中接觸到的四種激活函數
  • 35丨深度學習(下):如何用Keras搭建深度學習網絡做手寫數字識別?
    你也許還有印象,在KNN算法那節中,我講到過Mnist手寫數字識別這個數據集,當時我們採用的是mini版的手寫數字數據集。實際上完整版的Mnist一共有60000個訓練樣本和10000個測試樣本,這麼龐大的數據量更適合用深度學習框架完成訓練。今天的學習目標主要有以下的幾個方面:進一步了解CNN網絡。