1、DCNN模型
DCNN是由Nal Kalchbrenner[1]等人於2014年提出的一種算法,其利用CNN模型將輸入進行卷積操作,並利用K-MAX pooling操作,最終將變長的文本序列輸出為定長的序列,這種方式能夠獲取短文本和長文本之間的關系。文章在4個數據集進行了測試。
DCNN模型結構如下圖所示

- projected sentence matrix
首先,我們將輸入的單詞通過embedding_lookup,得到輸入單詞的詞向量。如圖,輸入為[7,4]的向量 - wide convolution
我們用兩個濾波器,分別對原始的詞表進行卷積操作,這里設置m=3,即每3個單詞進行一次卷積操作,由圖可知,濾波器的維度是3,這里會在詞表前后分別加上兩維的padding,這里的操作只對每3個單詞的第一維進行卷積。最終我們會得到兩個[9,4]的矩陣。 - dynamic k-max pooling
對每一個維度進行pooling操作,這里k=5,即取最大的5個元素,結果進行拼接,這里有兩個濾波器,得到兩個[5,4]的矩陣。這里的k是動態獲取的,根據公式\(k_{l} = max(k_{top}, \lceil \frac {L-l}{L} * s \rceil)\) 。其中\(k_{top}\)為用戶自己設定,這里\(k_{top} = 3\),L表示全部卷積的數量,s表示輸入的長度,這里\(s=18\),所以,\(k_{1} = max(3,((3-1)/3) * 18) = 12\), \(k_{2} = max(3,((3-2)/3) * 18) = 6\),\(k_{3} = max(3,((3-3)/3) * 18) = 3\)。 - wide convolution
再次進行一次卷積操作,這里的m=2,有兩個濾波器,我們用這兩個濾波器 分別對上一層的輸出進行卷積,並將各自的結果進行加和,得到兩個[6,4]的輸出, - fodding
這里的維度為4,我們將其平均分成兩部分,每一部分為2,我們將各自的兩維進行加和,得到兩個[6,2]的矩陣 - dynamic k-max pooling
如上,再次進行pooling操作,得到兩個[3,2]維矩陣 - Fully connected layer
最后,我們進行一個全連接操作,將結果維度進行固定,接下來,我們就可以利用一些softmax操作,來根據分類結果計算loss了。
2、TextCNN模型
TextCNN可以理解為是DCNN的簡化版本,但是在數據集上取得了不錯的效果,TextCNN是由Yoon Kim[2]提出的一種算法,提出了不同的單詞embedding方法,分別是CNN-rand,CNN-static,CNN-non-static,CNN-mutichannel,其基本結構如下圖所示

TextCNN的結構和DCNN基本相似,第一層,我們先得到單詞的embedding,接着,用不同的濾波器進行卷積操作,然后用max-pooling方式進行池化操作,最后加上一個全連接操作,進行softmax輸出。可以看到,TextCNN幾乎是DCNN的簡化版本。
- CNN-rand
對單詞的embedding信息隨機的初始化 - CNN-static
用word2vec進行訓練詞向量,並且在訓練時固定詞向量 - CNN-non-static
用word2vec進行訓練詞向量,詞向量隨着訓練進行微調 - CNN-mutichannel
輸入時含有兩個詞向量,分別成為兩個通道,其中一個用word2vec進行訓練並在CNN訓練時進行固定,另外一個隨機初始化,並在CNN訓練時隨着訓練調整它的參數。
3、XML-CNN模型
XML-CNN主要是針對大規模多標記數據提出的一種算法,是由Jingzhou Liu[3]等人提出的,其主要貢獻有三點:a、使用k-max-pooling方法來盡可能多的加入特征信息。b、在池化層和輸出層加入一個全連接層,以減少參數的更新。c、輸出層使用sigmoid激活函數,損失函數使用cross-entropy。其網絡結構如下圖所示

首先,輸入層依然是單詞的embedding信息,經過多個濾波器,進行卷積操作,接着我們使用k-max-pooling,其目的是為了更多的獲取特征,有時候,往往最大的特征不能代表某個類別,所以加入最大的k個特征。接下來我們在池化層和輸出層加入一個全連接層,加入這個層的目的是減少參數的更新,如果不加入這個全連接層,那么每次參數更新是k * L,k表示池化層輸出節點數,L表示輸出層節點數,加入了一個全連接層,參數更新就變成了k * F + F * L,F表示全連接層節點數,其中F遠遠小於L。最后輸出層使用sigmoid激活函數,並使用cross-entropy構造損失函數。
4、Character-level CNN模型
顧名思義,Character-level CNN模型輸入的並不是完整的詞匯,而是字符序列,在論文中,作者輸入的字符個數是70個,其中包括字母,數字和一些特殊符號等,特征的維度設置為1024,對於沒有在這70個字符中的字符,用全0表示。其結構如下圖所示

可以看到,輸入序列經過了一次卷積和池化操作,緊接着經過了6層卷積操作,池化操作和3層全連接操作,其中卷積操作分為1個大步長和1個小步長,其參數如下圖所示
卷積和池化操作

全連接操作

5、VDCNN模型
VDCNN模型是在深度上進行增加,以達到一個較好的效果,其由facebook 的Alexis Conneau[5]等人提出,模型輸入是以字符為單位,輸入的長度固定為s=1024。受到VGG和ResNets的啟發,模型在池化操作后遵循如下原則
- 對於相同的輸出特征圖大小,圖層有相同數量的濾波器
- 如果特征圖的大小被減半,過濾器的數量增加一倍
如下是完整的模型架構圖,我們分別來對每一個步驟進行講解

輸入層是一個(1024)的字符向量,經過embedding_lookup后,得到(1024 * 16)的二維矩陣,其中16為每個字符的維度。
接下來進行一步卷積操作,其中窗口大小為3,濾波器 的數量是64,在這一步,其實在矩陣的開始和結束加上了兩個padding,所以輸入的向量是(1026,16),這樣經過一次窗口長度為3的卷積,可以得到大小為(1024 * 1)的卷積結果,由於濾波器數量為64,所以最終的結果是(1024 * 64)維的矩陣。
接下來通過兩個Convolutional Block,窗口大小為3,濾波器數量為64,在每一步的卷積操作中,都在開始和結束加入了兩個padding,這樣做的目的是為了得到固定維度的輸出,后續也都是一樣的,不再做特殊的說明。
接下來進行池化操作,得到(512 * 64)的矩陣輸出,根據上述原則,我們需要增加濾波器的數量,即64 * 2=128
進行卷積操作,窗口大小為3,對矩陣(512 * 64)進行卷積操作,得到(512 * 1)由於是128個濾波器,所以結果是(512 * 128)
接下來的操作和上述一樣,最終會得到一個(128 * 512)的矩陣,接着進行池化操作,這里k=8,所以輸出為(8 * 512)
接着,進行兩個全連接層的操作,下游的任務可以根據我們的需要進行設置,比如對分類來說,輸出即為標簽的數量。
我們這里還有一點沒有說明,就是Convolutional Block是個什么東西,其實很簡單,也是一系列的卷積操作,如下圖所示

[2]Yoon Kim(2014)Convolutional Neural Networks for Sentence Classification
[3]Jingzhou Liu(2015)Deep Learning for Extreme Multi-label Text Classification
[4]Xiang Zhang(2015)Character-level Convolutional Networks for Text Classification
[5]Alexis Conneau(2017)Very Deep Convolutional Networks for Text Classification