前言
卷積神經網路(CNN)作為深度學習的重要一支,在當前計算機視覺領域應用相當廣泛,本文回顧了深度學習的發展歷程,講述CNN基本的理論概念和第一代卷積神經網路LeNet-5的建立,文章言有不當之處,還望批評指出,共同進步!
璀璨前的暗淡

2015年,AlphaGo戰敗樊麾二段,"深度學習"的命運就此改變,這個曾被拋棄忘卻的領域成為了數年至今無數人追求的研究方向,然而,它璀璨奪目的前世卻充滿了暗淡與不幸,
“深度學習”的概念正式提出是在2006年,狹義上可以看作是人工神經網路,最早的相關研究是19世紀40~60年代的控制論,已經提出了前饋層次網路摸型,也就是感知器,不過只是一種簡單的線性模型,該模型功能類似于擬合$f(x,\omega )=x_0\omega_0+x_1\omega_1+...+x_n\omega_n$這樣的函式,但在許多像異或問題的情形下顯得無能為力,
直到80年代,Hinton等人提出了反向傳播(BP)演算法,使得模型具備了非線性映射的能力,解決了歷史遺留下來的異或問題,但當時很多神經網路的研究者都是物理學家或者是心理學家,神經網路普遍不能被工程師和計算機科學家所接受,并且,因為受限于當時的資料規模,模型訓練很容易出現“過擬合”,加上機器計算能力的不足和神經網路演算法的“神秘性”,那些本就寥寥無幾的研究者也逐漸對它失去了興趣,紛紛轉行鉆研支持向量機(SVM)的機器學習演算法,雖然如此,當時卻仍有一些“固執”的探索者憑著堅定的信念在神經網路領域默默耕耘,其中就包括后來建立LeNet網路的Yann LeCun,
1998年,Yann LeCun等人在IEEE上發表了《Gradient-based learning applied to document recognization》一文,文中提出了基于梯度學習的卷積神經網路演算法,并成功運用于手寫數字識別中,取得了低于1%的錯誤率,超過了當時所有的模型,由此神經網路的研究開始回熱,
CNN第一人

