如何在NLP領域應用卷積神經網路CNN
1.CNN使用原理
- (1) 相對於圖片畫素,在NLP任務中,將句子和文章作為一個矩陣來輸入給CNN網路,矩陣中的每一行代表一個標記token,通常是一個詞語,但是,也可以是一個字元。也就是說,矩陣中的每行是一個向量,這個向量代表一個詞語。通常這個向量是詞嵌入向量(低維表示),比如word2vec、glove,但是有時候單個詞語也可以使用one-hot編碼來表示該單詞在詞彙表中的索引。對於一個由10個單片語成的句子,使用一個100維的詞嵌入向量來表示每個單詞,那麼這個句子可以表示為10*100為的矩陣,這個矩陣就可以作為CNN網路的輸入,也就類似於影象領域的“圖片”。
-
(2) 在計算機視覺領域,卷積核是滑過整個圖片。但是,在NLP領域我們通常使用卷積核滑過矩陣的整行,相當於滑過句子中的詞語。換句話說是,卷積核的寬度通常與(1)中輸入的矩陣寬度相同。但是,卷積核的高度通常是變化的,通常每次滑過的單詞寬度是windows words 是2~5,將所有卷積核提取的結果合併在一起,NLP中的一個卷積神經網路工作原理如下圖所示:
CNN_NLP.png
2.NLP中的CNN不同之處
- (1) 我們對計算機視覺的直覺如何?位置不變性和區域性組合性對影象有直觀的意義,但對於NLP則不那麼重要。你可能會關注在一個句子中出現同一個詞語。彼此接近的畫素可能在語義上相關(對同一影象的一部分而言),但對於詞語而言並非總是如此。在許多語言中,短語的一部分可以用幾個其他單詞分開,詞語外觀上也不明顯。很明顯,在某些方面單詞的構成,例如修飾名詞的形容詞,但這究竟是如何工作的,更高級別的表示實際上“含義”並不像計算機視覺那樣明顯。
- (2) 考慮到上述描述的問題,CNN似乎無法在NLP任務中使用。幸運的是,上述存在的問題並不能意味著CNN在NLP任務中無法應用。正如名言" All models are wrong, but some are useful"所說,從事實角度出發,CNN在NLP任務上的應用反而很好。簡單的Bag of Words模型顯然過於簡單化,但多年來一直是常用方法,並取得了相當不錯的結果。
- (3)對於CNN網路,一直認為它都是一個很快的網路。卷積操作是計算機影象方向的核心操作,在GPU硬體上的實現。與n-grams語言模型對比,從詞語的表示形式上來說,CNN更加有效。當一個詞彙表中有很多單詞時,計算超過tri-grams時將會浪費很多的計算成本。即使是Google公司也不會提供超過5-grams的語言模型。卷積核可以自動學習到詞語好的表示形式,不需要表示出整個詞彙表。卷積核的數量超過5個是完全合理的,我認為卷積核在第一層捕捉到的特徵與n-grams語言模型捕捉到的特徵是相似的,但是前者以一種更緊湊的方式表現出來的。
3.CNN中的超引數
在解釋CNN如何應用在NLP任務中之前,先讓我們看看搭建CNN時需要做出的一些選擇,希望這有助於您更好地瞭解該領域的文獻。
- (1) Narrow vs. Wide convolution
-
a. 當我解釋上面的卷積操作時,我忽略了使用卷積核過程中的一些細節。應用一個3*3的卷積核在矩陣的中間部分時,得到的結果會很好,但是矩陣的邊緣部分該如何處理?如何將卷積核應用在一個沒有左上角元素的矩陣的第一個元素上?答案是使用padding操作,所有在矩陣邊緣的元素都可以在邊緣元素的外部用0填充。通過這個操作,你可以將卷積核應用在輸入矩陣的任意位置上,獲得一個更大且相同大小的輸出。增加zero-padding操作也被稱為是wide convolution,沒有用0元素填充的操作稱為narrow convolution.下圖中n_filter=5,n_in=7,n_padding=4
narrow convolution.png
wide convolution.png
-
b.當你有一個與輸入矩陣尺寸相關且很大的卷積核時,通過上圖,你可以看出wide convolution是有用的,甚至是必要的操作。如上圖所示,narrow convolution生成的輸出尺寸是(7-5)+1=3,wide convolution生成的輸出尺寸是(7-2*4-5)+1=11。更加普遍的情況是,計算公式如下圖所示:
輸出尺寸的計算公式.png
-
- (2) Stride Size
-
a.卷積神經網路中的另一個超引數是stride size,這個引數定義了卷積核每次在輸入矩陣中的移動步長大小。上面的所有例子中stride size=1,重複的應用這個步長來移動卷積核。步長越大,卷積核的移動次數越少,輸出的尺寸越小。下面的圖來自CS231課程
stride size is 1.png
stride size is 2.png
- b.通常在文獻中stride size=1,當stride size太大時,我們可以構建出一個類似於迴圈神經網路結構的模型。
-
- (3) Pooling Layers
-
a.CNN中的一個關鍵方面是池化層,這層通常在卷積層之後應用。通常對卷積核得到的輸出應用一個max操作實現池化功能。你不需要對整個矩陣進行池化操作,你可以將矩陣分隔成幾個視窗,對每個視窗進行池化操作。例如,下圖中max操作時,視窗的大小是2*2(在NLP領域中,我們通常在卷積層的輸出矩陣上應用池化操作,每個卷積核池化後得到一個實數),具體如下圖所示:
max pooling.png
- b.為什麼要進行池化操作?主要有以下幾個原因:池化層的一個特點是提供一個固定大小的輸出矩陣,這個輸出矩陣通常被用作分類。比如,你有1000個卷積核,你將池化操作應用在卷積層輸出的矩陣後,不論卷積核的大小、輸入矩陣的大小,你都會得到一個1000維的池化後的輸出矩陣。這允許你可以使用可變大小的句子長度和可變大小的過卷積核,但最終獲得相同的輸出維度來提供給分類器。
- c.池化操作還可以減少輸出矩陣的維度,但是同時也保持了最顯著的特徵。你可以將每個卷積核理解成檢測特定功能的特徵提取器。例如,檢測句子是否包含“not amazing”等這樣的否定詞語。如果此詞語出現在句子中的某處時,則將卷積核應用於該區域,結果將產生較大的值,但在其他區域中產生較小的值。通過執行最大池化操作,能夠將這個詞語是否出現在句子中的資訊保留下來,但是也丟失有關詞語出現在句子何處的資訊。但後者的這個資訊不太重要,它類似於bag of n-grams模型。你正在丟失關於這個詞語在一個句子中全域性位置資訊,但同時卷積核正在捕捉這個詞語在這個句子中的區域性位置資訊,比如"not amazing"與"amazing not"顯然是不同的。
- d.在影象識別領域,池化操作提供了圖片移動和旋轉的基本不變特性。當你對某個區域執行池化操作,即使你將影象移動/旋轉幾個畫素,輸出也將保持大致相同,因為最大池化操作無論如何都會選擇相同的值。
-
- (4) Channels
最後,我們必須理解通道這個概念,通道是對輸入資料的不同視角理解。例如,在影象識別領域,通常有RGB(紅、綠、藍)3個通道,你可以貫穿整個通道來執行卷積操作,使用相同或不同的權重。在NLP中,你可以想象有不同的通道,如:你可以分別為不同的詞嵌入(word2vec/glove)使用一個獨立的通道,或者你也可以為不同語言中相同含義的句子設定一個通道。
4.Convolutional Neural Networks applied to NLP
下面讓我們看一下CNN在自然語言處理中的使用,我嘗試總結CNN在這個領域上一些研究成果。研究結果總是我會想起許多有趣的應用程式(請在評論中告訴我),但我希望至少涵蓋一些更受歡迎的結果。
-
(1)CNN在NLP中的最適合的應用似乎是分類任務,比如情感分析、垃圾郵件識別、觀點分類等。卷積和池化操作丟失關於單詞的區域性位置資訊,因此序列標註(如位置標註、實體提取)任務上應用一個純CNN網路是有一點困難的。文獻[1]在一個多分類資料集上評價一個CNN網路結構的效果,主要包括情感分析和主題分類任務。CNN網路結構在整個資料集上獲得非常好的效果。令人意外的是文章中使用的網路非常簡單,但是功能強大。輸入層是一個句子,這個句子是由word2vec詞嵌入表示的詞向量表示。卷積層使用了多個卷積核,卷積層之後使用一個最大池化層,最後是一個softmax分類器。文章中使用靜態和動態兩種不同的詞嵌入的通道,動態的通道在訓練過程中能自動調整詞嵌入。文獻[2]使用更加複雜的網路結構,文獻[3]中增加一個額外的一層來執行"語義聚類"任務。
Convolution Neural Networks for Sentence Classification.png
5.論文復現結果

1.png

2.png

3.png

4.png

5.png

6.png