文本分類解決方法綜述(1)(2)(3)

1、傳統文本分類方法php

  文本分類問題算是天然語言處理領域中一個很是經典的問題了,相關研究最先能夠追溯到上世紀50年代,當時是經過專家規則(Pattern)進行分類,甚至在80年代初一度發展到利用知識工程創建專家系統,這樣作的好處是短平快的解決top問題,但顯然天花板很是低,不只費時費力,覆蓋的範圍和準確率都很是有限。後來伴隨着統計學習方法的發展,特別是90年代後互聯網在線文本數量增加和機器學習學科的興起,逐漸造成了一套解決大規模文本分類問題的經典玩法,這個階段的主要套路是人工特徵工程+淺層分類模型。整個文本分類問題就拆分紅了特徵工程分類器兩部分。git

1.1 特徵工程github

  特徵工程在機器學習中每每是最耗時耗力的,但卻極其的重要。抽象來說,機器學習問題是把數據轉換成信息再提煉到知識的過程,特徵是「數據-->信息」的過程,決定告終果的上限,而分類器是「信息-->知識」的過程,則是去逼近這個上限。然而特徵工程不一樣於分類器模型,不具有很強的通用性,每每須要結合對特徵任務的理解。文本分類問題所在的天然語言領域天然也有其特有的特徵處理邏輯,傳統分本分類任務大部分工做也在此處。文本特徵工程分爲文本預處理、特徵提取、文本表示三個部分,最終目的是把文本轉換成計算機可理解的格式,並封裝足夠用於分類的信息,即很強的特徵表達能力。算法

1)文本預處理網絡

  文本預處理過程是在文本中提取關鍵詞表示文本的過程,中文文本處理中主要包括文本分詞和去停用詞兩個階段。之因此進行分詞,是由於不少研究代表特徵粒度爲詞粒度遠好於字粒度,其實很好理解,由於大部分分類算法不考慮詞序信息,基於字粒度顯然損失了過多「n-gram」信息。具體到中文分詞,不一樣於英文有自然的空格間隔,須要設計複雜的分詞算法。傳統算法主要有基於字符串匹配的正向/逆向/雙向最大匹配;基於理解的句法和語義分析消歧;基於統計的互信息/CRF方法。近年來隨着深度學習的應用,WordEmbedding + Bi-LSTM+CRF方法逐漸成爲主流,本文重點在文本分類,就不展開了。而中止詞是文本中一些高頻的代詞連詞介詞等對文本分類無心義的詞,一般維護一個停用詞表,特徵提取過程當中刪除停用表中出現的詞,本質上屬於特徵選擇的一部分。架構

2)特徵提取dom

  向量空間模型的文本表示方法的特徵提取對應特徵項的選擇和特徵權重計算兩部分。特徵選擇的基本思路是根據某個評價指標獨立的對原始特徵項(詞項)進行評分排序,從中選擇得分最高的一些特徵項,過濾掉其他的特徵項。經常使用的評價有文檔頻率、互信息、信息增益、χ²統計量等。特徵權重主要是經典的TF-IDF方法及其擴展方法,主要思路是一個詞的重要度與在類別內的詞頻成正比,與全部類別出現的次數成反比。機器學習

3)文本表示分佈式

  文本表示的目的是把文本預處理後的轉換成計算機可理解的方式,是決定文本分類質量最重要的部分。傳統作法經常使用詞袋模型(BOW, Bag Of Words)或向量空間模型(Vector Space Model),最大的不足是忽略文本上下文關係,每一個詞之間彼此獨立,而且沒法表徵語義信息。詞袋模型的示例以下:( 0, 0, 0, 0, .... , 1, ... 0, 0, 0, 0)   通常來講詞庫量至少都是百萬級別,所以詞袋模型有個兩個最大的問題:高緯度、高稀疏性。詞袋模型是向量空間模型的基礎,所以向量空間模型經過特徵項選擇下降維度,經過特徵權重計算增長稠密性。ide

  傳統作法在文本表示方面除了向量空間模型,還有基於語義的文本表示方法,好比LDA主題模型、LSI/PLSI機率潛在語義索引等方法,通常認爲這些方法獲得的文本表示能夠認爲文檔的深層表示,而word embedding文本分佈式表示方法則是深度學習方法的重要基礎。

