1. 文本分類任務介紹
文本分類是自然語言處理的一個基本任務,試圖推斷出給定的文本(句子、文檔等)的標簽或標簽集合。文本分類的應用非常廣泛。如:
垃圾郵件分類:二分類問題,判斷郵件是否為垃圾郵件
情感分析
二分類問題,判斷文本情感是積極(positive)還是消極(negative)
多分類問題,判斷文本情感屬于{非常消極,消極,中立,積極,非常積極}中的哪一類
新聞主題分類:判斷新聞屬于哪個類別,如財經、體育、娛樂等
自動問答系統(tǒng)中的問句分類
社區(qū)問答系統(tǒng)中的問題分類:多標簽分類
更多應用:
讓AI當法官: 基于案件事實描述文本的罰金等級分類(多分類)和法條分類(多標簽分類)。
判斷新聞是否為機器人所寫: 二分類
不同類型的文本分類往往有不同的評價指標,具體如下:
二分類:accuracy,precision,recall,f1-score,...
多分類: Micro-Averaged-F1, Macro-Averaged-F1, ...
多標簽分類:Jaccard相似系數, ...
2. 傳統(tǒng)機器學習方法
傳統(tǒng)的機器學習方法主要利用自然語言處理中的n-gram概念對文本進行特征提取,并且使用TFIDF對n-gram特征權重進行調整,然后將提取到的文本特征輸入到Logistics回歸、SVM等分類器中進行訓練。但是,上述的特征提取方法存在數據稀疏和維度爆炸等問題,這對分類器來說是災難性的,并且使得訓練的模型泛化能力有限。因此,往往需要采取一些策略進行降維:
人工降維:停用詞過濾,低頻n-gram過濾等
自動降維:LDA等
值得指出的是,將深度學習中的word2vec,doc2vec作為文本特征與上文提取的特征進行融合,常??梢蕴岣吣P途?。
3. CNN用于文本分類
論文Convolutional Neural Networks for Sentence Classification提出了使用CNN進行句子分類的方法。
3.1 CNN模型推導
一個句子是由多個詞拼接而成的,如果一個句子有n個詞,且第i個詞表示為正i,詞;通過embedding后表示為k維的向量,即,則一個句子為n?*?k的矩陣,可以形式化如下:
一個包含h個的詞的詞窗口表示為:
一個filter是大小為h*k的矩陣,表示為:
通過一個filter作用一個詞窗口提取可以提取一個特征,?如下:
其中,是bias值,f為激活函數如Relu等。
卷積操作:通過一個filter在整個句子上從句首到句尾掃描-遍,提取每個詞窗口的特征,可以得到一個特征圖(featuremap),表示如下(這里默認不對句padding):?
池化操作:對一個filter提取到的featuremap進行maxpooling,得到只即:
若有m個filter,則通過一層卷積一層池化后可以得到一個長度為m的向量:
最后,將向量z輸入到全連接層,得到最終的特征提取向量y(這里的W為全連接層的權重,注意與filter進行區(qū)分):
3.2 優(yōu)化CNN模型
3.2.1 詞向量
隨機初始化 (CNN-rand)
預訓練詞向量進行初始化,在訓練過程中固定 (CNN-static)
預訓練詞向量進行初始化,在訓練過程中進行微調 (CNN-non-static)
多通道(CNN-multichannel):將固定的預訓練詞向量和微調的詞向量分別當作一個通道(channel),卷積操作同時在這兩個通道上進行,可以類比于圖像RGB三通道。
上圖為模型架構示例,在示例中,句長n=9,詞向量維度k=6,fiter有兩種窗口大小(或者說kernelsize),每種有2個,因此filter總個數m=4,其中:
一種的窗口大小h=2(紅色框),卷積后的向量維度為n一h+1=8
另-種窗口大小h=3(黃色框),卷積后的向量維度為n一h+1=7
3.2.2 正則化
Dropout:對全連接層的輸入z向量進行dropout
其中為masking向量(每個維度值非0即1,可以通過伯努利分布隨機生成),和向量z進行元素與元素對應相乘,讓r向量值為0的位置對應的z向量中的元素值失效(梯度無法更新)。
L2-norms:對L2正則化項增加限制:當正則項1|W112>8時,令|W1l2=s,其中s為超參數。
3.3 一些結論
Multichannel vs. Single Channel Models: 雖然作者一開始認為多通道可以預防過擬合,從而應該表現更高,尤其是在小規(guī)模數據集上。但事實是,單通道在一些語料上比多通道更好;
Static vs. Non-static Representations: 在大部分的語料上,CNN-non-static都優(yōu)于CNN-static,一個解釋:預訓練詞向量可能認為‘good’和‘bad’類似(可能它們有許多類似的上下文),但是對于情感分析任務,good和bad應該要有明顯的區(qū)分,如果使用CNN-static就無法做調整了;
Dropout可以提高2%–4%性能(performance);
對于不在預訓練的word2vec中的詞,使用均勻分布隨機初始化,并且調整a使得隨機初始化的詞向量和預訓練的詞向量保持相近的方差,可以有微弱提升;
可以嘗試其他的詞向量預訓練語料,如Wikipedia[Collobert et al. (2011)]
Adadelta(Zeiler, 2012)和Adagrad(Duchi et al., 2011)可以得到相近的結果,但是所需epoch更少。
3.4 進一步思考CNN
3.4.1 為什么CNN能夠用于文本分類(NLP)?
為什么CNN能夠用于文本分類(NLP)?
filter相當于N-gram ?
filter只提取局部特征?全局特征怎么辦?可以融合嗎?
RNN可以提取全局特征
RCNN(下文說明): RNN和CNN的結合
3.4.2 超參數怎么調?
論文A Sensitivity Analysis of (and Practitioners' Guide to) Convolutional Neural Networks for Sentence Classification提供了一些策略。
用什么樣的詞向量
使用預訓練詞向量比隨機初始化的效果要好
采取微調策略(non-static)的效果比固定詞向量(static)的效果要好
無法確定用哪種預訓練詞向量(Google word2vec / GloVe representations)更好,不同的任務結果不同,應該對于你當前的任務進行實驗;
filter窗口大小、數量
在實踐中,100到600是一個比較合理的搜索空間。
每次使用一種類型的filter進行實驗,表明filter的窗口大小設置在1到10之間是一個比較合理的選擇。
首先在一種類型的filter大小上執(zhí)行搜索,以找到當前數據集的“最佳”大小,然后探索這個最佳大小附近的多種filter大小的組合。
每種窗口類型的filter對應的“最好”的filter個數(feature map數量)取決于具體數據集;
但是,可以看出,當feature map數量超過600時,performance提高有限,甚至會損害performance,這可能是過多的feature map數量導致過擬合了;
激活函數 (tanh, relu, ...)
Sigmoid, Cube, and tanh cube相較于Relu和Tanh的激活函數,表現很糟糕;
tanh比sigmoid好,這可能是由于tanh具有zero centering property(過原點);
與Sigmoid相比,ReLU具有非飽和形式(a non-saturating form)的優(yōu)點,并能夠加速SGD的收斂。
對于某些數據集,線性變換(Iden,即不使用非線性激活函數)足夠捕獲詞嵌入與輸出標簽之間的相關性。(但是如果有多個隱藏層,相較于非線性激活函數,Iden就不太適合了,因為完全用線性激活函數,即使有多個隱藏層,組合后整個模型還是線性的,表達能力可能不足,無法捕獲足夠信息);
因此,建議首先考慮ReLU和tanh,也可以嘗試Iden
池化策略:最大池化就是最好的嗎
對于句子分類任務,1-max pooling往往比其他池化策略要好;
這可能是因為上下文的具體位置對于預測Label可能并不是很重要,而句子某個具體的n-gram(1-max pooling后filter提取出來的的特征)可能更可以刻畫整個句子的某些含義,對于預測label更有意義;
(但是在其他任務如釋義識別,k-max pooling可能更好。)
正則化
0.1到0.5之間的非零dropout rates能夠提高一些performance(盡管提升幅度很?。?,具體的最佳設置取決于具體數據集;
對l2 norm加上一個約束往往不會提高performance(除了Opi數據集);
當feature map的數量大于100時,可能導致過擬合,影響performance,而dropout將減輕這種影響;
在卷積層上進行dropout幫助很小,而且較大的dropout rate對performance有壞的影響。
3.5 字符級別的CNN用于文本分類
論文Character-level convolutional networks for text classification將文本看成字符級別的序列,使用字符級別(Character-level)的CNN進行文本分類。
3.5.1 字符級CNN的模型設計
首先需要對字符進行數字化(quantization)。具體如下:
定義字母表(Alphabet):大小為m(對于英文m=70m=70,如下圖,之后會考慮將大小寫字母都包含在內作為對比)
字符數字化(編碼): "one-hot"編碼
序列(文本)長度:?(定值)然后論文設計了兩種類型的卷積網絡:Large和Small(作為對照實驗)
它們都有9層,其中6層為卷積層(convolutional layer);3層為全連接層(fully-connected layer):
Dropout的概率都為0.5
使用高斯分布(Gaussian distribution)對權重進行初始化:
最后一層卷積層單個filter輸出特征長度(the output frame length)為,推
第一層全連接層的輸入維度(其中1024和256為filter個數或者說frame/feature size):
下圖為模型的一個圖解示例。其中文本長度為10,第一層卷積的kernel size為3(半透明黃色正方形),卷積個數為9(Feature=9),步長為1,因此Length=10-3+1=8,然后進行非重疊的max-pooling(即pooling的stride=size),pooling size為2,因此池化后的Length = 8 / 2 = 4。
3.5.2 字符級CNN的相關總結與思考
字符級CNN是一個有效的方法
數據集的大小可以為選擇傳統(tǒng)方法還是卷積網絡模型提供指導:對于幾百上千等小規(guī)模數據集,可以優(yōu)先考慮傳統(tǒng)方法,對于百萬規(guī)模的數據集,字符級CNN開始表現不錯。
字符級卷積網絡很適用于用戶生成數據(user-generated data)(如拼寫錯誤,表情符號等),
沒有免費的午餐(There is no free lunch)
中文怎么辦
中文中的同音詞非常多,如何克服?
如果把中文中的每個字作為一個字符,那么字母表將非常大
是否可以把中文先轉為拼音(pinyin)?
論文Character-level Convolutional Network for Text Classification Applied to Chinese Corpus進行了相關實驗。
將字符級和詞級進行結合是否結果更好
英文如何結合
中文如何結合
3.5.3 使用同義詞表進行數據增強
對于深度學習模型,采用適當的數據增強(Data Augmentation)技術可以提高模型的泛化能力。數據增強在計算機視覺領域比較常見,例如對圖像進行旋轉,適當扭曲,隨機增加噪聲等操作。對于NLP,最理想的數據增強方法是使用人類復述句子(human rephrases of sentences),但是這比較不現實并且對于大規(guī)模語料來說代價昂貴。一個更自然的選擇是使用詞語或短語的同義詞或同義短語進行替換,從而達到數據增強的目的。具體做法如下:
英文同義詞典: from themytheascomponent used in LibreOffice1 project.
http://www.libreoffice.org/
從給定的文本中抽取出所有可以替換的詞,然后隨機選擇個進行替換,其中r由一個參數為p的幾何分布(geometric distribution)確定,即
給定一個待替換的詞,其同義詞可能有多個(一個列表),選擇第s個的概率也通過另一個幾何分布確定,即。這樣是為了當前詞的同義詞列表中的距離較遠(s較大)的同義詞被選的概率更小。
論文實驗設置:p=0.5,q=0.5
4. RNN用于文本分類
策略1:直接使用RNN的最后一個單元輸出向量作為文本特征
策略2:使用雙向RNN的兩個方向的輸出向量的連接(concatenate)或均值作為文本特征
策略3:將所有RNN單元的輸出向量的均值pooling或者max-pooling作為文本特征
策略4:層次RNN+Attention,Hierarchical Attention Networks
5. RCNN(RNN+CNN)用于文本分類
論文Recurrent Convolutional Neural Networks for Text Classification設計了一種RNN和CNN結合的模型用于文本分類。
5.1 RCNN模型推導
5.1.1 詞表示學習
使用雙向RNN分別學習當前詞的左上下文表示和右上下文表示再與當前詞自身的表示連接,構成卷積層的輸入。具體如下:
然后將作為的表示,輸入到激活函數為tanh,kernel?size為1的卷積層,得到的潛在語義向量(latent?semantic?vector)
將kernelsize設置為1是因為中已經包含左右上下文的信息,無需再使用窗口大于1的filter進行特征提取。但是需要說明的是,在實踐中仍然可以同時使用多種kernel?size的filter,如[1,?2,?3],可能取得更好的效果,一種可能的解釋是窗口大于1的ilter強化了的左右最近的上下文信息。此外,實踐中可以使用更復雜的RNN來捕獲的上下文信息如LSTM和GRU等。
5.1 2 文本表示學習
經過卷積層后,獲得了所有詞的表示,然后在經過最大池化層和全連接層得到文本的表示,最后通過softmax層進行分類。具體如下:
下圖為上述過程的一個圖解:
5.2 RCNN相關總結
NN vs. traditional methods: 在該論文的所有實驗數據集上,神經網絡比傳統(tǒng)方法的效果都要好
Convolution-based vs. RecursiveNN: 基于卷積的方法比基于遞歸神經網絡的方法要好
RCNN vs. CFG and C&J: The RCNN可以捕獲更長的模式(patterns)
RCNN vs. CNN: 在該論文的所有實驗數據集上,RCNN比CNN更好
CNNs使用固定的詞窗口(window of words), 實驗結果受窗口大小影響
RCNNs使用循環(huán)結構捕獲廣泛的上下文信息
6. 一定要CNN/RNN嗎
上述的深度學習方法通過引入CNN或RNN進行特征提取,可以達到比較好的效果,但是也存在一些問題,如參數較多導致訓練時間過長,超參數較多模型調整麻煩等。下面兩篇論文提出了一些簡單的模型用于文本分類,并且在簡單的模型上采用了一些優(yōu)化策略。
6.1 深層無序組合方法
論文Deep Unordered Composition Rivals Syntactic Methods for Text Classification提出了NBOW(Neural Bag-of-Words)模型和DAN(Deep Averaging Networks)模型。對比了深層無序組合方法(Deep Unordered Composition)和句法方法(Syntactic Methods)應用在文本分類任務中的優(yōu)缺點,強調深層無序組合方法的有效性、效率以及靈活性。
6.1.1 Neural Bag-of-Words Models
論文首先提出了一個最簡單的無序模型Neural Bag-of-Words Models (NBOWmodel)。該模型直接將文本中所有詞向量的平均值作為文本的表示,然后輸入到softmax 層,形式化表示如下:
6.1.2 Considering Syntax for Composition
一些考慮語法的方法:
Recursive neural networks (RecNNs)
可以考慮一些復雜的語言學現象,如否定、轉折等 (優(yōu)點)
實現效果依賴輸入序列(文本)的句法樹(可能不適合長文本和不太規(guī)范的文本)
需要更多的訓練時間
Using a convolutional network instead of a RecNN
時間復雜度同樣比較大,甚至更大(通過實驗結果得出的結論,這取決于filter大小、個數等超參數的設置)
6.1.3 Deep Averaging Networks
Deep Averaging Networks (DAN)是在NBOWmodel的基礎上,通過增加多個隱藏層,增加網絡的深度(Deep)。下圖為帶有兩層隱藏層的DAN與RecNN模型的對比。
6.1.4 Word Dropout Improves Robustness
針對DAN模型,論文提出一種word dropout策略:在求平均詞向量前,隨機使得文本中的某些單詞(token)失效。形式化表示如下:
Word Dropout可能會使得某些非常重要的token失效。然而,使用word dropout往往確實有提升,這可能是因為,一些對標簽預測起到關鍵性作用的word數量往往小于無關緊要的word數量。例如,對于情感分析任務,中立(neutral)的單詞往往是最多的。
Word dropout 同樣可以用于其他基于神經網絡的方法。
Word Dropout或許起到了類似數據增強(Data Augmentation)的作用?
6.2 fastText
論文Bag of Tricks for Efficient Text Classification提出一個快速進行文本分類的模型和一些trick。
6.2.1 fastText模型架構
fastText模型直接對所有進行embedded的特征取均值,作為文本的特征表示,如下圖。
6.2.2 特點
當類別數量較大時,使用Hierachical Softmax
將N-gram融入特征中,并且使用Hashing trick[Weinberger et al.2009]提高效率
7. 最新研究
根據github repo:state-of-the-art-result-for-machine-learning-problems,下面兩篇論文提出的模型可以在文本分類取得最優(yōu)的結果(讓AI當法官比賽第一名使用了論文Learning Structured Text Representations中的模型):
Learning Structured Text Representations
Attentive Convolution
論文Multi-Task Label Embedding for Text Classification認為標簽與標簽之間有可能有聯系,所以不是像之前的深度學習模型把標簽看成one-hot vector,而是對每個標簽進行embedding學習,以提高文本分類的精度。
References[1] Le and Mikolov - 2014 - Distributed representations of sentences and documents[2] Kim - 2014 - Convolutional neural networks for sentence classification[3] Zhang and Wallace - 2015 - A Sensitivity Analysis of (and Practitioners' Guide to) Convolutional Neural Networks for Sentence Classification[4] Zhang et al. - 2015 - Character-level convolutional networks for text classification[5] Lai et al. - 2015 - Recurrent Convolutional Neural Networks for Text Classification[6] Iyyer et al. - 2015 - Deep unordered composition rivals syntactic methods for Text Classification[7] Joulin et al. - 2016 - Bag of tricks for efficient text classification[8] Liu and Lapata - 2017 - Learning Structured Text Representations[9] Yin and Schütze - 2017 - Attentive Convolution[10] Zhang et al. - 2017 - Multi-Task Label Embedding for Text Classification
-
文本分類
+關注
關注
0文章
18瀏覽量
7284 -
機器學習
+關注
關注
66文章
8353瀏覽量
132315 -
自然語言
+關注
關注
1文章
285瀏覽量
13320
原文標題:深度學習在文本分類中的應用
文章出處:【微信號:AI_shequ,微信公眾號:人工智能愛好者社區(qū)】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論