做者:llhthinker 我的博客:http://www.cnblogs.com/llhthinker/git
文本分類是天然語言處理的一個基本任務,試圖推斷出給定的文本(句子、文檔等)的標籤或標籤集合。github
文本分類的應用很是普遍。如:網絡
垃圾郵件分類:二分類問題,判斷郵件是否爲垃圾郵件架構
情感分析機器學習
二分類問題,判斷文本情感是積極(positive)仍是消極(negative)ide
多分類問題,判斷文本情感屬於{很是消極,消極,中立,積極,很是積極}中的哪一類函數
新聞主題分類:判斷新聞屬於哪一個類別,如財經、體育、娛樂等性能
自動問答系統中的問句分類學習
社區問答系統中的問題分類:多標籤分類,如知乎看山杯優化
更多應用:
讓AI當法官: 基於案件事實描述文本的罰金等級分類(多分類)和法條分類(多標籤分類)。
判斷新聞是否爲機器人所寫: 二分類
......
不一樣類型的文本分類每每有不一樣的評價指標,具體以下:
二分類:accuracy,precision,recall,f1-score,...
多分類: Micro-Averaged-F1, Macro-Averaged-F1, ...
多標籤分類:Jaccard類似係數, ...
傳統的機器學習方法主要利用天然語言處理中的n-gram概念對文本進行特徵提取,而且使用TFIDF對n-gram特徵權重進行調整,而後將提取到的文本特徵輸入到Logistics迴歸、SVM等分類器中進行訓練。可是,上述的特徵提取方法存在數據稀疏和維度爆炸等問題,這對分類器來講是災難性的,而且使得訓練的模型泛化能力有限。所以,每每須要採起一些策略進行降維:
人工降維:停用詞過濾,低頻n-gram過濾等
自動降維:LDA等
值得指出的是,將深度學習中的word2vec,doc2vec做爲文本特徵與上文提取的特徵進行融合,經常能夠提升模型精度。
論文Convolutional Neural Networks for Sentence Classification提出了使用CNN進行句子分類的方法。
3.1 CNN模型推導
一個句子是由多個詞拼接而成的,若是一個句子有n個詞,且第i個詞表示爲xi,詞xi經過embedding後表示爲k維的向量,即xi∈ℜk,則一個句子x1:n爲n∗k的矩陣,能夠形式化以下:
3.2 優化CNN模型
上圖爲模型架構示例,在示例中,句長n=9,詞向量維度k=6,filter有兩種窗口大小(或者說kernel size),每種有2個,所以filter總個數m=4,其中:
一種的窗口大小h=2(紅色框),卷積後的向量維度爲n−h+1=8
另外一種窗口大小h=3(黃色框),卷積後的向量維度爲n−h+1=7
Dropout: 對全鏈接層的輸入z向量進行dropout
其中r∈ℜm爲masking向量(每一個維度值非0即1,能夠經過伯努利分佈隨機生成),和向量z進行元素與元素對應相乘,讓r向量值爲0的位置對應的z向量中的元素值失效(梯度沒法更新)。
L2-norms: 對L2正則化項增長限制:當正則項‖W‖2>s時, 令‖W‖2=s,其中s爲超參數。
3.3 一些結論
Multichannel vs. Single Channel Models: 雖然做者一開始認爲多通道能夠預防過擬合,從而應該表現更高,尤爲是在小規模數據集上。但事實是,單通道在一些語料上比多通道更好;
Static vs. Non-static Representations: 在大部分的語料上,CNN-non-static都優於CNN-static,一個解釋:預訓練詞向量可能認爲‘good’和‘bad’相似(可能它們有許多相似的上下文),可是對於情感分析任務,good和bad應該要有明顯的區分,若是使用CNN-static就沒法作調整了;
Dropout能夠提升2%–4%性能(performance);
對於不在預訓練的word2vec中的詞,使用均勻分佈U[−a,a]隨機初始化,而且調整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)?
RNN能夠提取全局特徵
RCNN(下文說明): RNN和CNN的結合
filter至關於N-gram ?
filter只提取局部特徵?全局特徵怎麼辦?能夠融合嗎?
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大小上執行搜索,以找到當前數據集的「最佳」大小,而後探索這個最佳大小附近的多種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)的優勢,並可以加速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=70,以下圖,以後會考慮將大小寫字母都包含在內做爲對比)
字符數字化(編碼): "one-hot"編碼序列(文本)長度:l0 (定值)
而後論文設計了兩種類型的卷積網絡:Large和Small(做爲對照實驗)
它們都有9層,其中6層爲卷積層(convolutional layer);3層爲全鏈接層(fully-connected layer):
Dropout的機率都爲0.5
使用高斯分佈(Gaussian distribution)對權重進行初始化:
最後一層卷積層單個filter輸出特徵長度(the output frame length)爲 l6=(l0−96)/27,推
第一層全鏈接層的輸入維度(其中1024和256爲filter個數或者說frame/feature size):
Large: l6∗1024
Small: l6∗256
下圖爲模型的一個圖解示例。其中文本長度爲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是一個有效的方法
數據集的大小能夠爲選擇傳統方法仍是卷積網絡模型提供指導:對於幾百上千等小規模數據集,能夠優先考慮傳統方法,對於百萬規模的數據集,字符級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),可是這比較不現實而且對於大規模語料來講代價昂貴。
一個更天然的選擇是使用詞語或短語的同義詞或同義短語進行替換,從而達到數據加強的目的。具體作法以下:
英文同義詞典: from the mytheas component used in LibreOffice1 project. http://www.libreoffice.org/
從給定的文本中抽取出全部能夠替換的詞,而後隨機選擇r個進行替換,其中r由一個參數爲pp的幾何分佈(geometric distribution)肯定,即P[r]∼pr
給定一個待替換的詞,其同義詞可能有多個(一個列表),選擇第s個的機率也經過另外一個幾何分佈肯定,即P[s]∼qs。這樣是爲了當前詞的同義詞列表中的距離較遠(s較大)的同義詞被選的機率更小。
論文實驗設置:p=0.5,q=0.5。
策略1:直接使用RNN的最後一個單元輸出向量做爲文本特徵
策略2:使用雙向RNN的兩個方向的輸出向量的鏈接(concatenate)或均值做爲文本特徵
策略3:將全部RNN單元的輸出向量的均值pooling或者max-pooling做爲文本特徵
策略4:層次RNN+Attention, Hierarchical Attention Networks
論文Recurrent Convolutional Neural Networks for Text Classification設計了一種RNN和CNN結合的模型用於文本分類。
5.1 RCNN模型推導
5.1.1 詞表示學習
使用雙向RNN分別學習當前詞wi的左上下文表示cl(wi)和右上下文表示cr(wi),再與當前詞自身的表示e(wi)鏈接,構成卷積層的輸入xi。具體以下:
而後將xi做爲wi的表示,輸入到激活函數爲tanh,kernel size爲1的卷積層,獲得wi的潛在語義向量(latent semantic vector)
將kernel size設置爲1是由於xi中已經包含wi左右上下文的信息,無需再使用窗口大於1的filter進行特徵提取。可是須要說明的是,在實踐中仍然能夠同時使用多種kernel size的filter,如[1, 2, 3],可能取得更好的效果,一種可能的解釋是窗口大於1的filter強化了wi的左右最近的上下文信息。此外,實踐中可使用更復雜的RNN來捕獲wi的上下文信息如LSTM和GRU等。
5.1 2 文本表示學習
通過卷積層後,得到了全部詞的表示,而後在通過最大池化層和全鏈接層獲得文本的表示,最後經過softmax層進行分類。具體以下:
下圖爲上述過程的一個圖解:
5.2 RCNN相關總結
NN vs. traditional methods: 在該論文的全部實驗數據集上,神經網絡比傳統方法的效果都要好
Convolution-based vs. RecursiveNN: 基於卷積的方法比基於遞歸神經網絡的方法要好
RCNN vs. CFG and C&J: The RCNN能夠捕獲更長的模式(patterns)
RCNN vs. CNN: 在該論文的全部實驗數據集上,RCNN比CNN更好
CNNs使用固定的詞窗口(window of words), 實驗結果受窗口大小影響
RCNNs使用循環結構捕獲普遍的上下文信息
上述的深度學習方法經過引入CNN或RNN進行特徵提取,能夠達到比較好的效果,可是也存在一些問題,如參數較多致使訓練時間過長,超參數較多模型調整麻煩等。下面兩篇論文提出了一些簡單的模型用於文本分類,而且在簡單的模型上採用了一些優化策略。
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)應用在文本分類任務中的優缺點,強調深層無序組合方法的有效性、效率以及靈活性。
6.1.1 Neural Bag-of-Words Models
論文首先提出了一個最簡單的無序模型Neural Bag-of-Words Models (NBOW model)。該模型直接將文本中全部詞向量的平均值做爲文本的表示,而後輸入到softmax 層,形式化表示以下:
6.1.2 Considering Syntax for Composition
一些考慮語法的方法:
Recursive neural networks (RecNNs)
能夠考慮一些複雜的語言學現象,如否認、轉折等 (優勢)
實現效果依賴輸入序列(文本)的句法樹(可能不適合長文本和不太規範的文本)
須要更多的訓練時間
Using a convolutional network instead of a RecNN
時間複雜度一樣比較大,甚至更大(經過實驗結果得出的結論,這取決於filter大小、個數等超參數的設置)
6.1.3 Deep Averaging Networks
Deep Averaging Networks (DAN)是在NBOW model的基礎上,經過增長多個隱藏層,增長網絡的深度(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]提升效率
根據github repo: state-of-the-art-result-for-machine-learning-problems ,下面兩篇論文提出的模型能夠在文本分類取得最優的結果(讓AI當法官比賽第一名使用了論文Learning Structured Text Representations中的模型):
Learning Structured Text Representations
Attentive Convolution
論文Multi-Task Label Embedding for Text Classification 認爲標籤與標籤之間有可能有聯繫,因此不是像以前的深度學習模型把標籤當作one-hot vector,而是對每一個標籤進行embedding學習,以提升文本分類的精度。
[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