都2021年了,不会还有人连深度学习都不了解吧(一)- 激活函数篇
一、前言
本人目前研一,研究方向?yàn)榛谏疃葘W(xué)習(xí)的醫(yī)學(xué)圖像分割,轉(zhuǎn)眼間已接觸深度學(xué)習(xí)快1年,研一生活也即將結(jié)束,期間看了大量的英文文獻(xiàn),做了大量的實(shí)驗(yàn),也算是對(duì)深度學(xué)習(xí)有了一個(gè)初步的了解吧。接下來的一段時(shí)間,我會(huì)以總結(jié)的形式來記錄研一期間學(xué)到的關(guān)于深度學(xué)習(xí)的基礎(chǔ)知識(shí),其中穿插著大量的個(gè)人作深度學(xué)習(xí)方面工作的經(jīng)驗(yàn),寫這個(gè)系列的初衷一方面是為了記錄研一的學(xué)習(xí)成果,另一方面也是為了幫助更多的人了解到深度學(xué)習(xí)這一大熱領(lǐng)域,最后,大喊一聲:深度學(xué)習(xí)yyds!
二、激活函數(shù)介紹
在接觸激活函數(shù)之前,我們需要大致了解一下什么是感知機(jī)。
上圖中的感知機(jī)接受x1和x2兩個(gè)輸入信號(hào),輸出為y。若用數(shù)學(xué)公式來表達(dá)圖中的感知機(jī),則:
b是稱為偏置,用于控制神經(jīng)元被激活的容易程度;而w1和w2是表示各個(gè)信號(hào)的權(quán)重的參數(shù),用于控制各個(gè)信號(hào)的重要性。感知機(jī)將x1、x2、1(偏置,圖中未畫出)三個(gè)信號(hào)作為神經(jīng)元的輸入,將其和各自的權(quán)重相乘后,傳送至下一個(gè)神經(jīng)元。在下一個(gè)神經(jīng)元中,計(jì)算這些加權(quán)信號(hào)的總和。如果這個(gè)總和超過0,則輸出1,否則輸出0。
我們將上述公式寫為更簡潔的形式:
輸入的總和會(huì)被函數(shù)A轉(zhuǎn)換,轉(zhuǎn)換后的值就是輸出y。在輸入總和超過0時(shí)返回1,否則返回0。從公式中可以看出,該步驟可以分為2個(gè)階段,先計(jì)算輸入信號(hào)的總和,然后用激活函數(shù)轉(zhuǎn)換。因此,可以將上述公式改寫為:
剛才登場的A(x)會(huì)將輸入信號(hào)轉(zhuǎn)換為輸出信號(hào),這種函數(shù)稱為激活函數(shù)(activation function)。激活函數(shù)的作用在于決定如何來激活輸入信號(hào)的總和。至此,相信大家已經(jīng)對(duì)激活函數(shù)有了一個(gè)大致的了解,明確激活函數(shù)的任務(wù)是什么,下面我們介紹一下常用的激活函數(shù)有哪些。
三、常用的激活函數(shù)
3.1 階躍函數(shù)
從圖中可以清晰地看出,階躍函數(shù)以0為界,輸出從0切換為1(或者從1切換為0)。它的值呈階梯式變化,所以稱為階躍函數(shù)。
3.2 Sigmoid函數(shù)
Sigmoid函數(shù)定義為:
Sigmoid函數(shù)圖像如下圖所示:
Note:(Sigmoid函數(shù)和階躍函數(shù)的比較)
- 1.首先注意到的是“平滑性”的不同。sigmoid函數(shù)是一條平滑的曲線,輸出隨著輸入發(fā)生連續(xù)性的變化。而階躍函數(shù)以0為界,輸出發(fā)生急劇性的變化。sigmoid函數(shù)的平滑性對(duì)神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)具有重要意義。
- 2.另一個(gè)不同點(diǎn)是,相對(duì)于階躍函數(shù)只能返回0或1,sigmoid函數(shù)可以返回0.731 …、0.880 …等實(shí)數(shù)(這一點(diǎn)和剛才的平滑性有關(guān))。也就是說,感知機(jī)中神經(jīng)元之間流動(dòng)的是0或1的二元信號(hào),而神經(jīng)網(wǎng)絡(luò)中流動(dòng)的是連續(xù)的實(shí)數(shù)值信號(hào)。
- 3.共同點(diǎn):實(shí)際上,兩者的結(jié)構(gòu)均是“輸入小時(shí),輸出接近0(為0);隨著輸入增大,輸出向1靠近(變成1)”。也就是說,當(dāng)輸入信號(hào)為重要信息時(shí),階躍函數(shù)和sigmoid函數(shù)都會(huì)輸出較大的值;當(dāng)輸入信號(hào)為不重要的信息時(shí),兩者都輸出較小的值。還有一個(gè)共同點(diǎn)是,不管輸入信號(hào)有多小,或者有多大,輸出信號(hào)的值都在0到1之間。
3.3 tanh函數(shù)
tanh是雙曲函數(shù)中的一個(gè),tanh()為雙曲正切。
tanh函數(shù)定義為:
圖像如下所示:
Note(很重要):
Sigmoid函數(shù)和tanh函數(shù)作為常用的激活函數(shù),必定有其的優(yōu)勢所在,但是兩者都存在致命的缺陷,尤其是在越來越深的網(wǎng)絡(luò)表現(xiàn)得愈加明顯。首先,我們需要了解為什么深度神經(jīng)網(wǎng)絡(luò)收斂慢的原因。
這是因?yàn)樯顚由窠?jīng)網(wǎng)絡(luò)在做非線性變換前的激活輸入值(就是那個(gè)x=WU+B,U是輸入)隨著網(wǎng)絡(luò)深度加深或者在訓(xùn)練過程中,其分布逐漸發(fā)生偏移或者變動(dòng),之所以訓(xùn)練收斂慢,一般是整體分布逐漸往非線性函數(shù)的取值區(qū)間的上下限兩端靠近(對(duì)于Sigmoid函數(shù)來說,意味著激活輸入值WU+B是大的負(fù)值或正值),所以這導(dǎo)致反向傳播時(shí)低層神經(jīng)網(wǎng)絡(luò)的梯度消失,這是訓(xùn)練深層神經(jīng)網(wǎng)絡(luò)收斂越來越慢的本質(zhì)原因。
也可以通過兩者得圖像可以看到,當(dāng)輸入大于2時(shí),梯度會(huì)變得越來越小(更加詳細(xì)的解讀請移步詳細(xì)解讀BN的本質(zhì)),這會(huì)導(dǎo)致深度神經(jīng)網(wǎng)絡(luò)出現(xiàn)梯度彌散的問題,以至于深度神經(jīng)網(wǎng)絡(luò)模型不能收斂。而之后提出的ReLU函數(shù)很好的解決了這個(gè)問題。
3.4 ReLU函數(shù)
3.4.1 ReLU介紹
ReLU函數(shù)定義如下式所示:
ReLU圖像如下圖所示:
3.4.2 使用ReLU的優(yōu)勢
第一個(gè)優(yōu)點(diǎn)是 ReLU 函數(shù)計(jì)算簡單,可以提升模型的運(yùn)算速度,加快模型的收斂速度;第二個(gè)是如果網(wǎng)絡(luò)很深,會(huì)出現(xiàn)梯度消失的問題,使得模型會(huì)出現(xiàn)不會(huì)收斂或者是收斂速度慢的問題,而使用 ReLU函數(shù)可以有效的解決模型收斂速度慢的問題。
四、 為什么使用激活函數(shù)
首先,我們需要明確一點(diǎn)是神經(jīng)網(wǎng)絡(luò)的中激活函數(shù)必須使用非線性函數(shù)。為什么不能使用線性函數(shù)呢?因?yàn)槭褂镁€性函數(shù)的話,加深網(wǎng)絡(luò)層數(shù)就沒有什么意義了。線性函數(shù)的問題在于,不管如何加深層數(shù),總是存在與之等效的“無隱藏層的神經(jīng)網(wǎng)絡(luò)”。為了具體地理解這一點(diǎn),我們來思考下面這個(gè)簡單的例子。這里我們考慮把線性函數(shù) h(x) = cx 作為激活函數(shù),把y(x) = h(h(h(x)))的運(yùn)算對(duì)應(yīng)3層經(jīng)網(wǎng)絡(luò)A。這個(gè)運(yùn)算會(huì)進(jìn)行y(x) = c × c × c × x的乘法運(yùn)算,但是同樣的處理可以由y(x) = ax(注意,a = c**3)這一次乘法運(yùn)算(即沒有隱藏層的神經(jīng)網(wǎng)絡(luò))來表示。如本例所示,使用線性函數(shù)時(shí),無法發(fā)揮多層網(wǎng)絡(luò)帶來的優(yōu)勢。因此,為了發(fā)揮疊加層所帶來的優(yōu)勢,激活函數(shù)必須使用非線性函數(shù)。
五、激活函數(shù)的一些變體
這里只介紹現(xiàn)代神經(jīng)網(wǎng)絡(luò)中最常用的ReLU函數(shù)的幾種變體,變體有很多,包括Leaky ReLU、PReLU、ELU等等,說實(shí)話,我在這接近一年研究深度學(xué)習(xí)的工作中,從未用過ReLU的任何變體,而且同門師兄弟也沒聽說誰用過,所以在這里只是簡單的介紹。
5.1 Leaky ReLU
為什么提出了Leaky ReLU?這需要從ReLU說起,ReLU函數(shù)對(duì)正數(shù)樣本原樣輸出,負(fù)數(shù)直接置零。在正數(shù)不飽和,在負(fù)數(shù)硬飽和,ReLU在負(fù)數(shù)區(qū)域被Kill(即直接置0這一操作)的現(xiàn)象叫做dead relu。為了解決上述的dead ReLU現(xiàn)象。這里選擇一個(gè)數(shù),讓負(fù)數(shù)區(qū)域不在飽和死掉。這里的斜率都是確定的,即Leaky ReLU。Leaky ReLU的定義及圖像如下所示:
5.2 PReLU
PReLU與Leaky ReLU類似,只不過ReLU的參數(shù)是一個(gè)可學(xué)習(xí)的參數(shù),而Leaky ReLU的參數(shù)是一個(gè)定值。PReLU的定義如下:
原文獻(xiàn)建議初始化alpha,alpha為0.25,不采用正則,但是這要根據(jù)具體數(shù)據(jù)和網(wǎng)絡(luò),通常情況下使用正則可以帶來性能提升。與Relu比起來,PRelu收斂速度更快。
參考文獻(xiàn)
《深度學(xué)習(xí)入門-基于Python的理論與實(shí)現(xiàn)》
《ImageNet Classification with Deep ConvolutionalNeural Networks》
計(jì)劃 – 深度學(xué)習(xí)系列
都2021年了,不會(huì)還有人連深度學(xué)習(xí)還不了解吧?(一)-- 激活函數(shù)篇
都2021年了,不會(huì)還有人連深度學(xué)習(xí)還不了解吧?(二)-- 卷積篇
都2021年了,不會(huì)還有人連深度學(xué)習(xí)還不了解吧?(三)-- 損失函數(shù)篇
都2021年了,不會(huì)還有人連深度學(xué)習(xí)還不了解吧?(四)-- 上采樣篇
都2021年了,不會(huì)還有人連深度學(xué)習(xí)還不了解吧?(五)-- 下采樣篇
都2021年了,不會(huì)還有人連深度學(xué)習(xí)還不了解吧?(六)-- Padding篇
都2021年了,不會(huì)還有人連深度學(xué)習(xí)還不了解吧?(七)-- 評(píng)估指標(biāo)篇
都2021年了,不會(huì)還有人連深度學(xué)習(xí)還不了解吧?(八)-- 優(yōu)化算法篇
都2021年了,不會(huì)還有人連深度學(xué)習(xí)還不了解吧?(九)-- 注意力機(jī)制篇
都2021年了,不會(huì)還有人連深度學(xué)習(xí)還不了解吧?(十)-- 數(shù)據(jù)歸一化篇
覺得寫的不錯(cuò)的話,歡迎點(diǎn)贊+評(píng)論+收藏,這對(duì)我?guī)椭艽?#xff01;
總結(jié)
以上是生活随笔為你收集整理的都2021年了,不会还有人连深度学习都不了解吧(一)- 激活函数篇的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面试薪资这样谈,让你的月薪加倍!
- 下一篇: 都2021年了,不会还有人连深度学习都不