基於機器閱讀理解(MRC)的信息抽取方法

導讀:本次分享的主題爲基於機器學習閱讀理解(MRC)的信息抽取方法。由香儂科技發表在ACL2019,論文提出用閱讀理解的方法對信息抽取這個傳統問題進行建模,取得了比較好的效果。

Part1 香儂科技簡介

香儂科技的主要研究方向爲自然語言處理和深度學習,秉承“讓機器讀懂紛繁的大千世界”爲使命,致力於用人工智能技術消除信息不對稱的壁壘,讓所有人都能平等獲取信息。目前主要業務包括信息抽取、智能文檔解析、智能數據聚類分析、文本對比審覈等。

Part2 自然語言處理(NLP)

1. 自然語言處理(NLP)是什麼?

自然語言處理是研究能實現人與計算機之間,用自然語言進行有效通信的各種理論和方法。(通俗講就是計算機要理解人說的話,計算機生成的話,人也能夠理解)

2. 爲什麼自然語言處理很難?

自然語言處理的難點在於歧義性。如下面的例子:

  • 同樣的表達方式,有不同的含義: “喜歡一個人”:like someone 或者 like to be alone。
  • 雖然表達方式不同,但表達的含義相同: “我剛差點摔着”、“我剛差點沒摔着” “蘋果多少錢一斤”、“蘋果一斤多少錢”、“一斤蘋果多少錢”

3. 常見的NLP任務

常見的NLP任務可以分爲簡單、中等、困難,分別包含的具體任務如下:

  • 簡單任務:分詞、詞性標註、垃圾郵件分類、句法依存分析
  • 中等任務:詞義消歧、情感分類、命名實體識別、信息檢索
  • 困難任務:關係&事件抽取、翻譯、自動摘要、問答、對話

今天主要介紹命名實體識別、關係&事件抽取這兩類信息抽取任務。

4. 深度學習與NLP結合的範式:

範式1

第一種深度學習與 NLP 的結合的範式(Bert出現之前),一般包含以下幾步:

-> Embed:該階段把離散id變成稠密向量,可能對以下幾個維度特徵進行embedding,包括word(單詞)、char(字符)、pos tag(詞性)、position(位 置)。

-> Encode:該階段使得稠密向量獲得上下文信息, 一般方案包括CNN/RNN/Transformer。

-> Attend:該階段可以使更遠的信息可以互相注意,一般分爲加性(sum)、乘性(product)的注意力機制。

-> Predict:NLP 任務一般是預測離散的變量,Classification分類、Seq Labeling序列標註、翻譯/摘要可以model成seq2seq的任務。

範式2

最近有些Pre-train的模型出現,打破的了之前的方案,把embed到Attend,基本上都用的類似的方法,通過Pre-train得到一個帶着上下文信息的向量。算法包括elmo、gpt、bert、gpt2、xlnet、ernie、roberta等,在大數據量上進行預訓練。

第二種深度學習與 NLP 的結合的範式,一般包含以下幾步:

-> Pre-train:剛開始是用大規模的語料進行預訓練。

-> Fine_tune:針對特定任務進行微調。

-> Predict:進行Predict。

Part3 信息抽取

1. 信息抽取簡介

信息抽取是將非結構化的文本信息轉換爲結構化的信息,如上圖所示,左邊爲非結構化文本,通過信息抽取得到右邊結構化的信息。

信息抽取可以分爲三類:

  • 命名實體識別(NER):從文本中抽取人物、機構、文件名等實體。
  • 關係抽取(RE):得到實體後,抽取實體間的關係,一般抽取得到一個(實體,實體,關係)的三元組。
  • 事件抽取:抽取多個實體和事件關係,一般得到一個trigger和多個arguments的多元組。

今天主要介紹命名實體識別和關係抽取。

2. 實體關係抽取

大量的信息抽取任務是實體和關係的抽取,舉個例子,喬布斯是蘋果公司的CEO。其中"喬布斯"和"蘋果公司"是實體,分別是人名、公司名;兩個實體之間是僱傭關係。

3. 實體關係抽取的傳統做法

實體關係抽取的傳統做法:

  • Pipeline的方法: 先進行命名實體識別,再進行關係識別。
  • joint方法: 通過共享參數的模型,把實體識別和關係識別聯繫到一起。

命名實體識別(NER)

NER也可以分爲4步:

-> Embed:把 Michael Jeffrey Jordan was born in Brooklyn,變成一個稠密向量。

-> Encode:在NER中主要是RNN 相關的;

