工業界求解NER問題的12條黃金法則

星標/置頂小屋,帶你解鎖

最萌最前沿的NLP、搜索與推薦技術

文 | JayLou婁傑,夕小瑤

編 |  可鹽可甜兔子醬

美 | Sonata


衆所周知,命名實體識別(Named Entity Recognition,NER)是一項基礎而又重要的NLP詞法分析任務,也往往作爲信息抽取、問答系統、機器翻譯等方向的或顯式或隱式的基礎任務。在很多人眼裏,NER似乎只是一個書本概念,跟句法分析一樣存在感不強。一方面是因爲深度學習在NLP領域遍地開花,使得智能問答等曾經複雜的NLP任務,變得可以端到端學習,於是分詞、詞性分析、NER、句法分析等曾經的顯式任務都隱式地編碼到了大型神經網絡的參數中;另一方面,深度學習流行之後,NER問題相比之前有了比較長足的進步,LSTM+CRF的模式基本成爲業內標配,很多人認爲“這個事情應該差不多了”。

但!是!

真正在工業界解決NLP業務問題的NLPer,往往發現事情遠沒法這樣輕描淡寫。在真實的工業界場景中,通常面臨標註成本昂貴泛化遷移能力不足可解釋性不強計算資源受限等問題,想要將NER完美落(bian)地(xian)可不簡單,那些在經典benchmark上自稱做到SOTA的方法放在現實場景中往往“也就那樣”。以醫療領域爲例:

  1. 不同醫院、不同疾病、不同科室的文本描述形式不一致,而標註成本又很昂貴,一個通用的NER系統往往不具備“想象中”的泛化遷移能力。當前的NER技術在醫療領域並不適合做成泛化的工具

  2. 由於醫療領域的嚴肅性,我們既要知其然、更要知其所以然:NER系統往往不能採用“一竿子插到底”的黑箱算法,處理過程應該隨着處理對象的層次和深度而逐步疊加模塊,下級模塊使用上級結果,方便進行迭代優化、並具備可解釋性,這樣做可解耦醫學事件、便於進行醫學實體消歧。

  3. 僅僅使用統計模型的NER系統往往不是萬能的,醫療領域相關的實體詞典和特徵挖掘對NER性能也起着關鍵作用。此外,NER結果往往不能直接使用,還需進行醫學術語標準化。

  4. 由於醫院數據不可出院,需要在院內部署NER系統。而通常醫院內部的GPU計算資源又不是很充足(成本問題),我們需要讓機器學習模型又輕又快(BERT上不動哇),同時要更充分的利用顯存。

以上種種困難,導致了工業界場景求解NER問題時都難以做到BERT finetune一把就能把問題解決,總之

那些口口聲聲遇事不決上BERT的人們,應該像我一樣,看着你們在NER問題上翻車

幾天前,賣萌屋的自然語言處理討論羣內就命名實體識別問題進行了一番激烈的討論,由於討論持續了接近2小時,這裏就不貼詳細過程了(省略8k字)。

經過一番激烈的辯論,最後賣萌屋的作者傑神(JayLou婁傑)就討論中出現的若干問題給出了工業界視角下的實戰建議(每一條都是實打實的實戰經驗哇)。

傑神首先分享了他在醫療業務上做NER的七條經驗教訓:

  1. 提升NER性能(performance)的⽅式往往不是直接堆砌⼀個BERT+CRF,這樣做不僅性能不一定會好,推斷速度也非常堪憂;就算直接使用BERT+CRF進行finetune,BERT和CRF層的學習率也不要設成一樣,讓CRF層學習率要更大一些(一般是BERT的5~10倍),要讓CRF層快速學習。

  2. 在NER任務上,也不要試圖對BERT進⾏蒸餾壓縮,很可能喫⼒不討好。

  3. NER任務是⼀個重底層的任務,上層模型再深、性能提升往往也是有限的(甚至是下降的);因此,不要盲目搭建很深的網絡,也不要癡迷於各種attention了。

  4. NER任務不同的解碼方式(CRF/指針網絡/Biaffine[1])之間的差異其實也是有限的,不要過分拘泥於解碼⽅式。

  5. 通過QA閱讀理解的方式進行NER任務,效果也許會提升,但計算複雜度上來了,你需要對同⼀⽂本進行多次編碼(對同⼀文本會構造多個question)。

  6. 設計NER任務時,儘量不要引入嵌套實體,不好做,這往往是一個長尾問題。

  7. 不要直接拿Transformer做NER,這是不合適的,詳細可參考TENER[2]

