大貝貝,激活函數 sigmoid、tanh、relu

2021-02-13 大貝貝的人工智慧教科書

激活函數(activation functions)的目標是,將神經網絡非線性化。激活函數是連續的(continuous),且可導的(differential)。

激活函數

常見的激活函數:sigmoid,tanh,relu。

sigmoid

sigmoid是平滑(smoothened)的階梯函數(step function),可導(differentiable)。sigmoid可以將任何值轉換為0~1概率,用於二分類。細節可以參考。

公式:

導數:

導數2:

圖(紅色原函數,藍色導函數):

sigmoid

當使用sigmoid作為激活函數時,隨著神經網絡隱含層(hidden layer)層數的增加,訓練誤差反而加大。表現為:

靠近輸出層的隱含層梯度較大,參數更新速度快,很快就會收斂;

靠近輸入層的隱含層梯度較小,參數更新速度慢,幾乎和初始狀態一樣,隨機分布;

在含有四個隱藏層的網絡結構中,第一層比第四層慢了接近100倍!

這種現象就是梯度彌散(vanishing gradient)。而另一種情況,梯度爆炸(exploding gradient),則是前面層的梯度,通過訓練變大,導致後面層的梯度,以指數級增大。

sigmoid的更新速率

由於sigmoid的導數值小於1/4,x變化的速率要快於y變化的速率,隨著層數的增加,連續不斷執行sigmoid函數,就會導致,前面更新較大的幅度,後面更新較小的幅度,因此,網絡在學習過程中,更傾向於,更新後面(靠近輸出層)的參數,而不是前面的參數(靠近輸入層)。

sigmoid的導函數

sigmoid缺點:

激活函數的計算量較大,在反向傳播中,當求誤差梯度時,求導涉及除法;

在反向傳播中,容易就會出現梯度消失,無法完成深層網絡的訓練;

函數的敏感區間較短,(-1,1)之間較為敏感,超過區間,則處於飽和狀態,

參考1、參考2

tanh

tanh,即雙曲正切(hyperbolic tangent),類似於幅度增大sigmoid,將輸入值轉換為-1至1之間。tanh的導數取值範圍在0至1之間,優於sigmoid的0至1/4,在一定程度上,減輕了梯度消失的問題。tanh的輸出和輸入能夠保持非線性單調上升和下降關係,符合BP(back propagation)網絡的梯度求解,容錯性好,有界。

公式:

導數:

圖(紅色原函數,藍色導函數):

tanh

sigmoid和tanh:

sigmoid在輸入處於[-1,1]之間時,函數值變化敏感,一旦接近或者超出區間就失去敏感性,處於飽和狀態,影響神經網絡預測的精度值;

tanh的變化敏感區間較寬,導數值漸進於0、1,符合人腦神經飽和的規律,比sigmoid函數延遲了飽和期;

tanh在原點附近與y=x函數形式相近,當激活值較低時,可以直接進行矩陣運算,訓練相對容易;

tanh和sigmoid都是全部激活(fire),使得神經網絡較重(heavy)。

參考1、參考2、參考3

relu

relu,即Rectified Linear Unit,整流線性單元,激活部分神經元,增加稀疏性,當x小於0時,輸出值為0,當x大於0時,輸出值為x.

公式:

圖:

relu

導數:

圖:

ReLU的導函數

relu對比於sigmoid:

sigmoid的導數,只有在0附近,具有較好的激活性,而在正負飽和區的梯度都接近於0,會造成梯度彌散;而relu的導數,在大於0時,梯度為常數,不會導致梯度彌散。

relu函數在負半區的導數為0 ,當神經元激活值進入負半區,梯度就會為0,也就是說,這個神經元不會被訓練,即稀疏性;

relu函數的導數計算更快,程序實現就是一個if-else語句;而sigmoid函數要進行浮點四則運算,涉及到除法;

relu的缺點:

在訓練的時候,ReLU單元比較脆弱並且可能「死掉」。舉例來說,當一個很大的梯度,流過ReLU的神經元的時候,可能會導致梯度更新到一種特別的狀態,在這種狀態下神經元將無法被其他任何數據點再次激活。如果這種情況發生,那麼從此所以流過這個神經元的梯度將都變成0。也就是說,這個ReLU單元在訓練中將不可逆轉的死亡,因為這導致了數據多樣化的丟失。

如果學習率設置得太高,可能會發現網絡中40%的神經元都會死掉(在整個訓練集中這些神經元都不會被激活)。通過合理設置學習率,這種情況的發生概率會降低。

在神經網絡中,隱含層的激活函數,最好選擇ReLU。