1.2 分類器

 

  分類器基本都是統計分類方法了,基本上大部分機器學習方法都在文本分類領域有所應用,好比樸素貝葉斯分類算法(Naïve Bayes)、KNN、SVM、最大熵和神經網絡等等。

2、深度學習文本分類方法

  上文介紹了傳統的文本分類作法,傳統作法主要問題的文本表示是高緯度高稀疏的,特徵表達能力很弱,並且神經網絡很不擅長對此類數據的處理;此外須要人工進行特徵工程,成本很高。而深度學習最初在之因此圖像和語音取得巨大成功,一個很重要的緣由是圖像和語音原始數據是連續和稠密的,有局部相關性。應用深度學習解決大規模文本分類問題最重要的是解決文本表示,再利用CNN/RNN等網絡結構自動獲取特徵表達能力,去掉繁雜的人工特徵工程,端到端的解決問題。接下來會分別介紹:

 

  分佈式表示(Distributed Representation)其實Hinton 最先在1986年就提出了,基本思想是將每一個詞表達成 n 維稠密、連續的實數向量,與之相對的one-hot encoding向量空間只有一個維度是1,其他都是0。分佈式表示最大的優勢是具有很是powerful的特徵表達能力,好比 n 維向量每維 k 個值,能夠表徵用深度學習(CNN RNN Attention)解決大規模文本分類問題 - 綜述和實踐 個概念。事實上,無論是神經網絡的隱層,仍是多個潛在變量的機率主題模型,都是應用分佈式表示。下圖是03年Bengio在 A Neural Probabilistic Language Model 的網絡結構:

 

用深度學習(CNN RNN Attention)解決大規模文本分類問題 - 綜述和實踐

 

  這篇文章提出的神經網絡語言模型(NNLM,Neural Probabilistic Language Model)採用的是文本分佈式表示,即每一個詞表示爲稠密的實數向量。NNLM模型的目標是構建語言模型:

 

用深度學習(CNN RNN Attention)解決大規模文本分類問題 - 綜述和實踐

 

  詞的分佈式表示即詞向量(word embedding)是訓練語言模型的一個附加產物,即圖中的Matrix C。

 

  儘管Hinton 86年就提出了詞的分佈式表示,Bengio 03年便提出了NNLM,詞向量真正火起來是google Mikolov 13年發表的兩篇word2vec的文章 Efficient Estimation of Word Representations in Vector Space 和 Distributed Representations of Words and Phrases and their Compositionality,更重要的是發佈了簡單好用的word2vec工具包,在語義維度上獲得了很好的驗證,極大的推動了文本分析的進程。下圖是文中提出的CBOW 和 Skip-Gram兩個模型的結構,基本相似於NNLM,不一樣的是模型去掉了非線性隱層,預測目標不一樣,CBOW是上下文詞預測當前詞,Skip-Gram則相反。

 

用深度學習(CNN RNN Attention)解決大規模文本分類問題 - 綜述和實踐

 

  除此以外,提出了Hierarchical Softmax 和 Negative Sample兩個方法,很好的解決了計算有效性,事實上這兩個方法都沒有嚴格的理論證實,有些trick之處,很是的實用主義。詳細的過程再也不闡述了,有興趣深刻理解word2vec的,推薦讀讀這篇很不錯的paper:word2vec Parameter Learning Explained。額外多提一點,實際上word2vec學習的向量和真正語義還有差距,更多學到的是具有類似上下文的詞,好比「good」「bad」類似度也很高,反而是文本分類任務輸入有監督的語義可以學到更好的語義表示,有機會後續系統分享下。

 

  至此,文本的表示經過詞向量的表示方式,把文本數據從高緯度高稀疏的神經網絡難處理的方式,變成了相似圖像、語音的的連續稠密數據。深度學習算法自己有很強的數據遷移性,不少以前在圖像領域很適用的深度學習算法好比CNN等也能夠很好的遷移到文本領域了,下一小節具體闡述下文本分類領域深度學習的方法。

