日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

GlobalPointer:用统一的方式处理嵌套和非嵌套NER

發布時間:2024/10/8 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GlobalPointer:用统一的方式处理嵌套和非嵌套NER 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?PaperWeekly 原創 ·?作者|蘇劍林

單位|追一科技

研究方向|NLP、神經網絡

本文將介紹一個稱為 GlobalPointer 的設計,它利用全局歸一化的思路來進行命名實體識別(NER),可以無差別地識別嵌套實體和非嵌套實體,在非嵌套(Flat NER)的情形下它能取得媲美 CRF 的效果,而在嵌套(Nested NER)情形它也有不錯的效果。

還有,在理論上,GlobalPointer 的設計思想就比 CRF 更合理;而在實踐上,它訓練的時候不需要像 CRF 那樣遞歸計算分母,預測的時候也不需要動態規劃,是完全并行的,理想情況下時間復雜度是 !

簡單來說,就是更漂亮、更快速、更強大!真有那么好的設計嗎?不妨繼續看看。

▲ GlobalPoniter多頭識別嵌套實體示意圖

GlobalPointer

常規的 Pointer Network 的設計在做實體識別或者閱讀理解時,一般是用兩個模塊分別識別實體的首和尾,這會帶來訓練和預測時的不一致。而 GlobalPointer 就是針對這個不一致而設計的,它將首尾視為一個整體去進行判別,所以它更有“全局觀”(更 Global)。

1.1 基本思路

具體來說,假設要識別文本序列長度為 n,簡單起見先假定只有一種實體要識別,并且假定每個待識別實體是該序列的一個連續片段,長度不限,并且可以相互嵌套(兩個實體之間有交集),那么該序列有多少個“候選實體”呢?不難得出,答案是 個,即長度為 n 的序列有 個不同的連續子序列,這些子序列包含了所有可能的實體,而我們要做的就是從這 個“候選實體”里邊挑出真正的實體,其實就是一個“ 選 k”的多標簽分類問題。

如果有 m 種實體類型需要識別,那么就做成 m 個“ 選 k”的多標簽分類問題。這就是 GlobalPointer 的基本思想,以實體為基本單位進行判別,如本文開頭的圖片所示。

可能有讀者會問:這種設計的復雜度明明就是 呀,不會特別慢嗎?如果現在還是 RNN/CNN 的時代,那么它可能就顯得很慢了,但如今是 Transformer 遍布 NLP 的時代,Transformer 的每一層都是 的復雜度,多 GlobalPointer 一層不多,少 GlobalPointer 一層也不少,關鍵是 的復雜度僅僅是空間復雜度,如果并行性能好的話,時間復雜度甚至可以降到 ,所以不會有明顯感知。

1.2 數學形式

設長度為 n 的輸入 t 經過編碼后得到向量序列 ,通過變換 我們可以得到序列向量序列 ,它們是識別第 種類型實體所用的向量序列。此時我們可以定義:

作為從 i 到 j 的連續片段是一個實體的打分。也就是說,用 與 的內積,作為片段 是類型為 的實體的打分(logits),這里的 指的是序列 t 的第 i 個到第 j 個元素組成的連續子串。

在這樣的設計下,GlobalPointer 事實上就是 Multi-Head Attention 的一個簡化版而已,有多少種實體就對應多少個 head,相比 Multi-Head Attention 去掉了 相關的運算。

1.3 相對位置

理論上來說,式(1)這樣的設計就足夠了,但實際上訓練語料比較有限的情況下,它的表現往往欠佳,因為它沒有顯式地包含相對位置信息。在后面的實驗中我們將會看到,加不加相對位置信息,效果可以相差 30 個百分點以上!

比如,我們要識別出地名,輸入是天氣預報的內容“北京:21 度;上海:22 度;杭州:23 度;廣州:24 度;...”,這時候要識別出來的實體有很多,如果沒有相對位置信息輸入的話,GlobalPointer 對實體的長度和跨度都不是特別敏感,因此很容易把任意兩個實體的首尾組合都當成目標預測出來(即預測出“北京:21 度;上海”這樣的實體)。相反,有了相對位置信息之后,GlobalPointer就會對實體的長度和跨度比較敏感,因此能更好地分辨出真正的實體出來。

用哪種相對位置編碼呢?理論上來說,Transformer 里邊所有的相對位置編碼都可以考慮用(參考讓研究人員絞盡腦汁的 Transformer 位置編碼),但真的要去落實就會發現一個問題,大多數相對位置編碼都對相對位置進行了一個截斷,雖然這個截斷范圍對我們要識別的實體來說基本都夠用了,但未免有點不優雅,不截斷又會面臨可學參數太多的問題。想來想去,還是覺得筆者之前構思的旋轉式位置編碼(RoPE)比較適合。

