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