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