2.2 深度學習文本分類模型

  詞向量解決了文本表示的問題,該部分介紹的文本分類模型則是利用CNN/RNN等深度學習網絡及其變體解決自動特徵提取(即特徵表達)的問題。

1)fastText

  fastText 是上文提到的 word2vec 做者 Mikolov 轉戰 Facebook 後16年7月剛發表的一篇論文 Bag of Tricks for Efficient Text Classification。把 fastText 放在此處並不是由於它是文本分類的主流作法,而是它極致簡單,模型圖見下:

用深度學習(CNN RNN Attention)解決大規模文本分類問題 - 綜述和實踐

 

  原理是把句子中全部的詞向量進行平均(某種意義上能夠理解爲只有一個avg pooling特殊CNN),而後直接接 softmax 層。其實文章也加入了一些 n-gram 特徵的 trick 來捕獲局部序列信息。文章倒沒太多信息量,算是「水文」吧,帶來的思考是文本分類問題是有一些「線性」問題的部分[from項亮],也就是說沒必要作過多的非線性轉換、特徵組合便可捕獲不少分類信息,所以有些任務即使簡單的模型即可以搞定了。

2)TextCNN

  本篇文章的題圖選用的就是14年這篇文章提出的TextCNN的結構(見下圖)。fastText 中的網絡結果是徹底沒有考慮詞序信息的,而它用的 n-gram 特徵 trick 偏偏說明了局部序列信息的重要意義。卷積神經網絡(CNN Convolutional Neural Network)最初在圖像領域取得了巨大成功,CNN原理就不講了,核心點在於能夠捕捉局部相關性,具體到文本分類任務中能夠利用CNN來提取句子中相似 n-gram 的關鍵信息。

TextCNN的詳細過程原理圖見下:

TextCNN詳細過程:第一層是圖中最左邊的7乘5的句子矩陣,每行是詞向量,維度=5,這個能夠類比爲圖像中的原始像素點了。而後通過有 filter_size=(2,3,4) 的一維卷積層,每一個filter_size 有兩個輸出 channel。第三層是一個1-max pooling層,這樣不一樣長度句子通過pooling層以後都能變成定長的表示了,最後接一層全鏈接的 softmax 層,輸出每一個類別的機率。

特徵:這裏的特徵就是詞向量,有靜態(static)和非靜態(non-static)方式。static方式採用好比word2vec預訓練的詞向量,訓練過程不更新詞向量,實質上屬於遷移學習了,特別是數據量比較小的狀況下,採用靜態的詞向量每每效果不錯。non-static則是在訓練過程當中更新詞向量。推薦的方式是 non-static 中的 fine-tunning方式,它是以預訓練(pre-train)的word2vec向量初始化詞向量,訓練過程當中調整詞向量,能加速收斂,固然若是有充足的訓練數據和資源,直接隨機初始化詞向量效果也是能夠的。

通道(Channels)圖像中能夠利用 (R, G, B) 做爲不一樣channel,而文本的輸入的channel一般是不一樣方式的embedding方式(好比 word2vec或Glove),實踐中也有利用靜態詞向量和fine-tunning詞向量做爲不一樣channel的作法。

一維卷積(conv-1d)圖像是二維數據,通過詞向量表達的文本爲一維數據,所以在TextCNN卷積用的是一維卷積。一維卷積帶來的問題是須要設計經過不一樣 filter_size 的 filter 獲取不一樣寬度的視野。

Pooling層:利用CNN解決文本分類問題的文章仍是不少的,好比這篇 A Convolutional Neural Network for Modelling Sentences 最有意思的輸入是在 pooling 改爲 (dynamic) k-max pooling ,pooling階段保留 k 個最大的信息,保留了全局的序列信息。好比在情感分析場景,舉個例子:

雖然前半部分體現情感是正向的,全局文本表達的是偏負面的情感,利用 k-max pooling可以很好捕捉這類信息。

