前言

在NLP的很多字任務中,有絕大部分場景可以歸結為文本分類任務,比如:

情感分析(細粒度情感分析),

領域識別(Domain Detection),

意圖識別(Intent Detection),

等等.......最近在對話系統任務中接觸到部分文本分類任務,在閱讀了部分paper和知乎大牛的文章後,決定結合學習筆記以及工程代碼,整理出文本分類的系列文章,一來備忘,二來通過寫文章的方式來加深自己的理解。

定義

  • 在給定的分類體系中,將文本分到指定的某個或某幾個類別當中
    • 分類對象:短文本(句子/標題/商品評論)、長文本(文章)
  • 分類體系一般由人工構造
    • 新聞分類:政治、體育、軍事、社會
    • 情感分類:正能量、負能量
    • 微博評論分類:好評、中性、差評
  • 分類模式
    • binary:2類問題,屬於或不屬於,positive,negative
    • multi-class:多類問題
    • multi-label:多標籤問題,一個文本可以屬於多類。多標籤分類是文本分類的一大難點,以前面試的時候被問到這個問題,扒拉扒拉了一堆~

方法

  • 人工方法
    • 基於規則的特徵匹配,容易理解(足球、聯賽->體育)
    • 依賴專家系統,不同人物需要專門構建特徵規則。費時費力
    • 準確率不高
  • 機器學習方法
    • 特徵工程+演算法(Naive Bayes/SVM/LR/KNN……)
  • 深度學習方法
    • 詞向量+模型(FastText/TextCNN/TextRNN/TextRCNN/DPCNN/BERT/VDCNN)

此處著重關注深度學習方法。

深度學習方法介紹

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

1,FastText

  • 論文:Bag of Tricks for Efficient Text Classification

原理是把句子中所有的詞進行lookup得到詞向量之後,對向量進行平均(某種意義上可以理解為只有一個avg pooling特殊CNN),然後直接接 softmax 層預測label。在label比較多的時候,為了降低計算量,論文最後一層採用了層次softmax的方法,既根據label的頻次建立哈夫曼樹,每個label對應一個哈夫曼編碼,每個哈夫曼樹節點具有一個向量作為參數進行更新,預測的時候隱層輸出與每個哈夫曼樹節點向量做點乘,根據結果決定向左右哪個方向移動,最終落到某個label對應的節點上。

特點就是快,在效果和其他方法差不多的情況下,訓練速度比其他方法快一個量級。

2,TextCNN

論文:Convolutional Neural Networks for Sentence Classification

詳細原理如下:

首先,對句子做padding或者截斷,保證句子長度為固定值 s=7 ,單詞embedding成 d=5 維度的向量,這樣句子被表示為(s,d)(s,d)大小的矩陣(類比圖像中的像素)。然後經過有 filter_size=(2,3,4) 的一維卷積層,每個filter_size 有兩個輸出 channel。第三層是一個1-max pooling層,這樣不同長度句子經過pooling層之後都能變成定長的表示了,最後接一層全連接的 softmax 層,輸出每個類別的概率。

重點1:卷積是一維卷積,只在ss方向上做卷積,不在dd方向上做卷積,既卷積核的寬度大小為dd。因為文本和圖像不同,文本的局部特徵只存在於上下文單詞之間,既所謂的n-gram。卷積核大小設置為(2,3,4)就是為了分別尋找2-gram,3-gram,4-gram特徵。重點2:這裡的特徵就是詞向量,有靜態(static)和非靜態(non-static)方式。static方式採用比如word2vec預訓練的詞向量,訓練過程不更新詞向量,實質上屬於遷移學習了,特別是數據量比較小的情況下,採用靜態的詞向量往往效果不錯。non-static則是在訓練過程中更新詞向量。推薦的方式是 non-static 中的 fine-tunning方式,它是以預訓練(pre-train)的word2vec向量初始化詞向量,訓練過程中調整詞向量,能加速收斂,當然如果有充足的訓練數據和資源,直接隨機初始化詞向量效果也是可以的。

3,TextRNN

論文:Recurrent Neural Network for Text Classification with Multi-Task Learning 利用CNN進行文本分類,說到底還是利用卷積核尋找n-gram特徵。卷積核的大小是超參。而RNN基本是處理文本信息的標配了,因為RNN先天就是為處理時間序列而設計的,它通過前後時刻的輸出鏈接保證了「記憶」的留存。但RNN循環機制過於簡單,前後時刻的鏈接採用了最簡單的f=activate(ws+b)f=activate(ws+b)的形式,這樣在梯度反向傳播時出現了時間上的連乘操作,從而導致了梯度消失和梯度爆炸的問題。RNN的 變種LSTM/GRU在一定程度上減緩了梯度消失和梯度爆炸問題,因此現在使用的其實要比RNN更多。

利用RNN做文本分類也比較好理解。對於英文,都是基於詞的。對於中文,首先要確定是基於字的還是基於詞的。如果是基於詞,要先對句子進行分詞。之後,每個字/詞對應RNN的一個時刻,隱層輸出作為下一時刻的輸入。最後時刻的隱層輸出h_ThT?catch住整個句子的抽象特徵,再接一個softmax進行分類。

