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