本文來自:易盾實驗室
在深度學習技術興起之前相當長的一段時間內,基於機器學習技術的文字分類方法佔據著文字分類領域的統治地位。
如下圖所示,特徵工程+機器學習分類器一直是解決文字分類問題的標準正規化。針對不同的業務場景,演算法工程師需要精心設計相應的特徵工程,以取得最佳的分類效果。
到2010年,深度學習技術逐漸興起,文字分類領域的技術格局也相應的發生了變化。基於深度學習的文字分類方法打破了上述技術正規化,對文字進行簡單預處理後,直接餵給深度學習模型,進行端到端的訓練和推斷。一般性的,用於文字分類的深度學習模型最後一層為softmax層(多標籤問題則為sigmoid),這相當於機器學習分類器中的LR模型。由此可見,模型的其餘部分本質上就是在自動學習文字的特徵表示,因此演算法工程師再也不用操心特徵工程的事情了。不過先別高興得太早,文字特徵學得好不好,取決於具體的深度學習模型結構設計和超引數設定,工程師們還是得把省下來的時間花在模型結構和超引數的調整上面。
本文根據易盾文字演算法團隊在內容安全領域的實踐經驗,介紹在專案中用過的一些深度學習模型以及對部分技術細節進行討論。深度學習是近幾年來的熱門方向,學術界和工業界的研究人員提出了很多有價值的方法,本文所分享的方法只是其中少數代表性的工作,僅供讀者參考。
CNN
使用CNN來做文字分類最早見於2014年Convolutional
Neural Networks for Sentence
Classification”這篇文章當中。CNN模型現在已經是做文字分類的經典模型,綜合考慮模型效果、計算開銷、計算並行化等因素,CNN模型往往具備不錯的競爭力。有學者表示,CNN模型之所以能夠獲得較好的分類效果,與卷積核的使用有關。不同size的卷積核,對文字在不同位置進行卷積計算,相當於提取不同的n-gram特徵,這有助於模型的最終分類。
上圖是一個典型的單層CNN模型結構。首先將文字轉化成詞向量矩陣,然後分別使用不同size的的卷積核對矩陣進行卷積,每組卷積輸出多個feature
map,然後進行max pooling後,把所有feature
map拼接在一起,形成單個向量表示,最後加上一層全連線和softmax操作,輸出分類分數。
圖中只是一個示例,各類超引數都比較小,在實際使用過程中,詞向量大小50以上,卷積核的size一般取2~7,每個卷積的feature
map數量在幾十到幾百。另外max pooling也可以換成其它的pooling方法,比如average
pooling,不過總體來說還是max
pooling比較適合分類場景。正常情況下,透過超引數的調優,單層CNN模型已經能夠適用大多數文字分類場景。但也有人使用多層CNN模型的,我們的經驗是引數數量差不多的前提下,多層CNN未發現有明顯的效果提升。
RNN
RNN模型主要用於處理序列資料,而文字天然的就是表示成若干詞的序列,因此使用RNN模型來對文字進行建模是十分自然的事情。與全連線或卷積網路不同,RNN內部不同詞對應的隱藏層相互之間是有聯絡的:當前詞的隱藏層的輸入除了輸入層的輸出,還包括前一個詞的隱藏層的輸出。
當序列長度較長時,基礎的RNN模型存在梯度爆炸和梯度消失問題。LSTM和GRU是RNN的兩種改良版本,它們透過門的機制對RNN中資訊的傳播進行控制,緩解了RNN的梯度消失問題(RNN梯度爆炸問題可以透過gradient
clipping技術進行解決)。從圖中可以看出,GRU與LSTM結構比較相似,主要不同之處在於GRU使用更新門來對LSTM的輸入門和遺忘門進行簡化。
由於RNN最後一個詞的輸出已經融合了前面詞的資訊,RNN用於文字分類時一般取最後一個詞的輸出作為整個文字的特徵表示,即用最後的輸出加上全連線和softmax計算分類分數。當然,一般我們會使用多層RNN的結構,用最後一個詞的末層RNN的輸出計算分類分數。
RNN的資料流動是單向的,只能從前往後或從後往前。Bi-RNN對此進行了改進,具體做法是使用前向RNN和後向RNN,把文字中最後一個詞的前向RNN輸出和第一個詞的後向RNN輸出拼接在一起,作為文字的特徵表示。從我們的實踐經驗上看,Bi-RNN的這種改進效果提升很明顯,我們知道attention對模型有較大的提升作用,但在某些業務場景裡面attention對Bi-LSTM的提升比較有限,這說明Bi-LSTM自身的效果已經比較接近問題本身的理論上限。
RCNN
RCNN也是早期深度學習技術應用於文字分類上面經常用到的模型之一。RCNN為每個詞定義了left context和right context兩個變數,具體計算方式如下:
最終每個詞由自身的詞向量和兩個context拼接共同表示,然後先接一層全連線層,再作max
pooling形成單個的向量。這個模型為什麼叫RCNN(Recurrent Convolutional Neural
Networks)呢?首先,從left context和right
context的定義可以看出這部分其實就是一個雙向的RNN,只不過最後還拼接上原始的詞向量。另外,這裡並沒有只取最後一個詞的輸出計算分類分數,而是對每個詞的輸出進行全連線再作max
pooling。其實,這裡的全連線等價於進行size為[1,emb_size]和strip為1的二維卷積操作,後面再跟著max
pooling,這就是典型的CNN結構。
Attention
Attention機制被廣泛使用在自然語言處理、影像識別及語音識別等各種不同型別的深度學習任務中,是深度學習技術中最值得關注與深入瞭解的核心技術之一。Attention機制可以理解成給定Q,從一系列K-V鍵值對中計算出各個V的權重,然後再對V進行加權平均。具體公式如下:
其中f函式對Q和K進行打分,可以有不同的實現方式,常見的有點積、縮放點積、加性、雙線性等方法,我們也可以自己實現其它的計算方法。
我們注意到上述attention的計算涉及到Q、K、V三個輸入,當Q=K時,這樣的attention技術被稱為self-attention。實際上,self-attention是目前用得最多的attention技術,它不需要額外的資料,只根據文字自身的上下文,就能計算文字中各個詞的重要性。可以看出,attention本質上就是算各個詞的權重,然後進行加權平均。而我們知道在word2vec問世以後,在怎麼把多個詞的詞向量變成單個向量來表示句子的問題上,有一種做法就是加權平均,比如根據tf-idf加權平均。那麼attention和這種加權平均的區別是什麼?最本質的不同就是同一個詞,普通的加權平均方法權重是固定不變的(最多乘以詞頻係數),attention方法的權重是根據上下文動態計算的,在不同的文字和不同的位置,它的權重都是不一樣的。這就像人類的視覺注意力,看到不同的影像時重點關注的區域不一樣,所以我們把這個技術叫做attention。同一個詞在不同的上下文中得到不同的輸出,這種特性使得attention方法天然的般配NLP中的一詞多義問題。
具體到文字分類模型,attention的使用比較靈活,既可以單獨使用attention進行分類,也可以和CNN、RNN等模型結合。目前常見的模型有transformer、HAN、RNN+attention、CNN+attention、Bi-RNN+attention等等,這裡不再展開贅述。
FastText
FastText是Facebook在2016年開源的一個輕量級文字表示和文字分類工具。它的特點是在具有媲美當時複雜深度神經網路模型文字分類準確率的同時,訓練和預測非常高效,CNN訓練1天的資料,FastText只要幾秒即可。
FastText之所以這麼高效,主要有三個原因。第一,模型結構特別簡單,對文字所有單詞的embedding求平均然後加上softmax分類器。第二,這個softmax分類器是一個層次softmax分類器,這個在分類類別很多的時候比較有用。第三,FastText使用C++實現的,並且作者程式碼能力也非常強,因此雖然有很多復現版本,但都沒有原版高效。
儘管模型結構簡單,FastText使用了n-gram和subword兩種技術,幫助提升了文字分類效果。n-gram有助於模型捕捉文字區域性的單詞順序,而大部分文字分類任務並不需要太長的依賴關係。subword也叫char
n-gram,就是把單詞分解更小的子串片段,這能更好的對未登入詞和稀有詞進行建模,同時學習到相同詞綴單詞語義關係。
總的來說,FastText適用於對精確度要求不高同時需要較高實時性的文字分類場景,也可以作為新演算法的一個baseline。
Bert
BERT是谷歌在2018年釋出的一個預訓練語言模型,它重新整理了11個NLP任務的記錄。BERT的釋出使得NLP領域真正進入到了基於通用預訓練模型進行下游任務的時代,同時也進入了大力出奇跡的時代——透過更多的資料、更大的模型獲得更高的準確率,從此以後各家科技巨頭推出的模型越來越大,訓練用的資料也越來越多,簡直就是在炫富。其實在BERT之前也有很多預訓練語言模型的研究,像ELMo、GPT都是當時比較突出的成果,它們的很多思路和方法都被BERT借鑑了。
相比前輩們,BERT之所以引起這麼大的關注,主要在於它的效果確實很驚豔,同時在多個NLP任務上面重新整理記錄,並且提升幅度都還挺大的。更重要的是,BERT用在這些任務上面並不需要精心設計下游網路,基本上都是接一個簡單的預測結構,然後簡單地fine-tuning一下就OK了。
BERT模型結構本身並不複雜,主要分為3個部分:最底層是embedding元件,包括詞、位置和token
types三種embedding的組合;中間層是由多個Transformer
encoder組成的深度網路(base版本是12層,large版本是24層);上層是與訓練任務相關的元件,主要就是softmax網路。BERT模型比較重要的創新有兩方面,分別是Masked
LM和Next Sentence Prediction(NSP)。Masked
LM用[MASK]替換句子中的部分單詞,模型的目標是預測[MASK]位置上的真實單詞。
Masked LM技術的引入讓BERT模型變成了自編碼語言模型,它的最佳化目標不是最大化句子的似然函式,而是最大化mask部分的聯合條件機率,因此BERT模型可以使用雙向Transformer,使用前後上下文資訊對當前詞進行預測。
在BERT之前的語言模型都是沒法做到真正雙向的,這算是一個比較大的改進。NSP任務的引入讓BERT模型能夠更好的學習到句子層面上的整體語義。在NSP任務中,模型的輸入是一個句子對(確切地講是片段對,每個片段可能包含一個以上的句子),目標是預測輸入的句子對是否是原文中連續的兩個句子。訓練資料50%來自語料中抽取的真實連續句子對,另外50%就是從語料中隨機組合的。訓練的時候模型的最佳化目標是最小化Masked
LM和NSP的組合損失函式。
BERT模型用在文字分類過程也比較簡單,模型輸入就是單個文字,這裡不需要對單詞進行mask,也不用組成句子對,輸出使用第一個詞的輸出作為文字的向量表示,然後接softmax網路。我們的實驗結果表明BERT模型是本文介紹的所有方法中表現最好的,目前已經應用線上上部分複雜的業務場景中。
總結
本文只是介紹了易盾文字內容安全業務中用到的幾種深度學習方法,實際上,網易易盾的內容安全服務包括文字檢測、圖片檢測、影片檢測、音訊檢測、人工稽核和智慧稽核系統等產品,以及廣告合規、網站內容檢測、文件內容檢測、歷史資料清洗、音影片、社交娛樂、政企、媒體等解決方案。目前對外提供的內容安全服務已經升級為第三代人工智慧技術,提供涉黃、涉政、暴恐、廣告等十幾大類上千小類的有害內容智慧識別過濾服務,識別精準率超過99.8%。
上述所總結的,是目前業界解決文字分類問題的主流方法。如果使用固定的benchmark語料集進行評測,這些模型在準確率指標上面確實表現出一定的差異和優劣。但具體到文字內容安全的業務場景,我們很難得出哪個模型表現最好這樣的結論。
在實際使用中,需要根據不同場景的文字特點,同時考慮樣本規模、詞彙量大小、處理時間、模型引數規模等各種因素,選擇適當的模型。實際上,模型的作用是次要的,決定最終效果的關鍵因素是語料庫的構建,有了規模足夠大的高質量語料庫,哪怕模型簡陋一點,效果也是要好於複雜模型的。而語料庫的構建是一項長期的工作,需要明確各種違規類別的標準並進行細分,清晰具體的標準是標註高質量語料庫的前提。同時還要不斷投入人力,收集和標註樣本,讓語料庫的樣本儘量覆蓋到不同型別的資料。
此外,真實的文字內容安全系統也不是幾個模型就能搞定的,它是一套成熟的解決方案,使用豐富的檢測手段分別覆蓋不同的場景,保證較高的檢測率。
參考文獻
- https://www.aclweb.org/anthology/D14-1181
- http://www.wildml.com/2015/11/understanding-convolutional-neural-networks-for-nlp/
- https://medium.com/@saurabh.rathor092/simple-rnn-vs-gru-vs-lstm-difference-lies-in-more-flexible-control-5f33e07b1e57
- https://www.aaai.org/ocs/index.php/AAAI/AAAI15/paper/download/9745/9552
- https://arxiv.org/pdf/1706.03762.pdf
- https://arxiv.org/pdf/1810.04805.pdf