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