詳解百度ERNIE進化史及典型應用場景

飛槳PaddlePaddle發表於2020-04-28
詳解百度ERNIE進化史及典型應用場景

詳解百度ERNIE進化史及典型應用場景

上個月,全球規模最大的語義評測比賽 SemEval 2020 結果出爐,百度基於飛槳平臺自研的語義理解框架 ERNIE 一舉斬獲 5 項世界冠軍,囊括視覺媒體的關鍵文字片段挖掘、多語攻擊性語言檢測和混合語種的情感分析。去年,ERNIE先後完成兩版重大升級:ERNIE 1.0 提出知識增強的語義表示模型, ERNIE 2.0 則構建了持續學習語義理解框架,在中英文 16 個任務上超越業界最好模型。本文將為開發者詳細解讀ERNIE的進化史。

詳解百度ERNIE進化史及典型應用場景

ERNIE 1.0

ERNIE: Enhanced Representation through Knowledge Integration[1] 是百度在2019年4月的時候,基於BERT模型,做的進一步最佳化,在中文的NLP任務上得到了state-of-the-art的結果。

它主要是在mask的機制上做了改進,它的mask不是基本的word piece的mask,而是在pretrainning階段增加了外部的知識,由三種level的mask組成,分別是basic-level masking(word piece)+ phrase level masking(WWM style) + entity level masking。在這個基礎上,藉助百度在中文社群的強大能力,中文的ERNIE還使用了各種異質(Heterogeneous)的資料集。此外為了適應多輪的貼吧資料,所有ERNIE引入了DLM (Dialogue Language Model) task。

百度的論文看著寫得不錯,也很簡單,而且改進的思路成為了後來各種改進模型的基礎。例如說Masking方式的改進,讓BERT出現了WWM的版本,對應的中文版本(Pre-Training with Whole Word Masking for Chinese BERT[2]),以及 facebook的SpanBERT[3]等都是主要基於ERNIE masking方式做的改進。

01Knowledge Masking

「Inituition」: 模型在預測未知詞的時候,沒有考慮到外部知識。但是如果我們在mask的時候,加入了外部的知識,模型可以獲得更可靠的語言表示。

例如:哈利波特是J.K.羅琳寫的小說。單獨預測 哈[MASK]波特 或者 J.K.[MASK]琳 對於模型都很簡單,但是模型不能學到哈利波特和J.K. 羅琳的關係。如果把哈利波特直接MASK掉的話,那模型可以根據作者,就預測到小說這個實體,實現了知識的學習。

需要注意的是這些知識的學習是在訓練中隱性地學習,而不是直接將外部知識的embedding加入到模型結構中(ERNIE-TsingHua[4]的做法),模型在訓練中學習到了更長的語義聯絡,例如說實體類別,實體關係等,這些都使得模型可以學習到更好的語言表達。

首先我們先看看模型的MASK的策略和BERT的區別。

詳解百度ERNIE進化史及典型應用場景

ERNIE的mask的策略是透過三個階段學習的,在第一個階段,採用的是BERT的模式,用的是basic-level masking,然後再加入片語的mask(phrase-level masking), 然後再加入實體級別entity-level的mask。如下圖:


詳解百度ERNIE進化史及典型應用場景

  • Basic level masking
    在預訓練中,第一階段是先採用基本層級的masking,即隨機mask掉中文中的一個字。
  • Phrase level masking
    第二階段是採用片語級別的masking。我們mask掉句子中一部分片語,然後讓模型預測這些片語,在這個階段,片語的資訊就被encoding到word embedding中了。
  • Entity level masking
    在第三階段命名實體,如:人名,機構名,商品名等,在這個階段被mask掉,模型在訓練完成後,也就學習到了這些實體的資訊。

不同mask的效果:

詳解百度ERNIE進化史及典型應用場景


02 Heterogeneous Corpus Pre-training

