JOVANA
Explore Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

向後穩定性:你所能期望的最好結果

你不能要求演算法給出「你那個問題」的精確答案——浮點數不允許。但你可以要求次好的東西:某個「與你的問題無法區分」之問題的精確答案。這個承諾就是向後穩定性,數值計算的黃金標準。本文逐一拆解它到底替你買到了什麼、又買不到什麼。

理想的快遞員

上一篇把誤差拆成兩張面孔:向前誤差,也就是你的答案離真值多遠;以及 向後誤差,也就是把輸入改動多小,就能讓你的答案恰好正確。結果向後誤差才是你通常量得出來的那個,因為它從不要求你知道真實答案。本文往前走一步,問:你能對一個演算法提出的、最強而又最誠實的要求是什麼?答案就是 向後穩定性,而它完全由向後誤差構築而成。

想像你雇了一位快遞員。你不能要求他把東西送到精確到毫米的 GPS 座標——世界沒那麼精確,你寫下的地址也沒那麼精確。你能合理要求的,是送到一個「就你地址裡既有的雜訊而言,與你本意之處無法區分」的點。向後穩定演算法 就是這位理想的快遞員。它回傳的不是「你那個問題」的精確答案;而是某個「與你的問題相差頂多一絲」之問題的精確答案——擾動的量級是 單位捨入 u,雙精度下約 10^-16。

為什麼甘願接受鄰近問題的答案,而不是你那個問題的答案?因為你的問題從一開始就不精確。它的資料來自量測,或來自實數一存入就被捨入成浮點數的那一刻。如果演算法的擾動比你輸入裡既有的不確定性還小,那麼你就真的無法把它的答案,和你「希望擁有」之真實問題的答案區分開來。演算法把自己的捨入藏進了你無可避免的雜訊裡——而這正是任何有限精度方法所能承諾的極限。

定義到底在說什麼

讓我們把它講乾淨。一個本應計算 y = f(x) 的演算法,若對每個輸入 x,它實際算出的值 y-hat 都「恰好」等於某個擾動 delta-x 下的 f(x + delta-x),且該擾動的相對大小 ||delta-x|| / ||x|| 是 u 的量級,則稱為向後穩定。請讀兩遍。這裡是等號,不是近似:算出的 y-hat 就是 f 完美而數學上精確的輸出——只是餵了一個被輕推過的輸入。橫跨數千次浮點運算所發生的一切雜亂捨入,被一口氣交代清楚,方法是把它重新打包成對資料的單一微小改動。

computed answer    y-hat
backward-stable :  y-hat = f(x + delta-x)   EXACTLY,
                   with  ||delta-x|| / ||x||  =  O(u)

good news:  you can often bound delta-x WITHOUT knowing the true y
the rule :  forward error  <=  kappa(problem) * backward error
                              =  kappa(problem) * O(u)
一個框內的向後穩定性,以及把它換算成準確度的法則。

這不是一個沒人達得到的抽象理想。你日後會倚賴的主力演算法,有出乎意料多是可證明向後穩定的:帶 部分樞紐選擇高斯消去法(做 LU 分解 與求解 A x = b 的標準方式)、由 豪斯霍爾德轉換 構成的 QR 分解,以及幾乎每個科學函式庫底層都會呼叫的 LAPACK 精煉常式。當你在慣用環境裡敲一個反斜線去解線性系統時,你幾乎肯定正在運行一個向後穩定的方法,而完全不必去想它。

為什麼該證明的是向後誤差,而非向前誤差

向後穩定性不只是一個聰明的定義;它是一場歷史戰役的倖存者。在 1950 年代以前,分析捨入意味著追著每個微小誤差「往前」穿過計算,眼看最壞情況的界限一步步膨脹,直到它對那些實際上跑得好好的計算預言出災難。那些向前界限誠實卻無用——過於悲觀,根本無法區分好方法與壞方法。詹姆斯·威爾金森(James H. Wilkinson)在英國國家物理實驗室操作早期機器時,把問題反過來問,賦予了這個領域現代的樣貌。

