深度学习之文本分类模型-基于CNNs系列
目錄1、DCNN模型2、TextCNN模型3、XML-CNN模型4、Character-level CNN模型5、VDCNN模型
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 ceil)) 。其中(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
總結
以上是生活随笔為你收集整理的深度学习之文本分类模型-基于CNNs系列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第三次学JAVA再学不好就吃翔(part
- 下一篇: Tourbox发布全新控制器配套软件 改