RoPE 的介紹可見 Transformer 升級之路:博采眾長的旋轉式位置編碼,它其實就是一個變換矩陣 ,滿足關系 ,這樣一來我們分別應用到 中,就有:

從而就顯式地往打分 注入了相對位置信息。

優化細節

在這部分內容中,我們會討論關于 GlobalPointer 在訓練過程中的一些細節問題,包括損失函數的選擇以及評價指標的計算和優化等,從中我們可以看到,GlobalPointer 以實體為單位的設計有著諸多優雅和便利之處。

2.1 損失函數

到目前為止,我們已經設計好了打分 ,識別特定的類 的實體,則變成了共有 類的多標簽分類問題。接下來的關鍵是損失函數的設計。最樸素的思路是變成 個二分類,然而實際使用時 n 往往并不小,那么 更大,而每個句子的實體數不會很多(每一類的實體數目往往只是個位數),所以如果是 個二分類的話,會帶來極其嚴重的類別不均衡問題。

這時候我們之前研究的將“softmax+交叉熵”推廣到多標簽分類問題就可以派上用場了。簡單來說,這是一個用于多標簽分類的損失函數,它是單目標多分類交叉熵的推廣,特別適合總類別數很大、目標類別數較小的多標簽分類問題。其形式也不復雜,在 GlobalPointer 的場景,它為:

其中 是該樣本的所有類型為 的實體的首尾集合, 是該樣本的所有非實體或者類型非 的實體的首尾集合,注意我們只需要考慮 的組合,即:

而在解碼階段,所有滿足 的片段 都被視為類型為 的實體輸出??梢?#xff0c;解碼過程是及其簡單的,并且在充分并行下解碼效率就是 !

2.2 評價指標

對于 NER 來說,常見的評價指標就是 F1,注意是實體級別的 F1,并非標注標簽級別的 F1。在傳統的 Pointer Network 或者 CRF 的設計下,我們并不容易在訓練過程中直接計算實體級別的 F1,但是在 GlobalPointer 的設計下,不管是計算實體級別的 F1 還是 accuracy 都是很容易的,比如 F1 的計算如下:

def?global_pointer_f1_score(y_true,?y_pred):"""給GlobalPointer設計的F1"""y_pred?=?K.cast(K.greater(y_pred,?0),?K.floatx())return?2?*?K.sum(y_true?*?y_pred)?/?K.sum(y_true?+?y_pred)

能有這么簡單,主要就是因為 GlobalPointer 的“Global”,它的 y_true 和? y_pred 本身就已經是實體級別了,通過 y_pred > 0 我們就可以知道哪些實體被抽取出來的,然后做個匹配就可以算出各種(實體級別的)指標,達到了訓練、評估、預測的一致性。

2.3 優化F1值

GlobalPointer 的“Global”還有一個好處,就是如果我們用它來做閱讀理解的話,它可以直接優化閱讀理解的 F1 指標!閱讀理解的 F1 跟 NER 的 F1 有所不同,它是答案的一個模糊匹配程度,直接優化 F1 可能更有利于提高閱讀理解的最終得分。將 GlobalPointer 用于閱讀理解,相當于就只有一種實體類型的 NER,此時我們定義:

而有了 p(i,j) 之后,用強化學習的思想(參考殊途同歸的策略梯度與零階優化),優化 F1 就是以下述函數為損失:

這里的 就是提前算好的片段 與標準答案之間的 F1 相似度, 是一個超參數。當然,算出所有的 成本可能會有點大,但它是一次性的,而且可以在計算時做些策略(比如首尾差別過大就直接置零),總的來說,可以控制在能接受的范圍。如果為了提高閱讀理解最終的 F1,這是一種比較直接的可以嘗試的方案。(筆者在今年的百度 lic2021 閱讀理解賽道上嘗試過,確實能有一定的效果。)

實驗結果

現在一切準備就緒,馬上就能夠開始實驗了,實驗代碼整理如下:

開源地址:https://github.com/bojone/GlobalPointer

目前 GlobalPointer 已經內置在 bert4keras>=0.10.6 中,bert4keras 的用戶可以直接升級 bert4keras 使用。實驗的三個任務均為中文 NER 任務,前兩個為非嵌套 NER,第三個為嵌套 NER,它們的訓練集文本長度統計信息為:

3.1 人民日報

首先,我們驗證一下在非嵌套場景 GlobalPointer 能否取代 CRF,語料是經典的人民日報語料,baseline 是 BERT+CRF 的組合,而對比的是? BERT+GlobalPointer 的組合,實驗結果如下:

首先,表格中帶來最大視覺沖擊力的無疑是 GlobalPointer 有無 RoPE 的差距,達到了 30 個點以上!這說明了給 GlobalPointer 顯式加入相對位置信息的重要性,后面的實驗中我們將不再驗證去掉 RoPE 的版本,默認都加上 RoPE。

