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