ACL'21 | debug完的神经网络,如何测试是否仍然存在bug?
文 | Sherry
回歸測試
熟悉軟件工程的小伙伴們一定知道回歸測試:修改了舊代碼后,重新進行測試以確認修改沒有引入新的錯誤或導致其他代碼產生錯誤。
它可以大幅降低系統測試、維護升級等階段的成本。
隨著深度學習網絡的不斷發展,越來越多的系統都得到了廣泛的工業界應用。長期的系統維護就顯得格外重要了。
一方面,大家在用更大的模型,更多的數據不斷提高SOTA效果;但同時,模型缺乏可解釋性,同時也很難將大型神經網絡分解為小單元去進行回歸測試。往往,更新到新版本模型引入了更多的錯誤就會讓模型準確率提高的優勢消耗殆盡。
舉個簡單的例子,假設iPhone將人臉識別模型的準確率從90%提高到93%,新版本的模型糾正了舊模型中4%的問題但是新引入了1%的錯誤。按國內iPhone有7.3億部手機用戶來算,這意味著系統更新后,有7300萬用戶發現人臉識別不好用了。
這將導致嚴重的用戶投訴,或者拒絕在以后繼續更新系統。
Amazon的研究團隊在實際應用中發現了這個問題,便在NLP領域提出了針對模型版本更新會引入新bug這個問題,并且在分類問題上進行了實驗。文章被收錄到ACL 2021 long Paper.
論文題目:
Regression Bugs Are In Your Model! Measuring, Reducing and Analyzing Regressions In NLP Model Updates
論文鏈接:
https://arxiv.org/abs/2105.03048
如何測量回歸錯誤
在這個任務設定中,我們考慮在一個固定的數據集和任務上訓練模型,目標是在給定一個舊模型的基礎上,訓練一個和這個舊模型比較起來回歸錯誤盡量小且準確率不受過多損失的新模型。想要解決回歸錯誤的問題,我們首先需要一個指標來衡量兩個不同版本模型的回歸錯誤量。
在分類問題上,定義某個“回歸測試集”上樣本的負翻轉率(Negative Flip Rate)為回歸錯誤的指標:對于每個回歸測試集中的每個樣本,如果舊模型預測正確而新模型預測錯誤,我們就把這些樣本稱作負翻轉樣本,而回歸測試集中的負翻轉樣本所占比例就是在這個回歸測試上,從該舊模型更新到該新模型的負翻轉率,或者說回歸錯誤率:
通常,回歸測試集可以根據不同的測試需要,進行不同的設計。比如可以像歸回測試中收集或選取一些關鍵樣例組成回歸測試集,或者是收集一部分用戶反饋的常見錯例,又或是直接選用數據集本身的validation集。
那么在正常更新中,常見NLP分類模型會產生多少回歸錯誤呢?
作者在GLUE數據集上對不同版本的模型更新進行了測試:當我們選定舊模型為BERT-base,然后更新到其他版本的分類模型,包括
另外一個隨機數下訓練的BERT-base;
擴大模型規模BERT-large;
修改模型預訓練設定RoBERTa-base;
更改預訓練目標ELECTRA-base;
更改模型結構ALBERTA-base
實驗發現,回歸錯誤在不同更新和不同任務上普遍存在。此外
即使更新到完全相同的BERT-base,唯一的變化是微調參數中的隨機種子,也會產生2%-5%的回歸錯誤。
歸回錯誤率往往比準確率的提升更高:例如在QQP上從BERT-base更新到其他模型時,歸回錯誤率是準確率提升的3倍以上。
當更新到有更大差異的模型時,歸回錯誤率會更高。
如何降低回歸錯誤
現在我們已經確定了回歸錯誤是普遍存在的,那么如何在維持新模型準確率不損失過多的條件下降低回歸錯誤率呢?
作者首先將這個問題形式化,寫成了帶限制的優化問題的形式:
我們在用CrossEntropy優化原分類問題的同時,給新模型的訓練加上一個條件:保證回歸錯誤率為0. 回歸錯誤率為0顯然是一種理想狀態,當然如果新模型完全復制舊模型就可以達到這個條件,但是這樣我們就沒有辦法進一步改進模型了。所以在訓練新模型的時候我們可以適當放寬第二個條件:
我們要求回歸錯誤率小于一個常數。
在之前定義的回歸錯誤率中,每一個樣本的回歸錯誤是一個離散的值:如果回歸了則為1,否則為0。這種性質并不利于模型的訓練,于是作者對模型訓練損失函數中的回歸懲罰項進行松弛:
利用新舊模型分類預測概率的kl散度;
又或是用新舊模型句子表示向量之間的l2距離,來作為松弛的回歸損失。
再將原問題的條件進過一步拉格朗日松弛,便可以得到:
而這恰好和蒸餾學習的損失函數非常相似,我們便可以用類似的學習框架來減少回歸錯誤。值得注意的一點是,普通的蒸餾學習在所有的訓練樣本上都會加入兩模型的距離懲罰;然而在本文中,作者只在新模型的表現不如舊模型的樣本(也就是回歸了的樣本)上加入距離懲罰項。
實驗結果與分析
作者在GLUE的任務上對提出的方法進行測試。實驗表明改進版蒸餾可以有效地減小回歸錯誤率。當更新到不同構的模型(BERT-large)時,蒸餾學習的效果更為顯著。作者同樣列出了另外一種方法——集成學習在降低回歸錯誤上的效果。集成學習可以有效減少不同模型之間的方差,從而達到降低部分回歸的目的。可以看到,在更新到同構模型(BERT-base),變量僅有隨機數,也就是只有方差引起的回歸錯誤時,集成學習格外有效。
更進一步,作者對蒸餾時使用的損失對齊位置進行了選擇:
使用分類概率的KL散度作為蒸餾損失函數;
使用最后一層句子表示向量的l2距離作為蒸餾損失函數;
使用所有層句子表示向量的l2距離作為蒸餾損失函數。
實驗表明,整體而言,僅用kl散度對齊分類概率分布是有效減少回歸錯誤的方案。對于同構的模型更新,進行更深層次的對齊可能對降低回歸錯誤有效。
之后,作者對集成學習和蒸餾學習為何可以有效減少回歸錯誤進行了分析。
對集成學習而言,作者微調了20個模型作為舊模型,20個作為新模型,100個每五個一組作為20個集成模型。對所有新-舊,或者是集成-舊模型對進行回歸錯誤測試。從下圖中我們可以發現,集成學習可以使分布左移且方差變小,這正說明了集成模型從減小模型間方差而言可以有效減少回歸錯誤。
更進一步,作者發現,可以通過找“中心模型”來使得單模型也可以獲得集成模型類似的效果:我們計算新的20個單模型之間的回歸錯誤,然后選取相對其他19個單一新模型平均回歸最小的一個作為“中心模型”,然后測試它和20個舊模型的回歸錯誤,結果發現這個中心模型也可以像集成模型一樣減少回歸錯誤。
分析完集成模型為何有效,作者同樣對蒸餾模型的有效性進行了分析。他們利用Checklist的方法對訓練好的模型進行語言行為學回歸測試:Checklist方法可以自動生成一系列測試,每一組測試針對一個語言現象。
測試結果表明,在語言行為學角度,蒸餾可以有效地讓新模型模仿舊模型的行為——減少那些它原本會預測錯誤的語言行為。但相比之下,集成模型雖然在原數據測試集上可能有更小的回歸錯誤,但是從語言行為角度看反而增加了和舊模型不一致的行為。這恰恰是因為集成學習完全沒有將舊模型的信息考慮進學習過程,蒸餾學習卻可以從細節上模仿舊模型從而達到在語言行為上減少回歸。
總結
本文提出了NLP模型版本更新中會出現回歸錯誤的問題,是一個全新的領域,且對實際模型上線和部署可能產生深遠影響。同時文中也給出了有效減少這類錯誤的方法,并從語言行為學上分析了方法的有效性。
萌屋作者:Sherry。
本科畢業于復旦數院,轉行NLP目前在加拿大滑鐵盧大學讀CS PhD。經歷了從NOIer到學數學再重回CS的轉變,卻堅信AI的未來需要更多來數學和自認知科學的理論指導。主要關注問答,信息抽取,以及有關深度模型泛化及魯棒性相關內容。
作品推薦:
可交互的 Attention 可視化工具!我的Transformer可解釋性有救了?
誰才是Transformer家族中的最強王者?谷歌告訴你答案
Facebook刷新開放域問答SOTA:模型訓模型!Reader當Teacher!
后臺回復關鍵詞【入群】
加入賣萌屋NLP/IR/Rec與求職討論群
后臺回復關鍵詞【頂會】
獲取ACL、CIKM等各大頂會論文集!
總結
以上是生活随笔為你收集整理的ACL'21 | debug完的神经网络,如何测试是否仍然存在bug?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: @开发者,第二届马栏山杯国际音视频算法大
- 下一篇: Google | 创造Youtube单次