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