自信不等於準確
本階梯前面幾篇講過模型如何悄無聲息地出錯:被分佈漂移推離它熟悉的地盤、依賴某個偽相關、或被一個對抗性的小擾動騙倒。還有一種失敗把它們全都串在了一起,而且是最危險的一種——模型答錯了,卻篤信自己答對了。一個在該猶豫時會猶豫的系統是可挽回的;一個對一個徹頭徹尾錯誤的答案報出 99% 自信的系統,會徑直越過你佈下的每一道安全防線。所以這最後一篇要問的,是整個階梯裡最安靜、也最重要的一個問題:模型知道自己不知道什麼嗎?
先把兩個被初學者反覆混為一談的概念拆開。準確性說的是答案對不對。自信度說的是模型給這個答案貼上的那個數字——分類器的 softmax 層在「貓」旁邊打出的那個 0.92,或者一個大語言模型用平直篤定的口吻陳述某個事實時所暗含的確信。這是兩個完全獨立的屬性。模型可以準確卻膽怯,也可以錯誤卻嘴硬。softmax 的輸出常被叫作「機率」,可這個詞是一種承諾,而一個未經處理的模型從沒向你許下過這樣的承諾。
校準到底是什麼意思
乾淨的定義是這樣的。當一個模型的自信度從長期看與它的準確率相吻合時,它就是校準好的:在它所有說「我有 80% 把握」的場合裡,它大約應該有 80% 答對。就這麼簡單。校準不是要更準確——一個完美校準的模型照樣可以錯很多。它講的是*在總量上誠實*,讓模型報出的那個數字,真的意味著它聲稱的意思。正是這種誠實,才讓下游的每一個決策都能把模型的自信當成一個真實的信號,而不是裝飾。這個屬性在詞彙表裡有自己的條目:機率校準,也叫模型校準。
要看清它,你會畫一張可靠性圖。把預測按自信度分到一個個桶裡——模型說有 50–60% 把握的歸一桶、60–70% 的歸一桶,以此類推——再為每個桶畫出它實際答對的比例。一個完美校準的模型會貼著對角線走:自信 70% 的預測,有 70% 答對。典型的深度網路則會塌到對角線*下方*,暴露出過度自信。曲線與對角線之間的平均垂直差距,被匯總成一個數字,叫期望校準誤差(ECE)——衡量模型自信誠不誠實的標準成績單。
confidence bucket │ avg conf │ actually right │ verdict ──────────────────┼──────────┼────────────────┼────────── 90–100% │ 0.95 │ 0.78 │ too cocky 70–90% │ 0.80 │ 0.72 │ close-ish 50–70% │ 0.60 │ 0.61 │ honest ──────────────────┴──────────┴────────────────┴────────── perfect calibration: avg conf == fraction right
現代網路為什麼會漂向過度自信?很大程度上是因為我們訓練它去最小化交叉熵損失,而這個損失會在答案早已正確之後,仍不停地把勝出類別的分數往 1.0 推——正是這股一旦失控就會釀成過擬合的飢渴。好消息是,校準往往可以*事後廉價地修好*。溫度縮放是幹這活的主力:在套用 softmax 之前,把 softmax 前的分數(logits)統統除以一個學出來的數字 T。T 大於 1 會給模型的傲氣降溫,把機率質量攤開,將那個 95% 拉回到誠實的 78%。它不改變任何決策——最高的類別原封不動——只改變貼在它上面的自信度。
兩種「不知道」
校準修的是模型願意給出的那個答案上面的*數字*。但有時更深的真相是:模型根本就不該作答——它已經力不能及了。要應對這點,把不確定性分成兩種口味會很有幫助,這個區分正是自信與不確定性以及更寬泛的不確定性量化領域的核心。第一種是偶然(aleatoric)不確定性:世界本身那份無法消除的雜訊。一張模糊的照片、一次拋硬幣、兩個確實難分伯仲的診斷——再多的資料也消不掉它,因為答案本就沒被確定下來。這裡誠實的模型,就是把機率攤開、拒絕偽裝確定的那一個。
第二種口味是認知(epistemic)不確定性:一種模型*本可以*靠更多資料消除的無知,因為這個輸入落在了它訓練時幾乎沒見過的區域。這一種對安全最為要緊,而它恰恰就是網路過度自信時被弄丟的東西——模型沒有內建的辦法說出「我從沒見過這樣的東西」。估計它,通常意味著不去問一個模型,而是問一個*委員會*。一個由若干獨立訓練的網路組成的整合,或者在測試時仍開著 dropout 跑很多次前向傳播,都會給你一攤散開的答案。委員會意見一致時,就信它;意見炸成一片時,這份分歧就是你的認知警報。完整的貝氏神經網路把這件事正式化:它把權重本身當成分佈,再用蒙地卡羅對樣本求平均,來估計由此而來的不確定性。
識別那些你本就不該處理的輸入
校準默認輸入至少和你的訓練資料屬於同一個世界。但最嚇人的失敗恰恰發生在它不屬於的時候——把一張 X 光片餵給貓的分類器、讓詐騙模型撞上一種全新的騙局、自動駕駛系統看到一塊被雪蓋住的路牌。本階梯第一篇點出了這個隱患,這裡我們點出它的防線。[[out-of-distribution-detection|分佈外偵測]]的任務,就是把那些與訓練中所見太不相像、以至於無法負責任地作答的輸入標記出來。它是模型的煙霧報警器:與其去猜,不如舉手說一句「這不是我該答的那類問題」。
分佈外偵測的近親是[[anomaly-detection|異常偵測]]:揪出那些罕見的、古怪的、對不上號的東西——詐騙交易、故障中的機器、網路裡的入侵者。它們共用的把戲,是先學會*正常長什麼樣*,再去度量一個新點離它有多遠。這個距離可以是重建誤差(一個只在正常資料上訓練的自編碼器,遇到怪東西時就會重建得磕磕絆絆)、可以是密度估計(輸入空間的這片區域幾乎是空的,那就該起疑)、也可以是一個整合投票的離散程度。這些辦法沒有一個是萬無一失的——一個精心構造的對抗性輸入,在偵測器看來可能完全正常——但合在一起,它們就組成了那一層,去接住單靠校準會漏掉的失敗。
最勇敢的回答,有時是「我不知道」
把校準、不確定性和異常偵測拼到一起,你就觸及了整個階梯的點睛之筆:一個會棄權的模型。它不再永遠吐出一個答案,而是被允許有第三個選項——「我沒有足夠把握,這個交給別人來處理吧」。設一個閾值:一旦校準後的自信度跌破它,或者輸入觸響了分佈外警報,模型就拒絕作答。這就是*選擇性預測*背後那個正式的念頭,它重塑了目標。你不再去追求純粹的準確率;你追求的是覆蓋率(模型多久作答一次)與它*在確實作答的那些樣本上*的準確率之間,那個恰到好處的權衡。答得更少,但每當作答時,對得多得多。
被棄權的那些情況去哪兒了?通常是交給人。這就和人在迴路的設計閉上了環:模型以機器的速度處理掉有把握的大頭,把不確定或異常的那條尾巴,轉交給一個掌握著模型所缺背景的人。一個把 8% 的掃描標記為「需要放射科醫生看」、同時篤定地放行其餘的醫療分診模型,要比一個對所有掃描都假裝有把握的模型有用得多——也安全得多。棄權不是模型在失敗;而是模型對自身能力的邊界,做到了值得信任的誠實。
一個誠實的提醒,對大語言模型尤其要緊。它們那份流暢的自信是一種格外誘人的錯覺:一個幻覺,是用和真實事實一模一樣篤定的口吻說出來的,而一個原始的聊天機器人,並沒有一個可靠的內部刻度盤顯示「我不確定」。研究者正在積極地為這些模型做校準、把不確定性引導出來,但這仍是一個未被攻克的前沿——你沒法從一句生成的話裡,簡單地讀出某個神奇的「自信度」欄位。把模型的口吻當成一種文體選擇,永遠別把它當成證據。這整個階梯的全部用意,就是用經過度量、經過檢驗、誠實的不確定性,去替換掉那份放錯了地方的信任。
落到實踐
讓模型知道自己不知道什麼,不是一個開關,而是你在核心模型跑通之後、一層層疊上去的一套小紀律。下面是通常最划算的順序,從最便宜到最費工。
- 先度量,再去修。在留出集上畫可靠性圖、算出 ECE;你修不了一份你從沒看過的校準。
- 廉價地重新校準。在驗證集上擬合溫度縮放——一個數字,不用重訓,它通常就能補上過度自信缺口的大半。
- 估計不確定性。若決策事關重大,就加上整合或測試時 dropout,讓你能把「世界本身吵」和「我已超綱」分開。
- 守好門。加上分佈外偵測與異常偵測,讓真正陌生的輸入被攔下,而不是被自信地處理錯。
- 允許它棄權。設一個自信度閾值,把低自信或異常的樣本轉交給人,再隨時間一起監測覆蓋率和準確率。
最後再和運維那一階梯連一根線:今天校準得很好的模型,會隨著世界變化而漂移,所以這並非一勞永逸的修補。那個守望著概念漂移的模型監控,也應該隨時間盯著自信度——低自信輸入的突然激增,往往是世界已經從你模型腳下挪走的最早訊號。縱觀整個階梯,教訓始終如一:一個強大的模型贏得信任,靠的不是對什麼都答對,而是對自己所知的邊界足夠誠實。