-> Attend:把注意力集中在“一個人在布魯克林出生”

-> Predict:主要用CRF做序列標註。

也可以用BERT,把Embed到Attend之間都用過BERT來初始化,然後進行fine_tune,然後在最上層加一個Predict的神經網絡。

關係抽取(RE)

RE一般被model成Classification任務,同樣分爲以下4步:

-> Embed:還是將字或者詞變成一個稠密的向量,這裏還會多一個position,一般認爲待變成稠密向量的詞與實體之間的位置是一個相對位置,如下圖中hired和第一個人它的位置可能是-1,然後逗號和它的位置是1,這樣的一種Embedding。

-> Encode:對於關係識別來說,即包含CNN相關的,也包含RNN相關的,把上下文的信息考慮進來。如上圖是一個PCNN,通過兩個實體把句子分爲三部分,每部分分別做CNN的max pooling(由於這三部分的用處不同,直接做max pooling可能會有一些信息的損失),再經過Softmax classifier進行分類。

上圖爲BI-LSTM,同樣用了RNN base的網絡結構,可以學習到更長距離的依賴。

-> Attend:Attention可以Attend到兩個實體是由於哪個詞分辨出是顧傭的關係,比如“CEO”就可以認爲“蘋果公司”和“喬布斯”之間是僱傭關係,有比較大的一個權重。

-> Predict:對定長的向量進行Predict分類。

剛剛說的都是Pipeline的方法,Joint方法也是類似的,主要是把兩部分的一些模型的參數在底層被共享起來。

4. 傳統方法的問題

Pipeline和Joint兩種方案都存在一些問題:

① 很難處理層級關係:建模困難。如右側第1張圖所示,“喬布斯在1977年至1983年擔任了蘋果公司的CEO,在1986年至1996年擔任皮克斯動畫工作室的CEO”。這裏存在7個實體,相互間都有關係,非常複雜。

② 準確率問題:

  • 兩個實體離得比較遠,尤其當一個實體與另外一個實體發生關係時,其實是它的縮寫與另外一個實體比較近,而本體與另外一個實體比較遠的時候,這樣兩個實體之間的關係往往很難預測得到。
  • 一個實體包含多個關係對,比如這裏的“蘋果公司”,既和“CEO”產生關係,又和“喬布斯”產生關係, 包含多個關係,是關係的分類比較複雜。
  • 實體跨越的span有重疊。如右側第2張圖所示,“比爾蓋茨和喬布斯分別擔任微軟和蘋果公司的CEO”,“比爾蓋茨”是和“微軟”產生關係,“喬布斯”是和“蘋果公司”產生關係對於剛剛說的PCNN或者RNN來說都會產生混亂的情況,導致識別準確率下降。

Part4 機器閱讀理解(MPC)

1. 機器閱讀理解簡介

機器閱讀理解是給定上下文c,和問題q,得到答案a,a是原文中的一個或多個span<Question,Context> -> <Answer>。

如圖所示,通過提問“鄭強什麼時候就職于越秀會計事務所?”,我們可以發現,是在1998年到2000年時就職于越秀會計事務所。這樣就得到鄭強、越秀會計事務所、時間等多個實體間關係。

2. MRC 做法

MRC的做法也是分爲4步:

範式1,傳統的方案

先Embed,把字和詞變成稠密向量,通過Contextual進行Encode,這裏通過的是LSTM或者GRU之類的方案,通過上下文一起考慮進來,然後進行Attend,question和文章互相注意,最後是Predict,進行分類和序列標註。

範式2

Bert出現之後,可以通過Bert方案,把前3步換成Bert,最後預測一個start和一個end,或者通過序列標註的方案來做。

如上圖,Bert時,會在Question的Tok前加一個CLS,後面加一個SEP,然後把Paragraph的Tok放在後面。然後預測Paragraph中哪位置的Tok是start,哪個位置的Tok是end,來預測閱讀理解問題。

3. 使用MRC做實體關係抽取

在ACL2019的論文中,我們提出了使用一種MRC的新的範式來做實體和關係抽取。

三元組:(頭實體,關係,尾實體)例如(喬布斯,受僱於,蘋果公司)

對於“喬布斯是蘋果公司的CEO”可以提兩個問題:

① 首先提的是頭問題,Q:人名是什麼?A:喬布斯

② 基於上一步的答案提出第二個問題,Q:喬布斯受僱於哪家公司?A:蘋果

