數(shù)據(jù)增強(qiáng)可以算作是做深度學(xué)習(xí)算法的一個小trick。該介紹主要出自論文:EDA: Easy Data AugmentaTIon?Techniques for BoosTIng Performance on Text ClassificaTIon Tasks[1]
論文中的中文文本分類數(shù)據(jù)增強(qiáng)的代碼實現(xiàn)可參考EDA_NLP_for_Chinese[2],當(dāng)然在實際使用中可以根據(jù)具體情況再做修改。文中介紹的代碼是我個人對該源碼的根據(jù)我個人書寫習(xí)慣進(jìn)行的修改。
論文簡介主要內(nèi)容
這篇論文中作者提出所謂的簡單數(shù)據(jù)增強(qiáng)(Easy Data AugmentaTIon, EDA),包括了四種方法:「同義詞替換、隨機(jī)插入、隨機(jī)交換、隨機(jī)刪除」。作者使用了CNN和RNN分別在五種不同的文本分類任務(wù)中做了實驗,實驗表明,EDA提升了分類效果。作者也表示,平均情況下,僅使用50%的原始數(shù)據(jù),再使用EDA進(jìn)行數(shù)據(jù)增強(qiáng),能取得和使用所有數(shù)據(jù)情況下訓(xùn)練得到的準(zhǔn)確率。
文中作者提出「通用的」NLP數(shù)據(jù)增強(qiáng)技術(shù),命名為EDA。同時作者表示,他們是第一個給數(shù)據(jù)增強(qiáng)引入文本編輯技術(shù)的人。EDA的提出也是一定程度上受計算機(jī)視覺上增強(qiáng)技術(shù)的啟發(fā)而得到。下面詳細(xì)介紹EDA的四個方法:
對于訓(xùn)練集中的每個句子,執(zhí)行下列操作:
同義詞替換(Synonym Replacement, SR):從句子中隨機(jī)選取n個不屬于停用詞集的單詞,并隨機(jī)選擇其同義詞替換它們;
隨機(jī)插入(Random Insertion, RI):隨機(jī)的找出句中某個不屬于停用詞集的詞,并求出其隨機(jī)的同義詞,將該同義詞插入句子的一個隨機(jī)位置。重復(fù)n次;
隨機(jī)交換(Random Swap,?RS):隨機(jī)的選擇句中兩個單詞并交換它們的位置。重復(fù)n次;
隨機(jī)刪除(Random Deletion, RD):以 的概率,隨機(jī)的移除句中的每個單詞;
這些方法里,只有SR曾經(jīng)被人研究過,其他三種方法都是本文作者首次提出。
值得一提的是,長句子相對于短句子,存在一個特性:長句比短句有更多的單詞,因此長句在保持原有的類別標(biāo)簽的情況下,能吸收更多的噪聲。為了充分利用這個特性,作者提出一個方法:基于句子長度來變化改變的單詞數(shù),換句話說,就是不同的句長,因增強(qiáng)而改變的單詞數(shù)可能不同。具體實現(xiàn):對于SR、RI、RS,遵循公式: = * , 表示句長, 表示一個句子中需要改變的單詞數(shù)的比例。在RD中,讓 和 相等。另外,每個原始句子,生成 個增強(qiáng)的句子。
相關(guān)實驗
實驗設(shè)置作者使用了5個不同的Benchmark數(shù)據(jù)集,就有了5種文本分類任務(wù),使用了兩個state-of-the-art文本分類的模型:LSTM-RNN[3]和CNNs[4]。并將有無EDA作為對比,同時因為欲得到EDA在小數(shù)據(jù)集上的實驗效果,將訓(xùn)練數(shù)據(jù)集大小分為500、2000、5000、完整這4個量級。每個訓(xùn)練效果是在5個文本分類任務(wù)上的效果均值。
實驗結(jié)果在完整的數(shù)據(jù)集上,平均性能提升0.8%;在大小為500的訓(xùn)練集上,提升3.0%。具體見如下:
作者指出,EDA在小訓(xùn)練集上有更好的性能效果。若使用完整的訓(xùn)練集數(shù)據(jù),不使用EDA的情況下,最佳的平均準(zhǔn)確率達(dá)到88.3%。若使用50%的訓(xùn)練集數(shù)據(jù)并且使用EDA的情況下,最佳的平均準(zhǔn)確率達(dá)到88.6%,超過前述情況。
問題總結(jié)問題1:若句子中有多個單詞被改變了,那么句子的原始標(biāo)簽類別是否還會有效?
作者做了實驗:首先,使用RNN在一未使用EDA過的數(shù)據(jù)集上進(jìn)行訓(xùn)練;然后,對測試集進(jìn)行EDA擴(kuò)增,每個原始句子擴(kuò)增出9個增強(qiáng)的句子,將這些句子作為測試集輸入到RNN中;最后,從最后一個全連接層取出輸出向量。應(yīng)用t-SNE技術(shù),將這些向量以二維的形式表示出來。實驗結(jié)果就是,增強(qiáng)句子的隱藏空間表征緊緊環(huán)繞在這些原始句子的周圍。作者的結(jié)論是,句子中有多個單詞被改變了,那么句子的原始標(biāo)簽類別就可能無效了。
對于EDA中的每個方法,單獨提升的效果如何?
作者做實驗得出的結(jié)論是,對于每個方法在小數(shù)據(jù)集上取得的效果更明顯。 如果太大的話,甚至?xí)档湍P捅憩F(xiàn)效果,=0.1似乎是最佳值。
如何選取合適的增強(qiáng)語句個數(shù)?
在較小的數(shù)據(jù)集上,模型容易過擬合,因此生成多一點的語料能取得較好的效果。對于較大的數(shù)據(jù)集,每句話生成超過4個句子對于模型的效果提升就沒有太大幫助。因此,作者推薦實際使用中的一些參數(shù)選取如下表所示,其中, :每個原始語句的增強(qiáng)語句個數(shù);:訓(xùn)練集大小
EDA提高文本分類的效果的原理是什么?
生成類似于原始數(shù)據(jù)的增強(qiáng)數(shù)據(jù)會引入一定程度的噪聲,有助于防止過擬合;
使用EDA可以通過同義詞替換和隨機(jī)插入操作引入新的詞匯,允許模型泛化到那些在測試集中但不在訓(xùn)練集中的單詞;
為什么使用EDA而不使用語境增強(qiáng)、噪聲、GAN和反向翻譯?
上述的其它增強(qiáng)技術(shù)作者都希望你使用,它們確實在一些情況下取得比EDA較好的性能,但是,由于需要一個深度學(xué)習(xí)模型,這些技術(shù)往往在其取得的效果面前,付出的實現(xiàn)代價更高。而EDA的目標(biāo)在于,使用簡單方便的技術(shù)就能取得相接近的結(jié)果。
EDA是否有可能會降低模型的性能?
確實有可能。原因在于,EDA有可能在增強(qiáng)的過程中,改變了句子的意思,但其仍保留原始的類別標(biāo)簽,從而產(chǎn)生了標(biāo)簽錯誤的句子。
中文文本分類數(shù)據(jù)增強(qiáng)代碼實現(xiàn)代碼實現(xiàn)中是需要jieba分詞,停用詞,以及一個提供同義詞的包(Synonyms[5]),本代碼參考地址:ChineseTextEDA[6]
使用方式
本代碼暫時不考慮上傳到pip上,本代碼只需要進(jìn)入chinese-text-eda目錄下后,執(zhí)行:
python?setup.py install
即可安裝使用。也可以將代碼復(fù)制到項目錄下使用。
在中文文本分類過程中需要使用數(shù)據(jù)增強(qiáng)的方式能夠在數(shù)據(jù)量少的情況起到一定效果。
固定格式數(shù)據(jù)增強(qiáng)
該種方式提供只需要將待增強(qiáng)的數(shù)據(jù)處理成如下格式,然后在書寫一個py腳本,在命令行運(yùn)行即可。
label sentence
其中數(shù)據(jù)的標(biāo)簽在前,文本在后,標(biāo)簽和文本之間使用\t(tab)分割。
使用方式如下,python 文件為example.py
from eda import SimpleEDAEnhancesed = SimpleEDAEnhance()sed.simple_eda_enhance()
然后在控制臺中輸入相關(guān)參數(shù)即可。控制臺輸入樣例如下:
python example.py --input train.txt --output eda_train.txt --num_aug 2 --alpha 0.2
相關(guān)參數(shù)說明:
--input: 原始數(shù)據(jù)的輸入文件, must
--output: 增強(qiáng)數(shù)據(jù)后的輸出文件, optional,如果未填寫,會在input目錄下生成一個eda開頭的結(jié)果
--num_aug: 一條數(shù)據(jù)增強(qiáng)幾條數(shù)據(jù),optional, default 9
--alpha: 每條語句中將會被改變的單詞數(shù)占比, optional, default 0.1
自定義格式數(shù)據(jù)增強(qiáng)
有時數(shù)據(jù)格式相對復(fù)雜,這時需要我們將增強(qiáng)的方法嵌入到數(shù)據(jù)處理的程序中,這時可以參考如下方法, 案例代碼如下,這也是實例化EDA這個類
其中,EDA初始化類的參數(shù)如下:
num_aug: 一條數(shù)據(jù)增強(qiáng)到多少條,optional, default 9
stop_words: 增強(qiáng)過程使用的停用詞, optional, default use hit提供的停用詞
stop_words_type: 停用詞類型,optional, select scope: [“hit”, “cn”, “baidu”, “scu”]
EDA類中的數(shù)據(jù)增強(qiáng)方法的分?jǐn)?shù)如下:
sentence: must, 待增強(qiáng)的語句;
alpha_sr: default=0.1,近義詞替換詞語的比例
alpha_ri: default=0.1,隨機(jī)插入詞語個數(shù)占語句詞語數(shù)據(jù)的比例
alpha_rs: default=0.1,隨機(jī)交換詞語個數(shù)占語句詞語數(shù)據(jù)的比例
p_rd: default=0.1,隨機(jī)刪除詞語個數(shù)占語句詞語數(shù)據(jù)的比例
一個簡單的測試如下:
from ChineseTextEDA.eda import EDAeda = EDA()res = eda.eda(“我們就像蒲公英,我也祈禱著能和你飛去同一片土地”)print(res)
結(jié)果如下:
[‘我們 就 像 蒲公英 , 我 也 天主 著 能 和 你 飛去 同 一片 土地’, ‘我們 就 像 蒲公英 , 我 也 祈禱 著 能 和 你 飛去 同 一片 土地’, ‘我們 就 像 蒲公英 , 我 也 祈禱 和 能 著 你 飛去 同 一片 土地’, ‘我們 就 像 蒲公英 , 我 也 祈禱 著 聚花 能 和 你 飛去 同 一片 土地’, ‘我們 就 像 蒲公英 , 我 也 祈禱 著 能 和 飛去 你 同 一片 土地’, ‘我們 就 像 蒲公英 , 我 也 祈禱 能 和 你 飛去 同 一片 土地’, ‘我們 就 像 , 我 也 祈禱 著 能 和 你 飛去 同 一片 土地’, ‘我們 就 像 蒲公英 , 我 也 祈禱 著 能 和 你 飛去 同 假如 一片 土地’, ‘我們 就 像 蒲公英 , 我 也 祈禱 著 能 和 你 直奔 同 一片 土地’, ‘我們 就 像 蒲公英 , 我 也 祈禱 著 能 和 你 飛去 同 一片 土地’]