NLP系列之NER/RE:序列標(biāo)注/層疊指針網(wǎng)絡(luò)/Multi-head Selection/Deep Biaffine Attn
作者簡(jiǎn)介
作者:ZHOU-JC (廣州云迪科技有限公司 NLP算法工程師)
原文:https://zhuanlan.zhihu.com/p/381894616
前言
上一篇博客提到用BERT+CRF幸運(yùn)地拿到天池比賽的亞軍,但還想進(jìn)一步探究其它模型架構(gòu)。一方面,比賽不存在實(shí)體嵌套問題,故用BERT+CRF也能取得不俗的成績(jī),另一方面,這幾年陸續(xù)誕生了很多實(shí)體識(shí)別/關(guān)系抽取的SOTA模型,掌握它們,再根據(jù)自己遇到的業(yè)務(wù)場(chǎng)景設(shè)計(jì)方案是十分重要的。
本博文主要探究關(guān)系抽取,但很多方法對(duì)于NER任務(wù)來說也是通用的。目前常見的做關(guān)系抽取的框架可以參考這篇博文,
博文里提到的序列標(biāo)注、指針標(biāo)注、多頭標(biāo)注、片段排列都是目前比較常見的框架。
關(guān)系抽取:Pipeline vs Joint
關(guān)系抽取就是實(shí)體識(shí)別以及判斷實(shí)體之間的關(guān)系,有兩種方式:
pipeline:第一步使用序列標(biāo)注模型抽取實(shí)體,第二步使用關(guān)系分類模型得到實(shí)體pair的關(guān)系;
joint聯(lián)合抽取:使用同一個(gè)模型來完成實(shí)體抽取和關(guān)系分類,也即意味著這一個(gè)模型的部分參數(shù)對(duì)于實(shí)體識(shí)別、關(guān)系分類來說是共享的。
pipeline
優(yōu)點(diǎn)
靈活,解耦,在一個(gè)公司里可以一組人做實(shí)體識(shí)別、一組人做關(guān)系抽取,各自優(yōu)化各自的部分。
缺點(diǎn)
error propagation,誤差傳播:實(shí)體抽取錯(cuò)誤的,會(huì)影響后續(xù)的關(guān)系分類;
忽略了實(shí)體識(shí)別和關(guān)系分類之間的關(guān)系,看下圖,《》圍住的可能是書名或歌名,對(duì)應(yīng)的關(guān)系是作者和歌手。假如關(guān)系識(shí)別出是作者,那《》圍住的大概率就是書名,也即關(guān)系識(shí)別對(duì)實(shí)體識(shí)別是有啟示作用的,同理,實(shí)體識(shí)別對(duì)關(guān)系分類也有啟示作用,把它們解耦無法讓它們產(chǎn)生交互;

3. 計(jì)算資源占用大。如第一步抽取出n個(gè)實(shí)體,那第二步我們要把
個(gè)實(shí)體pairs傳到關(guān)系分類模型,而實(shí)際上,大部分pair是沒關(guān)系的,造成大量的計(jì)算資源浪費(fèi)。
joint聯(lián)合抽取
優(yōu)點(diǎn):
pipeline的缺點(diǎn)反過來就是joint的優(yōu)點(diǎn)。
缺點(diǎn)
雖然在訓(xùn)練時(shí)是用joint的方式,共享部分模型參數(shù),這部分參數(shù)通過實(shí)體抽取和關(guān)系分類共同更新,但在predict解碼時(shí),大部分joint架構(gòu)用的還是先抽取實(shí)體,再把這部分信息作為關(guān)系分類輸入的一部分。這種解碼方法本質(zhì)上和pipeline無區(qū)別,一樣會(huì)造成誤差傳播,暴露偏差的問題,當(dāng)然目前也有類似TPLinker這種聯(lián)合解碼的方法解決暴露偏差的問題。
如何平衡實(shí)體識(shí)別以及關(guān)系抽取的關(guān)系。就像多任務(wù)學(xué)習(xí)一樣,怎么平衡它們之間的損失是要考慮的問題。
方法實(shí)驗(yàn)細(xì)節(jié)及代碼復(fù)現(xiàn)
任務(wù)描述
這里用百度2021語言與智能技術(shù)競(jìng)賽的多形態(tài)信息抽取任務(wù)中的關(guān)系抽取賽道作為實(shí)驗(yàn)
比賽鏈接:
任務(wù)就是常見的SPO三元組抽取,根據(jù)預(yù)先定義的schema集合,抽取出所有滿足schema約束的SPO三元組。有些特殊的是,比賽里有43個(gè)簡(jiǎn)單知識(shí),即O是一個(gè)單一的文本片段,如「海拔」關(guān)系的schema定義為:

