深度學習之文本分類模型-基於CNNs系列


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是個什么東西,其實很簡單,也是一系列的卷積操作,如下圖所示

參考文獻
[1]Nal Kalchbrenner(2014)A Convolutional Neural Network for Modelling Sentences.
[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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM