版權(quán)申明:本文為博主窗戶(Colin Cai)原創(chuàng),歡迎轉(zhuǎn)帖。如要轉(zhuǎn)貼,必須注明原文網(wǎng)址 http://www.rzrgm.cn/Colin-Cai/p/11900470.html 作者:窗戶 QQ/微信:6679072 E-mail:6679072@qq.com
人工智能(AI)是目前IT最前沿的領(lǐng)域之一,而深度學(xué)習(xí)(Deep Learning)則是AI中最火熱的方向。深度學(xué)習(xí)是指深度的神經(jīng)網(wǎng)絡(luò),這主要是因為網(wǎng)絡(luò)深了之后才可以表現(xiàn)更廣闊的意思,而神經(jīng)網(wǎng)絡(luò)最基本的問題是分類問題。本文從神經(jīng)網(wǎng)絡(luò)開始起,講講深度學(xué)習(xí)分類網(wǎng)絡(luò)的發(fā)展歷史以及其中用到的技術(shù)。
人工智能很早就有研究,一度分為三大學(xué)派——符號派,行為派,連接派。符號派,認為符號演繹是AI的本質(zhì),Lisp/prolog這些都是符號派的杰作;而行為派更加偏向于對行為的分析,像遺傳進化模型、人工蟻群、粒子群、強化學(xué)習(xí)(人工蟻群實際上是強化學(xué)習(xí)的特例)等。而本文既然講深度學(xué)習(xí),自然是連接派的研究成果。目前,也的確是連接派發(fā)展的最好,但未來的AI個人懷疑是三大學(xué)派的合流。
神經(jīng)網(wǎng)絡(luò)
上世紀(jì)初,人們發(fā)現(xiàn)并研究大腦神經(jīng)元,

知道了神經(jīng)元是用樹突的信號傳遞信息,并構(gòu)成如下網(wǎng)狀的環(huán)境。

神經(jīng)網(wǎng)絡(luò)的歷史很早,早在1943年就由McCulloch和Pitts根據(jù)大腦神經(jīng)元的生物現(xiàn)實提出了神經(jīng)網(wǎng)絡(luò)的概念,這是仿生學(xué)的開始。
神經(jīng)網(wǎng)絡(luò)的單個神經(jīng)元看成幾個輸入量的函數(shù),這里所有的單個輸入量、輸出量都是標(biāo)量,考慮到通用性以及計算的方便,主流上基本只考慮以下這樣的模型的神經(jīng)元:

$t=f(b+\sum_{i=1}^{n}a_{n}*b_{n})$
這里的SUM是各個輸入的加權(quán)和(weighted sum),而f稱之為激勵函數(shù)(activation function)。此函數(shù)相當(dāng)于用各個權(quán)值(weight)表示各個輸入信號參與的程度,而b是先天加上的一個偏置(bias),了解一些神經(jīng)網(wǎng)絡(luò)的朋友會馬上明白神經(jīng)網(wǎng)絡(luò)的訓(xùn)練連實際上就是訓(xùn)練各個神經(jīng)元的權(quán)值和偏置。
而這里的激勵函數(shù),也很重要。前面加權(quán)值是線性的,如果所有的神經(jīng)元都表現(xiàn)的是線性關(guān)系,那么所有信號的漸變只會導(dǎo)致最終輸出信號的漸變,這種平穩(wěn)的漸變不符合我們實際的需要,我們一般需要的并非是這種非漸進的東西,而更加需要突變的東西,比如這樣的躍遷函數(shù)

但是這里就有一個一類間斷點,而連續(xù)對于神經(jīng)網(wǎng)絡(luò)很重要(后面會說明),一類間斷點和二類間斷點很多時候是災(zāi)難,于是一般我們采用別的函數(shù)來模擬躍遷函數(shù)這樣的“瞬變”。比如sigmoid函數(shù)和tanh函數(shù),他們有著類似于下面的圖像:

中間過渡帶的寬度可以由權(quán)值來調(diào)節(jié)。
神經(jīng)網(wǎng)絡(luò)由多個神經(jīng)元構(gòu)成,以下為單層神經(jīng)網(wǎng)絡(luò):

有單層自然有多層,以下為多層:

乃至各種各樣的經(jīng)典神經(jīng)網(wǎng)絡(luò)