4,TextRNN + Attention

RNN雖然號稱能保持長久「記憶」,但其實還是無法「記住」太長久的東西。越靠後的字詞對最終輸出的影響越大,但是這和人類閱讀文本的習慣是不一樣的。一句話中對文本意義影響最大一必定是句子中間的某幾個重點辭彙。Attention的提出就是為了應對這個問題。詳細介紹Attention恐怕需要一小篇文章的篇幅,感興趣的可 參考14年這篇paper NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE。具體原理不作介紹,大家可以看論文呀~ Attention運用到文本分類當中,參考論文Hierarchical Attention Networks for Document Classification。論文為了對doc進行分類,將doc從兩個層次進行特徵提取,首先在word層面提取sentence特徵,然後從sentence層面提取doc特徵,並且每個層次都運用了Attention。在此我類比到句子分類中,講一下Attention是怎麼運用的。假設RNN每個時刻的輸出為 [h_1, h_2,...,h_T] ,在上文TextRNN中我們已經提到,最後時刻的輸出會用作softmax的輸入,既 h=f(wH_T+b) 。Attention層其實就是普通的一層,它接收 h_t ?,得到一個相應score,並經過歸一化之後代表當前詞的重要性,既 u_t=f(w_{attetion}h_t+b_{attention}) , alpha_t = frac{exp(u_t)}{sum_{k=1}^Texp(u_k)} 。Attention向量是每個時刻輸出的加權平均,既 c=sum_talpha_th_t 。最終輸出為 logit = softmax(f(w[h;c] + b))

5,TextRCNN

論文 Recurrent Convolutional Neural Networks for Text Classification

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

c_l(w_i)=f(W^{(l)}c_l(w_{i-1})+W^{(sl)}e(w_{i-1}))

c_r(w_i)=f(W^{(r)}c_l(w_{i+1})+W^{(sr)}e(w_{i+1}))

這樣詞的表示就變成詞向量和前向後向上下文向量concat起來的形式了,即:x_i=[c_l(w_i);e(w_i);c_r(w_i)] 最後再接跟TextCNN相同卷積層,pooling層即可,唯一不同的是卷積層 filter_size = 1就可以了,不再需要更大 filter_size 獲得更大視野,這裡詞的表示也可以只用雙向RNN輸出

6,HAN

論文:Hierarchical Attention Networks for Document Classification (NAACL 2016)

Yang等人提出了一種用於文檔分類的層次注意力機制網路,簡稱HAN。這篇文章和Tang等人都是針對於文檔分類的問題,然而,這篇文章在句子級別以及文檔級別提出了注意力機制,使得模型在構建文檔時是能夠賦予重要內容不同的權重,同時,也可以緩解RNN在捕捉文檔的序列信息產生的梯度消失問題。HAN模型的模型示意圖如下所示。

HAN模型首先利用Bi-GRU捕捉單詞級別的上下文信息。由於句子中的每個單詞對於句子表示並不是同等的貢獻,因此,作者引入注意力機制來提取對句子表示有重要意義的辭彙,並將這些信息辭彙的表徵聚合起來形成句子向量。具體的注意力機制的原理可以參考:

FEED-FORWARD NETWORKS WITH ATTENTION CAN SOLVE SOME LONG-TERM MEMORY PROBLEMS

然後,對於所有的句子向量輸入到Bi-GRU中,捕捉句子級別的上下文信息,得到文檔向量。同樣地,為了獎勵對文檔進行正確分類的線索句,作者再次使用注意力機制,來衡量句子的重要性,得到文檔向量。最後將文檔向量均輸入到softmax層,得到標籤的概率分布。

圖3: HAN模型結構示意圖

7,BERT

Google提出的BERT模型,突破了靜態詞向量無法解決一詞多義的問題。BERT是基於語言模型的動態詞向量,在自然語言處理的多項任務中取得了最優秀的結果。筆者對BERT模型進行微調,在文本分類的多個領域,諸如法律、情感等,取得了非常有競爭性的性能。

BERT的模型架構是一個多層的雙向Transformer編碼器(Transformer的原理及細節可以參考 Attention is all you need)。作者採用兩套參數分別生成BERTBASE模型和BERTLARGE模型(細節描述可以參考原論文),所有下游任務可以在這兩套模型進行微調。

代碼參考:github.com/google-resea

圖8:BERT的Pre-training結構和Fine-Tuning結構

8,VDCNN

論文:Very Deep Convolutional Networks for Text Classification 上述提到的文本分類模型都是淺層模型,目前NLP領域的模型,無論是機器翻譯、文本分類、序列標註等問題大都使用淺層模型。這篇論文探究的是深層模型在文本分類任務中的有效性,文中最優性能網路達到了29層。

小結

這篇文章主要對深度學習的文本分類方法做了大概的介紹,後續會結合代碼(項目)和理論對上面介紹的模型進行詳細分析。並且我已經全部封裝了restful介面,可供外部工程隨時調用。此外,代碼全部上傳在github上,地址為:

charlesXu86/Chatbot_CN?

github.com圖標

(歡迎star~~~~~~~~~~)

QQ群:聊天機器人開發實戰

推薦閱讀:

相关文章