数据增强_浅析数据增强
與計算機視覺中使用圖像進行數據增強不同,NLP中文本數據增強是非常罕見的。這是因為圖像的一些簡單操作,如將圖像旋轉或將其轉換為灰度,并不會改變其語義。語義不變變換的存在使增強成為計算機視覺研究中
舉個簡單例子,我們用機器翻譯把一段英語翻譯成另一種語言,然后再翻譯回英語。這個方法已經成功的被用在Kaggle惡意評論分類競賽中。反向翻譯是NLP在機器翻譯中經常使用的一個數據增強的方法。。其本質就是快速產生一些不那么準確的翻譯結果達到增加數據的目的。
例如,如果我們把“I like this movie very much”翻譯成俄語,就會得到“Мне очень нравится этот фильм”,當我們再譯回英語就會得到“I really like this movie”。回譯的方法不僅有類似同義詞替換的能力,它還具有在保持原意的前提下增加或移除單詞并重新組織句子的能力。
回譯可使用python translate包和textblob包(少量翻譯),或者使用百度翻譯或谷歌翻譯的api通過python實現。
參考:
dupanfei1/deeplearning-util?github.com1.回譯
在這個方法中,我們用機器翻譯把一段中文翻譯成另一種語言,然后再翻譯回中文。回譯的方法不僅有類似同義詞替換的能力,它還具有在保持原意的前提下增加或移除單詞并重新組織句子的能力。
回譯可使用python translate包和textblob包(少量翻譯),或者使用百度翻譯的api通過python實現。
百度開放的翻譯接口
百度翻譯開放平臺?api.fanyi.baidu.com支持每月200萬字的免費翻譯,提供了各種語言的使用demo,本篇使用Python3調用百度API實現自然語言的翻譯,實現代碼如下。
import http.clientimport hashlibimport jsonimport urllibimport random#調用百度翻譯API將中文翻譯成英文def baidu_translate(content):appid = 'appid'secretKey = '秘鑰'httpClient = Nonemyurl = '/api/trans/vip/translate'q = contentfromLang = 'zh' # 源語言toLang = 'en' # 翻譯后的語言salt = random.randint(32768, 65536)sign = appid + q + str(salt) + secretKeysign = hashlib.md5(sign.encode()).hexdigest()myurl = myurl + '?appid=' + appid + '&q=' + urllib.parse.quote(q) + '&from=' + fromLang + '&to=' + toLang + '&salt=' + str(salt) + '&sign=' + signtry:httpClient = http.client.HTTPConnection('api.fanyi.baidu.com')httpClient.request('GET', myurl)# response是HTTPResponse對象response = httpClient.getresponse()jsonResponse = response.read().decode("utf-8") # 獲得返回的結果,結果為json格式js = json.loads(jsonResponse) # 將json格式的結果轉換字典結構dst = str(js["trans_result"][0]["dst"]) # 取得翻譯后的文本結果#print(dst) # 打印結果return dstexcept Exception as e:print('err:' + e)finally:if httpClient:httpClient.close()if __name__=='__main__':contents='百度翻譯開放平臺是百度翻譯針對廣大開發者提供的開放服務平臺'#將翻譯后的英文寫入文件with open('data/test_data_translate', 'a', encoding="utf-8") as f:translate_en = baidu_translate_1(contents) # 中文翻譯成英文f.write( 't' + translate_zh + 'n')print(translate_en)這種方法試圖在不改變句子主旨的情況下替換文本中的單詞。
- 基于詞典的替換
在這種技術中,我們從句子中隨機取出一個單詞,并使用同義詞詞典將其替換為同義詞。例如,我們可以使用WordNet的英語詞匯數據庫來查找同義詞,然后執行替換。它是一個手動管理的數據庫,其中包含單詞之間的關系。
- 基于詞向量的替換
- 在這種方法中,我們采用預先訓練好的單詞嵌入,如Word2Vec、GloVe、FastText、Sent2Vec,并使用嵌入空間中最近的相鄰單詞替換句子中的某些單詞。Jiao et al.在他們的論文“TinyBert”中使用了這種技術,以提高他們的語言模型在下游任務上的泛化能力。Wang et al.使用它來增加學習主題模型所需的tweet。
例如,你可以用三個最相似的單詞來替換句子中的單詞,并得到文本的三個變體。
取最近的鄰居是很容易的。例如,這
2. 隨機噪聲注入
這些方法的思想是在文本中加入噪聲,使所訓練的模型對擾動具有魯棒性
- 拼寫錯誤注入
在這種方法中,我們在句子中的一些隨機單詞上添加拼寫錯誤。這些拼寫錯誤可以通過編程方式添加,也可以使用常見拼寫錯誤的映射,如:https://github.com/makcedward/nlpaug/blob/master/model/spelling_en.txt。
- QWERTY鍵盤錯誤注入
該方法試圖模擬在QWERTY布局鍵盤上輸入時發生的常見錯誤,這些錯誤是由于按鍵之間的距離非常近造成的。錯誤是根據鍵盤距離注入的。
- Unigram噪聲
該方法已被Xie et al.和UDA論文所采用。其思想是用從單字符頻率分布中采樣的單詞進行替換。這個頻率基本上就是每個單詞在訓練語料庫中出現的次數。
- Blank Noising
這個方法是由Xie et al.在他們的論文中提出的。其思想是用占位符標記替換一些隨機單詞。本文使用“_”作為占位符標記。在論文中,他們將其作為一種避免特定上下文過擬合的方法,以及語言模型的平滑機制。該技術有助于提高perplexity和BLEU評分。
- 句子打亂
這是一種樸素的技術,我們將訓練文本中的句子打亂,以創建一個增強版本。
3. 半監督 Mixmatch
半監督學習方法的提出是為了更好地利用未標注的數據,減輕對于大規模標注數據集的依賴;如今也證明了這是一種強有力的學習范式。
在這篇論文中,作者們把當前不同任務中的做法為半監督學習做了統一,得到了一種新的算法——MixMatch。它的工作方式是通過 MixUp 猜測數據擴增方法產生的無標簽樣本的低熵標簽,并把無標簽數據和有標簽數據混合起來。
作者們通過實驗表明 MixMatch 在多種不同的數據集、多種不同的有標簽數據規模中都能以很大幅度領先此前的所有方法。比如,在 CIFAR 數據集上、只有 250 個標簽的情況下,作者們把錯誤率降低到了之前方法的 1/4,在 STL-10 數據集上也降低到了之前方法的一半。
作者們也展示了 MixMatch 可以在差分隱私的使用目的下,在準確率和隱私保護之間取得好得多的平衡。最后,作者們進行了對照實驗,分析了 MixMatch 方法中的哪些組件最為關鍵。
4.防止過擬合其他方法
在深度學習中,為了避免出現過擬合(Overfitting),通常輸入充足的數據量是最好的解決辦法。當數據無法達到模型的要求或者添加數據后模型由于某類數據過多導致過擬合時,以下方法也可以發揮一些作用:
- Regularization:數據量比較小會導致模型過擬合, 使得訓練誤差很小而測試誤差特別大。通過在Loss Function 后面加上正則項可以抑制過擬合的產生。缺點是引入了一個需要手動調整的hyper-parameter。
- Dropout:這也是一種正則化手段,不過跟以上不同的是它通過隨機將部分神經元的輸出置零來實現。
- Unsupervised Pre-training:用Auto-Encoder或者RBM的卷積形式一層一層地做無監督預訓練, 最后加上分類層做有監督的Fine-Tuning。
- Transfer Learning(遷移學習):在某些情況下,訓練集的收集可能非常困難或代價高昂。因此,有必要創造出某種高性能學習機(learner),使得它們能夠基于從其他領域易于獲得的數據上進行訓練,并能夠在對另一領域的數據進行預測時表現優異。
實現
要使用上述所有方法,可以使用名為nlpaug的python庫:
makcedward/nlpaug?github.com它提供了一個簡單且一致的API來應用這些技術。
總結
以上是生活随笔為你收集整理的数据增强_浅析数据增强的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 赣州市热水器怎么选购?有哪些技巧?
- 下一篇: layui的表格可以动态添加行吗_答疑分