沒有誤差棒的數字,還不算是答案
這一整級講的都是值得信賴的軟體:不要自己重造輪子、把驗證與確認分開、做收斂研究、讓結果可重現。這最後一篇要把這個迴圈收攏,回到當你交出一個結果時、科學家真正會問的問題——不是「這數字是多少?」,而是「你有多確定?」一個印出 `drag = 1.732`、卻沒有誤差棒的模擬,是在做一個它撐不起來的宣稱。我們研究過的每一步都把不確定性滲進那串數字裡:模型是近似的、輸入是量測得不完美的、浮點運算會捨入、離散化會截斷。
把不確定性誠實地分成兩類會很有幫助。偶然性不確定性是世界裡真正的隨機——一陣陣風、一顆有雜訊的感測器、一次擲骰——再多計算也消不掉它,你只能描述它的散佈範圍。認知性不確定性則是你自己的無知——一個你只知道到兩位數的材料常數、一個你懷疑太簡化的模型——這一類會在你學得更多時縮小。為什麼這個區別重要:多跑幾次平均,無法減少你「猜錯」的某個參數裡的認知性誤差,卻能撫平偶然性的散落。把兩者搞混,就是一個結果最後配上「自信、精確、卻錯誤」的誤差棒的原因。
把不確定性推過機器
不確定性量化,也就是我們現在要講清楚的 不確定性量化(UQ),問的是:既然輸入是不確定的,輸出有多不確定?最直接的攻法是用抽樣做前向傳播——蒙地卡羅,正是上一級的那一套。從輸入各自的機率分佈裡抽出許多組輸入、對每一組跑完整的模擬,再看輸出的散佈:它們的平均是你最好的估計,它們的標準差就是你的誤差棒。它美在簡單,而且當模擬是個複雜的黑箱時,它幾乎是唯一行得通的辦法。
但別忘了蒙地卡羅誠實的代價:它的抽樣誤差只以 O(1/sqrt(N)) 的速度下降。要把誤差棒減半,你得跑四倍的次數;如果每一次跑是一小時的流體模擬,一千個樣本就是一千小時。這就是為什麼天真的抽樣式 UQ 往往負擔不起,也是為什麼有更聰明的路徑。多項式混沌,也就是 多項式混沌展開,用少數幾次精挑細選的跑法,擬合出一個平滑的代理模型——一個以不確定輸入為變數的多項式——再從那個代理上便宜地讀出平均與變異數。當輸出平滑地只依賴少數幾個輸入時,它能收斂得遠比 1/sqrt(N) 快;但當有數十個粗糙的輸入時,維度詛咒就咬上來,這時對維度無感的純蒙地卡羅又再度勝出。
一個更便宜、更窄的近親是敏感度分析,也就是 敏感度分析,它問的是答案究竟在乎哪些輸入。在局部,它就只是一個導數:把第 i 個輸入擾動一點點,看輸出移動多少,也就是偏導數 d(輸出)/d(輸入_i)。敏感度大的輸入主宰你的誤差棒,值得更好的量測;輸出幾乎不理會的輸入,則可以固定在一個猜測值上。做成全域版本——讓輸入在整個範圍內變動——它能排出哪些不確定性值得去追。這往往是你能做的最有價值的 UQ,因為它告訴你下一塊錢的力氣該花在哪。
反問題:把模擬倒著跑
到目前為止,我們都把世界往前跑:已知的原因進去、預測的結果出來。但科學通常想要相反的東西。你量到的是結果——身體周圍的 X 光陰影、地表的地震抖動、金屬棒邊界上的溫度——而你想還原那個隱藏的原因:內部的組織密度、底下的岩層、裡頭的熱源。這就是反問題,也就是 反問題,正是計算數學在醫學、地球物理與影像領域掙錢的地方。前向映射就是你已經信任的那個模擬;反問題則丟出殘酷的要求:從帶雜訊、不完整的資料把它反轉回去。
麻煩在於,反問題幾乎總是不適定的——正好和我們偏愛的適定問題相反。一個適定問題有解、解唯一、而且解隨資料連續變化。反問題卻常常在最後這點上慘烈地失守:量測值的一絲抖動,會讓還原出的原因瘋狂擺盪。用這座階梯的語言來說,反向映射有一個巨大無比的條件數。透過前向算子的奇異值分解來想:它有一些幾乎為零的奇異值,而反轉就是去除以那些極小的數字,於是任何搭著便車的量測雜訊都會被放大上百萬倍。
一個具體的畫面:電腦斷層掃描,也就是醫院裡的 CT,是一個你親身躺進去過的反問題。一圈偵測器記錄 X 光沿著穿過你身體的數千條線各被吸收了多少;重建要解出每個內部點的密度,使其恰好產生那些陰影。在完美、完整的資料下,這套代數能乾淨地反轉。但在低劑量掃描那種真實、略帶雜訊、略為稀疏的資料下,天真的反轉會炸成一場掩蓋住解剖構造的雪花雜訊風暴。數學正在尖叫:照字面理解,這個問題沒有穩定的答案。
正則化:用一點點偏差換來大量的穩定性
解藥是正則化:與其要求那個「完美」擬合資料的輸入——那會把雜訊追進一片胡言——你改成要求一個「夠好地」擬合資料、同時又「合理」的輸入。你注入一個偏好,叫做先驗:真實的影像大概是平滑的、真實的源大概是小的、岩層大概不會鋸齒狀。在數學上,你不再只最小化失配 ||A x - b||_2,而是改去最小化 ||A x - b||_2^2 + lambda * ||x||_2^2,其中第二項懲罰那些狂野的解。這就是 Tikhonov 正則化,也就是你最早在馴服病態最小平方時遇到的 Tikhonov 正則化——而它正是同一帖藥,因為一個反問題就是一個變得危險的最小平方擬合。
Naive inverse: minimize ||A x - b||_2^2 -> fits noise, x blows up (cond(A) ~ 10^8) Tikhonov: minimize ||A x - b||_2^2 + lambda * ||x||_2^2 small lambda -> close to naive, still noisy (under-regularized) large lambda -> very smooth, but too far from data (over-smoothed) right lambda -> balance, found at the 'corner' of the L-curve
有一條更乾淨的路能看清正則化在做什麼,就是直接穿過 SVD。那場爆炸完全來自於去除以那些近乎為零的奇異值。截斷 SVD 正則化,也就是 截斷 SVD 的做法,乾脆把那些危險的模態丟掉:留下承載真實訊號的大奇異值、丟掉只承載被放大雜訊的小奇異值。Tikhonov 做的是同一件事更溫和、連續的版本——它用 sigma^2 / (sigma^2 + lambda) 平滑地降低每個模態的權重,幾乎不碰那些強模態、卻把弱模態壓垮。兩者都說著同一句誠實的話:資料根本不含關於最細部的可靠資訊,所以別假裝你能還原它們。
正則化不是免費的,把這點說清楚也是誠實的一部分。懲罰項引入了偏差:一張被平滑過的重建,可能把一條真實、銳利的邊緣抹成一道緩坡。正則化參數 lambda 是一個貨真價實的偏差—變異數權衡的旋鈕——太少,雜訊就佔上風(高變異數);太多,你就把真實的特徵塗糊掉(高偏差)。沒有一個放諸四海皆準的 lambda;你用 L 曲線或交叉驗證這類有原則的工具去挑它,並且把這個選擇報告出來。一張沒有寫明它的 lambda 與先驗的重建影像,就跟一個沒有單位的量測一樣不可重現。
報告一個誠實的結果
把這一切拼起來,這就是一位審慎的計算科學家如何把一個生硬的數字,變成一個值得信賴的數字。目標從來不是那個單一的點估計本身;而是估計值,加上一份站得住腳的說明,講清楚它可能偏離多遠、以及為什麼。
- 先做驗證:確認程式把方程「算對」了(用人造解、做一個達到預期 O(h^p) 的收斂研究)。架在有 bug 的程式上的誤差棒一文不值。
- 列出每一個不確定性來源,並標上偶然性(不可消除的雜訊)或認知性(你的無知),這樣你才知道哪些是更多資料能縮小的。
- 把它們往前傳播——黑箱用蒙地卡羅、當響應對少數幾個輸入平滑時用多項式混沌——以求得輸出的散佈範圍,而不只是它的中心。
- 如果你在解反問題,就做正則化、為先驗辯護、並報告所選的 lambda;記得這個結果按其構造本就偏向那個先驗。
- 把誤差預算說出來:納入你收斂研究得到的離散化誤差、以及浮點數的地板,而且報告的有效位數,絕不能多於你能辯護的程度。