一匕垫、CNN文本分類簡介
文本分類是NLP領域的一個重要子任務狰腌,文本分類的目標是自動的將文本打上已經定義好的標簽除破,常見的文本分類任務有:
- 用戶評論的情感識別
- 垃圾郵件過濾
- 用戶查詢意圖識別
- 新聞分類
由此看出文本分類的用途十分之廣,包括知識圖譜領域的關系抽取任務也是使用文本分類實現的琼腔。
有很多經典的統(tǒng)計學習方法可以用來做文本分類瑰枫,比如SVM,LR展姐,MaxEnt等等躁垛。這些方法的一般流程是標注數據、特征工程圾笨、模型訓練教馆、模型預測。有過相關經驗的同學應該知道擂达,這里最耗費時間的過程應該就是特征工程土铺。這里特征通常有詞法特征、語法特征等等板鬓,下面找了一篇關于特征設計的論文供大家參考:http://www.aclweb.org/anthology/S10-1057
?
這是篇關系抽取的論文悲敷,但其中特征的設計可以供我們參考 。這個表中的特征有詞性識別(pos)俭令、依存分析(dependency)后德、N-gram等,除此之外還使用很多外部知識庫抄腔,比如wordNet/FrameNet/TextRunner等等瓢湃,要想訓練一個比較好的文本分類器理张,需要設計大量的特征,有的任務特征會達到千萬級別绵患。特征設計這里主要有兩個缺點:
- 需要一些背景知識設計各種精巧的特征
- 需要借助其他NLP工具雾叭。NLP工具本身會有一些誤差,這樣就將誤差傳播到后續(xù)的任務中
這里就不得不提深度學習的強大落蝙,比如CNN可以自動的提取一些文本的特征而不需要再人工設計大量的特征织狐,而且在準確率上甚至比人工設計特征的方法還要高。也難怪目前NLP領域都開始上深度學習了筏勒。
二移迫、CNN模型
2.1 CNN模型簡介
卷積神經網絡(CNN)跟全連接神經網絡一樣,CNN的每一層也是由神經元組成的奏寨,全連接神經網絡中起意,每相鄰的兩層之間的節(jié)點都有邊相連鹰服,而CNN相鄰層之間只有部分節(jié)點相連病瞳,并且在CNN的輸入層、卷積層悲酷、池化層中套菜,每層的維度包括輸入都是三維的。
CNN通常由輸入層设易、卷積層逗柴、池化層、全連接層顿肺、softmax層組成戏溺,下面簡單介紹下這幾層,以方便大家理解CNN是如何工作的屠尊。
2.1.1 卷積層
卷積層是卷及神經網絡中最重要的部分旷祸,這個部分通常被稱作過濾器(filter)或內核(kernel),在這里我們稱之為過濾器讼昆。下圖是一個過濾器工作的示意圖:
?
?
輸入經過一個filter處理后得到的粉紅色區(qū)域叫做Feature Map托享,在示意圖中filter的尺寸是[圖片上傳失敗...(image-e4bdc7-1557814223444)]
,在實際應用中這個尺寸也是根據需求人工設定的浸赫,一般設定為[圖片上傳失敗...(image-bbecc1-1557814223444)]
等等闰围。因為過濾器處理矩陣的深度與當前層神經網絡矩陣的深度時一致的,所以在這里我們只設定過濾器的長和寬就可以了既峡,另外我們還需要指定過濾器的深度羡榴。過濾器的作用在圖像領域比較好理解,就是提取圖像局部的特征运敢。
2.2.2 池化層
在卷積層之后往往會加入一層池化層校仑,池化層可以有效縮小矩陣的尺寸么夫,從而減少最后全連接層的參數,利用池化層既可以加速計算也可以減小過擬合肤视。下圖是池化層工作的示意圖档痪,使用一個尺寸為[圖片上傳失敗...(image-aae9b9-1557814223444)]
的filter進行max pooling。
?
**2.2.3 經典卷積模型LeNet-5 **
卷積神經網絡的特有結構為卷積層和池化層邢滑,通過這種網絡結構組合而得的神經網絡有無限多種腐螟,下面我們介紹一個經典的卷積模型LeNet-5 ,這個模型是在論文Gradient-based learning applied to document recognition中提出的困后,它是第一應用于數字識別的卷積神經網絡乐纸,在MNIST數據集上LeNet-5模型上可以得到99.2%的準確率,它一共有7層結構:
?
從左到右分別是:卷積摇予、池化汽绢、卷積、池化侧戴、全連接宁昭、全連接、全連接酗宋。
2.2 CNN文本分類
上面章節(jié)簡單對CNN進行了介紹积仗,那回到我們的正題,繼續(xù)說CNN和文本分類蜕猫,我們以一篇經典的論文方法介紹下CNN是如何用于文本分類的(論文地址:https://arxiv.org/pdf/1408.5882.pdf)寂曹。
?
這篇論文提出的模型架構圖如上,整體模型主要分為三個部分:輸入層回右、卷積+池化層隆圆、全連接+softmax層∠杷福可以看出渺氧,這個模型跟我們前面介紹LeNet-5模型相比結構簡單了許多,這也是由文本輸入特殊性造成的租漂。
2.2.1 輸入層
輸入層會將一段文本轉換成卷積層所需要的輸入格式阶女,一般會得到一個三維的輸入[圖片上傳失敗...(image-a61c54-1557814223444)]
。
其中[圖片上傳失敗...(image-82634d-1557814223444)]
代表一段文本單詞數量哩治。因為文本的單詞數量是變長的秃踩,在這里我們需要對輸入文本做預處理,將其加工成定長业筏。常用的方法有取數據中最長文本長度憔杨、統(tǒng)計文本長度分布取一個能覆蓋大部分文本的長度。這里推薦第二種方法蒜胖。
[圖片上傳失敗...(image-6fd036-1557814223444)]
代表embedding的維度消别。每個單詞的embedding可以使用word2vec或者GloVe訓練好的詞向量抛蚤,比如這個網站上有使用GloVe模型訓練好的詞向量,地址:https://nlp.stanford.edu/data/寻狂,其中詞向量維度有50,100,200,300維岁经。當然也可以使用完全隨機的詞向量。不過一般實驗證明蛇券,使用pre-trained詞向量對于一般的NLP任務都有提升缀壤。
[圖片上傳失敗...(image-1ef4bb-1557814223444)]
對于一個圖像來說通常是3,代表RGB圖片纠亚,對于文本來說塘慕,通常這個值為1。不過這篇文章中提出了一種multi-channel方法蒂胞,將這個設置為2图呢,其實就是將兩種文本的不同來源的embedding拼到了一起,下面介紹下論文中提到不同embedding的方法
<caption>不同類型輸入</caption>
|
|
|
| CNN-rand | 所有的word vector都是隨機初始化的骗随,同時當做訓練過程中優(yōu)化的參數 |
| CNN-static | 所有的word vector直接使用無監(jiān)督學習即Google的Word2Vector工具(COW模型)得到的結果蛤织,并且是固定不變的 |
| CNN-non-static | 所有的word vector直接使用無監(jiān)督學習即Google的Word2Vector工具(COW模型)得到的結果,但是會在訓練過程中被Fine tuned
|
| CNN-multichannel | CNN-static和CNN-non-static的混合版本蚊锹,即兩種類型的輸入 |
2.2.2 卷積+池化層
經過輸入層后瞳筏,我們得到了表示文本的三維輸入稚瘾,它的形狀為[圖片上傳失敗...(image-46335-1557814223443)]
牡昆,接下來我們對輸入進行卷積操作。卷積filter的尺寸為[圖片上傳失敗...(image-e716d2-1557814223443)]
摊欠,其中[圖片上傳失敗...(image-3e45c7-1557814223443)]
代表filter長度丢烘,也就是每次處理文本中單詞的數量;[圖片上傳失敗...(image-8243a1-1557814223443)]
代表embedding的維度些椒;[圖片上傳失敗...(image-3be78c-1557814223443)]
代表filter的深度播瞳,我們可以使用不同的[圖片上傳失敗...(image-255b48-1557814223443)]
分別進行卷積來提取更多的特征∶飧猓可以看出每次卷積的時候都是整行整行的進行赢乓。當[圖片上傳失敗...(image-6b5203-1557814223443)]
可以理解為unigram特征,[圖片上傳失敗...(image-785ccc-1557814223443)]
的時候就是bigram特征石窑。在卷積層我們分別采取[圖片上傳失敗...(image-b419e5-1557814223443)]
進行卷積就得到了三個feature map牌芋,每個feature map的長度跟原文本的長度相關,寬度為[圖片上傳失敗...(image-b56d23-1557814223443)]
松逊,經過卷積層后我們就提取到了原文本的n-gram相關特征躺屁。
在池化層采用了max-pooling的方法,池化層的filter的[圖片上傳失敗...(image-ef9c30-1557814223443)]
经宏,其中[圖片上傳失敗...(image-837cf6-1557814223443)]
代表對文本卷積后feature map的長度犀暑。經過池化后feature map的維度會降為1驯击,因此pooling結束后彻况,得到向量的維度就是[圖片上傳失敗...(image-7311e4-1557814223443)]
乳附,這樣就得到整個文本的特征表示具钥。
這個模型只使用了一層卷積+一層池化兔魂,跟LeNet-5模型相比皮胡,還是太過于簡單了勒葱,但是從paper中的實驗來看防嗡,這個模型性能已經很好了悼院,那么問題來了
- CNN用于文本可以采用多層卷積+池化的結構嗎轨域?
- CNN提取的特征究竟代表什么意義袱耽?
- max-pooling的方法過于簡單粗暴,有沒有什么別的方法干发?
2.2.3 全連接+softmax層
經過卷積池化后我們得到了表示文本的特征向量朱巨,然后再經過一個全連接+softmax層就得到了代表屬于不同類別的概率向量,也就完成了分類的工作枉长。
三冀续、實驗結果
貼一個原文的實驗結果:
?
- pre-trained詞向量能明顯提升分類效果,可以看出CNN-static是明顯好于CNN-rand的結果
- CNN-multichannel在小數據集上好于CNN-singlechannel必峰。作者初始是希望multichannle避免過擬合洪唐,是詞向量盡量不要偏離原始預訓練好的詞向量同時也使詞向量適應于具體的任務
- CNN-non-static比大部分CNN-static好,說明適當fine-tune是有用的吼蚁,使詞向量適當適應具體任務凭需,如下表所示,對于'bad'這個詞肝匆,static channel將'good'作為鄰居詞粒蜈,這對情感分析類的任務是不太準確的。而Non-static channel經過fine tune就得到‘terrible’的鄰居詞旗国,這跟情感分析任務是對應的枯怖。
?
下面給出一些調參技巧,出自https://blog.csdn.net/memray/article/details/51454208
下面總結一下Ye Zhang等人基于Kim Y的模型做了大量的調參實驗之后的結論:
- 由于模型訓練過程中的隨機性因素能曾,如隨機初始化的權重參數度硝,mini-batch,隨機梯度下降優(yōu)化算法等寿冕,造成模型在數據集上的結果有一定的浮動蕊程,如準確率(accuracy)能達到1.5%的浮動,而AUC則有3.4%的浮動蚂斤;
- 詞向量是使用word2vec還是GloVe存捺,對實驗結果有一定的影響,具體哪個更好依賴于任務本身;
- Filter的大小對模型性能有較大的影響捌治,并且Filter的參數應該是可以更新的岗钩;
- Feature Map的數量也有一定影響,但是需要兼顧模型的訓練效率肖油;
- 1-max pooling的方式已經足夠好了兼吓,相比于其他的pooling方式而言;
- 正則化的作用微乎其微森枪。
Ye Zhang等人給予模型調參者的建議如下:
- 使用
non-static
版本的word2vec
或者GloVe
要比單純的one-hot取得的效果好得多视搏; - 為了找到最優(yōu)的過濾器(Filter)大小,可以使用線性搜索的方法县袱。通常過濾器的大小范圍在
1-10
之間浑娜,當然對于長句,使用更大的過濾器也是有必要的式散; -
Feature Map
的數量在100-600
之間筋遭; - 可以盡量多嘗試激活函數,實驗發(fā)現
ReLU
和tanh
兩種激活函數表現較佳暴拄; - 使用簡單的
1-max pooling
就已經足夠了漓滔,可以沒必要設置太復雜的pooling方式; - 當發(fā)現增加
Feature Map
的數量使得模型的性能下降時乖篷,可以考慮增大正則的力度响驴,如調高dropout
的概率; - 為了檢驗模型的性能水平撕蔼,多次反復的交叉驗證是必要的豁鲤,這可以確保模型的高性能并不是偶然。
四罕邀、代碼實現
CNN文本分類的tensorflow實現
執(zhí)行訓練
使用隨機初始化的詞向量進行訓練
python train.py --input_layer_type 'CNN-rand'
使用與訓練好的GloVe 詞向量訓練畅形,在訓練過程中詞向量不可訓練,是固定的
python train.py --input_layer_type 'CNN-static'
使用與訓練好的GloVe 詞向量訓練诉探,在訓練中微調詞向量
python train.py --input_layer_type 'CNN-non-static'
使用兩個詞向量組成雙通道作為輸入,一個固定棍厌,另一個可以微調
python train.py --input_layer_type 'CNN-multichannel'
Preference
http://www.jeyzhang.com/cnn-apply-on-modelling-sentence.html