第一個卷積神經網路并非是LeNet,而是1987年由Alexander Waibel等人提出的時間延遲網路(Time Delay Neural Network, TDNN),TDNN是一個應用于語音識別問題的一維卷積神經網路,而二維網路則是由Yann LeCun提出的,并且論文中首次使用了“卷積”一詞,所以以“第一人”稱呼Yann LeCun不為過,
據吳恩達對LeCun的采訪了解,LeCun從小就對科技興致盎然,尤其是對“人類的智慧”、“有智慧的機器”等話題非常癡迷,最喜歡看有“現代科幻電影技術里程碑”美譽之稱的《2001太空漫游》——看來幼時的興趣著實能影響一個人的一生啊!后來在大學期間,LeCun通過一本辯論語言是否天生的哲學書間接了解到了“感知器”的概念,抱著滿腦的好奇,他去了好幾個大學的圖書館,想要找到有關的資料進一步學習,才發現在50年代之后就很少有人談及到感知器了,
當LeCun拿到工程學位以后,LeCun去學習了與神經網路并不相關的芯片設計,但同時對研究神經網路仍念念不忘——在當時,還沒有出現所謂的反向傳播演算法,如何訓練多層網路依舊是困擾研究者的一大難題,LeCun因此特別想從事這方面的研究,幸運的是,老天從來不會辜負有理想并為之努力的人,LeCun在后來漸漸接觸到了一些神經網路方面的研究者,這些人都多多少少對他產生過影響,例如,當時有群法國實驗室的人正在研究自動機網路,給他看了一些前沿的論文,其中就有Hinton和Terrence寫的關于玻爾茲曼機的文章,LeCun看后非常震驚,原來世界上有這樣一群人已經找到了神經網路正確的研究方向,
后來在讀博期間,LeCun有幸遇到了當年論文的作者之一Terrence,通過交流,他從Terrence那了解到了反向傳播,這個概念當時還處于研究階段,沒有論文的發表,Terrence從法國回到美國后,就跟好友Hinton談及了LeCun,幾個月后Hinton的演講會上,LeCun便認識了這位對他影響深遠的導師,
LeCun最早開始研究卷積網路是在多倫多大學跟著Hinton做博士后的階段,那時候沒有像現在這樣豐富完善的資料庫,自然也沒有現在被人“嚼爛”了的MNIST資料集,LeCun就用滑鼠在個人電腦上一個一個地畫出字符用作訓練樣本,就這樣做出了早期的卷積神經網路,并且那時已經有超越傳統網路的跡象了,再后來,不得不提的就是貝爾實驗室了,可以說它是LeCun成功的重要平臺,在實驗室,LeCun擁有了自己專用的Sun4電腦(在多倫多大學一臺Sun4電腦是整個學院共享的),當時實驗室的主管Larry說,在貝爾實驗室沒有誰是能靠省錢省出名的,在剛加入實驗室的三個月內,LeCun便用實驗室原本建立的資料集USPS訓練出了第一代LeNet,得到了實驗室內最好的效果,雖然現在回過頭看LeNet的架構已經相當普通了,甚至一些教程里都只是一筆帶過,網上也有各種版本的復現,但對于當時環境來講,沒有Python、Matlab,沒有Pytorch、TensorFlow等現成框架,網路的構建需要自己寫模擬器和解釋器,是相當復雜的,
再后來,被人所銘記的就是LeCun在98年的LeNet論文,論文中提及了LeNet5和自動機,標志著真正的CNN誕生了,現今任何的卷積網路你都可以看到LeNet的影子,Yann LeCun也同Geoffrey Hinton 和 Yoshua Bengio一起獲得了2018年的圖靈獎,并稱為“深度學習三巨頭”,
成功背后——在被問及深度學習的冬天時,LeCun說道,我一直堅信這些方法總有一天會回到大家的視野中,大家會學會如何用它們,解決一些實際問題,我一直有這個信念,
研究者的結晶
我個人剛接觸深度學習并沒有太長時間,同許多人一樣,也是看著吳恩達老師的視頻“長大”的,慶幸的是,我們學校有自組織的深度學習小組,所以在一定程度上講,我并非是完全的自學,這一點我認為還是很重要的——眾人的智慧總是比個人來得強大,同樣,LeNet5也并非純粹的個人成果,其中也汲取了時代的經驗,此外,我認為,有些人學深度學習都是沒有“根”的(有點狂妄了),這里所講的“根”便是歷史的概念,高中時候學歷史總感覺興味索然,認為歷史無用,理科才是有“料”的;但反觀物理學,了解物理的發展史是基本的素養,深度學習也是一樣,當視頻中講到擬合、誤差函式、梯度下降等概念的時候,總以為學到了一些很先進的概念,其實回顧歷史,這些東西早在上世紀中期就差不多有了,
這一節主要講的是在LeNet5提出前當時已有一些重要成果,也只是蜻蜓點水一般地描述,不會過度深入地解釋,一來是自己的底子薄弱,二來也并非是文章的主旨,
Loss and Gradient
神經網路的訓練實質上就是網路權重的更新調整,現在的網路基本都采用計算損失函式結合梯度下降來更新引數,有趣的是,最早具備這種特征的演算法在70年前差不多就存在了,該演算法被稱為Delta學習規則,其修正公式是$\omega_{ij}(t+1)=\omega_{ij}(t)+\alpha(d_i-y_i)x_j(t) $,其中,$\alpha$為學習速率,$d_i$和$y_i$為神經元i的期望輸出和實際輸出,$x_j(t)$為神經元j的狀態(神經元i輸入),可以發現,這跟我們現在的權重更新是很相似了,只是Delta學習規則是針對單層網路而言的,對于多層網路的權重更新,當時的人還是一頭霧水,
不過從那時起到現在,人們對于如何從資料中學習的基本思想是一致的——無論什么樣的網路,我們都希望,實際的輸出和期望的結果間的差別最小(損失函式的內涵所在),而影響損失函式的便是網路的權重,所以可借助損失函式的梯度,來衡量引數對損失函式值的影響力大小,進而更新權重(梯度更新的內涵),
Training error and Test error
在LeNet5論文中,作者曾談到一個經驗公式:

