【指針網絡系列1】-GlobalPointer NER


寫在前面

​ 該系列主要事對指針網絡在NER以及關系抽取系列取得的成果進行展示,並根據大佬們的筆記總結其中的優劣以及理論分析。

GlobalPointer

​ 在之前的工作中,我們NER采用傳統的LSTM+CRF,在各個字段指標也取得不錯的效果,簡單字段類似學歷這種f1值均在95以上,復雜一點的比如行業專業等也在90以上;最終評估完全准確率(對一篇文檔,所有字段均抽取正確算對)85以上。而基於當前模型也沒有什么太好的優化方案,無非就是針對性補數據,后處理等等。基於此着手調研當前NER更好的方式,當然直接用BERT+CRF會取得比當前更好的效果,有不錯的提升,但性能問題卻很難解決,能做的就是對BERT進行蒸餾、剪枝,但其實效果並不能令人滿意。

​ 偶然之間(必然)看到了蘇老師的GlobalPointer,遂進行了深入研究和探索,最終取得不錯的結果,借助蘇老師的模型,完全准去率從85上升到91,在cpu測試單挑耗時不到17ms,不得不說是性能和指標雙重達標。(注意:此處采用的BERT是四層的BERT,接用網上teacher-student訓練的四層模型結果來做的,完整的BERT完全准確率高達96,耗時未測,我偷懶了)

​ 下面簡單介紹一下優雅與性能並存的GlobalPointer是怎么回事!!!

​ 利用全局歸一化思路進行實體識別,兼容了嵌套實體和非嵌套實體,設計理論比CRF更合理,訓練過程中也不需要想CRF一樣遞歸計算分母,預測的時候也不需要動態規划,完全並行,理想情況瞎時間復雜度\(\color{blue}{O(1)}\)

L9G8k8.png

\(\color{red}{Pointer\ Network 與 GlobalPointer區別}\)

  • Pointer Network一般采用兩個模塊分別識別實體的首和尾,而GlobalPointer將首位是為一個整體去進行判斷,如上圖,因此更具有“全局觀”。

基本思路

​ 假設我們要對一個文本長度為n的文本進行實體識別,而理論上我們識別的實體是連續的,並且最大長度可以為n,由此可以得出最大候選實體個數有\(\color{blue}{n(n+1)/2}\)個;問題就轉換為我們從這些候選中挑選出真實的實體,就變成了m個關系從候選中選k的多標簽分類問題。

​ 這里可以發現一個問題就是復雜度為\(\color{blue}{O(n^2)}\),但這其實是空間上的復雜度,在時間上完全可以並行,可以降到\(\color{blue}{O(n)}\)

數學形式

​ 長度為nt輸入經過編碼后得到向量序列\(\color{blue}{h_1,h_2,...h_n}\),通過變換\(\color{blue}{q_{i,\alpha}=w_{q,\alpha}h_i+b_{q,\alpha}}\)\(\color{blue}{k_{i,\alpha}=w_{k,\alpha}h_i+b_{k,\alpha}}\),可以得到序列向量\(\color{blue}{[q_{1,\alpha},q_{2,\alpha},...,p_{n,\alpha}]}\)\(\color{blue}{[k_{1,\alpha},k_{2,\alpha},...,k_{n,\alpha}]}\),是識別第\(\color{blue}{\alpha}\)種類型實體所用的向量序列。此時可以定義:

\[\color{blue}{s_\alpha(i,j)=q_{i,\alpha}^Tk_{j,\alpha}-----(1)} \]

上面就是\(\color{blue}{\alpha}\)類型實體\(\color{blue}{t_{[i:j]}}\)ij的打分。這里可以看出,其實就是Multi-Head Attention的一個簡化版,少了V的相關運算。

位置編碼

​ 理論上公式(1)已經足夠了,但實際訓練中由於預料不足表現往往差強人意,究其原因是少了一些相對位置信息,在蘇老師的實驗中,加不加相對位置信息,指標差距近30%以上。

​ 沒有位置信息會導致如何呢?我們可以舉個簡單的例子,比如:北京巴拉巴拉上海巴拉拉吧廣東,假設我們識別地名,由於GlobalPointer對句子的長度以及位置信息都不敏感,那么就有可能出現北京巴拉巴拉上海識別為地點。但是有了職位信息就會解決這個問題,從而區分出真正的實體。