從表格中還可以看出,在經典的非嵌套 NER 任務中,效果上 GlobalPointer 可以跟 CRF 相媲美,速度上 GlobalPointer 還更勝一籌,稱得上是又快又好了。

3.2 CLUENER

當然,可能因為人民日報這個經典任務的起點已經很高了,所以拉不開差距。為此,我們在測一下比較新的 CLUENER [1] 數據集,這個數據集也是非嵌套的,當前 SOTA 的 F1 是 81% 左右。BERT+CRF 與 BERT+GlobalPointer 的對比如下:

這個實驗結果說明了,當 NER 難度增加之后,哪怕只是非嵌套的場景,GlobalPointer 的效果能優于 CRF,這說明對于 NER 場景,GlobalPointer 其實比 CRF 更加好用。后面我們將對此做個簡單的理論分析,進一步說明 GlobalPointer 相比 CRF 在理論上就更加合理。

至于速度方面,由于這個任務的文本長度普遍較短,因此GlobalPointer的速度增幅也沒有那么明顯。

3.3 CMeEE

最后,我們來測一個嵌套的任務(CMeEE),它是去年 biendata 上的“中文醫學文本命名實體識別”[2] 比賽,也是今年的“中文醫療信息處理挑戰榜 CBLUE”[3] 的任務 1,簡單來說就是醫學方面的 NER,帶有一定的嵌套實體。同樣比較 CRF 和 GlobalPointer 的效果:

可以看到效果上 GlobalPointer 明顯地優于 CRF;速度方面,綜合三個任務的結果,總的來說文本越長的任務,GlobalPointer 的訓練加速就越明顯,而預測速度通常也略有提升,但幅度沒有訓練階段大。隨后筆者以 RoBERTa large 為 encoder 繼續搗鼓了一下,發現線上測試集就可以(不是太難地)達到 67% 以上,這說明 GlobalPointer 是一個“稱職”的設計了。

當然,可能有讀者會詬病:你拿非嵌套的CRF去做嵌套的 NER,這樣跟 GlobalPointer 比肯定不公平呀。確實會有點,但是問題不大,一方面 CMeEE 目前的 F1 還比較低,嵌套的實體本來就不多,哪怕去掉嵌套部分當成非嵌套的來做,影響也不會太大;另一方面就是在嵌套 NER 方面,筆者還沒發現比較簡單明快的設計可以作為 baseline 跑跑的,所以就還是先跑個 CRF 看看了。歡迎讀者報告其他設計的對比結果。

思考拓展

在本節中,我們將進一步對 CRF 和 GlobalPointer 做一個理論上的對比,并且介紹一些與 GlobalPointer 相關的工作,以方便讀者更好地理解和定位 GlobalPointer。

4.1 相比CRF

CRF(條件隨機場,Conditional Random Field)是序列標注的經典設計,由于大多數 NER 也能轉化為序列標注問題,所以 CRF 也算是 NER 的經典方法,筆者也曾撰寫過簡明條件隨機場 CRF 介紹(附帶純 Keras 實現)和你的 CRF 層的學習率可能不夠大等文章來介紹 CRF。在之前的介紹中,我們介紹過,如果序列標注的標簽數為 k,那么逐幀 softmax 和 CRF 的區別在于:

前者將序列標注看成是 n 個 k 分類問題,后者將序列標注看成是 1 個 分類問題。

這句話事實上也說明了逐幀 softmax 和 CRF 用于 NER 時的理論上的缺點。怎么理解呢?逐幀 softmax 將序列標注看成是 n 個 k 分類問題,那是過于寬松了,因為某個位置上的標注標簽預測對了,不代表實體就能正確抽取出來了,起碼有一個片段的標簽都對了才算對;

相反,CRF 將序列標注看成是 1 個 分類問題,則又過于嚴格了,因為這意味著它要求所有實體都預測正確才算對,只對部分實體也不給分。雖然實際使用中我們用 CRF 也能出現部分正確的預測結果,但那只能說明模型本身的泛化能力好,CRF 本身的設計確實包含了“全對才給分”的意思。

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

4.2 相關工作

如果讀者比較關注實體識別、信息抽取的進展,那么應該可以發現, GlobalPointer 與前段時間的關系抽取新設計 TPLinker [4] 很相似。但事實上,這種全局歸一化的思想,還可以追溯到更遠。

對于筆者來說,第一次了解到這種思想,是在百度 2017 年發表的一篇《Globally Normalized Reader》[5] ,里邊提出了一種用于閱讀理解的全局歸一化設計(GNR),里邊不單單將(首, 尾)視為一個整體了,而是(句子, 首, 尾)視為一個整體(它是按照先選句子,然后在句子中選首尾的流程,所以多了一個句子維度),這樣一來組合數就非常多了,因此它還用了《Sequence-to-Sequence Learning as Beam-Search Optimization》[6] 里邊的思路來降低計算量。

