1. 程式人生 > >卷積神經網路改進想法初探(上篇)

卷積神經網路改進想法初探(上篇)

最近一直在看卷積神經網路,想改進改進弄出點新東西來,看了好多論文,寫了一篇綜述,對深度學習中卷積神經網路有了一些新認識,和大家分享下。

其實卷積神經網路並不是一項新興的演算法,早在上世紀八十年代就已經被提出來,但當時硬體運算能力有限,所以當時只用來識別支票上的手寫體數字,並且應用於實際。2006年深度學習的泰斗在《科學》上發表一篇文章,論證了深度結構在特徵提取問題上的潛在實力,從而掀起了深度結構研究的浪潮,卷積神經網路作為一種已經存在的、有一定應用經驗的深度結構,重新回到人們視線,此時硬體的運算能力也比之前有了質的飛躍,要晶片有晶片要GPU有GPU,還有開源的Caffe框架,於是CNN就起來了。

縱觀目前已經發表的有關CNN方面的文獻,多是側重應用領域。國內期刊上有關CNN的期刊發表得並不多,一般都是從2012年之後開始出現,而且四大學報對CNN方面的文章發表力度還並沒有想想中的大,不知道是大家不願意投呢,還是期刊那對這個領域的東西持猶豫態度,不過CNN方面的學術論文可是非常多,可見很多學校,很多老師,很多學生都在搞這個。國外方面對於CNN的論文就相對多一些了,影象識別,語音識別等方面都有涉獵,與國內不同的是國外發表的文獻在理論方面下的功夫要多一些,國內一般都是直接把CNN直接拿來用,老方法新問題,而且效果還不錯,可見CNN作為深度學習的重要成員,確實很強。

之前一直想著怎樣對傳統CNN進行改進,看了看大家的工作,改進的方向無非是要麼在結構上改,要麼在訓練演算法上改,目前CNN的改進基本上都在遵循著這個框架。

一、在結構上的改進

  傳統的CNN本質上是一個對映的堆疊,圖下圖所示這裡寫圖片描述

之所以說它是傳統,主要是它對輸入形式、卷積核、級聯形式、初始化方法都沒有嚴格要求,就使用最原始的卷積核,隨機初始化。當然也正是因為他的傳統、原始,才使得其有改進的空間。下面說說已有的比較成功的改進方法。

  1、在網路輸入上下功夫。傳統的CNN呢,直接把圖片作為資料輸入進去了,從道理上講剛好符合稀疏表示理論中“畫素本身是影象語音最冗餘的表示”的觀點,但是大家還是希望對影象進行一些預處理,畢竟機器視覺比不上人眼,人的肉眼看東西時可能一下完成了好多種模式分類的工作,而我們在做研究時,一次一般也就研究一種或者幾種特定的模式分類問題。既然問題是特定的,理論上必然會有對付這種問題的特效藥,就好比我們要識別白紙上的毛筆字,沒必要把整張紙都送進去操作,那樣確實資訊夠全,但是速度太慢,反過來想想,要是條件理想,說不定直接閾值化一把就OK了,雖然資訊損失了不少,但重要的資訊還在,速度也快,正確率也可以接受,因此需要對影象預處理。可見,並不是所有的問題都是直接把影象直接以輸入就OK了,做些預處理還是很有必要,比如顏色分層處理、構建尺度金字塔、提取點什麼特徵(Gabor、SIFT、PCA等等),都是可以的,因問題而已。有人在用CNN做顯著性檢測時就是把影象先進行了一把超畫素分割,然後把分割後的超畫素作為新的網路輸入,而且是三個通道同時輸入,如下圖:
  這裡寫圖片描述

2、特徵融合上下功夫。傳統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非常重要的一項改進,原因非常簡單,深度學習需要海量資料,對海量資料進行標註可不是一項簡單的工作,更不用說想表情、美麗度等等這種抽象標註了。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.

 CNN作為深度學習中應用最為廣泛的網路模型,最有影響力之一的應用應該算是香港理工大學王曉剛教授團隊提出的DeepID人臉識別演算法,其三代演算法已經達到了99%,確實厲害。以上就是我這一個月來對CNN的理解了,欠妥地方歡迎大家指正,一起討論,另外由於部落格,對很多演算法提出並未給出原始參考文獻,需要查閱相關參考文獻的可以留言給我。