上圖爲,我們算法的詳細流程圖,首先得到head Entity頭實體,對於頭實體提問完之後,可以得到頭實體的答案,把頭實體的答案填入問題模板中,再獲得後面的實體。

目標函數就是head-entity的Loss+tail-entity的Loss,然後進行一個加權。

問題模板如上圖所示,對於鄭強或者馬斯克的例子,我們可以問四個問題:

第一個問題是誰在這段話裏被提及了,也就是馬斯克或者鄭強。

第二個問題是鄭強在哪個公司任職,得到很多公司。

第三個問題是鄭強在這個公司的職務是什麼,得到職務。

最後,把上面三步的答案拼在一起得到最後一個問題,E1在E2擔當E3的任職時間是什麼,得到E4。

4. 多輪問答進行實體-關係抽取

接下來就是剛剛舉得例子,首先是第一個問題:

文中提到的人物有哪些?

然後是他的公司是什麼?

再分別問在每個公司的工作時間?

擔任什麼職務?

在越秀會計事務所工作的時間?

在其他公司擔任的職務,等等問題。

這樣通過閱讀理解的方案就得到了這樣一張表,也就是完成了從非結構化文本到結構化文本的轉換。

5. 強化學習

這裏在做閱讀理解的時候有一個問題:靠前實體的準確率會影響後續的信息抽取,這樣的問題在翻譯中也會遇到;訓練的時候我們一般會使用前面實體的ground truth填入後面實體的模板;在預測的時候,我們會使用實際預測出的答案,這樣就產生了一個訓練和預測的gap,第三階段錯誤的實體,原因很有可能是第一階段的實體就錯了,這樣的Loss並沒有回傳給第一階段的實體。

所以,我們採用了強化學習的方法:

  • 每輪的動作:在所有可能中選取該輪的答案。
  • 策略:預先用ground truth訓練多輪QA的概率作爲強化學習的初始策略,避免策略不穩定的情況。
  • 獎勵:

得到的獎勵就是這個公式,得到這個公式之後就可以將Loss回傳,這樣後面輪數的Loss可以反饋給前面的輪數,使前面的輪數更加準確。

6. 實驗結果

我們發現在ACE2004和2005數據集上,Multi-turn的方式相比於傳統的方式分別有1個點和0.6個點的提升。

Part5 性能優化

剛剛講了使用閱讀理解的方式來做信息抽取,使用的閱讀理解是基於BERT模型,由於BERT參數非常龐大,會遇到一些性能的問題:

1. 深度學習模型性能問題

在做web service時,由於用戶的請求是離散的,且大小不定,不易batch運算。

以MASK LM任務爲例,一個64個字的句子做MASK-LM任務,封裝爲web service,我們發現QPS只有12。因此,我們開發了Service Streamer。

2. Service Streamer

Service Streamer將服務請求排隊組成完整batch,其好處有:

  • 簡單易用:只需要添加兩三行代碼即可讓模型提速上十倍;
  • 處理速度快:低延遲,專門針對速度做了優化;
  • 可擴展性好:可輕鬆擴展到多GPU場景,處理大量請求;
  • 適用性強:它是一箇中間件,適用於所有深度學習框架和web框架。

Github鏈接如下,感興趣的小夥伴可以仔細研究下:

https://github.com/ShannonAI/service-streamer#develop-bert-service-in-5-mintues

我們做了一個benchmark,在一個普通的Web Service情況下,QPS是12,latency是8s,使用ThreaedStreamer可以增加到208,繼續使用多進程的Streamer可以做到321,使用RedisStreamer會在350左右,根據每次測量會有些區別。

在多GPU場景下,可以繼續提升性能,且非常容易擴展,當使用2張或者4張卡的時候,QPS可以成比例的增加。

Part6 總結

最後小結下此次分享的主要內容:

  • 自然語言處理,重點介紹了NLP與深度學習結合的兩個範式。
  • 信息抽取,重點介紹了實體關係抽取的傳統做法及傳統做法的問題,傳統做法很難處理層級關係及準確率問題。
  • 機器閱讀理解,基於機器閱讀理解的信息抽取方法在結果上優於傳統做法。
  • 性能優化,利用service streamer中間件可以提升深度學習模型性能。

作者介紹

周明昕博士,香儂科技信息抽取團隊負責人,負責香儂科技信息抽取領域算法研發和落地。在北京大學獲得理學學士和工學博士學位,已發表十餘篇國際會議和期刊論文,擁有多項國際國內專利。曾任職於百度核心搜索部,負責搜索智能問答算法研發。

本文來自 DataFun 社區

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章