近期一直在看卷積神經網絡,想改進改進弄出點新東西來。看了好多論文,寫了一篇綜述。對深度學習中卷積神經網絡有了一些新認識,和大家分享下。
事實上卷積神經網絡並非一項新興的算法。早在上世紀八十年代就已經被提出來,但當時硬件運算能力有限,所以當時僅僅用來識別支票上的手寫體數字,而且應用於實際。
2006年深度學習的泰斗在《科學》上發表一篇文章,論證了深度結構在特征提取問題上的潛在實力。從而掀起了深度結構研究的浪潮,卷積神經網絡作為一種已經存在的、有一定應用經驗的深度結構。又一次回到人們視線,此時硬件的運算能力也比之前有了質的飛躍,要芯片有芯片要GPU有GPU,還有開源的Caffe框架。於是CNN就起來了。
縱觀眼下已經發表的有關CNN方面的文獻,多是側重應用領域。國內期刊上有關CNN的期刊發表得並不多。一般都是從2012年之后開始出現,並且四大學報對CNN方面的文章發表力度還並沒有想想中的大,不知道是大家不願意投呢,還是期刊那對這個領域的東西持猶豫態度,只是CNN方面的學術論文但是非常多,可見非常多學校,非常多老師。非常多學生都在搞這個。國外方面對於CNN的論文就相對多一些了,圖像識別。語音識別等方面都有涉獵,與國內不同的是國外發表的文獻在理論方面下的功夫要多一些,國內一般都是直接把CNN直接拿來用,老方法新問題,並且效果還不錯,可見CNN作為深度學習的重要成員。確實非常強。
之前一直想着如何對傳統CNN進行改進。看了看大家的工作,改進的方向無非是要么在結構上改,要么在訓練算法上改,眼下CNN的改進基本上都在遵循着這個框架。
一、在結構上的改進
傳統的CNN本質上是一個映射的堆疊。圖下圖所看到的
之所以說它是傳統,主要是它對輸入形式、卷積核、級聯形式、初始化方法都沒有嚴格要求。就使用最原始的卷積核,隨機初始化。當然也正是由於他的傳統、原始,才使得其有改進的空間。以下說說已有的比較成功的改進方法。
1、在網絡輸入上下功夫。傳統的CNN呢,直接把圖片作為數據輸入進去了,從道理上講剛好符合稀疏表示理論中“像素本身是圖像語音最冗余的表示”的觀點,可是大家還是希望對圖像進行一些預處理,畢竟機器視覺比不上人眼。人的肉眼看東西時可能一下完畢了好多種模式分類的工作,而我們在做研究時,一次一般也就研究一種或者幾種特定的模式分類問題。
既然問題是特定的。理論上必定會有對付這樣的問題的特效葯,就好比我們要識別白紙上的毛筆字,不是必需把整張紙都送進去操作,那樣確實信息夠全,可是速度太慢。反過來想想,要是條件理想。說不定直接閾值化一把就OK了,盡管信息損失了不少,但重要的信息還在。速度也快。正確率也能夠接受,因此須要對圖像預處理。可見,並非全部的問題都是直接把圖像直接以輸入就OK了,做些預處理還是非常有必要,比方顏色分層處理、構建尺度金字塔、提取點什么特征(Gabor、SIFT、PCA等等),都是能夠的,因問題而已。
有人在用CNN做顯著性檢測時就是把圖像先進行了一把超像素切割,然后把切割后的超像素作為新的網絡輸入,並且是三個通道同一時候輸入。例如以下圖:


他是把各個層的映射結果PCA降維后融合到一起的,效果不錯。
3、在卷積核上加限制。
前面說過。傳統CNN就是單純的卷積核,於是我們想。能不能把那些卷積核改成Gabor核呢?小波核行不行?稀疏映射矩陣是不是也能夠。只是那時候的神經網絡就不能再叫卷積神經網絡了,預計就應該叫深度Gabor卷積網絡了吧,重要的是這點還沒有人做,說不定以后能夠下下功夫,只是已經有人把卷積核改進到加權PCA 矩陣。做出深度特征臉卷積神經網絡了。結構例如以下圖:

這個看上去有點復雜,事實上就是先對圖像進行分塊。然后將每一個小塊都送入深度網絡中進行映射,映射核即為加權PCA矩陣,然后將每層映射結果經過碼本聚合。得到終於的特征表示形式。事實上這樣的針對特定問題構建特定映射核的方法在理論上是有道理的。比方說之前的場景分類,用Gist特征有奇效。那就最好還是將卷積核改為Gist核,事實上也就類似於Gabor核。弄個深度Gist卷積神經網絡來解決場景分類問題。說不定就會有更好的效果,科研重在實驗嘛。事實上這樣的卷積核的改進和曾經的傳統CNN已經有了非常大差別。主要是抽象的借鑒了深度結構的概念,只是我覺得這也正是深度學習的精髓所在。
4、與其它分類器結合。
卷積神經網絡能夠看做是特征提取與分類器的結合體,單從它的各個層的映射來看,類似於一個特征提取的過程,提取了不同層次的特征。
但假設映射來映射去,最后就映射到幾個標簽上,則它又有了分類的功能。但我更傾向於把CNN看成是一個特征提取的手段。那既然是特征提取,就必定要搭配一些好的分類器了,SVM、稀疏表示分了器,都不錯,相信兩者結合肯定能取得好的效果,只是這部分工作眼下沒有多少人做。不知道為什么。
二、在訓練算法上的改進
一提到算法的改進,涉及到很多其它的是理論的部分,難度比較大。眼下已有的改進主要體如今兩個方面:一是對非線性映射函數的修改。二是網絡訓練的無監督化
1、非線性映射函數改進
在CNN每一個映射層之后其結果都會經過一個非線性函數處理,主要是調整映射結果的范圍。
傳統CNN一般採用sigmoid函數或雙曲正切函數(tanh)。后來稀疏表示興起了,人們發現稀疏的東西效果都比較好,因此我們希望卷積層的映射結果也能盡量稀疏一點。更接近人的視覺反應。對非線性函數的一個最成功的改進就是糾正線性單元(Rectified Linear Units,ReLU),其作用是假設卷積計算的值小於0,則讓其等於0,否則即保持原來的值不變。這樣的做法所謂是簡單粗暴,但結果卻能得到非常好的稀疏性。實驗說明一切。
2、訓練算法的無監督化
事實上訓練算法的無監督化改進是CNN很重要的一項改進。原因很easy,深度學習須要海量數據,對海量數據進行標注可不是一項簡單的工作,更不用說想表情、漂亮度等等這樣的抽象標注了。CNN的無監督改進眼下比較成功的僅僅有少數幾個方案,當中最具代表性的應該算是2011年J Ngiam等人提出稀疏濾波(Sparse filtering)算法,通過構建特征分布矩陣(feature distributions)。對矩陣依照特征方向求解一次稀疏優化問題。同一時候對每一個樣本的特征進行L2范數歸一化,終於得到一個具有樣本分布稀疏性((Population Sparsity)、激活時間稀疏性(Lifetime Sparsity)以及高離散性(High Dispersal)等特點的樣本分布矩陣。並指出能夠通過將這些樣本分布矩陣進行多層級聯擴展。形成無監督深度學習模型。
事實上這有點像稀疏表示的一點延伸。說白了就是把卷積核改成稀疏字典了,舍棄了原來的BP算法。既然不依賴BP了。自然也就能夠實現無監督。稀疏濾波算法在這里一兩句話也說不清楚,在這里推薦兩篇文獻。一個是作者的原始文獻,還有一個是它的應用,這兩篇文獻在谷歌都能夠下載得到。要是登陸谷歌出現困難的話再這里給大家提供一種穩定的登陸方法,一個月10元也不貴。
(1)Ngiam, Jiquan,Koh Pang Wei,Chen Zheng hao,Bhaskar Sonia,Ng Andrew Y. Sparse filtering,[C]. Advances in Neural Information Processing Systems 24: 25th Annual Conference on Neural Information Processing Systems,2011:1125-1133.
(2) Zhen Dong,Ming tao Pei,Yang He,Ting Liu,Yan mei Dong,Yun de Jia. Vehicle Type Classification Using Unsupervised Convolutional Neural Network,[C]. Pattern Recognition (ICPR), 2014 22nd International Conference on,2014:172-177.
FQ地址:點擊打開鏈接
CNN作為深度學習中應用最為廣泛的網絡模型,最有影響力之中的一個的應用應該算是香港理工大學王曉剛教授團隊提出的DeepID人臉識別算法。其三代算法已經達到了99%,確實厲害。以上就是我這一個月來對CNN的理解了。欠妥地方歡迎大家指正,一起討論,另外因為博客,對非常多算法提出並未給出原始參考文獻,須要查閱相關參考文獻的能夠留言給我。