$E_{test}$和$E_{train}$分別表示測驗集和訓練集的誤差;$k$和$\alpha$都是常數,$h$是網路復雜度水平,$P$表示資料集的大小,這個簡單公式實際上可以當做是整個深度學習研究的潛在定律:首先,對深度學習有過了解的人都知道隨著網路復雜度的增加,對訓練集的擬合效果會越來越好,也就是訓練集誤差會下降,公式也驗證了這個常識,那么這種情況下的測驗集誤差呢,一開始可能也是下降的,但下降的速度一般都比訓練集慢,這就牽扯到網路的泛化能力了,假如復雜度再增加,如果資料集大小不變的話,很可能就會有過擬合問題冒出來,再來看資料集大小的影響,隨著$P$的增大,測驗集誤差會無限接近訓練集的誤差,這往往是研究者們期望看到的結果,
在實際訓練時,我們既想要訓練集誤差的下降,又想要測驗集誤差盡可能接近訓練集誤差,這就對硬體的性能和資料獲取提出了巨大的挑戰,即使在今日,我們也沒辦法將這兩項都做到極致,力所能及的只是做到兩者的平衡罷了,這也是當時研究者所能看到的狀況,
SGD
神經網路發展程序出現了很多的梯度下降法,其中有很多好的演算法可以加快下降、更容易找到全域最小值,比如現在普遍使用的Adam,但在90年代用的比較多的還是隨機梯度下降SGD,SGD從60年代開始便有在研究了,只是到了80年代中期才被應用到網路上,總的來說,SGD每次采用個別樣本來更新權重,這使得計算量減少了很多,收斂得也更快,不容易困在區域最小值里出不來,當然前提是訓練集得足夠大,稀釋噪聲帶來的影響,
Back-Propagation
LeNet的出現或者CNN的發展都要感謝反向傳播演算法的提出,在反向傳播演算法提出以前,梯度下降都只能應用于線性網路中,因為人們無法很方便地求解多層網路間對引數的導數,反向傳播實質上是鏈式法則的應用,相信一些像我一樣的深度學習的初學者對反向傳播的程序也不是很熟悉——現在的框架像TensorFlow具備了自動求導的功能,根本不需要手動一層層地向前求導了,之前知乎上看到胡淵鳴大神一篇文章講述了自己曾被鏈式求導法則折磨了很久,于是最后將其開發的模擬器命名為ChainQueen來紀念那段經歷,可知鏈式求導可不是說說那么簡單的呀!
其實還有很多的技術可以一一說來的,但是精力和能力有限,這里不再敘述了,有興趣的可以看看LeNet5論文,包含了很多當時的研究狀況,
為什么是“卷積”
我們經常討論一些很有意思的為什么,比如:“為什么自然選擇人成為高等生物”、“為什么民主和法治是制度發展的趨勢”、“為什么華為能成為行業的領先者”等等,這些問題似乎都遵循了物競天擇的道理,在卷積網路出現前,普遍使用的都是全連接的形式,卷積憑借什么特性能夠獨樹一幟呢?本節將講述卷積網路的基本概念和優越之處,
全連接的敗因
針對2D影像識別的全連接網路,首要的問題便在于引數過多,試想一下,一張32*32像素大小的手寫字符圖片作為第一層輸入,假使第二層神經元數量只有100個,那么需要訓練的數量就已經達到32*32*100=102400個了,何況一般的網路層數都要在3層以上,對于全連接網路,網路的連接數等于要訓練的引數個數(不考慮偏置的話),一方面網路復雜性的提高是必須的,但是引數增加的同時所需要的訓練資料也必須增加,否則就容易過擬合,因此全連接層帶來的引數增長和過擬合問題在當時是著名的難題,
其次就是網路不具備特征不變性,最簡單的例子就是,如果你拿一批字符都在中間的資料去訓練的話,即使測驗時準確率有多高,如果用一批字符都偏左邊的資料去測驗,那么得到的結果將大跌眼鏡,其中原因就在于全連接層是順序輸入的,非常依賴于特征的位置資訊,因此導致了它對平移、形變、扭曲等幾何變換非常敏感,
進一步地說,因為全連接層是每個像素單獨對應一個權重,而影像特征大多都是相鄰像素的組合,這種做法顯然忽視了圖片像素的拓撲結構,就像是“管中窺豹”一般,再打個有趣的比方,我讓你去識別一個數字,但規定了你一次只能看圖片里的一個像素,這顯然是故意為難你啊!
區域感受野
要了解卷積網路,就必須先了解什么是感受野,這個概念最早是在1959年的對貓的初級視皮層的一項研究中提出的,卷積網路便是受到了它的啟發,
我們可以通俗地將感受野理解為眼睛所能看到的區域,比如說,眼睛可以看到整個圖片的內容,那感受野就是一張圖片那么大;如果也讓這只眼睛來次“管中窺豹”,那感受野就可能減少為幾個像素的大小了,例子的后者就可以認為是區域感受野,因為只能看見圖片的一部分,現在,我們將網路的每一個神經元都看作一雙雙眼睛,那么情景就如下圖一樣,每雙眼睛觀察的地方都不一樣,但視野大小相同,最終整個圖片都會被窺看一盡,