訓練集包括了

  • Chinese Wikepedia
  • Baidu Baike
  • Baidu news
  • Baidu Tieba 注意模型進行了繁簡體的轉化,以及是uncased

03 DLM (Dialogue Language Model) task

對話的資料對語義表示很重要,因為對於相同回答的提問一般都是具有類似語義的,不同於BERT的輸入形式,ERNIE能夠使用多輪對話的形式,採用的是三個句子的組合[CLS]S1[SEP]S2[SEP]S3[SEP] 的格式。這種組合可以表示多輪對話,例如QRQ,QRR,QQR。Q:提問,R:回答。為了表示dialog的屬性,句子新增了dialog embedding組合,這個和segment embedding很類似。

DLM還增加了任務來判斷這個多輪對話是真的還是假的:

詳解百度ERNIE進化史及典型應用場景

詳解百度ERNIE進化史及典型應用場景


04 NSP+MLM

在貼吧多輪對話資料外都採用的是普通的NSP+MLM預訓練任務。NSP任務還是有的,但是論文中沒寫,但是git repo中寫了用了。

最終模型效果對比BERT:

詳解百度ERNIE進化史及典型應用場景

ERNIE 2.0

ERNIE 2.0: A Continual Pre-Training Framework for Language Understanding[5],百度ERNIE2.0 的出現直接重新整理了GLUE Benchmark。

「Inituition」:就像是我們學習一個新語言的時候,我們需要很多之前的知識,在這些知識的基礎上,我們可以更快地學習新語言,如此就有了遷移學習的效果。我們的語言模型如果增加多個任務的話,是不是可以獲得更好的效果?事實上,經發現,ERNIE 1.0 加了DLM任務以及其他的模型。如Albert 加了sentence order prediction(SOP)任務之後或者SpanBERT: Improving Pre-training by Representing and Predicting Spans[6]在加上了SBO目標之後 ,模型效果得到了進一步的最佳化,同時MT-DNN[7]也證明了,在預訓練的階段中加入多個GLUE下游任務(有監督)進行多工學習,可以得到state-of-the-art的效果。

於是科學家們就在想那一直加task豈不是更強?百度不滿足於堆疊任務,而是提出了一個持續學習的框架,利用這個框架,模型可以持續新增任務但又不降低之前任務的精度,從而能夠更好更有效地獲得詞法lexical,句法syntactic,語義semantic上的表達。


詳解百度ERNIE進化史及典型應用場景

在ERNIE1.0的基礎上,利用了大量的資料,以及先驗知識,然後提出了多個任務,用來做預訓練,最後根據特定任務finetune。框架的提出是針對life-long learning的,即終生學習,因為我們的任務疊加,不是一次性進行的(Multi-task learning),而是持續學習(Continual Pre-training),所以必須避免模型在學了新的任務之後,忘記舊的任務,即在舊的任務上loss變高,相反的,模型的表現應該是因為學習了之前的知識,所以能夠更好更快的學習到現有的任務。為了實現這個目的,百度提出了一個包含pretraining 和fine-tuning的持續學習框架。

詳解百度ERNIE進化史及典型應用場景


