Pytorch_第九篇_神經(jīng)網(wǎng)絡(luò)中常用的激活函數(shù)

神經(jīng)網(wǎng)絡(luò)中常用的激活函數(shù)


Introduce

理論上神經(jīng)網(wǎng)絡(luò)能夠擬合任意線性函數(shù),其中主要的一個(gè)因素是使用了非線性激活函數(shù)(因?yàn)槿绻恳粚佣际蔷€性變換,那有啥用啊,始終能夠擬合的都是線性函數(shù)啊)。本文主要介紹神經(jīng)網(wǎng)絡(luò)中各種常用的激活函數(shù)。

以下均為個(gè)人學(xué)習(xí)筆記,若有錯(cuò)誤望指出。


各種常用的激活函數(shù)

早期研究神經(jīng)網(wǎng)絡(luò)常常用sigmoid函數(shù)以及tanh函數(shù)(下面即將介紹的前兩種),近幾年常用ReLU函數(shù)以及Leaky Relu函數(shù)(下面即將介紹的后兩種)。torch中封裝了各種激活函數(shù),可以通過(guò)以下方式來(lái)進(jìn)行調(diào)用:

torch.sigmoid(x)
torch.tanh(x)
torch.nn.functional.relu(x)
torch.nn.functional.leaky_relu(x,α)

對(duì)于各個(gè)激活函數(shù),以下分別從其函數(shù)公式、函數(shù)圖像、導(dǎo)數(shù)圖像以及優(yōu)缺點(diǎn)來(lái)進(jìn)行介紹。

(1) sigmoid 函數(shù):

sigmoid函數(shù)是早期非常常用的一個(gè)函數(shù),但是由于其諸多缺點(diǎn)現(xiàn)在基本很少使用了,基本上只有在做二分類(lèi)時(shí)的輸出層才會(huì)使用。

sigmoid 的函數(shù)公式如下

sigmoid(x) = {1 \over (1+exp(-x))}
sigmoid函數(shù)的導(dǎo)數(shù)有一個(gè)特殊的性質(zhì)(導(dǎo)數(shù)是關(guān)于原函數(shù)的函數(shù)),導(dǎo)數(shù)公式如下:

sigmoid'(x) = sigmoid(x)*(1-sigmoid(x))
sigmoid 的函數(shù)圖形如下

image

sigmoid 的導(dǎo)數(shù)圖形如下

image

sigmoid 優(yōu)點(diǎn):

  • 能夠把輸入的連續(xù)值變換為0和1之間的輸出 (可以看成概率)。
  • 如果是非常大的負(fù)數(shù)或者正數(shù)作為輸入的話(huà),其輸出分別為0或1,即輸出對(duì)輸入比較不敏感,參數(shù)更新比較穩(wěn)定。

sigmoid 缺點(diǎn):

  • 在深度神經(jīng)網(wǎng)絡(luò)反向傳播梯度時(shí)容易產(chǎn)生梯度消失(大概率)和梯度爆炸(小概率)問(wèn)題。根據(jù)求導(dǎo)的鏈?zhǔn)椒▌t,我們都知道一般神經(jīng)網(wǎng)絡(luò)損失對(duì)于參數(shù)的求導(dǎo)涉及一系列偏導(dǎo)以及權(quán)重連乘,那連乘會(huì)有什么問(wèn)題呢?如果隨機(jī)初始化各層權(quán)重都小于1(注意到以上sigmoid導(dǎo)數(shù)不超過(guò)0.25,也是一個(gè)比較小的數(shù)),即各個(gè)連乘項(xiàng)都很小的話(huà),接近0,那么最終很多很多連乘(對(duì)應(yīng)網(wǎng)絡(luò)中的很多層)會(huì)導(dǎo)致最終求得梯度為0,這就是梯度消失現(xiàn)象(大概率發(fā)生)。同樣地,如果我們隨機(jī)初始化權(quán)重都大于1(非常大)的話(huà),那么一直連乘也是可能出現(xiàn)最終求得的梯度非常非常大,這就是梯度爆炸現(xiàn)象(很小概率發(fā)生)。
  • sigmoid函數(shù)的輸出是0到1之間的,并不是以0為中心的(或者說(shuō)不是關(guān)于原點(diǎn)對(duì)稱(chēng)的)。這會(huì)導(dǎo)致什么問(wèn)題呢?神經(jīng)網(wǎng)絡(luò)反向傳播過(guò)程中各個(gè)參數(shù)w的更新方向(是增加還是減少)是可能不同的,這是由各層的輸入值x決定的為什么呢?推導(dǎo)詳見(jiàn))。有時(shí)候呢,在某輪迭代,我們需要一個(gè)參數(shù)w0增加,而另一個(gè)參數(shù)w1減少,那如果我們的輸入都是正的話(huà)(sigmoid的輸出都是正的,會(huì)導(dǎo)致這個(gè)問(wèn)題),那這兩個(gè)參數(shù)在這一輪迭代中只能都是增加了,這勢(shì)必會(huì)降低參數(shù)更新的收斂速率。當(dāng)各層節(jié)點(diǎn)輸入都是負(fù)數(shù)的話(huà),也如上分析,即所有參數(shù)在這一輪迭代中只能朝同一個(gè)方向更新,要么全增要么全減。(但是一般在神經(jīng)網(wǎng)絡(luò)中都是一個(gè)batch更新一次,一個(gè)batch中輸入x有正有負(fù),是可以適當(dāng)緩解這個(gè)情況的
  • sigmoid涉及指數(shù)運(yùn)算,計(jì)算效率較低。

(2) tanh 函數(shù)

tanh是雙曲正切函數(shù)。(一般二分類(lèi)問(wèn)題中,隱藏層用tanh函數(shù),輸出層用sigmod函數(shù),但是隨著Relu的出現(xiàn)所有的隱藏層基本上都使用relu來(lái)作為激活函數(shù)了)

tanh 的函數(shù)公式如下

tanh(x) = {exp(x)-exp(-x) \over exp(x)+exp(-x) }
其導(dǎo)數(shù)也具備同sigmoid導(dǎo)數(shù)類(lèi)似的性質(zhì),導(dǎo)數(shù)公式如下:

tanh'(x) = 1 - tanh^2(x)

tanh 的函數(shù)圖形如下

image

tanh 的導(dǎo)數(shù)圖形如下

image

tanh 優(yōu)點(diǎn):

  • 輸出區(qū)間在(-1,1)之間,且輸出是以0為中心的,解決了sigmoid的第二個(gè)問(wèn)題。
  • 如果使用tanh作為激活函數(shù),還能起到歸一化(均值為0)的效果。

tanh 缺點(diǎn):

  • 梯度消失的問(wèn)題依然存在(因?yàn)閺膶?dǎo)數(shù)圖中我們可以看到當(dāng)輸入x偏離0比較多的時(shí)候,導(dǎo)數(shù)還是趨于0的)。
  • 函數(shù)公式中仍然涉及指數(shù)運(yùn)算,計(jì)算效率偏低。

