工業界如何解決NER問題?12個trick,與你分享~
NER是一個已經解決了的問題嗎?或許,一切才剛剛開始。
例如,面對下面筆者在工作中遇到的12個關於NER的系列問題,你有什麼好的trick呢?不著急,讓我們透過本篇文章,逐一解答~
Q1、如何快速有效地提升NER效能(非模型迭代)?
Q2、如何在模型層面提升NER效能?
Q3、如何構建引入詞彙資訊(詞向量)的NER?
Q4、如何解決NER實體span過長的問題?
Q5、如何客觀看待BERT在NER中的作用?
Q6、如何冷啟動NER任務?
Q7、如何有效解決低資源NER問題?
Q8、如何緩解NER標註資料的噪聲問題?
Q9、如何克服NER中的類別不平衡問題?
Q10、如何對NER任務進行領域遷移?
Q11、如何讓NER系統變得“透明”且健壯?
Q12、如何解決低耗時場景下的NER任務?
工業界中的NER問題為什麼不易解決?
眾所周知, 命名實體識別(Named Entity Recognition, NER)是一項基礎而又重要的NLP任務,往往作為資訊抽取、問答對話、機器翻譯等方向的或顯式或隱式的基礎任務。或許在很多人眼裡,NER似乎只是一個書本概念,跟句法分析一樣存在感不強。
究其緣由:一方面是因為深度學習在NLP領域遍地開花,使得智慧問答等曾經複雜的NLP任務,變得可以端到端學習,於是分詞、詞性分析、NER、句法分析等曾經的顯式任務都隱式地編碼到了大型神經網路的引數中;另一方面,深度學習流行之後,NER問題相比之前有了比較長足的進步,LSTM+CRF的模式基本成為業內標配,很多人認為“這個事情應該差不多了”。
但是,現實真的如此嗎?在工業界解決NER任務的NLPer,往往發現事情遠沒有這樣簡單。
在真實的工業界場景中,通常面臨 標註成本昂貴、 泛化遷移能力不足、 可解釋性不強、 計算資源受限等問題,想要將NER完美落(bian)地(xian)可不簡單,那些在經典benchmark上自稱做到SO他的方法放在現實場景中往往“也就那樣”。以醫療領域為例:
- 不同醫院、不同疾病、不同科室的文字描述形式不一致,而標註成本又很昂貴,一個通用的NER系統往往不具備“想象中”的泛化遷移能力。 當前的NER技術在醫療領域並不適合做成泛化的工具。
- 由於醫療領域的嚴肅性,我們既要知其然、更要知其所以然: NER系統往往不能採用“一竿子插到底”的黑箱演算法,處理過程應該隨著處理物件的層次和深度而逐步疊加模組,下級模組使用上級結果,方便進行迭代最佳化、並具備可解釋性,這樣做可解耦醫學事件、也便於進行醫學實體消歧。
- 僅僅使用統計模型的NER系統往往不是萬能的,醫療領域相關的實體詞典和特徵挖掘對NER效能也起著關鍵作用。此外,NER結果往往不能直接使用,還需進行醫學術語標準化。
- 由於醫院資料不可出院,需要在院內部署NER系統。而通常醫院內部的GPU計算資源又不是很充足(成本問題),我們需要讓機器學習模型又輕又快(BERT上不動哇),同時要更充分的利用視訊記憶體。
以上種種困難,導致了工業界場景求解NER問題不再那麼容易,不是一個想當然的事情。
做NER的幾條教訓(趟過的坑)
下面給出筆者在醫療領域做NER的經驗教訓(趟過的坑):
1、提升NER效能(performance)的⽅式往往不是直接堆砌⼀個BERT+CRF,這樣做不僅效果不一定會好,推斷速度也非常堪憂。就算BERT效果還不錯,付出的代價也是慘重的。
就算直接使用BERT+CRF進行finetune,BERT和CRF層的學習率也不要設成一樣,讓CRF層學習率要更大一些(一般是BERT的5~10倍),要讓CRF層快速收斂。
2、在NER任務上,也不要試圖對BERT進⾏蒸餾壓縮,很可能吃⼒不討好。
哈哈,也許廢了半天勁去蒸餾,效果下降到還不如1層lstm+crf,推斷速度還是慢~
3、NER任務是⼀個重底層的任務,上層模型再深、效能提升往往也是有限的(甚至是下降的)。
不要盲目搭建很深的網路,也不要痴迷於各種attention了。
4、NER任務不同的解碼方式(CRF/指標網路/Biaffine )之間的差異其實也是有限的,不要過分拘泥於解碼⽅式。
5、透過QA閱讀理解的方式進行NER任務,效果也許會提升,但計算複雜度上來了,你需要對同⼀⽂本進行多次編碼(對同⼀文字會構造多個question)。
6、設計NER任務時,儘量不要引入巢狀實體,不好做,這往往是一個長尾問題。
7、不要直接拿Transformer做NER,這是不合適的,詳細可參考TENER 。
工業界中NER問題的正確開啟⽅式是怎樣的?12個trick逐一剖析
筆者首先給出一個非常直接的開啟方式: 1層lstm+crf!
從模型層面看,你也許會問:為什麼非是1層lstm+crf?1層lstm+crf不能解決業務問題怎麼辦?遇到更為複雜的場景該怎麼辦?不著急,且聽我慢慢道來。
讓我們回到一開始列出的那12個問題,並逐一解答:
Q1、如何快速有效地提升NER效能?
如果1層lstm+crf,這麼直接的開啟方式導致NER效能達不到業務目標,這一點也不意外(這是萬里長征的第一步~)。這時候除了badcase分析,不要忘記一個快速提升的重要手段: 規則+領域詞典。
- 在垂直領域,一個不斷積累、不斷完善的實體詞典對NER效能的提升是穩健的,基於規則+詞典也可以快速應急處理一些badcase;
- 對於通⽤領域,可以多種分詞工具和多種句法短語⼯具進行融合來提取候選實體,並結合詞典進行NER。
此外,怎麼更好地將實體詞典融入到NER模型中,也是一個值得探索的問題(如嵌入到圖神經網路中提取特徵 )。
Q2、如何在模型層面提升NER效能?
如果想在模型層面(仍然是1層lstm+crf)搞點事情,上文講過NER是一個重底層的任務,1層lstm足以很好捕捉NER任務中的方向資訊和區域性特徵了。
我們應該集中精力在embedding層下功夫,那就是 引入豐富的特徵:比如char、bigram、詞典特徵、詞性特徵、elmo等等,還有更多業務相關的特徵;在垂直領域,如果可以預訓練一個領域相關的字向量&語言模型,那是最好不過的了。
總之, 底層的特徵越豐富、差異化越大越好。我們需要構造不同視角下的特徵。
Q3、如何構建引入詞彙資訊(詞向量)的NER?
將詞向量引入到模型中,一種簡單粗暴的做法就是將詞向量對齊到相應的字元,然後將字詞向量進行混合,但這需要對原始文字進行分詞(存在誤差),效能提升通常是有限的。
我們知道中文NER通常是基於字元進行標註的,這是由於基於詞彙標註存在分詞誤差問題。但詞彙邊界對於實體邊界是很有用的,我們該怎麼把蘊藏詞彙資訊的詞向量“恰當”地引入到模型中呢?
一種行之有效的方法就是 資訊無損的、引入詞彙資訊的NER方法,我稱之為 詞彙增強,具體可參考專欄文章《 中文NER的正確開啟方式:詞彙增強方法總結 》。
ACL2020的Simple-Lexicon 和FLAT 兩篇論文,不僅詞彙增強模型十分輕量、而且可以比肩BERT的效果。
Q4、如何解決NER實體span過長的問題?
如果NER任務中某一類實體span比較長(⽐如醫療NER中的⼿術名稱是很長的),直接採取CRF解碼可能會導致很多連續的實體span斷裂。除了加入規則進行修正外,這時候也可嘗試引入 指標網路+CRF構建 多工學習解決。
指標網路會更容易捕捉較長的span,不過指標網路的收斂是較慢的,可以對CRF和指標網路設定不同學習率,或者設定不同的loss權重。
Q5、如何客觀看待BERT在NER中的作用?
對於工業場景中的絕大部分NLP問題(特別是垂直領域),都沒有必要堆資源。但這絕不代表BERT是“一無是處”的,在不受計算資源限制、通用領域、小樣本的場景下,BERT表現會更好。我們要更好地去利用BERT的優勢:
- 在低耗時場景中,BERT可以作為一個“對標競品”,我們可以採取 輕量化的多種策略組合去逼近甚至超越BERT的效能;
- 在垂直領域應用BERT時,我們首先確認領域內的語料與BERT原始的預訓練語料之間是否存在gap,如果這個gap越大,那麼我們就 不要停止預訓練:繼續在領域內進行預訓練,繼續在具體任務上進行預訓練。
- 在小樣本條件下,利用BERT可以更好幫助我們解決低資源問題:比如基於BERT等預訓練模型的文字增強技術 ,又比如與主動學習、半監督學習、領域自適應結合(後續詳細介紹)。
- 在競賽任務中,BERT很有用!我們可以選取不同的預訓練語⾔模型在底層進行特徵拼接。具體地,可以將char、bigram和BERT、XLNet等一起拼接喂入1層lstm+crf中。語⾔模型的差異越⼤,效果越好。如果需要對語言模型finetune,需要設定不同的學習率。
Q6、如何冷啟動NER任務?
如果⾯臨的是⼀個冷啟動的NER任務,業務問題定義好後,首先要做的就是維護好一個領域詞典,而不是急忙去標資料、跑模型;當基於規則+詞典的NER系統不能夠滿足業務需求時,才需要啟動人工標註資料、構造機器學習模型。
當然,我們可以採取一些省成本的標註方式,如結合 領域化的預訓練語言模型+主動學習,挖掘那些“不確定性高”、並且“具備代表性”的高價值樣本。
需要注意的是,由於NER通常轉化為一個 序列標註任務,不同於傳統的分類任務,我們需要設計一個專門針對序列標註的主動學習框架。
Q7、如何有效解決低資源NER問題?
如果拿到的NER標註資料還是不夠,又不想標註人員介入,這確實是一個比較困難的問題。
低資源NLP問題的解決方法通常都針對分類任務,這相對容易一些,如可以採取文字增強、半監督學習等方式,可參考專欄文章《 標註樣本少怎麼辦?「文字增強+半監督學習」總結 》。
上述解決低資源NLP問題的方法,往往在NER中提升並不明顯。NER本質是基於token的分類任務,其對噪聲極其敏感的。如果盲目應用弱監督方法去解決低資源NER問題,可能會導致全域性性的效能下降,甚至還不如直接基於詞典的NER。
這裡給出一些可以嘗試的解決思路(筆者個人建議,也許還會翻車啊):
- 上文已介紹BERT在低資源條件下能更好地發揮作用:我們可以使用BERT(領域預訓練的BERT)進行 資料蒸餾(半監督學習+置信度選擇),同時利用實體詞典輔助標註。
- 還可以利用 實體詞典+BERT相結合,進行 半監督自訓練,具體可參考文獻 。
- 工業界畢竟不是搞學術,要想更好地解決低資源NER問題,RD在必要時還是要干預、並進行核查的。
Q8、如何緩解NER標註資料的噪聲問題?
實際工作中,我們常常會遇到NER資料可能存在標註質量問題,也許是標註規範就不合理(一定要提前評估風險,不然就白乾了),當然,正常的情況下只是存在一些小規模的噪聲。
一種簡單地有效的方式就是對訓練集進行交叉驗證,然後人工去清洗這些“髒資料”。當然也可以將noisy label learning應用於NER任務,懲罰那些噪音大的樣本loss權重,具體可參考文獻 。
專欄之前還介紹了一篇透過 置信學習框架來尋找錯誤標註的文章《 標註資料存在錯誤怎麼辦? 》,不過只使用置信學習框架只適用於分類任務,如何應用於NER任務,需要進一步探索。
Q9、如何克服NER中的類別不平衡問題?
NER任務中,常常會出現某個類別下的實體個數稀少的問題,而常規的解決方法無外乎是重取樣、loss懲罰、Dice loss 等等。而在醫療NER中,我們常常會發現這類實體本身就是一個長尾實體(填充率低),如果能挖掘相關規則模板、構建詞典庫也許會比模型更加魯棒。
Q10、如何對NER任務進行領域遷移?
在醫療領域,我們希望NER模型能夠在不同醫院、不同疾病間進行更好地泛化遷移(這是一個 領域自適應問題:源域標註資料多,目標域標註資料較少),領域自適應針對NER的相關研究不多,通常是對抗遷移 或特徵遷移 。
在具體實踐中,對抗&特徵遷移通常還不如直接採取finetune方式(對源域進行預訓練,在目標域finetune),特別是在後BERT時代。
此外,在醫療領域,泛化遷移問題並不是一個容易解決的問題,試圖去將NER做成一個泛化工具往往是困難的。或許我們更應該從業務角度出發去將NER任務定製化,而不是拘泥於那些無法落地的前沿技術。
Q11、如何讓NER系統變得“透明”且健壯?
一個好的NER系統並不是“一竿子插到底”的黑箱演算法。在醫療領域,實體型別眾多,我們往往需要構建一套 多層級、多粒度、多策略的NER系統。 例如:
- 多層級的NER系統更加“透明”,可以回溯實體的來源(利於醫學實體消歧),方便“可插拔”地迭代最佳化;同時也不需要構建數目眾多的實體型別,讓模型“吃不消”。
- 多粒度的NER系統可以提高準召。如,第⼀步抽取⽐較粗粒度的實體,透過模型+規則+詞典等多策略保證⾼召回;第⼆步進⾏細粒度的實體分類,透過模型+規則保證⾼準確。
Q12、如何解決低耗時場景下的NER任務?
筆者經驗,重點應放在工程層面,而不是模型層面的壓縮:
因為,從模型層面來看,1層lstm+CRF已經夠快了
- 如果覺得lstm會慢,換成cnn或transformer也許更快一些,不過效果好不好要具體分析;通常來說,lstm對於NER任務的⽅向性和區域性特徵捕捉會好於別的編碼器。
- 如果覺得crf的解碼速度慢,引入label attention機制把crf拿掉,比如LAN這篇論文 ;當然可以⽤指標網路替換crf,不過指標網路收斂慢⼀些。
- 如果想進行模型壓縮,比如對lstm+crf做量化剪枝也是⼀個需要權衡的⼯作,有可能費力不討好~
lstm+crf已經夠小了,對小模型進行壓縮往往不如對大模型壓縮更加健壯 。
從模型+工程層面來看,重點應放在如何在多層級的NER系統中進行視訊記憶體排程、或者使當前層級的視訊記憶體佔用最大化等。
總結
綜上:
- 我們要在1層lstm+CRF的基礎上,引入更豐富的embedding特徵,並進行多策略組合,這大機率可以解決垂直領域的NER問題。
- 我們要更好地利用BERT、使其價值最大化。 BERT雖好,可不要過度信任啊~
- 我們要更加穩妥地解決複雜NER問題(詞彙增強、冷啟動、低資源、噪聲、不平衡、領域遷移、可解釋、低耗時),這是一個需要權衡的過程,切記不要盲目追前沿,很多髒活累活還是要幹一乾的。
可以看出,哪怕是命名實體識別,中文分詞甚至文字分類這些看似已經在公開資料集上被求解的任務,放在實際的工業界場景下都可能存在大量的挑戰。
此外,對於複雜場景的NER問題,值得借鑑的學術前沿也不夠多。很多泛機器學習知識大多集中在CV領域,在NLP領域更多的是轉化為一個分類任務去解決。從這個角度看, NER不是一個像分類任務那樣簡單的問題。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946223/viewspace-2707407/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 業務出海,企業該如何解決這兩個核心問題?
- CVPR 2019提前看:工業界與學術界的深度融合專題
- 如何解決員工執行力不強的問題
- 深度學習引數怎麼調優,這12個trick告訴你深度學習
- 六西格瑪如何解決員工流動率問題
- 如何解決各個行業出現的資料洩露問題?行業
- 跨域問題?如何解決?跨域
- macOS Big Sur更新後你遇到了哪些問題如何解決Mac
- IDC企業如何解決常見的技術問題
- 如何解決 github 訪問慢的問題Github
- 如何解決app閃退問題APP
- 如何解決TOP-K問題
- 前端跨域問題如何解決前端跨域
- 如何解決MRAM壽命問題
- 如何解決快取失效問題快取
- 幾個小 trick
- 工業相機使用常見的8個問題
- 計算機畢業大學生如何解決難就業問題?計算機就業
- 如何解決dell win10你的電腦遇到問題需要重新啟動的問題Win10
- 褚健教授:為工業界打造一個工業版安卓系統安卓
- 如何解決sms-activate的解決問題
- 如何解決0.1 +0.2===0.30000000000000004類問題
- 如何解決Facebook SDK常見問題?
- 如何解決MES交付困難問題?
- 日期型別有問題,如何解決?型別
- 如何解決資料庫配置問題資料庫
- 頭疼,大事務問題如何解決?
- Spark任務OOM問題如何解決?SparkOOM
- Rust 如何解決 C++ 的問題?RustC++
- 如何解決div樣式拉伸問題
- mysql亂碼的問題如何解決MySql
- flutter run 卡住的問題如何解決Flutter
- 如何解決大資料安全問題大資料
- 企業雲盤如何解決設計行業資料洩露問題行業
- 年底缺少成本票的企業該如何解決稅收問題?
- 如何解決網站限制IP訪問的問題網站
- 【分享】Postman介面測試實戰分享,這5個問題你必須得知道!Postman
- 如何解決PuTTY中文亂碼的問題