如何正確地做誤差分析,NLP研究人員們需要學習一下
筆者按:嘗試分析機器學習模型在什么時候、以什么方式、由于什么原因失效,我們把這稱為「誤差分析(error analysis)」。對科研人員來說,他們需要通過誤差分析選擇后續(xù)的改進方向;模型的實際使用者們也需要根據(jù)誤差分析來確定模型部署的許多細節(jié)。由于誤差分析對后續(xù)的行動方向有顯著的影響,如果誤差分析中出現(xiàn)了偏倚,或者誤差分析不完整,很可能會帶來我們不想看到的后果。
NLP 任務誤差分析的現(xiàn)狀
但是人們目前都是怎么做誤差分析的呢?如果你翻翻自然語言處理頂級學術會議 ACL 的接收論文,你基本上會看到這樣的敘述:
- 我們針對 100 個樣本問題進行了誤差分析……
- 我們隨機選擇了 50 個回答不正確的問題并把它們分為了 6 類……
- 我們找出了 100 個不正確的預測結果并嘗試尋找共同的誤差類別……
- ……
顯然,這個領域內的研究人員們都不約而同地采用了這種做法:「我們隨機選擇了 50 到 100 個回答不正確的問題并把它們大致分為了 N 組」。(斯坦福大學 NLP 組負責人 Christopher Manning 的畫外音:問答任務的論文里選 100 個樣本做錯誤分析的慣例恐怕出自我這里 —— 最初我們想做 200 個的,但我一直沒有做分給我的那一半)
選擇一部分錯誤樣本做分析,看起來好像還有那么點道理對不對?但其實這種做法有很大問題。比如,50 到 100 的樣本數(shù)量太小了,一般來說只占到誤差總量的 5%。這么小的采樣數(shù)量很難代表真正的誤差分布。如果拿來做誤差分析的采樣樣本里剛好沒有體現(xiàn)出某個關鍵的模型問題(比如聊天助理機器人會對某些特定的語句給出不當?shù)幕卮?,然后就這么把沒有得到修復的模型實際部署了,結果肯定會非常可怕。
這還沒完,樣本數(shù)量小才僅僅是常見做法中出現(xiàn)的第一個問題而已。在 ACL 2019 論文《Errudite: Scalable, Reproducible, and Testable Error Analysis》中,作者們詳細列舉了 NLP 誤差分析中的許多個關鍵挑戰(zhàn),也提出了三個原則,希望大家能夠把誤差分析做得更準確,也具備更好的可重復、可拓展、可測試性。作者們還設計了 Errudite,這是一個實踐了這些原則的交互式工具,它也可以逐個應對發(fā)現(xiàn)的問題。
論文作者們也撰寫了一篇介紹博客,根據(jù)通過一個具體的錯誤分析流程來說明當前基于一小批樣本的手工、主觀誤差分析為什么容易得出模棱兩可的、有偏倚的分析,并且可能弄錯誤差原因,以及如何借助 Errudite 避免這些錯誤。他們的論文中還有更多的例子。雷鋒網(wǎng) AI 科技評論對介紹博客做全文編譯。
從實際例子說起
我們要對機器閱讀理解(Machine Comprehension)的一個知名基準模型 BiDAF (https://allenai.github.io/bi-att-flow/)做錯誤分析。在這項任務中,首先給定一個問題和一段文本,機器閱讀理解模型需要找到能正確回答問題的文本片段。
在這個出自 SQuAD 數(shù)據(jù)集的例子中,加粗字體的 Murray Gold 創(chuàng)作了《Doctor Who(神秘博士)》的 2005 特別篇。
作為語言理解的最重要測試任務之一,機器閱讀理解中的誤差分析非常關鍵但也有不少困難:研究人員們都希望能夠找到先進模型中的弱點并進行改進,但是由于模型的輸入(問題、文本段落)和輸出(答案)都是非結構化的文本,能夠用來分析解讀數(shù)據(jù)集的特征就很少。BiDAF 是研究機器閱讀理解任務的學者們非常熟悉的一個模型了,下文中拿來舉例的誤差分析就都是出自研究人員們針對 BiDAF 的真實分析。
在剛才這個例子中,BiDAF 做了錯誤的預測,給出的答案是 John Debney (下劃線)而不是 Murray Gold。我們希望能夠從這個錯誤做一些推廣,更全面地理解模型的表現(xiàn)。
在分析這個錯誤時,我們首先會問的問題就是:模型為什么會出現(xiàn)這種錯誤?一位專家給出了一個干擾詞猜想:BiDAF 擅長把問題匹配到各種命名實體類別上,但是如果同時出現(xiàn)了同類型的其它實體的話,BiDAF 就很容易被干擾。以上面那個例子來說,我們問的問題是「誰」,BiDAF 就知道我們需要一個人名,也確實回答了一個人名,只不過不是正確的那個人名。
帶著這個假說,我們下一個需要問的問題是,「這個模型經(jīng)常會犯這種錯誤嗎?」探究猜想的普適性需要研究更多類似的樣本。然而,如我們上文說到的,如果想要探索整個數(shù)據(jù)集的話,這些非結構化文本中可供利用的特征太少了,所以研究人員們通常的做法是手工標注一些錯誤樣本,并把它們分為不同的組。
這種做法的問題在于,不同分組的定義是主觀的,不同的人會提出不同的分組方式。比如在另一個例子中,一個問「when」的問題的標準答案是「在他讀大學期間」,而模型給出的回答是「1996」,是一個錯誤的年份。有人會認為這是一個符合干擾詞猜想的問題,畢竟問題問的是時間,和模型給出的回答類型(同樣也是時間)是匹配的。但是也有人會認為它應該屬于別的錯誤類別,畢竟標準答案「在他讀大學期間」不是一個可以被識別的命名實體。如果你只是翻看這個錯誤例子的名稱和文本描述的話,很有可能你都意識不到會有這種差異。
實際上,論文作者們發(fā)現(xiàn)即便只是用簡單的法則定義不同的錯誤分組,這種差異性/人與人之間的不一致性也會出現(xiàn):作者們找來此前曾發(fā)表過的一份錯誤分析中的一個錯誤類型及其描述,然后讓現(xiàn)在的專家們重復這個實驗,結果他們分到這一組的錯誤數(shù)量大為不同,差異最小也有 13.8%,最大甚至有 45.2%;這更明顯地體現(xiàn)出了人工標注的模糊性。
針對這種狀況,論文作者們提出了第一條原則:必須用明確的描述精確定義錯誤猜想。
原則 1:準確
為了規(guī)避人為主觀性、提高準確性,Errudite 使用了一種任務專用語言(Domain-Specific Language)來量化描述不同的實例。
簡單來說,這種任務專用語言使用了一系列強有力的屬性提取器,在額外的輔助操作符的幫助下解析具體的錯誤(屬性提取器、目標、操作符三部分)。比如可以解析一個問題的長度,并要求長度大于 20。這樣,研究人員們就可以根據(jù)特定的模式,客觀、系統(tǒng)地對大量錯誤例子分組,得出某種錯誤的準確的出現(xiàn)頻率。比如下圖就是用這種語言對「干擾詞猜想」的準確描述,也就可以把「在他讀大學期間」這個例子排除在這個分類之外。
原則 2:覆蓋所有的數(shù)據(jù)
在 BiDAF 的所有錯誤中執(zhí)行了這個過濾器之后,一共找到了 192 個例子是符合「干擾詞猜想」的,也就是說標準答案和錯誤答案的命名實體類型相同,然后模型給出了錯誤的實體。值得注意的是,在達到了這種準確性的基礎上,任務專用語言的運用也可以極大地拓展誤差分析的規(guī)模:相比于常見做法里一共分析 50 到 100 個錯誤樣本,現(xiàn)在單個錯誤類別的樣本量都達到了 192。這也就減小了采樣誤差。
總數(shù)量方面,這 192 個錯誤樣本占到了所有錯誤總數(shù)的 6%,這個干擾詞猜想看來是可以被證實的。有具體數(shù)據(jù)以后,錯誤分析的說服力也變強了很多對吧。
不過,當我們執(zhí)行了所有步驟中的過濾器、構建出了詳盡的分組以后,我們其實會發(fā)現(xiàn)全新的圖景:對于全部樣本,BiDAF 能給在 68% 的樣本中給出正確的實體;對于標準答案就是一個實體的樣本,模型的準確率會提高到 80%;當文本中有同一個類型的其它實體的時候,BiDAF 的準確率仍然有 79%;讓它預測一個類型正確的實體的時候,它的準確率高達 88%,要比全部樣本的正確率高得多。這意味著,對于實體類型匹配、且有干擾詞出現(xiàn)的情況,模型的表現(xiàn)還是比整體表現(xiàn)要好,這種情況并不是模型表現(xiàn)的短板。所以,如果你只是發(fā)現(xiàn)了有某種錯誤出現(xiàn),然后就決定要先解決這種錯誤的話,你可能需要重新考慮一下,因為你很可能忽視了模型表現(xiàn)非常糟糕的情境。
所以,這個領域專用語言可以幫助分析整個數(shù)據(jù)集,包括檢驗沒有出錯的樣本。這樣的誤差分析更系統(tǒng)、可以支持更大的規(guī)模;相比于只看一小部分樣本,你得到的結論也可能完全不同。
那么,第二條原則可以正式地表述為:錯誤出現(xiàn)頻率的分析應該在整個數(shù)據(jù)集上進行,其中需要包括正例(true positive)。
原則 3:測試錯誤猜想,驗證因果性
現(xiàn)在我們已經(jīng)建立起關于干擾詞的分組了。但是,出現(xiàn)錯誤的時候同時有一個干擾詞并不一定代表干擾詞是這個錯誤出現(xiàn)的根本原因?;氐角懊娴睦?,我們可以簡單地認為出錯的根本原因是因為有干擾詞,但也可能是因為我們需要做多句推理,需要把「神秘博士」和「系列」聯(lián)系起來,又或者還有別的原因。
這就引出了我們當前面對的現(xiàn)狀中的另一個問題:我們很難有效地分離某個錯誤的根本原因。想要弄清的話,我們需要第三個原則
原則 34 Errudite,論文作者們想要回答這個問題:這 192 個錯誤都是因為有干擾詞才出錯的嗎?驗證方法是提出并驗證一個相關的假想問題:「如果沒有這個干擾詞,模型能不能給出正確的答案?」作者們利用重寫規(guī)則,用反事實分析(counterfactual analysis)尋找答案。
根據(jù)這個領域專用語言,Errudite 可以按一定的規(guī)則重寫分組內的所有實例。比如在這里,為了驗證干擾詞是否是根本原因,根據(jù)重寫規(guī)則把文本中的干擾詞都替換成無意義的占位符「#」,這樣就不會再被檢測為實體。
在重寫完成以后讓模型重新進行預測。在前面那個神秘博士的例子里,即便已經(jīng)用「#」替換了錯誤答案 John Debney,模型仍然給出了另一個錯誤答案 Ron Grainer。看來另一個干擾詞仍然迷惑了模型。
對于分組中的其它樣本,有 29% 的情況模型會給出另一個不正確的同類型實體(另一個干擾詞);在 48% 的情況中,模型給出了正確的預測,這部分樣本里確實是干擾詞帶來了錯誤預測;在剩下的 23% 中,模型給出了和之前相同的預測 —— 只不過由于現(xiàn)在那些字符已經(jīng)被「#」替換,所以模型的預測結果就會包含這個沒有任何實際含義的「#」字符!可以猜測這可能是因為問題和預測答案高度重合,所以模型實際做的更接近于直白的字符匹配而不是尋找實體。從這種反事實分析中得到的結論就不是僅僅做一下分組就能得到的了。
準確 + 可重現(xiàn) + 可重復應用
在上面這個誤差分析過程中,我們需要用準確的查詢語句構建屬性、分組,以及執(zhí)行重寫規(guī)則。對 BiDAF 進行分析過后,我們發(fā)現(xiàn)有干擾詞的時候它的表現(xiàn)并不怎么差,而且一些以前我們以為是干擾詞引起的問題其實有其它的根本原因。
此外,準確的查詢語句有一個非常大的好處,就是可以輕松地分享給他人、重現(xiàn)實驗結果,以及其它的模型乃至其它的任務中應用。
最后,論文作者們還表示這個 Errudite 工具有一個明了、易用、多功能的圖形化用戶界面,而且?guī)в姓Z句示范、屬性分布圖等實用功能。
要點總結
常見(但有偏倚的)誤差分析來自于
- 主觀的錯誤分組 + 小樣本 + 只關注錯誤情況 + 沒有針對根本原因的測試
Errudite(改進的)誤差分析
- 準確、可重復的分組 + 分析整個數(shù)據(jù)集 + 包含了正例和負例 + 通過反事實分析測試驗證
NLP 領域之外的誤差分析的啟示
目前的 Errudite 實現(xiàn)(尤其是其中的領域專用語言部分)只是針對 NLP 任務的。然而,機器學習系統(tǒng)也經(jīng)常需要處理非文本數(shù)據(jù)。論文作者們相信,即便目前他們的實現(xiàn)難以拓展到其它的領域,但他們的三條原則,完全可以、也完全有必要在其他的領域中得到應用,幫助大家部署正確的模型、向正確的研究方向深入挖掘。
想要創(chuàng)建一個新的基于這三條原則的工具并不難,只需要它可以支持對應的這三個要點:
- 運用領域專用語言,通過可編輯修改的基礎部件,完成準確的樣本分組;
- 拓展誤差分析規(guī)模,通過自動的過濾語句分析包括正例和負例在內的所有樣本,并提供可視化的統(tǒng)計數(shù)據(jù);
- 能夠通過規(guī)則重寫樣本,以便通過反事實分析驗證錯誤猜想。
作者們表示,Errudite 的軟件架構可以支持拓展到其它的 NLP 任務中,他們歡迎更多 NLP 領域內的研究和開發(fā)人員加入 Errudite 的開發(fā)和拓展中來。而且,如果其它領域也能出現(xiàn)類似的工具那就更棒了。