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

蒙地卡羅積分與 1/sqrt(N) 定律

丟一把隨機飛鏢,把答案平均起來,你就估出了一個積分。誤差縮得慢得令人心痛——只像 1/sqrt(N)——但它根本不在乎你身處幾維。正是這個取捨,讓蒙地卡羅撐起了現代世界。

積分其實是平均的化身

在前幾級你見過數值求積:把被積函數在精選的節點上取樣——梯形點、辛普森點、高斯-勒讓德點——再取一個聰明的加權和,就把積分釘住。那些規則在一維裡準得漂亮。蒙地卡羅積分從一個完全不同的直覺出發。它注意到積分其實偷偷是個平均。量 (1/(b-a)) * f 在 [a,b] 上的積分,按定義就是 f 在這段區間上的平均值。所以與其按網格擺節點,不如在 [a,b] 裡均勻隨機取樣 x,在那裡計算 f,再求平均。把這個平均乘上寬度 (b-a),你就得到積分的一個估計。

這裡有個小小的演算範例把它釘牢。要估計 f(x) = x^2 從 0 到 1 的積分(真值是 1/3),在 [0,1] 裡均勻抽出 N 個隨機點 x_1, ..., x_N,把每一個平方,再求平均:估計值就是 (1/N) * (x_1^2 + ... + x_N^2)。用 N = 4 個隨機抽樣,你可能得到大約 0.41;用 N = 1000,你通常會落在 0.333 的百分之一之內。你不需要反導函數,不需要網格,甚至不需要 f 平滑——你只需要能在一個隨機點上「計算」f。這種粗暴的簡單,正是它全部的魅力。

誤差有多大?1/sqrt(N) 定律

因為估計是個隨機平均,它的準確度由中央極限定理掌管——同樣來自你的機率那一級。N 個獨立抽樣之平均的標準差,按 sigma/sqrt(N) 縮小,其中 sigma 是單一隨機值 f(X) 的散布(標準差)。所以蒙地卡羅誤差的典型大小是 sigma/sqrt(N)——它按 O(1/sqrt(N)) 衰減。那個平方根是整個方法核心而冷峻的事實,值得讓你刻進骨子裡。

讓這份緩慢沉澱下來。要把誤差砍一半,你不是把 N 加倍——你得把它「乘四」。要多拿一位正確的小數位(準確度提升十倍),你需要一百倍的樣本。從 N = 10^4 跑到 N = 10^6,你的誤差只改善十倍。跟你早先爬過的階數那幾級相比——辛普森法是 O(h^4),譜方法對極大的 p 甚至可達 O(h^p)——O(1/sqrt(N)) 簡直像冰川一樣慢。如果蒙地卡羅只會用在辛普森法所在的那種一維積分上,它會是個糟糕的笑話。

true value of integral of x^2 on [0,1]  =  0.33333...

   N         estimate     |error|       ~ sigma/sqrt(N)
   100       0.351        0.018         0.030
   10,000    0.3356       0.0023        0.0030
   1,000,000 0.33339      0.00006       0.00030

  100x more samples  ->  ~10x smaller error   (one extra digit)
  error ~ 1/sqrt(N):  the rate, not the exact number, is the law
N 每跳一百倍,只買到多一位正確數字——這正是 O(1/sqrt(N)) 的印記。

致命優點:誤差不在乎維度

現在來到救贖一切的轉折。再看一眼誤差公式 sigma/sqrt(N):維度數 d 並未出現其中。任何地方都沒有。蒙地卡羅積分的誤差是與維度無關的——不論你是在一條線上、一個正方形上、還是一個五百維的立方體上積分,它都按 O(1/sqrt(N)) 下降。這不是個小小的便利;它正是這個方法存在的理由。對照一下基於網格的求積在維度爬升時會發生什麼。

假設你在每個軸上鋪 n 個點以得到一張勉強可用的網格。一維是 n 次計算。二維你需要完整的 n 乘 n 網格,所以是 n^2 次。d 維你需要 n^d——而這個爆炸正是你早先見過的維度詛咒。用適中的 n = 100 與 d = 10,一張乘積網格就要 100^10 = 10^20 次函數計算:完全不可能。更糟的是,那些網格規則的「準確度」也隨維度衰退,因為每個軸都被點數餓著。蒙地卡羅乾脆無視這一切。十維或一萬維,它照樣磨出 O(1/sqrt(N))。那個在一維裡看來丟臉的緩慢平方根,到了一千維就成了奇蹟——在那裡每一條確定性規則早已崩潰。