關於RNN中為什麼選擇tanh,而不是relu,參考。



作者:SpikeKing
連結:https://www.jianshu.com/p/857d5859d2cc
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

相關焦點

  • TF2.0-五種優化器,激活函數(sigmoid,tanh,relu,leaky relu的優缺點),損失函數,正則化等
    sigmoid,tanh,relu,leaky reluⅢ.損失函數:    MSE,自定義loss,CE交叉熵含實現Ⅳ.緩解過擬合/欠擬合的方式:,採用的激活函數relu第7行:最後的輸出層,採用的激活函數sigmoid第9~11行:compile彙編器中,optimizer優化器用的:Adam,損失函數用的二分類的交叉熵binary_crossentropy。
  • 神經網絡中的激活函數解析:Sigmoid, tanh, Softmax, ReLU, Leaky ReLU
    單調函數:函數要麼是一直變大的,要麼是一直變小的。非線性激活函數的類型主要根據它們的範圍或者曲線的類型來劃分:1.所以,它常常用在那些需要預測概率的模型上面,因為概率的範圍就是0到1,sigmoid正好符合。這個函數可微的,意思是,sigmoid曲線上的任意兩點都可以找到一個斜率。這個函數是單調的,不過函數的導數不是單調的。
  • 人工智慧-深度學習-激活函數ReLU,Sigmoid,TanH,ELU,MaxOut
    激活函數:在多層神經網絡中,上層節點的輸出和下層節點的輸入之間具有一個函數關係,這個函數稱為激活函數(又稱激勵函數)激活函數的本質:激活函數是來向神經網絡中引入非線性因素的,通過激活函數,神經網絡就可以擬合各種曲線。
  • Relu函數的優點是啥
    問題引入常見的激活函數有sigmoid, relu,Leaky ReLU等,上次我們介紹了sigmoid
  • 面試題:簡單說下sigmoid激活函數
    常用的非線性激活函數有sigmoid、tanh、relu等等,前兩者sigmoid/tanh比較常見於全連接層
  • 總結|激活函數之sigmoid、ReLU、ELU 以及更新的 Leaky ReLU、SELU、GELU
    來自丹麥技術大學的 Casper Hansen 通過公式、圖表和代碼實驗介紹了 sigmoid、ReLU、ELU 以及更新的 Leaky ReLU、SELU、GELU 這些激活函數,並比較了它們的優勢和短板。在計算每一層的激活值時,我們要用到激活函數,之後才能確定這些激活值究竟是多少。根據每一層前面的激活、權重和偏置,我們要為下一層的每個激活計算一個值。
  • Pytorch_第九篇_神經網絡中常用的激活函數
    各種常用的激活函數早期研究神經網絡常常用sigmoid函數以及tanh函數(下面即將介紹的前兩種),近幾年常用ReLU函數以及Leaky Relu函數(下面即將介紹的後兩種)。torch中封裝了各種激活函數,可以通過以下方式來進行調用:torch.sigmoid(x)torch.tanh(x)torch.nn.functional.relu(x)torch.nn.functional.leaky_relu(x,α)對於各個激活函數,以下分別從其函數公式、函數圖像、導數圖像以及優缺點來進行介紹。
  • 為什麼ReLu激活函數要好於tanh和sigmoid?
    當然現在也有一些對relu的改進,比如prelu,random relu等,在不同的數據集上會有一些訓練速度上或者準確率上的改進,具體的大家可以找相關的paper看。多加一句,現在主流的做法,會多做一步batch normalization,儘可能保證每一層網絡的輸入具有相同的分布[1]。
  • 面試題:人工神經網絡中為什麼ReLu要好過於tanh和sigmoid?
    第一,採用sigmoid等函數,算激活函數時(指數運算),計算量大。反向傳播求誤差梯度時,求導涉及除法和指數運算,計算量相對大,而採用Relu激活函數,整個過程的計算量節省很多。第二,對於深層網絡,sigmoid函數反向傳播時,很容易就會出現梯度消失的情況(在sigmoid接近飽和區時,變換太緩慢,導數趨於0,這種情況會造成信息丟失。)
  • 【DL知識拾貝】Pytorch版本第一篇:激活函數大匯總
    從定義來講,只要連續可導的函數都可以作為激活函數,但目前常見的多是分段線性和具有指數形狀的非線性函數。下面列出經典的三大激活函數以及一些新的激活函數。1. 典型激活函數及進階1.1 Sigmoidsigmoid函數可以將元素的值變換到0和1之間:
  • 21種NLP任務激活函數大比拼:你一定猜不到誰贏了
    我們發現一種很大程度上不為人知的激活函數在所有任務上都表現得最穩定,即所謂的 penalized tanh 函數。我們還表明它能在 LSTM 單元中成功替代 sigmoid 和 tanh 門,並能在一種高難度的 NLP 任務上取得優於標準選擇 2 個百分點的表現。
  • Batch Normalization應該放在ReLU非線性激活層的前面還是後面?
    還是sigmoid函數圖像的兩端,相對於x的變化,y的變化都很小(這其實很正常,畢竟tanh就是拉伸過的sigmoid)。也就是說,容易出現梯度衰減的問題。那麼,如果在tanh或sigmoid之前,進行一些normalization處理,就可以緩解梯度衰減的問題。我想這可能也是最初的BN論文選擇把BN層放在非線性激活之前的原因。但是ReLU的畫風和它們完全不一樣啊。
  • 異軍突起的激活函數:ReLU | 小白深度學習入門
    ReLu是激活函數的一種,其實在前面章節裡面我們就已經見過它了:即:為什麼要使用sigmoid,tanh,ReLU等非線性函數?這個原因大家都知道,為了增加非線性唄!深度學習的目的是用一堆神經元堆出一個函數大致的樣子,然後通過大量的數據去反向擬合出這個函數的各個參數,最終勾勒出函數的完整形狀。那如果激活函數只是線性函數,那一層層的線性函數堆起來還是線性的,這年頭線性函數能幹啥呀?
  • 從ReLU到GELU,一文概覽神經網絡的激活函數
    本文同樣關注的是激活函數。來自丹麥技術大學的 Casper Hansen 通過公式、圖表和代碼實驗介紹了 sigmoid、ReLU、ELU 以及更新的 Leaky ReLU、SELU、GELU 這些激活函數,並比較了它們的優勢和短板。在計算每一層的激活值時,我們要用到激活函數,之後才能確定這些激活值究竟是多少。
  • Python深度學習之卷積函數CNN
    激活函數的選擇上一節中,我們介紹了激活函數的相關知識,了解了常見的激活函數有哪些。那麼當我們進行神經網絡訓練的時候應該如何選擇激活函數呢?當輸入數據特徵相差比較明顯時,用tanh的效果會很好,且在循環過程中會不斷擴大特徵效果並顯示出來。當特徵相差不明顯時,sigmoid的效果比較好。
  • 神經網絡中的激活函數
    有以下不同類型的激活函數閥值函數或階梯激活函數SigmoidSoftmaxTanh或雙曲正切ReLULeaky ReLU為什麼我們需要這麼多不同的激活函數,我怎麼決定用哪一個呢?讓我們回顧一下每一個激活函數,並了解它們的最佳使用位置和原因。這將幫助我們決定在不同的場景中使用哪個激活函數。
  • 神經網絡中激活函數的真正意義?一個激活函數需要具有哪些必要的屬性?還有哪些屬性是好的屬性但不必要的?
    還是各類ReLU的變種(LReLU,PReLU,RReLU,ELU,SELU,GELU等等),Maxout,又或者是某大神自己在搞的很複雜的激活函數,這是沒有標準答案的,只能說有一些通用的大家認可的結論,下面也只能覆蓋到一些。(1) sigmoid和tanh激活函數。為什麼最早的時候大家用sigmoid函數呢?
  • 超越ReLU卻鮮為人知後被挖掘:BERT、GPT-2等都在用的激活函數
    據不完全統計,BERT、RoBERTa、ALBERT 等目前業內頂尖的 NLP 模型都使用了這種激活函數。另外,在 OpenAI 聲名遠播的無監督預訓練模型 GPT-2 中,研究人員在所有編碼器模塊中都使用了 GELU 激活函數。
  • 深度學習基礎篇:如何選擇正確的激活函數?
    我們不希望下一個神經元得到的值在任何時候都是正值,不過可以通過縮放sigmoid函數來解決這個問題,而這需要在tanh函數中發生。tanh函數tanh函數與Sigmoid函數非常相似。它實際上只是Sigmoid函數的一個放大版本。
  • Mish:一個新的SOTA激活函數,ReLU的繼任者
    >對激活函數的研究一直沒有停止過,ReLU還是統治著深度學習的激活函數,不過,這種情況有可能會被Mish改變。Mish檢查了理想的激活函數應該是什麼(平滑、處理負號等)的所有內容,並提出了一套泛化的初始測試。在過去的一年裡,我測試了大量新的激活函數,其中大多數都失敗了,從基於MNIST的論文,到基於更真實的數據集的測試。因此,Mish可能最終會為深度學習實踐者提供一種新的激活功能,並有很大的機會超過長期佔據主導地位的ReLU。