詳解Python中常用的激活函數(shù)(Sigmoid、Tanh、ReLU等)
一、激活函數(shù)定義
激活函數(shù) (Activation functions) 對于人工神經(jīng)網(wǎng)絡(luò)模型去學(xué)習(xí)、理解非常復(fù)雜和非線性的函數(shù)來說具有十分重要的作用。它們將非線性特性引入到神經(jīng)網(wǎng)絡(luò)中。在下圖中,輸入的 inputs 通過加權(quán),求和后,還被作用了一個函數(shù)f,這個函數(shù)f就是激活函數(shù)。引入激活函數(shù)是為了增加神經(jīng)網(wǎng)絡(luò)模型的非線性。沒有激活函數(shù)的每層都相當(dāng)于矩陣相乘。就算你疊加了若干層之后,無非還是個矩陣相乘罷了。
為什么使用激活函數(shù)?
如果不用激勵函數(shù)(其實相當(dāng)于激勵函數(shù)是f(x) = x),在這種情況下你每一層節(jié)點的輸入都是上層輸出的線性函數(shù),很容易驗證,無論你神經(jīng)網(wǎng)絡(luò)有多少層,輸出都是輸入的線性組合,與沒有隱藏層效果相當(dāng),這種情況就是最原始的感知機(Perceptron)了,那么網(wǎng)絡(luò)的逼近能力就相當(dāng)有限。正因為上面的原因,我們決定引入非線性函數(shù)作為激勵函數(shù),這樣深層神經(jīng)網(wǎng)絡(luò)表達能力就更加強大(不再是輸入的線性組合,而是幾乎可以逼近任意函數(shù))。
激活函數(shù)有哪些性質(zhì)?
- 非線性:當(dāng)激活函數(shù)是非線性的,一個兩層的神經(jīng)網(wǎng)絡(luò)就可以基本上逼近所有的函數(shù)。但如果激活函數(shù)是恒等激活函數(shù)的時候,即f(x) = x,就不滿足這個性質(zhì),而且如果MLP使用的是恒等激活函數(shù),那么其實整個網(wǎng)絡(luò)跟單層神經(jīng)網(wǎng)絡(luò)是等價的。
- 可微性:當(dāng)優(yōu)化方法是基于梯度的時候,就體現(xiàn)的該本質(zhì)。
- 單調(diào)性:當(dāng)激活函數(shù)是單調(diào)的時候,單層網(wǎng)絡(luò)能夠保證是凸函數(shù)。
- 輸出值的范圍:當(dāng)激活函數(shù)輸出值是有限的時候,基于梯度的優(yōu)化方法會更加穩(wěn)定,因為特征的表示受有限權(quán)值的影響更顯著;當(dāng)激活函數(shù)的輸出是無限的時候,模型的訓(xùn)練更加高效,不過這種情況很小,一般需要更小的learning rate。
二、梯度消失與梯度爆炸
1.什么是梯度消失與梯度爆炸
梯度消失與梯度爆炸
層數(shù)比較多的神經(jīng)網(wǎng)絡(luò)模型在訓(xùn)練的時候會出現(xiàn)梯度消失(gradient vanishing problem)和梯度爆炸(gradient exploding problem)問題。梯度消失問題和梯度爆炸問題一般會隨著網(wǎng)絡(luò)層數(shù)的增加變得越來越明顯。
例如,一個網(wǎng)絡(luò)含有三個隱藏層,梯度消失問題發(fā)生時,靠近輸出層的hidden layer 3的權(quán)值更新相對正常,但是靠近輸入層的hidden layer1的權(quán)值更新會變得很慢,導(dǎo)致靠近輸入層的隱藏層權(quán)值幾乎不變,仍接近于初始化的權(quán)值。這就導(dǎo)致hidden layer 1 相當(dāng)于只是一個映射層,對所有的輸入做了一個函數(shù)映射,這時此深度神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)就等價于只有后幾層的隱藏層網(wǎng)絡(luò)在學(xué)習(xí)。梯度爆炸的情況是:當(dāng)初始的權(quán)值過大,靠近輸入層的hidden layer 1的權(quán)值變化比靠近輸出層的hidden layer 3的權(quán)值變化更快,就會引起梯度爆炸的問題。
2.梯度消失的根本原因
梯度消失的根本原因
以下圖的反向傳播為例:
假設(shè)σ為sigmoid,C為代價函數(shù)。
下圖(1)式為該網(wǎng)絡(luò)的前向傳播公式。
根據(jù)前向傳播公式,我們得出梯度更新公式:
其中由公式(1)得出
sigmoid函數(shù)的導(dǎo)數(shù)如下圖所示
的最大值是
,而我們一般會使用標(biāo)準(zhǔn)方法來初始化網(wǎng)絡(luò)權(quán)重,即使用一個均值為0標(biāo)準(zhǔn)差為1的高斯分布。因此,初始化的網(wǎng)絡(luò)權(quán)值通常都小于1,從而有。對于2式的鏈?zhǔn)角髮?dǎo),層數(shù)越多,求導(dǎo)結(jié)果越小,前面的網(wǎng)絡(luò)層比后面的網(wǎng)絡(luò)層梯度變化更小,故權(quán)值變化緩慢,最終導(dǎo)致梯度消失的情況出現(xiàn)。
梯度爆炸的根本原因
當(dāng)
,也就是w比較大的情況。則前面的網(wǎng)絡(luò)層比后面的網(wǎng)絡(luò)層梯度變化更快,引起了梯度爆炸的問題。
當(dāng)激活函數(shù)為sigmoid時,梯度消失和梯度爆炸那個更容易發(fā)生?
梯度消失較容易發(fā)生
量化分析梯度爆炸時x的取值范圍:因?qū)?shù)最大為0.25,故|w|>4,才可能出現(xiàn);按照可計算出x的數(shù)值變化范圍很窄,僅在公式3范圍內(nèi),才會出現(xiàn)梯度爆炸。畫圖如5所示,可見x的數(shù)值變化范圍很??;最大數(shù)值范圍也僅僅0.45,當(dāng)|w|=6.9時出現(xiàn)。因此僅僅在此很窄的范圍內(nèi)會出現(xiàn)梯度爆炸的問題。
3.如何解決梯度消失與梯度爆炸問題
如何解決梯度消失和梯度爆炸問題?
梯度消失和梯度爆炸問題都是因為網(wǎng)絡(luò)太深,網(wǎng)絡(luò)權(quán)值更新不穩(wěn)定造成的,本質(zhì)上是因為梯度反向傳播中的連乘效應(yīng)。對于更普遍的梯度消失問題,可以考慮一下三種方案解決:
1. 用ReLU、Leaky-ReLU、P-ReLU、R-ReLU、Maxout等替代sigmoid函數(shù)。
2. 用Batch Normalization。
3. LSTM的結(jié)構(gòu)設(shè)計也可以改善RNN中的梯度消失問題。
三、常用激活函數(shù)
激活函數(shù)分為兩類,飽和激活函數(shù)和非飽和激活函數(shù)。
飽和激活函數(shù)包括sigmoid、tanh;非飽和激活函數(shù)包括ReLU、PReLU、Leaky ReLU、RReLU、ELU等。
那什么是飽和函數(shù)呢?
sigmoid和tanh是“飽和激活函數(shù)”,而ReLU及其變體則是“非飽和激活函數(shù)”。使用“非飽和激活函數(shù)”的優(yōu)勢在于兩點:(1)"非飽和激活函數(shù)”能解決所謂的“梯度消失”問題。(2)它能加快收斂速度。
Sigmoid函數(shù)將一個實值輸入壓縮至[0,1]的范圍---------σ(x) = 1 / (1 + exp(−x))
tanh函數(shù)將一個實值輸入壓縮至 [-1, 1]的范圍---------tanh(x) = 2σ(2x) − 1
由于使用sigmoid激活函數(shù)會造成神經(jīng)網(wǎng)絡(luò)的梯度消失和梯度爆炸問題,所以許多人提出了一些改進的激活函數(shù),如:tanh、ReLU、Leaky ReLU、PReLU、RReLU、ELU、Maxout。
1.Sigmoid
sigmoid的數(shù)學(xué)公式為
其導(dǎo)數(shù)公式為
如下圖所示,左圖為sigmoid的函數(shù)圖,右圖為其導(dǎo)數(shù)圖.
特點:它能夠把輸入的連續(xù)實值變換為0和1之間的輸出,特別的,如果是非常大的負(fù)數(shù),那么輸出就是0;如果是非常大的正數(shù),輸出就是1。
在什么情況下適合使用 Sigmoid 激活函數(shù)?
Sigmoid 函數(shù)的輸出范圍是 0 到 1。由于輸出值限定在 0 到 1,因此它對每個神經(jīng)元的輸出進行了歸一化;用于將預(yù)測概率作為輸出的模型。由于概率的取值范圍是 0 到 1,因此 Sigmoid 函數(shù)非常合適;梯度平滑,避免「跳躍」的輸出值;函數(shù)是可微的。這意味著可以找到任意兩個點的 sigmoid 曲線的斜率;明確的預(yù)測,即非常接近 1 或 0。
缺點:
容易出現(xiàn)梯度消失函數(shù)輸出并不是zero-centered(零均值)冪運算相對來講比較耗時1.梯度消失
優(yōu)化神經(jīng)網(wǎng)絡(luò)的方法是梯度回傳:先計算輸出層對應(yīng)的 loss,然后將 loss 以導(dǎo)數(shù)的形式不斷向上一層網(wǎng)絡(luò)傳遞,修正相應(yīng)的參數(shù),達到降低loss的目的。 Sigmoid函數(shù)在深度網(wǎng)絡(luò)中常常會導(dǎo)致導(dǎo)數(shù)逐漸變?yōu)?,使得參數(shù)無法被更新,神經(jīng)網(wǎng)絡(luò)無法被優(yōu)化。原因在于兩點:
當(dāng)σ(x)中的x較大或較小時,導(dǎo)數(shù)接近0,而后向傳遞的數(shù)學(xué)依據(jù)是微積分求導(dǎo)的鏈?zhǔn)椒▌t,當(dāng)前層的導(dǎo)數(shù)需要之前各層導(dǎo)數(shù)的乘積,幾個小數(shù)的相乘,結(jié)果會很接近0。Sigmoid導(dǎo)數(shù)的最大值是0.25,這意味著導(dǎo)數(shù)在每一層至少會被壓縮為原來的1/4,通過兩層后被變?yōu)?/16,…,通過10層后為1/1048576。請注意這里是“至少”,導(dǎo)數(shù)達到最大值這種情況還是很少見的。2.零均值
零均值是不可取的,因為這會導(dǎo)致后一層的神經(jīng)元將得到上一層輸出的非0均值的信號作為輸入。 Sigmoid函數(shù)的輸出值恒大于0,這會導(dǎo)致模型訓(xùn)練的收斂速度變慢。舉例來講,對,如果所有
均為正數(shù)或負(fù)數(shù),那么其對
的導(dǎo)數(shù)總是正數(shù)或負(fù)數(shù),這會導(dǎo)致如下圖紅色箭頭所示的階梯式更新,這顯然并非一個好的優(yōu)化路徑。深度學(xué)習(xí)往往需要大量時間來處理大量數(shù)據(jù),模型的收斂速度是尤為重要的。所以,總體上來講,訓(xùn)練深度學(xué)習(xí)網(wǎng)絡(luò)盡量使用zero-centered數(shù)據(jù) (可以經(jīng)過數(shù)據(jù)預(yù)處理實現(xiàn)) 和zero-centered輸出。
不是zero-centered產(chǎn)生的一個結(jié)果就是:如果數(shù)據(jù)進入神經(jīng)元的時候是正的
,那么 w 計算出的梯度也會始終都是正的。當(dāng)然了,如果你是按batch去訓(xùn)練,那么那個batch可能得到不同的信號,所以這個問題還是可以緩解一下的。因此,非0均值這個問題雖然會產(chǎn)生一些不好的影響,不過跟上面提到的梯度消失問題相比還是要好很多的。
3.冪運算相對耗時
相對于前兩項,這其實并不是一個大問題,我們目前是具備相應(yīng)計算能力的,但面對深度學(xué)習(xí)中龐大的計算量,最好是能省則省。之后我們會看到,在ReLU函數(shù)中,需要做的僅僅是一個thresholding,相對于冪運算來講會快很多。
2.Tanh
tanh的數(shù)學(xué)公式為:
其導(dǎo)數(shù)為:
sigmoid與tanh的比較
首先,當(dāng)輸入較大或較小時,輸出幾乎是平滑的并且梯度較小,這不利于權(quán)重更新。二者的區(qū)別在于輸出間隔,tanh 的輸出間隔為 1,并且整個函數(shù)以 0 為中心,比 sigmoid 函數(shù)更好;
在 tanh 圖中,負(fù)輸入將被強映射為負(fù),而零輸入被映射為接近零。
注意:在一般的二元分類問題中,tanh 函數(shù)用于隱藏層,而 sigmoid 函數(shù)用于輸出層,但這并不是固定的,需要根據(jù)特定問題進行調(diào)整。
3.ReLU
ReLU的數(shù)學(xué)表達式為
其導(dǎo)數(shù)公式為
ReLU的優(yōu)點:
解決了梯度消失問題 (在正區(qū)間),ReLU的非飽和性可以有效地解決梯度消失的問題, 提供相對寬的激活邊界。Sigmoid和Tanh激活函數(shù)均需要計算指數(shù), 復(fù)雜度高, 而ReLU只需要一個閾值即可得到激活值。ReLU 函數(shù)中只存在線性關(guān)系,因此它的計算速度比 sigmoid 和 tanh 更快。計算速度非???,只需要判斷輸入是否大于0。收斂速度遠快于sigmoid和tanhReLU使得一部分神經(jīng)元的輸出為0,這樣就造成了網(wǎng)絡(luò)的稀疏性,并且減少了參數(shù)的互相依存關(guān)系,緩解了過擬合問題的發(fā)生
ReLU存在的問題
ReLU 函數(shù)的輸出為 0 或正數(shù),不是zero-centered對參數(shù)初始化和學(xué)習(xí)率非常敏感;ReLU 函數(shù)的輸出均值大于0,偏移現(xiàn)象和神經(jīng)元死亡會共同影響網(wǎng)絡(luò)的收斂性。存在神經(jīng)元死亡,指的是某些神經(jīng)元可能永遠不會被激活,導(dǎo)致相應(yīng)的參數(shù)永遠不能被更新。這是由于函數(shù)導(dǎo)致負(fù)梯度在經(jīng)過該ReLU單元時被置為0, 且在之后也不被任何數(shù)據(jù)激活, 即流經(jīng)該神經(jīng)元的梯度永遠為0, 不對任何數(shù)據(jù)產(chǎn)生響應(yīng)。 當(dāng)輸入為負(fù)時,ReLU 完全失效,在正向傳播過程中,這不是問題。有些區(qū)域很敏感,有些則不敏感。但是在反向傳播過程中,如果輸入負(fù)數(shù),則梯度將完全為零,sigmoid 函數(shù)和 tanh 函數(shù)也具有相同的問題。有兩個主要原因可能導(dǎo)致這種情況產(chǎn)生: (1) 非常不幸的參數(shù)初始化,這種情況比較少見; (2) learning rate太高導(dǎo)致在訓(xùn)練過程中參數(shù)更新太大,會導(dǎo)致超過一定比例的神經(jīng)元不可逆死亡, 進而參數(shù)梯度無法更新, 整個訓(xùn)練過程失敗。解決方法是可以采用Xavier初始化方法,以及避免將learning rate設(shè)置太大或使用adagrad等自動調(diào)節(jié)learning rate的算法。
怎樣理解ReLU(<0)時是非線性激活函數(shù)?
從圖像可看出具有如下特點:
單側(cè)抑制相對寬闊的興奮邊界稀疏激活性ReLU函數(shù)從圖像上看,是一個分段線性函數(shù),把所有的負(fù)值都變?yōu)?,而正值不變,這樣就成為單側(cè)抑制。
因為有了這單側(cè)抑制,才使得神經(jīng)網(wǎng)絡(luò)中的神經(jīng)元也具有了稀疏激活性。
稀疏激活性:從信號方面來看,即神經(jīng)元同時只對輸入信號的少部分選擇性響應(yīng),大量信號被刻意的屏蔽了,這樣可以提高學(xué)習(xí)的精度,更好更快地提取稀疏特征。當(dāng)x<0時,ReLU硬飽和,當(dāng)x>0時,則不存在飽和函數(shù)。ReLU能夠在在x>0時保持梯度不衰減,從而緩解梯度消失問題。
4.Leaky ReLU
人們?yōu)榱私鉀Q失效神經(jīng)元,提出了將ReLU的前半段設(shè)為αx而非0。
Leaky ReLU的數(shù)學(xué)表達式為
其導(dǎo)數(shù)公式為
為什么 Leaky ReLU 比 ReLU 更好?
Leaky ReLU 通過把 x 的非常小的線性分量給予負(fù)輸入(αx)來調(diào)整負(fù)值的零梯度(zero gradients)問題;leak 有助于擴大 ReLU 函數(shù)的范圍,通常 a 的值為 0.01 左右;Leaky ReLU 的函數(shù)范圍是(負(fù)無窮到正無窮)。但另一方面, a值的選擇增加了問題難度, 需要較強的人工先驗或多次重復(fù)訓(xùn)練以確定合適的參數(shù)值。
LeakyReLU與ReLU和PReLU之間區(qū)別
if α=0 ,則函數(shù)是ReLUif α>0 ,則函數(shù)是Leaky ReLUif α是可學(xué)習(xí)參數(shù),則函數(shù)是PReLU(Parametric ReLU)
5.ELU
ELU 的提出也解決了 ReLU 的問題。與 ReLU 相比,ELU 有負(fù)值,這會使激活的平均值接近零。均值激活接近于零可以使學(xué)習(xí)更快,因為它們使梯度更接近自然梯度。
顯然,ELU 具有 ReLU 的所有優(yōu)點,并且:
沒有 Dead ReLU 問題,輸出的平均值接近 0,以 0 為中心;ELU 通過減少偏置偏移的影響,使正常梯度更接近于單位自然梯度,從而使均值向零加速學(xué)習(xí);ELU 在較小的輸入下會飽和至負(fù)值,從而減少前向傳播的變異和信息。一個小問題是它的計算強度更高。與 Leaky ReLU 類似,盡管理論上比 ReLU 要好,但目前在實踐中沒有充分的證據(jù)表明 ELU 總是比 ReLU 好。
6.softmax
Softmax 是用于多類分類問題的激活函數(shù),在多類分類問題中,超過兩個類標(biāo)簽則需要類成員關(guān)系。對于長度為 K 的任意實向量,Softmax 可以將其壓縮為長度為 K,值在(0,1)范 圍內(nèi),并且向量中元素的總和為 1 的實向量。
Softmax 與正常的 max 函數(shù)不同:max 函數(shù)僅輸出最大值,但 Softmax 確保較小的值具有較小的概率,并且不會直接丟棄。我們可以認(rèn)為它是 argmax 函數(shù)的概率版本或「soft」版本。
Softmax 函數(shù)的分母結(jié)合了原始輸出值的所有因子,這意味著 Softmax 函數(shù)獲得的各種概率彼此相關(guān)。
Softmax 激活函數(shù)的主要缺點是:
在零點不可微;負(fù)輸入的梯度為零,這意味著對于該區(qū)域的激活,權(quán)重不會在反向傳播期間更新,因此會產(chǎn)生永不激活的死亡神經(jīng)元。
7.Swish
Swish的表達式為y = x * sigmoid (x)
Swish 的設(shè)計受到了 LSTM 和高速網(wǎng)絡(luò)中 gating 的 sigmoid 函數(shù)使用的啟發(fā)。我們使用相同的 gating 值來簡化 gating 機制,這稱為 self-gating。
self-gating 的優(yōu)點在于它只需要簡單的標(biāo)量輸入,而普通的 gating 則需要多個標(biāo)量輸入。這使得諸如 Swish 之類的 self-gated 激活函數(shù)能夠輕松替換以單個標(biāo)量為輸入的激活函數(shù)(例如 ReLU),而無需更改隱藏容量或參數(shù)數(shù)量。
Swish 激活函數(shù)的主要優(yōu)點如下:
「無界性」有助于防止慢速訓(xùn)練期間,梯度逐漸接近 0 并導(dǎo)致飽和;(同時,有界性也是有優(yōu)勢的,因為有界激活函數(shù)可以具有很強的正則化,并且較大的負(fù)輸入問題也能解決);導(dǎo)數(shù)恒 > 0;平滑度在優(yōu)化和泛化中起了重要作用。
到此這篇關(guān)于Python中常用的激活函數(shù)(Sigmoid、Tanh、ReLU等)的文章就介紹到這了,更多相關(guān)激活函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pytorch finetuning 自己的圖片進行訓(xùn)練操作
這篇文章主要介紹了pytorch finetuning 自己的圖片進行訓(xùn)練操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06python 使用xlsxwriter循環(huán)向excel中插入數(shù)據(jù)和圖片的操作
這篇文章主要介紹了python 使用xlsxwriter循環(huán)向excel中插入數(shù)據(jù)和圖片的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01解鎖Python中神器vars內(nèi)置函數(shù)的使用
vars()函數(shù)是一個內(nèi)置函數(shù),用于返回對象的__字典__,其中包含對象的__屬性__,本文主要為大家詳細(xì)介紹了vars()函數(shù)的具體使用,需要的小伙伴可以了解下2023-11-11python實現(xiàn)m3u8格式轉(zhuǎn)換為mp4視頻格式
這篇文章主要為大家詳細(xì)介紹了python實現(xiàn)m3u8格式轉(zhuǎn)換為mp4視頻格式,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-02-02