也有5個(gè)復(fù)雜知識(shí),即O是一個(gè)結(jié)構(gòu)體,由多個(gè)語義明確的文本片段共同組成,多個(gè)文本片段對(duì)應(yīng)了結(jié)構(gòu)體中的多個(gè)槽位 (slot)。例如,「飾演」關(guān)系中O值有兩個(gè)槽位@value和inWork,分別表示「飾演的角色是什么」以及「在哪部影視作品中發(fā)生的飾演關(guān)系」,其schema定義為:

比賽提供約17+萬訓(xùn)練數(shù)據(jù),2萬+條驗(yàn)證數(shù)據(jù)。由于比賽已經(jīng)結(jié)果,無法得到測(cè)試集結(jié)果,以下實(shí)驗(yàn)的分?jǐn)?shù)均為模型在驗(yàn)證集上最佳表現(xiàn)。
一:序列標(biāo)注(官方baseline)
詳細(xì)的可以看百度官方對(duì)提供的baseline的解讀
官方提供的baseline核心就是利用序列標(biāo)注BIO的方式來一起做實(shí)體抽取和關(guān)系分類。
簡(jiǎn)單地描述一下就是,schema有43個(gè)簡(jiǎn)單知識(shí),這部分實(shí)體類別一共有43*2=86個(gè)(因?yàn)槊恳粋€(gè)知識(shí),有subject和object兩個(gè)實(shí)體),如對(duì)上面提到的「海拔」關(guān)系,我們可以定義以下兩個(gè)實(shí)體:

對(duì)5個(gè)復(fù)雜知識(shí),這部分實(shí)體一共有4*2*2+4*2= 24個(gè)實(shí)體(有4個(gè)復(fù)雜知識(shí)的object_type有2個(gè),有一個(gè)復(fù)雜知識(shí)的object_type有4個(gè)),如上面提到的「飾演」關(guān)系,我們需要定義以下四個(gè)實(shí)體:


加上O、I兩個(gè)標(biāo)簽,標(biāo)簽類別一共有112個(gè)。
序列標(biāo)注框架有很多,如BertTokenClassification、Bert+Crf等等。由于本案例存在實(shí)體嵌套問題,所以每個(gè)token的輸出不作softmax,而是轉(zhuǎn)化為sigmoid二分類問題,即最后得到的矩陣維度應(yīng)該是【B,L,112】,每個(gè)元素做的是sigmoid二分類。這樣,每個(gè)token可以有多個(gè)標(biāo)簽,從而解決實(shí)體嵌套問題。
解碼時(shí),首先得到每個(gè)token的標(biāo)簽,再根據(jù)schema表組織成相應(yīng)的關(guān)系,不過看官方的代碼,感覺解碼時(shí)會(huì)有問題。例如看下圖,假如抽取出 主演(subject) 有【逃學(xué)威龍、精武英雄】、主演(object) 有【周星馳、李連杰】,組合關(guān)系的時(shí)候,怎么知道逃學(xué)威龍對(duì)應(yīng)的是周星馳,而不是李連杰?

