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

知道了神經元是用樹突的信號傳遞資訊,并構成如下網狀的環境,

神經網路的歷史很早,早在1943年就由McCulloch和Pitts根據大腦神經元的生物現實提出了神經網路的概念,這是仿生學的開始,
神經網路的單個神經元看成幾個輸入量的函式,這里所有的單個輸入量、輸出量都是標量,考慮到通用性以及計算的方便,主流上基本只考慮以下這樣的模型的神經元:

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

但是這里就有一個一類間斷點,而連續對于神經網路很重要(后面會說明),一類間斷點和二類間斷點很多時候是災難,于是一般我們采用別的函式來模擬躍遷函式這樣的“瞬變”,比如sigmoid函式和tanh函式,他們有著類似于下面的影像:

中間過渡帶的寬度可以由權值來調節,
神經網路由多個神經元構成,以下為單層神經網路:

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

乃至各種各樣的經典神經網路

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

又因為神經網路是一級一級的,所有loss表示為各個weight的函式其實是一堆函式的符合函式,求導滿足鏈式規則,各個weight的梯度分量可以根據鏈式規則從后往前計算,于是人們給了它一個名字叫反向傳播(Backpropagation),
卷積神經網路

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

參考了卷積之后,神經網路的連接比全連接要少的多,并且帶上了平移不變性,但不帶有旋轉不變性,從此卷積神經網路(CNN)成為了神經網路主流,
而網路各層求導的鏈式規則,乘積項隨著層數的增加而增加,使用傳統的激勵函式,因為激勵函式的導數大多情況接近于0,很容易陷入梯度消失,過渡帶的導數很大會導致可能存在另外一個極端梯度爆炸,這些對于引數訓練都是很不利的,要么學習緩慢,要么跳躍過大,
于是,我們用以下稱為Relu的激勵函式來代替

乃至還有一些別的變種,比如PRelu、LRelu等,
另外,引入了池化這樣的降維操作,這在降維的同時多少為網路帶來了一定的旋轉不變性,

上面就是一個最大池化,有的時候也會用到平均池化,但要注意,最大池話是非線性操作,使用的場合可能會多一些,
于是,以上卷積神經網路的基本零件已經有了,由卷積、激勵函式、池化等構成了特征提取層,用于產生必要的特征資訊,而使用一層或多層的全連接用于邏輯輸出,稱為邏輯層,

而作為分類系統,一般來說,最終輸出采用one-hot編碼,這樣比較對稱,也就是,如果是n分類,網路最終輸出就是一個n維向量,
LeNet

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

AlexNet是2012年ILSVRC的冠軍,這是一個引數很多的網路,第一個卷積層的卷積核是11x11,后面的全連接很大,它有很多創新點:
(1)這是經典里第一個引入Relu作為激勵函式以對抗梯度消失的網路,
(2)特征提取層理有上下兩個獨立的group,從而可以并行,作者就是在特征提取里使用兩個GPU來并行作業,
(3)采用區域相應歸一化LRN(Local Response Normalization),這是受真實的神經網路啟發之后產生歸一化的思想,歸一化的思想說白了就是用多個輸入張量統一調整調整當前輸入張量,歸一化之前,整體的BP學習演算法對于稍微深一點的網路甚至不太現實,最開始的深度學習模型都是一層一層學習的,歸一化思想讓整體的BP學習成為了現實,

雖然后面出現的網路VGG的作者就發現LRN似乎對VGG沒有什么作用,現在LRN作為一種技術已經很少使用甚至淘汰,但是歸一化的思想卻一直都在,
(4)不同于LeNet的最大池化尺寸2x2步長2,引入重疊池化,最大池化尺寸3x3步長2,雖然產生了基本一樣尺寸的輸出,但實驗表示,這樣的效果會好一些,
(5)引入dropout學習機制,在學習程序中隨機拋棄全連接層(邏輯層)的部分神經連接,以減少過擬合(overfitting),

以上基本上都是AlexNet獨立的開創,為后面網路產生了很大的影響,
GoolgLeNet
你沒有想錯,這個網路是Google設計的,作為AI的先驅,Google是必然有份的,另外,里面有個L大寫,我也沒有寫錯,那是Google為了向經典網路LeNet致敬,

GoogLeNet作為2014年ILSVRC的冠軍,是模塊化設計的經典之作,
模塊化在于它創造了以下這樣稱為Inception的模塊

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

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

將n張輸入張量(圖片)組成一個稱之為mini-batch的東西,用每個張量相同位置的值來統一歸一化每個張量在這個位置的值,
BN成了后來神經網路的標配,一直延續了下來,
在接下來的版本Inception V3里,繼續想辦法減少引數,縮小網路規模,

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

有了這樣的嘗試,后面的卷積神經網路基本都是3x3的小核,不再使用大核,
這樣,仍然不滿足,進一步降低引數,

以上用1x3和3x1兩個卷積核串聯出3x3的視野,進一步降低引數數量,


為減少feature map尺寸提供一種雙縫結構

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

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

為什么可以實作真正意義上的深度學習呢?說白了,我們最根源的需求是為了對抗梯度消失才可以使得網路變深而可學習

而上面鏈式求導規則里的這個后面的紅色的1,就是防止梯度消失秘密武器的原理,
引入上述結構極大程度級訓了梯度消失的發生,從而可以把網路做的更深,從此,開啟了爆走模式,

由此,百層網路也不再是大問題,
ResNet V2相比V1有了一些模塊上的改動

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

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

整個網路是由數個dense block以及其他的卷積、池化、全連接等層拼接而成:

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

同樣受ResNet啟發,引入bypass結構,本質上就是ResNet的Residual block

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

而depthwise卷積長這樣

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

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

甚至在LeNet中的C3層里,Group Convolution就已經在使用,

MobileNet這是一種在嵌入式上使用較多的網路,被使用在了各種場合,所以叫MobileNet,

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

之所以叫ShuffleNet,在于網路從中間引入shuffle,將各組feature map重新分組送入下一輪分組卷積

之前MobileNet采用1x1卷積將不同的featuremap關聯在一起,而這里只是簡單的用shuffle來進行資訊滲透,不產生計算量,以之達到類似的效果,
結尾
一些前期網路開發的技識訓被后期的網路繼續傳承,而效率不高的技識訓導致淘汰或被修改,
目前DL很火熱,未來的AI技識訓是什么樣子?神經網路是我們終極的AI模型嗎?符號主義、行為主義、連接主義最侄訓徹底的互相滲透嗎?讓我們拭目以待,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/2256.html
標籤:其他
上一篇:構建物件檢測模型
