簡介
TextCNN模型是由 Yoon Kim提出的Convolutional Naural Networks for Sentence Classification一文中提出的使用卷積神經網路來處理NLP問題的模型.相比較nlp中傳統的rnn/lstm等模型,cnn能更加高效的提取重要特徵,這些特徵在分類中佔據著重要位置.論文所提出的模型結構如下圖所示:
可以看出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]的矩陣.
卷積層
在該部分使用卷積核對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的第三部分.
全連線層
全連線層就是正常的softmax,輸入是池化後的向量,輸出維度是我們要分類的類別數,為了防止過擬合,可以加一個l2正則,同時也可以在上述過程後加上dropout.
總結
上本文在搜狗10分類新聞資料集進行測試,只使用了停用詞,由於電腦記憶體不足,所以對文字內容進行了截斷,只取了200個單詞,所以測試結果可能不是最好的,進行調參或者新增一些其他trick可以使精度更高一些.
Loss
ACC
TextCNN結構簡單,精度比較高,只是速度相比沒有Fasttext快,模型這種東西,沒有絕對的好壞之說,所以根據不同資料集選擇不同的模型,也是一門技術.