3)TextRNN

  儘管TextCNN可以在不少任務裏面能有不錯的表現,但CNN有個最大問題是固定 filter_size 的視野,一方面沒法建模更長的序列信息,另外一方面 filter_size 的超參調節也很繁瑣。CNN本質是作文本的特徵表達工做,而天然語言處理中更經常使用的是遞歸神經網絡(RNN, Recurrent Neural Network),可以更好的表達上下文信息。具體在文本分類任務中,Bi-directional RNN(實際使用的是雙向LSTM)從某種意義上能夠理解爲能夠捕獲變長且雙向的的 "n-gram" 信息。

  RNN算是在天然語言處理領域很是一個標配網絡了,在序列標註/命名體識別/seq2seq模型等不少場景都有應用,Recurrent Neural Network for Text Classification with Multi-Task Learning文中介紹了RNN用於分類問題的設計,下圖LSTM用於網絡結構原理示意圖,示例中的是利用最後一個詞的結果直接接全鏈接層softmax輸出了。

4)TextRNN + Attention

  CNN和RNN用在文本分類任務中儘管效果顯著,但都有一個不足的地方就是不夠直觀,可解釋性很差,特別是在分析badcase時候感覺尤爲深入。而注意力(Attention)機制是天然語言處理領域一個經常使用的建模長時間記憶機制,可以很直觀的給出每一個詞對結果的貢獻,基本成了Seq2Seq模型的標配了。實際上文本分類從某種意義上也能夠理解爲一種特殊的Seq2Seq,因此考慮把Attention機制引入近來,研究了下學術界果真有相似作法。

Attention機制介紹:

  詳細介紹Attention恐怕須要一小篇文章的篇幅,感興趣的可參考14年這篇paper NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE

  以機器翻譯爲例簡單介紹下,下圖中 用深度學習(CNN RNN Attention)解決大規模文本分類問題 - 綜述和實踐 是源語言的一個詞,用深度學習(CNN RNN Attention)解決大規模文本分類問題 - 綜述和實踐 是目標語言的一個詞,機器翻譯的任務就是給定源序列獲得目標序列。翻譯 用深度學習(CNN RNN Attention)解決大規模文本分類問題 - 綜述和實踐 的過程產生取決於上一個詞 用深度學習(CNN RNN Attention)解決大規模文本分類問題 - 綜述和實踐 和源語言的詞的表示 用深度學習(CNN RNN Attention)解決大規模文本分類問題 - 綜述和實踐用深度學習(CNN RNN Attention)解決大規模文本分類問題 - 綜述和實踐 的 bi-RNN 模型的表示),而每一個詞所佔的權重是不同的。好比源語言是中文 「我 / 是 / 中國人」 目標語言 「i / am / Chinese」,翻譯出「Chinese」時候顯然取決於「中國人」,而與「我 / 是」基本無關。下圖公式, 用深度學習(CNN RNN Attention)解決大規模文本分類問題 - 綜述和實踐 則是翻譯英文第 用深度學習(CNN RNN Attention)解決大規模文本分類問題 - 綜述和實踐 個詞時,中文第 用深度學習(CNN RNN Attention)解決大規模文本分類問題 - 綜述和實踐 個詞的貢獻,也就是注意力。顯然在翻譯「Chinese」時,「中國人」的注意力值很是大。

  Attention的核心point是在翻譯每一個目標詞(或預測商品標題文本所屬類別)所用的上下文是不一樣的,這樣的考慮顯然是更合理的。

TextRNN + Attention 模型:

  咱們參考了這篇文章 Hierarchical Attention Networks for Document Classification,下圖是模型的網絡結構圖,它一方面用層次化的結構保留了文檔的結構,另外一方面在word-level和sentence-level。淘寶標題場景只須要 word-level 這一層的 Attention 便可。

  加入Attention以後最大的好處天然是可以直觀的解釋各個句子和詞對分類類別的重要性。

