自然語言處理在文字資訊抽取、自動審校、智慧問答、情感分析等場景下都有非常多的實際應用需求,在人工智慧領域裡有極為廣泛的應用場景。然而在實際工程應用中,最經常面臨的挑戰是我們往往很難有大量高質量的標註語料。
“巧婦難為無米之炊”,在缺少語料的情況下,如何達到良好的NLP應用效果,是這些場景要落地所必須解決的問題。我們通常稱其為“低資源問題”,或者稱為“小樣本學習”問題,本文從達觀資料的實踐經驗出發,用命名實體識別(NER)任務為例,來介紹在小標註資料量下進行NLP處理的經驗和方法,希望對大家有所啟發。
經典的低資源NLP方法
在眾多文字處理場景中,NER(Named Entity Recognition,命名實體識別)又稱專名識別,是最為常見的一項任務,使用的範圍非常廣,因此本文中我們以NER任務為例來講解。命名實體通常指文字中具有特別意義或者指代性非常強的事物,例如人名、地名、機構名、書名、時間、以及其他專有名詞等。NER的任務就是從原始的非機構化文字中自動抽取出上述實體,或者按業務需求識別出更多特定類別的實體,比如產品名稱、型號、價格等。實體這個概念可以很廣,只要是業務需要的特殊文字片段都可以稱為實體。例如在金融行業文字中,債權人、債務人、利潤總額、資產負載率等,這些特定意義的資訊,都可以視為實體。
在實際應用中,由於標註資料稀少(這個原因來自很多實際條件的限制),但又期望能達到足夠好的效果,在經典的機器學習方法裡,往往可以通過對特徵進行概率統計學習,來形成抽取模型。其具體演算法思想如下:
先由工程師標定特徵,通過對訓練資料進行特徵統計和挖掘,形成抽取模型。
下面簡單舉例說明,假設標註的樣本資料是:
百度是一家人工智慧公司 à NER (公司名:百度)
需要抽取出“參加本次活動的達觀資料是一家人工智慧公司”這句話裡的公司名。通過分詞、詞性標註、句法結構分析等,掌握到“參加本次活動”這樣的定語修飾詞,以及後續13個字,經典方法是用概率計算方法判斷出現在“是人工智慧公司”前面的詞彙是公司名的概率。
在經典NER方法中,達觀的經驗是條件隨機場(CRF)效果較好。條件隨機場使用勢函式和圖結構上的團來定義條件概率P(y | x)。給定觀測序列x,鏈式條件隨機場主要包含兩種關於標記變數的團,即單個標記變數{yi}以及相鄰的標記變數{yi-1,yi}。在條件隨機場中,通過選用合適的勢函式,並引入特徵函式,可以得到條件概率的定義:
其中:
其中tk(yi- 1, yi, x, i)是定義在觀測序列的兩個相鄰標記位置上的轉移特徵函式,用於刻畫相鄰標記變數之間的相關關係以及觀測序列對它們的影響,sl(yi, x, i)是定義在觀測序列的標記位置i上的狀態特徵函式,用於刻畫觀測序列對標記變數的影響,λk和ul為引數,Z為規範化因子。
可以將tk(yi - 1, yi, x, i)和sl(yi, x, i)兩個特徵函式統一為:fk(yi-1, yi, x, i),則有:
其中:
已知訓練資料集,由此可知經驗概率分佈,可以通過極大化訓練資料的對數似然函式來求模型引數。加入懲罰項後,訓練資料的對數似然函式為:
其中的σ是可以調節的懲罰權重。對似然函式L(w)中的w求偏導,令:
可以依次求出wi。在上述情況下,如果帶來干擾的訓練樣本不多,則CRF還是可以取得尚可的效果的。但是前置的句法結構分析、詞性分析等一旦出現誤差,會帶來連鎖反應。例如“參加本次活動的”這樣的定語有時需要進行剔除才能確保NER識別的精度,不得不讓工程師針對每個場景進行很多繁瑣的預處理和後處理工作。
深度學習與小標註資料訓練
使用深度學習的優點是不需要工程師告訴演算法要提取哪些特徵,而是由演算法從標註資料中自動學習並尋找到關鍵特徵,再進行預測(提取)。深度學習源自經典的BP神經網路模型,一般由輸入層,隱藏層,輸出層組成,其中隱藏層的數目按需確定。深度學習增加了網路層數,將每一層的輸出作為下一層的輸入,將底層的簡單特徵進行多層組合抽象為高層的特徵表示。NER最常使用的深度神經網路結構是長短時記憶網路LSTM(Long ShortTerm Memory)。長短期記憶網路的原理可見下圖:
第一步,如何做長期記憶的更新?輸入Ht-1和Xt,Ht-1是上一個時刻這個cell隱狀態的輸出,Xt是當前輸入,它們兩個通過這個函式計算後的輸出是0-1之間的某一個值。這一步,決定上個時刻神經元狀態留下的比率是多少。
第二步,上下文中獲得了新的資訊,不能只是把老的神經元狀態更新,還要把新的資訊添進去,通過這兩個公式來添,第一個公式輸出0-1的係數,第二個公式要選出量是多少。有了第一步和第二步之後就開始第三步神經元狀態更新。
第三步,第一步的輸出0-1和Ct-1相乘決定上一時刻這個神經元狀態留下多少。第二步算出來係數和資訊量相乘決定留下多少新增資訊,然後把上一步剩下的和這一步新增的加起來,做一個更新,這個更新就是現的神經元狀態值。
第四步,現在單元的狀態更新完了,接下來就要輸出,這個輸出有兩個:第一個,對外是一樣,還是隱層的輸出Ht。決定留下多少老的資訊,決定留下多少新的資訊,第二個再把老的資訊和新的資訊加起來就是最終的結果。
使用深度學習的方法通常需要有大量的訓練資料,在小資料集下往往很難對網路結構進行充分訓練。多工學習(Multi-task Learning)可通過端到端的學習方式,直接在當前任務中引入其他相關任務的標註資訊作為監督學習的樣本。2008年Collobert等人最早提出了NLP中應用Multi-task的思想,通過不同任務的標註資料,共同訓練一個神經網路模型,來共同提升資料的綜合利用程度。多工學習可以設計為可共享網路的核心層次,在輸出層對不同任務設計特定的網路結構。達觀在實際使用中,也會使用Bi-LSTM和CRF結合的網路結構,效果略有提升,但受限於資料規模,並非有質的提升。
引入預訓練神經網路
前面所提的方法只依賴了測試場景下已有的訓練資料,而很多實際場景下獲取標註語料非常困難,那為了達到好的效果還有什麼不同的思路嗎?這些專有名詞除了出現在標註語料中,還有很多文字中也一樣會出現,無論是字、詞或者句子,都大量存在。所以是否可以使用其他文字中的未標註過的語料,來改進當前測試場景下的效果?這就是近年來在NLP領域大放異彩的預訓練思路。而詞向量(Word Embedding)是普遍使用的方法,相比傳統的對於詞語進行One-Hot編碼,詞向量攜帶了更加豐富的語義資訊。
字面上不相關的詞在中文中有可能是非常相近甚至是同義詞,如“電腦”和“計算機”,“香蕉”和“水果”,“公司”和“企業”,如果模型可以結合這些資訊,能有效提高抽取的泛化能力。詞向量主要的幾代技術有Word2Vec,ELMO和BERT。
Word2Vec
Word2Vec是google在2013年推出的一個NLP工具,它的特點是將所有的詞向量化。Word2Vec中最重要的兩個模型是CBOW(Continuous Bag-of-Word)模型和Skip-gram(ContinuousSkip-gram)模型,兩個模型都包含三層:輸入層,投影層,輸出層。CBOW模型的作用是已知當前詞Wt的上下文環境(Wt-2,Wt-1,Wt+1,Wt+2)來預測當前詞,Skip-gram模型的作用是根據當前詞Wt來預測上下文(Wt-2,Wt-1,Wt+1,Wt+2)
在模型求解中,和一般的機器學習方法類似,也是定義不同的損失函式,使用梯度下降法尋找最優值。Word2vec模型求解中,使用了HierarchicalSoftmax方法和NegativeSampling兩種方法。通過使用Word2vec,我們可以方便的將詞轉化成向量表示,讓計算機和理解影像中的每個點一樣,數字化詞的表現。
ELMO
相同的詞在不同上下文是可能有不同的含義。如“蘋果”,在“我吃了一個蘋果”,和“我買了一個蘋果手機”兩個句子下的含義完全不同。所以word embedding 對於每個詞只有一個唯一的向量,是無法區分不同語義下相同詞的不同含義。ELMO(Embeddingfrom Language Models)通過上下文來調整word embedding 的方式, 可以比較好的解決這個問題。
上圖展示的是其預訓練過程,它的網路結構採用了雙層雙向 LSTM,目前語言模型訓練的任務目標是根據單詞的上下文去正確預測單詞,單詞之前的單詞序列稱為上文,之後的單詞序列稱為下文。圖中左端的前向雙層LSTM代表正方向編碼器,輸入的是從左到右順序的除了預測單詞外的上文。右端的逆向雙層 LSTM 代表反方向編碼器,輸入的是從右到左的逆序的句子下文。每個編碼器的深度都是兩層 LSTM 疊加。這個網路結構其實在NLP 中是很常用的。
使用這個網路結構利用大量語料做語言模型任務就能預先訓練好這個網路,如果訓練好這個網路後,輸入一個新句子,句子中每個單詞都能得到對應的三個Embedding:最底層是單詞的 WordEmbedding,往上走是第一層雙向LSTM中對應單詞位置的Embedding,這層編碼單詞的句法資訊更多一些;再往上走是第二層 LSTM 中對應單詞位置的Embedding,這層編碼單詞的語義資訊更多一些。所以,ELMO不僅僅學會單詞的 WordEmbedding,還學會了一個雙層雙向的LSTM 網路結構。
BERT
ELMO一個非常明顯的缺點在特徵抽取器選擇方面,ELMO使用了 LSTM 而不是新貴Transformer,Transformer 是谷歌在 17 年做機器翻譯任務的“Attentionis all you need”的論文中提出的,引起了相當大的反響,很多研究已經證明了Transformer 提取特徵的能力遠強於LSTM。
BERT的全稱是Bidirectional Encoder Representation from Transformers,在機器閱讀理解頂級水平測試SQuAD1.1中表現出驚人的成績:全部兩個衡量指標上全面超越人類!並且還在11種不同NLP測試中創出最佳成績,包括將GLUE基準推至80.4%(絕對改進7.6%),MultiNLI準確度達到86.7%(絕對改進率5.6%)等。
Bert使用雙向Transformer的Encoder,因為decoder是不能獲要預測的資訊的。模型的主要創新點都在預訓練方法上,即用了Masked Language Model和Next Sentence Prediction兩種方法分別捕捉詞語和句子級別的語義。
Masked Language Model(MLM)是指在訓練的時候隨即從輸入預料上mask掉一些單詞,然後通過的上下文預測該單詞,該任務非常像我們在中學時期經常做的完形填空。正如傳統的語言模型演算法和RNN匹配那樣,MLM的這個性質和Transformer的結構是非常匹配的。在BERT的實驗中,15%的Token會被隨機Mask掉。在訓練模型時,一個句子會被多次喂到模型中用於引數學習,但是Google並沒有在每次都mask掉這些單詞,而是在確定要Mask掉的單詞之後,80%的時候會直接替換為[Mask],10%的時候將其替換為其它任意單詞,10%的時候會保留原始Token。這麼做的原因是如果句子中的某個Token100%都會被mask掉,那麼在fine-tuning的時候模型就會有一些沒有見過的單詞。加入隨機Token的原因是因為Transformer要保持對每個輸入token的分散式表徵,否則模型就會記住這個[mask]是token ‘hairy’。至於單詞帶來的負面影響,因為一個單詞被隨機替換掉的概率只有15%*10% =1.5%,這個負面影響其實是可以忽略不計。
Next Sentence Prediction(NSP)的任務是判斷句子B是否是句子A的下文。如果是的話輸出‘IsNext’,否則輸出‘NotNext’。訓練資料的生成方式是從平行語料中隨機抽取的連續兩句話,其中50%保留抽取的兩句話,它們符合IsNext關係,另外50%的第二句話是隨機從預料中提取的,它們的關係是NotNext。
達觀資料在實踐中發現,使用預訓練方法,通過詞嵌入,對於比較常見的欄位抽取可以有明顯的提升,比如人名類欄位(甲方,乙方,律師,原告等),很少的標註語料就可以達到很好的效果,但對於行業性質比較強的欄位,由於本身能獲取到的未標註語料總量也不夠大,相關字詞的出現頻率不夠多,限制了方法的效果。
遷移學習(Transfer Learning)方法
現在需要處理的任務標註樣本不足,但其他相關的任務有大量的標註樣本,並且有個比較好的模型。所以是否可以將大量標註樣本資料的任務來優化這個樣本不足任務?遷移學習就是基於這樣的思路,核心思想就是將一個已經成熟的任務應用於另外一個任務。舉例來說,比如採購合同往往資料量比較大,而租賃合同資料量比較小,可以用採購合同的模型來優化租賃合同的場景。
遷移學習根據遷移的知識進行分類,可以分為基於樣本的遷移,基於模型的遷移,基於特徵的遷移,及基於關係的遷移。
基於樣本的遷移學習是根據一定的權重生成規則,對資料樣本進行重用,來進行遷移學習。經典的演算法是TrAdaBoost,從源場景中篩選有效資料,過濾掉與目標場景不同的資料,通過 Boosting方法建立一種權重調整機制,增加有效資料權重,降低無效資料權重。
基於模型的遷移是目前比較容易落地的,前面提到的租賃合同和採購合同,達觀也是基於模型的遷移進行的處理。基於模型的遷移又叫多工學習,網路結構如下圖所示,任務與任務之間共享隱藏層,保留每個任務的輸出層。
基於特徵的遷移方法是指將通過特徵變換的方式互相遷移,來減少源場景和目標場景之間的差距;或者將源場景和目標場景的資料特徵變換到統一特徵空間中,然後利用傳統的方法進行識別。典型的方法是遷移成分分析方法。該方法的核心內容是以最大均值差異作為度量準則,將不同資料領域中的分佈差異最小化。
基於關係的遷移學習方法比較關注源場景和目標場景的樣本之間的關係。目前研究和應用都比較少。
半監督(Semi-supervised Learning)學習方法
一些少標註資料的場景,是標註成本比較高,比如招股說明書,一份都打幾百頁甚至上千頁,一個人要幾天才能標註完一篇文件。這種場景下可以考慮使用半監督學習方法。
半監督學習方法最簡單的做法是,通過已有的標註資料進行建模,對未標註資料進行預測,預測結果中概率比較大的,則認為是正確的,加入到訓練樣本中。這種方法達觀實踐下來效果一般,原因是這種方式加入的樣本里,正確的樣本都是原來模型可以準確預測,而且特徵明顯(預測概率高),所以對模型的補充性不一定很高,只是一些小特徵的補充。而且更嚴重的是這裡面可以有些是誤判的,當成訓練資料對模型往往影響就會比較大。
半監督學習方法的另外一種方法偽標記半監督學習演算法,用在深度學習的網路結構中。當輸入的樣本是一個有標記的樣本的時候,我們需要最小化模型輸出和樣本標記的交叉熵,這就是監督學習,那麼沒有標記的怎麼辦,這時候就需要一個偽標記。
這樣我們就獲得了一個偽標記。我們在訓練模型的時候定義損失函式
其中y和f代表監督學習的輸入和輸出,為偽標記,α了加權係數,而t代表了當前的迭代次數。通過求解這個新的網路,得到最終的模型。所以這裡的方法就是網路對無標籤資料的預測,作為無標籤資料的標籤(即偽標籤)。模型不會做為正確標籤進行處理,從而避免上面算髮判錯帶來的影響。
引入業務知識&領域常識
達觀資料服務了非常多的大型企業,發現命名實體識別在大型企業裡面的應用場景,基本都是對一些行業內常見型別的文字進行實體抽取,進而通過RPA(機器人流程自動化)代替人進行自動操作。如財務合同,可自動抽取出甲方,乙方,總金額等數十個欄位,進行財務核算;比如幾百頁的招股說明書,需要抽取出董事,監事,高管,財務表,重大合同,上下游供應商等數千個欄位;比如司法裁判文書,需抽取出原告,被告,律師,罪名,判罰結果等上百個欄位。這些場景有幾個共同的特點是:
1、都是具備特定格式的規範文書。相比於網際網路中的五花八門的各類評論和文章,這些行業文件內容規範,行文準確,很少會出現錯字,語法錯誤等問題。文件的撰寫會遵從行業規範,每個人撰寫風格影響小,會有特定行業固定的套路。
2、這些文件訓練語料極為稀少,比如招股說明書或者合同,即便是大型企業內部歷史積累的語料也不會很多,獲得標註的更少
3、這些場景由於行業屬性非常強,所以通過全網文書計算詞向量的方式效果往往不好,用行業語料進行訓練,由於資料量較少,也不能達到很好的效果。達觀資料在服務上百家大型客戶實踐中,研發了一套結合行業經驗的演算法模型,可以在這些低資源文件的場景,達到非常好的效果。
這個演算法的核心思想是,利用行業專家經驗,通過知識沉澱的方法,幫助系統掌握行業規律,通過知識圖譜將專家經驗輸入給模型,極大提升演算法的效果。
對於每個抽取的欄位,行業專家可以梳理出這個欄位的重要詞,重要句式,重要段落,重要位置,重要上下文,把這些資訊進行編碼加入到模型中。
上圖是將行業專家梳理到核心詞使用的例子。假設“委員”和“委員會”是核心詞。需要對“美國聯邦通訊委員會最近正式批准蘋果展開5G通訊試驗”的每個字生成詞向量。這裡的方法是通過2-gram,3-gram,4-gram和5-gram對每個字進行編碼,編成8個位,每種gram各2個位表示上文是否是核心詞和下文是否是核心詞。以“委”字為例編碼方式為:
2-gram,就是“信委”和“委員”,“信委”不是核心詞,而“委員”是核心詞,所以編碼為“01” 3-gram,就是“通訊委”和“委員會”,“通訊委”不是核心詞,而“委員會”是核心詞,所以編碼為“01” 4-gram,就是“邦通訊委”和“委員會最”都不是核心詞,所以編碼為“00” 5-gram,就是“聯邦通訊委”和“委員會最近”都不是核心詞,所以編碼為“00”
然後我們再通過訓練兩個獨立的LSTM雙向網路(如圖所示),一個是用經典LSTM結構,一個是將以上專家特徵(或者領域知識)合併進來後,並最終將把所有的行業向量和原始的字向量進行拼接,作為CRF層的輸入,這樣雙層BiLSTM+CRF模型可以較好的融合領域知識來提升提取效果。
本文小結
本文以NER任務為例,詳細闡述了達觀在小標註語料情況下進行演算法優化的經驗。在標註語料稀缺的情況下,僅僅依靠傳統的NLP模型很難達到理想的效果,我們往往需要因地制宜的深入研究具體的業務場景,實事求是的運用各種方法,引入更多相關的資料和資源,融會貫通,更好的理解業務並實現技術的落地。
關於作者
紀達麒:達觀資料技術長(CTO),研發團隊總負責人,中國計算機學會(CCF)會員。擁有10年技術團隊管理經驗,在加入達觀前,曾擔任騰訊文學資料中心高階研究員、盛大文學技術總監,搜狗廣告系統高階研發工程師,百度工程師等職務,擅長資料探勘以及實時服務系統架構設計工作。曾代表公司多次參加國際資料探勘競賽,是ACM KDD-Cup,CIKM Competition等世界一流資料探勘競賽獲勝隊伍的核心成員。