之後,傑神在羣裏分享了工業界中NER問題的正確打開⽅式:

非常直接的1層lstm+crf!

注:本文所說的lstm都是雙向的。

  1. 如何快速有效地提升NER性能? 如果這麼直接的打開方式導致NER性能達不到業務目標,這一點也不意外,這時候除了badcase分析,不要忘記一個快速提升的重要手段:規則+領域詞典。在垂直領域,一個不斷積累、不斷完善的實體詞典對NER性能的提升是穩健的,基於規則+詞典也可以快速應急處理一些badcase;對於通⽤領域,可以多種分詞工具和多種句法短語⼯具進行融合來提取候選實體,並結合詞典進行NER。此外,怎麼更好地將實體詞典融入到NER模型中,也是一個值得探索的問題(如嵌入到圖神經網絡中提取特徵[3])。

  2. 如何在模型層面提升NER性能? 如果想在模型層面(仍然是1層lstm+crf)搞點事情,上文講過NER是一個重底層的任務,我們應該集中精力在embedding層下功夫,引入豐富的特徵:比如char、bigram、詞典特徵、詞性特徵、elmo等等,還有更多業務相關的特徵;在垂直領域,如果可以預訓練一個領域相關的字向量&語言模型,那是最好不過的了~總之,底層的特徵越豐富、差異化越大越好(構造不同視角下的特徵)。

  3. 如何構建引入詞彙信息(詞向量)的NER? 我們知道中文NER通常是基於字符進行標註的,這是由於基於詞彙標註存在分詞誤差問題。但詞彙邊界對於實體邊界是很有用的,我們該怎麼把蘊藏詞彙信息的詞向量“恰當”地引入到模型中呢?一種行之有效的方法就是信息無損的、引入詞彙信息的NER方法,我稱之爲詞彙增強,可參考《中文NER的正確打開方式:詞彙增強方法總結》[4]。ACL2020的Simple-Lexicon[5]和FLAT[6]兩篇論文,不僅詞彙增強模型十分輕量、而且可以比肩BERT的效果。

