【長篇乾貨】深度學習在文字分類中的應用
作者:llhthinker
個人部落格:http://www.cnblogs.com/llhthinker/
文章程式碼:https://github.com/llhthinker/BDCI2017-MingLue
文字分類任務介紹
文字分類是自然語言處理的一個基本任務,試圖推斷出給定的文字(句子、文件等)的標籤或標籤集合。
文字分類的應用非常廣泛。如:
1)垃圾郵件分類:二分類問題,判斷郵件是否為垃圾郵件
2)情感分析
二分類問題,判斷文字情感是積極(positive)還是消極(negative)
多分類問題,判斷文字情感屬於{非常消極,消極,中立,積極,非常積極}中的哪一類
3)新聞主題分類:判斷新聞屬於哪個類別,如財經、體育、娛樂等
4)自動問答系統中的問句分類
5)社群問答系統中的問題分類:多標籤分類,如知乎看山杯
6)更多應用:
讓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作為文字特徵與上文提取的特徵進行融合,常常可以提高模型精度。
CNN用於文字分類
論文Convolutional Neural Networks for Sentence Classification提出了使用CNN進行句子分類的方法。
1. CNN模型推導
一個句子是由多個詞拼接而成的,如果一個句子有n個詞,且第i個詞表示為xi,詞xi通過embedding後表示為k維的向量,即xi∈ℜk,則一個句子x1:n為n∗k的矩陣,可以形式化如下:
2. 優化CNN模型
詞向量
隨機初始化 (CNN-rand)
預訓練詞向量進行初始化,在訓練過程中固定 (CNN-static)
預訓練詞向量進行初始化,在訓練過程中進行微調 (CNN-non-static)
多通道(CNN-multichannel):將固定的預訓練詞向量和微調的詞向量分別當作一個通道(channel),卷積操作同時在這兩個通道上進行,可以類比於影象RGB三通道。
上圖為模型架構示例,在示例中,句長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
y=W⋅(z∘r)+b
其中r∈ℜm為masking向量(每個維度值非0即1,可以通過伯努利分佈隨機生成),和向量z進行元素與元素對應相乘,讓r向量值為0的位置對應的z向量中的元素值失效(梯度無法更新)。
L2-norms: 對L2正則化項增加限制:當正則項‖W‖2>s時, 令‖W‖2=s,其中s為超引數。
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更少。
4. 進一步思考CNN
1) 為什麼CNN能夠用於文字分類(NLP)?
RNN可以提取全域性特徵
RCNN(下文說明): RNN和CNN的結合
filter相當於N-gram ?
filter只提取區域性特徵?全域性特徵怎麼辦?可以融合嗎?
2) 超引數怎麼調?
論文A Sensitivity Analysis of (and Practitioners' Guide to) Convolutional Neural Networks for Sentence Classification提供了一些策略。
a. 用什麼樣的詞向量
使用預訓練詞向量比隨機初始化的效果要好
採取微調策略(non-static)的效果比固定詞向量(static)的效果要好
無法確定用哪種預訓練詞向量(Google word2vec / GloVe representations)更好,不同的任務結果不同,應該對於你當前的任務進行實驗;
b. filter視窗大小、數量
在實踐中,100到600是一個比較合理的搜尋空間。
每次使用一種型別的filter進行實驗,表明filter的視窗大小設定在1到10之間是一個比較合理的選擇。
首先在一種型別的filter大小上執行搜尋,以找到當前資料集的“最佳”大小,然後探索這個最佳大小附近的多種filter大小的組合。
每種視窗型別的filter對應的“最好”的filter個數(feature map數量)取決於具體資料集;
但是,可以看出,當feature map數量超過600時,performance提高有限,甚至會損害performance,這可能是過多的feature map數量導致過擬合了;
c. 啟用函式 (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
d. 池化策略:最大池化就是最好的嗎
對於句子分類任務,1-max pooling往往比其他池化策略要好;
這可能是因為上下文的具體位置對於預測Label可能並不是很重要,而句子某個具體的n-gram(1-max pooling後filter提取出來的的特徵)可能更可以刻畫整個句子的某些含義,對於預測label更有意義;
(但是在其他任務如釋義識別,k-max pooling可能更好。)
e. 正則化
0.1到0.5之間的非零dropout rates能夠提高一些performance(儘管提升幅度很小),具體的最佳設定取決於具體資料集;
對l2 norm加上一個約束往往不會提高performance(除了Opi資料集);
當feature map的數量大於100時,可能導致過擬合,影響performance,而dropout將減輕這種影響;
在卷積層上進行dropout幫助很小,而且較大的dropout rate對performance有壞的影響。
5. 字元級別的CNN用於文字分類
論文Character-level convolutional networks for text classification將文字看成字元級別的序列,使用字元級別(Character-level)的CNN進行文字分類。
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。
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) 使用同義詞表進行資料增強
對於深度學習模型,採用適當的資料增強(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。
RNN用於文字分類
策略1:直接使用RNN的最後一個單元輸出向量作為文字特徵
策略2:使用雙向RNN的兩個方向的輸出向量的連線(concatenate)或均值作為文字特徵
策略3:將所有RNN單元的輸出向量的均值pooling或者max-pooling作為文字特徵
策略4:層次RNN+Attention, Hierarchical Attention Networks
RCNN(RNN+CNN)用於文字分類
論文Recurrent Convolutional Neural Networks for Text Classification設計了一種RNN和CNN結合的模型用於文字分類。
1. RCNN模型推導
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等。
2) 文字表示學習
經過卷積層後,獲得了所有詞的表示,然後在經過最大池化層和全連線層得到文字的表示,最後通過softmax層進行分類。具體如下:
下圖為上述過程的一個圖解:
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嗎
上述的深度學習方法通過引入CNN或RNN進行特徵提取,可以達到比較好的效果,但是也存在一些問題,如引數較多導致訓練時間過長,超引數較多模型調整麻煩等。下面兩篇論文提出了一些簡單的模型用於文字分類,並且在簡單的模型上採用了一些優化策略。
1. 深層無序組合方法
論文Deep Unordered Composition Rivals Syntactic Methods for Text Classification提出了NBOW(Neural Bag-of-Words)模型和DAN(Deep Averaging Networks)模型。對比了深層無序組合方法(Deep Unordered Composition)和句法方法(Syntactic Methods)應用在文字分類任務中的優缺點,強調深層無序組合方法的有效性、效率以及靈活性。
1) Neural Bag-of-Words Models
論文首先提出了一個最簡單的無序模型Neural Bag-of-Words Models (NBOW model)。該模型直接將文字中所有詞向量的平均值作為文字的表示,然後輸入到softmax 層,形式化表示如下:
2) Considering Syntax for Composition
一些考慮語法的方法:
Recursive neural networks (RecNNs)
可以考慮一些複雜的語言學現象,如否定、轉折等 (優點)
實現效果依賴輸入序列(文字)的句法樹(可能不適合長文字和不太規範的文字)
需要更多的訓練時間
Using a convolutional network instead of a RecNN
時間複雜度同樣比較大,甚至更大(通過實驗結果得出的結論,這取決於filter大小、個數等超引數的設定)
3) Deep Averaging Networks
Deep Averaging Networks (DAN)是在NBOW model的基礎上,通過增加多個隱藏層,增加網路的深度(Deep)。下圖為帶有兩層隱藏層的DAN與RecNN模型的對比。
4) Word Dropout Improves Robustness
針對DAN模型,論文提出一種word dropout策略:在求平均詞向量前,隨機使得文字中的某些單詞(token)失效。形式化表示如下:
Word Dropout可能會使得某些非常重要的token失效。然而,使用word dropout往往確實有提升,這可能是因為,一些對標籤預測起到關鍵性作用的word數量往往小於無關緊要的word數量。例如,對於情感分析任務,中立(neutral)的單詞往往是最多的。
Word dropout 同樣可以用於其他基於神經網路的方法。
Word Dropout或許起到了類似資料增強(Data Augmentation)的作用?
2. fastText
論文Bag of Tricks for Efficient Text Classification提出一個快速進行文字分類的模型和一些trick。
1) fastText模型架構
fastText模型直接對所有進行embedded的特徵取均值,作為文字的特徵表示,如下圖。
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學習,以提高文字分類的精度。
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
✄------------------------------------------------
在本公眾號「七月線上實驗室」回覆以下關鍵詞獲取AI乾貨
PPT--《1天搞懂深度學習》資料
小抄--機器學習常用庫小抄表
題庫-- 人工智慧面試題庫
資料集--人工智慧各行業資料彙總
思維導圖--Python學習必備思維導圖電子版
量化交易--量化投資程式設計課程與資料
相關文章
- 乾貨 | 深度學習在文字分類中的應用深度學習文字分類
- 乾貨解析|深度學習文字分類在支付寶投訴文字模型上的應用深度學習文字分類模型
- 文字圖Tranformer在文字分類中的應用ORM文字分類
- 深度學習在OC中的應用深度學習
- 【AI in 美團】深度學習在文字領域的應用AI深度學習
- AI在汽車中的應用:實用深度學習AI深度學習
- 【AI in 美團】深度學習在OCR中的應用AI深度學習
- 簡述遷移學習在深度學習中的應用遷移學習深度學習
- 深度學習——如何用LSTM進行文字分類深度學習文字分類
- 文字分類(下)-卷積神經網路(CNN)在文字分類上的應用文字分類卷積神經網路CNN
- 【深度學習】深度解讀:深度學習在IoT大資料和流分析中的應用深度學習大資料
- 萬字總結Keras深度學習中文文字分類Keras深度學習文字分類
- 乾貨 | 論文解讀:GAN在網路特徵學習中的應用特徵
- 126篇殿堂級深度學習論文分類整理,從入門到應用深度學習
- 小乾貨~ NFS在Linux系統中的應用NFSLinux
- 深度學習在股票市場的應用深度學習
- 【乾貨】機器學習和深度學習概念入門機器學習深度學習
- 乾貨|當深度學習遇見自動文字摘要,seq2seq+attention深度學習
- 深度學習模型在序列標註任務中的應用深度學習模型
- 深度學習在視覺搜尋和匹配中的應用深度學習視覺
- 如何理解雅克比矩陣在深度學習中的應用?矩陣深度學習
- 深度學習利器:TensorFlow在智慧終端中的應用深度學習
- 深度學習在搜狗無線搜尋廣告中的應用深度學習
- 如何用 Python 和深度遷移學習做文字分類?Python遷移學習文字分類
- 卷積操作的概念及其在深度學習中的應用卷積深度學習
- 深度學習在醫療領域的應用深度學習
- 深度學習在乳腺癌上的應用!深度學習
- 深度學習在攜程攻略社群的應用深度學習
- 深度學習在攜程搜尋詞義解析中的應用深度學習
- 深度學習技術在網路入侵檢測中的應用深度學習
- 深度學習在攝影技術中的應用與發展深度學習
- 深度學習在推薦系統中的應用綜述(最全)深度學習
- 文字分類在內容安全應用中的資料不平衡問題文字分類
- 在學習中運用類比
- 叮,關於NPL與深度學習的“乾貨”請查收!深度學習
- 深度學習(二)之貓狗分類深度學習
- 【人人都能學得會的NLP - 文字分類篇 03】長文字多標籤分類分類如何做?文字分類
- RecSys提前看 | 深度學習在推薦系統中的最新應用深度學習