看的程序并非是漫無目地賞景,而是對視野內的像素作加權運算,感受野每個位置都有權重值,這些權重值就是網路的訓練引數,加權所得的值作為這只“眼睛”的值,然后感受野會平移一定像素距離,這個距離稱為步長,移動后的感受野再次加權運算,結果作為另一只“眼睛”的值,這樣,前一層的圖就會映射成新的圖,這個圖叫做特征圖,
這就是區域感受野,相比于全連接,它同時考慮某個區域區域,這樣更容易提取到想要的特征,
共享權重
為什么叫做“特征圖”呢?如果有接觸過影像處理的話,會知道卷積在影像平滑、邊緣等方面應用很多,一種權重的感受野(以下簡稱“一種感受野”)可能會“感受”到邊緣特征,另一種感受野可能會“感受”到拐角特征,對于一張特征圖來說,因為都是由同一種感受野觀察到的,因此很可能就是一張某種特征的集合,只是這些特征分布在前一層圖的不同位置,
我們將之前的模型推廣一下,如下圖所示,前一層圖具有3個通道,在卷積的程序中,感受野不再是二維,而變成了三維形式,包含的權重引數也就有3*3*3=27個,感受野每平移一次,27個像素值線性加權,結果作為這只“眼睛”的值,卷積完畢后得到一個新特征圖,在實際應用中,通常對前一層圖卷積多次,每次使用不同的感受野,以獲得多種特征,比如卷積4次,那么總共就用了4種三維感受野,得到4種特征,

共享權重就體現在每次卷積只使用一種感受野,之所以將感受野變成三維模式,可以這么理解:在多層卷積網路中,某層網路有n通道的特征圖,也就有n種特征;對該層卷積就是對這n個特征進行組合,獲取更高維特征的程序,因而三維感受野的線性加權相當于特征的組合,權重不同,組合方式也不同,
再來算一下所產生的引數量,假設卷積4次,步長為1,感受野大小為3*3,前一層圖大小為32*32,有3個通道,將感受野擴展為三維形式,一個感受野有3*3*3+3=30個引數(加上每個感受野有個偏置引數),于是總引數量為30*4=120個,經過卷積后生成的特征圖大小為30*30(感受野不能超過圖的邊界,因此少了兩行兩列),共4個通道,那就有4*30*30個“眼睛”,每個眼睛在卷積時都有27+1根連接線,所以總連接數為4*30*30*28=100800,可以看到,在保持網路復雜性的同時,有效降低了需要訓練的引數,這就是共享權重帶來的好處,
下采樣
向后層網路傳遞時,特征圖的大小總是不斷縮減,而通道不斷增加的,這樣做使得特征越來越多,越來越重要,而位置資訊越來越少,事實上,物體的識別何嘗不是這樣的呢?例如,我們判斷一個動物是不是貓,根本就不用在意它體型多大,是肥的還是瘦的;不用在意它坐在桌上,還是躺在床上,而是去看它的胡須、耳朵、鼻子等等的細節特征,再比如判斷一個數字是不是7,我們會看它的三個端點的相對關系,至于它多少大、寫得多少歪那只不過是審美上的事罷了,卷積網路更是這樣,在最后幾層的特征圖里,你根本看不出是個啥玩意兒,因為太高維了!
卷積網路的這個特性在一定程度上要歸功于下采樣操作,它類似于卷積,不過不含權重,一般對每個通道都在感受野內選擇最大值或者均值作為結果,因此下采樣后特征圖的大小會減小,但通道數仍不變,這種操作類似于將一張圖片進行縮小,在縮小時主動丟失了一些像素資訊,但是整體上看內容基本上沒有發生變化,
很多教程上說,下采樣有三種功效:一定程度的特征不變性、防止過擬合和減少引數量,最后一個功能是顯而易見的,過擬合在引數減少情況下也相對難以出現,但是關于特征不變性我還不能很好理解(大佬如果知道,可以教教我),只能這樣解釋:下采樣建立了一種激勵機制,越有幫助的特征其值便越大,這通過網路的反饋和權重的調整應該是可以做到的,既而特征所處的位置就不再敏感,形變的輸入也會因為這種機制凸顯出所要的特征,
LeNet-5