​ 關於位置編碼一直想研究一下各種不同的位置編碼的區別以及優劣,但苦苦沒有開始,再次立個flag吧。下篇就寫它,是的,已經立完了。直接說蘇老師在里面用了RoPE旋轉式位置編碼,它其實就是一個變換矩陣\(\color{blue}{R_i}\),滿足\(\color{blue}{R_i^TR_j=R{j-i}}\),這樣應用到公式(1)的qk中,得到如下:

\[\color{blue}{s_\alpha(i,j)=(R_iq_{i,\alpha})^T(R_jk_{j,\alpha})\\ =q_{i,\alpha}^TR_i^TR_jk_{j,\alpha}\\ =q_{i,\alpha}^TR_{j-i}k_{j,\alpha} --------- (2)} \]

這樣就顯式的往\(\color{blue}{s_\alpha(i,j)}\)里面注入了相對位置信息。

​ 上述內容,從基本思路到數學形式、位置編碼就基本說完了GlobalPointer的原理及模型表示。下面說說優化。

損失函數

​ 從上面可以看出,最終打分函數相當於\(\color{blue}{\alpha}\)\(\color{blue}{n(n+1)/2}\)類個二分類問題,相當於對每個類型的實體候選有\(\color{blue}{n(n+1)/2}\)這么多個,每個候選相當於做一個二分類問題,很明顯,最后會存在嚴重的類別不平衡問題。

​ 參考2《將“softmax+交叉熵”推廣到多標簽分類問題》,里面提到的方式就是單目標多分類的交叉熵的推廣,適合總數很大但目標標簽很少的場景。公式如下:

\[\color{blue}{log(1+\sum_{(i,j)\in P_\alpha}e^{-s_\alpha(i,j)})+log(1+\sum_{(i,j)\in Q_\alpha}e^{s_\alpha(i,j)})----(3)} \]

其中\(\color{blue}{P_\alpha}\)是該樣本的所有類型為\(\color{blue}{\alpha}\)的實體的收尾集和,\(\color{blue}{Q_\alpha}\)是該樣本所有非實體或者類型非\(\color{blue}{\alpha}\)的實體的收尾集和,注意我們只需要考慮\(\color{blue}{i\leq j}\)的組合,即:

\[\color{blue}{Ω={(i,j)|1\leq i\leq j \leq n}\\P_\alpha={(i,j)|t_{[i,j]}是類型為\alpha的實體}------(4)\\Q_\alpha=Ω-P_\alpha} \]

而在解碼階段,所有滿足\(\color{blue}{s_\alpha(i,j)\gt0}\)的片段\(\color{blue}{t_{[i:j]}}\)都被視為類型\(\color{blue}{\alpha}\)的實體輸出。可以看出,解碼的過程是極其簡單的,並且充分並行下解碼效率就是\(\color{blue}{O(1)}\)!。

實驗結果

​ 展示在CMeEE(嵌套任務)數據上的實驗結果。

驗證集F1 測試集F1 訓練速度 預測速度
CRF 63.81% 64.39% 1x 1x
GP 64.84% 65.98% 1.52x 1.13x

與CRF對比[純copy]

​ 假設序列標注標簽數為k,那么逐幀softmaxcrf的區別在於:\(\color{red}{前者將序列標注堪稱n個k分類問題,后者將序列標注堪稱1個k^n分類問題}\)。這也說明了逐幀softmaxcrf用於NER時的理論上的缺點。 逐幀softmax將序列標注看成是nk分類問題,那是過於寬松了,因為某個位置上的標注標簽預測對了,不代表實體就能正確抽取出來了,起碼有一個片段的標簽都對了才算對;相反,CRF將序列標注看成是1個\(\color{blue}{k^n}\)分類問題,則又過於嚴格了,因為這意味着它要求所有實體都預測正確才算對,只對部分實體也不給分。雖然實際使用中我們用CRF也能出現部分正確的預測結果,但那只能說明模型本身的泛化能力好,CRF本身的設計確實包含了“全對才給分”的意思。

​ 所以,CRF在理論上確實都存在不大合理的地方,而相比之下,GlobalPointer則更加貼近使用和評測場景:它本身就是以實體為單位的,並且它設計為一個“多標簽分類”問題,這樣它的損失函數和評價指標都是實體顆粒度的,哪怕只對一部分也得到了合理的打分。因此,哪怕在非嵌套NER場景,GlobalPointer能取得比CRF好也是“情理之中”的。

巨人的肩膀

1、蘇劍林. (May. 01, 2021). 《GlobalPointer:用統一的方式處理嵌套和非嵌套NER 》

2、將“softmax+交叉熵”推廣到多標簽分類問題


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM