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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

中文NER任务实验小结:BERT-MRC的再优化

發布時間:2024/10/8 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 中文NER任务实验小结:BERT-MRC的再优化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


?作者 | 邱震宇

單位 | 華泰證券算法工程師

研究方向 | NLP方向

前言

熟悉我的讀者,應該看過我之前寫過的一篇關于中文 NER 任務實踐的文章(邱震宇:中文 NER 任務實驗小結報告——深入模型實現細節 [1],在那篇文章中,我介紹了一個做 NER 任務的新范式:將實體抽取任務轉化為抽取式閱讀理解任務。

其核心思想就是將待抽取的實體標簽描述作為 query 與原始的文本進行拼接,然后基于 BERT 做對應 span 的抽取。通過這種方式能夠讓模型學習到實體標簽本身的語義信息,引入先驗知識,從而提升模型的能力。在我之后的實現中,也進一步驗證了這個方法的有效性。但我嘗試將這個方法應用到實際場景任務時,卻遇到了很多限制。

其中,影響最大的就是在線預測的效率。在實際場景中,我們的實體或者其他序列標注要素的標簽類型通常會有很多(假定有 |C| 個),這意味著我們要將每個待預測的文本與 |C| 個標簽 query 模板進行拼接得到模型輸入,并需要調用 |C| 次模型的前向計算才能完成一個樣本的抽取。假設 query 的最長文本長度為 n,原始文本的文本長度為 m,由于進行了 self-attention 的計算,整個計算的復雜度為 ,這樣的在線預測效率是無法滿足線上的需求的。

針對這個問題,我嘗試了一些優化方法,但是都不太理想,最近終于在一篇? EMNLP2021 的論文中找到了比較好的方案,論文如下:Enhanced Language Representation with Label Knowledge forSpan Extraction [2]。這篇論文提出了一個?LEAR(Label knowledge EnhAnced Representation)模型架構,嘗試優化 BERT-MRC 的一些缺陷,下面我將詳細給大家描述這個方法,并對其進行有效性的驗證。

本文涉及源碼:

https://github.com/qiufengyuyi/lear_ner_extraction

LEAR原理

2.1 BERT-MRC的缺陷

首先,論文提到了之前使用 BERT-MRC 的方式做序列標注問題,雖然相比傳統的 BERT-CRF 方法有一定的效果提升,但是仍然有兩個缺陷。其中一個就是前言中提到的效率問題。另外一個則是 BERT-MRC 并沒有充分利用標簽的知識信息。前言中提到,BERT-MRC 引入了標簽的先驗知識,然而 LEAR 論文中通過對 attention 部分進行可視化分析,發現模型可能沒怎么用到 query 的信息。如圖 1 所示,實體 judge 對應的高分 attention 并非如預期一樣集中在問題的核心部分,而是分散在了一些無關的信息中(如 [CLS] 等 token)。

▲?圖1 attention 可視化

通過上述分析,可以發現 BERT-MRC 對于先驗知識的利用率并不如預期。因此,LEAR 設計了一種新的標簽知識整合方式,讓模型高效利用標簽先驗知識,同時解決 BERT-MRC 的效率和知識利用率問題。

2.2 LEAR模型架構

LEAR 的模型架構如圖 2 所示。

▲?圖2 LEAR 模型

其中,模型的輸入分為兩部分:原始的待抽取文本以及所有標簽對應的描述文本(先驗知識)。與 BERT-MRC 不同,我們不會將標簽描述文本與原始文本進行拼接,而是使用 BERT 的編碼器分別進行編碼得到不同的文本表示。

值得注意的是,為了提升訓練效率和減小模型的尺寸,原始文本和標簽描述文本共享 BERT 的編碼器權重;之后我們引入一個標簽知識融合模塊,將所有標簽描述文本的表示融合到原始文本中;最后我們使用引入分類器來識別待抽取 span 的 start 和 end 位置的概率分布,并使用一些 decoding 策略來抽取實體。下面,我將詳細描述融合模塊和分類模塊的具體內容。

標簽信息融合模塊

假設我們通過 BERT 編碼器得到了原始文本的表示 以及所有標簽的描述文本表示 ,其中 n 表示原始文本的長度,m 為標簽文本的統一長度(經過 padding 之后),|C| 表示標簽類別數量,d 表示 hidden_size。標簽信息融合模塊本質上是一個注意力機制模塊,其目的就是要讓模型學習到原始文本中的各個 token 會關注到標簽描述文本中的哪些內容。

對每個標簽 c,我們將 視作 attention 計算中的 key 和 value 元素,將 作為 attention 中的 query 元素(關于 attention 中的Q、K、V 可以參考我以前的 attention 文章介紹 Attention 機制簡單總結 [3],進行點乘模式的 attention 計算并得到 attention 分數。在做點乘計算之前,我們參考 attention 典型的做法分別對原始文本表示和標簽描述文本表示進行線性映射:

然后我們對其進行 attention 計算:

接下來就是對 value 元素應用所得到的 attention 分數進行加權求和操作,得到原始文本某個 token ?的 context 信息(這里在實現時要使用標簽描述文本的 mask 信息,把 padding 位置的值 mask 掉):

我們接下來要做的就是將 context 信息融合到原始文本向量表示中。論文使用的方式是直接用 ADD 操作,將 與 context 相加:

我嘗試過 concat 拼接融合,最后發現效果并不如直接 add。在此架構下,add 操作的融合有更高的信息利用率。

之后,我們引入一個 dense layer,將最終的文本表達輸出,其中激活函數使用了 tanh,相比 sigmoid,其值域更廣,而且防止向量表示的絕對值過大:

最后,我們對每個文本 token、標簽類別都進行上述流程,最終得到完整的融合向量表示:。

在模型實現時,所有標簽類別和所有 token 的計算可以在一次矩陣的計算中完成。

span抽取分類模塊

與 BERT-MRC 類似,LEAR 最后也是預測某個 span 的 start 和 end 的位置 token。但由于 LEAR 中將所有標簽類別的預測都放在的一次前向計算中,因此最后的分類層與傳統的方式有所不同。對于某個原文文本的 token ,我們計算其作為某類實體的 start 概率分布:

其中, 和 分別是可訓練的權重,而 ? 表示 element-wise的矩陣乘法,而 表示對輸入矩陣中的 hidden_size 所在維度進行求和,最終得到一個 |C| 維的向量。

雖然上面的公式看起來還是有點繞,但實現起來也不是很復雜,在 TensorFlow 的框架下,可以這么實現:

def?classifier_layers(self,input_features,type="start"):#input?features#?batch_size,input_seq_len,num_labels,hidden_size#?input_shape?=?modeling.get_shape_list(input_features)#?batch_size?=?input_shape[0]#?seq_length?=?input_shape[1]classifer_weight?=?tf.get_variable(name="classifier_weight"+"_"+type,shape=[self.num_labels,?self.attention_size],initializer=modeling.create_initializer(self.bert_config.initializer_range))classifer_bias?=?tf.get_variable(name="classifier_bias"+"_"+type,shape=[self.attention_size],initializer=tf.constant_initializer(0))output?=?tf.multiply(input_features,classifer_weight)output?+=?classifer_bias#[batch_size,?input_seq_len,?num_labels]output?=?tf.reduce_sum(output,axis=-1)return?output

其中 tf.multiply 是一個 element-wise 矩陣乘法,且支持 broadcasting 機制。

2.3 span decoding

對于某類實體的 end 概率計算,與 start 的流程是一樣的。最后每個樣本將得到兩個概率輸出:, 。根據這兩個輸出與預先設計的概率閾值(一般是 0.5),我們就能一次性得到所有標簽類別的起始位置列表,但是要得到具體的 span 實體,還需要設計一些 decoding 策略。

論文中提出了兩種 decoding 策略,分別為最近距離策略啟發式策略。最近距離策略就是先定位所有的 start 位置,然后找距離 start 位置最近的 token 作為 end。而啟發式策略則稍微復雜一些,若定位到一個 start1 位置,不會馬上決定它作為一個 span 的起始位置,若后面的 token 如果也是一個候選的 start2,且其概率還要大于 start1,則會選擇新的 start2 作為 start 候選。具體大家可以參考論文后面的附錄,有詳細的算法流程。

說實話,我感覺論文中附錄的算法偽代碼有些問題,對于 end 位置的判斷應該不需要像 start 一樣選擇概率最高的。另外,我自己的訓練數據預處理時,對于單字成實體的情況,我的 end 位置是置為 0 的,而論文和開源代碼中的設置卻不同,因此不好做直接對比。

我自己實現時,使用的是變種的最近距離策略。因為選擇與 start 最近的 end 時,有可能會越過下一個新的 start 位置,這有可能是算法本身預測有問題,或者有實體嵌套的情況(目前還未考慮嵌套實體的 case),如圖 3 所示。

▲ 圖3 最近距離decoding策略

我這邊采取了比較簡單的策略,就是在 start1 和 start2 的區間中,來定位與 start1 最近的 end 位置。那么上圖中的情況下,就不會選擇 s1-e1 作為結果,而是只選擇 s1 位置處的單個 token 作為結果輸出:

▲ 圖4 自定義的最近距離decoding策略

大家可以自行嘗試不同的 decoding 策略,我感覺每種策略的適用場景都不一樣,需要根據實際情況來判斷。

2.4 LEAR的效率

LEAR 相對于 BERT-MRC 的最大優勢在于其較高的 inference 效率。由于 LEAR 不需要為每個原始文本構造 |C| 個新樣本,理論上 LEAR 的計算復雜度為 。可以看到,這個復雜度是遠小于 BERT-MRC 的,在后面的驗證中,我也得到了預期的效果。

LEAR實現

我最近分享的一些方法大部分都經過實驗并驗證有效的,這次介紹的 LEAR 也不例外。論文有放出 pytorch 的源碼:https://github.com/ Akeepers/LEAR。我照例還是使用 tensorflow 來實現,最近重新看了下之前的 NER 框架代碼,感覺有很多地方寫的不太合理,因此我又重新開了個 repo。LEAR 的實現也不是太復雜,需要注意的地方主要有以下幾個方面:

1. 構造模型輸入時,要專門針對實體標簽的描述文本進行預處理。在做 input_fn 的時候,使用 tf.data.Dataset.from_generator 來進行 batch 數據流的構建,但是我們的標簽文本本來是沒有 batch 概念的,所有訓練樣本都只用一份標簽文本,因此在 model 方法定義中,要人為將 tf 添加的 batch 維度去掉:

if?label_token_ids.shape.ndims?==?3:label_token_ids?=?label_token_ids[0,:,:]label_token_type_ids?=?label_token_type_ids[0,:,:]label_token_masks?=?label_token_masks[0,:,:]label_token_length?=?label_token_length[0,:]label_lexicons?=?label_lexicons[0,:,:,:]

2. 原始文本和標簽文本共享 encoder 參數,這里要對 google原始的 BERT 的 modeling.py 進行修改,在模型定義的時候,添加 auto_reuse 配置,同時在調用 bert 的時候,傳入 scope="bert":

with?tf.variable_scope(scope,?default_name="bert",reuse=tf.AUTO_REUSE):

3. 論文和官方開源的代碼都沒有對 attention 計算后的分數進行 scaling。我覺得可能的原因是融合模塊中的 attention 操作只有一層, 且注意力的分數并沒有直接用于詞 softmax 的計算,而是融合到了原始文本的向量表示中,另外在最后輸出的時候使用了 tanh 進行了激活,輸出的值不會太大,因此即使不做 scale,也不會產生很嚴重的梯度消失問題,并影響后面的分類器的計算。我這邊也驗證了,加入了 scaling 之后,效果相差不多。

最后,我將 LEAR 在中文的 MSRA 的 NER 數據集上進行了驗證,同時與之前已經實現過的 BERT-MRC 進行了對比。驗證指標則是考慮了實體類型后的 micro-level 的 f1 分數,具體來說我會將實體類型字符串與實體內容拼接,做去重后,進行 exact match 匹配。最終,得到的結果大體如下:

可以看到,LEAR 的效果相比 BERT-MRC 來說有一定提升,但是不夠明顯,但是 inference 的效率卻是顯著提升了,這也是我最關注的地方,這意味著這個方法可以應用在實際的業務場景中!

彩蛋!

因為很長時間沒寫文章了,所以寫一次就盡量多包含點內容。為了獎勵讀到這邊的同學,我再奉送一段額外的 NER 優化技巧。

讀過我上一篇中文 NER 總結的同學應該記得我在那篇文章中提到嘗試在 BERT 中引入詞匯信息,當時嘗試的辦法很依賴分詞的質量,且融合詞匯信息的方式也比較簡單。因此,這次我參考了最近比較火的一篇論文來做詞匯增強:Simplify the Usage of Lexicon in Chinese NER [4]。

這篇論文解讀我就不做了,大家可以參考這篇:JayJay:中文 NER 的正確打開方式: 詞匯增強方法總結(從 Lattice LSTM 到 FLAT)[5]。這個方法的核心思想是先準備一份詞向量和詞表,然后對當前所有語料中的文本字符統計其分別屬于 BMES 的信息,B 代表詞的開頭,M 代表詞的中間,E 代表詞的結束,S 代表單獨成詞。

假設對于某個 token x,若某個樣本 A 中存在片段 span,其開頭為 x,則將 span 對應的詞向量添加到 B 對應的列表中,其他類型同樣操作。最后,我們將每個類型中的詞向量做加權平均,得到增加的詞匯信息與原始的 token 向量表示拼接。

▲ 圖5 詞匯增強方法

這個方法實現的最大難點在于如何快速找到包含某個字符,且符合特定位置關系的 span 詞。原論文開放了代碼:

https://github.com/v-mipeng/LexiconAugmentedNER?

其使用了 trie 數來構建詞典樹,這也是海量字符串匹配場景中會使用的一種方法。我在實現的時候,沒有用這種方式,為了快速得到效果,使用了一種比較基礎的方式,就是在數據預處理的時候,將每個字符對應的 BMES 的詞列表信息都預先存儲起來,在模型輸入的時候直接讀取信息,這樣做速度不慢,但是對內存的要求就比價高了,類似于空間換時間。

另外,在使用 tensorflow 實現完整的功能時,我發現坑有點多。因為靜態圖中,你要將每個字符的 BMES 詞表序列作為輸入傳到模型圖中,然后用 embedding_lookup 分別找到詞對應的詞向量,再做加權平均,而每個字符實際的 BMES 詞表 size 都不一樣,這意味著更多 padding 和 mask 的處理,想想都頭大。。。所以我偷了個懶,不讓詞匯增強部分參與訓練而是將其作為固定的向量表示與原始 token 向量拼接,看其是否仍有增益的效果,結果居然也有一定的增益,結合 LEAR 架構,我得到了如下的結果:

TIPS:我在構建詞表的時候,為了提高速度,將出現頻率小于 5 的詞都過濾掉了。

可以看到增加了詞匯增強信息后,LEAR 的效果有一定的提升。如果對這個方法感興趣,可以嘗試實現完整功能的增強,讓增強信息也參與到模型學習中,最后應該會有很大的提升。

小結

本文主要介紹了一種優化 BERT-MRC 的方法,針對其預測效率低、沒有充分利用標簽信息的兩個缺陷,設計了一種專門針對標簽文本的注意力機制融合方法,在提升模型效果的同時,大大提升了基于 MRC 做 NER 的效率,使其能夠應用在實際的業務場景中。另外,本文也額外介紹了一種不依賴于分詞工具的詞匯增強方法,經過驗證,證明其與其他 BERT 類的方法結合能夠提升模型的抽取效果。

參考文獻

[1] https://zhuanlan.zhihu.com/p/103779616

[2] https://aclanthology.org/2021.emnlp-main.379.pdf

[3]? https://zhuanlan.zhihu.com/p/46313756

[4] https://aclanthology.org/2020.acl-main.528.pdf

[5] https://zhuanlan.zhihu.com/p/142615620

特別鳴謝

感謝 TCCI 天橋腦科學研究院對于 PaperWeekly 的支持。TCCI 關注大腦探知、大腦功能和大腦健康。

更多閱讀

#投 稿?通 道#

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

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

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

PaperWeekly 鼓勵高校實驗室或個人,在我們的平臺上分享各類優質內容,可以是最新論文解讀,也可以是學術熱點剖析科研心得競賽經驗講解等。我們的目的只有一個,讓知識真正流動起來。

📝?稿件基本要求:

? 文章確系個人原創作品,未曾在公開渠道發表,如為其他平臺已發表或待發表的文章,請明確標注?

? 稿件建議以?markdown?格式撰寫,文中配圖以附件形式發送,要求圖片清晰,無版權問題

? PaperWeekly 尊重原作者署名權,并將為每篇被采納的原創首發稿件,提供業內具有競爭力稿酬,具體依據文章閱讀量和文章質量階梯制結算

📬?投稿通道:

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

? 來稿請備注即時聯系方式(微信),以便我們在稿件選用的第一時間聯系作者

? 您也可以直接添加小編微信(pwbot02)快速投稿,備注:姓名-投稿

△長按添加PaperWeekly小編

🔍

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

進入知乎首頁搜索「PaperWeekly」

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

·

總結

以上是生活随笔為你收集整理的中文NER任务实验小结:BERT-MRC的再优化的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 91国偷自产一区二区三区女王 | 99热这里只有精 | 日韩精品视频播放 | 在线视频资源 | 亚洲另类在线观看 | 欧美精品18videosex性欧美 | ww成人| 国产乱论视频 | 色女孩综合网 | 操欧美女人 | 丁香八月婷婷 | 青青伊人国产 | 成人网在线观看 | 亚洲精品久久久久 | 免费观看日韩毛片 | 国产日韩视频在线 | 一级黄色片免费播放 | 国产高清区 | 精品一卡二卡三卡 | 91黄址| 日韩毛片在线观看 | 色偷偷噜噜噜亚洲男人的天堂 | 环太平洋3:泰坦崛起 | 国产又粗又猛又爽又 | 亚洲一区二区三区黄色 | 成年人精品 | 美国一区二区 | 欧美日韩在线观看一区二区 | 亚洲色图25p | 美女看片 | 麻豆视频国产精品 | 国产中文字幕一区二区 | 性欧美1819性猛交 | 又粗又大又硬毛片免费看 | 日本高清视频一区 | 老妇裸体性猛交视频 | 毛片麻豆 | 欧美一区二区免费 | 国产又大又黑又粗免费视频 | 蜜桃成人在线观看 | 日本a级c片免费看三区 | 中文字幕精品视频在线 | 91av在线视频播放 | 国产高清自拍一区 | 成人av在线一区二区 | av私库| 色永久| 久久成年视频 | 少妇高潮毛片色欲ava片 | 国产成人精品片 | 色呦呦视频在线观看 | 嫩草在线看 | 美女福利在线观看 | 半推半就一ⅹ99av | 好吊妞这里有精品 | 国产swag在线观看 | 丁香激情综合 | 国产精品自产拍高潮在线观看 | 亚欧洲精品 | 亚洲av鲁丝一区二区三区 | 在线视频 91 | 国产在线观看无码免费视频 | 伊人久久大香线蕉av一区 | 波多野结衣在线观看视频 | 亚洲精品在线网站 | 国产chinese男男网站大全 | 国产精品久久午夜夜伦鲁鲁 | 第一色影院 | 久天堂 | 红桃视频黄色 | 国产 日韩 欧美 精品 | 色婷婷色综合 | 美女草逼视频 | 打开每日更新在线观看 | 欧美福利精品 | 久久久久久蜜桃一区二区 | 91精品国产91久久久久久黑人 | 日本五十肥熟交尾 | 高h调教冰块play男男双性文 | 在线观看免费国产 | 在线麻豆视频 | 午夜丁香婷婷 | 国产高清免费在线观看 | 97色网| 韩国三级bd高清中字2021 | 国产精品操| 亚洲综合在线五月 | www国产精品内射熟女 | 免费视频一区 | 又爽av| 91国产免费观看 | 午夜丰满寂寞少妇精品 | 人人妻人人玩人人澡人人爽 | 中国大陆毛片 | 毛片网站在线 | 国产精品午夜福利视频234区 | 欧日韩一区二区三区 | 黄页网站视频 | 女女h百合无遮羞羞漫画软件 |