將詞向量引入到模型中,一種簡單粗暴的做法就是將詞向量對齊到相應的字符,然後將字詞向量進行混合,但這需要對原始文本進行分詞(存在誤差),性能提升通常是有限的。

  1. 如何解決NER實體span過長的問題? 如果NER任務中某一類實體span比較長(⽐如醫療NER中的⼿術名稱是很長的),直接採取CRF解碼可能會導致很多連續的實體span斷裂。除了加入規則進行修正外,這時候也可嘗試引入指針網絡+CRF構建多任務學習(指針網絡會更容易捕捉較長的span,不過指針網絡的收斂是較慢的,可以試着調節學習率)。

  2. 如何客觀看待BERT在NER中的作用? 對於工業場景中的絕大部分NLP問題(特別是垂直領域),都沒有必要堆資源。但這絕不代表BERT是“一無是處”的,在不受計算資源限制、通用領域、小樣本的場景下,BERT表現會更好。我們要更好地去利用BERT的優勢:
    a. 在低耗時場景中,BERT可以作爲一個“對標競品”,我們可以採取輕量化的多種策略組合去逼近甚至超越BERT的性能;
    b. 在垂直領域應用BERT時,我們首先確認領域內的語料與BERT原始的預訓練語料之間是否存在gap,如果這個gap越大,那麼我們就不要停止預訓練:繼續進行領域預訓練、任務預訓練。
    c. 在小樣本條件下,利用BERT可以更好幫助我們解決低資源問題:比如基於BERT等預訓練模型的文本增強技術[7],又比如與主動學習、半監督學習、領域自適應結合(後續詳細介紹)。
    d. 在競賽任務中,可以選取不同的預訓練語⾔模型在底層進行特徵拼接。具體地,我們可以將char、bigram和BERT、XLNet等一起拼接喂入1層lstm+crf中。語⾔模型的差異越⼤,效果越好。如果需要對語言模型finetune,需要設置不同的學習率。

  3. 如何冷啓動NER任務? 如果⾯臨的是⼀個冷啓動的NER任務,業務問題定義好後,首先要做的就是維護好一個領域詞典,而不是急忙去標數據、跑模型;當基於規則+詞典的NER系統不能夠滿足業務需求時,才需要啓動人工標註數據、構造機器學習模型。當然,我們可以採取一些省成本的標註方式,如結合領域化的預訓練語言模型+主動學習,挖掘那些“不確定性高”、並且“具備代表性”的高價值樣本(需要注意的是,由於NER通常轉化爲一個序列標註任務,不同於傳統的分類任務,我們需要設計一個專門針對序列標註的主動學習框架)。

  4. 如何有效解決低資源NER問題? 如果拿到的NER標註數據還是不夠,又不想標註人員介入,這確實是一個比較困難的問題。低資源NLP問題的解決方法通常都針對分類任務,這相對容易一些,如可以採取文本增強、半監督學習等方式,詳情可參考 《如何解決NLP中的少樣本困境》 。而這些解決低資源NLP問題的方法,往往在NER中提升並不明顯。NER本質是基於token的分類任務,其對噪聲極其敏感的。如果盲目應用弱監督方法去解決低資源NER問題,可能會導致全局性的性能下降,甚至還不如直接基於詞典的NER。這裏給出一些可以嘗試的解決思路(也許還會翻車):
    a. 上文已介紹BERT在低資源條件下能更好地發揮作用:我們可以使用BERT進行數據蒸餾(半監督學習+置信度選擇),同時利用實體詞典輔助標註。
    b. 還可以利用實體詞典+BERT相結合,進行半監督自訓練,具體可參考文獻[8]
    c. 工業界畢竟不是搞學術,要想更好地解決低資源NER問題,RD在必要時還是要介入覈查的。

  5. 如何緩解NER標註數據的噪聲問題? 實際工作中,我們常常會遇到NER數據可能存在標註質量問題,也許是標註規範就不合理(一定要提前評估風險,不然就白乾了),正常的情況下只是存在一些小規模的噪聲。一種簡單地有效的方式就是對訓練集進行交叉驗證,然後人工去清洗這些“髒數據”。當然也可以將noisy label learning應用於NER任務,懲罰那些噪音大的樣本loss權重,具體可參考文獻[9]

  6. 如何克服NER中的類別不平衡問題? NER任務中,常常會出現某個類別下的實體個數稀少的問題,而常規的解決方法無外乎是重採樣、loss懲罰、Dice loss[10]等等。而在醫療NER中,我們常常會發現這類實體本身就是一個長尾實體(填充率低),如果能挖掘相關規則模板、構建詞典庫也許會比模型更加魯棒。

  7. 如何對NER任務進行領域遷移? 在醫療領域,我們希望NER模型能夠在不同醫院、不同疾病間進行更好地泛化遷移(領域自適應:源域標註數據多,目標域標註數據較少),如可以嘗試將特徵對抗遷移[11]。在具體實踐中,對抗&特徵遷移通常還不如直接採取finetune方式(對源域進行預訓練,在目標域finetune),特別是在後BERT時代。在醫療領域,泛化遷移問題並不是一個容易解決的問題,試圖去將NER做成一個泛化工具往往是困難的。或許我們更應該從業務角度出發去將NER定製化,而不是拘泥於技術導致無法落地。

  8. 如何讓NER系統變得“透明”且健壯? 一個好的NER系統並不是“一竿子插到底”的黑箱算法。在醫療領域,實體類型衆多,我們往往需要構建一套多層級、多粒度、多策略的NER系統。
    a. 多層級的NER系統更加“透明”,可以回溯實體的來源(利於醫學實體消歧),方便“可插拔”地迭代優化;同時也不需要構建數目衆多的實體類型,讓模型“喫不消”。
    b. 多粒度的NER系統可以提高準召。第⼀步抽取⽐較粗粒度的實體,通過模型+規則+詞典等多策略保證⾼召回;第⼆步進⾏細粒度的實體分類,通過模型+規則保證⾼準確。

  9. 如何解決低耗時場景下的NER任務? 從模型層面來看,1層lstm+CRF已經夠快了。從系統層面來看,重點應放在如何在多層級的NER系統中進行顯存調度、或者使當前層級的顯存佔用最大化等。