官網(wǎng)提供的baseline的好處就是快,以及解決暴露偏差問題。壞處就是效果有效,在實(shí)體分類時(shí),有112個(gè)二分類,另外就是解碼時(shí)的問題。
二:層疊式指針網(wǎng)絡(luò)(基于主語感知)
源自蘇神的這兩篇文章:
,也可以看20年關(guān)系抽取賽道獲獎(jiǎng)冠軍隊(duì)伍分享視頻,蘇神他們就是利用這個(gè)架構(gòu)取得20年該賽道的冠軍。
核心思路就是先抽取subject,再抽取謂語predict和賓語object。
具體的,用指針網(wǎng)絡(luò)的方式抽取subject,指針網(wǎng)絡(luò)為【B, L, 2】的矩陣,由于一個(gè)樣本中有多個(gè)subject,所以矩陣的每個(gè)元素做的是sigmoid,而不是softmax(這種方式稱為“半指針-半標(biāo)注”),注意這里沒有引入實(shí)體標(biāo)簽信息。
抽取完subjects后,分別把每個(gè)subject,引入Conditiaonal LayerNorm,這一步相當(dāng)于預(yù)測(cè)PO時(shí),告訴模型,S是什么,使得模型學(xué)習(xí)到PO的預(yù)測(cè)是依賴于S的。注意的是,這一步要預(yù)測(cè)一個(gè)【B, L, R_num, 2】,這里R_num是關(guān)系類別數(shù),同樣是一個(gè)半指針-半序列的問題,把O和P同時(shí)預(yù)測(cè)出來。
三:Multi-head Selection
源自兩篇論文:
多頭標(biāo)注核心在于最后要構(gòu)造一個(gè) 【B, L, L, R_num】矩陣。
首先采用半指針-半標(biāo)注抽取subject和object,這里得到的矩陣為【B, L, 2, E_num】,這里E_num是實(shí)體標(biāo)簽的類別數(shù),這里同上面提到的層疊式指針網(wǎng)絡(luò)不同在于,一方面,層疊式指針網(wǎng)絡(luò)抽subject的時(shí)候,只需要把subject抽取出來,而無需知道它的標(biāo)簽信息,而這里,不僅要把實(shí)體抽取出來,通過擴(kuò)展一個(gè)長(zhǎng)度為E_num的維度,把實(shí)體標(biāo)簽也抽取出來,另一方面,這里不僅要抽取subject,還要同時(shí)把object抽取出來。
上一步得到實(shí)體標(biāo)簽的目的在于接下來把實(shí)體標(biāo)簽embedding和Bert的輸出拼接在一起,然后再接后面的全連接層,最后得到一個(gè)【B, L,L, R_num】的矩陣。這個(gè)矩陣就是關(guān)鍵的核心,怎么理解這個(gè)矩陣呢?舉個(gè)例子,假如這個(gè)矩陣的【0, m, n, r】元素大于0.5,即第一個(gè)樣本,結(jié)尾index為m的實(shí)體作為subject,和結(jié)尾index為n的實(shí)體作為object,它們之間的關(guān)系是id為r的關(guān)系。
四:Deep Biaffine Attention
源自兩篇論文:
Deep Biaffine Attention最后也是為了得到一個(gè)【B, L, L, R_num】矩陣,不同于Multi-head Selection中是通過多個(gè)線性分類器加激活函數(shù)得到的多頭矩陣,Deep Biaffine Attention思想是通過一個(gè)Biaffine Attention矩陣得到多頭矩陣。
這里 h(s) 理解成subject矩陣,它是通過把實(shí)體標(biāo)簽embedding和Bert輸出拼接后接全連接層得到的,h(o) 理解成object矩陣,它也是通過把實(shí)體標(biāo)簽embedding和Bert輸出拼接后接全連接層得到的,這兩個(gè)矩陣是不同的,一個(gè)代表subject,一個(gè)代表object。

最后得到的 r(m) 其實(shí)就是多頭矩陣的【某一個(gè)樣本, s, e, :】,判斷兩個(gè)位置的實(shí)體是否存在關(guān)系。其中 Um 、Wm 、b(m) 的shape及其意義如下:
Um:shape為【H, R_num, H】,對(duì)h(s) 為subject和 h(o) 為object的實(shí)體類別后驗(yàn)概率建模;
Wm :shape為【2*H, R_num】,對(duì) h(s) 為subject或h(o) 為object的實(shí)體類別的后驗(yàn)概率分別建模;
b(m) :shape為【R_num】,對(duì)實(shí)體類別的先驗(yàn)概率建模。
把它們加在一起,就是以h(s) 為subject, h(o) 為object,分別在R_num個(gè)關(guān)系類別的概率。
為何叫做biaffine?個(gè)人理解就是因?yàn)橐肓艘粋€(gè)先驗(yàn)概率,把 b(m) 也放到 Wm 中,這樣