神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)
既然神經(jīng)網(wǎng)絡(luò)要拿來使用,就得學(xué)習(xí),在這里,我們只考慮監(jiān)督學(xué)習(xí)。
所謂監(jiān)督學(xué)習(xí),就仿佛是“填鴨式教學(xué)”,目的是希望舉一反三。作為監(jiān)督導(dǎo)師,事先準(zhǔn)備了n個問題,給出了n個標(biāo)準(zhǔn)答案,把這n個問題和n個標(biāo)準(zhǔn)答案教給AI模型(至于怎么教隨意),然后不再教學(xué),希望AI模型可以解決這n個問題之外的問題。
神經(jīng)網(wǎng)絡(luò)為了可學(xué)習(xí),對于每次學(xué)習(xí)的問題,定義了自己推理結(jié)果和標(biāo)準(zhǔn)答案之間的距離,稱之為損失(loss),這和其他的一些AI模型有著很大的差別(比如KNN、DT等)。
常用的有MSE損失函數(shù),這個是從曲線擬合的最小二乘法就開始使用了,為神經(jīng)網(wǎng)絡(luò)實際推理結(jié)果和標(biāo)準(zhǔn)答案各維度之差的平方值的平均。
$MSE(Y,y)=\frac{1}{2n}\sum_{i=1}^{n}(Y_{i}-y_{i})^2$
其中1/2n是取平均,因為對于具體網(wǎng)絡(luò)這個是一個常數(shù),從而可以忽略。
另外,交叉熵也很常用,
$C(Y,y)=\sum_{i=1}^{n}Y_{i}*log(y_{i})+(1-Y_{i})log(1-y_{i})$
而我們訓(xùn)練的目的是為了loss盡可能的小,從而推理結(jié)果更接近于實際預(yù)期結(jié)果。
于是我們把loss看成是所有要訓(xùn)練參數(shù)的函數(shù),
$loss=F(w_{0},w_{1},...,w_{n})$
于是,我們希望loss最小,實際上發(fā)生的時候,所有的
$\frac{\partial F}{\partial w_{m}}=0$
很早的時候,人們就創(chuàng)造了一個梯度下降算法,也就是按照梯度
$(\frac{\partial F}{\partial w_{0}},\frac{\partial F}{\partial w_{1}},...\frac{\partial F}{\partial w_{n}})$
的反方向依次下降到梯度為零的地方附近,這樣的方向調(diào)整參數(shù)最快達到目標(biāo)。

又因為神經(jīng)網(wǎng)絡(luò)是一級一級的,所有l(wèi)oss表示為各個weight的函數(shù)其實是一堆函數(shù)的符合函數(shù),求導(dǎo)滿足鏈?zhǔn)揭?guī)則,各個weight的梯度分量可以根據(jù)鏈?zhǔn)揭?guī)則從后往前計算,于是人們給了它一個名字叫反向傳播(Backpropagation)。
卷積神經(jīng)網(wǎng)絡(luò)

我們再來看看上面這個多層感知器,每一層所有輸入和輸出之間都存在連接,這叫全連接。
(1)全連接參數(shù)過于多,網(wǎng)絡(luò)很容易變的非常重,不利于讓網(wǎng)絡(luò)往深度方面去發(fā)展。
(2)再者,全連接直接是一種圖像整體關(guān)系的處理。而生活的經(jīng)驗和基于信號處理的傳統(tǒng)圖像處理告訴我們,對圖像的識別往往取決于局部。也就是說,圖像的識別、處理等往往依據(jù)的是圖像局部的邏輯性,而不是一堆雜亂無章的像素點。
(3)同樣的理由,全連接對于圖像的平移、旋轉(zhuǎn)等變換完全沒有任何感覺,也就是不具備平移不變性、旋轉(zhuǎn)不變性。
于是我們得找一種新的方法,那就是卷積(convolution)。

引用了卷積之后,神經(jīng)網(wǎng)絡(luò)的連接比全連接要少的多,并且?guī)狭似揭撇蛔冃裕粠в行D(zhuǎn)不變性,從此卷積神經(jīng)網(wǎng)絡(luò)(CNN)成為了神經(jīng)網(wǎng)絡(luò)主流。
而網(wǎng)絡(luò)各層求導(dǎo)的鏈?zhǔn)揭?guī)則,乘積項隨著層數(shù)的增加而增加,使用傳統(tǒng)的激勵函數(shù),因為激勵函數(shù)的導(dǎo)數(shù)大多情況接近于0,很容易陷入梯度消失,過渡帶的導(dǎo)數(shù)很大會導(dǎo)致可能存在另外一個極端梯度爆炸。這些對于參數(shù)訓(xùn)練都是很不利的,要么學(xué)習(xí)緩慢,要么跳躍過大。
于是,我們用以下稱為Relu的激勵函數(shù)來代替