誠實地搭起這個估計式

讓我們把配方拼起來,並對每樣材料說精確。要估計 f 在一個體積為 V 的區域上的積分,就在區域內均勻隨機抽 N 個點,把 f 值平均,再乘上 V。隨機性來自第一篇指南的偽隨機數產生器——並記得它誠實的告誡:那些數字是「確定性」的。用同樣的方式設定種子,你就重播出一模一樣的「隨機」點,這是特性而非缺陷,因為它讓你的蒙地卡羅執行可重現。要從一個不是普通均勻方塊的區域或分布裡抽點,你就去拿第二篇指南的取樣機械——逆變換與拒絕取樣——把均勻抽樣轉成你需要的任何形狀。

  1. 決定要估計什麼:f 在一個已知體積 V 的區域上的積分(或更一般地,某個量在某分布下的期望值)。
  2. 用你的產生器在區域內抽 N 個獨立隨機點(方塊就用均勻;否則用第二篇指南的工具對分布取樣)。
  3. 在每個點上計算 f,並組出樣本平均 (1/N) * f(x_i) 之和。
  4. 把這個平均乘上 V,得到積分估計。
  5. 也要回報一條誤差棒:用同一批樣本估出 sigma,並標上 sigma/sqrt(N)。絕不要交出一個沒有誤差棒的蒙地卡羅數字。

最後那一步是誠實實踐者的標記。蒙地卡羅交給你的不只是估計,還有一個「內建」的誤差估計,因為你拿來平均的那些樣本本身就告訴了你它們的散布 sigma。你把結果報成「估計值正負 sigma/sqrt(N)」——通常是一個標準差(約 68%)的帶,或用 2*sigma/sqrt(N) 表示約 95% 的帶。這相對於確定性規則是個真正的優勢,那裡誤差是真實的卻看不見,除非你多做工。但要握住兩條警告。其一,誤差棒本身就是個隨機估計,當 sigma 很大或分布是重尾時可能誤導,所以它是個指引,不是保證。其二,跟這整個領域裡每個數值答案一樣,結果是「近似的」,活在浮點運算裡;把數百萬個微小貢獻相加可能因捨入而丟位,所以仔細的實作可能會用補償求和。

兩個誠實的旋鈕:變異數與點的序列

盯著誤差 sigma/sqrt(N) 看,你恰好看到兩個旋鈕。一個是 N,樣本數——但它坐在平方根底下,所以蠻力堆 N 既貴又很快碰到報酬遞減。另一個是 sigma,你所平均之物的變異數——而「那裡」才藏著真正的槓桿。若你能把同一個積分改寫成一個逐點變化更小的量之平均,sigma 就下降,誤差也按比例免費下降,N 還動都沒動。降低 sigma 正是下一篇指南變異數縮減——重要性取樣、控制變量、分層取樣——的全部把戲,它能把 sigma 砍掉一大截,往往遠比砸硬體堆更大的 N 划算。

還有一條更狡猾的路能打敗平方根,值得點名,好讓 1/sqrt(N) 定律不至於感覺像座鐵牢。擬蒙地卡羅放棄真正的隨機,改鋪一個低差異序列——這些點被工程化得比隨機散落均勻得多,而隨機散落往往會結團並留下空隙。對性質好(平滑、維度不太高)的被積函數,它能收斂得幾乎像 O(1/N) 而非 O(1/sqrt(N))——幾近平方級的改善。誠實的代價是:擬蒙地卡羅不再真正隨機,所以那條乾淨的中央極限誤差棒蒸發了,而它的優勢也會隨維度攀升或被積函數變粗糙而褪去。而籠罩在這一切之上的,是當分布本身糾結得無法直接取樣時你會撞上的那道牆——通往馬可夫鏈蒙地卡羅的門戶,也就是本級的最後一篇指南。