基於 CNN 的文本分類算法

CNN 是卷積神經網絡,通常用於圖像領域,並且在圖像分類取得非常好的效果。2014 年 Yoon Kim 在論文《Convolutional Neural Networks for Sentence Classification》中將 CNN 的思想應用到文本處理中,後續很多把 ConvNet 用在 NLP 任務上的工作都是基於這篇論文進行的。

1. CNN 文本分類模型

本文主要是對原始論文《Convolutional Neural Networks for Sentence Classification》內容的整理,首先了解 CNN 文本分類模型整體結構,下圖是論文中的模型圖。

CNN 文本分類模型

可以看到模型比較簡單,主要分為四個部分:輸入層、卷積層、最大池化層、全連接層。

1.1 輸入層

給定一個句子,輸入層接收的輸入是一個句子單詞詞向量矩陣 XX 是一個 (n×k) 的矩陣,n 表示句子中單詞數量,k 表示詞向量維度。可以看到 X 的每一行對應了一個單詞的詞向量,而單詞的詞向量按照它們在句子中的順序進行排列。

1.2 卷積層

在得到輸入的詞向量矩陣 X 之後,需要對

X 進行卷積操作。卷積核是一個 (h×k) 的矩陣,注意卷積核的列數是固定的 (為 k),與詞向量維度一樣。卷積核不斷地向下移動,得到卷積後的值。

卷積核

因為卷積核的列數與詞向量矩陣 X 是一樣的,所以經過卷積後的 feature map 也只有一列。有多個卷積核會生成多列向量,如下圖所示,下圖為 4 個卷積核卷積後的輸出。

卷積後的輸出

1.3 最大池化層

在卷積層中,多個不同的卷積核會生成多列向量 (feature map),最大池化會取出每一列中的最大值,最終形成一個一維向量。

1.4 全連接層

最後一層是全連接層,全連接層使用了 Dropout 防止過擬合,然後利用 Softmax 進行分類。

2. 模型的其他細節

2.1 使用多個不同尺寸的卷積核

剛剛我們瞭解到這個模型的卷積核列數必須為 k,但是其高度 (行數) 是可以變的,在使用的過程中可以採用不同高度的卷積核進行卷積操作,如下圖所示。

採用不同尺寸的卷積核

2.2 模型的變種

作者在論文中還提出了模型的 4 種變種

CNN-rand,單詞的詞向量是隨機初始化的,並且在訓練的過程中不斷地更新。CNN-static,使用已經訓練好的詞向量,例如 Word2Vec,並且在後續訓練中保持詞向量不變。CNN-non-static,與 CNN-static 類似,都是使用已經訓練好的詞向量,但是在後續的訓練中還會繼續微調詞向量。CNN-multichannel,使用兩套詞向量,均是用 Word2Vec 進行初始化,其中一套詞向量在訓練中保持不變,另一套會在訓練中微調。輸入的句子可以獲取兩種不同的詞向量。可以理解為類似圖像中的 RGB 通道,在這裡兩個通道分別表示兩種詞向量。

下圖是 4 種模型的結果,可以看到 CNN-static 比 CNN-rand 效果更好,說明使用預訓練的詞向量比較有效;另外 CNN-non-static 比 CNN-static 效果要好,說明微調會使詞向量更加適合當前任務。在實驗中 CNN-multichannel 通常在小數據集效果更好。

4 種 CNN 模型的效果

3. CNN 文本分類總結

CNN 用於 NLP 任務中與 N-Gram 有相似之處,我們定義卷積核的高度為 3,則相當於使用卷積核在句子中進行一個 3-Gram 的操作,同時 CNN 具有很高的效率,比傳統 N-Gram 要快很多。

CNN 中的卷積核寬度要與詞向量的維度一樣大,並且卷積核是在句子中單詞的方向上進行移動的。

參考文獻

1.論文:Convolutional Neural Networks for Sentence Classification

https://aclweb.org/anthology/D14-1181

2.Understanding Convolutional Neural Networks for NLP

http://www.wildml.com/2015/11/understanding-convolutional-neural-networks-for-nlp/