又是Dropout两次!这次它做到了有监督任务的SOTA
?PaperWeekly 原創(chuàng) ·?作者?|?蘇劍林
單位?|?追一科技
研究方向?|?NLP、神經(jīng)網(wǎng)絡(luò)
關(guān)注 NLP 新進(jìn)展的讀者,想必對四月份發(fā)布的 SimCSE [1] 印象頗深,它通過簡單的“Dropout 兩次”來構(gòu)造正樣本進(jìn)行對比學(xué)習(xí),達(dá)到了無監(jiān)督語義相似度任務(wù)的全面 SOTA。無獨有偶,最近的論文《R-Drop: Regularized Dropout for Neural Networks》提出了 R-Drop,它將“Dropout兩次”的思想用到了有監(jiān)督任務(wù)中,每個實驗結(jié)果幾乎都取得了明顯的提升。此外,筆者在自己的實驗還發(fā)現(xiàn),它在半監(jiān)督任務(wù)上也能有不俗的表現(xiàn)。
小小的“Dropout兩次”,居然跑出了“五項全能”的感覺,不得不令人驚訝。本文來介紹一下 R-Drop,并分享一下筆者對它背后原理的思考。
論文標(biāo)題:R-Drop: Regularized Dropout for Neural Networks
論文鏈接:https://arxiv.org/abs/2106.14448
代碼鏈接:https://github.com/dropreg/R-Drop
SimCSE
《中文任務(wù)還是 SOTA 嗎?我們給 SimCSE 補充了一些實驗》[1] 中,我們已經(jīng)對 SimCSE 進(jìn)行了介紹。簡單來說,SimCSE 是 NLP 的一種對比學(xué)習(xí)方案,對比學(xué)習(xí)的標(biāo)準(zhǔn)流程是同一個樣本通過不同的數(shù)據(jù)擴(kuò)增手段得到的結(jié)果視為正樣本對,而 batch 內(nèi)的所有其他樣本視為負(fù)樣本,然后就是通過 loss 來縮小正樣本的距離、拉大負(fù)樣本的距離了。
所以難度主要集中在數(shù)據(jù)擴(kuò)增手段上。對于 NLP 來說,我們很難人工構(gòu)建保證語義不變的數(shù)據(jù)擴(kuò)增,所以 SimCSE 干脆不人工進(jìn)行數(shù)據(jù)擴(kuò)增,而是通過“Dropout 兩次”的方式來得到同一個輸入的不同特征向量,并將它們視為正樣本對。奇怪的是,這個簡單的“Dropout 兩次”構(gòu)造正樣本,看上去是一種“無可奈何”的妥協(xié)選擇,但消融實驗卻發(fā)現(xiàn)它幾乎優(yōu)于所有其他數(shù)據(jù)擴(kuò)增方法,令人驚訝之余又讓人感嘆“大道至簡”。
▲ SimCSE示意圖
在實現(xiàn)上,SimCSE 也相當(dāng)簡單,所謂“Dropout 兩次”,只需要將樣本重復(fù)地輸入到模型,然后計算相應(yīng)的 loss 就行了,如上圖所示。由于 Dropout 本身的隨機(jī)性,每個樣本的 Dropout 模式都是不一樣的,所以只要單純地重復(fù)樣本,就可以實現(xiàn)“Dropout 兩次”的效果。
R-Drop
從結(jié)果上來看,SimCSE 就是希望 Dropout對模型結(jié)果不會有太大影響,也就是模型輸出對 Dropout 是魯棒的。所以很明顯,“Dropout 兩次”這種思想是可以推廣到一般任務(wù)的,這就是 R-Drop(Regularized Dropout)。
2.1 分類問題
在筆者看來,R-Drop 跟 SimCSE 是高度相關(guān)的,甚至 R-Drop 應(yīng)該是受到了 SimCSE 啟發(fā)的,不過 R-Drop 論文并沒有引用 SimCSE,所以這就比較迷了。
▲?R-Drop示意圖
具體來說,以分類問題為例,訓(xùn)練數(shù)據(jù)為 ,模型為 ,每個樣本的 loss 一般是交叉熵:
在“Dropout 兩次”的情況下,其實我們可以認(rèn)為樣本已經(jīng)通過了兩個略有不同的模型,我們分別記為 和 。這時候 R-Drop 的 loss 分為兩部分,一部分是常規(guī)的交叉熵:
另一部分則是兩個模型之間的對稱 KL 散度,它希望不同 Dropout 的模型輸出盡可能一致:
最終 loss 就是兩個 loss 的加權(quán)和:
也就是說,它在常規(guī)交叉熵的基礎(chǔ)上,加了一項強(qiáng)化模型魯棒性正則項。
2.2 一般形式
可能有些讀者會問非分類問題應(yīng)該將 KL 項替換為什么,事實上原論文并沒有在非分類問題上進(jìn)行實驗,不過這里可以補充一下。我們可以留意到:
所以,上述 只不過是 KL 散度的反復(fù)使用,它的一般形式是:
因此對于非分類問題,我們將 換成適當(dāng)?shù)亩攘?#xff08;而不是 KL 散度)即可。
實驗效果
我們先來看看 R-Drop 的實驗結(jié)果。
R-Drop 的主要超參有三個:batch_size、 和 Dropout 概率。batch_size 一 般取決于我們的算力,對個人來說調(diào)整空間不大;原論文的 從 都有,筆者自己的實驗中,則取了 ,也沒細(xì)調(diào)。至于 Dropout的概率,跟筆者在《中文任務(wù)還是 SOTA 嗎?我們給 SimCSE ?補充了一些實驗》[1] 所選的一樣,設(shè)為 0.3 效果比較好。
3.1 論文報告
說實話,原論文所報告的 R-Drop 的效果是相當(dāng)讓人驚艷的,這也是筆者不得不要介紹一波 R-Drop 的主要原因。原論文在 NLU、NLG、CV 的分類等多種任務(wù)上都對 R-Drop 做了對比實驗,大部分實驗效果都稱得上“明顯提升”。
官方實現(xiàn):https://github.com/dropreg/R-Drop
下面截圖一部分實驗結(jié)果:
▲?R-Drop在機(jī)器翻譯任務(wù)上的效果
▲?R-Drop在GLUE任務(wù)上的效果
特別地,在機(jī)器翻譯任務(wù)上,簡單的“Transformer + R-Drop”超過了其他更加復(fù)雜方法的效果:
▲?機(jī)器翻譯任務(wù)上不同方法的對比
論文還包括自動摘要、語言模型、圖像分類等實驗,以及關(guān)于超參數(shù)的一些消融實驗,大家仔細(xì)看原論文就好。總的來說,R-Drop 的這份“成績單”,確實足以讓人為之點贊了。
3.2 個人嘗試
當(dāng)然,筆者堅持的觀點是“沒有在中文測試過的模型是沒有靈魂的”,一般情況下筆者都是在中文任務(wù)上親自嘗試過之后,才會寫作分享。
個人實現(xiàn):https://github.com/bojone/r-drop
有中文監(jiān)督任務(wù)上,筆者實驗了兩個文本分類任務(wù)(CLUE 榜單的 IFLYTEK 和 TNEWS)。
和一個文本生成任務(wù)(CSL 標(biāo)題生成,參考 Seq2Seq 中 Exposure Bias 現(xiàn)象的淺析與對策):
可以看到,R-Drop 的結(jié)果足以 PK 在對抗訓(xùn)練淺談:意義、方法和思考(附Keras 實現(xiàn))中介紹的著名正則化手段“對抗訓(xùn)練”和“梯度懲罰”了。
3.3 實現(xiàn)要點
相比于對抗學(xué)習(xí)等復(fù)雜正則化方法,R-Drop 的實現(xiàn)難度可謂是相當(dāng)?shù)土?#xff0c;這里以 bert4keras 為例,簡單介紹一下如何將一個普通的訓(xùn)練腳本改為帶 Dropout 的模式。
首先,是數(shù)據(jù)生成部分,改動如下:
class?data_generator(DataGenerator):"""數(shù)據(jù)生成器"""def?__iter__(self,?random=False):batch_token_ids,?batch_segment_ids,?batch_labels?=?[],?[],?[]for?is_end,?(text,?label)?in?self.sample(random):token_ids,?segment_ids?=?tokenizer.encode(text,?maxlen=maxlen)#?batch_token_ids.append(token_ids)#?batch_segment_ids.append(segment_ids)#?batch_labels.append([label])for?i?in?range(2):batch_token_ids.append(token_ids)batch_segment_ids.append(segment_ids)batch_labels.append([label])#?if?len(batch_token_ids)?==?self.batch_size?or?is_end:if?len(batch_token_ids)?==?self.batch_size?*?2?or?is_end:batch_token_ids?=?sequence_padding(batch_token_ids)batch_segment_ids?=?sequence_padding(batch_segment_ids)batch_labels?=?sequence_padding(batch_labels)yield?[batch_token_ids,?batch_segment_ids],?batch_labelsbatch_token_ids,?batch_segment_ids,?batch_labels?=?[],?[],?[]然后,自定義一個新 loss:
from?keras.losses?import?kullback_leibler_divergence?as?klddef?categorical_crossentropy_with_rdrop(y_true,?y_pred):"""配合上述生成器的R-Drop?Loss其實loss_kl的除以4,是為了在數(shù)量上對齊公式描述結(jié)果。"""loss_ce?=?K.categorical_crossentropy(y_true,?y_pred)??#?原來的lossloss_kl?=?kld(y_pred[::2],?y_pred[1::2])?+?kld(y_pred[1::2],?y_pred[::2])return?K.mean(loss_ce)?+?K.mean(loss_kl)?/?4?*?alpha最后把模型的 Dropout 打開,并用這個 data_generator 和 categorical_crossentropy_with_rdrop 來訓(xùn)練模型就行了。
個人理解
看完了讓人賞心悅目的實驗結(jié)果后,我們來啃一下理論。原論文提供了對 R-Drop 的一個理論分析,大致意思是 R-Drop 會促進(jìn)參數(shù)的同化,從而起到正則化作用。不過個人感覺這個解釋并不直觀,而且還不夠本質(zhì)。下面筆者試圖提供 R-Drop 的另外幾個角度的理解。
4.1 一致性
R-Dropout 可以看成是 Dropout 的改進(jìn),那 Dropout 有什么問題呢?其實 Dropout 是典型的訓(xùn)練和預(yù)測不一致的方法。具體來說,Dropout 在訓(xùn)練階段往(某些層的)輸入加上了乘性噪聲,使得模型從 變成了 ,其中 的每個元素有 p 的概率為 0,剩下 1-p 的概率為 1/(1-p),訓(xùn)練目標(biāo)就是:
這樣訓(xùn)練之后,我們應(yīng)該用哪個模型預(yù)測最好呢?不確定,但如果損失函數(shù)是 距離的話,那么我們可以推出最佳預(yù)測模型應(yīng)該是:
推導(dǎo):如果用 損失,此時單個樣本的損失是:
注意,現(xiàn)在我們的問題是“模型訓(xùn)練完后應(yīng)該用什么函數(shù)來預(yù)測”,所以 是常數(shù),y 才是要優(yōu)化的變量,這只不過是一個二次函數(shù)的最小值問題,容易解得 時損失函數(shù)最小。
我們假定這個結(jié)果能泛化到一般情況。上式告訴我們,帶 Dropout 的模型的正確步驟是“模型融合”:
對同一個輸入多次傳入模型中(模型不關(guān)閉 Dropout),然后把多次的預(yù)測結(jié)果平均值作為最終的預(yù)測結(jié)果。
但我們一般情況下的預(yù)測方式顯然不是這樣的,而是直接關(guān)閉 Dropout 進(jìn)行確定性的預(yù)測,這等價于預(yù)測模型由“模型平均”變成了“權(quán)重平均”:
這里的 1 指的是全 1 向量。所以,我們訓(xùn)練的是不同 Dropout 的融合模型,預(yù)測的時候用的是關(guān)閉 Dropout 的單模型,兩者未必等價,這就是 Dropout 的訓(xùn)練預(yù)測不一致問題。
現(xiàn)在,我們就不難理解 R-Drop 了,它通過增加一個正則項,來強(qiáng)化模型對 Dropout 的魯棒性,使得不同的 Dropout 下模型的輸出基本一致,因此能降低這種不一致性,促進(jìn)“模型平均”與“權(quán)重平均”的相似性,從而使得簡單關(guān)閉 Dropout 的效果等價于多 Dropout 模型融合的結(jié)果,提升模型最終性能。
4.2 連續(xù)性
本文開頭就提到 R-Drop 與 SimCSE 的相似性,事實上它還跟另外一個方法相當(dāng)相似,那便是“虛擬對抗訓(xùn)練(Virtual Adversarial Training,VAT)”。(不過 R-Drop 也沒引 VAT,難道就只有筆者覺得像嗎??)
關(guān)于 VAT 的介紹,大家可以參考筆者之前的文章泛化性亂彈:從隨機(jī)噪聲、梯度懲罰到虛擬對抗訓(xùn)練。簡單來說,VAT 也是通過一個正則項,使得模型對擾動更加魯棒,增強(qiáng)模型本身的連續(xù)性(小的變化不至于對結(jié)果產(chǎn)生大的影響)。它們不同的地方在于加擾動的方式,VAT 只把擾動加入到輸入中,并且通過對抗的思想提升擾動的針對性;R-Drop 的擾動則可以施加到模型的每一層中,并且擾動是隨機(jī)的。
有讀者可能想到了,VAT 可是主打半監(jiān)督訓(xùn)練的,那是不是意味著 R-Drop 也可以做半監(jiān)督訓(xùn)練?這部分原論文并沒有實驗,是筆者自己做的實驗,答案是確實可以,跟 VAT 類似,R-Drop 新增的 KL 散度項是不需要標(biāo)簽的,因此可以無監(jiān)督訓(xùn)練,混合起來就是半監(jiān)督了,效果也還不錯。下面是筆者的實驗結(jié)果:
可以看到,R-Drop 的半監(jiān)督效果完全不遜色于 VAT,而且它實現(xiàn)比 VAT 簡單,速度也比 VAT 快!看來 VAT 有望退休了~ 直覺上來看,雖然 R-Drop 的擾動是隨機(jī)的,但是 R-Drop 的擾動更多,所以它造成的擾動也會放大,也可能比得上 VAT 經(jīng)過對抗優(yōu)化的擾動,所以 R-Drop 能夠不遜色于 VAT。
4.3 非目標(biāo)類
一個比較直接的疑問是,如果我的模型夠復(fù)雜,單靠交叉熵這一項,不能使得模型對 Dropout 魯棒嗎?KL 散度那一項造成了什么直接的區(qū)別?
事實上,還真的不能。要注意的是,交叉熵的訓(xùn)練目標(biāo)主要是:讓目標(biāo)類的得分大于非目標(biāo)類的得分,這樣模型就能正確地把目標(biāo)類預(yù)測出來了(參考將“softmax+交叉熵”推廣到多標(biāo)簽分類問題)。也就是說,如果只有交叉熵這一項,模型的訓(xùn)練結(jié)果頂多是:
不同的 Dropout 下,目標(biāo)類的得分都大于非目標(biāo)類的得分。
而不能做到:
不同的 Dropout 下,每個類的得分一致。
所以也就沒有解決訓(xùn)練預(yù)測不一致的問題。從公式上來看,交叉熵(2)只跟目標(biāo)類別有關(guān),不關(guān)心非目標(biāo)類的分布,假如目標(biāo)類為第一個類別,那么預(yù)測結(jié)果是 [0.5, 0.2, 0.3] 或 [0.5, 0.3, 0.2],對它來說都沒區(qū)別。但對于 KL 散度項(3)來說就不一樣了,每個類的得分都要參與計算,[0.5, 0.2, 0.3] 或 [0.5, 0.3, 0.2] 是有非零損失的。
本文小結(jié)
本文介紹了 R-Drop,它將“Dropout 兩次”的思想用到了有監(jiān)督任務(wù)中,每個實驗結(jié)果幾乎都取得了明顯的提升。此外,筆者在自己的實驗還發(fā)現(xiàn),它在半監(jiān)督任務(wù)上也能有不俗的表現(xiàn)。最后,分享了筆者對 R-Drop 的三個角度的思考。
參考文獻(xiàn)
[1] https://kexue.fm/archives/8348
更多閱讀
#投 稿?通 道#
?讓你的文字被更多人看到?
如何才能讓更多的優(yōu)質(zhì)內(nèi)容以更短路徑到達(dá)讀者群體,縮短讀者尋找優(yōu)質(zhì)內(nèi)容的成本呢?答案就是:你不認(rèn)識的人。
總有一些你不認(rèn)識的人,知道你想知道的東西。PaperWeekly 或許可以成為一座橋梁,促使不同背景、不同方向的學(xué)者和學(xué)術(shù)靈感相互碰撞,迸發(fā)出更多的可能性。?
PaperWeekly 鼓勵高校實驗室或個人,在我們的平臺上分享各類優(yōu)質(zhì)內(nèi)容,可以是最新論文解讀,也可以是學(xué)術(shù)熱點剖析、科研心得或競賽經(jīng)驗講解等。我們的目的只有一個,讓知識真正流動起來。
?????稿件基本要求:
? 文章確系個人原創(chuàng)作品,未曾在公開渠道發(fā)表,如為其他平臺已發(fā)表或待發(fā)表的文章,請明確標(biāo)注?
? 稿件建議以?markdown?格式撰寫,文中配圖以附件形式發(fā)送,要求圖片清晰,無版權(quán)問題
? PaperWeekly 尊重原作者署名權(quán),并將為每篇被采納的原創(chuàng)首發(fā)稿件,提供業(yè)內(nèi)具有競爭力稿酬,具體依據(jù)文章閱讀量和文章質(zhì)量階梯制結(jié)算
?????投稿通道:
? 投稿郵箱:hr@paperweekly.site?
? 來稿請備注即時聯(lián)系方式(微信),以便我們在稿件選用的第一時間聯(lián)系作者
? 您也可以直接添加小編微信(pwbot02)快速投稿,備注:姓名-投稿
△長按添加PaperWeekly小編
????
現(xiàn)在,在「知乎」也能找到我們了
進(jìn)入知乎首頁搜索「PaperWeekly」
點擊「關(guān)注」訂閱我們的專欄吧
關(guān)于PaperWeekly
PaperWeekly 是一個推薦、解讀、討論、報道人工智能前沿論文成果的學(xué)術(shù)平臺。如果你研究或從事 AI 領(lǐng)域,歡迎在公眾號后臺點擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。
總結(jié)
以上是生活随笔為你收集整理的又是Dropout两次!这次它做到了有监督任务的SOTA的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 家里吊灯坏了如何维修
- 下一篇: 工作之后,顶会还重要嘛?