01 Continual Pre-training

  • 任務的構建
    百度把語言模型的任務歸類為三大類,模型可以持續學習新的任務。

    • 字層級的任務(word-aware pretraining task)
    • 句結構層級的任務(structure-aware pretraining task)
    • 語義層級的任務(semantic-aware pretraining task)
  • 持續的多工學習
    對於持續的多工學習,主要需要攻克兩個難點:

    • 如何保證模型不忘記之前的任務?常規的持續學習框架採用的是一個任務接一個任務的訓練,導致的後果就是模型在最新的任務上得到了好的效果但是在之前的任務上獲得很慘的效果(knowledge retention)。

    • 模型如何能夠有效地訓練?
      為了解決上一個的問題,有人propose新的方案,我們每次有新的任務進來,我們都從頭開始訓練一個新的模型不就好了。雖然這種方案可以解決之前任務被忘記的問題,但是這也帶來了效率的問題:每次都要從頭新訓練一個模型,這樣子導致效率很低。
  • 百度提出的方案sequential multi-task learning聰明的你肯定就會想到,為什麼我們要從頭開始訓練一個模型,我們複用之前學到的模型的引數作為初始化,然後再訓練不就行了?是的,但是這樣子似乎訓練的效率還是不高,因為我們還是要每一輪中同時訓練多個任務,百度的解決方案是,框架自動在訓練的過程中為每個任務安排訓練N輪。

    • 初始化 optimized initialization
      每次有新任務過來,持續學習的框架使用之前學習到的模型引數作為初始化,然後將新的任務和舊的任務一起訓練。

    • 訓練任務安排 task allocating
      對於多個任務,框架將自動的為每個任務在模型訓練的不同階段安排N個訓練輪次,這樣保證了有效率地學習到多工。如何高效的訓練,每個task 都分配有N個訓練iteration。One left problem is how to make it trained more efficiently. We solve this problem by allocating each task N training iterations. Our framework needs to automatically assign these N iterations for each task to different stages of training. In this way, we can guarantee the efficiency of our method without forgetting the previously trained knowledge

    • 部分任務的語義資訊建模適合遞進式:比如ERNIE 1.0 突破完形填空ERNIE 2.0 突破選擇題,句子排序題等不斷遞進更新,就好像前面的任務都是打基礎,有點boosting的意味

    • 順序學習容易導致遺忘模式(這個可以複習一下李宏毅的影片),所以只適合學習任務之間比較緊密的任務,就好像你今天學了JAVA,明天學了Spring框架,但是如果後天讓你學習有機化學,就前後不能夠聯絡起來,之前的知識就忘得快

    • 適合遞進式的語音建模任務

02 Continual Fine-tuning

在模型預訓練完成之後,可以根據特定任務進行finetuning,這個和BERT一樣。

03 ERNIE 2.0 Model

為了驗證框架的有效性,ERNIE 2.0 用了多種任務,訓練了新的ERNIE2.0模型,然後成功刷榜NLU任務的benchmark,GLUE(截止2020.01.04),開源了ERNIE2.0英文版。

04 Model structure

模型的結構和BERT一致,但是在預訓練的階段,除了正常的position embedding,segment embdding,token embedding還增加了「task embedding」。用來區別訓練的任務, 對於N個任務,task的id就是從0~N-1,每個id都會被對映到不同的embedding上。模型的輸入就是:

詳解百度ERNIE進化史及典型應用場景

但是對於fine-tuning階段,ERNIE 使用任意值作為初始化都可以。

詳解百度ERNIE進化史及典型應用場景


05 Pre-training Tasks

ERNIE模型堆疊了大量的預訓練目標。就好像我們學習英語的時候,我們的卷子上面,有多種不同的題型。

  • 詞法層級的任務(word-aware pretraining task):獲取詞法知識

    • knowledge masking(1.0)
      ERNIE1.0的任務

    • 大小寫預測(Capitalization Prediction Task)
      模型預測一個字不是不是大小寫,這個對特定的任務例如NER比較有用。(但是對於中文的話,這個任務比較沒有用處,可能可以改為預測某個詞是不是縮寫)

    • 詞頻關係(Token-Document Relation Prediction Task)
      預測一個詞是不是會多次出現在文章中,或者說這個詞是不是關鍵詞。
  • 語法層級的任務(structure-aware pretraining task) :獲取句法的知識

    • 句子排序(Sentence Reordering Task)把一篇文章隨機分為i = 1到m份,對於每種分法都有i!種組合,所以總共有 種組合,讓模型去預測這篇文章是第幾種,就是一個多分類的問題。這個問題就能夠讓模型學到句子之間的順序關係。就有點類似於Albert的SOP任務的升級版。

    • 句子距離預測(Sentence Distance Task)
      一個三分類的問題:0: 代表兩個句子相鄰1: 代表兩個句子在同個文章但不相鄰2: 代表兩個句子在不同的文章中
  • 語義層級的任務(semantic-aware pretraining task) :獲取語義關係的知識0: 代表了提問和標題強相關(出現在搜尋的介面且使用者點選了)1: 代表了提問和標題弱相關(出現在搜尋的介面但使用者沒點選)2: 代表了提問和標題不相關(未出現在搜尋的介面)
  • 篇章句間關係任務(Discourse Relation Task)判斷句子的語義關係例如logical relationship( is a, has a, contract etc.)
  • 資訊檢索關係任務(IR Relevance Task)一個三分類的問題,預測query和網頁標題的關係:0: 代表了提問和標題強相關(出現在搜尋的介面且使用者點選了)1: 代表了提問和標題弱相關(出現在搜尋的介面但使用者沒點選)2: 代表了提問和標題不相關(未出現在搜尋的介面)