綜上,如果能在1層lstm+CRF的基礎上引入更豐富的embedding特徵、並進行多策略組合,足以解決垂直領域的NER問題;此外,我們要更好地利用BERT、使其價值最大化;要更加穩妥地解決複雜NER問題(詞彙增強、冷啓動、低資源、噪聲、不平衡、領域遷移、可解釋、低耗時)。

除了上面的12條工業界實戰經驗,羣內的一個小夥伴@一一 還提出了一個實際場景經常遇到的問題:

lstm+crf做實體提取時,保證精度的情況下,在提升模型速度上有沒有什麼好的辦法或者建議?

傑神同樣給予了一個飽含實戰經驗的回答:

個⼈經驗來說,1層lstm+CRF夠快了。

  1. 如果覺得lstm會慢,換成cnn或transformer也許更快一些,不過效果好不好要具體分析;通常來說,lstm對於NER任務的⽅向性和局部特徵捕捉會好於別的編碼器。

  2. 如果覺得crf的解碼速度慢,引入label attention機制把crf拿掉,比如LAN這篇論文[12];當然可以⽤指針網絡替換crf,不過指針網絡收斂慢⼀些。

  3. 如果想進行模型壓縮,比如對lstm+crf做量化剪枝也是⼀個需要權衡的⼯作,有可能費力不討好~

可以看出,哪怕是命名實體識別,中文分詞甚至文本分類這些看似已經在公開數據集上被求解的任務,放在實際的工業界場景下都可能存在大量的挑戰。這也是提醒還未踏入工業界的小夥伴們,不僅要刷paper追前沿,更要記得積極實踐,在實際問題中積累NLP煉丹技巧哦。


喜歡本文的小夥伴,強烈建議加入賣萌屋的知識圖譜與信息抽取垂類討論羣,不僅可以認識衆多志同道合的優秀小夥伴,而且還有若干賣萌屋美麗小姐姐(劃掉)、頂會審稿人、大廠研究員、知乎大V等你來撩哦。

如果提示已滿或過期,或希望加入領域大羣(自然語言處理、搜索技術、推薦系統、算法崗求職等)或其他垂類討論羣,請在後臺回覆關鍵詞【入羣】獲取入口哦。

記得掃描下方二維碼關注並星標置頂,我才能來到你面前哦。

夕小瑤的賣萌屋

_

關注&星標小夕,帶你解鎖AI祕籍

訂閱號主頁下方「撩一下」有驚喜哦

參考文獻

[1] Named Entity Recognition as Dependency Parsing: https://arxiv.org/pdf/2005.07150.pdf
[2] TENER: Adapting Transformer Encoder for Named Entity Recognition: https://arxiv.org/abs/1911.04474
[3] A Neural Multi-digraph Model for Chinese NER with Gazetteers: https://www.aclweb.org/anthology/P19-1141.pdf
[4] 中文NER的正確打開方式:詞彙增強方法總結: https://zhuanlan.zhihu.com/p/142615620
[5] Simplify the Usage of Lexicon in Chinese NER: https://arxiv.org/abs/1908.05969v1
[6] FLAT: Chinese NER Using Flat-Lattice Transformer: https://arxiv.org/pdf/2004.11795
[7] Data Augmentation using Pre-trained Transformer Models: https://www.groundai.com/project/data-augmentation-using-pre-trained-transformer-models/1
[8] Better Modeling of Incomplete Annotations for Named Entity Recognition: https://www.aclweb.org/anthology/N19-1079/
[9] CrossWeigh: Training Named Entity Tagger from Imperfect Annotations: https://www.aclweb.org/anthology/D19-1519.pdf
[10] Dice Loss for Data-imbalanced NLP Tasks: https://arxiv.org/pdf/1911.02855.pdf
[11] Label-aware Double Transfer Learning for Cross-Specialty Medical Named Entity Recognition: https://www.aclweb.org/anthology/N18-1001/
[12] Hierarchically-Refined Label Attention Network for Sequence Labeling: https://www.aclweb.org/anthology/D19-1422.pdf

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章