卷積神經網絡CNN在天然語言處理中的應用

轉載:http://www.javashuo.com/article/p-mshodlbn-cd.html html

 卷積神經網絡(Convolution Neural Network, CNN)在數字圖像處理領域取得了巨大的成功,從而掀起了深度學習在天然語言處理領域(Natural Language Processing, NLP)的狂潮。2015年以來,有關深度學習在NLP領域的論文層出不窮。儘管其中一定有不少附庸風雅的水文,可是也存在不少經典的應用型文章。筆者在2016年也發表過一篇關於CNN在文本分類方面的論文,今天寫這篇博客的目的,是但願能對CNN的結構作一個比較清晰的闡述,同時就目前的研究現狀作一個簡單的總結,並對將來的發展方向作一個小小的指望。因爲筆者在深度學習方面的資歷尚淺,所以如文中出現錯誤,請不吝賜教。git

 一. CNN的結構闡述(以LeNet-5爲例)github

  我寫這一節的目的,並非從頭至尾的對CNN作一個詳細的描述,若是你對CNN的結構不清楚,我建議仍是先去看LeCun大神的論文Gradient-based learning applied to document recognition,並且,網上也有不少經典的博客,對CNN的結構和原理都作了比較深刻的闡述,這裏推薦zouxy大神的博客。這裏對結構進行從新闡述,主要是對一些入門的同窗可能會碰到的問題進行一些突出和討論,而且主要圍繞如下幾個問題展開(一看就懂得大神請繞道):算法

  1. CNN中的卷積的數學實現是什麼?這裏的卷積和數字信號處理的卷積是相同的嗎?
  2. CNN中哪些層須要進行激活?
  3. 在LeNet-5中,C1和C3最大的區別是什麼?
  4. CNN是如何進行訓練的? 

  咱們先來看LeNet-5的結構圖(LeNet共有3個C層2個S層,故被稱爲LeNet-5,若是算上F6和輸出層,則能夠被稱爲LeNet-7):網絡

  

  首先,咱們先對CNN中的一些概念作一遍梳理。尤爲須要注意的是Filter Window(卷積核的size,數字圖像處理中通常爲正方形),Feature Map(特徵圖,通常來講,對於每個Filter Window有幾個Feature Map,以捕捉不一樣的特徵)。從圖中咱們能夠看出,C1層的Feature Map是6,C3層的Feature Map是16,C5層的Feature Map是120,最後的F6至關於普通神經網絡的隱層,經過全鏈接和C5相連,最後經過Gaussian Connection將其轉換爲一個10分類的問題。app

  針對第1個問題,卷積到底是什麼。卷積這個玩意兒在數字信號處理中常常被說起,它的數學表達式以下:ide

  

  看到公式通常都比較頭疼,因此在這裏貼出來一個關於數字信號處理中的卷積的形象比喻:函數

  好比說你的老闆命令你幹活,你卻到樓下打檯球去了,後來被老闆發現,他很是氣憤,扇了你一巴掌(注意,這就是輸入信號,脈衝),因而你的臉上會漸漸地(賤賤地)鼓起來一個包,你的臉就是一個系統,而鼓起來的包就是你的臉對巴掌的響應,好,這樣就和信號系統創建起來意義對應的聯繫。下面還須要一些假設來保證論證的嚴謹:假定你的臉是線性時不變系統,也就是說,不管何時老闆打你一巴掌,打在你臉的同一位置(這彷佛要求你的臉足夠光滑,若是你說你長了不少青春痘,甚至整個臉皮到處連續到處不可導,那難度太大了,我就無話可說了哈哈),你的臉上老是會在相同的時間間隔內鼓起來一個相同高度的包來,而且假定以鼓起來的包的大小做爲系統輸出。好了,那麼,下面能夠進入核心內容——卷積了!學習

  若是你天天都到地下去打檯球,那麼老闆天天都要扇你一巴掌,不過當老闆打你一巴掌後,你5分鐘就消腫了,因此時間長了,你甚至就適應這種生活了……若是有一天,老闆忍無可忍,以0.5秒的間隔開始不間斷的扇你的過程,這樣問題就來了,第一次扇你鼓起來的包還沒消腫,第二個巴掌就來了,你臉上的包就可能鼓起來兩倍高,老闆不斷扇你,脈衝不斷做用在你臉上,效果不斷疊加了,這樣這些效果就能夠求和了,結果就是你臉上的包的高度隨時間變化的一個函數了(注意理解);若是老闆再狠一點,頻率愈來愈高,以致於你都辨別不清時間間隔了,那麼,求和就變成積分了。能夠這樣理解,在這個過程當中的某一固定的時刻,你的臉上的包的鼓起程度和什麼有關呢?和以前每次打你都有關!可是各次的貢獻是不同的,越早打的巴掌,貢獻越小,因此這就是說,某一時刻的輸出是以前不少次輸入乘以各自的衰減係數以後的疊加而造成某一點的輸出,而後再把不一樣時刻的輸出點放在一塊兒,造成一個函數,這就是卷積,卷積以後的函數就是你臉上的包的大小隨時間變化的函數。原本你的包幾分鐘就能夠消腫,但是若是連續打,幾個小時也消不了腫了,這難道不是一種平滑過程麼?反映到劍橋大學的公式上,f(a)就是第a個巴掌,g(x-a)就是第a個巴掌在x時刻的做用程度,乘起來再疊加就ok了,你們說是否是這個道理呢?我想這個例子已經很是形象了,你對卷積有了更加具體深入的瞭解了嗎?(轉自GSDzone論壇)ui

  其實,在數字信號處理中,卷積就是信號B與信號A錯開時間的內積,錯開的時間長度就是卷積結果的自變量。可是,CNN中,卷積操做的做用是突出特徵,將更明顯的特徵提取出來。那麼這兩個卷積是同樣的嗎?其實,在CNN中(尤爲在天然語言處理的過程當中),卷積的操做也是用一個公式來表示的:

至於這個公式中爲何會有連加,我在接下來的問題中進行闡述。f是一個激活函數,從這裏咱們能夠看出,CNN中的卷積層最後也是須要激活的。而w和x之間的點乘符號,其實就是兩個矩陣之間普通的點乘操做。因此,在LeNet5中,卷積其實就是要卷積的區域和卷積核的點乘和,加上偏置以後的激活輸出。可是這裏和數字信號處理中的卷積有什麼聯繫,以及爲何取名爲卷積,在這裏暫不討論,不過知道的朋友能夠留言,不勝感激。

  針對第2個問題,CNN中哪些層是須要激活函數的?剛纔我已經說了,在C層確實是須要激活函數的,那麼在其餘層須要嗎?且看下面的圖:

  在這個圖裏主要展示的是卷積操做和池化操做,可是都沒有體現f函數,即激活函數。其實,在卷積層和池化層,在最後都是須要加上偏置激活輸出的。可是,有些神經網絡在實現的時候,可能並不會去實現激活。好比,卷積操做直接將w和x的點積和做爲輸出,而池化操做直接使用1-max將top1的值輸出,而不進行激活操做。要知道,sigmoid,tanh以及ReLU等激活函數,能夠很是好的捕捉到非線性的特徵。所以,在LeNet5中,卷積層和池化層都會進行偏置激活。全鏈接層F6和普通神經網絡的隱層是同樣的,也是最後要激活輸出的,所以也須要激活函數。其實,CNN能夠理解爲,除了卷積操做和池化操做,其他的和NN沒有區別,最後只是跟了一個多分類器。所以,CNN的訓練也是基於BP算法,利用隨機梯度降低(SGD)進行參數訓練。

  針對第3個問題,C1和C3有什麼區別?其實沒有區別,可是有一點須要注意(這一點剛入門的同窗可能會忽略,容易想固然)。其實卷積操做均可以用上面的那個公式進行表示,可是公式裏的連加符號表示什麼呢?咱們先來看C1,C1的卷積想必很是好理解,對於每一個卷積核,會生成一個Feature Map,這個Feature Map在生成的過程當中,只用到了輸入圖像這一個Feature Map,而不涉及連加操做。可是,從S2到C3,因爲S2的Feature Map的數量是6,所以這時咱們再也不對S2的每個Feature Map都在C3生成Feature Map。C3中的每一個Feature Map是鏈接到S2中的全部6個或者幾個Feature Map的,表示本層的Feature Map是上一層提取到的Feature Map的不一樣組合。這比如人的視覺系統,底層的結構構成上層更抽象的結構,例如邊緣構成形狀或者目標的部分。一樣的原理,若是應用在NLP上,那麼在對一篇文檔進行分類的時候,這個操做能夠類比爲從句子級別的篇章理解上升到了從段落上的級別理解。理解了這一點,咱們能夠計算出每層所須要的參數,以下所示:

C1:6*(5*5+1) = 156, 對於每個Filter來講,卷積以後,要加一個bias,所以每個Filter會多一個bias;Map大小(32-5+1)*(32-5+1)=28*28

S2:6*(1+1) = 12, 在LeNet中,會經過avg pooling取出平均值,而後針對該值,進行加權偏置,激活輸出,所以1個Feature Map的pooling只須要2個參數;Map Size 14*14;

C3:C3層共有16個Feature Map,Filter Window的大小依舊是5*5,而且每個Feature Map和S2層的Map造成了全鏈接或者部分鏈接,所以須要根據狀況進行計算。例如,倘若在C3層,前6個Feature Map和S2層的4個Map相連,中間6個和S2層的4個Feature Map相連,最後4個和S2層的3個Feature Map相連,那麼總共須要的參數個數爲:6*(4*5*5+1)+6*(4*5*5+1)+4*(3*5*5+1) = 1440個參數。注意,這裏在組合的時候,是對S2每個相連的Map都訓練了一個單獨的w,最後在全部的wx的和上添加偏置。Map Size爲(14-5+1)*(14-5+1) = 10*10;以下所示:

S4:pooling size的大小依舊是2*2,則16個Feature Map的參數個數,同S2的計算方式,爲16*(1+1)=32個;Map Size爲5*5;

C5:C5層有120個Feature Map,Filter Window的大小依舊是5*5,而且要注意的是,C5和S4之間是全鏈接的,這是第一個全鏈接層,也就是C5中的每個1*1大小的Feature Map,和S4中16個Feature Map都有鏈接,那麼參數個數也能夠很容易的計算出來:120*(16*5*5+1)= 48120;此時,Feature Map的大小爲1*1,在這裏,這120個1*1大小的特徵圖,鏈接成一個向量,這便組成了C5;

F6:F6層就是普通神經網絡裏面的隱層,在這裏是爲了將120維的C5降維成84維的F6。F6中的每個神經元和C5也造成了全鏈接,這是第二個全鏈接層,所以須要訓練的參數個數爲:84*(120+1)=10164個;

