深度學習文本分類|模型&代碼&技巧

2022-01-03 Jack Cui

文本分類是NLP的必備入門任務,在搜索、推薦、對話等場景中隨處可見,並有情感分析、新聞分類、標籤分類等成熟的研究分支和數據集。

本文主要介紹深度學習文本分類的常用模型原理、優缺點以及技巧。

P.S. 有基礎的同學可以直接看文末的技巧

Fasttext
論文:https://arxiv.org/abs/1607.01759
代碼:https://github.com/facebookresearch/fastText

Fasttext是Facebook推出的一個便捷的工具,包含文本分類和詞向量訓練兩個功能。

Fasttext的分類實現很簡單:把輸入轉化為詞向量,取平均,再經過線性分類器得到類別。輸入的詞向量可以是預先訓練好的,也可以隨機初始化,跟著分類任務一起訓練。

Fasttext直到現在還被不少人使用,主要有以下優點:

模型本身複雜度低,但效果不錯,能快速產生任務的baselineFacebook使用C++進行實現,進一步提升了計算效率採用了char-level的n-gram作為附加特徵,比如paper的trigram是 [pap, ape, per],在將輸入paper轉為向量的同時也會把trigram轉為向量一起參與計算。這樣一方面解決了長尾詞的OOV (out-of-vocabulary)問題,一方面利用n-gram特徵提升了表現當類別過多時,支持採用hierarchical softmax進行分類,提升效率

對於文本長且對速度要求高的場景,Fasttext是baseline首選。同時用它在無監督語料上訓練詞向量,進行文本表示也不錯。不過想繼續提升效果還需要更複雜的模型。

TextCNN
論文:https://arxiv.org/abs/1408.5882
代碼:https://github.com/yoonkim/CNN_sentence

TextCNN是Yoon Kim小哥在2014年提出的模型,開創了用CNN編碼n-gram特徵的先河。

模型結構如圖,圖像中的卷積都是二維的,而TextCNN則使用「一維卷積」,即filter_size * embedding_dim,有一個維度和embedding相等。這樣就能抽取filter_size個gram的信息。以1個樣本為例,整體的前向邏輯是:

對詞進行embedding,得到[seq_length, embedding_dim]用N個卷積核,得到N個seq_length-filter_size+1長度的一維feature map對feature map進行max-pooling(因為是時間維度的,也稱max-over-time pooling),得到N個1x1的數值,拼接成一個N維向量,作為文本的句子表示

在TextCNN的實踐中,有很多地方可以優化(參考這篇論文[1]):

Filter尺寸:這個參數決定了抽取n-gram特徵的長度,這個參數主要跟數據有關,平均長度在50以內的話,用10以下就可以了,否則可以長一些。在調參時可以先用一個尺寸grid search,找到一個最優尺寸,然後嘗試最優尺寸和附近尺寸的組合Filter個數:這個參數會影響最終特徵的維度,維度太大的話訓練速度就會變慢。這裡在100-600之間調參即可CNN的激活函數:可以嘗試Identity、ReLU、tanh正則化:指對CNN參數的正則化,可以使用dropout或L2,但能起的作用很小,可以試下小的dropout率(<0.5),L2限制大一點Pooling方法:根據情況選擇mean、max、k-max pooling,大部分時候max表現就很好,因為分類任務對細粒度語義的要求不高,只抓住最大特徵就好了Embedding表:中文可以選擇char或word級別的輸入,也可以兩種都用,會提升些效果。如果訓練數據充足(10w+),也可以從頭訓練加深全連接:原論文只使用了一層全連接,而加到3、4層左右效果會更好[2]

TextCNN是很適合中短文本場景的強baseline,但不太適合長文本,因為卷積核尺寸通常不會設很大,無法捕獲長距離特徵。同時max-pooling也存在局限,會丟掉一些有用特徵。另外再仔細想的話,TextCNN和傳統的n-gram詞袋模型本質是一樣的,它的好效果很大部分來自於詞向量的引入[3],因為解決了詞袋模型的稀疏性問題。

DPCNN
論文:https://ai.tencent.com/ailab/media/publications/ACL3-Brady.pdf
代碼:https://github.com/649453932/Chinese-Text-Classification-Pytorch