他的這一招,如今稱為 向後誤差分析,是不再追蹤誤差如何在答案中堆積,而改為證明一個單一陳述:算出的 y-hat 恰好是 f(x + delta-x) 的精確答案,其中 delta-x 受到 u 的某個適度倍數的界限。其精妙在於,它把舊式向前分析無望糾纏在一起的兩件事乾淨地分開——「演算法」的品質(它的向後誤差)與「問題」的難度(它的 條件數)。兩者各自變得可處理;相乘,你就找回了你真正在乎的向前誤差。這項重新表述讓威爾金森贏得了 1970 年的圖靈獎。

人人都漏掉的關鍵:穩定不等於準確

這是你該從本文帶走的、最重要也最常被誤解的一件事:向後穩定「不」保證向前誤差小。它只保證向後誤差小。這能否換成一個準確的答案,完全取決於問題的 條件數,透過上一篇的主法則:向前誤差至多等於條件數乘以向後誤差。對向後穩定方法來說,向後誤差約為 u,所以向前誤差約為(條件數)乘以 u——不會更小。

在單一例子上走一遍算術,感受一下。你用向後穩定的 LU 求解器解 A x = b,所以向後誤差約為 10^-16。若 矩陣條件數 kappa(A) 約為 10^8,向前誤差就約為 10^8 乘以 10^-16 = 10^-8:你在 16 位裡得到約 8 位正確的有效數字。把同一個完美求解器交給一個 kappa(A) 約為 10^13 的矩陣,向前誤差就變成 10^13 乘以 10^-16 = 10^-3:只剩約 3 位可信的數字。求解器兩次做的事一模一樣。準確度的差別完全來自問題本身。

  1. 你的答案看起來不對。先忍住別怪程式。
  2. 估計向後誤差(或殘差,它正報告著向後誤差)。若它約為 u,你的演算法就在盡責——它是向後穩定的。
  3. 估計問題的條件數 kappa(對線性系統,向函式庫索取 kappa(A))。
  4. 相乘:向前誤差約為 kappa 乘以 u。若 kappa 巨大,損失的位數是問題的錯,換演算法救不了你——只有重新表述問題或採用更高精度才行。

所以向後穩定正是你該對方法提出的要求,而它也是天花板:它已經做到了演算法「所能」做的一切。在良態問題上,這換成一個漂亮且準確的答案;在病態問題上,這換成一個很大的向前誤差,而那不是演算法的錯。這正是為什麼標題說「你所能期望的最好結果」——你可以期望向後穩定並且如願以償,但你無法期望勝過問題本身的條件性。

一位較溫和的表親:混合向前向後穩定性

純粹的向後穩定是個嚴苛的承諾——某個鄰近問題的「精確」答案,輸出端不允許有任何抖動。有些完全值得信任的演算法做不到這個承諾,對它們而言有一個稍微放寬的標準,叫做 混合向前向後穩定性。它說算出的 y-hat 「幾乎」就是某個「鄰近」問題的精確答案:在輸入與輸出兩端都允許一點小抖動。形式上,y-hat + delta-y = f(x + delta-x),其中兩個相對擾動 ||delta-y|| / ||y|| 與 ||delta-x|| / ||x|| 都是 u 的量級。

令人安心的事實是,混合穩定替你買到「相同」的實務準確度界:向前誤差為(條件數乘以 u)等級,與向後穩定的情況一模一樣。所以就「信任一個答案」而言,混合穩定的演算法基本上和向後穩定的一樣好——這份放寬給了分析者喘息的空間,卻不犧牲準確度。許多真實演算法,包括標準的特徵值常式,是混合穩定而非純粹向後穩定,而你在結果裡永遠不會察覺差別。

該帶往後續的事

向後穩定性重新框定了數值方法的整個目標。你不再要求不可能的事——「給我精確答案」——而開始要求可達成的事:「成為某個與我相距僅在捨入距離內之問題的精確答案」。當一個方法達到那道標準時,你就有了清楚的責任劃分。演算法已盡到它的本分;任何殘餘的不準確都屬於問題的條件性,你就在帳本的那一邊處理它,靠重新表述或靠多花精度。

本階的下一篇、也是最後一篇,用「準確度 = 條件性 乘以 穩定性」這句口號,把這層夥伴關係挑明。你現在握有兩半:本文給了你穩定性,作為演算法所能達到的黃金標準;而稍早的幾篇給了你條件性,作為問題那不可撼動的性質。把它們合在一起,你終於能對你跑的任何計算,回答那個唯一重要的問題——我究竟能信任幾位數字?