天天看點

深度學習在文本分類中的應用

引言

文本分類這個在NLP領域是一個很普通而應用很廣的課題,而且已經有了相當多的研究成果,比如應用很廣泛的基于規則特征的SVM分類器,以及加上樸素貝葉斯方法的SVM分類器,當然還有最大熵分類器、基于條件随機場來建構依賴樹的分類方法、當然還有普通的BP神經網絡分類方法。在傳統的文本分類詞袋模型中,在将文本轉換成文本向量的過程中,往往會造成文本向量次元過大的問題,當然也有其他的壓縮了次元的一些分類方法。然而,以上的這些方法,又因為在訓練的過程中丢失了單詞的順序資訊,在文本的分類過程中,效果又不一定盡如人意。本文主要是在學習了幾篇深度學習在文本分類上的研究的論文【1,2,3,4,5】以及博文【6】之後,對其論文中提到的方法做一個簡單的總結和回顧。

背景

本博文中設計的深度學習内容主要指的是RNN和CNN,而在論文【1,2,3,4,5】中其實主要涉及的是使用CNN進行文本模組化與分類,論文【3】提到了使用RNN訓練文本向量的方法,是以為了描述的簡單起見,我直接使用了深度學習來表示本文中使用的分類方法。

CNN之是以能夠被廣泛運用到文本分類中去,主要的原因其實很簡單,因為CNN和N-gram模型相似,CNN中的filter window其實可以看做是N-gram的方法,不過CNN因為使用了卷積層和pooling層,使得CNN能夠一方面減少了訓練參數個數,同時也能夠抽取到文本的更高層的資訊。而RNN更多的是用在文本模組化以及機器翻譯上,直接用在文本分類上好像不是很多的樣子。

CNN用于文本分類

這裡打算使用論文【1,2】來說明CNN在文本分類上的應用。兩篇文章發表的日期非常接近,都是2014年的文章。

  • 首先來看看論文【1】(Convolutional Neural Network for Sentence Classification)的具體方法

    來看下作者的CNN結構:

    深度學習在文本分類中的應用

    解釋一下上圖:

    在最左邊的輸出層有兩個channel,每個channel是一個二維的矩陣,矩陣的列的長度等于語句sentence的長度(也就是sentence中的單詞個數,通過padding使得待分類的每個sentence都有相同的長度),矩陣的行向量表示每個單詞的向量形式,文中作者使用了word2vec工具初始化了,也就是每個單詞都做了embedding。兩個channel在初始化的時候是一樣的,而之是以使用了兩個channel就是因為兩個channel的目的不一樣,其中一個為static,也就是在給定了embedding之後,其值就不會變了,另一個channel為 non-static,表示embedding向量是參數,也是需要在推導中求出來的。使用兩個channel的目的是考慮到:第一,如果隻是使用static,由于使用word2vec的訓練語料和試驗中的實驗語料可能存在不一緻,導緻embedding存在偏差;第二,如果隻是使用單方面的non-static向量,其初始化對其結果和收斂快慢都有影響。是以使用混合的channel能夠使上面的兩種問題得到“中和”。

    在輸入層之後就是卷積層,以上圖為例,最上面的filter的shape是3*6,也就是對于這句話:“wait for the vedio and do n’t rent it”,這個filter每隔三個詞就做一次卷積操作,對于長度為8的句子,在這個filter的卷積操作之後,會産生一個7*1的輸出。當然卷積層的filter個數和filter的shape都是可以變的,原理是一樣的。

    後面的一層是pooling層,這篇論文使用的是max-pooling,也就是上文的7*1 的卷積層輸出将會pooling成一個1*1的數值,有n個filter就會産生n個1*1的數值,這n個數值将會用于後面的全連接配接層。

    之後是一個全連接配接輸出層,輸出層輸出的個數對應的是文本的類别數量,将上面的n個pooling層輸出全連接配接到輸出層,輸出層使用的是softmax激勵函數。

    從上面的描述可以看出,CNN對于分本分類的思路很清晰,實作起來也不難,參數的訓練我就不提了,其實驗結果我會在後面的部分中給出代碼和結果

  • 然後來看看論文【2】(Effective Use of Word Order for Text Categorization with Convolutional Neural Networks)對CNN分類方法的讨論

    有了上面的基礎,了解論文2的觀點也就變得容易了,其實論文【2】在對文本向量的預處理過程中還是顯得略微粗糙,直接使用的是one-hot模型,不過是進行了一些的改進。主要的差別還是在詞向量的表達方式上,在該篇論文中,作者直接使用了one-hot詞向量模型,這個作者稱之為seq-CNN的模型,它顯然這會帶來次元的劇烈增加,然後作者提出了一種改進型:bow-CNN模型,其實就是将附近的連續幾個單詞建構成一個詞向量,其差別如下:

    深度學習在文本分類中的應用
    seq-CNN模型
    深度學習在文本分類中的應用

    bow-CNN模型

    其餘的訓練過程和1類似,是以就不提及了。

