當(dāng)訓(xùn)練數(shù)據(jù)量不充分,或者分布單一的情況下,數(shù)據(jù)增強可以快速擴充語料以避免過擬合的問題。同時,數(shù)據(jù)增強也可以提升模型的魯棒性,避免微弱的變化使得模型無法泛化到相似的語境中。
機器學(xué)習(xí)和深度學(xué)習(xí)在包括文本分類等自然語言任務(wù)達到不錯的效果,但他們 需要依賴于大規(guī)模的標(biāo)注數(shù)據(jù) ,除了直接使用小樣本學(xué)習(xí)外,顯式數(shù)據(jù)增強格外有效;
數(shù)據(jù)增強在計算機視覺中得以應(yīng)用,其可以在數(shù)據(jù)量很少的情況下提升模型的魯棒性;而在NLP中,通用的文本類型的數(shù)據(jù)增強 還沒有完全被挖掘出來 ;
本文介紹幾種比較簡單但常用的NLP數(shù)據(jù)增強方法,包括顯式和隱式兩個方面,在實驗或比賽中可以提升效果。可使用nlpaug[1]工具快速實現(xiàn)這些技術(shù)。
顯式數(shù)據(jù)增強
給定一個輸入文本,在盡可能不改變原是文本語義的情況下,微調(diào)或修改部分字符或詞可以實現(xiàn)快速的增強,主要包括如下幾種類型:
同義詞替換 (SR) :隨機挑選n個 非停用詞 ,分別根據(jù)其 同義詞表 隨機替換一個同義詞;

對于分類、回歸等任務(wù),可以使用反義詞表替換所有原始詞性的詞,實現(xiàn)負(fù)采樣,也是一種數(shù)據(jù)增強方法。但使用同義詞或反義詞表進行替換時,很難保證文本的語義是否符合預(yù)期。
隨機插入 (RI) :在句子中隨機找到一個 非停用詞 ,并隨機選擇其對應(yīng)的一個同義詞,將該同義詞插入句子中的 隨機位置 。重復(fù)執(zhí)行 n n n 次;
隨機交換 (RS) :在句子中隨機挑選兩個詞,并 交換位置 ,重復(fù)執(zhí)行 n n n 次;
隨機刪除 (RD) :對每個詞,有一定概率 p p p 進行 刪除 ;
標(biāo)點插入 (PI) :隨機挑選若干位置,并分別隨機插入 標(biāo)點符號 ;
由于輸入的文本長度長短不一,直覺上希望較長的句子 n 較大,因此通過一個參數(shù) α 控制,即 ,對于 RD ,概率 。
本文對標(biāo)點插入 PI 進行了實現(xiàn),以中文為例,如下所示:
借助Spacy分詞工具,需要安裝Spacy,使用Spacy進行分詞、分析詞性,根據(jù)分詞和詞性選擇需要插入的標(biāo)點。
標(biāo)點符號可以選擇 ,。???;“ ” 等。
importnumpyasnp importspacy importrandom fromtypingimportDict fromtqdmimporttqdm classDataAugmentation: def__init__(self): self.nlp=spacy.load('zh_core_web_sm') deffit(self,examples:Dict[str,list]): self.examples=examples#{'text':[],'label':[],'id':[]} #簡單的數(shù)據(jù)增強:增加標(biāo)點符號 text_list=self.examples['text'] label_list=self.examples['label'] id_list=self.examples['id'] aug_text_list,aug_label_list,aug_id_list=[],[],[] pun=[',','。','?','!',';','"'] foreiintqdm(range(len(text_list))): text=text_list[ei] label=label_list[ei] id=label_list[ei] doc=self.nlp(text)#spacy分詞 token_list,pos_list=[],[] fortokenindoc: token_list.append(token.text) pos_list.append(token.pos_) iflen(token_list)-1>=1: num=0 state=False whilenum5: ????????????????????num?+=?1 ????????????????????insert_position?=?random.randint(1,?len(token_list)?-?1) ????????????????????if?token_list[insert_position]?in?pun?or?token_list[insert_position?-?1]?in?pun: ????????????????????????continue ????????????????????token_list.insert(insert_position,?',')?#?隨機插入一個標(biāo)點符號 ????????????????????pos_list.insert(insert_position,?'PUN')?#?隨機插入一個標(biāo)點符號 ????????????????????state?=?True ????????????????????break ????????????????if?state?is?True: ????????????????????augment_text?=?''.join(token_list) ????????????????????#?print('origin?text:?{}'.format(text)) ????????????????????#?print('augmen?text:?{}'.format(augment_text)) ????????????????????aug_text_list.append(augment_text) ????????????????????aug_label_list.append(label) ????????????????????aug_id_list.append(len(id_list)?+?ei?+?1) ????????return?{'text':?text_list?+?aug_text_list,?'label':?label_list?+?aug_label_list,?'id':?id_list?+?aug_id_list} if?__name__?==?'__main__': ?data_augmentation?=?DataAugmentation() ?dataset?=?{'text':?['今天的天氣很好,非常適合去旅游。'],?'label':?[1],?'id':?[0]} ?dataset?=?data_augmentation.fit(dataset) ?print(dataset) ?
演示效果:
除了前述的幾種方法,也可以采用如下幾種新的策略:
單詞縮寫、全寫:例如可以建立一個詞表,對所有存在簡寫的詞進行替換,例如 It is可以替換為 It’s,England可替換為UK.等;
錯誤拼寫 (WS) :有時候為了提高魯棒性,會故意將文本中的單詞或字符使用錯誤拼寫的單詞或字符進行替換,在不影響語義的條件下 引入少量噪聲 。例如 I like this book可以替換為 I like thes book。對于中文,也可以構(gòu)建confusion set,替換字形或字音相似的詞,例如“上海是經(jīng)濟中心”可以替換為“上海時經(jīng)濟中心”。但注意需要保證原始語義。
統(tǒng)計特征 (SF) :通常很多詞在大規(guī)模語料中具有一定的統(tǒng)計特征,例如TF-IDF、互信息量等。在使用TF-IDF和互信息量時,可選擇值較小的進行隨機替換。
隱式數(shù)據(jù)增強
因為直接對原是文本進行數(shù)據(jù)增強,很難保證維持原始的文本語義,因此可以通過在語義空間上進行隱式數(shù)據(jù)增強,簡單列出幾種方法:
詞向量替換 :通過word2vec或GloVe預(yù)訓(xùn)練的詞向量獲得相似的詞,對于給定某個詞,則可以直接隨機選擇相似的詞的詞向量進行替換;
詞向量的原型向量: 通過word2vec或GloVe預(yù)訓(xùn)練的詞向量,可以通過對所有相似的詞或token的embedding進行平均池化。一般認(rèn)為語義相似的詞在語義空間內(nèi)會聚集在一起,因此其平均的詞向量可以認(rèn)為是這些相似語義詞的 原型向量(prototype embedding) ,原型向量可以作為隱式增強表征;
Dropout: 在對文本使用RNN、CNN或BERT等進行表征后,得到融合上下文信息的embedding,可以采用 隨機dropout法 。具體地說,假設(shè)一個embedding是 [0.1, 0.4, 0.2, -0.5], 隨機dropout旨在隨機挑選一個元素替換為0,例如挑選第2個位置的元素替換為0,變?yōu)?[0.1, 0.0, 0.2, -0.5]。隨機dropout參考了計算機視覺領(lǐng)域內(nèi)對圖像表征后的feature map進行mask的操作(在語義特征上添加噪點)以實現(xiàn)增強;
語言模型 Masked Language Modeling(MLM): MLM是BERT等預(yù)訓(xùn)練語言模型在大規(guī)模語料上自監(jiān)督訓(xùn)練目標(biāo),其旨在隨機挖掉一個文本中的token并讓模型預(yù)測該詞。由于大規(guī)模訓(xùn)練,使得模型可以預(yù)測出許多相似的結(jié)果,例如“I like this book because it is funny.”,我們可以讓MLM生成與“funny”具有同等語義的詞:

機器翻譯: 基于機器翻譯的方法,將原始文本翻譯為另一種語言,并再次進行回譯。該方法比較類似計算機視覺中的自編碼器。但該方法需要率先在領(lǐng)域數(shù)據(jù)上進行訓(xùn)練,且依賴于大量的平行語料,較為繁瑣;
文本生成: 基于生成的方法可以在不改變原始語義的前提下生成出上述無法顯式構(gòu)造的新文本。但基于生成的方法依然依賴于所屬領(lǐng)域的訓(xùn)練數(shù)據(jù)。
如果需要增強的文本所屬一個新的領(lǐng)域(例如醫(yī)療、生物),基于翻譯和生成的方法則需要先在該領(lǐng)域的相關(guān)語料上進行訓(xùn)練,得到較為魯棒的翻譯或生成模型。但數(shù)據(jù)增強又是為了增強數(shù)據(jù)量,沒有充分又無法訓(xùn)練翻譯或生成模型,產(chǎn)生矛盾。因此通常對新的領(lǐng)域或任務(wù)上不會首選這兩種方法。
對抗訓(xùn)練: 引入對抗樣本實現(xiàn)數(shù)據(jù)增強,例如下圖(左)是少量樣本時學(xué)習(xí)的決策邊界,對每個樣本在一定范圍內(nèi)進行擾動攻擊,使得在直觀上無法辨別,但在語義空間內(nèi)則會影響樣本的決策,例如下圖(中),五角星則代表對抗樣本。因此圖(右)引入對抗訓(xùn)練目標(biāo)以修改決策邊界。通常對抗訓(xùn)練目標(biāo)可以是對增強的樣本偽造其標(biāo)簽以增強魯棒性。

對比學(xué)習(xí): 如果樣本少,那就盡可能學(xué)習(xí)這些樣本之間的差異。對比學(xué)習(xí)旨在構(gòu)建樣本對來解決訓(xùn)練困難問題,因為構(gòu)建了樣本對,所以間接地增加了數(shù)據(jù)量。雖然對比學(xué)習(xí)最初目標(biāo)不是為了數(shù)據(jù)增強,但可以通過添加對比學(xué)習(xí)loss來隱式地提升魯棒性;
自監(jiān)督輔助任務(wù): 如果目標(biāo)NLP數(shù)據(jù)量少,那么可以直接引入大規(guī)模無監(jiān)督語料(例如Wikipedia),并在具體任務(wù)訓(xùn)練時添加輔助學(xué)習(xí)目標(biāo),通過語義層面上實現(xiàn)增強;
例如在進行文本分類任務(wù)上時,除了文本分類損失函數(shù)外,還可以添加類似MLM的輔助任務(wù),或者添加額外的多任務(wù)信息
知識圖譜增強(遠程監(jiān)督法): 遠程監(jiān)督可以快速地啟發(fā)式構(gòu)建大規(guī)模標(biāo)注數(shù)據(jù),目前在信息抽取任務(wù)上使用廣泛,其旨在通過一個已有的知識圖譜或規(guī)則來直接對無監(jiān)督的語料進行標(biāo)注,但遠程監(jiān)督方法容易引入大量噪聲。
在關(guān)系抽取任務(wù)中,通過知識庫中已有的三元組(例如<喬布斯,創(chuàng)始人,蘋果>),來標(biāo)注一批新的實體對語料。但對于文本“喬布斯吃了一個蘋果”而言,遠程監(jiān)督法依然會標(biāo)注為“創(chuàng)始人”,但顯然這是噪聲。對于噪聲,則可以通過一些規(guī)則,或Attention的方法解決。
半監(jiān)督方法: 半監(jiān)督法旨在對少量有標(biāo)簽數(shù)據(jù)上進行訓(xùn)練,然后在無標(biāo)簽數(shù)據(jù)上進行推理,并獲得高置信度的偽標(biāo)簽數(shù)據(jù)后,再進行訓(xùn)練。因此偽標(biāo)簽數(shù)據(jù)可以作為數(shù)據(jù)增強部分語料,但依然容易引入噪聲。
對于噪聲部分,則可以采用幾種策略:(1)提高置信度閾值,(2)多個不同的模型共同預(yù)測偽標(biāo)簽,取全部預(yù)測正確的作為可信樣本;(3)偽標(biāo)簽數(shù)據(jù)回測評估:如果加入偽標(biāo)簽的數(shù)據(jù)后效果變差,則需要剔除或更改標(biāo)簽。
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7314瀏覽量
93918 -
語言模型
+關(guān)注
關(guān)注
0文章
570瀏覽量
11246 -
nlp
+關(guān)注
關(guān)注
1文章
491瀏覽量
23182
原文標(biāo)題:NLP中的數(shù)據(jù)增強方法!
文章出處:【微信號:zenRRan,微信公眾號:深度學(xué)習(xí)自然語言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄

幾種常用的NLP數(shù)據(jù)增強方法
評論