引言
自然語言處理(NLP)主要是研究實現人與計算機之間用自然語言進行有效通訊的各種理論和方法。基於神經網路的深度學習技術具有強大的表達能力、端到端解決問題的能力,因而在NLP任務的應用上越來越廣泛和有效。
近日,百度PaddlePaddle開源了語義表示模型ERNIE,在多箇中文NLP任務上表現超越了谷歌的BERT(請參考連結),展示了百度在NLP技術的領先能力,同時也表明PaddlePaddle作為國內目前唯一功能完備的深度學習平臺,在不斷得夯實框架能力, 並引領技術進步。實際上除了ERNIE,PaddlePaddle官方還有很多其他的NLP模型,覆蓋了包括語義表示、語義匹配、閱讀理解、機器翻譯、語言模型、情感傾向分析、詞法分析等各項NLP任務。本文將對這些模型做一些梳理和介紹。
語義表示-ERNIE
知識增強的語義表示模型 ERNIE(Enhanced Representation through kNowledge IntEgration)透過對詞、實體等語義單元的掩碼,使得模型學習完整概念的語義表示。相較於 BERT 學習原始語言訊號,ERNIE 直接對先驗語義知識單元進行建模,增強了模型語義表示能力。
ERNIE 模型本身保持基於字特徵輸入建模,使得模型在應用時不需要依賴其他資訊,具備更強的通用性和可擴充套件性。相對詞特徵輸入模型,字特徵可建模字的組合語義,例如建模紅色,綠色,藍色等表示顏色的詞語時,透過相同字的語義組合學到詞之間的語義關係。
此外,ERNIE 的訓練語料引入了多源資料知識。除了百科類文章建模,還對新聞資訊類、論壇對話類資料進行學習,這裡重點介紹下論壇對話建模。對於對話資料的學習是語義表示的重要途徑,往往相同回覆對應的 Query 語義相似。基於該假設,ERINE 採用 DLM(Dialogue Language Model)建模 Query-Response 對話結構,將對話 Pair 對作為輸入,引入 Dialogue Embedding 標識對話的角色,利用 Dialogue Response Loss 學習對話的隱式關係,透過該方法建模進一步提升模型語義表示能力。
ERNIE在語言推斷、語義相似度、命名實體識別、情感分析、問答匹配等自然語言處理(NLP)各類中文任務上的驗證顯示,模型效果全面超越 BERT,如下表所示。
專案地址:
ERNIE: https://github.com/PaddlePaddle/LARK/tree/develop/ERNIE
語義匹配-DAM,AnyQ-SimNet
語義匹配是一種用來衡量文字相似度的NLP任務。很多NLP的任務可以轉化為語義匹配問題。比如搜尋可以認為是查詢詞與文件之間的語義匹配問題,對話系統、智慧客服可以認為是問題和回答之間的語義匹配問題。
PaddlePaddle官方提供了兩種語義匹配相關的模型:DAM和AnyQ-SimNet。
n 深度注意力匹配網路DAM(Deep Attention Matching Network)
DAM 是一個完全基於 Attention 機制的神經匹配網路。DAM 的動機是為了在多輪對話中,捕獲不同顆粒度的對話元素中的語義依賴,從而更好地在多輪上下文語境中回覆。它可用於檢索式聊天機器人多輪對話中應答的選擇。
DAM受啟發於機器翻譯的Transformer模型。將Transformer關鍵的注意力機制從兩個方面進行擴充,並將其引入到一個統一的網路之中。
自注意力機制(Self-Attention)
透過從詞嵌入中疊加註意力機制,逐漸捕獲不同顆粒度的語義表示。這些多粒度的語義表示有助於探索上下文和回答的語義依賴。
互注意力機制(Cross-Attention)
貫穿於上下文和回答的注意力機制,可以捕獲不同語段對的依賴關係,從而在多輪上下文的匹配回答中為文字關係提供互補資訊。
DAM模型網路結構
該模型在Ubuntu和豆瓣對話兩個語料庫上測試了多輪對話任務,如下表所示,相比其他模型有最優的效果。
DAM模型的效果對比
PaddlePaddle開源的DAM專案提供了資料準備、模型訓練和推理等詳細的應用步驟。該專案的地址為:https://github.com/PaddlePaddle/models/tree/develop/fluid/PaddleNLP/deep_attention_matching_net
n SimNet
SimNet 是百度自主研發的語義匹配框架,該框架在百度內有廣泛的應用,主要包括 BOW、CNN、RNN、MM-DNN 等核心網路結構形式,同時基於該框架也整合了學術界主流的語義匹配模型。使用 SimNet 構建出的模型可以便捷的加入AnyQ系統中,增強AnyQ系統的語義匹配能力。
Paddle版本Simnet提供了BOW,CNN,LSTM及GRU四種網路實現,可以透過配置檔案的形式靈活選擇您需要的網路,損失函式,訓練方式。
PaddlePaddle官方提供了完整的資料準備、訓練和推理的相關使用方法。
SimNet專案連結:
https://github.com/baidu/AnyQ/tree/master/tools/simnet/train/paddle
閱讀理解-DuReader
機器閱讀理解是指讓機器像人類一樣閱讀文字,提煉文字資訊並回答相關問題。對人類而言,閱讀理解是獲取外部知識的一項基本且重要的能力。同樣,對機器而言,機器閱讀理解能力也是新一代機器人應具備的基礎能力。
DuReader 是一個解決閱讀理解問題的端到端模型,可以根據已給的文章段落來回答問題。模型透過雙向Attention 機制捕捉問題和原文之間的互動關係,生成 Query-Aware 的原文表示,最終基於 Query-Aware 的原文表示透過 Point Network 預測答案範圍。
DuReader模型在最大的中文 MRC 開放資料集——百度閱讀理解資料集上,達到了當前最好效果。該資料集聚焦於回答真實世界中開放問題,相比其他資料集,它的優點包括真實的問題、真實的文章、真實的回答、真實的場景和翔實的標註。
DuReader受啟發於三個經典的閱讀理解模型(Bi-DAF、Match-LSTM和R-NET),是一個雙向多階段模型,共有5層:
詞嵌入層——用預訓練詞嵌入模型將每一個詞對映到一個向量上
編碼層——用雙向LSTM網路為每一個問題和段落的位置抽取上下文資訊
Attention flow層——耦合問題和上下文向量,為上下文中的每一個詞生成query-aware特徵向量
Fusion層——利用雙向LSTM網路捕獲上下文的詞之間的相互資訊
解碼層——透過問題的attention池化的answer point網路定位答案在段落中的位置。
Paddle Github連結:
https://github.com/PaddlePaddle/models/tree/develop/fluid/PaddleNLP/machine_reading_comprehension
機器翻譯-Transformer
Transformer 最早是谷歌提出的一種用以完成機器翻譯等 Seq2Seq 學習任務的一種全新網路結構,它完全使用 Attention 機制來實現序列到序列的建模,相比於以往NLP模型裡使用RNN或者編碼-解碼結構,具有計算複雜度小、並行度高、容易學習長程依賴等優勢, 整體網路結構如圖1所示。
圖1:Transfomer模型結構
Encoder 由若干相同的 layer 堆疊組成,每個 layer 主要由多頭注意力(Multi-Head Attention)和全連線的前饋(Feed-Forward)網路這兩個 sub-layer 構成。
Multi-Head Attention 在這裡用於實現 Self-Attention,相比於簡單的 Attention 機制,其將輸入進行多路線性變換後分別計算 Attention 的結果,並將所有結果拼接後再次進行線性變換作為輸出。參見圖2,其中 Attention 使用的是點積(Dot-Product),並在點積後進行了 scale 的處理以避免因點積結果過大進入 softmax 的飽和區域。
Feed-Forward 網路會對序列中的每個位置進行相同的計算(Position-wise),其採用的是兩次線性變換中間加以 ReLU 啟用的結構。
圖2多頭注意力(Multi-Head Attention)
此外,每個 sub-layer 後還施以 Residual Connection 和 Layer Normalization 來促進梯度傳播和模型收斂。
PaddlePaddle官方提供了該模型的資料準備、訓練和推理等方法。
目前在未使用 model average 的情況下,英德翻譯 base model 和 big model 八卡訓練 100K 個 iteration 後測試 BLEU 值如下表所示:
Transformer 模型支援同步或者非同步的分散式訓練。Paddle官方提供了詳細的配置方法。
Github專案地址:
https://github.com/PaddlePaddle/models/tree/develop/fluid/PaddleNLP/machine_reading_comprehension
語言模型-LSTM,GRU
RNN、LSTM和GRU是深度學習在NLP中應用的基礎語言模型。
RNN模型在同一個單元中,每個時刻利用當前和之前輸入,產生當前時刻的輸出,能夠解決一定時序的問題,但是受到短時記憶影響,很難將資訊從較早的時間傳到較晚的時間。LSTM透過引入門結構(forget,input,output三種門結構),能夠將序列的資訊一直傳遞下去,能夠將較早的資訊也引入到較晚的時間中來,從而客服短時記憶。
GRU與LSTM非常相似,但是隻有兩個門(update,reset),因而引數更少,結構簡單,訓練更簡單。
Paddle提供了基於Penn Tree Bank (PTB)資料集的經典迴圈神經網路LSTM語言模型實現,透過學習訓練資料中的序列關係,可以預測一個句子出現的的機率。
Paddle也提供了基於Penn Tree Bank (PTB)資料集的經典迴圈神經網路GRU語言模型實現,在LSTM模型基礎上做了一些簡化,保持效果基本持平的前提下,模型引數更少、速度更快。
Github連結:
https://github.com/PaddlePaddle/models/tree/develop/fluid/PaddleNLP/language_model/lstm
https://github.com/PaddlePaddle/models/tree/develop/fluid/PaddleNLP/language_model/gru
情感傾向分析-Senta
情感傾向分析針對帶有主觀描述的中文文字,可自動判斷該文字的情感極性類別並給出相應的置信度。情感型別分為積極、消極、 中性。情感傾向分析能夠幫助企業理解使用者消費習慣、分析熱點話題和危機輿情監控,為企業提供有力的決策支援。
Senta 模型是目前最好的中文情感分析模型,可自動判斷中文文字的情感極性類別並給出相應的置信度。它包含有以下模型:
Bow(Bag Of Words)模型-- 是一個非序列模型。使用基本的全連線結構。
淺層CNN模型--是一個基礎的序列模型,能夠處理變長的序列輸入,提取一個區域性區域之內的特徵。
單層GRU模型--序列模型,能夠較好地解序列文字中長距離依賴的問題。
單層LSTM模型--序列模型,能夠較好地解決序列文字中長距離依賴的問題。
雙向LSTM模型--序列模型,透過採用雙向LSTM結構,更好地捕獲句子中的語義特徵。百度AI平臺上情感傾向分析模組採用此模型進行訓練和預測。下圖展示了這種模型的原理。
基於Bi-LSTM的情感分類模型
總體來說,基於Bi-LSTM的情感分類模型包括三層:單詞語義層,句子語義層,輸出層。1.單詞語義層,主要是將輸入文字中的每個單詞轉化為連續的語義向量表示,也就是單詞的Embedding。2.句子語義層,透過Bi-LSTM網路結構,將單詞語義的序列轉化為整個句子的語義表示。3.輸出層,基於句子語義計算情感傾向的機率。
在PaddlePaddle的該模型專案地址上,給出來在C-API目錄下給出了bilstm_net模型的下載指令碼download.sh,可供使用者下載使用(模型可支援C-API、python兩種預測方式),該模型在百度自建資料集上的效果分類準確率為90%。
Github專案地址:
https://github.com/baidu/Senta
中文詞法分析-LAC
LAC是一個聯合的詞法分析模型,能夠整體性地完成中文分詞、詞性標註、專名識別等NLP任務。LAC既可以認為是Lexical Analysis of Chinese的首字母縮寫,也可以認為是LAC Analyzes Chinese的遞迴縮寫。
中文分詞 -- 是將連續的自然語言文字,切分成具有語義合理性和完整性的詞彙序列的過程
詞性標註(Part-of-Speech tagging 或POS tagging)-- 是指為自然語言文字中的每個詞彙賦予一個詞性的過程
命名實體識別(Named Entity Recognition 簡稱NER)-- 即"專名識別",是指識別自然語言文字中具有特定意義的實體,主要包括人名、地名、機構名、時間日期等
LAC基於一個堆疊的雙向 GRU 結構(Bi-GRU-CRF),在長文字上準確復刻了百度AI開放平臺上的詞法分析演算法。網路結構如下圖所示。
用兩個Bi-GRU 堆疊的Bi-GRU-CRF網路
Bi-GRU是GRU網路的一種擴充,由一個反向的GRU與一個正向的GRU耦合而成,將一個完整的句子作為。兩個GRU的輸入相同,但是訓練方向相反。兩個網路的結果拼接以後作為輸出。堆疊多個Bi-GRU可以形成深度的網路,從而能夠促進語義的表示能力。本模型堆疊了兩層Bi-GRU。之後,將Bi-GRU的輸出連到一個全連線層。它將Bi-GRU 層的輸出轉為一個多維度向量,向量的維度是所有可能標籤的數量。整個網路最上方,使用了CRF(條件隨機場)對最後的標籤做聯合解碼。
效果方面,分詞、詞性、專名識別的整體準確率95.5%;單獨評估專名識別任務,F值87.1%(準確90.3,召回85.4%),總體略優於開放平臺版本。在效果最佳化的基礎上,LAC的模型簡潔高效,記憶體開銷不到100M,而速度則比百度AI開放平臺提高了57%。
Github 連結:
PaddlePaddle官方模型庫Github地址
https://github.com/PaddlePaddle/models
PaddlePaddle Github專案地址:
https://github.com/PaddlePaddle