步長取捨(step-size trade-off)
直覺說,要更精確地量斜率,就該縮短橫向步長——把兩點越拉越近。在電腦上,這個直覺是陷阱。步長縮得太過,答案不會持續變好,反而開始變糟。步長取捨就是決定最佳步長 h 的兩股相反誤差之間的拉鋸。
兩種誤差往相反方向拉扯。截斷誤差來自用有限步長代替真正的極限;對中心差分大約是 C1 * h^2,所以 h 縮小它就縮小。捨入誤差來自浮點減法 f(x + h) - f(x - h):當 h 極小,這兩個數幾乎相等,相減就丟掉大部分有效位數(災難性抵消),再把這個帶雜訊的結果除以極小的 h 又把它放大——這部分大約是 C2 * epsilon / h,其中 epsilon 是機器精度,所以 h 縮小它反而增大。總誤差大致是 C1 h^2 + C2 epsilon / h,呈 U 形曲線。把它最小化得到最佳 h 約為 epsilon^(1/3)——對雙精度(epsilon 約 10^-16)就在 10^-5 附近,那裡你能指望約 10 到 11 個正確位數,而非全部 16 個。
這是數值計算中最重要的誠實課之一:微積分那種天真的取極限,在有限的機器上無法重現。這課可以推廣——前向差分的截斷誤差約 C1 h、捨入誤差約 C2 epsilon / h,最佳 h 約為 sqrt(epsilon),在 10^-8 附近。實務上的逃生路有:把 h 選在理論最佳值附近;用理查森外推消去截斷項,好讓你能用較大、較安全的 h;或者——只要辦得到,這是最好的——使用自動微分,它精確算出導數,根本沒有任何步長。
在雙精度下用中心差分對 f(x) = e^x 在 x = 1 求導。h = 10^-2 時誤差約 4e-5;h = 10^-5 時誤差降到谷底約 3e-11;但 h = 10^-10 時誤差又「攀升」回約 1e-6,因為此時抵消主宰一切。把誤差對 h 作圖,就看到那條經典的 V 形。
誤差對 h 呈 V 形:先有甜蜜點,再被捨入誤差毀掉。
一個普遍的錯誤是把有限差分導數或梯度的 h 寫死成 1e-12 或更小,誤以為越小越精確;那可能丟掉你一半的位數。若精確導數很重要(例如最佳化),請優先用自動微分,而不是手動調 h。