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