Output層:輸出層由歐式徑向基函數(Euclidean Radial Basis Function)單元組成,每類一個單元,每一個有84個輸入。換句話說,每一個輸出RBF單元計算輸入向量和參數向量之間的歐式距離。輸入離參數向量越遠,RBF輸出的越大。一個RBF輸出能夠被理解爲衡量輸入模式和與RBF相關聯類的一個模型的匹配程度的懲罰項。用機率術語來講,RBF輸出能夠被理解爲F6層配置空間的高斯分佈的負log-likelihood。

  針對第4個問題,CNN如何進行訓練?卷積神經網絡的訓練其實和NN的訓練過程大致相似,都是採用基於BP算法的訓練方式,進行隨機梯度降低。首先,經過前向傳播計算各層節點的激活值,而後,經過後向傳播計算各層之間的偏差,若是遇到了pooling,若採用的是avg pooling,那麼相應的也就將偏差進行均分,反向傳播;若是是max pooling,那麼能夠只將相連的最大節點的偏差進行傳播,其餘節點偏差爲0;至於卷積操做,其實你仔細想一下的話,和普通的神經網絡沒啥子大的區別,無非就是權值共享了,由於若是是普通的神經網絡,那麼w通常針對的是全鏈接;而CNN是應用了權值共享減小參數個數,而且還進行了Feature Map之間的組合。

 二. CNN在天然語言處理中的應用

  卷積神經網絡在天然語言處理中又是如何應用的呢?接下來,我也想圍繞幾個問題做幾個比較基本的闡述:

  1. 在NLP中CNN的輸入能夠是什麼?
  2. 若是輸入是詞向量,每一行表明一個詞,那麼如何解決不一樣的文本長度不統一的問題?
  3. NLP中CNN的經常使用超參數設置都有哪些?
  4. 接下來CNN在NLP的研究還能夠從哪一個方向進行?

  首先,針對第1個問題,NLP中CNN的輸入能夠是什麼?其實,任何矩陣均可以做爲CNN的輸入,關鍵是採用什麼樣的方法。若是你使用one-hot represention,那其實就是0-gram,這樣輸入的矩陣的大小確定也是固定的(整個詞表的長度);若是採用word2vec,那麼每一行表明一個詞語,文檔中有多少個詞語,就有多少行。這裏,咱們再來回顧一下詞向量:其實它是神經語言機率模型[1]的一個副產品,不過能夠反映出詞語的語義信息。word embedding技術,主要分爲兩種思想,Hierarchical Softmax和Negative Sampling兩種,其中每種思想下又分爲兩種方法,CBow模型和Skip-Gram模型,關於word embedding的數學原理,這裏再也不贅述,能夠參考word2vec中的數學原理一文,這篇博文講的很清楚。這裏須要注意的是,word2vec通常經過pre-training的方式得到,好比google的word2vec就是從大量的文本中預訓練獲得的。你在CNN中使用的使用,能夠按照static和non-static兩種方式,若是是non-static的話,則代表你在訓練CNN的時候,須要對使用的word2vec作一個輕微的tuning。word2vec能夠算是CNN進行NLP應用時候的標配。

  針對第2個問題,如何解決不一樣的文本長度不統一的問題?這是一個很是顯然的問題,在LeNet-5中,每一個輸入都是32*32的圖像文件,這樣咱們才能設置固定大小和數量的filters,若是圖像分辨率發生了變化,那麼就會形成多餘的conv操做的結果丟失,從而對模型的結果產生影響,或者會使得網絡內部狀態發生混亂。在圖像處理中,能夠經過固定輸入的圖像的分辨率來解決,可是在天然語言處理中,因爲輸入的是文檔或者sentence,而輸入的長度是不固定的,那麼如何解決這個問題呢?其實,在NLP中,研究人員通常都採用的是「單層CNN結構」,這裏的單層並非只有一層,而是隻有一對卷積層和池化層。目前有兩篇論文作的不錯,一個是NYU的Yoon,另外一個是Zhang Ye的分析報告[3],參看下面的圖(圖來自Yoon的論文[2],該論文的代碼地址:yoon kim的github

  

  

能夠看到,每次在卷積的時候,都是整行整行的進行的。這比如是n-gram模型,若是每兩行conv一次,那麼就是2-gram,要知道,google最多也不過使用了5-gram模型,由於這種模型計算量很是大,可是若是在CNN中進行相似的操做,計算量反而減少了。在第二層的卷積層中,咱們能夠看到,每次獲得的Feature Map的行數,是和輸入的sentence的長度相關的。可是,在池化層,採用了1-max pooling的技術,從而將每一個Feature Map的維度所有降低爲1,所以,pooling結束以後,獲得的向量的維度,就是卷積層Feature Map的數量。這樣也便解決了輸入長度的問題。可是,接下來沒法再進行conv操做了,並且,在這個應用裏,也不會出現像LeNet-5那樣的Feature Map的組合輸出的現象,由於只有一層卷積層。那麼這裏問題就來了,這樣單層的結構到底效果如何?能不能擴展成多層的結構呢?能不能使用Feature Map的組合策略呢?單從Yoon的paper來看,結果是不錯的,但是這樣的結構必定適合其餘應用問題嗎?若是咱們在conv操做的時候,不整行整行的卷積,那麼這樣就沒法用n-gram去解釋了,可是這樣的效果如何呢?其實也有人作過了,是Nal的Paper,參考文獻[4]. 我的不推薦這種部分卷積的作法。

  針對第3個問題,CNN在應用的時候,超參數如何設定?下面,咱們從幾個方面進行闡述。首先是Filter Window的大小,因爲在卷積的時候是整行整行的卷積的,所以只須要肯定每次卷積的行數便可,而這個行數,其實就是n-gram模型中的n。通常來說,n通常按照2,3,4這樣來取值,這也和n-gram模型中n的取值相照應;固然,在文獻[3]還詳細分析了Filter Window大小對實驗結果的影響,而且一直取值到7;其次是Feature Map的數量,在文獻[2]中,針對2,3,4每個Filter Window,都設置了100個,這樣通過池化層以後,獲得的向量是300維的;還有一些其餘的超參數,好比爲了防止過擬合,在全鏈接層加入了Dropout,從而隨機地捨棄一部分鏈接,Dropout的參數爲0.5;在Softmax分類時使用L2正則項,正則項的係數是3;訓練的時候,SGD的mini-batchsize是50等。另外還有一個問題是,當訓練的word embedding不足時,也就是待分類的document中包含沒有被pre-training出來的詞時,須要在某個區間上,對該詞的詞向量進行隨機的初始化。

  針對第4個問題,CNN在NLP的研究方向還能夠從哪些地方進行?首先,咱們來簡要列舉2015年CNN在NLP的應用研究列表(2016的paper尚未出來,等出來以後會在這裏補上):

  • 擴展CNN的輸入,擴充詞向量的維度,加入新特徵[5];將RNN的輸出做爲CNN的輸入[6],

  

  • 卷積層的改造。如:將word2vec橫向組合,以發現句子層級的特徵[7];卷積層的非線性化改造[8];

 

  • Pooling層的改造。使用k-Max pooling以保留更多的特徵[9];分段pooling[10];

  • CNN模型的組合。對同一輸入作多重cnn分類,組合結果[11];一個句子一個CNN[12];

 PS:這裏有幾個問題供讀者思考,也是我正在思考的問題:目前咱們所看到的CNN在NLP中的應用,大部分的網絡結構都很是淺,主要是對於文本的不定長的特色,很差用多層CNN網絡去訓練,可是若是網絡不夠深,彷佛又沒法捕捉到更深層次的特徵。所以,咱們到底應不該該在NLP中應用多層CNN結構?若是應該,應採起怎樣的策略?可不能夠把S2到C3的Feature Map的組合卷積過程應用到NLP中?這都是咱們都應該考慮的問題,若是您對這些問題有任何想法,歡迎留言交流。

 參考文獻

[1]  A neural probabilistic language model, Yoshua, Ducharme et al.

[2]  Yoon Kim. Convolutional Neural Networks for Sentence Classification.

[3]  Zhang Ye, et al. A Sensitivity Analysis of (and Practitioners' Guide to) Convolutional Neural Networks for Sentence Classification.

[4]  Kalchbrenner N, Grefenstette E, Blunsom P. A Convolutional Neural Network for Modelling Sentences[J]. Eprint Arxiv, 2014, 1.

[5]  Event Detection and Domain Adaptation with Convolutional Neural Networks, TH Nguyen,R Grishman.

[6] Recurrent Convolutional Neural Network for Text Classification, Siwei Lai etc.

[7] Chen Y, Xu L, Liu K, et al. Event Extraction via Dynamic Multi-Pooling Convolutional Neural Networks[C]// The, Meeting of the Association for Computational Linguistics. 2015.

[8] Lei T, Barzilay R, Jaakkola T. Molding CNNs for text: non-linear, non-consecutive convolutions[J]. Computer Science, 2015, 58:págs. 1151-1186.

[9] Yin W, Schütze H. MultiGranCNN: An Architecture for General Matching of Text Chunks on Multiple Levels of Granularity[C]// Meeting of the Association for Computational Linguistics and the, International Joint Conference on Natural Language Processing. 2015.

[10] Distant Supervision for Relation Extraction via Piecewise Convolutional Neural Networks Daojian Zeng, Kang Liu, Yubo Chen and Jun Zhao.

[11] Question Answering over Freebase with Multi-Column Convolutional Neural Networks, Li Dong etc.

[12] Severyn A, Moschitti A. Learning to Rank Short Text Pairs with Convolutional Deep Neural Networks[C]// The, International ACM SIGIR Conference. 2015.

[13] Wang P, Xu J, Xu B, et al. Semantic Clustering and Convolutional Neural Network for Short Text Categorization[C]// Meeting of the Association for Computational Linguistics and the, International Joint Conference on Natural Language Processing. 2015.

相關文章
相關標籤/搜索