上面介紹TextCNN有太淺和長距離依賴的問題,那直接多懟幾層CNN是否可以呢?感興趣的同學可以試試,就會發現事情沒想像的那麼簡單。直到2017年,騰訊才提出了把TextCNN做到更深的DPCNN模型:

上圖中的ShallowCNN指TextCNN。DPCNN的核心改進如下:

在Region embedding時不採用CNN那樣加權卷積的做法,而是對n個詞進行pooling後再加個1x1的卷積,因為實驗下來效果差不多,且作者認為前者的表示能力更強,容易過擬合使用1/2池化層,用size=3 stride=2的卷積核,直接讓模型可編碼的sequence長度翻倍(自己在紙上畫一下就get啦)

憑藉以上一些精妙的改進,DPCNN相比TextCNN有1-2個百分點的提升。

TextRCNN
論文:https://dl.acm.org/doi/10.5555/2886521.2886636
代碼:https://github.com/649453932/Chinese-Text-Classification-Pytorch

除了DPCNN那樣增加感受野的方式,RNN也可以緩解長距離依賴的問題。下面介紹一篇經典TextRCNN。

模型的前向過程是:

對多個

這裡的convolutional是指max-pooling。通過加入RNN,比純CNN提升了1-2個百分點。

TextBiLSTM+Attention
論文:https://www.aclweb.org/anthology/P16-2034.pdf
代碼:https://github.com/649453932/Chinese-Text-Classification-Pytorch

從前面介紹的幾種方法,可以自然地得到文本分類的框架,就是先基於上下文對token編碼,然後pooling出句子表示再分類。在最終池化時,max-pooling通常表現更好,因為文本分類經常是主題上的分類,從句子中一兩個主要的詞就可以得到結論,其他大多是噪聲,對分類沒有意義。而到更細粒度的分析時,max-pooling可能又把有用的特徵去掉了,這時便可以用attention進行句子表示的融合:

BiLSTM就不解釋了,要注意的是,計算attention score時會先進行變換:

其中

這個加attention的套路用到CNN編碼器之後代替pooling也是可以的,從實驗結果來看attention的加入可以提高2個點。如果是情感分析這種由句子整體決定分類結果的任務首選RNN。

HAN
論文:https://www.aclweb.org/anthology/N16-1174.pdf
代碼:https://github.com/richliao/textClassifier

上文都是句子級別的分類,雖然用到長文本、篇章級也是可以的,但速度精度都會下降,於是有研究者提出了層次注意力分類框架,即Hierarchical Attention。先對每個句子用 BiGRU+Att 編碼得到句向量,再對句向量用 BiGRU+Att 得到doc級別的表示進行分類:

方法很符合直覺,不過實驗結果來看比起avg、max池化只高了不到1個點(狗頭,真要是很大的doc分類,好好清洗下,fasttext其實也能頂的(捂臉。

BERT

BERT的原理代碼就不用放了叭~

BERT分類的優化可以嘗試:

多試試不同的預訓練模型,比如RoBERT、WWM、ALBERT除了 [CLS] 外還可以用 avg、max 池化做句表示,甚至可以把不同層組合起來其他模型

除了上述常用模型之外,還有Capsule Network[4]、TextGCN[5]等紅極一時的模型,因為涉及的背景知識較多,本文就暫不介紹了(嘻嘻)。

雖然實際的落地應用中比較少見,但在機器學習比賽中還是可以用的。Capsule Network被證明在多標籤遷移的任務上性能遠超CNN和LSTM[6],但這方面的研究在18年以後就很少了。TextGCN則可以學到更多的global信息,用在半監督場景中,但碰到較長的需要序列信息的文本表現就會差些[7]。

技巧

模型說得差不多了,下面介紹一些自己的數據處理血淚經驗,如有不同意見歡迎討論~

數據集構建

首先是標籤體系的構建,拿到任務時自己先試標一兩百條,看有多少是難確定(思考1s以上)的,如果佔比太多,那這個任務的定義就有問題。可能是標籤體系不清晰,或者是要分的類目太難了,這時候就要找項目owner去反饋而不是繼續往下做。

其次是訓練評估集的構建,可以構建兩個評估集,一個是貼合真實數據分布的線上評估集,反映線上效果,另一個是用規則去重後均勻採樣的隨機評估集,反映模型的真實能力。訓練集則儘可能和評估集分布一致,有時候我們會去相近的領域拿現成的有標註訓練數據,這時就要注意調整分布,比如句子長度、標點、乾淨程度等,儘可能做到自己分不出這個句子是本任務的還是從別人那裡借來的。

最後是數據清洗

去掉文本強pattern:比如做新聞主題分類,一些爬下來的數據中帶有的XX報導、XX編輯高頻欄位就沒有用,可以對語料的片段或詞進行統計,把很高頻的無用元素去掉。還有一些會明顯影響模型的判斷,比如之前我在判斷句子是否為無意義的閒聊時,發現加個句號就會讓樣本由正轉負,因為訓練預料中的閒聊很少帶句號(跟大家的打字習慣有關),於是去掉這個pattern就好了不少糾正標註錯誤:這個我真的屢試不爽,生生把自己從一個算法變成了標註人員。簡單的說就是把訓練集和評估集拼起來,用該數據集訓練模型兩三個epoch(防止過擬合),再去預測這個數據集,把模型判錯的拿出來按 abs(label-prob) 排序,少的話就自己看,多的話就反饋給標註人員,把數據質量搞上去了提升好幾個點都是可能的長文本

任務簡單的話(比如新聞分類),直接用fasttext就可以達到不錯的效果。

想要用BERT的話,最簡單的方法是粗暴截斷,比如只取句首+句尾、句首+tfidf篩幾個詞出來;或者每句都預測,最後對結果綜合。

另外還有一些魔改的模型可以嘗試,比如XLNet、Reformer、Longformer。

如果是離線任務且來得及的話還是建議跑全部,讓我們相信模型的編碼能力。

少樣本

自從用了BERT之後,很少受到數據不均衡或者過少的困擾,先無腦訓一版。

如果樣本在幾百條,可以先把分類問題轉化成匹配問題,或者用這種思想再去標一些高置信度的數據,或者用自監督、半監督的方法。

魯棒性

在實際的應用中,魯棒性是個很重要的問題,否則在面對badcase時會很尷尬,怎麼明明那樣就分對了,加一個字就錯了呢?

這裡可以直接使用一些粗暴的數據增強,加停用詞加標點、刪詞、同義詞替換等,如果效果下降就把增強後的訓練數據洗一下。

當然也可以用對抗學習、對比學習這樣的高階技巧來提升,一般可以提1個點左右,但不一定能避免上面那種尷尬的情況。

總結

文本分類是工業界最常用的任務,同時也是大多數NLPer入門做的第一個任務,我當年就是啥都不會,從訓練到部署地實踐了文本分類後就順暢了。上文給出了不少模型,但實際任務中常用的也就那幾個,下面是快速選型的建議:

實際上,落地時主要還是和數據的博弈。數據決定模型的上限,大多數人工標註的準確率達到95%以上就很好了,而文本分類通常會對準確率的要求更高一些,與其苦苦調參想fancy的結構,不如好好看看badcase,做一些數據增強提升模型魯棒性更實用。

參考資料[1]

A Sensitivity Analysis of (and Practitioners' Guide to) Convolutional Neural Networks for Sentence Classification: https://arxiv.org/pdf/1510.03820.pdf

[2]

卷積層和分類層,哪個更重要?: https://www.zhihu.com/question/270245936

[3]

從經典文本分類模型TextCNN到深度模型DPCNN: https://zhuanlan.zhihu.com/p/35457093

[4]

揭開迷霧,來一頓美味的Capsule盛宴: https://kexue.fm/archives/4819

[5]

Graph Convolutional Networks for Text Classification: https://arxiv.org/abs/1809.05679

[6]

膠囊網絡(Capsule Network)在文本分類中的探索: https://zhuanlan.zhihu.com/p/35409788

[7]

怎麼看待最近比較火的 GNN?: https://www.zhihu.com/question/307086081/answer/717456124

相關焦點

  • 文本分類實戰--從TFIDF到深度學習CNN系列效果對比(附代碼)
    ,從理論到代碼實現進行總結,其中涉及CHI選擇特徵詞,TFIDF計算權重,樸素貝葉斯、決策樹、SVM、XGBoost等算法,實現傳統的文本分類並取得了不錯的效果。閱讀過本文的人還看了以下:《21個項目玩轉深度學習:基於TensorFlow的實踐詳解》完整版PDF+附書代碼《深度學習之pytorch》pdf+附書源碼
  • 一文讀懂深度學習文本分類方法
    最近有很多小夥伴想了解深度學習在文本分類的發展,因此,筆者整理最近幾年比較經典的深度文本分類方法,希望幫助小夥伴們了解深度學習在文本分類中的應用。筆者整理了近些年的相關深度文本分類論文,關注「AI算法之心」,後臺回復「文本分類論文」即可下載。
  • 深度文本分類綜述
    (給算法愛好者加星標,修煉編程內功)作者:何從慶 (本文來自作者投稿)最近有很多小夥伴想了解深度學習在文本分類的發展
  • 基於Text-CNN模型的中文文本分類實戰
    數據處理流程文本分類模型,可以大體上分為基於傳統機器學習的文本分類模型,基於深度學習的文本分類模型,目前基於深度學習模型的文本分類模型已經成為了主流,下面基於CNN的文本分類模型。深度學習的優勢文本分類模型,從最經典的2013年Kim提出Text-CNN模型開始,深度學習模型在文本分類任務上具有廣泛的應用。
  • 【長篇乾貨】深度學習在文本分類中的應用
    但是,上述的特徵提取方法存在數據稀疏和維度爆炸等問題,這對分類器來說是災難性的,並且使得訓練的模型泛化能力有限。因此,往往需要採取一些策略進行降維:人工降維:停用詞過濾,低頻n-gram過濾等自動降維:LDA等值得指出的是,將深度學習中的word2vec,doc2vec作為文本特徵與上文提取的特徵進行融合,常常可以提高模型精度。
  • 文本分類中的經典深度學習模型
    眾所周知,文本分類是NLP領域中十分基礎的任務,大部分文本分類模型稍加修改就可以應用到其他任務中。下面介紹幾個經典的文本分類模型。
  • 乾貨| 深度學習在文本分類中的應用
    因此,往往需要採取一些策略進行降維:人工降維:停用詞過濾,低頻n-gram過濾等自動降維:LDA等值得指出的是,將深度學習中的word2vec,doc2vec作為文本特徵與上文提取的特徵進行融合,常常可以提高模型精度。
  • Facebook 開源文本分類工具,不用深度學習也可以又快又準
    為了利用這些數據,Facebook使用了各種各樣的工具來對文本進行分類。傳統的分類方法,比如深度神經網絡,準確率雖高,但是卻需要較長的訓練時間。今天,Facebook AI實驗室FAIR 宣布將把其研發的文本分析工具fastText進行開源。fastText 既可以用於文本分類,又能用於學習詞彙向量表徵。
  • 遷移學習SSD深度網絡模型,實現文本行檢測
    汽車行業完整知識圖譜項目實戰視頻(全23課)李沐大神開源《動手學深度學習》,加州伯克利深度學習(2019春)教材筆記、代碼清晰易懂!李航《統計學習方法》最新資源全套!《神經網絡與深度學習》最新2018版中英PDF+源碼將機器學習模型部署為REST APIFashionAI服裝屬性標籤圖像識別Top1-5方案分享重要開源!
  • 【深度學習】textCNN論文與原理——短文本分類(基於pytorch)
    前言前文已經介紹了TextCNN的基本原理,如果還不熟悉的建議看看原理:【深度學習】textCNN論文與原理[1]及一個簡單的基於pytorch的圖像分類案例:【深度學習】卷積神經網絡-圖片分類案例(pytorch實現)[2]。
  • 文本分類的14種算法
    這種簡單的文本分類練習,不同算法的性能分層還是比較明顯的。知識總結1.機器學習、集成學習和深度學習:1)機器學習泛指所有的使機器通過建立和調整模型從而實現特定功能的算法。2)深度學習是運用了多層的人工神經網絡(ANN)的機器學習方法。3)集成學習是指通過將多個弱分類器的分類結果進行整合,獲得比單個弱分類器更好效果的機器學習方法。集成學習和深度學習屬於機器學習。2.集成學習的bagging和boosting思想:bagging中的各個弱分類器取值是相互獨立的、無關的,常使用有放回抽樣實現。
  • 深度學習:基於語境的文本分類弱監督學習
    深度學習:基於語境的文本分類弱監督學習 丁磊 發表於 2021-01-18 16:04:27 高成本的人工標籤使得弱監督學習備受關注。seed-driven 是弱監督學習中的一種常見模型。
  • 多標籤文本分類模型總結
    什麼是多標籤文本分類學術上常用的說法有兩個,一個是ExtremeMulti-label Learning, 簡稱XML,另一個是Extreme Multi-label Text Classification,簡稱XMTC,本質上都是對文本進行多標籤分類,即對於一個給定的文本,可能有多個標籤,我們需要設計一個模型預測其標籤。
  • 帶你用深度學習虛擬機進行文本遷移學習(附代碼)
    本文講述了現代機器學習的模型,主要由微軟數據科學家Anusua Trivedi和數據科學家經理Wee Hyong Tok共同撰寫。動機現代機器學習模型,尤其是深度神經網絡,通常可以從遷移學習中顯著受益。
  • 使用PyTorch建立你的第一個文本分類模型
    概述學習如何使用PyTorch執行文本分類理解解決文本分類時所涉及的要點學習使用包填充(Pack Padding)特性介紹我總是使用最先進的架構來在一些比賽提交模型結果。得益於PyTorch、Keras和TensorFlow等深度學習框架,實現最先進的體系結構變得非常容易。這些框架提供了一種簡單的方法來實現複雜的模型體系結構和算法,而只需要很少的概念知識和代碼技能。簡而言之,它們是數據科學社區的一座金礦!在本文中,我們將使用PyTorch,它以其快速的計算能力而聞名。因此,在本文中,我們將介紹解決文本分類問題的關鍵點。
  • 一文看懂深度文本分類之DPCNN原理與代碼
    論文中提出了一種基於word-level級別的網絡-DPCNN,由於上一篇文章介紹的TextCNN 不能通過卷積獲得文本的長距離依賴關係,而論文中DPCNN通過不斷加深網絡,可以抽取長距離的文本依賴關係。實驗證明在不增加太多計算成本的情況下,增加網絡深度就可以獲得最佳的準確率。‍究竟是多麼牛逼的網絡呢?我們下面來窺探一下模型的芳容。
  • 深度學習用於自然語言處理中的文本分類:工程實踐、三級文本、整體認識
    簡介:深度學習用於自然語言處理中的文本分類:工程實踐、三級文本、整體認識。目錄一、深度學習用於文本分類自然語言處理等(13638字)11文本分類實戰--從TFIDF到深度學習(附代碼)[1](2714字)12文本分類實戰--分詞時加詞性標註,單獨訓練詞向量(附代碼)[2](1705字)83深度學習在三級文本分類中的應用[3](589字)9
  • BAT面試題42:深度學習解決大規模文本分類問題
    深度學習文本分類方法文章主要引用:https://zhuanlan.zhihu.com/p/25928551深度學習最初在之所以在圖像和語音取得巨大成功,一個很重要的原因是圖像和語音原始數據是連續和稠密的,有局部相關性。
  • 《文本分類大綜述:從淺層到深度學習》最新2020版35頁pdf
    本文通過回顧1961年到2020年的先進方法的現狀來填補這一空白,側重於從淺到深的模型學習。我們根據所涉及的文本和用於特徵提取和分類的模型創建文本分類的分類法。然後我們詳細討論每一個類別,處理支持預測測試的技術發展和基準數據集。本綜述還提供了不同技術之間的綜合比較,以及確定各種評估指標的優缺點。最後,總結了本研究的關鍵意義、未來研究方向和面臨的挑戰。
  • 用深度學習(CNN RNN Attention)解決大規模文本分類問題 - 綜述和...
    近來在同時做一個應用深度學習解決淘寶商品的類目預測問題的項目,恰好碩士畢業時論文題目便是文本分類問題,趁此機會總結下文本分類領域特別是應用深度學習解決文本分類的相關的思路、做法和部分實踐的經驗。業務問題描述:淘寶商品的一個典型的例子見下圖,圖中商品的標題是「夏裝雪紡條紋短袖t恤女春半袖衣服夏天中長款大碼胖mm顯瘦上衣夏」。