卷積神經網絡(CNN)最開始是用於計算機視覺中,然而如今也被普遍用於天然語言處理中,並且有着不亞於RNN(循環神經網絡)的性能。數組
一、傳統的天然語言處理模型網絡
1)傳統的詞袋模型或者連續詞袋模型(CBOW)均可以經過構建一個全鏈接的神經網絡對句子進行情感標籤的分類,可是這樣存在一個問題,咱們經過激活函數可讓某些結點激活(例如一個句子裏」not」,」hate」這樣的較強的特徵詞),可是因爲在這樣網絡構建裏,句子中詞語的順序被忽略,也許一樣兩個句子都出現了not和hate可是一個句子(I do not hate this movie)表示的是good的情感,另外一個句子(I hate this movie and will not choose it)表示的是bad的情感。其實很重要的一點是在剛纔上述模型中咱們沒法捕獲像not hate這樣由連續兩個詞所構成的關鍵特徵的詞的含義。框架
2)在語言模型裏n-gram模型是能夠用來解決上面的問題的,想法其實就是將連續的兩個詞做爲一個總體歸入到模型中,這樣確實可以解決咱們剛纔提出的問題,加入bi-gram,tri-gram可讓咱們捕捉到例如「don’t love」,「not the best」。可是新的問題又來了,若是咱們使用多元模型,實際訓練時的參數是一個很是大的問題,由於假設你有20000個詞,加入bi-gram實際上你就要有400000000個詞,這樣參數訓練顯然是爆炸的。另一點,類似的詞語在這樣的模型中不能共享例如參數權重等,這樣就會致使類似詞沒法得到交互信息。函數
二、天然語言處理中的卷積神經網絡性能
在圖像中卷積核一般是對圖像的一小塊區域進行計算,而在文本中,一句話所構成的詞向量做爲輸入。每一行表明一個詞的詞向量,因此在處理文本時,卷積核一般覆蓋上下幾行的詞,因此此時卷積核的寬度與輸入的寬度相同,經過這樣的方式,咱們就可以捕捉到多個連續詞之間的特徵(只要經過設置卷積核的尺寸,卷積核的寬度通常和詞向量的長度一致,長度能夠去1,2,3這類的值,當取3時就會將3個連續詞的特徵表示出來),而且可以在同一類特徵計算時中共享權重。以下圖所示this
如上圖所示,不一樣長度的卷積核,會得到不一樣長度的輸出值,但在以後的池化中又會獲得相同的長度(好比上面的深紅色的卷積核是4 × 5,對於輸入值爲7 × 5的輸入值,卷積以後的輸出值就是4 × 1,最大池化以後就是1 × 1;深綠色的卷積核是3 × 5,卷積以後的輸出值是5 × 1,最大池化以後就是1 × 1),最後將全部池化後的值組合在一塊兒,這樣有一點好處,不管輸入值的大小是否相同(輸入值行通常不相等,對於輸入值列是詞向量的長度,通常都是相等,可是行是和文本中詞的數量相關的),要用相同數量的卷積核進行卷積,以後再池化就會得到相同長度的向量(向量的長度和卷積核的數量相等),這樣再以後就能夠用全鏈接層了(全鏈接層的輸入值的向量大小必須是一致的)。spa
三、卷積層的最大池化問題.net
MaxPooling Over Time是NLP中CNN模型中最多見的一種下采樣操做。意思是對於某個Filter抽取到若干特徵值,只取其中得分最大的那個值做爲Pooling層保留值,其它特徵值所有拋棄,值最大表明只保留這些特徵中最強的,而拋棄其它弱的此類特徵(正如上圖所示的那樣)。設計
CNN中採用Max Pooling操做有幾個好處:3d
1)這個操做能夠保證特徵的位置與旋轉不變性,由於不論這個強特徵在哪一個位置出現,都會不考慮其出現位置而能把它提出來。對於圖像處理來講這種位置與旋轉不變性是很好的特性,可是對於NLP來講,這個特性其實並不必定是好事,由於在不少NLP的應用場合,特徵的出現位置信息是很重要的,好比主語出現位置通常在句子頭,賓語通常出如今句子尾等等,這些位置信息其實有時候對於分類任務來講仍是很重要的,可是Max Pooling 基本把這些信息拋掉了。
2)MaxPooling能減小模型參數數量,有利於減小模型過擬合問題。由於通過Pooling操做後,每每把2D(圖像中)或者1D(天然語言中)的數組轉換爲單一數值,這樣對於後續的Convolution層或者全聯接隱層來講無疑單個Filter的參數或者隱層神經元個數就減小了。
3)對於NLP任務來講,Max Pooling有個額外的好處;在此處,能夠把變長的輸入X整理成固定長度的輸入。由於CNN最後每每會接全聯接層,而其神經元個數是須要事先定好的,若是輸入是不定長的那麼很難設計網絡結構。
可是,CNN模型採起MaxPooling Over Time也有一些值得注意的缺點:首先就如上所述,特徵的位置信息在這一步驟徹底丟失。在卷積層實際上是保留了特徵的位置信息的,可是經過取惟一的最大值,如今在Pooling層只知道這個最大值是多少,可是其出現位置信息並無保留;另一個明顯的缺點是:有時候有些強特徵會出現屢次,好比咱們常見的TF.IDF公式,TF就是指某個特徵出現的次數,出現次數越多說明這個特徵越強,可是由於Max Pooling只保留一個最大值,因此即便某個特徵出現屢次,如今也只能看到一次,就是說同一特徵的強度信息丟失了。這是Max Pooling Over Time典型的兩個缺點。
針對上面提出的兩個缺點,一般的解決辦法是下面兩種池化方法
K-Max Pooling
K-MaxPooling的核心思想是:原先的Max Pooling Over Time從Convolution層一系列特徵值中只取最強的那個值,K-Max Pooling能夠取全部特徵值中得分在Top –K的值,並保留這些特徵值原始的前後順序,就是說經過多保留一些特徵信息供後續階段使用。以下圖所示
很明顯,K-Max Pooling能夠表達同一類特徵出現屢次的情形,便可以表達某類特徵的強度;另外,由於這些Top K特徵值的相對順序得以保留,因此應該說其保留了部分位置信息,可是這種位置信息只是特徵間的相對順序,而非絕對位置信息。
Chunk-Max Pooling
Chunk-MaxPooling的核心思想是:把某個Filter對應的Convolution層的全部特徵向量進行分段,切割成若干段後,在每一個分段裏面各自取得一個最大特徵值,好比將某個Filter的特徵向量切成3個Chunk,那麼就在每一個Chunk裏面取一個最大值,因而得到3個特徵值。以下圖所示,不一樣顏色表明不一樣段
Chunk-Max Pooling思路相似於K-Max Pooling,由於它也是從Convolution層取出了K個特徵值,可是二者的主要區別是:K-Max Pooling是一種全局取Top K特徵的操做方式,而Chunk-Max Pooling則是先分段,在分段內包含特徵數據裏面取最大值,因此實際上是一種局部Top K的特徵抽取方式。
至於這個Chunk怎麼劃分,能夠有不一樣的作法,好比能夠事先設定好段落個數,這是一種靜態劃分Chunk的思路;也能夠根據輸入的不一樣動態地劃分Chunk間的邊界位置,能夠稱之爲動態Chunk-Max方法。事實上對於K-Max Pooling也有動態的去獲取K的值的方法,表達式以下
s表明的是句子長度,L表明總的卷積層的個數,l表明的是當前是在幾個卷積層,因此能夠看出這裏的k是隨着句子的長度和網絡深度而改變。
Chunk-Max Pooling很明顯也是保留了多個局部Max特徵值的相對順序信息,儘管並無保留絕對位置信息,可是由於是先劃分Chunk再分別取Max值的,因此保留了比較粗粒度的模糊的位置信息;固然,若是屢次出現強特徵,則也能夠捕獲特徵強度。
若是分類所須要的關鍵特徵的位置信息很重要,那麼相似Chunk-Max Pooling這種可以粗粒度保留位置信息的機制應該可以對分類性能有必定程度的提高做用;可是對於不少分類問題,估計Max-Pooling over time就足夠了。
四、卷積神經網絡在天然語言處理中的應用
最適合CNNs的莫過於分類任務,如語義分析、垃圾郵件檢測和話題分類。卷積運算和池化會丟失局部區域某些單詞的順序信息,所以純CNN的結構框架不太適用於PoS Tagging和Entity Extraction等順序標籤任務。
參考文獻:
http://www.javashuo.com/article/p-ryrjnero-o.html
http://www.javashuo.com/article/p-cswzxgtt-ds.html