為什麼「自信的錯誤答案」才最危險
設想一個醫學影像分類器,它只見過健康的肺和三種肺炎。某天來了一張罕見腫瘤的掃描片——完全在它所學之外的東西。普通網路毫不遲疑:它跑完運算,末端的 softmax 把分數歸一化成一個整齊的機率,然後宣布「87% 是肺炎,第二型」。這個數字看起來像信心,其實不是。它只不過是模型被迫在幾個選項中挑出的最大值。模型從未被賦予說出那唯一誠實之言的能力:*我從沒見過這樣的東西。*
這正是不確定性量化要彌合的鴻溝。一個有用的模型不應只輸出一個猜測;它應當輸出一個猜測,*外加*一個經過校準的、表明這個猜測有多可信的度量。前幾個階梯已教你把學習看作 貝氏推斷——隨證據到來而更新信念。貝氏深度學習不過是當你認真對待這一觀點、並把它應用到深度學習階梯裡那些龐大而富表達力的模型上時所發生的事。
兩種「不知道」
在動用任何數學之前,先把模型不確定的兩種本質不同的原因區分開來會很有幫助。偶然不確定性(aleatoric)是世界本身固有的雜訊。擲一枚均勻硬幣:即便擁有完美的知識,你也無法預測正反。一張模糊的照片、一個抖動的感測器、兩位病歷完全相同卻結局不同的病人——這種不可約的隨機性,無論你收集多少資料都不會縮小。模型能做的最好之事,就是如實地把它報告出來。
認知不確定性(epistemic)則不同:它是模型自身的無知,並且*確實*會隨著資料增多而縮小。分類器從未見過的那個腫瘤就住在這裡。你的訓練集從未涉足過的那片輸入空間也住在這裡。當模型被問及遠離其所學之物的東西時,正應是這種不確定性飆升之處——而普通網路那個過度自信的 softmax,恰恰是這一信號丟失的地方。貝氏深度學習的大部分內容,本質上都是用來找回認知不確定性的機器。
高斯過程:一個關於函數的分布
邂逅誠實不確定性最乾淨俐落的地方,是高斯過程。暫時忘掉權重。高斯過程不是給你的資料擬合一條曲線;它持有一個*關於所有能合理解釋這些資料的曲線的機率分布*。在你的資料點密集之處,所有候選曲線都被迫挨得很近,所以散布很窄;在資料點之間的空隙裡,曲線自由地散開——而這種散開*就是*不確定性,它以一條逐漸變寬的帶子替你畫了出來。
驅動這一切的引擎是核函數(kernel),它衡量任意兩個輸入有多相似。這與你早先在支持向量機裡遇到的核技巧出於同一直覺:相近的輸入應有相近的輸出,而核函數恰好編碼了「相近」到底意味著什麼。選一個平滑的核,你就得到平滑的預測;核函數正是你關於世界形狀的先驗信念進入模型的入口。用觀測資料對這個先驗做條件化,便得到一個後驗——在每一點上都是一個高斯分布,其均值給出預測,其方差給出疑慮。
它的代價很誠實,值得直說。高斯過程要把每個新點與每一個訓練點相比較,因此其成本隨資料集規模的立方增長。在幾千個點上,這美妙極了——機器人、科學實驗、超參數調優;而在數百萬張高維影像上,則不切實際。正是這道擴展之牆,使人們在大規模問題上轉向神經網路,也使得讓*那些*網路變得貝氏化,成了順理成章的下一個目標。
貝氏神經網路:帶著疑慮的權重
普通神經網路為每個權重學得一個數——一個由梯度下降找到的最佳取值。貝氏神經網路則把每一個這樣的單一數值換成一個*分布*:它說的不是「這個權重是 0.4」,而是「這個權重大概在 0.4 附近,上下浮動 0.1」。你不再是擬合一個網路;你維護的是一個覆蓋整片網路雲的後驗——其中每個網路都略有不同,卻都與訓練資料相容。
做預測時,你從那片雲中採樣出若干個網路,讓它們投票。它們一致之處,你便有信心;它們大相逕庭之處——通常是面對訓練中從未出現過的輸入——那種分歧*就是*你的認知不確定性,自然而然地浮現出來。難處在於,覆蓋數百萬權重的精確後驗根本無法計算。於是這一領域倚重你在本階梯已經見過的近似方法:變分推斷用一個更簡單的分布去逼近真實後驗,而 MCMC 及其他蒙特卡洛方法則從中採樣。
令人愉快的意外是:你或許已經在做這件事的廉價版本了。每個從業者都熟悉的兩個技巧,原來是喬裝打扮的近似貝氏推斷。在預測時保持 dropout(隨機失活)開啟、並把網路跑很多遍——即「蒙特卡洛 dropout」——幾乎不費代價就採樣出了一個粗糙的後驗。而從不同隨機起點訓練一小撮網路組成一個深度集成(deep ensemble),對認知不確定性的捕捉好到令人難堪——它至今仍是我們手頭最強的基線之一。
# Monte Carlo dropout: keep dropout ON at inference preds = [model(x, dropout=True) for _ in range(50)] mean = average(preds) # the prediction spread = stddev(preds) # the (epistemic) uncertainty
校準:讓數字名副其實
產出一個不確定性數字,與產出一個*誠實*的數字,是兩回事。校準正是檢驗誠實與否的標準:在模型說「70% 確定」的所有時刻裡,它是否真的大約有 70% 是對的?一個完美校準的天氣預報員,每當他說「30% 機率下雨」,那些日子裡也應大約有 30% 真的下了雨。你可以把這件事直接畫出來——一軸是預測的置信度,另一軸是實測的準確率——表現良好的模型會緊貼對角線。
現代深度網路出了名地*過度自信*:它們動輒說 99%,而實際只有 90% 的時候是對的。好消息是,修正這些數字往往很便宜。溫度縮放(temperature scaling)——把進入 softmax 之前的分數除以一個學到的單一數字——常常能在留出資料上修復網路的校準,而絲毫不動其準確率。它並不能給你認知不確定性;它只是讓網路已經報告出來的那些置信度變得可信。而這往往正是下游決策所需要的。
對迴歸模型而言,等價的誠實性檢驗是可信區間。當模型說「該值以 90% 的機率落在 [10, 14] 之間」時,在大量預測中,真值就應當大約有 90% 的次數落在這條帶子裡。一個過窄的可信區間,是模型在虛張聲勢;一個過寬的,則是因謹慎過度而變得無用。校準正是讓兩者都保持誠實的功夫。
它的落點——以及炒作越界之處
對當今最大的那些模型,值得保持清醒。當一個聊天機器人用流暢、自信的文字陳述一個錯誤事實時,那叫幻覺(hallucination),而貝氏深度學習並不能神奇地治好它。這裡的方法量化的是模型*在其訓練分布下對其預測*的不確定性;它們並不能給語言模型配上一個事實核查員或一種對真理的感覺。一個幻覺完全可能伴隨著很低的預測不確定性而被說出來,因為模型真的「相信」它那個流暢的猜測。知道模型有多確定確實有幫助;但這與知道它是否正確,並不是一回事。
誠實也沒有免費的午餐。完整的貝氏神經網路既昂貴又難以調對;那些廉價的替身——集成、MC dropout、溫度縮放——各自只捕捉了圖景的一部分,而且在真正的分布漂移下,它們本身也可能校準得很差。這一切都不是已解決的問題,一個在你的測試集上看起來校準良好的方法,可能在世界一變之際悄然失靈。把每一個不確定性估計都當作一個待檢驗的假設,而非一份保證。
那麼,請記住這一階梯被設計來傳遞的那個核心思想。學習就是在不確定性下的推理;一個會報告自己*有多確定*的模型——經過校準、誠實、其認知疑慮會在經驗的邊緣處增長——比一個只會脫口說出答案的模型,是根本上更值得信賴的夥伴。從一個點到一個分布、從「答案是 X」到「X,而這是該對它信任幾分」的這一轉變,正是你在這條階梯上所遇一切的、有原則的核心。把它帶向評估、帶向安全、帶向你所構建的每一個系統。