詳解百度ERNIE進化史及典型應用場景

  • Token level loss:給每個token一個label
  • Sentence level loss:例如句子重排任務,判斷[CLS]的輸出是那一類別

效能不敏感的場景:直接使用

度小滿的風控召回排序提升25%。

詳解百度ERNIE進化史及典型應用場景

度小滿的風控識別上:在ERNIE上直接進行微調預測有沒有風險對應的結果。傳統的缺點:需要海量的資料,而這些資料也很難抓取到的,抓取這些特徵之後呢還要進行復雜的文字特徵提取,比如說挖掘簡訊中銀行的催收資訊,對資料要求的量很高,對資料人工的特徵的挖掘也很高。這兩項呢造成了大量的成本,如今只需ERNIE微調一下,當時直接在召回的排序上得到25%的提升。這種場景的特點是什麼?使用者對於實時性的需求不是很強,不需要使用者輸入一個欄位就返回結果。只要拿一天把所有資料跑完,得到結果就可以了,統一的分析就可以了,適合少資料的分析場景。

效能敏感場景最佳化

效能敏感場景最佳化:模型蒸餾,例如搜尋問答Query識別和QP匹配

詳解百度ERNIE進化史及典型應用場景

另外的一個場景是搜尋問答query識別和qp匹配,該場景需要非常高的效能優勢的,採用的解決方案就是模型蒸餾。輸入一個問題,得到答案,本質是文字匹配,實際是輸入問題,把資料庫中大量的候選答案進行匹配計算得分,把得分最高的返回。但是百度每天很多使用者,需要很快的響應速度,資料量大,要求響應速度還快,這時候要求不僅模型特別準,而且還要特別快,怎麼解決就是模型蒸餾。

Phrase 1: 

判斷問題是否可能有答案(文字分類),過濾完是可能有答案的,再與資料庫中進行匹配,因為大部分輸入框的不一定是個問題,這樣過濾掉一部分,排除掉一部分後,在做匹配就能得到很大的提升,提升還是不夠。

第一部分其實是文字分類,透過小規模的標註特徵資料進行微調,得到一個好的模型,同時日誌上是有很多沒有標註的資料,用ERNIE對這些資料進行很好的標註,用一個更好的模型去標註資料,用這些標註資料訓練相對簡單的模型,就實現了蒸餾,ERNIE處理速度慢,但是可以用題海戰術的方式訓練簡單的模型。具體步驟:一個很優秀的老師,學一點東西就能夠帶學生了,但是學生模型不夠聰明,海量的題海戰術就可以學很好。

Fine-tune:使用少量的人工標註的資料用ERNIE訓練

label propagation:使用ERNIE標註海量的挖掘資料,得到帶標註的訓練資料

train:使用這些資料下去訓練一個簡單的模型或者採用模型蒸餾的方式,參考TinyBERT

Phrase 2: 

有答案與答案庫進行各種各樣的匹配(文字匹配)同理,下面問題匹配也是,右邊也是query和答案,然後經過embedding,加權求和,全連線,最後計算他們之間的預選相似度,可以是餘弦相似度,召回提升7%。