(3) ReLU 函數(shù)

ReLU (Rectified Linear Units) 修正線性單元。ReLU目前仍是最常用的activation function,在隱藏層中推薦優(yōu)先嘗試!

ReLU 的函數(shù)公式如下

ReLU = max(0,x)

ReLU 的函數(shù)圖形如下

image

ReLU 的導(dǎo)數(shù)圖形如下

image

ReLU 優(yōu)點(diǎn):

  • 梯度計(jì)算很快,只要判斷輸入是否大于0即可,這一點(diǎn)加快了基于梯度的優(yōu)化算法的計(jì)算效率,收斂速度遠(yuǎn)快于Sigmoid和tanh。
  • 在正區(qū)間上解決了梯度消失(因?yàn)樘荻扔肋h(yuǎn)為1,不會(huì)連乘等于0)的問(wèn)題。

ReLU 缺點(diǎn):

  • ReLU 的輸出不是以0為中心的,但是這點(diǎn)可以通過(guò)一個(gè)batch更新一次參數(shù)來(lái)緩解。
  • Exist Dead ReLU Problem,某些神經(jīng)元存在死機(jī)的問(wèn)題(永遠(yuǎn)不會(huì)被激活),這是由于當(dāng)輸入x小于0的時(shí)候梯度永遠(yuǎn)為0導(dǎo)致的,梯度為0代表參數(shù)不更新(加0減0),這個(gè)和sigmoid、tanh存在一樣的問(wèn)題,即有些情況下梯度很小很小很小,梯度消失。但是實(shí)際的運(yùn)用中,該缺陷的影響不是很大。 因?yàn)楸容^難發(fā)生,為什么呢?因?yàn)檫@種情況主要有兩個(gè)原因?qū)е拢?strong>其一:非常恰巧的參數(shù)初始化。神經(jīng)元的輸入為加權(quán)求和,除非隨機(jī)初始化恰好得到了一組權(quán)值參數(shù)使得加權(quán)求和變成負(fù)數(shù),才會(huì)出現(xiàn)梯度為0的現(xiàn)象,然而這個(gè)概率是比較低的。其二:學(xué)習(xí)率設(shè)置太大,使得某次參數(shù)更新的時(shí)候,跨步太大,得到了一個(gè)比原先更差的參數(shù)。選擇已經(jīng)有一些參數(shù)初始化的方法以及學(xué)習(xí)率自動(dòng)調(diào)節(jié)的算法可以防止出現(xiàn)上述情況。(具體方法筆者暫時(shí)還未了解!了解了之后再進(jìn)行補(bǔ)充)

(4) Leaky Relu 函數(shù)(PRelu)

Leaky Relu 的函數(shù)公式如下

PRelu(α,x)=max(αx,x)

以下以α為0.1的情況為例,通常α=0.01,這邊取0.1只是為了圖形梯度大一點(diǎn),畫(huà)出來(lái)比較直觀。

Leaky Relu 的函數(shù)圖形如下

image

Leaky Relu 的導(dǎo)數(shù)圖形如下

image

Leaky Relu 優(yōu)點(diǎn):

  • 解決了relu函數(shù)輸入小于0時(shí)梯度為0的問(wèn)題。
  • 與ReLU一樣梯度計(jì)算快,是常數(shù),只要判斷輸入大于0還是小于0即可。

對(duì)于Leaky Relu 的缺點(diǎn)筆者暫時(shí)不了解,但是實(shí)際應(yīng)用中,并沒(méi)有完全證明Leaky ReLU總是好于ReLU,因此ReLU仍是最常用的激活函數(shù)。


本文參考-1

本文參考-2

本文參考-3

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容