模型提效的另一條路 資料增強

2021-10-19 14:20:07 字數 2526 閱讀 4156

nlp提效,除了選擇合適的模型,就是資料增強了

如何用有限的資料做出最佳的效果?除了乙個優秀的模型以外,最有效的方法就是做資料增強了。自然語言處理(nlp)不同於影象,可以做裁剪,反轉,縮放等操作來增強,而是有文字特別的處理方式。這篇**《coda: contrast-enhanced and diversitypromoting data augmentation for natural language understanding》提出的coda方案號稱能在roberta-large上平均提公升2.2%的效果,那我們就來看看這篇到底提出了哪些方法吧。

這篇**主要**如何在文字分類做資料增強,當然這些資料增強的方法一樣可以用在其他nlp任務中。

一句話概括資料增強,就是把原有訓練集合:

通過某種變換,轉變成新的訓練集合:

我們用這兩個集合的資料,去學習引數:

back-translate(回譯)很容易理解,如上圖,英語翻譯成德語又翻譯回英語,作為訓練樣本。

adversarial training(對抗訓練):對抗訓練方法被用於文字資料提公升模型的魯棒性。對抗訓練不需要任何額外的領域知識,只需要模型本身產出樣本,這些樣本都是模型最容易**錯的樣本。下面是兩個最常用的對抗訓練的loss。

其實就是要找到模型認為相似的樣本加入到模型中訓練,但是在實際使用時,我們很難獲得準確的對抗樣本,因此可以用模型梯度構建相似的對抗樣本,如下公式所示:

上述資料增強方法思路其實都很一致,找到已有樣本的相似樣本,訓練目標也較為一致。這時候思考乙個問題,不同的資料增強方法是等同的,還是互補的呢?是否可以混合所有資料增強方法提公升模型泛化能力呢?cv上已經證明是有效的,應用到文字就難多了,對文字輕微的可能會帶來語意上的巨大差異。

這3種其實沒啥好說的,字面意思。

(a)就是在乙個mini-batch中,採用乙個隨機的資料增強方法把x變為x',

(b)是混合插值,是對兩個樣本的embedding ei和ej做操作,其中a是符合beta分布。

(c)就是把x用一系列的資料增強方法變成x'。

值得注意的是sequential stacking的方式,牽涉到各個增強方法的順序,並不是所有順序都是合理的,比如我們不可能在生成對抗訓練樣本後,去做回譯,正確的融合方式如下:

這種融合方式,可以簡單的用下面的公式表示:

先用xi做回譯得到xi',然後找到模型最難分辨的對抗樣本,最後計算原樣本和對抗樣本的loss。我們可以看到loss有3項,第一項就是正常的交叉熵,第二項是對抗loss,第三項是一致性的loss,即樣本和對抗樣本理應相似度較高,這裡rcs定義如下:

我們看上述loss的3項,反應了我們對抗樣本xi要和xi'預估結果要一致,然而卻沒反應xi'要和xj不一致。為了充分利用資料增強後的資料,**又提出了對抗學習目標。考慮到xi'是由xi生成的,因此模型應該學到每個資料增強樣本的「爸爸」是誰。如下圖所示:

memory是用來儲存歷史embeding的,作為大量的負樣本。為了避免encoder更新過快(會導致embeding不一致),因此提出momentum key encoder,該 encoder不是通過梯度更新引數的,而是通過下式:

當有乙個樣本xi,增強樣本xi',我們會得到3個embedding:

新的對抗學習目標如下式:

其中t是溫度,m就是memory bank,該式表達的意思也很簡單,就是樣本xi和增強樣本xi'和momentum key encoder產出的ki的相似度,要高於memory bank的負樣本。和之前的loss一整合,就成了我們最終的學習目標:

多種增強方式混搭的效果比較好,採用回譯+對抗訓練stack方式取得了最佳效果。關於調參的細節可以看原文。我們著重看下採用資料增強帶來的模型提效增益,從下圖可以看到,用coda的效果,還是很顯著的:

一條路走不通了,就走另一條

今天看原始碼的時候,對於setcontentview 我ctrl 滑鼠左鍵,點不過去,我還以為是我的stadio出現問題了。我有問題,立馬解決。就找人請教,他們都會幫助我,真好。那麼多大神。很喜歡這個環境,10多個android開發。真的。後來才知道,他們做了乙個對映,就是以前的專案,裡面的r檔案,...

平庸是我們選擇的最後一條路

平庸是我們選擇的最後一條路 文 劉楊,中國企業家合作協會 中國企業家聯誼會秘書長 在討論這個議題之前,我首先宣告,本文更多適合年輕讀者分享,特別那些是還沒有圓夢的 走在路上 在路上彷徨的那群人。人的一生,都是在不斷選擇,通過乙個個選擇,可能成功,可能失敗,可能幸福,可能沉淪。當我們已經選擇了多次後,...

SQL分組排序後取每組最新一條資料的另一種思路

在hibernate框架和mysql oracle兩種資料庫相容的專案中實現查詢每個id最新更新的一條資料。之前工作中一直用的mybatis oracle資料庫這種,一般寫這類分組排序取每組最新一條資料的sql都是使用row number over 函式來實現 例如 select t1.from s...