乃至還有一些別的變種,比如PRelu、LRelu等。
另外,引入了池化這樣的降維操作,這在降維的同時多少為網(wǎng)絡(luò)帶來了一定的旋轉(zhuǎn)不變性。

上面就是一個最大池化,有的時候也會用到平均池化,但要注意,最大池話是非線性操作,使用的場合可能會多一些。
于是,以上卷積神經(jīng)網(wǎng)絡(luò)的基本零件已經(jīng)有了,由卷積、激勵函數(shù)、池化等構(gòu)成了特征提取層,用于產(chǎn)生必要的特征信息,而使用一層或多層的全連接用于邏輯輸出,稱為邏輯層。

而作為分類系統(tǒng),一般來說,最終輸出采用one-hot編碼,這樣比較對稱。也就是,如果是n分類,網(wǎng)絡(luò)最終輸出就是一個n維向量。
LeNet

卷積網(wǎng)絡(luò)早期的經(jīng)典,用于處理手寫識別。 LeNet用的都是5x5的卷積核,每個卷積后面跟一個2x2的不重疊的最大池化。
另外,C3層是對16個14x14的featuremap分批卷積的。論文描述了這樣做的好處:
(1)參數(shù)減少
(2)非對稱結(jié)構(gòu)有利于提供多種組合特征
順便提一下,著名的minist數(shù)據(jù)集就是一個手寫識別0-9這10個數(shù)字的數(shù)據(jù)集,一般用于入門。
雖然對于英文手寫識別系統(tǒng)可以很好的應(yīng)用,但是該網(wǎng)絡(luò)并不太適用于不斷出現(xiàn)的新的應(yīng)用。
對于LeNet的擴展也未必那么容易,從而迫切需要新的改良出現(xiàn),以便適用于不斷出現(xiàn)的引用。
ImageNet從2010年開始的ILSVRC競賽也為所有團隊提供了動力。
于是,DL技術(shù)就這樣開始不斷進步了。
AlexNet

AlexNet是2012年ILSVRC的冠軍,這是一個參數(shù)很多的網(wǎng)絡(luò),第一個卷積層的卷積核是11x11,后面的全連接很大,它有很多創(chuàng)新點:
(1)這是經(jīng)典里第一個引入Relu作為激勵函數(shù)以對抗梯度消失的網(wǎng)絡(luò)。
(2)特征提取層理有上下兩個獨立的group,從而可以并行,作者就是在特征提取里使用兩個GPU來并行工作。
(3)采用局部相應(yīng)歸一化LRN(Local Response Normalization),這是受真實的神經(jīng)網(wǎng)絡(luò)啟發(fā)之后產(chǎn)生歸一化的思想。歸一化的思想說白了就是用多個輸入張量統(tǒng)一調(diào)整調(diào)整當(dāng)前輸入張量,歸一化之前,整體的BP學(xué)習(xí)算法對于稍微深一點的網(wǎng)絡(luò)甚至不太現(xiàn)實,最開始的深度學(xué)習(xí)模型都是一層一層學(xué)習(xí)的,歸一化思想讓整體的BP學(xué)習(xí)成為了現(xiàn)實。

雖然后面出現(xiàn)的網(wǎng)絡(luò)VGG的作者就發(fā)現(xiàn)LRN似乎對VGG沒有什么作用,現(xiàn)在LRN作為一種技術(shù)已經(jīng)很少使用甚至淘汰,但是歸一化的思想?yún)s一直都在。
(4)不同于LeNet的最大池化尺寸2x2步長2,引入重疊池化,最大池化尺寸3x3步長2,雖然產(chǎn)生了基本一樣尺寸的輸出,但實驗表示,這樣的效果會好一些。
(5)引入dropout學(xué)習(xí)機制,在學(xué)習(xí)過程中隨機拋棄全連接層(邏輯層)的部分神經(jīng)連接,以減少過擬合(overfitting)。

