神經(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函數(shù)的導(dǎo)數(shù)有一個(gè)特殊的性質(zhì)(導(dǎo)數(shù)是關(guān)于原函數(shù)的函數(shù)),導(dǎo)數(shù)公式如下:
sigmoid 的函數(shù)圖形如下:

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

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ù)公式如下:
其導(dǎo)數(shù)也具備同sigmoid導(dǎo)數(shù)類(lèi)似的性質(zhì),導(dǎo)數(shù)公式如下:
tanh 的函數(shù)圖形如下:

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

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 的函數(shù)圖形如下:

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

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ù)公式如下:
以下以α為0.1的情況為例,通常α=0.01,這邊取0.1只是為了圖形梯度大一點(diǎn),畫(huà)出來(lái)比較直觀。
Leaky Relu 的函數(shù)圖形如下:

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

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ù)。