這一章我們不聊模型來聊聊數據,解決實際問題時90%的時間其實都是在和數據作斗爭,於是無標注,弱標注,少標注,半標注對應的各類解決方案可謂是百花齊放。在第二章我們也嘗試通過多目標對抗學習的方式引入額外的NER樣本,或者分詞邊界來提高people daily小樣本數據集的效果。
以下我會結合一些業界的案例和新鮮出爐的NLP數據增強綜述,聊聊都有哪些數據增強方案,其中哪些適用於NER以及效果提升。代碼詳見 ChineseNER-people_daily_augment
NLP數據增強綜述
Paper:Data Augmentation Approaches in Natural Language Processing: A Survey
Blog:https://amitness.com/2020/05/data-augmentation-for-nlp/
數據增強可以分成三大類Paraphrasing, Nosing和Sampling,以下我們按類別分別介紹下各類的實現方案
方案一 Paraphrasing
目標:在盡可能保留句子整體語義的情況下,增加文本豐富度,包括讓每個詞擁有更加豐富的上下文context,讓相似的語義表達有更多樣的語法構成,詞匯構成等等
方案 | 粒度 | 豐富度 | 使用成本 |
---|---|---|---|
同義詞詞林 | 詞 | 低 | 低 |
詞向量 | 詞 | 中 | 低 |
語言模型 | 詞 | 高 | 中 |
規則 | 詞 | 低 | depends |
翻譯 | 任意 | 高 | 高 |
生成 | 任意 | 高 | 高 |
同義詞詞林
基於詞典中嚴格同義詞的定義,對句子中非stopword的詞匯進行隨機替換,覆蓋比較有限,但准確率很高。
中文同義詞庫
詞向量
選擇和當前文本預料相似的預訓練詞向量(word2vec/glove/fasttext etc),來生成most_similar詞作為替換詞,替換粒度可以是詞,可以是字,可以是mix,取決於你使用的詞向量本身的分詞粒度。豐富度和覆蓋率都比以上詞典更高,這里的相似詞是指上下文相似的詞匯,對詞性,實體類型等語法特征沒有嚴格約束,所以在序列標注問題中需要小心使用。
語言模型
以上詞典和向量都局限於詞袋模型,無法解決一詞多義的ambiguity問題。使用預訓練語言模型做完形填空,可以基於上下文對隨機MASK的部分進行生成。粒度可以是單詞,也可以是long span,生成的文本豐富程度更高。不過也需注意因為豐富程度高,所以要控制句子中被替換的文本占比,占比過高會導致整個語義發生變化。
規則
哈哈規則這里其實是最能搞事情的,其實尤其是針對中文,多用於特殊業務場景(搜索/對話等等),以及垂直領域 中文縮寫庫,醫學等領域詞典
- 領域詞典:例如醫學,電力工程都有類似的比賽用利用領域內同義詞典來進行樣本增強
- 簡寫/縮寫<->完整單詞: yyds—>永遠的神,哈工大<->哈爾濱工業大學
- 上下位詞替換:手機價格->華為手機價格
- 英文特有的,否定句的多種寫法,主動句變被動句等等
以上四種方案都在詞粒度進行文本增強,會遍歷句子中的每個詞,有p的概率對該詞進行替換,每個原始樣本生成N個新樣本。因為保留了原始句子的句法語法結構,應用場景相對廣泛,對局部建模的序列標注問題以及全局建模的文本分類問題都適用。下面的兩種方案會直接從句子整體進行改寫,所以不適用於序列標注類任務。
回譯
把原始樣本語言翻譯成另一種語言,再翻譯回來,如果和原始輸入不同則算一個增強的新樣本。好處是保證了語義的一致性,以及語法的正確性。不過因為句子整體變化所以不適用於所有對局部建模的任務,例如關系抽取,序列標注等。
文本生成
直接用seq2seq,生成訓練樣本的同義表達。這個方法需要依賴額外的訓練樣本,來訓練生成模型,和以上方案相比這個方案成本最高,雖然文本豐富程度最高,但不確定性也最高,所以。。。你懂的。。。
方案二 Noising
目標:增加模型穩健性,在不過多影響training error的前提下,降低模型的復雜度從而降低generalization error, 類比dropout,l2,random noise injection,etc
換位
對文本中,任意兩個詞,span,句子,段落進行位置交換得到新的文本。這個方法尤其適用於分類任務,因為多數分類任務語序信息並不十分重要。但是在序列標注任務中,因為局部label強依賴於周圍信息,因此詞粒度swapping可能會造成更嚴重的邊界問題,更推薦在更大粒度進行shuffle,例如句子之間進行shuffle。
刪除
中文刪除需要考慮你的模型輸入粒度,如果輸入粒度是詞,則按照詞粒度進行隨機刪除,避免因為刪除帶來更多的OOV。當然對長文本也可以在句子,段落級別進行刪除。對於序列標注任務,最好對整個Span粒度進行刪除,避免影響實體label,以及label周邊信息。例如存在實體'北京民政局',這時如果對‘民政局’進行隨機刪除,會改變'北京'的標簽,如果刪除實體周邊詞,可能會導致邊界識別不准。
插入
最初在EDA中insertion是隨機在句子中選擇一個非stop words的詞,把該詞的同義詞隨機插入到句子中,增強相關信息。也有一些其他場景的改良操作
- 對長文本分類任務,可以把相同標簽的其他文檔中的句子隨機抽取插入到當前文檔任意位置
- 對UGC文本,可以嘗試隨機插入語氣詞,來增加口語化表達程度
替換
這里和上述的同義詞替換不同,替換的並非同義詞,需要按照使用場景設計替換方式。
例如搜索場景,針對用戶鍵盤輸入的typo,看到過的增強方式有
- 諧音字替換: de 的 地 得 德 嘚 徳 諧音詞庫
- 常見錯別字替換: 高梁-高粱 pycorrector 中文文本糾錯工具。音似、形似錯字,中文拼音、筆畫輸入法的錯誤糾正
- 中文<->拼音(全寫/縮寫):xingfu-幸福, sz-深圳
- 英文字母鍵盤上相鄰字母的替換
對實體抽任務,可以對同類型的實體進行替換,這里可以用當前樣本的訓練集構建實體詞典,也可以用額外的實體詞庫,或者挖掘得到的領域詞庫。
Mixup
從圖像領域的mixup衍生而來,和以上的方案都不盡相同,不對文本進行增強,而是對向量空間進行融合。原始圖像的mixup在實驗中發現對原始圖片輸入進行mixup效果最好,在文本領域,對原始輸入的詞向量,或者Encoder輸出的文本向量進行融合,都有類似的嘗試。
mixup會按一定比例對兩個樣本的向量空間求和,同時對label進行融合。把label融合這里有一點難理解,其實模型實現還是對融合的兩個label各自計算cross-entropy,再對loss進行加權,只不過這個計算等價於下面寫的對label進行融合,從one-hot變成帶權重的multi-hot。
mixup確實比較黑盒,讓人難以理解它為啥會work,不過看到過一個觀點感覺比較有束縛里
提高模型泛化能力的一個方式,就是在訓練樣本沒有覆蓋的空間上控制模型的復雜程度,mixup通過插值,在訓練樣本沒有覆蓋的空間上讓模型學到一個簡單線性插值的函數
當然對比上面的數據增強方式,都在單一label內部進行增強,mixup是唯一一個對多label進行融合數據增強方案
方案三 Sampling(基於任務的樣本生成)
以上兩種方案是Task Independent,可以直接用於任何任務,而Sampling是任務依賴的,需要基於當前樣本訓練模型或者制定挖掘規則。
規則
paper中給的規則主要還是基於文本的,實際應用中有不少基於用戶行為的規則挖掘。舉幾個🌰
-
阿里媽媽:品牌廣告中的 NLP 算法實踐: 在訓練query&item短文本相關性模型時,樣本中除了少量人工標注的樣本以外,還基於用戶的搜索點擊數據挖掘了弱標注的正負樣本,這里的核心問題是未點擊的原因很復雜並不意味等價於不相關。所以他們的負樣本篩選規則是query無點擊且VSM低,以及和當前query低相關的其他query中有點擊的item
-
Query 理解和語義召回在知乎搜索中的應用: 在拓展同義詞表時用了以下的樣本生成規則
- user log:找到連續query(疑似用戶改寫),用對齊工具尋找其中可能的同義詞
- query log:找到相同點擊item對應的高搜索query,尋找其中的同義詞
- 文本規則:例如‘XXXX又名XXX’
-
KDD 2019 | 用戶視角看世界:騰訊提出ConcepT概念挖掘系統,助力推薦搜索在做概念挖掘時用了如下方式構建弱標注樣本
- 基於Bootstrap的規則模版抽取:預定義一些規則模版,例如‘十大(XXX)’,‘(XXX)排行榜’, 用這些模版取query中抽取‘XX’對應的概念,例如'[家用SUV]排行榜',在用得到concept‘家用SUV’后,再去抽取還有哪些模版包含這個概念例如'哪款家用SUV性價比最高?',得到新的規則模版'哪款(XXX)性價比最高',再去挖掘概念...
- 基於query-Title對齊:同樣使用搜索點擊數據,作者對query和點擊doc的title進行對齊,抽取首尾相同且ngram順序一致的部分,例如query=‘好看的香港僵屍電影', Title='十大經典僵屍電影',就會得到concept=‘僵屍電影’
文本生成/語言模型
基於樣本和標簽訓練生成模型,訓練一個樣本生成器。這里和Paraphasing生成模型的差異在於,這里會用到訓練樣本來訓練模型。
例如下圖中,針對文本分類任務,可以把標簽和輸入拼接成樣本,用來fintune GPT,然后用標簽和句子的前半部分來生成新的句子作為增強樣本。因為在finetune過程中使用了標簽本身,所以一定程度上解決了生成模型增強的樣本label可能發生變化的問題。
序列標注任務直接使用生成模型肯定是不行的,因為生成的文本會缺少標簽,於是DAGA用了一種很聰明的方案來構建生成模型的樣本,就是把實體詞token和token對應的實體標簽進行線性混合,例如‘倫敦’,變成‘B-LOC 倫 I-LOC 敦’。然后用了輕量級的一層LSTM來訓練生成模型,最小化next token predicition loss。生成方式也很簡單,直接從[EOS]開始迭代向后生成即可,這樣就可以得到融合了標簽和文本的增強樣本啦。非常簡單粗暴有木有,而且完全不依賴外部詞表,字典之類的資源~
Self-Training
self-training多用於存在大量未標注樣本和少量標注樣本時。主要步驟包括
- 用少量樣本訓練Teacher模型
- 用Teacher模型對大量未標注樣本進行預測得到soft label
- 把預測的樣本和標注樣本混合訓練Student模型
- 重復以上steps。
不過這里在訓練stduent模型時,需要結合confidence reweighting & regularization, contrastive learning等特殊的Noise-Aware loss計算方式來降低soft label本身噪音對student模型的效果影響。
除此之外,self-training還可以和弱標注樣本以及遠程監督結合,用於最初基於規則挖掘,或者開源數據,得到一路/幾路准確召回各不相同的弱標注樣本,這些樣本本身帶噪音,切彼此之間存在label不一致,這時可以利用teacher-student框架來求同存異。以下是序列標注任務中用到self-training的一些嘗試
- Named Entity Recognition with Small Strongly Labeled and Large Weakly Labeled Data
- BOND: BERT-Assisted Open-Domain Named Entity Recognition with Distant Supervision
- Fine-Tuning Pre-trained Language Model with Weak Supervision: A Contrastive-Regularized Self-Training Approach
- AliCG/ Fine-grained and Evolvable Conceptual Graph Construction for Semantic Search at Alibaba
NER數據增強嘗試
這里主要針對方案一二和任務無關的通用增強方案,Reference[3]在英文NER任務中選擇了同義詞替換,實體替換,相同label的token替換,句子shuffle這四種方案進行評估。主要結論就是用啥增強方案都比不用好,用多個方案比用1個方案好。換到中文NER任務,我做了些許調整
- 同義詞替換:這里我只對非實體部分進行了同義詞替換,避免對實體label產生影響。這里的同義詞沒有使用詞典而是使用了Embedding,獲取更豐富的增強文本
- 替換:實體詞典構造的部分我在people_daily訓練樣本之外加入了Cluener,MSRA的樣本,隨機對實體進行替換
- 換位:有嘗試對詞進行換位但效果並不好,因為輸入是詞粒度所以也不會對token進行換位,最終也選取了在句子級別進行隨機shuffle
在增強過程中,可以調節的參數,包括每一步增強的概率(為了實現簡單這里用了每個slot的獨立概率,也可以嘗試用聯合概率, 以及和句子長度相關的條件概率),每個原始樣本可以最多增強得到的新樣本數。需要注意增強概率設置過高會影響整個句子的語義,增強樣本數設置太高會導致全樣本中准確樣本占比過低,具體的參數設置需要在你的樣本上測試。
以下我在people daily訓練樣本上進行了增強,實體替換,同義詞替換,句子shuffle的增強概率分別是0.2,0.1,0.3, 最多增強樣本數都是3。
在BiLSTM-CRF上測試集的Span F1從83.8%->86.8%,比上一章詞表增強的各個方案中除了SoftLexicon以外的其他詞表增強效果都要好。是不是很贊!只用增強訓練樣本喲,連詞表增強需要修改NN輸入和網絡結構都不用做喲~
不過在BERT-CRF上沒有任何提升(哈哈BERT以下寸草不生不是鬧着玩的~),當然這也和我使用的增強方案本身的語義豐富程度相對有限,以及樣本本身難度較低有關。如果樣本是垂直領域的例如醫學/金融領域的實體抽取,只是實體替換在BERT上也是會有一定效果的,有相關比賽中出現過類似的方案。
關於樣本增強我們就聊這么多,其實樣本增強並非只能獨立使用,在實際應用時往往只是第一步,要想更好的使用增強樣本,有時還需要配合Weakly-Supervised Learning,或者我們第二章已經使用過的Adversarial Training等其他模型/訓練框架使用,這部分等整理好我們會單獨就無標注,少標注,弱標注,半標注樣本聊聊相關的解決方案~
Reference
- A Visual Survey of Data Augmentation in NLP
- A Survey of Data Augmentation Approaches for NLP
- An Analysis of Simple Data Augmentation ofr Named Entity Recognition
- EDA/ Easy Data Augmentation Techniques for Boosting Performance on Text Classification Tasks
- DAGA: Data Augmentatino with a Generation Approach for Low-resource Tagging Tasks
- https://zhuanlan.zhihu.com/p/146777068
- https://alanlee.fun/2021/09/12/data-augment-ner-nlp/
- https://www.zhihu.com/question/67472285