以上基本上都是AlexNet獨立的開創(chuàng),為后面網(wǎng)絡(luò)產(chǎn)生了很大的影響。
GoolgLeNet
你沒有想錯,這個網(wǎng)絡(luò)是Google設(shè)計的,作為AI的先驅(qū),Google是必然有份的。另外,里面有個L大寫,我也沒有寫錯,那是Google為了向經(jīng)典網(wǎng)絡(luò)LeNet致敬。

GoogLeNet作為2014年ILSVRC的冠軍,是模塊化設(shè)計的經(jīng)典之作。
模塊化在于它創(chuàng)造了以下這樣稱為Inception的模塊

圖像的識別有個視野問題,于是Inception采用1x1、3x3、5x5卷積乃至3x3最大池化是對于型相同的feature map不同的視野,不同尺度的特征提取。再拼接在一起,這樣,不同尺度的特征提取就放在一起了,這樣的思想的確很贊。
之后,為了降低參數(shù)數(shù)量,采用1x1卷積來降維,從而模塊變成了這樣:

模塊化的設(shè)計思想,便于網(wǎng)絡(luò)修改。GooLeNet用平均池化代替了全連接,但為了方便大家fine-tune,最終還是提供了一個全連接層。dropput依然在此網(wǎng)絡(luò)中使用。為了對抗梯度消失,網(wǎng)絡(luò)中間引入了兩個輔助的softmax輸出用于觀察,所以我們看到整個網(wǎng)絡(luò)上面還有兩個輸出。
歸一化的思想依舊得到延續(xù),Inception V2里創(chuàng)造了Batch Normalization,用于替代之前的LRN。

將n張輸入張量(圖片)組成一個稱之為mini-batch的東西,用每個張量相同位置的值來統(tǒng)一歸一化每個張量在這個位置的值。
BN成了后來神經(jīng)網(wǎng)絡(luò)的標(biāo)配,一直延續(xù)了下來。
在接下來的版本Inception V3里,繼續(xù)想辦法減少參數(shù),縮小網(wǎng)絡(luò)規(guī)模。

上面就是用兩個3x3卷積核來替代一個5x5的原理,兩個3x3的視野和5x5的視野一致。

有了這樣的嘗試,后面的卷積神經(jīng)網(wǎng)絡(luò)基本都是3x3的小核,不再使用大核。
這樣,仍然不滿足,進一步降低參數(shù)。

以上用1x3和3x1兩個卷積核串聯(lián)出3x3的視野,進一步降低參數(shù)數(shù)量。


為減少feature map尺寸提供一種雙縫結(jié)構(gòu)

一邊卷積過去,另外一側(cè)池化過去,再拼接。
后來,Inception給出了第四個版本,雖然這個版本對模塊做了一些固化,但可圈可點的地方不像前三個版本這么多。
ResNet
既然是Deep Learning,自然網(wǎng)絡(luò)還是奔著深度的方向去的,也只有網(wǎng)絡(luò)變的更深才可以有更靈活的模擬能力。之前的很多措施,Relu也好,歸一化也罷,dropout,切成小核等等,要么是為了防止梯度異常,要么就是為了對抗過擬合,參數(shù)過多,然后最終都是想把網(wǎng)絡(luò)做深以期望更好的效果。
ResNet是第一個真正意義上讓Deep Learning名符其實的網(wǎng)絡(luò)。
ResNet從殘差分析(Residual Analysis)中受到啟發(fā),引入殘差概念,也就是幾層之后的feature map和之前的feature map作和,如圖:

ResNet依然是模塊化設(shè)計,上面weight layer是卷積層,引入Relu,是為了讓F(x)引入非線性因素。單個卷積層做殘差沒有意義,因為它與單個卷積是等價的。
當(dāng)然,也可以適用更深層次的殘差模塊,加法跨越的層次可以更多一點。

為什么可以實現(xiàn)真正意義上的深度學(xué)習(xí)呢?說白了,我們最根源的需求是為了對抗梯度消失才可以使得網(wǎng)絡(luò)變深而可學(xué)習(xí)

而上面鏈?zhǔn)角髮?dǎo)規(guī)則里的這個后面的紅色的1,就是防止梯度消失秘密武器的原理。
引入上述結(jié)構(gòu)極大程度減緩了梯度消失的發(fā)生,從而可以把網(wǎng)絡(luò)做的更深。從此,開啟了爆走模式。