5)TextRCNN(TextRNN + CNN)

  咱們參考的是中科院15年發表在AAAI上的這篇文章 Recurrent Convolutional Neural Networks for Text Classification 的結構:

  利用前向和後向RNN獲得每一個詞的前向和後向上下文的表示:

  這樣詞的表示就變成詞向量和前向後向上下文向量concat起來的形式了,即:

  最後再接跟TextCNN相同卷積層,pooling層便可,惟一不一樣的是卷積層 filter_size = 1就能夠了,再也不須要更大 filter_size 得到更大視野,這裏詞的表示也能夠只用雙向RNN輸出。

3、一點經驗

  理論和實踐之間的Gap每每差別巨大,學術paper更關注的是模型架構設計的新穎性等,更重要的是新的思路;而實踐最重要的是在落地場景的效果,關注的點和方法都不同。這部分簡單梳理實際作項目過程當中的一點經驗教訓。

 

模型顯然並非最重要的:不可否認,好的模型設計對拿到好結果的相當重要,也更是學術關注熱點。但實際使用中,模型的工做量佔的時間其實相對比較少。雖然在第二部分介紹了5種CNN/RNN及其變體的模型,實際中文本分類任務單純用CNN已經足以取得很不錯的結果了,咱們的實驗測試RCNN對準確率提高大約1%,並非十分的顯著。最佳實踐是先用TextCNN模型把總體任務效果調試到最好,再嘗試改進模型。

 

理解你的數據:雖然應用深度學習有一個很大的優點是再也不須要繁瑣低效的人工特徵工程,然而若是你只是把他當作一個黑盒,不免會常常懷疑人生。必定要理解你的數據,記住不管傳統方法仍是深度學習方法,數據 sense 始終很是重要。要重視 badcase 分析,明白你的數據是否適合,爲何對爲何錯。

 

關注迭代質量 - 記錄和分析你的每次實驗:迭代速度是決定算法項目成敗的關鍵,學過幾率的同窗都很容易認同。而算法項目重要的不僅是迭代速度,必定要關注迭代質量。若是你沒有搭建一個快速實驗分析的套路,迭代速度再快也只會替你公司心疼寶貴的計算資源。建議記錄每次實驗,實驗分析至少回答這三個問題:爲何要實驗?結論是什麼?下一步怎麼實驗?

 

超參調節:超參調節是各位調參工程師的平常了,推薦一篇文本分類實踐的論文 A Sensitivity Analysis of (and Practitioners’ Guide to) Convolutional Neural Networks for Sentence Classification,裏面貼了一些超參的對比實驗,若是你剛開始啓動文本分析任務,不妨按文章的結果設置超參,怎麼最快的獲得超參調節實際上是一個很是重要的問題,能夠讀讀 蕭瑟的這篇文章 深度學習網絡調參技巧 - 知乎專欄

 

必定要用 dropout:有兩種狀況能夠不用:數據量特別小,或者你用了更好的正則方法,好比bn。實際中咱們嘗試了不一樣參數的dropout,最好的仍是0.5,因此若是你的計算資源頗有限,默認0.5是一個很好的選擇。

 

fine-tuning 是必選的:上文聊到了,若是隻是使用word2vec訓練的詞向量做爲特徵表示,我賭你必定會損失很大的效果。

 

未必必定要 softmax loss: 這取決與你的數據,若是你的任務是多個類別間非互斥,能夠試試着訓練多個二分類器,也就是把問題定義爲multi lable 而非 multi class,咱們調整後準確率仍是增長了>1%。

 

類目不均衡問題:基本是一個在不少場景都驗證過的結論:若是你的loss被一部分類別dominate,對整體而言大可能是負向的。建議能夠嘗試相似 booststrap 方法調整 loss 中樣 的 本權重方式解決。

 

避免訓練震盪:默認必定要增長隨機採樣因素儘量使得數據分佈iid,默認shuffle機制能使得訓練結果更穩定。若是訓練模型仍然很震盪,能夠考慮調整學習率或 mini_batch_size。

 

沒有收斂前不要過早的下結論:玩到最後的纔是玩的最好的,特別是一些新的角度的測試,不要輕易否認,至少要等到收斂吧。

相關文章
相關標籤/搜索