有了 GNR 作鋪墊,其實 GlobalPointer 就很容易可以想到的,事實上早在前年筆者在做 LIC2019 的關系抽取賽道的時候,類似的想法就已經有了,但是當時還有幾個問題沒有解決。

第一,當時 Transformer 還沒有流行起來,總覺得 的復雜度很可怕;第二,當時將“softmax+交叉熵”推廣到多標簽分類問題也還沒想出來,所以多標簽分類的不均衡問題沒有很好的解決方案;第三,當時筆者對 NLP 各方面的理解也還淺,bert4keras 也沒開發,一旦實驗起來束手束腳的,出現問題也不知道往哪里調(比如開始沒加上 RoPE,降低了 30 個點以上,如果是兩年前,我肯定沒啥調優方案了)。

所以,GlobalPointer 算是這兩年來筆者經過各方面積累后的一個有點“巧合”但又有點“水到渠成”的工作。至于 TPLinker,它還真跟 GlobalPointer 起源沒什么直接聯系。當然,在形式上 GlobalPointer 確實跟 TPLinker 很相似,事實上 TPLinker 還可以追溯到更早的《Joint entity recognition and relation extraction as a multi-head selection problem》[7] ,只不過這系列文章都主要是把這種 Global 的思想用于關系抽取了,沒有專門針對 NER 優化。

4.3 加性乘性

在具體實現上,TPLinker 與 GlobalPointer 的一個主要區別是在 Multi-Head 上 TPLinker 用的是加性 Attention:

目前尚不清楚該選擇與式(1)的效果差異有多大,但是相比式(1)的乘性 Attention,雖然它們的理論復雜度相似,但實際實現上這種加性 Attention 的計算成本會大很多,尤其是空間成本(顯存)會大很多~

所以筆者認為,就算加性效果確實比乘性好一些,也應該選擇在乘性的基礎上繼續優化才行,因為加性的效率確實不行啊。此外,TPLinker 等文章也沒有像本文一樣報告過相對位置信息的重要性,難道在加性 Attention 中相對位置不那么重要了?這些暫時還不得而知。

本文小結

本文介紹了一種 NER 的新設計 GlobalPointer,它基于全局指針的思想,融合了筆者之前的一些研究結果,實現了用統一的方式處理嵌套和非嵌套 NER 的“理想設計”。實驗結果顯示,在非嵌套的情形下它能取得媲美 CRF 的效果,而在嵌套情形它也有不錯的效果。

參考文獻

[1] https://github.com/CLUEbenchmark/CLUENER2020

[2] https://www.biendata.xyz/competition/chip_2020_1/

[3] https://tianchi.aliyun.com/dataset/dataDetail?dataId=95414

[4] https://arxiv.org/abs/2010.13415

[5] https://arxiv.org/abs/1709.02828

[6] https://arxiv.org/abs/1606.02960

[7] https://www.sciencedirect.com/science/article/abs/pii/S095741741830455X

更多閱讀

#投 稿?通 道#

?讓你的論文被更多人看到?

如何才能讓更多的優質內容以更短路徑到達讀者群體,縮短讀者尋找優質內容的成本呢?答案就是:你不認識的人。

總有一些你不認識的人,知道你想知道的東西。PaperWeekly 或許可以成為一座橋梁,促使不同背景、不同方向的學者和學術靈感相互碰撞,迸發出更多的可能性。?

PaperWeekly 鼓勵高校實驗室或個人,在我們的平臺上分享各類優質內容,可以是最新論文解讀,也可以是學習心得技術干貨。我們的目的只有一個,讓知識真正流動起來。

?????來稿標準:

? 稿件確系個人原創作品,來稿需注明作者個人信息(姓名+學校/工作單位+學歷/職位+研究方向)?

? 如果文章并非首發,請在投稿時提醒并附上所有已發布鏈接?

? PaperWeekly 默認每篇文章都是首發,均會添加“原創”標志

?????投稿郵箱:

? 投稿郵箱:hr@paperweekly.site?

? 所有文章配圖,請單獨在附件中發送?

? 請留下即時聯系方式(微信或手機),以便我們在編輯發布時和作者溝通

????

現在,在「知乎」也能找到我們了

進入知乎首頁搜索「PaperWeekly」

點擊「關注」訂閱我們的專欄吧

關于PaperWeekly

PaperWeekly 是一個推薦、解讀、討論、報道人工智能前沿論文成果的學術平臺。如果你研究或從事 AI 領域,歡迎在公眾號后臺點擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的GlobalPointer:用统一的方式处理嵌套和非嵌套NER的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。