ICML2020 | 一行代码就能实现的测试集上分技巧
星標(biāo)/置頂小屋,帶你解鎖
最萌最前沿的NLP、搜索與推薦技術(shù)
文 |?蘇劍林
編 |?夕小瑤
在訓(xùn)練模型的時候,我們需要損失函數(shù)一直訓(xùn)練到0嗎?顯然不用。一般來說,我們是用訓(xùn)練集來訓(xùn)練模型,但希望的是驗證集的損失越小越好,而正常來說訓(xùn)練集的損失降低到一定值后,驗證集的損失就會開始上升(即過擬合),因此沒必要把訓(xùn)練集的損失降低到0。
為了對抗這種過擬合現(xiàn)象,提高模型的測試集表現(xiàn)(即泛化能力),一種很自然的想法是提前終止(early stopping),也就是當(dāng)觀測到模型的驗證集表現(xiàn)不降反升時,果斷停止訓(xùn)練。這也是如今大模型跑小數(shù)據(jù)時的最常用做法。
既然如此,在模型訓(xùn)練loss已經(jīng)到達某個閾值之后,我們可不可以做點別的事情來繼續(xù)提升模型的測試集性能呢?一篇發(fā)表于機器學(xué)習(xí)頂會ICML2020上的論文《Do We Need Zero Training Loss After Achieving Zero Training Error?》[1]回答了這個問題。
不過這篇論文的回答也僅局限在“是什么”這個層面上,并沒很好地描述“為什么”,另外看了知乎上kid丶[2]大佬的解讀,也沒找到自己想要的答案。因此自己分析了一下,記錄在此。
思路描述
論文提供的解決方案非常簡單,假設(shè)原來的損失函數(shù)是,現(xiàn)在改為:
其中是預(yù)先設(shè)定的閾值。當(dāng)時,這時候就是執(zhí)行普通的梯度下降;而時,注意到損失函數(shù)變號了,所以這時候是梯度上升。因此,總的來說就是以為閾值,低于閾值時反而希望損失函數(shù)變大。論文把這個改動稱為“Flooding”。
這樣做有什么效果呢?論文顯示,訓(xùn)練集的損失函數(shù)經(jīng)過這樣處理后,驗證集的損失能出現(xiàn)“二次下降(Double Descent)”,如下圖。簡單來說就是最終的驗證集效果可能更好些。
左圖:不加Flooding的訓(xùn)練示意圖;右圖:加了Flooding的訓(xùn)練示意圖
效果
從上圖可以看出來這個方法的理想很豐滿,那么實際表現(xiàn)如何呢?
作者這里在MNIST、CIFAR等眾多CV領(lǐng)域的benchmark上進行了實驗,且如下圖所示
圖中中間一欄是沒有加flooding的結(jié)果(early stopping和weight decay的四種排列組合),右邊一欄是加了flooding的結(jié)果(四種排列組合的基礎(chǔ)上都加上flooding)。可以看到加了flooding后,大部分情況下模型都能比之前有更好的測試集表現(xiàn)。
個人分析
如何解釋這個方法的有效性呢?可以想象,當(dāng)損失函數(shù)達到之后,訓(xùn)練流程大概就是在交替執(zhí)行梯度下降和梯度上升。直觀想的話,感覺一步上升一步下降,似乎剛好抵消了。事實真的如此嗎?我們來算一下看看。假設(shè)先下降一步后上升一步,學(xué)習(xí)率為,那么:
我們有
(滑動查看完整公式)
近似那一步是使用了泰勒展式對損失函數(shù)進行近似展開,最終的結(jié)果就是相當(dāng)于損失函數(shù)為梯度懲罰、學(xué)習(xí)率為的梯度下降。更妙的是,改為“先上升再下降”,其表達式依然是一樣的(這不禁讓我想起“先升價10%再降價10%”和“先降價10%再升價10%”的故事)。因此,平均而言,Flooding對損失函數(shù)的改動,相當(dāng)于在保證了損失函數(shù)足夠小之后去最小化,也就是推動參數(shù)往更平穩(wěn)的區(qū)域走,這通常能提供提高泛化性能(更好地抵抗擾動),因此一定程度上就能解釋Flooding其作用的原因了。
本質(zhì)上來講,這跟往參數(shù)里邊加入隨機擾動、對抗訓(xùn)練等也沒什么差別,只不過這里是保證了損失足夠小后再加擾動。讀者可以參考《泛化性亂彈:從隨機噪聲、梯度懲罰到虛擬對抗訓(xùn)練》[3]了解相關(guān)內(nèi)容,也可以參考“圣經(jīng)”《深度學(xué)習(xí)》第二部分第七章的“正則化”一節(jié)。
方法局限性
雖然這個方法看起來還挺work,但是不能忽視的一個細節(jié)是,作者在做上面表格里的每組flooding的實驗時,都對flooding的超參b調(diào)節(jié)了20組(從0.01~0.20),如下
這在數(shù)據(jù)規(guī)模很小時實驗代價還好,但單次實驗代價較高時,可能就不那么實用了。
繼續(xù)腦洞
有心使用這個方法的讀者可能會糾結(jié)于的選擇或調(diào)超參的實驗代價,不過筆者倒是有另外一個腦洞:無非就是決定什么時候開始交替訓(xùn)練罷了,如果從一開始就用不同的學(xué)習(xí)率進行交替訓(xùn)練呢?也就是自始至終都執(zhí)行
其中,這樣我們就把去掉了(當(dāng)然引入了的選擇,天下沒免費午餐)。重復(fù)上述近似展開,我們就得到
(滑動查看完整公式)
這就相當(dāng)于自始至終都在用學(xué)習(xí)率來優(yōu)化損失函數(shù)了,也就是說一開始就把梯度懲罰給加了進去。這樣能提升模型的泛化性能嗎?筆者簡單試了一下,有些情況下會有輕微的提升,基本上都不會有負面影響,總的來說不如自己直接加梯度懲罰好,所以不建議這樣做。
文章小結(jié)
本文簡單介紹了ICML2020一篇論文提出的“到一定程度后就梯度上升”的訓(xùn)練策略,并給出了自己的推導(dǎo)和理解,結(jié)果顯示它相當(dāng)于對參數(shù)的梯度懲罰,而梯度懲罰也是常見的正則化手段之一。
?文末福利?
后臺回復(fù)關(guān)鍵詞【入群】
加入賣萌屋NLP/IR/Rec與求職討論群
有頂會審稿人、大廠研究員、知乎大V和妹紙
等你來撩哦~
?關(guān)注星標(biāo)?
帶你解鎖最前沿的NLP、搜索與推薦技術(shù)
參考文獻
[1] Do We Need Zero Training Loss After Achieving Zero Training Error?:?https://arxiv.org/abs/2002.08709
[2] kid丶:?https://zhuanlan.zhihu.com/p/163676138
[3] 泛化性亂彈:從隨機噪聲、梯度懲罰到虛擬對抗訓(xùn)練: https://kexue.fm/archives/7466
總結(jié)
以上是生活随笔為你收集整理的ICML2020 | 一行代码就能实现的测试集上分技巧的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一份北大信科内部流传的 “CS 自救指南
- 下一篇: 动手做个DialoGPT:生成式多轮对话