生活随笔
收集整理的這篇文章主要介紹了
【NLP技术应用】工业界求解NER问题的12条黄金法则
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
眾所周知,命名實體識別(Named Entity Recognition,NER)是一項基礎而又重要的NLP詞法分析任務,也往往作為信息抽取、問答系統、機器翻譯等方向的或顯式或隱式的基礎任務。
在很多人眼里,NER似乎只是一個書本概念,跟句法分析一樣存在感不強。一方面是因為深度學習在NLP領域遍地開花,使得智能問答等曾經復雜的NLP任務,變得可以端到端學習,于是分詞、詞性分析、NER、句法分析等曾經的顯式任務都隱式地編碼到了大型神經網絡的參數中;另一方面,深度學習流行之后,NER問題相比之前有了比較長足的進步,LSTM+CRF的模式基本成為業內標配,很多人認為“這個事情應該差不多了”。
但!是!
?
真正在工業界解決NLP業務問題的NLPer,往往發現事情遠沒法這樣輕描淡寫。
在真實的工業界場景中,通常面臨標注成本昂貴 、泛化遷移能力不足 、可解釋性不強 、計算資源受限 等問題,想要將NER完美落(bian)地(xian)可不簡單,那些在經典benchmark上自稱做到SOTA的方法放在現實場景中往往“也就那樣”。以醫療領域為例:
不同醫院、不同疾病、不同科室的文本描述形式不一致,而標注成本又很昂貴,一個通用的NER系統往往不具備“想象中”的泛化遷移能力。當前的NER技術在醫療領域并不適合做成泛化的工具 。 由于醫療領域的嚴肅性,我們既要知其然、更要知其所以然:NER系統往往不能采用“一竿子插到底”的黑箱算法,處理過程應該隨著處理對象的層次和深度而逐步疊加模塊,下級模塊使用上級結果,方便進行迭代優化、并具備可解釋性,這樣做可解耦醫學事件、便于進行醫學實體消歧。 僅僅使用統計模型的NER系統往往不是萬能的,醫療領域相關的實體詞典和特征挖掘對NER性能也起著關鍵作用。此外,NER結果往往不能直接使用,還需進行醫學術語標準化。 由于醫院數據不可出院,需要在院內部署NER系統。而通常醫院內部的GPU計算資源又不是很充足(成本問題),我們需要讓機器學習模型又輕又快(BERT上不動哇),同時要更充分的利用顯存。
以上種種困難,導致了工業界場景求解NER問題時都難以做到BERT finetune一把就能把問題解決,總之
那些口口聲聲遇事不決上BERT的人們,應該像我一樣,看著你們在NER問題上翻車
幾天前,賣萌屋的自然語言處理討論群內就命名實體識別問題進行了一番激烈的討論,由于討論持續了接近2小時 ,這里就不貼詳細過程了(省略8k字)。
經過一番激烈的辯論,最后賣萌屋的作者杰神(JayLou婁杰)就討論中出現的若干問題給出了工業界視角下的實戰建議(每一條都是實打實的實戰經驗哇)。
杰神首先分享了他在醫療業務上做NER的七條經驗教訓:
提升NER性能(performance)的?式往往不是 直接堆砌一個BERT +CRF,這樣做不僅性能不一定會好,推斷速度也非??皯n;就算直接使用BERT+CRF進行finetune,BERT和CRF層的學習率也不要設成一樣,讓CRF層學習率要更大一些(一般是BERT的5~10倍),要讓CRF層快速學習。 在NER任務上,也不要試圖對BERT進?蒸餾壓縮,很可能吃?不討好。 NER任務是?個重底層的任務,上層模型再深、性能提升往往也是有限的(甚至是下降的);因此,不要盲目搭建很深的網絡,也不要癡迷于各種attention了。 NER任務不同的解碼方式(CRF/指針網絡/Biaffine[1])之間的差異其實也是有限的,不要過分拘泥于解碼?式。 通過QA閱讀理解的方式進行NER任務,效果也許會提升,但計算復雜度上來了,你需要對同??本進行多次編碼(對同?文本會構造多個question)。 設計NER任務時,盡量不要引入嵌套實體,不好做,這往往是一個長尾問題。 不要直接拿Transformer做NER,這是不合適的,詳細可參考TENER[2]。
之后,杰神在群里分享了工業界中NER問題的正確打開方式:
非常直接的1層lstm+crf!
注:本文所說的lstm都是雙向的。
如何快速有效地提升NER性能? ?如果這么直接的打開方式導致NER性能達不到業務目標,這一點也不意外,這時候除了badcase分析,不要忘記一個快速提升的重要手段:規則+領域詞典 。在垂直領域,一個不斷積累、不斷完善的實體詞典對NER性能的提升是穩健的,基于規則+詞典也可以快速應急處理一些badcase;對于通?領域,可以多種分詞工具和多種句法短語?具進行融合來提取候選實體,并結合詞典進行NER。此外,怎么更好地將實體詞典融入到NER模型中,也是一個值得探索的問題(如嵌入到圖神經網絡中提取特征[3])。如何在模型層面提升NER性能? ?如果想在模型層面(仍然是1層lstm+crf)搞點事情,上文講過NER是一個重底層的任務,我們應該集中精力在embedding層下功夫,引入豐富的特征 :比如char、bigram、詞典特征、詞性特征、elmo等等,還有更多業務相關的特征;在垂直領域,如果可以預訓練一個領域相關的字向量&語言模型,那是最好不過的了~總之,底層的特征越豐富、差異化越大越好(構造不同視角下的特征)。 如何構建引入詞匯信息(詞向量)的NER? ?我們知道中文NER通常是基于字符進行標注的,這是由于基于詞匯標注存在分詞誤差問題。但詞匯邊界對于實體邊界是很有用的,我們該怎么把蘊藏詞匯信息的詞向量“恰當”地引入到模型中呢?一種行之有效的方法就是信息無損的、引入詞匯信息的NER方法 ,我稱之為詞匯增強 ,可參考《中文NER的正確打開方式:詞匯增強方法總結》[4]。ACL2020的Simple-Lexicon[5]和FLAT[6]兩篇論文,不僅詞匯增強模型十分輕量、而且可以比肩BERT的效果。
將詞向量引入到模型中,一種簡單粗暴的做法就是將詞向量對齊到相應的字符,然后將字詞向量進行混合,但這需要對原始文本進行分詞(存在誤差),性能提升通常是有限的。
如何解決NER實體span過長的問題? ?如果NER任務中某一類實體span比較長(例如醫療NER中的學術名稱是很長的),直接采取CRF解碼可能會導致很多連續的實體span斷裂。除了加入規則進行修正外,這時候也可嘗試引入指針網絡+CRF 構建多任務學習 (指針網絡會更容易捕捉較長的span,不過指針網絡的收斂是較慢的,可以試著調節學習率)。如何客觀看待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,需要設置不同的學習率。如何冷啟動NER任務? ?如果?臨的是?個冷啟動的NER任務,業務問題定義好后,首先要做的就是維護好一個領域詞典,而不是急忙去標數據、跑模型;當基于規則+詞典的NER系統不能夠滿足業務需求時,才需要啟動人工標注數據、構造機器學習模型。當然,我們可以采取一些省成本的標注方式,如結合領域化的預訓練語言模型+主動學習 ,挖掘那些“不確定性高”、并且“具備代表性”的高價值樣本(需要注意的是,由于NER通常轉化為一個序列標注任務 ,不同于傳統的分類任務,我們需要設計一個專門針對序列標注的主動學習框架)。如何有效解決低資源NER問題? ?如果拿到的NER標注數據還是不夠,又不想標注人員介入,這確實是一個比較困難的問題。低資源NLP問題的解決方法通常都針對分類任務,這相對容易一些,如可以采取文本增強、半監督學習等方式,詳情可參考?《如何解決NLP中的少樣本困境》 ?。而這些解決低資源NLP問題的方法,往往在NER中提升并不明顯。NER本質是基于token的分類任務,其對噪聲極其敏感的。如果盲目應用弱監督方法去解決低資源NER問題,可能會導致全局性的性能下降,甚至還不如直接基于詞典的NER。這里給出一些可以嘗試的解決思路(也許還會翻車): a. 上文已介紹BERT在低資源條件下能更好地發揮作用:我們可以使用BERT進行數據蒸餾 (半監督學習+置信度選擇),同時利用實體詞典輔助標注。 b. 還可以利用實體詞典+BERT相結合 ,進行半監督自訓練 ,具體可參考文獻[8]。 c. 工業界畢竟不是搞學術,要想更好地解決低資源NER問題,RD在必要時還是要介入核查的。如何緩解NER標注數據的噪聲問題? ?實際工作中,我們常常會遇到NER數據可能存在標注質量問題,也許是標注規范就不合理(一定要提前評估風險,不然就白干了),正常的情況下只是存在一些小規模的噪聲。一種簡單地有效的方式就是對訓練集進行交叉驗證,然后人工去清洗這些“臟數據”。當然也可以將noisy label learning應用于NER任務,懲罰那些噪音大的樣本loss權重,具體可參考文獻[9]。如何克服NER中的類別不平衡問題? ?NER任務中,常常會出現某個類別下的實體個數稀少的問題,而常規的解決方法無外乎是重采樣、loss懲罰、Dice loss[10]等等。而在醫療NER中,我們常常會發現這類實體本身就是一個長尾實體(填充率低),如果能挖掘相關規則模板、構建詞典庫也許會比模型更加魯棒。如何對NER任務進行領域遷移? ?在醫療領域,我們希望NER模型能夠在不同醫院、不同疾病間進行更好地泛化遷移(領域自適應 :源域標注數據多,目標域標注數據較少),如可以嘗試將特征對抗遷移[11]。在具體實踐中,對抗&特征遷移通常還不如直接采取finetune方式(對源域進行預訓練,在目標域finetune),特別是在后BERT時代。在醫療領域,泛化遷移問題并不是一個容易解決的問題,試圖去將NER做成一個泛化工具往往是困難的。或許我們更應該從業務角度出發去將NER定制化,而不是拘泥于技術導致無法落地。如何讓NER系統變得“透明”且健壯? ?一個好的NER系統并不是“一竿子插到底”的黑箱算法。在醫療領域,實體類型眾多,我們往往需要構建一套多層級、多粒度、多策略 的NER系統。 a. 多層級的NER系統更加“透明”,可以回溯實體的來源(利于醫學實體消歧),方便“可插拔”地迭代優化;同時也不需要構建數目眾多的實體類型,讓模型“吃不消”。 b. 多粒度的NER系統可以提高準召。第?步抽取?較粗粒度的實體,通過模型+規則+詞典等多策略保證?召回;第?步進?細粒度的實體分類,通過模型+規則保證準確。如何解決低耗時場景下的NER任務? ?從模型層面來看,1層lstm+CRF已經夠快了。從系統層面來看,重點應放在如何在多層級的NER系統中進行顯存調度、或者使當前層級的顯存占用最大化等。
綜上,如果能在1層lstm+CRF的基礎上引入更豐富的embedding特征、并進行多策略組合,足以解決垂直領域的NER問題;此外,我們要更好地利用BERT、使其價值最大化;要更加穩妥地解決復雜NER問題(詞匯增強、冷啟動、低資源、噪聲、不平衡、領域遷移、可解釋、低耗時)。
除了上面的12條工業界實戰經驗,群內的一個小伙伴@一一 ?還提出了一個實際場景經常遇到的問題:
lstm+crf做實體提取時,保證精度的情況下,在提升模型速度上有沒有什么好的辦法或者建議?
杰神同樣給予了一個飽含實戰經驗的回答:
個人經驗來說,1層lstm+CRF夠快了。
如果覺得lstm會慢,換成cnn或transformer也許更快一些,不過效果好不好要具體分析;通常來說,lstm對于NER任務的?向性和局部特征捕捉會好于別的編碼器。 如果覺得crf的解碼速度慢,引入label attention機制把crf拿掉,比如LAN這篇論文[12];當然可以?指針網絡替換crf,不過指針網絡收斂慢?些。 如果想進行模型壓縮,比如對lstm+crf做量化剪枝也是一個需要權衡的?作,有可能費力不討好~
可以看出,哪怕是命名實體識別,中文分詞甚至文本分類這些看似已經在公開數據集上被求解的任務,放在實際的工業界場景下都可能存在大量的挑戰。這也是提醒還未踏入工業界的小伙伴們,不僅要刷paper追前沿,更要記得積極實踐,在實際問題中積累NLP煉丹技巧哦。
轉載自:https://zhuanlan.zhihu.com/p/163286381
?
總結
以上是生活随笔 為你收集整理的【NLP技术应用】工业界求解NER问题的12条黄金法则 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。