LeNet-5是為手寫字符的識別專門而生的,LeCun后來也建立了MNIST資料庫供人們使用,現在初學者一般都會拿這個資料集下刀,跑這個資料集的話,我還是很想建議用全連接層和LeNet-5跑一下的——用過笨辦法,你才知道智慧是怎么來的,
LeNet-5當時用的圖片大小是32*32的,這個跟現在的不一樣,現在直接就是28*28了,其實32*32也是LeCun他們自己從28*28擴出來的,而現在的邊緣處理由框架直接可以實作了,LeNet采用的是最原始的卷積下采樣交替,全連接輸出的結構,
輸入的影像像素值都經過了嚴格的歸一化處理,最后255對應了-0.1,0對應了1.175,歸一化的程序作者并未提及,只是說這樣處理后資料的均值近似0,方差近似為1,這與現在的概念差不了多少,
C1層、S2層很普通就不啰嗦了,C3層采用了很怪異的區域連接,就是每次卷積并非都對全部通道進行,而是有選擇的進行,具體配置請看下圖,至于這樣有選擇的進行特征組合是否有意義呢?很不好說,至少現在的網路都不這么做了,不過,這里有個很有趣的點——假如讓LeCun在中間再加一層卷積,他還會不會這么干?表示很好奇,

S4也略過,因為輸入大小的巧合,所以C5層已經是被展平了,但是在結構上仍表示一層卷積,因此作者沒有把它標成F5,圖中的高斯連接涉及到了當時的RBF演算法,類似于現在的softmax,這里也不深入探究了,
另外,除了輸出層以外的層都采用了tanh型激活函式,在當時,sigma函式的缺點就已經被發現了,還有一個不同點就是,LeNet的下采樣層也是有訓練引數的,當時他采用的還是平均值采樣,再乘以一個權重值,
后記
最近正在學習卷積神經網路,打算好好琢磨一下這幾年出現的經典網路,深度學習是一個很“玄學”的研究,有很多地方都值得去思考深究,之前看到有人問一個只專于影像處理演算法研究的博主,為什么不去搞深度學習,博主評論道,如果你不去原理上研究深度學習,那這就是個調參的東西,沒什么意思,
我前兩天糾結要不要好好看一下LeNet論文,要不要寫這樣一篇回顧性的文章,畢竟LeNet對于現在來講已經不怎么用了,就像前文提到的,你是傾向于緊追潮流,還是愿意先回頭瞥一眼歷史,這個話題在飛速發展的今天顯得挺有意思,后來整理程序中,我覺得歷史還是很重要的,歷史能幫助我搞清楚自己研究這個的目的,是為了有一技之長,還是為了什么?
這里分享LeCun的一段話:
AI 這個領域和我剛剛進入的時候已經完全不一樣了,我覺得這個領域現在有一點很棒,就是想要在一定程度上參與進來是很簡單的一件事,我們現在有很多簡單好用的工具,TensorFlow、PyTorch 等等一大堆,自己家里隨便一個什么電腦就能運行得起來,然后訓練一個卷積網路或者回圈神經網路做任何想做的事情,除了這些工具,也還有很多線上的教學資源可以學習,沒有什么門檻,高中生都能玩得轉,我覺得這棒極了,而且現在的學生里對機器學習、AI 感興趣的也越來越多,年輕人也能喜歡真的很好,
我的建議是,如果你想要進入這個領域的話,做出一些幫助,比如在開源專案里貢獻一些代碼,或者實作某個網上找不到代碼的標準演算法,這樣別人就有得用了,你可以就找一篇你覺得重要的論文,把演算法實作出來,然后做成開源的代碼包,或者貢獻到別的開源代碼包里,如果你寫的東西有趣、有用,就會有別人注意到你,你非常想去的公司可能會發 offer 給你,你很想讀博的地方也可能給你回信,之類的,我覺得這是一種很好的開頭方式,
最后,還是得感謝大家的閱讀!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/51658.html
標籤:其他
