Index
多層感知機(jī)(MLP)介紹
深度神經(jīng)網(wǎng)絡(luò)的激活函數(shù)
深度神經(jīng)網(wǎng)絡(luò)的損失函數(shù)
多層感知機(jī)的反向傳播算法
神經(jīng)網(wǎng)絡(luò)的訓(xùn)練技巧
深度卷積神經(jīng)網(wǎng)絡(luò)
前饋神經(jīng)網(wǎng)絡(luò)(feedforward neural network)是一種最簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò),各神經(jīng)元分層排列。每個(gè)神經(jīng)元只與前一層的神經(jīng)元相連。接收前一層的輸出,并輸出給下一層.各層間沒有反饋。是目前應(yīng)用最廣泛、發(fā)展最迅速的人工神經(jīng)網(wǎng)絡(luò)之一。研究從20世紀(jì)60年代開始,目前理論研究和實(shí)際應(yīng)用達(dá)到了很高的水平。
——百度百科
而深度學(xué)習(xí)模型,類似的模型統(tǒng)稱是叫深度前饋網(wǎng)絡(luò)(Deep Feedforward Network),其目標(biāo)是擬合某個(gè)函數(shù)f,由于從輸入到輸出的過程中不存在與模型自身的反饋連接,因此被稱為“前饋”。常見的深度前饋網(wǎng)絡(luò)有:多層感知機(jī)、自編碼器、限制玻爾茲曼機(jī)、卷積神經(jīng)網(wǎng)絡(luò)等等。
01 多層感知機(jī)(MLP)介紹
說起多層感知器(Multi-Later Perceptron),不得不先介紹下單層感知器(Single Layer Perceptron),它是最簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò),包含了輸入層和輸出層,沒有所謂的中間層(隱含層),可看下圖:
也就是說,將輸入向量賦予不同的權(quán)重向量,整合后加起來,并通過激活函數(shù)輸出1或-1,一般單層感知機(jī)只能解決線性可分的問題,如下圖:
我選擇了0個(gè)隱含層,也就是我們介紹的單層感知機(jī),對(duì)于可以線性可分的數(shù)據(jù),效果還是可以的。如果我換成線性不可分的數(shù)據(jù)集,如下圖,那么跑半天都跑不出個(gè)什么結(jié)果來。
這個(gè)時(shí)候就引入多層感知器,它相比單層感知器多了一個(gè)隱含層的東西,同樣的數(shù)據(jù)集,我加入兩層 隱含層,瞬間就可以被分類得很好。
對(duì)于上面直觀的了解,我這里還是要深入介紹一下多層感知機(jī)的原理。Multi-Layer Perceptron(我們后面都叫MLP),MLP并沒有規(guī)定隱含層的數(shù)量,因此我們可以根據(jù)自己的需求選擇合適的層數(shù),也對(duì)輸出層神經(jīng)元沒有個(gè)數(shù)限制。
02 深度神經(jīng)網(wǎng)絡(luò)的激活函數(shù)
感知機(jī)算法中包含了前向傳播(FP)和反向傳播(BP)算法,但在介紹它們之前,我們先來了解一下深度神經(jīng)網(wǎng)絡(luò)的激活函數(shù)。
為了解決非線性的分類或回歸問題,我們的激活函數(shù)必須是非線性的函數(shù),另外我們使用基于梯度的方式來訓(xùn)練模型,因此激活函數(shù)也必須是連續(xù)可導(dǎo)的。 @ 磐創(chuàng) AI
常用的激活函數(shù)主要是:
Sigmoid激活函數(shù)
Sigmoid函數(shù)就是Logistic函數(shù),其數(shù)學(xué)表達(dá)式為:
對(duì)應(yīng)函數(shù)圖像為:
對(duì)應(yīng)的導(dǎo)函數(shù)為:
可以看出,Sigmoid激活函數(shù)在定義域上是單調(diào)遞增的,越靠近兩端變化越平緩,而這會(huì)導(dǎo)致我們?cè)谑褂肂P算法的時(shí)候出現(xiàn)梯度消失的問題。
Tanh激活函數(shù)
Tanh激活函數(shù)中文名叫雙曲正切激活函數(shù),其數(shù)學(xué)表達(dá)式為:
對(duì)應(yīng)函數(shù)圖像為:
對(duì)應(yīng)的導(dǎo)函數(shù)為:
同樣的,tanh激活函數(shù)和sigmoid激活函數(shù)一樣存在梯度消失的問題,但是tanh激活函數(shù)整體效果會(huì)優(yōu)于Sigmoid激活函數(shù)。
Q:為什么Sigmoid和Tanh激活函數(shù)會(huì)出現(xiàn)梯度消失的現(xiàn)象?
A:兩者在z很大(正無窮)或者很?。ㄘ?fù)無窮)的時(shí)候,其導(dǎo)函數(shù)都會(huì)趨近于0,造成梯度消失的現(xiàn)象。
ReLU激活函數(shù)
ReLU激活函數(shù)又稱為修正線性單元或整流性單元函數(shù),是目前使用比較多的激活函數(shù),其數(shù)學(xué)表達(dá)式為:
對(duì)應(yīng)函數(shù)圖像為(a):
對(duì)應(yīng)的導(dǎo)函數(shù)為:
ReLU激活函數(shù)的收斂速度要比上面兩種要快得多,ReLU激活函數(shù)的X軸左側(cè)值恒為0,使得網(wǎng)絡(luò)具有一定的稀疏性,從而減少參數(shù)之間的依存關(guān)系,緩解了過擬合的情況,而且它的導(dǎo)函數(shù)有部分為常數(shù)1,因此不存在梯度消失的問題。但ReLU激活函數(shù)也有弊端,那就是會(huì)丟失一些特征信息。
LReLU激活函數(shù)
上面可以看到LReLU激活函數(shù)的圖像了,它和ReLU激活函數(shù)的區(qū)別在于當(dāng)z<0時(shí),其值不為0,而是一個(gè)斜率為a的線性函數(shù)(一般a會(huì)是一個(gè)十分小的正數(shù)),這樣子即起到了單側(cè)抑制,也不完全丟失負(fù)梯度信息,其導(dǎo)函數(shù)表達(dá)式為:
03 深度神經(jīng)網(wǎng)絡(luò)的損失函數(shù)
損失函數(shù)(Loss Function)又被稱為Cost Function,作用是用來表示預(yù)測(cè)值與真實(shí)值之間的誤差,深度學(xué)習(xí)模型的訓(xùn)練是基于梯度的方法最小化Loss Function的過程,下面就介紹幾種常見的損失函數(shù)。
均方誤差損失函數(shù)
均方誤差(Mean Squared Error,MSE)是比較常用的損失函數(shù),其數(shù)學(xué)表達(dá)式如下:
交叉熵?fù)p失函數(shù)
交叉熵(Crocs Entropy)損失函數(shù)使用訓(xùn)練數(shù)據(jù)的預(yù)測(cè)值與真實(shí)值之間的交叉熵來作為損失函數(shù),其數(shù)學(xué)表達(dá)式如下:
適用場(chǎng)景
一般來說,MSE更適合輸出值為連續(xù)值,并且最后一層不含Sigmoid或Softmax激活函數(shù)的神經(jīng)網(wǎng)絡(luò);而交叉熵則適合二分類或者多分類的場(chǎng)景。
04 多層感知機(jī)的反向傳播算法
在MLP中,輸入信號(hào)通過各個(gè)網(wǎng)絡(luò)層的隱節(jié)點(diǎn)產(chǎn)生輸出的過程,我們稱之為“前向傳播“,而前向傳播最終是產(chǎn)生一個(gè)標(biāo)量損失函數(shù)。而反向傳播算法(Backpropagation)則是將損失函數(shù)的信息沿著網(wǎng)絡(luò)層向后傳播用以計(jì)算梯度,達(dá)到優(yōu)化網(wǎng)絡(luò)參數(shù)的目的。
05 神經(jīng)網(wǎng)絡(luò)的訓(xùn)練技巧
神經(jīng)網(wǎng)絡(luò)的訓(xùn)練,常常會(huì)遇到的問題就是過擬合,而解決過擬合問題的方法也有很多,簡(jiǎn)單羅列下:Data Augmentation(數(shù)據(jù)增廣)、Regularization(正則化)、Model Ensemble(模型集成)、Dropout等等。此外,訓(xùn)練深度學(xué)習(xí)網(wǎng)絡(luò)還有學(xué)習(xí)率、權(quán)重衰減系數(shù)、Dropout比例的調(diào)參等。還有Batch Normalization,BN(批量歸一化)也可以加速訓(xùn)練過程的收斂,有效規(guī)避復(fù)雜參數(shù)對(duì)網(wǎng)絡(luò)訓(xùn)練效率的影響。
Data Augmentation
Data Augmentation也就是數(shù)據(jù)增廣的意思,就是在不改變數(shù)據(jù)類別的情況下,這里主要針對(duì)圖像數(shù)據(jù)來說,主要包括但不限于:
1)角度旋轉(zhuǎn)
2)隨機(jī)裁剪
3)顏色抖動(dòng):指的是對(duì)顏色的數(shù)據(jù)增強(qiáng),包括圖像亮度、飽和度、對(duì)比度變化等
4)增加噪聲:主要是高斯噪聲,在圖像中隨機(jī)加入
5)水平翻轉(zhuǎn)
6)豎直翻轉(zhuǎn)
參數(shù)初始化
考慮到全連接的深度神經(jīng)網(wǎng)絡(luò),同一層中的任意神經(jīng)元都是同構(gòu)的,所以擁有相同的輸入和輸出,如果參數(shù)全部初始化為同一個(gè)值,無論是前向傳播還是反向傳播的取值都會(huì)是一樣的,學(xué)習(xí)的過程將無法打破這種情況。因此,我們需要隨機(jī)地初始化神經(jīng)網(wǎng)絡(luò)的參數(shù)值,簡(jiǎn)單的一般會(huì)在
的均勻分布中去隨機(jī)抽取,其中d是一個(gè)神經(jīng)元接受的輸入維度。
學(xué)習(xí)率
學(xué)習(xí)率我們通常設(shè)為0.1,但是如果在實(shí)踐中驗(yàn)證集上的loss或者accuracy不變的時(shí)候,可以考慮增加2~5倍的學(xué)習(xí)率。
Dropout原理
Dropout在深度學(xué)習(xí)網(wǎng)絡(luò)訓(xùn)練中是十分常用的,指的是以一定的概率p隨機(jī)丟棄一部分神經(jīng)元節(jié)點(diǎn),而這個(gè)“丟棄”只是臨時(shí)的,是針對(duì)每一次小批量的訓(xùn)練數(shù)據(jù)而言,由于是隨機(jī)丟棄,所以每一次的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)都會(huì)不一樣,相當(dāng)于每次迭代都是在訓(xùn)練不同結(jié)構(gòu)的神經(jīng)網(wǎng)絡(luò),有點(diǎn)像傳統(tǒng)機(jī)器學(xué)習(xí)中的Bagging方法。
具體實(shí)現(xiàn)上,在訓(xùn)練過程中,神經(jīng)元的節(jié)點(diǎn)激活值以一定的概率p被“丟棄”,也就是“停工”。因此,對(duì)于包含N個(gè)神經(jīng)元節(jié)點(diǎn)的網(wǎng)絡(luò),在Dropout的作用下可以看做是生成 2的N次方個(gè)模型的集合,這個(gè)過程會(huì)減弱全體神經(jīng)元之間的聯(lián)合適應(yīng)性,減少過擬合的風(fēng)險(xiǎn),增強(qiáng)泛化能力。
Batch Normalization原理
因?yàn)樯窠?jīng)網(wǎng)絡(luò)的訓(xùn)練過程本質(zhì)就是對(duì)數(shù)據(jù)分布的學(xué)習(xí),因此訓(xùn)練前對(duì)輸入數(shù)據(jù)進(jìn)行歸一化處理顯得很重要。我們知道,神經(jīng)網(wǎng)絡(luò)有很多層,每經(jīng)過一個(gè)隱含層,訓(xùn)練數(shù)據(jù)的分布會(huì)因?yàn)閰?shù)的變化而發(fā)生改變,導(dǎo)致網(wǎng)絡(luò)在每次迭代中都需要擬合不同的數(shù)據(jù)分布,這樣子會(huì)增加訓(xùn)練的復(fù)雜度以及過擬合的風(fēng)險(xiǎn)。
因此我們需要對(duì)數(shù)據(jù)進(jìn)行歸一化處理(均值為0,標(biāo)準(zhǔn)差為1),把數(shù)據(jù)分布強(qiáng)制統(tǒng)一再一個(gè)數(shù)據(jù)分布下,而且這一步不是一開始做的,而是在每次進(jìn)行下一層之前都需要做的。也就是說,在網(wǎng)路的每一層輸入之前增加一個(gè)當(dāng)前數(shù)據(jù)歸一化處理,然后再輸入到下一層網(wǎng)路中去訓(xùn)練。
Regularizations(正則化)
這個(gè)我們見多了,一般就是L1、L2比較常見,也是用來防止過擬合的。
L1正則化會(huì)使得權(quán)重向量w在優(yōu)化期間變得稀疏(例如非常接近零向量)。 帶有L1正則化項(xiàng)結(jié)尾的神經(jīng)網(wǎng)絡(luò)僅僅使用它的最重要的并且接近常量的噪聲的輸入的一個(gè)稀疏的子集。相比之下,最終的權(quán)重向量從L2正則化通常是分散的、小數(shù)字。在實(shí)踐中,如果你不關(guān)心明確的特征選擇,可以預(yù)計(jì)L2正則化在L1的性能優(yōu)越。
L2正則化也許是最常用的正則化的形式。它可以通過將模型中所有的參數(shù)的平方級(jí)作為懲罰項(xiàng)加入到目標(biāo)函數(shù)(objective)中來實(shí)現(xiàn),L2正則化對(duì)尖峰向量的懲罰很強(qiáng),并且傾向于分散權(quán)重的向量。
Model Ensemble(模型集成)
模型集成在現(xiàn)實(shí)中很常用,通俗來說就是針對(duì)一個(gè)目標(biāo),訓(xùn)練多個(gè)模型,并將各個(gè)模型的預(yù)測(cè)結(jié)果進(jìn)行加權(quán),輸出最后結(jié)果。主要有3種方式:
1)相同模型,不同的初始化參數(shù);
2)集成幾個(gè)在驗(yàn)證集上表現(xiàn)效果較好的模型;
3)直接采用相關(guān)的Boosting和Bagging算法。
06 深度卷積神經(jīng)網(wǎng)絡(luò)(CNN)
終于來到了我們耳熟能詳?shù)腃NN了,也就是卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,CNN),它也是屬于前饋神經(jīng)網(wǎng)絡(luò)的一種,其特點(diǎn)是每層的神經(jīng)元節(jié)點(diǎn)只響應(yīng)前一層局部區(qū)域范圍內(nèi)的神經(jīng)元(全連接網(wǎng)絡(luò)中每個(gè)神經(jīng)元節(jié)點(diǎn)則是響應(yīng)前一層的全部節(jié)點(diǎn))。
一個(gè)深度卷積神經(jīng)網(wǎng)絡(luò)模型,一般由若干卷積層疊加若干全連接層組成,中間包含各種的非線性操作、池化操作。卷積運(yùn)算主要用于處理網(wǎng)格結(jié)構(gòu)的數(shù)據(jù),因此CNN天生對(duì)圖像數(shù)據(jù)的分析與處理有著優(yōu)勢(shì),簡(jiǎn)單地來理解,那就是CNN是利用濾波器(Filter)將相鄰像素之間的輪廓過濾出來。
Convolution(卷積)
卷積的濾波器(Filter)我們可以看做是一個(gè)window,可以觀察下面的案例,有一個(gè)6X6的網(wǎng)絡(luò)以及一個(gè)3X3的Filter,其中Filter的每個(gè)格子上有權(quán)值。拿著FIlter在網(wǎng)絡(luò)上去移動(dòng),直到所有的小格子都被覆蓋到,每次移動(dòng),都將Filter“觀察”到的內(nèi)容,與之權(quán)值相乘作為結(jié)果輸出。最后,我們可以得到一個(gè)4X4的網(wǎng)格矩陣。(下面的6張圖來自參考文獻(xiàn)5,侵刪)
Padding(填充)
卷積后的矩陣大小與一開始的不一致,那么我們需要對(duì)邊緣進(jìn)行填充,以保證尺寸一致。
Stride(步長(zhǎng))
也就是Filter移動(dòng)的步伐大小,上面的例子為1,其實(shí)可以由我們自己來指定,有點(diǎn)像是學(xué)習(xí)率。
Depth(深度)
深度指的是圖片的深度,一張6X6X3大小的圖片經(jīng)過3X3X3的Filter過濾后會(huì)得到一個(gè)4X4X1大小的圖片,因此深度為1。我們也可以通過增加Filter的個(gè)數(shù)來增加深度,如下:
Pooling(池化)
因?yàn)闉V波器在進(jìn)行窗口移動(dòng)的過程中會(huì)有很多冗余計(jì)算,效率很慢,池化操作的目的在于加速卷積操作,最常用的有Maxpooling,其原理如下圖所示:
完整的深度CNN網(wǎng)絡(luò)
卷積操作的本質(zhì)
1)Sparse Interaction(稀疏交互)
因?yàn)榫矸e核的尺度會(huì)小于輸入的維度,也就是我們的FIlter會(huì)小于網(wǎng)絡(luò)大小一樣,這樣子每個(gè)輸出神經(jīng)元僅僅會(huì)與部分特定局部區(qū)域內(nèi)的神經(jīng)元存在連接權(quán)重(也就是產(chǎn)生交互),這種操作特性我們就叫稀疏交互。稀疏交互會(huì)把時(shí)間復(fù)雜度減少好幾個(gè)數(shù)量級(jí),同時(shí)對(duì)過擬合的情況也有一定的改善。
2)Parameter Sharing(參數(shù)共享)
指的是在同一個(gè)模型的不同模塊使用相同的參數(shù),它是卷積運(yùn)算的固有屬性。和我們上面說的Filter上的權(quán)值大小應(yīng)用于所有網(wǎng)格一樣。
評(píng)論