禁术级竞赛刷分技巧:找到跟测试集最接近的有标签样本
文 | 蘇劍林
單位 | 追一科技
編 | 兔子醬
不管是打比賽、做實驗還是搞工程,我們經常會遇到訓練集與測試集分布不一致的情況。一般來說我們會從訓練集中劃分出來一個驗證集,通過這個驗證集來調整一些超參數[1],比如控制模型的訓練輪數以防止過擬合。然而,如果驗證集本身跟測試集差別比較大,那么驗證集上很好的模型也不代表在測試集上很好,因此如何讓劃分出來的驗證集跟測試集的分布差異更小一些,是一個值得研究的題目。
為什么分布不一致
首先,明確一下本文所考慮的場景,就是我們只有測試集數據本身、但不知道測試集標簽的場景。如果是那種提交模型封閉評測的場景,我們完全看不到測試集的,那就沒什么辦法了。為什么會出現測試集跟訓練集分布不一致的現象呢?主要有兩種情況。
第一種是標簽的分布不一致。如果只看輸入x,分布基本上是差不多的,但是對應的y分布不一樣。典型的例子就是信息抽取任務。訓練集往往是通過“遠程監督+人工粗標”的方式構建的,量很大,但是里邊可能錯漏比較多,而測試集可能是通過“人工反復精標”構建的,錯漏很少。這種情況下就無法通過劃分數據的方式構建一個更好的驗證集了。
第二種是輸入的分布不一致。說白了就是x的分布不一致,但是y的標注情況基本上是正確的。比如分類問題中,訓練集的類別分布跟測試集的類別分布可能不一樣;又或者在閱讀理解問題中,訓練集的事實類/非事實類題型比例跟測試集不一樣。這種情況下我們可以適當調整采樣策略,使得驗證集跟測試集分布更一致些,從而驗證集的結果能夠更好反映測試集的結果。
判別器
為了達到我們的目的,我們讓訓練集的標簽為0,測試集的標簽為1,訓練一個二分類判別器D(x):
(向右滑動查看完整公式)
其中p(x)代表了訓練集的分布,q(x)則是測試集的分布。要注意的是,我們不是要將訓練集和測試集直接混合起來采樣訓練,而是分別從訓練集和測試集采樣同樣數量的樣本來組成每一個batch,也就是說需要過采樣到類別均衡。
可能有讀者擔心過擬合問題,即判別器徹底地將訓練集和測試集分開了。事實上,在訓練判別器的時候,我們應該也要像普通監督訓練一樣,劃分個驗證集出來,通過驗證集決定訓練的epoch數,這樣就不會嚴重過擬合了;或者像網上有些案例一樣,直接用邏輯回歸做判別器,因為邏輯回歸足夠簡單,過擬合風險也更小了。
跟GAN的判別器類似,不難推導D(x)的理論最優解是
()
也就是說,判別器訓練完后,可以認為它就等于兩個分布的相對大小。
重要性采樣
優化模型也好,算指標也好,其實我們是希望在測試集上進行,也就是說,對于給定目標f(x)(比如模型的loss),我們希望算的是
但是要算目標f(x),通常要知道x的真實標簽,但對于測試集來說我們不知道它的標簽,所以不能直接算。不過我們知道訓練集的標簽,于是我們可以解決它來做重要性采樣:
(向右滑動查看完整公式)
根據公式(2),我們知道,所以最終變成
(向右滑動查看完整公式)
說白了,重要性采樣的思想就是從訓練集里邊“挑出”那些跟測試集相近的樣本,賦予更高的權重。
最終策略
從公式(5)我們可以得到兩個策略:
第一是直接按照公式加權,也就是說,還是按隨機打亂的方式劃分訓練集和驗證集,但是給每個樣本配上權重 。值得指出的是,類似的做法有些選手做比賽時已經用過了,只不過流傳的權重是 D(x),當然哪個好我沒法斷言,只是從理論推導的角度來看應該是更加合理一些。
另一個策略就是實際地把對應的驗證集采樣出來。這也不難,假設訓練集的所有樣本為 ,我們把權重歸一化。
然后按照 為分布做獨立重復采樣,直到采樣到指定數目即可。注意需要做 有放回的獨立重復采樣,因此同一個樣本可能被采樣多次,在驗證集里邊也要保留多次,不能去重,去重后分布就不一致了。
文末小結
本文從訓練判別器的角度來比較訓練集和測試集的差異,并且結合重要性采樣,我們可以得到一個跟測試集更接近的驗證集,或者對訓練樣本進行加權,從而使得訓練集的優化過程和測試集差異性更小。
后臺回復關鍵詞【入群】
加入賣萌屋NLP/IR/Rec與求職討論群
有頂會審稿人、大廠研究員、知乎大V和妹紙
等你來撩哦~
參考文獻
[1]《訓練集、驗證集和測試集的意義》https://kexue.fm/archives/4638
總結
以上是生活随笔為你收集整理的禁术级竞赛刷分技巧:找到跟测试集最接近的有标签样本的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新手福利:百度官方中文教程,过年也要深度
- 下一篇: 掌握神经网络,我应该学习哪些至关重要的知