GPLinker:基于GlobalPointer的实体关系联合抽取
?PaperWeekly 原創(chuàng) ·?作者 | 蘇劍林
單位 | 追一科技
研究方向 | NLP、神經(jīng)網(wǎng)絡(luò)
兩年前,在百度的“2019 語言與智能技術(shù)競賽”(下稱 LIC2019)中,筆者提出了一個新的關(guān)系抽取模型(參考《基于 DGCNN 和概率圖的輕量級信息抽取模型》),后被進一步發(fā)表和命名為“CasRel”,算是當(dāng)時關(guān)系抽取的 SOTA。然而,CasRel 提出時筆者其實也是首次接觸該領(lǐng)域,所以現(xiàn)在看來 CasRel 仍有諸多不完善之處,筆者后面也有想過要進一步完善它,但也沒想到特別好的設(shè)計。
后來,筆者提出了 GlobalPointer 以及近日的 Efficient GlobalPointer,感覺有足夠的“材料”來構(gòu)建新的關(guān)系抽取模型了。于是筆者從概率圖思想出發(fā),參考了 CasRel 之后的一些 SOTA 設(shè)計,最終得到了一版類似 TPLinker 的模型。
基礎(chǔ)思路
關(guān)系抽取乍看之下是三元組 (即 subject, predicate, object)的抽取,但落到具體實現(xiàn)上,它實際是“五元組” 的抽取,其中 分別是 的首、尾位置,而 則分別是 的首、尾位置。
從概率圖的角度來看,我們可以這樣構(gòu)建模型:
1. 設(shè)計一個五元組的打分函數(shù) ;
2. 訓(xùn)練時讓標(biāo)注的五元組 ,其余五元組則 ;
3. 預(yù)測時枚舉所有可能的五元組,輸出 的部分。
然而,直接枚舉所有的五元組數(shù)目太多,假設(shè)句子長度為 , 的總數(shù)為 ,即便加上 和 的約束,所有五元組的數(shù)目也有
這是長度的四次方級別的計算量,實際情況下難以實現(xiàn),所以必須做一些簡化。
簡化分解
以我們目前的算力來看,一般最多也就能接受長度平方級別的計算量,所以我們每次頂多能識別“一對”首或尾,為此,我們可以用以下的分解:
要注意的是,該等式屬于模型假設(shè),是基于我們對任務(wù)的理解以及算力的限制所設(shè)計出來的,而不是理論推導(dǎo)出來的。其中,每一項都具直觀的意義,比如 、 分別是 subject、object 的首尾打分,通過 和 來析出所有的 subject 和 object。至于后兩項,則是 predicate 的匹配, 這一項代表以 subject 和 object 的首特征作為它們自身的表征來進行一次匹配,如果我們能確保 subject 內(nèi)和 object 內(nèi)是沒有嵌套實體的,那么理論上 就足夠析出所有的 predicate 了,但考慮到存在嵌套實體的可能,所以我們還要對實體的尾再進行一次匹配,即 這一項。
此時,訓(xùn)練和預(yù)測過程變?yōu)?#xff1a;
1. 訓(xùn)練時讓標(biāo)注的五元組 、、、,其余五元組則 、、、;
2. 預(yù)測時枚舉所有可能的五元組,逐次輸出 、、、 的部分,然后取它們的交集作為最終的輸出(即同時滿足 4 個條件)。
在實現(xiàn)上,由于 、 是用來識別 subject、object 對應(yīng)的實體的,它相當(dāng)于有兩種實體類型的 NER 任務(wù),所以我們可以用一個 GlobalPointer 來完成;至于 ,它是用來識別 predicate 為 的 對,跟 NER 不同的是,NER 有 的約束而它沒有,這里我們同樣用 GlobalPointer 來完成,但為了識別出 的部分,要去掉 GlobalPointer 默認(rèn)的下三角? mask;最后 跟 同理,不再贅述。
這里再回顧一遍:我們知道,作為 NER 模塊,GlobalPointer 可以統(tǒng)一識別嵌套和非嵌套的實體,而這是它基于 token-pair 的識別來做到的。所以,我們應(yīng)該進一步將 GlobalPointer 理解為一個 token-pair 的識別模型,而不是局限在 NER 范圍內(nèi)理解它。認(rèn)識到這一點之后,我們就能明白上述 、、、 其實都可以用 GlobalPointer 來實現(xiàn)了,而要不要加下三角 mask,則自行根據(jù)具體任務(wù)背景設(shè)置就好。
損失函數(shù)
現(xiàn)在我們已經(jīng)把打分函數(shù)都設(shè)計好了,那么為了訓(xùn)練模型,就差損失函數(shù)了。這里繼續(xù)使用 GlobalPointer 默認(rèn)使用的、在《將“softmax+交叉熵”推廣到多標(biāo)簽分類問題》中提出的多標(biāo)簽交叉熵,它的一般形式為:
其中 分別是正、負(fù)類別的集合。在之前的文章中,我們都是用“multi hot”向量來標(biāo)記正、負(fù)類別的,即如果總類別數(shù)為 ,那么我們用一個 維向量來表示,其中正類的位置為 1,負(fù)類的位置為 0。然而,在 和 的場景,我們各需要一個 的矩陣來標(biāo)記,兩個加在一起并算上 batch_size 總維度就是 ,以 為例,那么 億。這也就意味著,如果我們還堅持用“multi hot”的形式表示標(biāo)簽的話,每一步訓(xùn)練我們都要創(chuàng)建一個 1 億參數(shù)量的矩陣,然后還要傳到 GPU 中,這樣不管是創(chuàng)建還是傳輸成本都很大。
所以,為了提高訓(xùn)練速度,我們需要實現(xiàn)一個“稀疏版”的多標(biāo)簽交叉熵,即每次都只傳輸正類所對應(yīng)的的下標(biāo)就好,由于正類遠(yuǎn)遠(yuǎn)少于負(fù)類,這樣標(biāo)簽矩陣的尺寸就大大減少了。而“稀疏版”多標(biāo)簽交叉熵,意味著我們要在只知道 和 的前提下去實現(xiàn)式(3)。為此,我們使用的實現(xiàn)方式是:
如果即
402 Payment Required
,那么可以寫為這樣就通過 和 算出了負(fù)類對應(yīng)的損失,而正類部分的損失保持不變就好。
最后,一般情況下的多標(biāo)簽分類任務(wù)正類個數(shù)是不定的,這時候我們可以將類的下標(biāo)從 1 開始,將 0 作為填充標(biāo)簽使得每個樣本的標(biāo)簽矩陣大小一致,最后在 loss 的實現(xiàn)上對 0 類進行 mask 處理即可。相應(yīng)的實現(xiàn)已經(jīng)內(nèi)置在 bert4keras 中,詳情可以參考“sparse_multilabel_categorical_crossentropy” [1]。
實驗結(jié)果
為了方便稱呼,我們暫且將上述模型稱為 GPLinker(GlobalPointer-based Linking),一個基于 bert4keras 的參考實現(xiàn)如下:
腳本鏈接:task_relation_extraction_gplinker.py [2]
在 LIC2019 上的實驗結(jié)果如下(CasRel 的代碼為 task_relation_extraction.py [3]):
預(yù)訓(xùn)練模型是 BERT base,Standard 和 Efficient 的區(qū)別是分別使用了標(biāo)準(zhǔn)版GlobalPointer 和 Efficient GlobalPointer。該實驗結(jié)果說明了兩件事情,一是 GPLinker 確實比 CasRel 更加有效,二是 Efficient GlobalPointer 的設(shè)計確實能在更少參數(shù)的情況下媲美標(biāo)準(zhǔn)版 GlobalPointer 的效果。要知道在 LIC2019 這個任務(wù)下,如果使用標(biāo)準(zhǔn)版 GlobalPointer,那么 GPLinker 的參數(shù)量接近 1 千萬,而用 Efficient GlobalPointer 的話只有 30 萬左右。
此外,在 3090 上,相比于“multi hot”版的多標(biāo)簽交叉熵,使用稀疏版多標(biāo)簽交叉熵的模型在訓(xùn)練速度上能提高 1.5 倍而不會損失精度,跟 CasRel 相比,使用了稀疏版多標(biāo)簽交叉熵的 GPLinker 在訓(xùn)練速度上只慢 15%,但是解碼速度快將近一倍,算得上又快又好了。
相關(guān)工作
而對于了解這兩年關(guān)系抽取 SOTA 模型進展的同學(xué)來說,理解上述模型后,會發(fā)現(xiàn)它跟 TPLinker [4] 是非常相似的。確實如此,模型在設(shè)計之初確實充分借鑒了 TPLinker,最后的結(jié)果也同樣跟 TPLinker 很相似。
大體上來說,TPLinker 與 GPLinker 的區(qū)別如下:
1. TPLinker 的 token-pair 分類特征是首尾特征后拼接做 Dense 變換得到的,其思想來源于 Additive Attention;GPLinker 則是用 GlobalPointer 實現(xiàn),其思想來源于 Scaled Dot-Product Attention。平均來說,后者擁有更少的顯存占用和更快的計算速度。
2. GPLinker 分開識別 subject 和 object 的實體,而 TPLinker 將 subject 和 object 混合起來統(tǒng)一識別。筆者也在 GPLinker 中嘗試了混合識別,發(fā)現(xiàn)最終效果跟分開識別沒有明顯區(qū)別。
3. 在 和 ,TPLinker 將其轉(zhuǎn)化為了 個 3 分類問題,這會有明顯的類別不平衡問題;而 GPLinker 用到了筆者提出的多標(biāo)簽交叉熵,則不會存在不平衡問題,更容易訓(xùn)練。事實上后來 TPLinker 也意識到了這個問題,并提出了 TPLinker-plus [5],其中也用到了該多標(biāo)簽交叉熵。
當(dāng)然,在筆者看來,本文的最主要貢獻,并不是提出 GPLinker 的這些改動,而是對關(guān)系聯(lián)合抽取模型進行一次“自上而下”的理解:從開始的五元組打分 出發(fā),分析其難處,然后簡化分解式(2)來“逐個擊破”。希望這個自上而下的理解過程,能給讀者在為更復(fù)雜的任務(wù)設(shè)計模型時提供一定的思路。
文章小結(jié)
本文分享了一個基于 GlobalPointer 的實體關(guān)系聯(lián)合抽取模型——“GPLinker”,并提供了一個“自上而下”的推導(dǎo)理解給大家參考。
參考文獻
[1] https://github.com/bojone/bert4keras/blob/4dcda150b54ded71420c44d25ff282ed30f3ea42/bert4keras/backend.py#L272
[2] https://github.com/bojone/bert4keras/tree/master/examples/task_relation_extraction_gplinker.py
[3] https://github.com/bojone/bert4keras/tree/master/examples/task_relation_extraction.py
[4] https://arxiv.org/abs/2010.13415
[5] https://github.com/131250208/TPlinker-joint-extraction/tree/master/tplinker_plus
更多閱讀
#投 稿?通 道#
?讓你的文字被更多人看到?
如何才能讓更多的優(yōu)質(zhì)內(nèi)容以更短路徑到達(dá)讀者群體,縮短讀者尋找優(yōu)質(zhì)內(nèi)容的成本呢?答案就是:你不認(rèn)識的人。
總有一些你不認(rèn)識的人,知道你想知道的東西。PaperWeekly 或許可以成為一座橋梁,促使不同背景、不同方向的學(xué)者和學(xué)術(shù)靈感相互碰撞,迸發(fā)出更多的可能性。?
PaperWeekly 鼓勵高校實驗室或個人,在我們的平臺上分享各類優(yōu)質(zhì)內(nèi)容,可以是最新論文解讀,也可以是學(xué)術(shù)熱點剖析、科研心得或競賽經(jīng)驗講解等。我們的目的只有一個,讓知識真正流動起來。
📝?稿件基本要求:
? 文章確系個人原創(chuàng)作品,未曾在公開渠道發(fā)表,如為其他平臺已發(fā)表或待發(fā)表的文章,請明確標(biāo)注?
? 稿件建議以?markdown?格式撰寫,文中配圖以附件形式發(fā)送,要求圖片清晰,無版權(quán)問題
? PaperWeekly 尊重原作者署名權(quán),并將為每篇被采納的原創(chuàng)首發(fā)稿件,提供業(yè)內(nèi)具有競爭力稿酬,具體依據(jù)文章閱讀量和文章質(zhì)量階梯制結(jié)算
📬?投稿通道:
? 投稿郵箱:hr@paperweekly.site?
? 來稿請備注即時聯(lián)系方式(微信),以便我們在稿件選用的第一時間聯(lián)系作者
? 您也可以直接添加小編微信(pwbot02)快速投稿,備注:姓名-投稿
△長按添加PaperWeekly小編
🔍
現(xiàn)在,在「知乎」也能找到我們了
進入知乎首頁搜索「PaperWeekly」
點擊「關(guān)注」訂閱我們的專欄吧
·
總結(jié)
以上是生活随笔為你收集整理的GPLinker:基于GlobalPointer的实体关系联合抽取的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 半夜刷信用卡有影响吗
- 下一篇: 贷款利率多样,存在思维陷阱