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