文本分類-TextCNN


簡介

TextCNN模型是由 Yoon Kim提出的Convolutional Naural Networks for Sentence Classification一文中提出的使用卷積神經網絡來處理NLP問題的模型.相比較nlp中傳統的rnn/lstm等模型,cnn能更加高效的提取重要特征,這些特征在分類中占據着重要位置.論文所提出的模型結構如下圖所示: 


圖1

可以看出TextCNN的結構還是比較簡單的,下面我們分塊介紹一下TextCNN.

輸入層

首先是輸入層,輸入跟大多數深度學習在nlp方面的處理一樣,需要將文本轉換成詞索引,每個句子是一個向量,向量中每個元素代表這該詞在詞典中的詞索引.其中詞向量矩陣embedding可以在該模型中一起訓練,也可以使用word2vec或者其他框架預訓練好的詞向量,然后在模型訓練過程中進行Fine tune.這也就是上圖中第一部份會有兩個channel,一個non-static channels是表示詞向量隨着模型一起訓練,static channels是表示使用預訓練的詞向量.而實驗表明,在數據量小的情況下,使用non-static channels容易引起過擬合.

這部分的變量維度分別是:輸入-[batch_size,sentence_length],詞向量矩陣-[vocab_size,embedding_size],經過embedding處理后輸出embedded-[batch_size,sentence_length,embedding_size],也就是圖1中第一部分顯示的內容.下面就要使用卷積操作進行處理了,但是卷積操作是四維的,除了embedded的三維之外,還有channels(在圖像處理中,最后一維是三通道的顏色編碼,但是在文本處理中該維值是1).所以在使用卷積處理前需要把embedded進行擴維處理.經過擴維處理后embedded變成了[batch_size,sentence_length,embedding_size,1]的矩陣.


圖2

卷積層

在該部分使用卷積核對embedded做卷積處理,在論文中卷積核的size取了三個[2,3,4],這對應着n-gram模型,使得特征信息包含臨近詞信息,這里就不在過深說明,詳細內容可以去看n-gram語言模型.如果卷積核的size為[2,3,4],那么就有三種卷積核,其中size為2的卷積核的shape是[2,embedding_size,1,num_filter],其他類似,其中num_filter代表着卷積核的數量,是超參數.這樣我們以1的步長去進行卷積,會得到size_len*num_filter個列向量,其中size_len是size的種類數,這里是3個size.對應着圖1中的第二部分.這部分的作用是提取了語義信息,其中包括n-gram模型.同時因為卷積操作的特點參數共享,所以可以減少了大部分參數,節約內存使用.

池化層

文中提到的pooling操作是max_pooling,就是將列向量中最大值取出來,對輸入補0做過濾(有興趣的朋友也可以試試平均池化,看看結果有神馬不同),池化操作是對整個向量,所以它的shape是[1,sentence_length-size+1,1,1],其中sentence_length-size+1是上文提到的經過卷積處理后得到的列向量長度.然后對卷積得到的每個列向量進行池化操作后,會得到size_len*num_filter個元素,將他們合並在一起形成一個size_len*num_filter維的向量.也就是圖1的第三部分.


圖3

全連接層

全連接層就是正常的softmax,輸入是池化后的向量,輸出維度是我們要分類的類別數,為了防止過擬合,可以加一個l2正則,同時也可以在上述過程后加上dropout.


圖4

總結

上本文在搜狗10分類新聞數據集進行測試,只使用了停用詞,由於電腦內存不足,所以對文本內容進行了截斷,只取了200個單詞,所以測試結果可能不是最好的,進行調參或者添加一些其他trick可以使精度更高一些.


圖5

Loss


圖6

ACC


圖7

TextCNN結構簡單,精度比較高,只是速度相比沒有Fasttext快,模型這種東西,沒有絕對的好壞之說,所以根據不同數據集選擇不同的模型,也是一門技術.


免責聲明!

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



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