CNN和RNN的混合使用

  • CNN和RNN用于文本向量的訓練

    論文【4】的觀點比較獨特,作者倒不是用CNN或者RNN去做分類模型,而是使用了CNN和RNN去訓練了文本的向量,最後反而是使用普通的ANN作為分類器,這裡就主要說一說作者的産生文本向量的過程

    首先看看CNN模型是如何産生文本向量的。

    對于長度為l的sentence,每個單詞都是m維的詞向量,對于一個filter,其操作如下:

    深度學習在文本分類中的應用

    上圖是filter的shape是3*m,在卷積層,能夠得到C1C2..Cl-2,然後對這個進行max-pooling操作,最終得到一個數值

    使用n個filter重複上面的操作,我們能夠得到一個n維的向量s,這個就是我們得到的文本向量。

    然後看看RNN模型是如何産生文本向量的。

    文中作者使用的是RNN的變體LSTM,其結構如下:

    深度學習在文本分類中的應用

    上面的x1-xl也是m次元的向量,而h1-hl是次元為n的一維向量,最後面的Pooling層代用的是max-pooling或者mean-pooling

    得到文本向量之後就可以送入ANN神經網絡分類器裡面去進行分類訓練了,訓練過程就不提及了

  • CNN和RNN的混合模型使用

    論文【3】(A C-LSTM Neural Network for Text Classification)提到了一種新的模型,也就是将CNN和RNN混合使用作為文本的分類器,論文是2015年的,我覺得觀點還是比較新鮮的,是以特地拿出來講一下。

    模型如下:

    深度學習在文本分類中的應用
    前面的卷積層和前面的文章提到的是一樣的,也就是對于每個filter,從sentence的embedding矩陣進行卷積操作之後,得到feature map,然後重點來了,從feature map 層到window feature sequence層,把相同顔色的放在一個序列裡面,然後依次排列下來,其實很好看到,在window feature sequence層的每個序列,其實和原始sentence的序列是對應的,保持了原有的相對順序,隻不過是中間進行了卷積的操作。

window feature sequence層的序列向量是下一層的LSTM的網絡的輸入input,該網絡使用了最後一層中間層的隐含層輸出h作為該網絡的輸出結果output。然後就是訓練LSTM的參數問題了。

實驗

本文的實驗是根據博文IMPLEMENTING A CNN FOR TEXT CLASSIFICATION IN TENSORFLOW進行重複實驗的。針對的是論文【1】所提出的實驗。

實驗資料: Movie Review data from Rotten Tomatoes

資料說明:電影評論:5331的正面評論和5331的負面評論

實驗工具:Google的tensor flow架構

測試集:1000

訓練集:剩下的資料

實驗結果:

深度學習在文本分類中的應用

說明:紅色線表示的是訓練集,藍色線表示的是測試集,測試集的準确度最好大概能到76%,這和論文中的資料差不多

結論

深度學習在這幾年特别火,在NLP領域,深度學習也是風中翹楚,尤其是在機器翻譯、語音識别等領域頗有建樹,這次也是總結了幾篇關于文本分類的這方面論文,順别學習一下Google的深度學習tensor flow架構,還是有一點小收獲的。

參考文獻

[1]Kim Y. Convolutional Neural Networks for Sentence Classification[J]. Eprint Arxiv, 2014.

[2]Johnson R, Zhang T. Effective Use of Word Order for Text Categorization with Convolutional Neural Networks[J]. Eprint Arxiv, 2014.

[3]Zhou C, Sun C, Liu Z, et al. A C-LSTM Neural Network for Text Classification[J]. Computer Science, 2015.

[4]Ji Young Lee, Franck Dernoncourt. Sequential Short-Text Classification with Recurrent and Convolutional Neural Networks[J]. 2016.

[5]Kalchbrenner N, Grefenstette E, Blunsom P. A Convolutional Neural Network for Modelling Sentences[J]. Eprint Arxiv, 2014, 1.

[6] IMPLEMENTING A CNN FOR TEXT CLASSIFICATION IN TENSORFLOW

繼續閱讀