場景:百度影片離線推薦

這是一個推薦場景,目標是基於使用者瀏覽的歷史影片推薦新的影片。這裡使用影片的標題文字作為特徵推薦。影片的標題文字是保持不變的,所以可以提前把ERNIE的結果計算儲存好。影片之間兩兩計算相似度的計算量是非常大的,那麼怎麼減少計算量呢?使用了一個技術叫離線向量化。把ERNIE作為一個特徵向量的生成器,離線把每一個影片的ERNIE向量計算好,然後存入資料庫中。實際計算時,使用者看的影片經過ERNIE 得到一個向量,候選集透過另外一個ERNIE(共享權重),得到另外一個向量,最後透過cos函式計算相似度。這樣整體的運算量就從O(N2)降低到O(N)。


程式碼使用

git clone https://github.com/PaddlePaddle/ERNIE pip install -r requirements.txt cd models 
wget --no-check-certificate https://baidu-nlp.bj.bcebos.com/ERNIE_stable-1.0.1.tar.gz cd .. wget --no-check-certificate https://ernie.bj.bcebos.com/task_data_zh.tgz 
run.sh 
home=YOUR_ERNIE_PATH export TASK_DATA_PATH=$home/glue_data_processed/ export MODEL_PATH=$home/model/ 
export TASK_DATA_PATH=YOUR_TASK_DATA_PATH export MODEL_PATH=YOUR_MODEL_PATH 
sh script/zh_task/ernie_base/run_ChnSentiCorp.sh

百度在自然語言處理領域已有二十年的積累與沉澱,具備了最前沿、最全面、最領先的技術佈局,不僅專注於前瞻技術探索,更致力透過技術應用解決實際問題。而飛槳是目前國內自主研發、開源開放、功能最完備的產業級深度學習平臺,集深度學習核心框架、基礎模型庫、端到端開發套件、工具元件和服務平臺於一體,服務於150多萬開發者,正與合作伙伴一起幫助越來越多的行業完成 AI 賦能。


本文參考資料

[1 ]ERNIE: Enhanced Representation through Knowledge Integration: 

https://arxiv.org/pdf/1904.09223

[2] Pre-Training with Whole Word Masking for Chinese BERT:

https://arxiv.org/pdf/1906.08101

[3] facebook的SpanBERT: 

https://arxiv.org/pdf/1907.10529

[4] ERNIE-TsingHua:

 https://arxiv.org/pdf/1905.07129.pdf

[5] ERNIE 2.0: A Continual Pre-Training Framework for Language Understanding: 

https://arxiv.org/pdf/1907.12412.pdf

[6] SpanBERT: Improving Pre-training by Representing and Predicting Spans: 

https://arxiv.org/pdf/1907.10529.pdf

[7] MT-DNN: 

https://arxiv.org/pdf/1901.11504.pdf

[8] baidu offical video:

http://abcxueyuan.cloud.baidu.com/#/play_video?id=15076&courseId=15076&mediaId=mda-jjegqih8ij5385z4&videoId=2866&sectionId=15081&showCoursePurchaseStatus=false&type=免費課程

[9] Life long learning: 

https://www.youtube.com/watch?v=8uo3kJ509hA

[10]【NLP】深度剖析知識增強語義表示模型:

ERNIE: https://mp.weixin.qq.com/s/Jt-ge-2aqHZSxWYKnfX_zg

ERNIE專案地址:

https://github.com/PaddlePaddle/ERNIE

如果您加入官方QQ群,您將遇上大批志同道合的深度學習同學。官方QQ群:703252161。

如果您想詳細瞭解更多飛槳的相關內容,請參閱以下文件。

官網地址:https://www.paddlepaddle.org.cn

飛槳開源框架專案地址:

GitHub: https://github.com/PaddlePaddle/Paddle

Gitee:  https://gitee.com/paddlepaddle/Paddle


相關文章