要拓展多一列,全是【1, 1, 1, 1, ...】,這一行和 Wm 中的 b(m) 就得到 b(m) 。
把 Deep Biaffine Attention 和 Multi-head Selection 做比較,雖然它們最后得到的都是【B, L, L, R_num】矩陣,只不過Deep Biaffine Attention是通過一個(gè) Um 矩陣讓subject信息和object發(fā)生交互,而Multi-head Selection中subject和object其實(shí)是沒有發(fā)生這種耦合交互的。
實(shí)驗(yàn)結(jié)果對(duì)比
由于資源有效,BERT用的是哈工大訊飛聯(lián)合實(shí)驗(yàn)室發(fā)布的三層BERT。
| F1值 | |
|---|---|
| 官方baseline | 64.69 |
| 層疊式指針網(wǎng)絡(luò)(基于主語感知) | 61.22 |
| Multi-head Selection | 67.90 |
| Deep Biaffine Attention | 68.45 |
感覺層疊式指針網(wǎng)絡(luò)的復(fù)現(xiàn)感覺有點(diǎn)問題,按理說,不至于比baseline效果要差,具體的原因可能是采樣問題,也有可能是解碼問題,具體原來要再檢查一下代碼。
效果比較:
Deep Biaffine Attention > Multi-head Selection > 官方baseline > 層疊式指針網(wǎng)絡(luò)(基于主語感知)。
計(jì)算效率比較:
官方baseline > 層疊式指針網(wǎng)絡(luò)(基于主語感知)> Multi-head Selection > Deep Biaffine Attention。
個(gè)人思考及總結(jié)
本文介紹了關(guān)系抽取的四種方法,在實(shí)際應(yīng)用場(chǎng)景中,我們要根據(jù)具體任務(wù)靈活運(yùn)用。對(duì)于關(guān)系抽取來說,更重要的是掌握一些常用框架,如開頭提到的序列標(biāo)注、指針網(wǎng)絡(luò)、多頭標(biāo)準(zhǔn)、片段排列,上面的四種方法其實(shí)都是這四個(gè)框架的組合,再經(jīng)過一些設(shè)計(jì)的微調(diào)罷了。
另外要注意計(jì)算效率和空間利用率的問題。baseline雖然簡(jiǎn)單,但它是計(jì)算最快,參數(shù)最小的,很多場(chǎng)景下baseline不失為一種好的解決方案,其次,Deep biaffine Attention效果最好,但是計(jì)算最慢,參數(shù)最多。
本博文主要討論框架,但在實(shí)際業(yè)務(wù)中,關(guān)系抽取還有很多現(xiàn)實(shí)問題,如
假陰性,這是由于大部分關(guān)系抽取的標(biāo)注都是通過遠(yuǎn)程監(jiān)督的方法,導(dǎo)致很多漏標(biāo),這樣訓(xùn)練出來的模型召回率會(huì)比準(zhǔn)確率低;
標(biāo)簽不平衡,上面提到的很多方法,如指針網(wǎng)絡(luò)、多頭矩陣最后得到的大部分標(biāo)簽都是0,只有小部分是1,怎么平衡0和1之間的關(guān)系。
有機(jī)會(huì)再跟大家分享關(guān)系抽取落地的難點(diǎn)。
主要參考:
科學(xué)空間:《基于DGCNN和概率圖的輕量級(jí)信息抽取模型
科學(xué)空間:《用bert4keras做三元組抽取》
JayJay:《刷爆3路榜單,信息抽取冠軍方案分享:嵌套NER+關(guān)系抽取+實(shí)體標(biāo)準(zhǔn)化》
《信息抽取(二)花了一個(gè)星期走了無數(shù)條彎路終于用TF復(fù)現(xiàn)了蘇神的《Bert三元關(guān)系抽取模型》,我到底悟到了什么?》
《信息抽?。ㄋ模綨LP論文復(fù)現(xiàn)】Multi-head Selection和Deep Biaffine Attention在關(guān)系抽取中的實(shí)現(xiàn)和效果》
Joint entity recognition and relation extraction as a multi-head selection problem
BERT-Based Multi-Head Selection for Joint Entity-Relation Extraction
Deep Biaffine Attention for Neural Dependency Parsing
Named Entity Recognition as Dependency Parsing





