你所不能不知道的CNN
說起CNN,最初人們想到的都是某電視臺(tái),但等過幾年,人們想起的多半是深度學(xué)習(xí)了。
應(yīng)該說, CNN是這兩年深度學(xué)習(xí)風(fēng)暴的罪魁禍?zhǔn)祝?自2012年, 正是它讓打入冷宮的神經(jīng)網(wǎng)絡(luò)重見天日并且建立起自己在人工智能王國的霸主地位。
如過你認(rèn)為深度學(xué)習(xí)是只能用來理解圖像的,你就大錯(cuò)特錯(cuò)了, 因?yàn)樗挠猛咎珡V了,上至文字,中有圖像, 下至音頻, 從手寫數(shù)字識(shí)別到大名鼎鼎的GAN對(duì)抗學(xué)習(xí), 都離不開它。
不過要了解CNN,還是拿圖像做例子比較恰當(dāng)。一句話來說CNN圖像處理的本質(zhì),就是信息抽取, 巨大的網(wǎng)絡(luò)可以抽取一步步得到最關(guān)鍵的圖像特征, 我們有時(shí)也叫自動(dòng)的特征工程。
CNN的建造靈感來自于人類對(duì)視覺信息的識(shí)別過程。 人腦對(duì)物體的識(shí)別的***個(gè)問題是: 對(duì)應(yīng)某一類對(duì)象的圖像千千萬, 比如一個(gè)蘋果, 就有各種狀態(tài)的成千上萬狀態(tài), 我們識(shí)別物體的類別,事實(shí)上是給這成千上萬不同的圖片都打上同一個(gè)標(biāo)簽。
物理里管這種一個(gè)事物的結(jié)果與一些列的變化都沒有關(guān)的特性,叫不變性, 比如如果你轉(zhuǎn)動(dòng)一個(gè)蘋果任何一個(gè)角度它都是蘋果, 這就是蘋果有旋轉(zhuǎn)不變性,但是數(shù)字6就不行, 如果你給它旋轉(zhuǎn)特定角度它就變成9了, 它就沒有旋轉(zhuǎn)不變性。
我們?nèi)送ǔ?梢詿o視這些變化認(rèn)出事物來,也就是把和這種變化有關(guān)的信息忽略。如果我們對(duì)圖像進(jìn)行識(shí)別, 事實(shí)上我們的算法就要有人的這種本領(lǐng), 首先讓它學(xué)會(huì)什么東西與真實(shí)的物體信息是無關(guān)的。
就拿數(shù)字識(shí)別舉個(gè)例子吧, 一個(gè)數(shù)字是什么,雖然與旋轉(zhuǎn)的角度有關(guān)系, 但與它在圖片中的上下左右沒關(guān)系, 我們管這種不變性叫平移不變性。
解決這個(gè)問題,最粗暴的一個(gè)方法是制造很多的樣本,比如把“1” 放在很多不同的位置,然后讓機(jī)器在錯(cuò)誤中學(xué)習(xí)。 然后窮盡所有的位置, 不過我相信沒有人是這么完成對(duì)物體的識(shí)別的。
那怎么辦?CNN中的卷積正是這一問題的答案,因?yàn)榫矸e操作本身具有平移不變性(我知道聽起來不明覺厲 ,請看下文)。
卷積,顧名思義, “卷”有席卷的意思,“積“ 有乘積的意思。 卷積實(shí)質(zhì)上是用一個(gè)叫kernel的矩陣,從圖像的小塊上一一貼過去,一次和圖像塊的每一個(gè)像素乘積得到一個(gè)output值, 掃過之后就得到了一個(gè)新的圖像。我們用一個(gè)3*3的卷積卷過一個(gè)4*4的圖像, 看看取得的效果。
一個(gè)卷積核就像一個(gè)小小的探測器, 它的DNA是被刻錄在卷積核的數(shù)字里的, 告訴我們它要干什么, 而卷積核掃過圖片,只要它的DNA是不變的,那么它在圖片上下左右的哪個(gè)位置看到的結(jié)果都相同, 這變是卷積本身具有平移不變性的原理。 由于這種不變性, 一個(gè)能夠識(shí)別1的卷積在圖片的哪個(gè)位置都可以識(shí)別1,一次訓(xùn)練成本,即可以對(duì)任何圖片進(jìn)行操作。
圖像處理領(lǐng)域,卷積早已有另一個(gè)名字 , 叫做濾鏡,濾波器, 我們把圖像放進(jìn)去,它就出來一個(gè)新圖像,可以是圖像的邊緣,可以是銳化過的圖像,也可以是模糊過的圖像。
如果大家玩過photoshop, 大家都會(huì)發(fā)現(xiàn)里面有一些濾鏡,比如說銳化,模糊, 高反差識(shí)別這一類,都是用著類似的技術(shù),這樣的技術(shù)所作的事情是圖像的每個(gè)小片用一個(gè)矩陣進(jìn)行處理,得到一個(gè)畫面的轉(zhuǎn)換 。 我們有時(shí)候會(huì)說低通和高通濾鏡 ,低通濾鏡通??梢杂脕斫翟耄?而高通則可以得到圖像的細(xì)微紋理。 你玩photoshop,玩的就是卷積,卷積核里面的數(shù)字定了, 它的功能也就定了。
為什么這樣做有效果了?因?yàn)閳D像的特征往往存在于相鄰像素之間, kernel就是通過計(jì)算小區(qū)域內(nèi)像素的關(guān)系來提取局部特征,可以理解為一個(gè)局部信息的傳感器, 或物理里的算子。
比如提到的邊緣提取濾鏡, 它所做的物理操作又稱為拉普拉斯, 只有像素在由明亮到變暗的過程里它才得1, 其他均得0,因此它所提取的圖像特征就是邊緣。 事實(shí)上我們知道圖像中的信息往往包含在其邊緣,你給以一個(gè)人畫素描, 一定能夠完全識(shí)別這個(gè)人 。 我們通過尋找到信息的關(guān)鍵載體-邊緣, 而把其他多余的信息過濾掉,得到了比***層更好處理的圖像, 大大減少了需要搜索圖像的可能性。
常用于卷積的Kernel本質(zhì)是兩個(gè): ***, kernel具有局域性, 即只對(duì)圖像中的局部區(qū)域敏感, 第二, 權(quán)重共享。 也就是說我們是用一個(gè)kernel來掃描整個(gè)圖像, 其中過程kernel的值是不變的。這點(diǎn)就可以保證剛剛說的平移不變形。 比如說你識(shí)別一個(gè)物體, 顯然你的識(shí)別不應(yīng)該依賴物體的位置。 和位置無關(guān), 及平移不變。
那卷積如何幫你從不同的圖形中識(shí)別數(shù)字1了?數(shù)字的尖銳的線條會(huì)讓卷積的值很高(響起警報(bào))。無論你1出現(xiàn)在圖像中的哪一個(gè)位置, 我的局部掃描+統(tǒng)一權(quán)重算法都給你搞出來, 你用同一個(gè)識(shí)別1的卷積核來掃過圖片,voila,任何一個(gè)位置我都給你找出來。
那卷積和神經(jīng)網(wǎng)絡(luò)有什么關(guān)系了?答案是卷積掃過圖像,每一個(gè)卷積核與圖像塊相乘的過程,都可以看作是一個(gè)獨(dú)立的神經(jīng)元用它的神經(jīng)突觸去探測圖像的一個(gè)小局部,然后再做一個(gè)決策,就是我看到了什么或沒看到什么。整個(gè)卷積過程, 不就對(duì)應(yīng)一層神經(jīng)網(wǎng)絡(luò)嗎?啊哈, 整個(gè)卷積過程相當(dāng)于一層神經(jīng)網(wǎng)絡(luò)!
剛剛說了卷積是一個(gè)能夠?qū)D片中任何位置的同一類信息進(jìn)行抽取的工具, 那么我們還講到我們除了抽取, 還要做的一個(gè)工作是,取出重要信息,扔掉不重要的,實(shí)現(xiàn)這一個(gè)的操作,叫做pooling
但是大家注意,這個(gè)時(shí)候如果原圖像是28*28, 那么從kernel里出來的圖形依然是28*28, 而事實(shí)上, 事實(shí)是上, 大部分時(shí)候一個(gè)圖像的局部特征的變化都不會(huì)是像素級(jí)。我們可以把局部特征不變形看做一個(gè)假設(shè), 把這個(gè)假設(shè)作為一個(gè)數(shù)學(xué)公式加入到卷積層里幫我們過濾冗余信息, 這就是pooling所做的事情 -也就是扔掉你周邊得和你長得差不多得那些像素。
Pooling的本質(zhì)即降采樣,以提升統(tǒng)計(jì)效率,用一個(gè)比較冠冕的話說是利用局部特征不變性降維 ,pooling的方法很多,常見的叫做max pooling,就是找到相鄰幾個(gè)像素里值***的那個(gè)作為代表其它扔掉。
這樣經(jīng)過從卷積到pooling的過程, 在識(shí)別1的任務(wù)里,我們可以驗(yàn)明在每個(gè)小區(qū)域里有沒有存在邊緣, 從而找到可能存在1的區(qū)域。 在pooling的終結(jié)點(diǎn), 我們得到的是一個(gè)降低維度了的圖像,這個(gè)圖像的含義是告訴你在原有的圖像的每個(gè)區(qū)域里是含有1還是不含有1, 又叫做特征圖。
好了,我們可以從一堆圖片中識(shí)別出1了, 那么我們怎么搞定2呢? 我們把2寫成一個(gè)Z型, 你有沒有思路我們?nèi)绾巫龅竭@點(diǎn)? 我們不能只識(shí)別豎著的線條,還需要識(shí)別橫向的線條,記住,一個(gè)卷積層只搞定一個(gè)特征,如果你既要找豎線也要找橫線, 我們需要兩個(gè)不同的卷積層,并且把他們并聯(lián)在一起,
然后呢? 橫線對(duì)應(yīng)一張?zhí)卣鲌D, 豎線對(duì)應(yīng)另一個(gè)張?zhí)卣鲌D, 如果要識(shí)別2, 你無非需要比較這兩張?zhí)卣鲌D,看是否有哪個(gè)位置兩個(gè)特征圖同時(shí)發(fā)生了警報(bào)(既有橫線又有豎線)。
這個(gè)比較的過程,我們還是可以用一個(gè)卷積搞定(理由依然是平移不變性)!
這個(gè)時(shí)候, 新的卷積層對(duì)之前并連的兩個(gè)卷積的結(jié)果做了一個(gè)綜合, 或者說形成了一個(gè)特征之特征, 即橫向和豎線交叉的特征。
這里把我們的理論可以更上一層路。 深度意味著什么? 我們想一下, 要正確的識(shí)別一個(gè)圖像,你不可能只看變,也不可能只看邊角, 你要對(duì)圖像的整體有認(rèn)識(shí)才知道張三李四。 也就是說我們要從局部關(guān)聯(lián)進(jìn)化到全局關(guān)聯(lián), 真實(shí)的圖像一定是有一個(gè)全局的,比如手我的臉, 只有我的眼鏡,鼻子耳朵都被一起觀察時(shí)候才稱得上我的臉,一個(gè)只要局部,就什么都不是了。如何提取全局特征?
從一個(gè)層次到另一個(gè)層次的遞進(jìn), 通常是對(duì)上一層次做橫向以及縱向的整合(圖層間的組合或圖層之內(nèi)的組合或兩者),我們的特征組合是基于之前已經(jīng)通過pooling降低維度的圖層,因此事實(shí)上每一個(gè)神經(jīng)元決策的信息相對(duì)上一層都更多,我們用一個(gè)學(xué)術(shù)名詞 – 感受野來表述一個(gè)神經(jīng)元決策所涵蓋的像素多少, 上一層次看到更多的輸入神經(jīng)元, 因此感受野看更多了 。 越靠近頂層的神經(jīng)元, 所要做的事情就越接近全局關(guān)聯(lián)。
這和物理學(xué)的一個(gè)基本方法--尺度變換有著異曲同工之妙(我們后面講), 也是提取全局信息的一個(gè)非常核心的辦法,我管它叫級(jí)級(jí)遞進(jìn)法。 你一級(jí)一級(jí)的進(jìn)行對(duì)畫面進(jìn)行降采樣, 把圖像里的四個(gè)小格子合成一個(gè), 再把新的圖像里四個(gè)小格子合成一個(gè), 直到一個(gè)很大的圖像被縮小成一個(gè)小樣。每一層的卷積,都不是一個(gè)卷積,而是一組執(zhí)行不同特征提取的卷積網(wǎng)絡(luò),比如我剛剛說的 不同方向的邊緣溝成的一組卷積, 你可以想象后面有不同大小的角度組成的一組網(wǎng)絡(luò), 他體現(xiàn)了在一個(gè)空間尺度上我們所能夠達(dá)到的特征工程。
如此級(jí)級(jí)互聯(lián), 越靠上層感受野就越大。 整個(gè)CNN網(wǎng)絡(luò)如同一封建等級(jí)社會(huì),最上層的,就是君王,它是整個(gè)集團(tuán)唯一具有全局視野的人,下一級(jí)別, 是各大領(lǐng)主,然后是領(lǐng)主上的風(fēng)塵,騎士,知道農(nóng)民(底層神經(jīng)元)。
我們把剛剛的全局換一個(gè)詞叫抽象。深度卷積賦予了神經(jīng)網(wǎng)絡(luò)以抽象能力。 這樣的一級(jí)級(jí)向上卷積做基變換的過程,有人說叫搞基(深度學(xué)習(xí)就是搞基),深一點(diǎn)想叫表征, 和人的思維做個(gè)比喻就是抽象。 抽象是我在很深的層次把不同的東西聯(lián)系起來,CNN教會(huì)了我們事先抽象的一種物理方法。
到目前為止, 我所描述的是都是一些人工的特征工程,即使網(wǎng)絡(luò)在深,頂多說的上是深度網(wǎng)絡(luò),而與學(xué)習(xí)無關(guān)。我們說這樣一個(gè)系統(tǒng)(mxnxpxz), 我們要人工設(shè)計(jì),幾乎窮經(jīng)皓首也可能做的都是錯(cuò)的。我們說, 這樣的一個(gè)結(jié)構(gòu), 只能靠機(jī)器自己學(xué),這就是深度學(xué)習(xí)的本質(zhì)了, 我們通過幾條basic假設(shè)(正則)和一個(gè)優(yōu)化函數(shù),讓優(yōu)化(進(jìn)化)來尋找這樣一個(gè)結(jié)構(gòu)。 Basic假設(shè)無非圖像的幾個(gè)基本結(jié)構(gòu), 體現(xiàn)在幾個(gè)不變形上,物理真是好偉大啊。
深度學(xué)習(xí)的訓(xùn)練,就是計(jì)算機(jī)幫助人完成了機(jī)器學(xué)習(xí)最難的一步特征工程(特征工程本質(zhì)就是基變換啊)。以前人類窮盡腦汁思考如何做圖像識(shí)別, 是尋找人是如何識(shí)別圖像的, 希望把人能用來識(shí)別物體的特征輸入給計(jì)算機(jī), 但是現(xiàn)在通過深度卷積,計(jì)算機(jī)自己完成了這個(gè)過程。
卷積網(wǎng)絡(luò)在2012 年的發(fā)展趨勢, 大家可以關(guān)注幾個(gè)方向:
1, 更深的模型 : 從AlexNet到VCG19 ,High way network 再到殘差網(wǎng)絡(luò), 一個(gè)主要的發(fā)展趨勢是更深的模型。 當(dāng)你采用更深的模型,經(jīng)常你會(huì)發(fā)現(xiàn)一些神奇的事情發(fā)生了。 當(dāng)然網(wǎng)絡(luò)的寬度(通道數(shù)量)也在增加。
2, 更通暢的信息交換 : 深,帶來的***個(gè)問題是訓(xùn)練困難, 反向傳播難以傳遞。 從殘差網(wǎng)絡(luò), 到目前開始流行的Dense Network, 一個(gè)主要的發(fā)展趨勢是不同層級(jí)間的信息的交換越來越通暢。 我們逐步在不同層之間加入信息的直連通道。
3, 與監(jiān)督學(xué)習(xí)之外的學(xué)習(xí)方法的結(jié)合, 如遷移學(xué)習(xí), 半監(jiān)督學(xué)習(xí), 對(duì)抗學(xué)習(xí), 和強(qiáng)化學(xué)習(xí)。 后兩者的有趣程度遠(yuǎn)超監(jiān)督學(xué)習(xí)。
4, 輕量化, CNN網(wǎng)絡(luò)越來越深, 使得網(wǎng)絡(luò)的文件動(dòng)輒裝不下, 這點(diǎn)使得CNN網(wǎng)絡(luò)的輕量化部署成為重點(diǎn), 我們希望在性能和能耗中取中。 一個(gè)很好的辦法是對(duì)網(wǎng)絡(luò)權(quán)重進(jìn)行減枝,去掉不重要的權(quán)重, 另外一個(gè)是把每個(gè)權(quán)重的數(shù)據(jù)位數(shù)本身縮減,甚至是使用0和1表示, 雖然看上去我們丟失了很多信息, 但是由于巨大網(wǎng)絡(luò)中的信息是統(tǒng)計(jì)表達(dá)的,我們到底損失多大還真不一定。
以上是CNN的小結(jié), 不要以為圖像處理與你無關(guān),我剛剛說的其實(shí)一篇文章如果你把它轉(zhuǎn)化為一個(gè)矩陣無非一個(gè)圖像, 一段音頻你給它轉(zhuǎn)換成一個(gè)矩陣無非一個(gè)圖像, 你看, 都可以和CNN掛鉤。
我想說,無論你是做什么的, 無論是苦逼的計(jì)算機(jī)工程師, 游戲設(shè)計(jì)師,還是外表高大上的金融分析師,甚至作為一個(gè)普通消費(fèi)者, 你的生活以后都和CNN脫不開干系了 , 預(yù)知更多情報(bào)還請關(guān)注:
巡洋艦的深度學(xué)習(xí)實(shí)戰(zhàn)課程, 手把手帶你進(jìn)行深度學(xué)習(xí)實(shí)戰(zhàn), 課程涵蓋機(jī)器學(xué)習(xí),深度學(xué)習(xí), 深度視覺, 深度自然語言處理, 以及***特色的深度強(qiáng)化學(xué)習(xí),看你能不能學(xué)完在你的領(lǐng)域跨學(xué)科的應(yīng)用深度學(xué)習(xí)驚艷你的小伙伴,成為身邊人眼中的大牛。剛剛講的方法都將在課程里詳細(xì)展開。