由此,百層網(wǎng)絡(luò)也不再是大問題。
ResNet V2相比V1有了一些模塊上的改動

但這些都不是大的本質(zhì)變化,而ResNet的參差方法卻一直被后世的網(wǎng)絡(luò)引入,從此神經(jīng)網(wǎng)絡(luò)真正意義上進入了Deep Learning時代。
網(wǎng)絡(luò)發(fā)展方向
隨著嵌入式的發(fā)展,很多AI的應(yīng)用可以放到嵌入式設(shè)備上面來,因為嵌入式設(shè)備的資源限制,這就迫切的使得網(wǎng)絡(luò)要往計算量、數(shù)據(jù)量輕量級的方向發(fā)展。
實際上,硬件資源是有限的,運算速度也是追求的方向,我們在GoogLeNet上就看到了為參數(shù)縮減所做的努力。
后面的出現(xiàn)的一些輕量級網(wǎng)絡(luò)某些程度上是希望“掏空”神經(jīng)元,從而往著參數(shù)更加少的方向進行,但同時而網(wǎng)絡(luò)graph更加復(fù)雜意味著網(wǎng)絡(luò)的表達能力更加強大。

以上是一個目標(biāo)檢測(Object Detection)的小型網(wǎng)絡(luò),可以看出其網(wǎng)絡(luò)的連接比直線型的要怪異很多,參數(shù)雖少,但網(wǎng)絡(luò)更為復(fù)雜。
DenseNet
受Resnet的啟發(fā),提出了dense block模塊,每個dense block里的任何兩層之間都有連接,從而有著比ResNet更加密集的殘差,
以下是一個dense block

整個網(wǎng)絡(luò)是由數(shù)個dense block以及其他的卷積、池化、全連接等層拼接而成:

SqueezeNet
SqueezeNet引入了一個叫Fire Module的模塊,用的都是小尺寸卷積,甚至1x1卷積。

同樣受ResNet啟發(fā),引入bypass結(jié)構(gòu),本質(zhì)上就是ResNet的Residual block

MobileNet
MobileNet改造了卷積,引入了Depthwise Convolution。
普通卷積為大家所熟悉,對于每個卷積核,所有的源feature map都參與卷積,計算量較大。

而depthwise卷積長這樣

卷積核就這么被降維了,一個featuremap單獨產(chǎn)生一個featuremap,卷積不改變featuremap個數(shù),不同featuremap之間在卷積中不產(chǎn)生直接作用。
如果想改變featuremap個數(shù),可以在后面接上Pointwise Convolution,說白了就是1x1卷積核的卷積。

因為Depthwise Convolution的參與,MobileNet做到了更少的參數(shù)。而Depthwise Convolution本質(zhì)上是Group Convolution的極端形式,所謂Group Convolution就是把傳入的featuremap分組,然后每一組以普通卷積的形式計算,然后整體輸出。然而,Group Convolution此時也并非新概念,早在AlexNet時,我們回憶一下這兩個并行,實際上就是Group Convolution。

甚至在LeNet中的C3層里,Group Convolution就已經(jīng)在使用。

MobileNet這是一種在嵌入式上使用較多的網(wǎng)絡(luò),被使用在了各種場合,所以叫MobileNet。

ShuffleNet
ShuffleNet也一樣,引入DepthWise Convolution和Group Convolution。

之所以叫ShuffleNet,在于網(wǎng)絡(luò)從中間引入shuffle,將各組feature map重新分組送入下一輪分組卷積

之前MobileNet采用1x1卷積將不同的featuremap關(guān)聯(lián)在一起,而這里只是簡單的用shuffle來進行信息滲透,不產(chǎn)生計算量,以之達到類似的效果。
結(jié)尾
一些前期網(wǎng)絡(luò)開發(fā)的技術(shù)會被后期的網(wǎng)絡(luò)繼續(xù)傳承,而效率不高的技術(shù)會導(dǎo)致淘汰或被修改。
目前DL很火熱,未來的AI技術(shù)會是什么樣子?神經(jīng)網(wǎng)絡(luò)是我們終極的AI模型嗎?符號主義、行為主義、連接主義最終會徹底的互相滲透嗎?讓我們拭目以待。
浙公網(wǎng)安備 33010602011771號