シミュレーション:モンテカルロ法は遅いのではなく次元に鈍感【第34回】

はじめに

第32章はシミュレーションです。そして連載本編の最終回になります。

この連載では最初の回から、ほとんど毎回シミュレーションを使ってきました。「理論値と実測値を並べて確かめる」というやり方です。ところがその中身は、毎回こう書いていただけでした。

rng = np.random.default_rng(42)
x = rng.exponential(1.0, 100000)

rng.exponential の中で何が起きているのかを、私は一度も考えたことがありませんでした。 一様乱数しかない状態から、どうやって指数分布や正規分布が出てくるのか。第32章はその中身です。連載でずっと使ってきた道具の裏側を、最後に回収する回になります。

学び始める前の私は、この章を「テクニックの詰め合わせ」だと思っていました。逆関数法、棄却法、ボックス=ミュラー法、ブートストラップ法、並べ替え検定、分散減少法。名前が10個くらい並んでいて、それぞれ別に覚えるものだと。

ところが手を動かしてみて、いちばん効いたのは個々の手法ではなく章の構造でした。この章に出てくる技術は2種類しかありません。乱数を「作る」技術と、乱数を「使う」技術です。この2つを分けた瞬間に、10個の名前がきれいに2列に並びました。

そしてもう1つ、思い込みが崩れました。モンテカルロ法は速くも正確でもありません。 1変数の期待値を求めるだけなら、等間隔グリッドの数値積分に1億倍の精度差で負けます。実測しました。それでも使われるのは、精度で勝つからではなく「他の方法が全滅する場所でも生き残る」からでした。よく言われる「精度は 1/n1/\sqrt{n} でしか上がらない」は、遅いという欠点ではなく「次元に鈍感」という長所だったのです。

この回で扱う用語

用語意味
一様乱数0 と 1 のあいだを平らに埋める乱数。すべての出発点
逆関数法(inverse transform method)累積分布関数の逆関数に一様乱数を通して任意の分布を作る
棄却法(accept-reject method)密度を覆う図形に点をばらまき、密度の下に落ちた点だけ採る
採択率棄却法で採用される割合。覆いの中に入っている密度の面積 ÷ 覆いの面積
ボックス=ミュラー法(Box-Muller transform)一様乱数2個から正規乱数2個を無駄なく作る
擬似乱数決定的な漸化式で作る「乱数のように見える列」
周期擬似乱数列が一周して繰り返しはじめるまでの長さ
シード(種)擬似乱数列の出発点。同じシードなら同じ列が出る
モンテカルロ法乱数を使って数値(積分・確率・期待値)を推定する方法の総称
モンテカルロ積分積分を「ランダムに置いた点での平均」で近似する
次元の呪い次元が上がると必要な計算量が指数関数的に増える現象
分散減少法同じ回数でも誤差を小さくする一群の技術
対照変量法(antithetic variates)uu1u1-u をペアで使って打ち消し合わせる
層別サンプリング(stratified sampling)区間を分割し、各区画から1点ずつ引く。多次元では座標ごとに分割してシャッフルする(ラテン超方格法)
制御変量法(control variates)期待値が既知で相関の高い量を引き算する
重点サンプリング(importance sampling)わざと起きやすい分布から引き、重みで割り戻す
提案分布重点サンプリングや棄却法で、実際に乱数を引く分布
重み提案分布で歪めた分を割り戻す係数。p(x)÷q(x)p(x) \div q(x)
ESS(Effective Sample Size=有効サンプルサイズ)nn 個引いたうち実質いくつが効いているか
指数傾斜(exponential tilting)密度に etxe^{tx} を掛けて正規化し、分布の中心をずらす操作
ブートストラップ法(bootstrap)手元のデータから復元抽出して推定値のばらつきを測る
並べ替え検定(permutation test)群のラベルを入れ替えて帰無仮説のもとでの分布を作る
ジャックナイフ法(jackknife)1個ずつ抜いて推定値のばらつきを測る。乱数を使わない

この章の地図:乱数を「作る」技術と「使う」技術

先に地図を出します。この章の理解はここで8割決まりました。

第32章の技術を2つに分類した図。左の青い枠は「① 乱数を作る技術」で出力は標本、内容は逆関数法・棄却法・ボックス=ミュラー法・擬似乱数生成器(線形合同法など)の4項目。右の赤い枠は「② 乱数を使う技術」で出力は数値・分布・結論、内容はモンテカルロ積分・分散減少法(重点サンプリングなど)・ブートストラップ法と並べ替え検定・MCMC(作る+使うの合体)の4項目。①から②へ「入力」と書かれた太い矢印が向かっている。中央下の黄色い枠に「モンテカルロ法という言葉は②を指す。①は乱数生成法/サンプリング法と呼ぶのが正確」、その下に「混乱の原因:どちらも乱数を大量に使うので、日常会話ではまとめてモンテカルロと呼ばれることがある」、最下部に「棄却法は①(作る)/重点サンプリングは②(使う)」と書かれている

① 乱数を「作る」技術② 乱数を「使う」技術
正式な呼び方乱数生成法・サンプリング法モンテカルロ法
入力一様乱数目的の分布の標本
出力標本(数値の列)数値・分布・結論
この章での例逆関数法、棄却法、ボックス=ミュラー法、擬似乱数生成器モンテカルロ積分、分散減少法、ブートストラップ法、並べ替え検定
成功の基準作った標本が正しい分布に従うか推定値が真値に近いか
失敗の症状別の分布になっている値が真値からずれる/収束しない

①の出力が②の入力になります。 そして「モンテカルロ法」という言葉は、本来②だけを指します。①は「乱数生成法」または「サンプリング法」です。

私はこの区別が付いておらず、棄却法とモンテカルロ法を同じものだと思っていました。混乱するのは自然で、というのも実際にまったく同じデータから両方が作れるからです。

正方形にダーツを400万本投げて、円の中に入ったかどうかを記録します。

  • 緑の点の「個数」だけを使う → 円の面積比 π/4\pi/4 の推定値が出る → π=3.142276\pi = 3.142276(真値 3.141593)。これがモンテカルロ法です。座標はもう捨ててよい
  • 緑の点の「座標」を使う → 円内の一様分布に従う標本が手に入る。これが棄却法です。個数はどうでもよい

投げたダーツは1組しかありません。個数を使うか座標を使うかだけが違います。 そして欲しいものが「数値」か「標本」かで、呼び名が変わる。

以下、第1部で①を、第2部で②を扱います。


第1部 乱数を「作る」技術

逆関数法:累積分布関数を横向きに読む

手元にある道具は rng.random() ひとつ、つまり 0 と 1 のあいだを平らに埋める一様乱数だけ、という状況から出発します。ここから指数分布の乱数を作りたい。

累積分布関数 F(x)F(x) は、いつもは横軸から縦軸に読みます。「x=1x=1 のとき、それ以下になる確率は 0.632」。逆関数法がやるのは、この読み方をひっくり返すことだけです。縦軸に一様乱数 uu を置いて、曲線にぶつけて、横軸に落とす。

指数分布の累積分布関数 F(x)=1-e^(-x) のグラフ。縦軸の u を 0.1 から 0.9 まで 0.1 刻みで等間隔に9個置き、それぞれから水平な赤い線を右に引いて青い曲線に当て、そこから垂直な赤い点線を下ろして横軸に落としている。横軸への着地点には赤い下向き三角が付いており、左側(0から1の範囲)に密集し、右側(2以上)はまばらになっている。図中に「縦軸は等間隔(0.1刻み)」と「横軸では左に密集し、右はまばら」という2つの注釈が矢印付きで入っている

縦軸には 0.1 刻みで等間隔に uu を置いています。一様乱数なので、どの高さも等確率で出ます。ところが曲線を経由して横軸に落とすと、着地点は左に密集し右はまばらになります。 9本の矢印の間隔が、左では狭く右では広い。

この偏りが、そのまま指数分布のかたちです。

なぜ偏るのか:傾きが密度だから

左側で矢印が密集しているのは、そこで曲線の傾きが急だからです。傾きが急な区間では、狭い xx 幅のあいだに縦軸の広い範囲が対応します。縦軸の範囲が広い、つまりそこに落ちる uu が多い、つまりその xx の近くに乱数が多く生まれる。

そして累積分布関数の傾きは、微分すれば確率密度関数そのものです。

左右2パネルの図。左は指数分布の累積分布関数に2本の接線を引いたもので、x=0.2 での傾きが0.819(赤)、x=2.5 での傾きが0.082(緑)と注釈されている。右は確率密度関数 f(x)=e^(-x) の曲線で、x=0.2 の点に0.819(赤)、x=2.5 の点に0.082(緑)と同じ数値が付いている。全体のタイトルは「傾きが急なところに多く落ちる=密度が高い は同じこと」

F(x)F(x)x=0.2x=0.2 での傾きは 0.819、x=2.5x=2.5 では 0.082。約10倍違います。右のパネルの f(x)=exf(x)=e^{-x} の値を見ると、まさに同じ 0.819 と 0.082。「傾き」と「密度」は別の話ではなく、同じ数字の別名でした。

ここが原理のすべてです。「傾きが急なところに多く落ちる」という図の見た目が、そのまま「密度が高いところに多く落ちる」という確率の主張になっている。逆関数法は、密度の情報を累積分布関数の傾きという形で借りてきて、それを一様乱数の落下先の混み具合に翻訳する装置でした。

手続きは2行

u一様(0,1),X=F1(u)u \sim \text{一様}(0, 1), \qquad X = F^{-1}(u)

指数分布なら F(x)=1exF(x) = 1 - e^{-x}uu について解いて、X=log(1u)X = -\log(1-u) です。実際にやってみます。

一様乱数20万個を -log(1-u) に通して作った指数分布のヒストグラム(水色)と、理論密度 e^(-x) の赤い曲線を重ねた図。横軸は0から6のx、縦軸は密度。ヒストグラムが赤い曲線にぴったり乗っている。タイトルは「一様乱数だけから指数分布ができている」

確かめた量実測(20万個)理論値
平均1.002341
分散0.999751
中央値0.696990.69315(=log2= \log 2
P(X1)P(X \le 1)0.629790.63212
P(X2.5)P(X \le 2.5)0.917970.91792

乱数生成器の側は、指数分布のことを何も知りません。 rng.random() を呼んで log(1u)-\log(1-u) に通しただけです。

なぜ正しいのか:区間が1対1に対応している

「傾きが密度」という説明は直感的ですが、もう一段だけ厳密にしておきます。ここが分かると逆関数法は完全に手の内に入ります。

準備は2つだけです。

準備1。累積分布関数の縦軸は確率です。 だから縦軸上のある区間の「長さ」は、そのまま確率の値になっています。累積分布関数は「確率を長さに変換する装置」だと言えます。

準備2。一様乱数は「長さがそのまま確率になる」乱数です。 区間 [a,b][a, b] に入る確率は bab - a。定義から。

指数分布の累積分布関数のグラフに、3組の対応する区間を色分けして示した図。x軸側の下部に赤(0から0.5)・緑(1から2)・橙(2.5から4)の帯があり、u軸側の左部にそれぞれ対応する赤(0から0.3935)・緑(0.6321から0.8647)・橙(0.9179から0.9817)の帯がある。各組は薄い色の長方形で結ばれ、u軸側の長さが「長さ 0.3935」「長さ 0.2325」「長さ 0.0638」と表示されている。x軸ラベルに「帯の幅はバラバラ」、y軸ラベルに「帯の長さ=そのまま確率」と付記されている

xx 軸側の帯は幅がバラバラ(0.5 / 1.0 / 1.5)ですが、uu 軸側の帯の長さはそれぞれの区間の確率そのものになっています。

xx の区間対応する uu の区間uu 側の長さその区間の確率
[0,0.5][0, 0.5][0.0000,0.3935][0.0000, 0.3935]0.39350.3935
[1,2][1, 2][0.6321,0.8647][0.6321, 0.8647]0.23250.2325
[2.5,4][2.5, 4][0.9179,0.9817][0.9179, 0.9817]0.06380.0638

あとは3段です。

  1. uu が帯 [F(1),F(2)][F(1), F(2)] に落ちる確率は、その長さ = 0.2325(一様乱数の定義から)
  2. 帯に落ちたら、FF は増加関数なので F1(u)F^{-1}(u)[1,2][1, 2] に入る。この例(連続で狭義に増加)では1対1に対応しているので、取りこぼしも重複もない
  3. よって XX[1,2][1,2] に入る確率も 0.2325。そしてこれが、もともと欲しかった分布での P(1X2)P(1 \le X \le 2) と同じ数字

式にすると1行です。

P(Xx)=P(F1(u)x)=P(uF(x))=F(x)P(X \le x) = P\left(F^{-1}(u) \le x\right) = P\left(u \le F(x)\right) = F(x)

2番目の等号が「FF が単調非減少なので不等号の向きが保たれる」(厳密には次の節で述べる一般化逆関数の性質 F1(u)x    uF(x)F^{-1}(u) \le x \iff u \le F(x))、3番目が「一様乱数が [0,F(x)][0, F(x)] に入る確率は長さ F(x)F(x)」。そして最後の F(x)F(x) が、まさに目標の分布の累積分布関数です。到達しました。

実測で確認しました。 一様乱数200万個について「uu が帯に入ったか」と「XX が区間に入ったか」を1個ずつ比べたところ、200万個すべてで判定が一致(不一致 0 件)でした。

区間uu が帯に入った割合XX が区間に入った割合理論値
[0,0.5][0, 0.5]0.393390.393390.39347
[1,2][1, 2]0.232680.232680.23254
[2.5,4][2.5, 4]0.063640.063640.06377

左2列が小数第5位まで完全一致しているのがポイントです。確率が近いのではなく、同じ事象を2つの軸から見ているだけでした。

だから「どんな分布でも」作れる

いま使った性質は「FF が単調非減少で右連続である」ことだけです。だから分布ごとに新しい理屈は要りません。

ただし1つだけ条件を正確にしておきます。累積分布関数が必ず満たすのは「単調非減少」と「右連続」で、狭義の単調増加ではありません。 離散分布や、密度が0の区間がある分布では、FF に水平な部分があって1対1になりません。そのときは逆関数を

F1(u)=inf{x:F(x)u}F^{-1}(u) = \inf\{x : F(x) \ge u\}

と定義し直します(一般化逆関数)。こう定義すると F1(u)x    uF(x)F^{-1}(u) \le x \iff u \le F(x) が一般に成り立つので、上の1行の証明はそのまま通ります。 狭義増加を仮定しなくてよいのが、この定義の効き目です。

実演します。同じ10個の一様乱数(0.07, 0.15, 0.28, … 0.95)を、4つの違う F1F^{-1} に通しました。

2行2列の4パネル図。各パネルに異なる分布の累積分布関数の曲線と、同じ高さ(灰色の水平線10本)から落ちた着地点を示す下向き三角が描かれている。左上は指数分布で着地点が0から3に分布、右上は上限つきパレート分布(上限200)で着地点が10から65に偏り、左下は二山の混合分布で曲線が中央で平らになり着地点が-2.4から-1.3の群と1.6から4.5の群の2つに分かれ、右下は歪んだサイコロの階段状の累積分布関数で着地点が1から6の整数に潰れている。全体タイトルは「同じ10個の一様乱数を、違う逆関数に通しただけ。乱数の出どころは1つ。分布の情報は F だけが持っている」

4枚とも、灰色の水平線(uu の高さ)は同一です。違うのは曲線の形だけ。

uu指数分布上限つきパレート分布二山の混合分布歪んだサイコロ
0.070.072610.490−2.3641
0.150.162511.130−2.0001
0.280.328512.412−1.2501
0.360.446313.4091.6322
0.440.579814.6332.1582
0.550.798516.8762.6342
0.630.994319.1602.9283
0.781.514126.7383.4844
0.861.966135.4833.8425
0.952.995764.8014.4656

読み取れることが3つあります。

  • 曲線が立っている(密度が高い)ところでは着地点が密集し、寝ているところでは散らばる
  • 離散分布(右下)は、累積分布関数が確率 pkp_k の分だけ垂直に跳ぶので、その跳びの高さに落ちた uu(幅 pkp_k の区間)がすべて同じ値に写ることで実現される。連続分布と同じ手続きで離散分布も作れる
  • 二山の混合分布では、u=0.28u = 0.281.250-1.250 だったのが u=0.36u = 0.36+1.632+1.632飛んでいますu=0.30u = 0.30 付近が2つの山の谷間(曲線がほぼ水平)だからです。uu は等間隔なのに飛び地ができる

4つとも理論値と照合しました(各200万個)。

分布確かめた量実測理論値
指数分布平均0.998921
指数分布P(X1)P(X \le 1)0.632570.63212
上限つきパレート分布平均23.5315623.55515
上限つきパレート分布最大値199.999200(上限)
二山の混合分布平均1.498231.50000
二山の混合分布P(X<0)P(X < 0)0.301180.30094
歪んだサイコロ平均2.638802.64000

歪んだサイコロの各面の割合は 0.3502 / 0.1999 / 0.1507 / 0.1295 / 0.1000 / 0.0698 で、設定した 0.35 / 0.20 / 0.15 / 0.13 / 0.10 / 0.07 と一致しました。

結論。乱数生成器は rng.random() ひとつしかありません。4つの分布に共通の乱数源です。分布の情報は、乱数の側ではなく FF の形だけが持っています。 だから FF を書き下せる分布なら何でも作れる。「ライブラリに無い分布でも分析できる」という利点は、この一点に由来していました。

コラム:逆関数法と第4回の変数変換は同じ話なのか

第4回で変数変換とヤコビアンを扱いました。逆関数法もまた「一様乱数を別の値に変換する」操作です。同じ話なのか、ヤコビアンは出てくるのか。

同じ話です。逆関数法は変数変換の1次元・単調な場合の特殊ケースでした。そしてヤコビアンは出てきます。というより、ずっと使っていました。

第4回の公式は fX(x)=fU(u)du/dxf_X(x) = f_U(u) \cdot |du/dx| でした。逆関数法では u=F(x)u = F(x) なので、

dudx=F(x)=f(x),fU(u)=1\left|\frac{du}{dx}\right| = F'(x) = f(x), \qquad f_U(u) = 1   fX(x)=1×f(x)=f(x)\therefore \; f_X(x) = 1 \times f(x) = f(x)

ヤコビアン du/dx|du/dx| が、密度 f(x)f(x) そのものです。 数値微分で確かめました。

xxF(x)F(x)数値微分 dF/dxdF/dx密度 f(x)=exf(x) = e^{-x}
0.20.1812690.81873075300.81873075315.1e−11
0.50.3934690.60653065980.60653065974.0e−11
1.00.6321210.36787944120.36787944121.6e−11
2.50.9179150.08208499860.08208499867.7e−12

さきほどの図で見た「累積分布関数の傾きが密度である」が、ヤコビアンでした。 1次元だと「傾き」と「密度」が同じものなので区別する必要がなく、ヤコビアンという言葉を持ち出さずに済んでいたわけです。2次元以上になると2つは別物になり、行列式を計算する必要が出てきます。それがこのあと出てくるボックス=ミュラー法の rr です。


棄却法:逆関数が書けないとき

指数分布は F(x)=1exF(x) = 1 - e^{-x}uu について解けたので、1行で書けました。正規分布ではこれができません。

F(x)=x12πet2/2dtF(x) = \int_{-\infty}^{x} \frac{1}{\sqrt{2\pi}} e^{-t^2/2}\,dt

この積分は初等関数で書けず、誤差関数 erf\mathrm{erf} が必要です。当然その逆関数 F1F^{-1} も、log(1u)-\log(1-u) のような閉じた式にはなりません。

正直に書くと、正規分布は例外的に恵まれています。 数値ライブラリには erfinv があるので、実務では逆関数法も使えます。棄却法が本当に必要になるのは、自分で作った密度正規化定数が分からない密度のときです。ベイズの事後分布がまさにそれで、第33回の MCMC(Markov Chain Monte Carlo=マルコフ連鎖モンテカルロ法)につながります。ここでは仕組みが見やすいので正規分布を題材にします。

発想:密度を面積として見る

逆関数法は密度の情報を「累積分布関数の傾き」経由で使いました。棄却法はもっと素朴です。

  1. 密度の曲線を、すっぽり覆う図形(まずは長方形)を用意する
  2. その図形の中に一様にランダムな点をばらまく
  3. 曲線よりに落ちた点だけ残し、その xx 座標を採用する

左右2パネルの図。左は標準正規分布の密度曲線(青)を高さ0.399の長方形(赤い破線)で覆い、その中に1400点をばらまいたもの。曲線より下に落ちた435点が緑、上の965点が灰色で描かれ、緑の点は曲線が高い中央付近に密集している。右は同じ操作を300万点で行い、採択した点のx座標のヒストグラム(緑)を標準正規の密度曲線(青)と重ねたもので、両者がぴったり一致している

左は1400点をばらまいた例で、緑が採択435点、灰色が棄却965点です。採択された緑の点は、曲線が高いところに密集しています。 右は300万点でやって、採択した点の xx 座標だけのヒストグラムを描いたものです。

なぜ正しいのか。長方形の中に一様に点を打つと、どの領域に落ちる確率もその領域の面積に比例します。 だから xx の周りの細い縦の帯に落ちる確率は、その帯の中の「曲線の下の面積」に比例する。それはまさに f(x)×f(x) \times 帯の幅、つまり密度です。

確かめた量実測(300万点から採択)理論値
採択率0.3133790.313309
平均0.000770
分散0.997101
歪度−0.004000
P(X<1.96)P(X < 1.96)0.975120.97500

採択率は「面積の比」そのもの

採択率=覆いの中に入っている密度の面積覆いの面積\text{採択率} = \frac{\text{覆いの中に入っている密度の面積}}{\text{覆いの面積}}

覆いが密度を完全に含んでいれば分子は 1 になるので、覆いの面積が小さいほど効率が良いことになります。

長方形 [4,4][-4, 4] なら面積は 8×0.398942=3.1915388 \times 0.398942 = 3.191538 です。ただしこの場合、分子はぴったり1ではありません。[4,4][-4,4] の外に ±4\pm 4 より遠い裾がわずかに残っているからです。その分の質量を除くと 0.99993666 なので、

採択率=0.999936663.191538=0.313309\text{採択率} = \frac{0.99993666}{3.191538} = 0.313309

分子を 1 と置いて 1/3.191538=0.3133291/3.191538 = 0.313329 としてはいけません。 差は小数第5位ですが、この差の正体は「切り落とした裾」で、作られる分布が標準正規分布ではなくなっていることの現れです。次の表とジレンマの話に直結します。

長方形の幅を変えてみます。

覆いの範囲採択率1個作るのに平均何回引くか
[1,1][-1, 1]0.8556241.17 回
[2,2][-2, 2]0.5981441.67 回
[3,3][-3, 3]0.4166432.40 回
[4,4][-4, 4]0.3133093.19 回
[10,10][-10, 10]0.1253317.98 回
[20,20][-20, 20]0.06266615.96 回

ここにジレンマがあります。 広く取ると無駄が増えて採択率が落ちる。狭く取ると採択率は上がりますが、裾が切れて別の分布になってしまいます。 [1,1][-1, 1] の採択率 0.856 は魅力的ですが、それで作られるのは「±1\pm 1 で打ち切られた正規分布」です。

正規分布の裾は無限に続くので、長方形では原理的に完全に覆えません。 どこかで切るしかない。

覆いを「密度に似た形」にする

長方形にこだわる必要はありません。覆いも確率分布でよいのです。ある定数 cc を使って

cg(x)f(x)(すべての x で)c \cdot g(x) \ge f(x) \quad (\text{すべての } x \text{ で})

を満たす gg を用意します。すると採択率 =1/c= 1/cggff の全域を覆う確率分布である場合)。cc が 1 に近いほど良いということになります。

3パネルの図。各パネルで青が作りたい密度(面積1)、薄赤が覆いを表す。左は標準正規を長方形[-4,4]で覆ったもので覆いの面積3.192・採択率0.3133、中央はコーシー分布で覆ったもので覆いの面積1.520・採択率0.6577、右は半正規分布を指数分布で覆ったもので覆いの面積1.315・採択率0.7602。左から右へ赤い余白が小さくなっていく。全体タイトルは「採択率=密度の面積÷覆いの面積。赤い余白が無駄になる分」(長方形の場合、厳密には分子は覆いの中に入っている密度の面積 0.99993666)

赤い余白がそのまま無駄になる分です。

覆い方c=supf/gc = \sup f/g1/c1/c実際の採択率1個作るのに引く回数
長方形 [10,10][-10, 10]7.97880.1253310.1253317.98 回
長方形 [4,4][-4, 4]3.19150.3133290.3133093.19 回
コーシー分布で覆う1.52030.6577450.657745(実測 0.657786)1.52 回
指数分布で覆う(半正規)1.31550.7601730.760173(実測 0.760255)1.32 回

長方形 [4,4][-4,4] の行だけ 1/c1/c と実際の採択率が食い違っています(0.313329 対 0.313309)。長方形は裾を覆いきれていないので 1/c1/c が使えず、この差が切り落とした分です。[10,10][-10,10] 以降は裾の質量が丸めの範囲で1になるため一致します。覆いが分布(コーシー・指数)なら全域を覆うので、採択率は厳密に 1/c1/c です。

コーシー分布が使えるのは、裾が正規分布より厚いからです。 裾で追い越されないので全域を覆えます。「重い裾の分布で軽い裾の分布を覆う」は棄却法の定石で、逆はできません。

指数分布版(半正規分布を作って符号をランダムに付ける)で作った標準正規の検算は、平均 −0.00130、分散 0.99971、P(X<1.96)=0.94998P(|X| < 1.96) = 0.94998(理論 0.95000)でした。コーシー版は平均 0.00027、分散 0.99920、P(X<1.96)=0.95010P(|X| < 1.96) = 0.95010 です。

cc の求め方

cc は「f/gf/g の上限(sup)」です。厳密には最大値が達成されない場合もありますが、今回は x=1x=1 で達成されます。
なお条件の本体は「gg の台が ff の台を含む」ことと「supf/g<\sup f/g < \infty」であり、「重い裾で覆う」はそのための言い換えです(厳密には「gg の裾が ff より軽くないこと」で、同程度の減衰でも構いません)。そして f=g=1\int f = \int g = 1 から必ず c1c \ge 1、つまり採択率は必ず1以下になります。

半正規分布を指数分布で覆う場合を実際にやってみます。

f(x)g(x)=2/πex2/2ex=2πex2/2+x\frac{f(x)}{g(x)} = \frac{\sqrt{2/\pi}\, e^{-x^2/2}}{e^{-x}} = \sqrt{\frac{2}{\pi}}\, e^{-x^2/2 + x}

指数部 x2/2+x-x^2/2 + x を微分して 0 にすると x+1=0-x + 1 = 0、つまり x=1x = 1 で最大です。

c=2πe1/2=2eπ=1.315489    採択率=0.760173c = \sqrt{\frac{2}{\pi}}\, e^{1/2} = \sqrt{\frac{2e}{\pi}} = 1.315489 \;\Rightarrow\; \text{採択率} = 0.760173

実測 0.760255 と一致しました。第1回から使っている「微分してゼロ」がここでも出てきます。

棄却法の限界:高次元で崩壊する

棄却法にも弱点があります。しかも、すでに何度も見た弱点です。

dd 次元の立方体 [1,1]d[-1, 1]^d に一様に点を打ち、単位球の中に入ったものだけ採択する(=球内の一様分布を作る)という問題を考えます。

採択率を次元 d に対して対数軸で描いた図。赤い実線が理論採択率(単位球の体積÷立方体の体積)で、d=1 の 1.0 から d=30 の 2e-14 まで一直線に指数関数的に下がっている。青い白丸が d=2,3,5,10,15 での実測値(200万点)で理論線に乗っている。灰色の破線が採択率 100万分の1 の水準を示し「採択率が100万分の1を切ると実用外」と注釈されている

dd理論採択率実測(n=200n = 200 万)1個作るのに引く回数
20.7853980.785234(157万個)1.27 回
30.5235990.523546(105万個)1.91 回
50.1644930.164746(329,493個)6.08 回
100.0024900.002447(4894個)402 回
151.16e−059.50e−06(19個8.6万 回
202.46e−084063万 回
302.04e−144.9×10134.9 \times 10^{13}
501.54e−286.5×10276.5 \times 10^{27}

d=15d = 15 で200万点から19個しか採択されませんでした。

高次元では立方体のほとんどが「角」で、球はその中心のごく一部にしかありません。 覆いと密度の面積比が指数的に開くので、採択率が消えていきます。

これが第33回で MCMC が必要になった理由です。 高次元の分布から標本を得るのに、棄却法は使えません。MCMC は「棄却しても前の点に留まる」ことで、この崩壊を回避しています。逆に言えば、低次元では棄却法は今でも現役です。d=3d = 3 なら1.91回に1回採択されるので、MCMC のような収束の心配がある道具を持ち出す理由がありません。適材適所でした。


ボックス=ミュラー法:無駄ゼロで正規乱数を2個作る

棄却法は無駄が出ます(長方形なら3.19回に1回)。逆関数法は書けません。そこで発想を変えます。1個ずつ作るのをやめて、2個セットで作る。

2次元標準正規分布(xxyy が独立)の同時密度を書いてみます。

f(x,y)=12πe(x2+y2)/2f(x, y) = \frac{1}{2\pi} e^{-(x^2 + y^2)/2}

x2+y2x^2 + y^2 しか出てきません。 これは「原点からの距離だけが効いていて、方向はまったく効いていない」という意味です。だから角度は完全に一様になります。

3パネルの図。左は2次元標準正規分布の散布図で、半径1・2・3の赤い破線の円が重ねられており、点は同心円状に分布している。中央は角度θのヒストグラムで完全に平らで、一様分布 1/(2π)=0.15915 の赤い水平線に一致している。右は距離の2乗 S=r² のヒストグラム(橙)で、平均2の指数分布の密度(赤い曲線)にぴったり乗っている

確かめた量実測(150万点)理論値
S=r2S = r^2 の平均2.001612
S=r2S = r^2 の分散4.015044
P(S1)P(S \le 1)0.393250.39347
P(S2)P(S \le 2)0.631790.63212
角度の平均−0.000980
角度の標準偏差1.813751.81380(=π/3= \pi/\sqrt{3}

上の表の角度は arctan2(π,π](-\pi, \pi] で測っているので平均が 0 になります。あとで出てくる手続きの θ=2πu2\theta = 2\pi u_2[0,2π)[0, 2\pi) で平均は π\pi ですが、幅が 2π2\pi の一様分布なら向きの取り方が違うだけで、標準偏差は同じ π/3\pi/\sqrt{3} です。

ここで話が終わっています。 分解して出てきた2つの部品は、どちらも簡単に作れるものでした。

  • 角度 θ\theta → 一様分布。uu をそのまま 2π2\pi 倍するだけ
  • 距離の2乗 SS → 平均2の指数分布。逆関数法が使えるS=2loguS = -2\log u

正規分布そのものには逆関数法が使えないのに、2個セットにして極座標で見ると、逆関数法が使える部品に分解できたわけです。

なぜ極座標にすると指数分布が出るのか — ここがヤコビアン

第4回の変数変換では、変数を取り替えるときに「面積の伸び縮み」を補正する必要がありました。極座標では

dxdy=rdrdθdx\,dy = r \cdot dr\,d\theta

この rr がヤコビアンです。ヤコビアン行列の行列式を数値で確認しておきます。

J=(cosθrsinθsinθrcosθ)J = \begin{pmatrix} \cos\theta & -r\sin\theta \\ \sin\theta & r\cos\theta \end{pmatrix}
rrθ\theta行列式(数値計算)理論値
0.5+0.30.50000000000.5
1.0+1.01.00000000001.0
2.0+2.52.00000000002.0
3.0−1.23.00000000003.0

これを密度に掛けると、こうなります。

12πer2/2×r=12πθ の一様分布×rer2/2r の密度\frac{1}{2\pi} e^{-r^2/2} \times r = \underbrace{\frac{1}{2\pi}}_{\theta \text{ の一様分布}} \times \underbrace{r\, e^{-r^2/2}}_{r \text{ の密度}}

さらに S=r2S = r^2 と置くと dS=2rdrdS = 2r\,dr なので、

rer2/2dr=12eS/2dSr\, e^{-r^2/2}\,dr = \frac{1}{2} e^{-S/2}\,dS

平均2の指数分布です。ヤコビアンの rr が、S=r2S = r^2 と置いたときの 2rdr2r\,dr にちょうど吸収されました。 これが「距離の2乗が指数分布になる」理由です。

なお S=Z12+Z22S = Z_1^2 + Z_2^2 は定義から自由度2のカイ二乗分布です。つまり χ2(2)=\chi^2(2) = 平均2の指数分布。第7回で扱ったカイ二乗分布と、ここで出てきた指数分布が同じものだった、という同一視です。準1級では問われやすい形なので押さえておきます。

手続き

S=2logu1,θ=2πu2S = -2\log u_1, \quad \theta = 2\pi u_2 Z1=Scosθ,Z2=SsinθZ_1 = \sqrt{S}\cos\theta, \quad Z_2 = \sqrt{S}\sin\theta

左右2パネルの図。左は単位正方形の中に描かれた格子で、13本の色つきの縦線(u1が一定)と13本の灰色の横線(u2が一定)が引かれている。右はその格子をボックス=ミュラー法で写した結果で、色つきの縦線が同心円に、灰色の横線が原点から放射状に伸びる直線になっている。u1が小さいほど大きな円に対応している

色つきの縦線が同心円に、灰色の横線が放射線に写ります。 u1u_1 が小さいほど大きな円になる(log-\log で反転するため)。「正方形を平面に巻きつける」変換だと見ると直感的です。

確かめた量実測(150万個)理論値
平均−0.0006410
分散1.0003971
歪度−0.0026130
尖度2.9982263
P(Z<1)P(\lvert Z \rvert < 1)0.6825250.682689
P(Z<1.96)P(\lvert Z \rvert < 1.96)0.9500430.950004
P(Z<2.5758)P(\lvert Z \rvert < 2.5758)0.9899800.989999
Z1Z_1Z2Z_2 の相関0.0004590(独立)

効率を比べます。

方法正規乱数1個あたりに必要な一様乱数
棄却法(長方形 [4,4][-4,4]6.383 個
棄却法(コーシー分布で覆う)3.041 個(うち1個はコーシー乱数の生成に使う)
ボックス=ミュラー法1.000 個(無駄ゼロ)

ヤコビアンの rr を落とすと壊れる

S=r2S = r^2 を指数分布にする」を間違えて「rr 自体を指数分布にする」とどうなるか、実演しました。

3パネルの図。左は正しいボックス=ミュラー法で作った2次元散布図(緑)で均等な円形の雲になっている。中央は r 自体を指数分布にした誤り版の散布図(赤)で、原点付近が明らかに濃く外側がまばらになっている。右は両者のx成分のヒストグラムを重ねたもので、正しい版(緑)は標準正規の密度(青い破線)に一致し、誤り版(赤)は中央が1.2以上まで尖って裾も重くなっている

量(n=80n = 80 万)正しい版誤り版(rr を落とした)標準正規の理論値
平均−0.00069−0.001490
分散0.999141.001471
尖度3.00909.16983
P(Z<1.96)P(\lvert Z \rvert < 1.96)0.950250.935380.95000
P(Z<0.1)P(\lvert Z \rvert < 0.1)0.079690.218260.07966

注目してほしいのは分散の行です。誤り版でも分散 1.00147 で、ほぼ 1 になっています。 偶然ではなく、平均1の指数分布の2次モーメントが 2 なので E[r2]E[cos2θ]=2×1/2=1E[r^2] \cdot E[\cos^2\theta] = 2 \times 1/2 = 1 になるためです。
この「分散だけ合う」現象は r=logur = -\log u(平均1)にした場合に限ります。 2logu-2\log u をそのまま rr にすると E[r2]=8E[r^2] = 8 で分散4になり、すぐに気づけます。
なお尖度も理論値が出ます。E[r4]=24E[r^4] = 24E[cos4θ]=3/8E[\cos^4\theta] = 3/8 なので E[X4]=9E[X^4] = 9、つまり尖度は9。実測 9.1698 と整合しています。だから間違い方によって発見しやすさが変わるのが厄介なところです。

「平均と分散を確認したから合っている」では、この誤りを検出できません。 尖度(3 vs 9.17)と原点付近の割合(7.97% vs 21.83%)を見て初めて分かります。この連載で何度も踏んだ罠、理論値と一部が一致するとバグが隠れるが、ここにも出ていました。


擬似乱数は本当にランダムなのか

答えはまったくランダムではありません。 完全に決定的な漸化式です。線形合同法なら

xn+1=(axn+c)modmx_{n+1} = (a \cdot x_n + c) \bmod m

同じ種(シード)を入れれば必ず同じ列が出ます。有限個の状態しかないので、いつか必ず一周します。

周期を実際に数えた

aaccmm周期mm に対する割合
531616100%
3116850%
9016212.5%
6553902566425%
655390655361638425%

パラメータ次第で周期が mm よりずっと短くなります。 a=9,c=0,m=16a = 9, c = 0, m = 16 は周期 2、つまり2つの値を往復するだけです。

生成器周期実用上
RANDU(1960〜70年代の IBM で標準)229=536,870,9122^{29} = 536{,}870{,}912毎秒10億個なら1秒足らずで一周する。現代では足りない
線形合同法 a=1103515245, c=12345, m=231a=1103515245,\ c=12345,\ m=2^{31}(glibc の簡易版)231=2,147,483,6482^{31} = 2{,}147{,}483{,}648同様に不足。なお glibc の rand() は既定では加算的フィードバック方式で周期は約 2342^{34}
メルセンヌツイスタ21993712^{19937} - 1尽きない
numpy の既定(PCG64)21283.4×10382^{128} \approx 3.4 \times 10^{38}毎秒10億個で 1.1×10221.1 \times 10^{22}

結論として、現代の生成器では周期は問題になりません。 問題になるのは別の2つです。

本当の問題①:規則性は次元を上げると見える

RANDU の有名な欠陥を再現しました。この生成器は次の関係を厳密に満たしてしまいます。

xn+2=6xn+19xn(mod231)x_{n+2} = 6 x_{n+1} - 9 x_n \pmod{2^{31}}

実際に計算すると 96a+a2mod231=09 - 6a + a^2 \bmod 2^{31} = 0a=65539a = 65539)でした。つまり3つ連続で取ると、必ず平面上に乗ります。

3パネルの図。左は RANDU の連続する2値 (u_n, u_(n+1)) の散布図で、単位正方形が均等に埋まっており問題が見えない。中央は連続する3値を平面に垂直な方向から見た2次元射影で、点が15本のはっきりした横縞に分かれている。右は numpy の PCG64 で同じ射影を描いたもので、隙間なく連続的に埋まっている

検査RANDU判定
平均0.501851(理論 0.5)合格
分散0.083438(理論 0.083333)合格
10区間の適合度 χ2\chi^210.338(自由度9の5%点 16.92)合格
3次元での平面の枚数15 枚のみ不合格
(PCG64 の同じ量の種類)119,375 通り合格

1次元の検定は全部通ります。 平均・分散・度数分布はどれも問題なし。欠陥は3次元にして初めて見えます。

これは連載で繰り返し出てきた構造と同じです。低次元の要約統計量が合っていても、高次元の構造は壊れていることがある。 そして今回のボックス=ミュラー法でも、rr を落とした版が「分散 1.00147」で合格してしまいました。同じ罠です。

本当の問題②:シードと再現性

シードを固定する理由この連載での実例
検証・査読ができる記事の数値を再実行して照合する(毎回やっている)
デバッグできるおかしな結果が出た回を再現して調べる
結果の安定性を確認できるシードを変えて標準偏差が 655 → 2814 に暴れたのを発見(後述)

落とし穴が2つあります。

「シードを固定したから再現できる」は、同じライブラリの同じバージョンでしか成り立ちません。 numpy も 1.17 で新しい API(default_rng = PCG64)が入り、推奨RandomState(メルセンヌツイスタ)から切り替わりました。後方互換のため np.random.rand などのトップレベル関数は今もメルセンヌツイスタなので、古いコードの出力が変わったわけではありません。数値を公開するときは生成器の名前も書くのが安全です。

もう1つは並行実行です。同じシードで複数プロセスを走らせると全部が同じ列を使い、実質的なサンプル数が増えません。numpy では SeedSequencerng.spawn() で分岐させます。


第2部 乱数を「使う」技術

そもそも何のために乱数を使うのか

第1部で「任意の分布から乱数を作れる」ことが分かりました。しかしそれだけでは変な数字の列が手に入るだけです。そこから結論を出すには、もう1本の柱が必要でした。

やること根拠
① 任意の分布から乱数を作れる一様乱数 → 好きな分布逆関数法・棄却法・ボックス=ミュラー法(第1部)
② 作った乱数の平均が真の値に近づく20万個の平均 ≒ 期待値大数の法則第8回

この連載でずっとシミュレーションで検証してきた正当性は、②の大数の法則です。 ①だけでは入力が作れるだけ、②だけでは入力がない。両方が揃って初めて「シミュレーションで確かめた」と言えます。

そして①が必要になるのは、ライブラリに無い分布を扱うときです。実例で見ます。

題材:ブログ記事のPV

このブログの記事ごとのPVを題材にします。1記事あたりのPVはパレート分布(べき乗則)で表せることが多く知られています。最低10PV、形状パラメータ α=1.5\alpha = 1.5 としました。

F(x)=1(10x)1.5    X=10(1u)1/1.5F(x) = 1 - \left(\frac{10}{x}\right)^{1.5} \;\Rightarrow\; X = 10 \cdot (1 - u)^{-1/1.5}

左右2パネルの図。左は1記事あたりPVのヒストグラムで横軸を200PVまでに切ったもの。ほとんどの記事が10から30PVに固まり、平均30.0の赤い縦線が中央値15.9の青い破線より右にある。右は同じデータをPVの常用対数で描いたもので、裾が10万PVあたりまで続いていることが見える。全体タイトルは「平均は中央値の1.89倍。平均PVは半分以上の記事が到達しない値」

実測(30万本)理論値
平均29.873430.0000
中央値15.902415.8740
平均 ÷ 中央値1.890 倍

平均は中央値の1.89倍で、平均PVは半分以上の記事が到達しない値です。

見つかったこと1:標準偏差を報告してはいけない

「20本書いたら合計PVはいくらか」を平均 ± 標準偏差で出そうとしました。シードだけ変えて3回。

試行合計PVの平均標準偏差中央値
1(seed 500)602.52813.7488.8
2(seed 501)597.3655.3491.8
3(seed 502)596.2794.2489.8

平均(596〜603)と中央値(489〜492)は安定しているのに、標準偏差だけが4倍以上ばらつきます。 α=1.5\alpha = 1.5 のパレート分布は α<2\alpha < 2 なので母分散が無限です。存在しない量を測ろうとしているので、値が落ち着きようがありません。

1回だけ回して「合計PVは約600、標準偏差は約2800」と書いていたら、次に測ったとき655になって説明できなくなります。シミュレーションを2回以上回すと、この種の事故が見つかります。

見つかったこと2:精度が 1/n1/\sqrt{n} で上がらない

連載でずっと「精度はルートでしか上がらない」と扱ってきましたが、この分布では成り立ちません。標準偏差そのものが不安定なので、ばらつきは四分位範囲で測っています。

標本平均のばらつき(四分位範囲)を標本サイズ n に対して両対数軸で描いた図。赤い実線が実測で n=100 の 6.9 から n=100000 の 0.75 まで下がる。青い破線が 1/√n で縮むとした場合の参照線で実測より急に下がり、緑の点線が n^(-1/3) の参照線で実測にきれいに沿っている

nn(記事数)標本平均の四分位範囲前の nn からの縮み
1006.8988
3005.09681.354 倍
1,0003.57841.424 倍
3,0002.55621.400 倍
10,0001.70801.497 倍
30,0001.22241.397 倍
100,0000.75211.625 倍

両対数での傾きは −0.3181/n1/\sqrt{n} なら −0.5、n1/3n^{-1/3} なら −0.3333 です。実測は後者に沿っています。

理屈はこうです。α<2\alpha < 2 で母分散が無限なので、中心極限定理の前提(分散が有限)が崩れています。 1<α<21 < \alpha < 2 のとき、(Xiμ)\sum (X_i - \mu) の大きさは n\sqrt{n} ではなく n1/αn^{1/\alpha} で伸びます(α\alpha 安定分布への収束。パレート分布では形状パラメータがそのまま裾指数になります)。だから標本平均のばらつきは n1/α1=n(11/α)n^{1/\alpha - 1} = n^{-(1-1/\alpha)}α=1.5\alpha = 1.5 なら n1/3n^{-1/3} です。
α>2\alpha > 2 なら分散が有限なので通常の n1/2n^{-1/2} に戻り、α1\alpha \le 1 では平均そのものが存在しませんα=2\alpha = 2 はちょうど E[X2]E[X^2] が発散する境界で、分散は無限のままです。sympy で確認しました)。 この式が意味を持つのは 1<α<21 < \alpha < 2 のときだけです。

nn を10倍にしても、ばらつきは 3.16 分の1ではなく 2.15 分の1にしかなりません。 理論値は(1<α<21 < \alpha < 2 のもとで)n(11/α)=n1/3n^{-(1 - 1/\alpha)} = n^{-1/3} です。

この結論を理論だけで出すには安定分布と裾指数の理論が必要ですが、シミュレーションなら10行で出ます。そして実務上の意味は明確です。PVのような裾の重いデータでは、記事数を増やしても平均の精度が想定ほど上がりません。

見つかったこと3:ここで逆関数法が必須になる

上の分析には非現実的な前提があります。1記事が100万PVになる可能性を許していること。現実にはそんな記事は出ません。

そこで「上限 bb で切ったパレート分布」が必要になります。これは numpy に存在しない分布です。 逆関数法なら累積分布関数を bb で正規化して解き直すだけです。

c=1(10b)1.5,X=10(1uc)1/1.5c = 1 - \left(\frac{10}{b}\right)^{1.5}, \qquad X = 10 \cdot (1 - u c)^{-1/1.5}

上限を 1万 / 5万 / 100万 PV の3通りで比べます。(なおこのあとの節では、第1部の実演でも使った上限200PV版に戻します。 このブログの実測レンジに寄せた設定で、厳密値が手計算できるので検算に向いているためです。以降「上限200PV」と書いてある数値はすべてそちらです。)

左右2パネルの図。左は20本の合計PVの分布を上限1万・5万・100万PVの3通りで重ねた折れ線ヒストグラムで、横軸150から2000の範囲では3本が完全に重なって1本に見える。右は同じデータを両対数軸で裾を拡大したもので、青(上限1万)が1万PV付近で途切れ、そこから先は橙と赤しか残らない

上限の想定平均中央値90%点99%点99.9%点標準偏差
10,000 PV581.7490.582520796011412
50,000 PV593.4490.682721307952684
1,000,000 PV602.8490.6827213682531525

中央値は 490.5 / 490.6 / 490.6 でほぼ完全に一致し、90%点も 825 / 827 / 827。ところが標準偏差は 412 → 684 → 1525 と3.7倍動きます。

上限をどこに置くかという検証しにくい仮定が、中央値には影響しないのに標準偏差にはまるごと乗ってしまう。だから中央値と90%点で語れば、仮定が結論に入りません。

これは「どの要約統計量を報告するか」という実務判断です。シミュレーションが答えを出したのではなく、仮定を1つ動かして、結論のどこが動くかを見せたわけです。


1変数なら数値積分に完敗する

ここで、私が最も思い違いをしていたことを書きます。モンテカルロ法は速くも正確でもありません。

「1記事の期待PV」を求めます。逆関数法で乱数を作って平均する方法と、同じ積分を等間隔グリッドで計算する方法を、同じ計算回数で比べます。

実は両者はまったく同じ積分を計算しています。

E[X]=01F1(u)duE[X] = \int_0^1 F^{-1}(u)\,du

モンテカルロ法は uu を乱数で置き、グリッドは等間隔に置く。点の置き場所が違うだけです。 厳密値は 23.5551506580(上限200PVのパレート分布)。

nnグリッド推定誤差モンテカルロ推定誤差
10023.5099234.52e−0222.2094641.35e+00
1,00023.5546604.91e−0423.9955524.40e−01
10,00023.5551464.91e−0623.7512541.96e−01
100,00023.5551514.91e−0823.6444538.93e−02
1,000,00023.5551514.91e−1023.6237536.86e−02

100万回使って、グリッドは誤差 5×10105 \times 10^{-10}、モンテカルロは 7×1027 \times 10^{-2}。1億倍以上の差でモンテカルロの負けです。

1つ補足します。上の表のモンテカルロ列は単一のシードでの実現値なので、たまたま大きく振れている可能性があります。この分布の標準偏差は厳密に σ=22.3288\sigma = 22.3288E[X2]=1053.418E[X^2] = 1053.418 から)なので、n=106n = 10^6 での典型的な誤差は σ/n=0.022329\sigma/\sqrt{n} = 0.022329。表の 0.0686 は3σ程度の外れです。典型値で比べても 0.022329÷(4.91×1010)4.5×1070.022329 \div (4.91 \times 10^{-10}) \approx 4.5 \times 10^7 倍で、桁の主張は変わりません。

つまり1変数なら、乱数を使うのは点の置き場所をわざわざ雑にしているだけでした。等間隔に置いたほうがムラがなく、はるかに速く収束します。

逆転するのは次元

ではなぜモンテカルロ法が使われるのか。誤差の減り方の法則が違うからです。滑らかな被積分関数で、次元だけを変えて実測しました。

先に前提を書いておきます。ここでのグリッドは中点則(2次精度)のテンソル積で、n2/dn^{-2/d} という指数はそのことと被積分関数が2階微分可能であることから出ます。指示関数のような不連続な量(確率の推定)では n1/dn^{-1/d} に落ちるので、後で出てくる交差点の位置も変わります。

左右2パネルの両対数図。左は1次元の積分で、青いグリッドの誤差が n=2 の 1.7e-2 から n=1869 の 1.9e-8 まで急な直線で下がり、赤いモンテカルロの誤差は n=100 の 8e-2 から n=10^6 の 2.8e-4 までゆるやかに下がる。グリッドが圧倒的に下にある。右は8次元の積分で、青いグリッドが寝てしまい、赤いモンテカルロが同じ傾きを保ったまま青の下に潜り込んでいる。灰色の点線が 1/√n の傾きの参照線

左(1次元)では青のグリッドが赤を圧倒し、右(8次元)では入れ替わっています。 要点は、赤の傾きが左右で変わっていないことです。

次元 ddグリッドの傾き(実測)理論値 2/d-2/dモンテカルロの傾き(実測)理論値
1−2.001−2.000−0.593−0.500
2−1.001−1.000−0.434−0.500
4−0.503−0.500−0.574−0.500
8−0.261−0.250−0.472−0.500

グリッドの指数は理論どおり 2/d-2/d で、次元が上がるとどんどん 0 に近づきます(=収束しなくなる)。モンテカルロは 1/2-1/2 のまま動きません。

横軸を次元 d、縦軸を誤差の減り方の指数として描いた図。青い折れ線が等間隔グリッドの n^(-2/d) で、d=1 の -2.0 から d=12 の -0.17 まで急速に 0 に近づく。赤い水平線がモンテカルロの n^(-1/2) で -0.5 のまま一定。2本は d=4 で交差し、そこに灰色の縦破線と「d=4 で交差」という注釈が入っている

同じ計算回数(おおむね n106n \approx 10^6)での誤差を並べます。グリッドは軸あたりの点数 pp に対して n=pdn = p^d しか取れないので、nn をぴったり揃えられません。 d=1d=1n=1869n = 1869(1次元では点を増やすと誤差が浮動小数の下限に達するので打ち切り)、d=2d=2 は 1,144,900、d=4d=4 は 1,185,921、d=8d=8 は 390,625(=58= 5^8)です。

次元 ddグリッドの誤差モンテカルロの誤差勝者
11.87e−08(n=1869n=18692.76e−04グリッド(約1.5万倍)
27.28e−084.61e−04グリッド
46.20e−055.84e−05ほぼ互角
89.03e−04(n=390,625n=390{,}6259.85e−05モンテカルロ(約9.2倍。nn10610^6 に揃えても約7.3倍)

この滑らかな例で交差するのは d=4d = 4 です。 不連続な量(確率)ならグリッドは n1/dn^{-1/d} なので、交差点は d=2d = 2 まで下がります。

次元が上がるとグリッドは軸ごとに点を掛け算しなければならず、点が指数関数的に必要になります。d=20d = 20 で軸10点なら 102010^{20} 回の評価で、1秒に10億回計算しても3175年かかります。同じ問いにモンテカルロは200万回・数秒で答えます。

これが「1/n1/\sqrt{n} が高次元で有利になる」の中身でした。1/n1/\sqrt{n} は「遅い」のではなく「次元に鈍感」という長所だったのです。

モンテカルロ法も次元の呪いを受ける(ただし別の場所で)

では、モンテカルロ法は次元の呪いから自由なのか。自由ではありません。ただし呪いが出る場所が違います。

モンテカルロ法の誤差はこう分解できます。

誤差σn\text{誤差} \approx \frac{\sigma}{\sqrt{n}}

グリッドと比べたのは 1/n1/\sqrt{n} の部分で、これは次元に対して不変でした。呪いは σ\sigma のほうに出ます。 そして σ\sigma が次元とともにどう動くかは、何を推定しようとしているかで正反対になります。

σ÷答え(相対的な散らばり)を次元 d に対して対数軸で描いた図。3本とも厳密値。緑の折れ線 A(平均の推定)は d=1 の 1.0000 から d=32 の 0.1768 まで下がる。橙の折れ線 B(積の期待値)は 0.4834 から 28.78 まで上がる。赤の折れ線 C(まれな事象の確率)は 1.00 から 65536 まで急激に上がる。灰色の破線が 1 の水準で「この線より上=1試行のばらつきが答えより大きい」と注釈されている。加えて紫の×印が d=32 に打たれ、B を標本標準偏差で推定すると 42.83 になり、シードを変えると 21〜76 に動くこと(σ 自体が推定できないこと)が注釈されている

3つとも閉じた式が出るので、厳密値を並べます。A は 1/d1/\sqrt{d}、B は (π2/8)d1\sqrt{(\pi^2/8)^d - 1}、C は 2d1\sqrt{2^d - 1} です。

次元 ddA 平均を推定(σ/μ\sigma / \muB 積の期待値(σ/I\sigma / IC まれな事象の確率(σ/p\sigma / p
11.00000.48341.00
20.70710.72251.73
40.50001.14743.87
80.35362.089615.97
160.25005.2723256.00
320.176828.780265536.00

A の実測値(n=5n = 5 万)は 0.9987 / 0.7109 / 0.5031 / 0.3553 / 0.2506 / 0.1769 で厳密値と一致しました。ところが B を標本標準偏差で推定すると、d=32d = 32 だけ 42.83 という値が出ます。厳密値 28.78 の1.5倍です。

シードを変えて8回測り直したら 42.83 / 22.41 / 21.19 / 28.64 / 76.24 / 26.34 / 22.33 / 33.18 と3倍以上ばらけました(d=16d = 16 では 5.19〜5.33 で安定していて、厳密値 5.272 の近傍にいます)。原因は cos\prod \cosd=32d = 32 での尖度が (3/2)32=4.3×105(3/2)^{32} = 4.3 \times 10^5 もあることで、σ\sigma そのものが推定できない領域に入っています。

この表を作るとき、私自身がこの章の主題を踏みました。σ\sigma が指数的に増える」という定性的な主張は正しいのですが、その σ\sigma を標本標準偏差で1回測って表に載せていました。母分散が無限のときに標準偏差が暴れる話(さきほどのパレート分布)と、まったく同じ構造です。閉じた式があるなら使うべきでした。

A:次元が上がるほど良くなるケース

dd 個の値の平均」を推定する問いです(ここでは1個を平均1の指数分布としたモデル例で測っています)。1回の試行で dd 個の平均を取るので、試行の中身自体が dd 個の平均化になっており(独立なら)σ\sigma1/d1/\sqrt{d} で縮みます。 実測でも d=32d=320.9987÷32=0.17650.9987 \div \sqrt{32} = 0.1765 に対して 0.1769 でした。

ただし正確に言うと、A は「同じ積分の次元だけを変えた」のではなく、dd が上がると推定したい量そのものが安定する型です。「高次元の積分が楽になる」のではありません。

ここまで見てきた20本の記事の問い(合計・分位点・シェア)は、すべてこのA型でした。 だから20次元でも40万回で安定した答えが出ていたわけです。

B:積の形はまずい

dd 個の量のの期待値 E[ih(Xi)]E\left[\prod_i h(X_i)\right] を推定する型です。ここでは [0,1]dicos(πui/2)du\int_{[0,1]^d} \prod_i \cos(\pi u_i / 2)\, du(真値 (2/π)d(2/\pi)^d)を使いました。

積は1つでも小さい値を引くと全体が小さくなるので、1試行の値が桁で暴れます。 そのうえ答え II 自体が dd とともに指数的に小さくなるため、σ÷I=(π2/8)d1\sigma \div I = \sqrt{(\pi^2/8)^d - 1} が指数的に増えていきます(π2/8=1.2337\pi^2/8 = 1.2337 なので、dd が1増えるごとに約1.11倍)。

実務でこの形が出るのは尤度の積経路の確率です。対策は「対数を取って和に直す」か「逐次モンテカルロ法(粒子フィルタ)で途中でリサンプリングする」です。

C:次元が上がるほど悪くなるケース

dd 次元の一様乱数がすべて 0.5 未満」という確率 0.5d0.5^d を素朴に数えます。

dd真値 ppn=106n = 10^6 での命中数推定値相対誤差
46.250e−0262,7286.273e−020.36%
83.906e−033,8443.844e−031.59%
122.441e−042582.580e−045.68%
161.526e−05151.500e−051.70%(後述)
209.537e−0700100%
245.960e−0800100%

d=20d = 20命中が1件も出ず、推定値が 0 になります。

d=16d = 16 の相対誤差 1.70% が d=12d = 12 の 5.68% より良く見えますが、これは偶然です。期待される命中数が 15.26 件のところ実際に 15 件出ただけで、次に回せば 8 件や 22 件になります。命中数が2桁を切ったら、相対誤差の数値は運です。

相対誤差10%に必要な n100/pn \approx 100/p で計算すると、

ddpp必要な nn
109.77e−041.02e+05
209.54e−071.05e+08
508.88e−161.13e+17
1007.89e−311.27e+32

指数関数的な悪化、つまりまさに次元の呪いです。

それでも「傾き」は3つとも 1/2-1/2

ここが精密にしておきたい点です。A も B も C も、nn を増やしたときの減り方の法則は同じでした。250回反復して二乗平均平方根誤差(RMSE = Root Mean Squared Error)を測りました。

3パネルの両対数図。左はA(平均の推定、d=32)で実測の傾き -0.501、中央はB(積の期待値、d=16)で傾き -0.503、右はC(まれな事象、d=12)で傾き -0.502。3枚とも実測線(左が緑、中央が橙、右が赤)が灰色の 1/√n 参照線と平行になっている。ただし縦軸の位置が大きく違い、n=300 での相対誤差は左が約1%、中央が約33%、右が約365%

ケース実測の傾きn=300n = 300 での相対誤差n=105n = 10^5 での相対誤差
A 平均の推定(d=32d=32−0.50141.047e−025.718e−04
B 積の期待値(d=16d=16−0.50313.297e−011.834e−02
C まれな事象(d=12d=12−0.50153.648e+002.105e−01

3つとも傾きは 0.50-0.50 で、灰色の 1/n1/\sqrt{n} の線と平行です。違うのは線の高さ(出発点)だけでした。

言い換えるとこうなります。

呪いの現れ方意味
グリッドグラフの傾きが寝るnn を増やしても改善しない体質になる
モンテカルログラフが上に平行移動する傾きは同じだが出発点が絶望的に高い

モンテカルロ法の呪いは「nn を増やせば必ず解決する。ただし必要な nn が天文学的」という形をとります。 体質は健全なのに要求量が非現実的。グリッドは nn を増やしても体質自体が治りません。

20次元の問いに、何が答えられるか

FF が計算できるなら、わざわざ乱数を使う必要はないのでは」という疑問が自然に出ます。半分は正しく、上で見たとおり1変数なら乱数は不要です。

分かれ目は「FF が計算できるか」ではなく「知りたい量が何変数の積分か」でした。

同じ設定(上限200PVのパレート分布・20本)で、式で書ける問いと書けない問いを並べます。1記事の期待PVは E[X]=23.5552E[X] = 23.5552(厳密)です。

式で書ける問い(乱数は不要)

問いシミュレーション厳密な式
20本で1本でも150PVを超える確率0.114991F(150)20=0.115201 - F(150)^{20} = 0.11520
20本の合計PVの期待値471.16220×E[X]=471.10320 \times E[X] = 471.103

期待値は線形なので次元が実質1に落ちます。最大値も「全部が150以下」に分解できて積になります。

FF が完全に分かっていても式が書けない問い

問い答え(40万回)なぜ式にならないか
合計PVの分位点中央値 456.4 / 90%点 606.2 / 99%点 758.420回の畳み込み。パレート分布の和は閉じた式にならない
最大の1本が合計の何%を占めるか中央値 17.1% / 平均 18.2% / 95%点 30.1%最大値と合計のの分布。同時分布が必要
上位3本を除いた17本が全体の何%か中央値 62.6% / 平均 62.0%順序統計量の部分和の比

この2つの表の対比が答えです。 合計PVの期待値は1行の式で出ます(471.103)。しかし合計PVの中央値(456.4)は出ません。期待値は足し算に分解できるが、分位点は分布の形そのものを要求するからです。

そして実務で使うのは分位点のほうでした。期待値 471.103 は中央値 456.4 より大きく、半分以上の「20本セット」が到達しない値だからです。

本数を変えたときの見通し(上限200PVのパレート分布・20万回。すべて20〜80次元の積分で、1つも式では出ません。20本の行が上の表と 456.4 対 456.2 でわずかに違うのは、反復回数とシードが違うためです)

本数合計の中央値90%点変動係数最大1本のシェア中央値
10本219.7334.10.30124.7%
20本456.2605.90.21217.1%
40本927.31129.80.15011.4%
80本1869.52146.30.1067.2%

本数を8倍にすると合計の中央値は 8.5 倍(ほぼ比例)ですが、変動係数は 0.301 → 0.106 と3分の1に落ち、1本の当たり記事への依存度も 24.7% → 7.2% に下がります。 「本数を増やすと当たり待ちのギャンブル性が薄まる」という定量的な結論です。

知りたい量実質の次元使うべき道具
1変数の期待値・確率・分位点1数値積分(グリッド)
和の期待値、最大値の確率1に分解できる閉じた式
和の分位点、比の分布、順序統計量の部分和dd(20など)逆関数法+モンテカルロ法

FF が計算できることは、逆関数法を使わない理由ではなく逆関数法を使える前提のほうでした。FF が書けないと逆関数法自体が動きません。


分散減少法:乱数の置き方を変える

1/n1/\sqrt{n} は、母分散が有限で、点を独立に nn 個引くかぎり変えられません。この2つの条件が破れると話が変わります。母分散が無限なら遅くなる(さきほどのパレート分布の n1/3n^{-1/3})。そして点を独立に引くのをやめれば速くなります。

つまり分散減少法には2つの型があります。

手法効果
定数倍しか改善しない対照変量法・制御変量法・重点サンプリング1/n1/\sqrt{n} の傾きは変わらず、σ\sigma(=線の高さ)が下がる
収束の次数が変わりうる層別サンプリング・準モンテカルロ法傾きそのものが変わる(後で実測します)

それが分散減少法という一群の技術でした。

素朴なモンテカルロ法の弱点は、乱数がムラを作ることです。24個の点を置いた図を並べます。

24点の置き方を4通り並べた図。上から順に、素朴(一様乱数)は赤い縦棒が不均等で0.05から0.15が空白なのに0.2付近と0.6付近に固まっている。対照変量法は橙で u と 1-u の対称なペアになっている。層別サンプリングは緑で灰色の区画線で区切られた24区画にちょうど1点ずつ入っている。等間隔グリッド(比較用)は青で完全に均等。下に行くほどムラが消えていく

素朴(赤)は目で見て分かるほどムラがあります。 0.05〜0.15 が空白なのに 0.2 付近と 0.6 付近に固まっている。下に行くほどムラが消え、最下段のグリッドは完全に均等です。分散減少法はこの赤を青に近づける工夫だと考えると全体が見通せます。

手法何をするか効く理屈
対照変量法uu を引いたら 1u1-u もペアで使う片方が上振れたら相方が下振れる。負の相関で打ち消す。ただしuu について単調な量に限るh(u)=h(1u)h(u)=h(1-u) のような対称な量では相関が +1+1 になり、同じ評価回数なら分散が2倍に悪化します。実測 2.001 倍)
層別サンプリング[0,1)[0,1)nn 個の区画に割り、各区画から1点だけ引く空白区画が生まれない。第21回の層別抽出と同じ発想
制御変量法期待値が既知で相関の高い量 CC を用意し Yb(CE[C])Y - b(C - E[C]) を測るズレの共通成分を引き算する。回帰の残差と同じ構造
重点サンプリングわざと起きやすい分布から引き、重みで割り戻す命中率を上げる。この4つの中ではまれな事象に効く唯一の手段

期待値を推定するかぎり、4つとも推定値に偏りを作りません(重点サンプリングも重みで正確に補正します)。ばらつきだけを削るので、「タダで精度が上がる」ように見えます。

ただし条件が3つ付きます。重点サンプリングは提案分布の台が元の分布の台を覆うこと(後述の「6だけ出るサイコロ」は目標が {6}\{6\} だから救われているだけです)。制御変量法は係数 bb を別の標本で決めること(同じ標本から推定すると小さな偏りが出ます)。そして中央値や分位点の推定は、素朴法を含めてどの方法でも有限標本では厳密に無偏ではありません。

実測:効くが、問いによって桁が違う

同じ問い(20本の記事の合計PV、上限200PVのパレート分布)で、目標だけを変えて比べました。n=100,000n = 100{,}000 を120回反復し、推定値の標準偏差を測っています。

目標が「和の期待値」のとき(線形)——厳密値は 471.1030 です。

手法推定の平均推定の標準偏差改善倍率
素朴471.09750.3365671.00 倍
対照変量法471.07170.2454331.37 倍
層別サンプリング471.10300.0000359707 倍

層別サンプリングが9707倍。 ただしこれは n=100,000n = 100{,}000 という一点での倍率です。ここでの層別サンプリングは、20次元それぞれを独立に nn 分割してシャッフルするラテン超方格法として実装しています。nn を変えて測ると倍率自体が動きます。

nn素朴の標準偏差層別の標準偏差改善倍率
10310^33.63050.0326094111 倍
10410^41.10750.00115162962 倍
10510^50.31413.62794e−058658 倍

(この表は40反復での測定です。上の表は120反復なので n=105n=10^5 の値がわずかに違います。)

倍率が nn にほぼ比例して開いていきます。 両対数の傾きを測ると素朴が −0.531(=n1/2n^{-1/2})に対して層別は −1.477(=n3/2n^{-3/2})でした。これは定数倍の改善ではなく収束の次数そのものが変わっているということです。

なぜこの目標でだけ桁違いに効くのか。推定している量 S=kF1(uk)S = \sum_k F^{-1}(u_k)完全に加法的(各座標の寄与を足しただけ)だからです。ラテン超方格法は座標ごとのムラを消すので、加法的な成分の分散をほぼ丸ごと落とせます。

目標が「和の中央値」のとき(非線形)

手法推定の平均推定の標準偏差改善倍率
素朴456.36420.4008451.00 倍
対照変量法456.32310.3260561.23 倍
層別サンプリング456.35450.2296401.75 倍

目標が「90%点」「600超の確率」のとき

目標素朴の標準偏差層別の標準偏差改善倍率
90%点0.7339740.5129941.43 倍
合計 > 600 の確率0.0009850.0006721.47 倍

同じ手法・同じデータなのに、改善倍率が 9707 倍から 1.75 倍へ落ちました。

層別サンプリングが劇的に効いたのは、目標が期待値(=足し算)だったからです。各区画の寄与を足すという構造が層別と完全に噛み合う。ところが中央値や分位点は「並べ替えて真ん中を取る」操作で、区画ごとに分解できません。分散減少法の効果は、推定したい量の構造に依存します。

そして実務で使うのは中央値や90%点のほうでした。つまり「1.75倍のために実装を複雑にするか」という判断になります。


重点サンプリング:わざと歪めて重みで割り戻す

分散減少法の中で、重点サンプリングだけは別格です。上の4つの中では、まれな事象に効く唯一の手段だからです(ほかに分割法や交差エントロピー法がありますが、いずれも「事象の近くを重点的に引く」という同じ発想です)。ただし理屈が入りにくいので、サイコロ1個から始めます。

重みとは何か

歪んだサイコロがあって、6が出る確率を推定したいとします。素朴にやると100回振って平均2回しか6が出ないので精度が出ません。そこで6が出やすいサイコロに作り替えて振ります。

3パネルの棒グラフ。左は真のサイコロ p で、目1から6の確率が 0.30, 0.30, 0.20, 0.10, 0.08, 0.02。中央は提案のサイコロ q で 0.10, 0.10, 0.10, 0.10, 0.10, 0.50。右は重み w = p÷q で 3.00, 3.00, 2.00, 1.00, 0.80, 0.04。w=1 の水平破線が引かれ、「w=1 なら補正不要」と「6は出しすぎたので 0.04 に減点」という2つの注釈が入っている

出た目123456
真の確率 pp0.300.300.200.100.080.02
提案の確率 qq0.100.100.100.100.100.50
重み w=p÷qw = p \div q3.003.002.001.000.800.04

重みの意味はこれだけです。

本来 0.02 しか出ないはずの目を 0.50 で出させたので、25倍ズルをした。だから1回を 1/25=0.041/25 = 0.04 回分として数える。

選挙の出口調査で、ある投票所だけ意図的に多めに調査したら、集計のときに人数比で割り戻すのと同じです。第21回の「抽出確率が違うサンプルは重みをつけて集計する」がそのまま出てきています。

提案のサイコロを10回振って、「6が出たときだけ 0.04 を記録、それ以外は 0」を記録します。

12345678910
出た目2666654556
記録00.040.040.040.0400000.04

平均 =0.04×5÷10=0.0200= 0.04 \times 5 \div 10 = 0.0200。真値 0.02 と一致しました(この10回はちょうど6が5回出た当たり回です)。

なぜ合うのか。提案では6が10回中およそ5回(=0.50×10= 0.50 \times 10)出ます。その5回に 0.04 を掛けると 0.50×0.04=0.020.50 \times 0.04 = 0.02q6q_6w6=p6/q6w_6 = p_6/q_6 を掛けると q6q_6 が約分されて p6p_6 だけが残る。 これが「重みで補正する」の中身です。

方法n=107n = 10^7 での推定標準誤差
素朴(真のサイコロを振る)0.0200054.43e−05
重点サンプリング0.0200036.32e−06

どちらも 0.02 に収束し(偏りなし)、標準誤差は7倍改善しています。

理想の提案分布は作れない

「6を出やすく」がうまくいったなら、もっと極端にしたらどうなるか。6しか出ないサイコロまで行ってみます。

提案q6q_6重み w6=p6÷q6w_6 = p_6 \div q_610回振ったときの記録厳密な分散
素朴(真のサイコロ)0.021.00たいてい全部 01.9600e−02
6を50%に0.500.040.04 が5個くらい4.0000e−04
6を75%に0.750.02670.0267 が7〜8個1.3333e−04
6を90%に0.900.02220.0222 が9個4.4444e−05
6だけ出るサイコロ1.000.020.02 が10個。全部同じ0(厳密に)
6を1%に(逆方向)0.012.00ほぼ全部 03.9600e−02

6しか出ないサイコロを使うと、毎回必ず 0.02 が記録されます。全部同じ値なのでばらつきがゼロ。1回振るだけで厳密に答えが出ます。

ところがこれは使えません。重み w6=0.02w_6 = 0.02 を計算するには p6=0.02p_6 = 0.02 を知っている必要があり、そして p6p_6 こそが求めたい答えでした。

理想の提案分布は「答えを知っていれば、答えがそのまま重みとして毎回出てくる」というものです。すでに知っている数字を読み上げているだけなので、実際には作れません。

事象が複数の目にまたがる場合で書くと構造が見えます。「5か6が出る確率」(真値 0.10)なら、理想の提案分布は次の3ステップで作れます。

  1. 元の分布から事象の外(1〜4)を捨てる → 残るのは 0.08 と 0.02。合計 0.10 しかないので確率分布になっていない
  2. 0.10 で割って合計1に直す → 0.8 と 0.2。これが「{5,6}\{5,6\} に条件づけた分布」
  3. この分布を提案に使うと、重みは 0.08÷0.8=0.100.08 \div 0.8 = 0.100.02÷0.2=0.100.02 \div 0.2 = 0.10どちらも 0.10 で一定

②で割った数がそのまま重みとして戻ってくるだけなので、どの目でも同じ値になります。教科書の w=f(x)/(f(x)/p)=pw = f(x) / (f(x)/p) = p はこれを1行で書いたもので、pp は「割るときに使った 0.10」つまり求めたい答えそのものです。分散は素朴法の 9.0000e−02 から 0 になります。

重みは答えを知らなくても計算できる

ここで混乱しやすい点を1つ潰しておきます。pp が分からないなら重みも決められないのでは」という疑問です。

上のサイコロの例が悪かったので補足します。あの例では「求めたい答え P(X=6)P(X=6)」と「重みの計算に必要な個々の確率 p6p_6」が同じ数字でした。だから循環しているように見える。しかも答えが仕様表に書いてあるので、そもそもシミュレーションする必要がありませんでした。

サイコロを3個に増やすと分離します。

左右2パネルの図。左はサイコロ1個の確率分布の棒グラフで、0.30, 0.30, 0.20, 0.10, 0.08, 0.02 の6本。「① 仕様表:知っている6個の数字(重みの計算にはこれだけを使う)」というタイトル。右はサイコロ3個の合計の確率分布を対数軸で描いた棒グラフで、合計3から18まで並び、16・17・18の3本が赤く強調されて 5.04e-04, 9.60e-05, 8.00e-06 の値が付いている。「この3本の合計 = 0.00060800」と注釈。タイトルは「② 求めたい答え:合計が16以上になる確率(仕様表のどこにも書いていない)」

問いは「このサイコロを3個振って、合計が16以上になる確率」。216通りを全列挙した厳密値は 0.00060800 で、これは仕様表のどこにも書いてありません。提案は大きい目が出やすいサイコロ q=(0.05,0.05,0.10,0.15,0.25,0.40)q = (0.05, 0.05, 0.10, 0.15, 0.25, 0.40) にします。

試行出た目pp の積qq の積重み ww合計16以上?記録
1(3,6,5)0.20×0.02×0.08 = 0.0003200.10×0.40×0.25 = 0.0100000.03200014いいえ0
2(6,5,5)0.02×0.08×0.08 = 0.0001280.40×0.25×0.25 = 0.0250000.00512016はい0.005120
3(5,5,5)0.08×0.08×0.08 = 0.0005120.25×0.25×0.25 = 0.0156250.03276815いいえ0
4(6,6,2)0.02×0.02×0.30 = 0.0001200.40×0.40×0.05 = 0.0080000.01500014いいえ0
5(6,5,5)0.02×0.08×0.08 = 0.0001280.40×0.25×0.25 = 0.0250000.00512016はい0.005120
6(6,6,5)0.02×0.02×0.08 = 0.0000320.40×0.40×0.25 = 0.0400000.00080017はい0.000800
7(4,5,4)0.10×0.08×0.10 = 0.0008000.15×0.25×0.15 = 0.0056250.14222213いいえ0
8(4,6,4)0.10×0.02×0.10 = 0.0002000.15×0.40×0.15 = 0.0090000.02222214いいえ0

この表の全部の数字は、仕様表の12個(pp の6個 + qq の6個)から作られています。0.000608 という答えは1度も使っていません。

方法nn推定値標準誤差命中率
重点サンプリング10,0000.000604351.36e−0533.03%
重点サンプリング20,000,0000.000608673.06e−0733.11%
素朴10,0000.000300001.73e−040.03%
素朴20,000,0000.000603505.49e−060.06%

素朴法は n=10,000n = 10{,}000 で命中3回しかなく、推定値が真値の半分になっています。

一般的な構図はこうです。重点サンプリングが要求するのは「観測した1点に元の分布が割り当てる確率(密度)を計算できること」だけ。要求しないのは「その分布から導かれる複雑な量(裾確率・分位点・和の分布)を知っていること」。 式に代入できる量と、式から導かねばならない量の差でした。

仕様表にあるもの仕様表から導かねばならないもの
サイコロ3個1個の各目の確率(6個)合計が16以上になる確率
コイン10回1回の表の確率 0.59回以上表になる確率
指数分布20個密度の式 exe^{-x}20個の和が40を超える確率
記事20本のPVパレート分布の式合計PVの中央値・90%点

そして循環が起きる設定は、シミュレーションが不要な設定と同じでした。

重みが元の世界を厳密に復元することの確認

コイン10回で「表が9回以上出る確率」(真値 11/1024=0.010742187511/1024 = 0.0107421875)を題材にすると、重みの働きが厳密に確認できます。表の確率 0.8 のイカサマコインを提案に使い、表が kk 回出た列に対して

w=0.5100.8k×0.210kw = \frac{0.5^{10}}{0.8^{k} \times 0.2^{10-k}}
kk公平での確率イカサマでの確率重み ww
00.00097656250.00000010249536.743164
50.00097656250.00010485769.313226
80.00097656250.00671088640.145519
90.00097656250.02684354560.036380
100.00097656250.10737418240.009095

kk について「イカサマでの確率 × 重み」を計算すると、公平コインでの確率にぴったり戻ります。

kkq(k)×w(k)q(k) \times w(k)p(k)p(k)(公平コインでの真の確率)
00.00097656250.00097656251.1e−19
20.04394531250.04394531250.0e+00
50.24609375000.24609375002.8e−17
70.11718750000.11718750001.4e−17
90.00976562500.00976562501.7e−18
100.00097656250.00097656250.0e+00

11個すべてで一致しました(差はすべて浮動小数の丸め誤差)。重みを掛ける操作は、イカサマコインの世界を公平コインの世界に厳密に戻す変換になっています。 だから足し合わせれば答えが出る。n=107n = 10^7 での推定は重点 0.01074752(標準誤差 4.99e−06・命中率 37.6%)、素朴 0.01070720(標準誤差 3.25e−05・命中率 1.1%)でした。

まれな事象での威力

いよいよ本題です。「Exp(1) を20個足した合計が 100 を超える確率」を推定します。ガンマ分布の上側確率なので厳密値が出ます:3.764894e−23

方法nn推定値相対誤差
素朴なモンテカルロ法10510^50(命中0件)測定不能
素朴なモンテカルロ法10610^60(命中0件)測定不能
素朴なモンテカルロ法10710^70(命中0件)測定不能
重点サンプリング(θ=5\theta = 510310^35.2751e−2340.11%
重点サンプリング(θ=5\theta = 510410^44.0641e−237.95%
重点サンプリング(θ=5\theta = 510510^53.7262e−231.03%
重点サンプリング(θ=5\theta = 510610^63.7446e−230.54%

素朴法は1000万回で命中0件。重点サンプリングは1000回で桁が合い、10万回で誤差1%。102310^{-23} という確率を10万回のシミュレーションで測っています。 命中率は 0% から 47% に上がりました。

目安 θ=\theta = しきい値 ÷d\div\, d はどこから来るのか

上の θ=5\theta = 5 は当てずっぽうではありません。100÷20=5100 \div 20 = 5 です。この目安の出どころを確認します。しきい値 aa、変数の個数 dd とすると θ=a/d\theta^* = a/d になります。

まず理想の分布の姿を測る

理想の提案分布(事象に条件づけた分布)は作れませんが、どんな形をしているかは測れます。S>40S > 40 の場合で、棄却法を使って条件を満たす標本だけを4億回引いて集めました。

実測(条件付き標本 70,827 本)予測
1本あたりの平均2.0888a/d=2.0000a/d = 2.0000
合計 SS の平均41.7761しきい値 a=40a = 40

「合計が40を超えた世界」では、1本あたりの平均が 1 ではなく 2 前後になっています。 しきい値をちょうど超えるあたりに集まるので a/da/d。つまり θ=a/d\theta = a/d は「理想の分布の平均を真似た設定」でした。形まで一致させることはできませんが、中心は合わせられます。

母関数が出てくる

なぜ「平均 θ\theta の指数分布」で真似られるのか。ここで第9回の母関数が効きます。元の密度に etxe^{tx} を掛けて正規化する操作を指数傾斜といいます。

gt(x)etxf(x)=etxex=e(1t)xg_t(x) \propto e^{tx} \cdot f(x) = e^{tx} \cdot e^{-x} = e^{-(1-t)x}

これは平均 1/(1t)1/(1-t) の指数分布です。つまり「平均 θ\theta の指数分布から引く」という操作は、実は t=11/θt = 1 - 1/\theta で傾斜させたことと同じでした。指数分布は傾斜させても指数分布のまま(指数型分布族の性質)なので、族の中で閉じています。

そして重みを書き直すと、モーメント母関数 M(t)=1/(1t)M(t) = 1/(1-t) がそのまま現れます。

w=M(t)detSw = M(t)^d \cdot e^{-t S}

密度比を素直に計算した値とこの式の値を比べたところ、最大の差 8.327e−16(浮動小数の丸め誤差)で一致しました。

最適な tt は、傾斜した世界での SS の期待値をしきい値に等しくする条件で決まります。

Et[S]=dM(t)M(t)=d1t=a    11t=ad    θ=adE_t[S] = d \cdot \frac{M'(t)}{M(t)} = \frac{d}{1-t} = a \;\Rightarrow\; \frac{1}{1-t} = \frac{a}{d} \;\Rightarrow\; \theta^* = \frac{a}{d}

日本語に直すと「まれな事象を、ふつうの出来事に変える」です。元の世界では合計40は平均20から遠い外れ値ですが、θ=2\theta = 2 の世界では合計40が平均そのものになります。

左右2パネルの図。左は20個の合計 S の分布を3通りで比べたもの。水色の塗りつぶしが元の分布(平均1)で S の平均20、緑の折れ線が提案 θ=2 で S の平均40、赤い破線がしきい値 a=40 で緑の分布の中心に来ている。右は横軸を250まで広げ、橙の折れ線 θ=6 を追加したもの。θ=6 では S が120付近に集まり、しきい値40の近傍が逆に空いている

実測した SS の平均は、元の分布で 20.01、θ=2\theta = 2 で 40.00、θ=6\theta = 6 で 119.99 でした。θ=6\theta = 6 まで行き過ぎると、しきい値40の近傍が逆に空きます。 行き過ぎが悪いのは「まれな事象を今度は反対側からまれにしてしまう」ためです。

おまけ:チェルノフ上界と同じ tt が出る

同じ tt は、確率の上界を求める古典的な計算からも出てきます。

P(S>a)etaM(t)dを t について最小化P(S > a) \le e^{-ta} \cdot M(t)^d \quad \text{を } t \text{ について最小化}
数値
数値的に最小化した tt^*0.5000
理論値 t=1d/at^* = 1 - d/a0.5000
対応する θ=1/(1t)\theta^* = 1/(1-t^*)2.000
上界の値2.1613e−03(真値 1.7630e−04 の 12.3 倍)

「確率の上界を一番きつくする傾け方」と「重点サンプリングの最適な提案分布」が同じ tt になります。 どちらも「その事象がいちばん起こりやすくなるパラメータ」を探しているからです。第12回の尤度比検定で見た「対立仮説側に最も有利なパラメータを探す」構造と同じ形でした。

なぜ分散減少法を常用しないのか

a/da/d はこの問題(独立な和の裾)に固有の公式で、一般には書けません。そして外すと素朴法より悪くなります。 P(S>40)P(S > 40)(真値 1.763029e−04)で θ\theta を動かしました。

θ\theta推定値相対誤差1試行の分散素朴法比
1.0(素朴)1.80000e−042.10%1.7997e−041.0000 倍
1.21.72415e−042.21%6.4256e−060.0357 倍
1.51.75532e−040.44%5.5975e−070.0031 倍
2.01.76481e−040.10%1.6905e−070.0009 倍
2.51.75394e−040.52%2.5748e−070.0014 倍
3.01.75366e−040.53%6.9552e−070.0039 倍
4.01.76441e−040.08%7.7282e−060.0429 倍
6.01.36611e−0422.51%5.9183e−043.2886 倍
8.03.83484e−0578.25%4.2867e−042.3819 倍
10.07.99491e−0695.47%2.5287e−050.1405 倍

θ=2\theta = 2 で分散が素朴法の 0.0009 倍(約1100倍の改善)ですが、θ=6\theta = 688 では素朴法より2〜3倍悪化します。

そして θ=10\theta = 10 の行が最も危険です。分散は素朴法の 0.1405 倍と「小さく」見えるのに、推定値は真値の 4.5%(相対誤差 95%)。 同じ n=200,000n = 200{,}000 を40回繰り返して確かめました。

θ\theta推定値の平均実際の標準偏差報告される標準誤差実際 ÷ 報告真値から10%以上外れた回数
1.01.7138e−042.981e−052.916e−051.02 倍17 / 40
2.01.7630e−049.151e−079.197e−071.00 倍0 / 40
6.02.0001e−047.112e−056.882e−051.03 倍37 / 40
10.01.6052e−066.950e−061.602e−064.34 倍40 / 40

θ=10\theta = 10 では標準誤差が実際のばらつきの4分の1しか報告されません。 重みが極端に偏り、「たまに出る巨大な重み」を引き当てないと正しい値にならないためです。引き当てなかった回は、小さくまとまった嘘の答えと小さな標準誤差が並んで出てきます。

つまり自分が間違っていることに気づけません。 素朴法(θ=1\theta = 1)は不正確ですが、標準誤差は正直です(1.02倍)。

答えを知らずに θ\theta を選ぶ方法

そこで実務では真値を使わずに計算できる診断指標を使います。有効サンプルサイズです。

ESS=(vi)2vi2(vi は各サンプルの推定量への寄与)\text{ESS} = \frac{\left(\sum v_i\right)^2}{\sum v_i^2} \qquad (v_i \text{ は各サンプルの推定量への寄与})

意味は「nn 個引いたが、実質いくつが効いているか」。寄与が均等なら nn に近く、命中が少ないか1個の巨大な重みに支配されていると小さくなります。真値 pp はどこにも入っていません。

なお教科書の ESS は重み wiw_i だけで (wi)2/wi2(\sum w_i)^2 / \sum w_i^2 と定義しますが、まれな事象では上のように推定量への寄与 vi=wi1Av_i = w_i \mathbf{1}_A(命中しなかった試行は 0)を使います。こうすると「命中したうえで重みが均等か」を1つの数で見られます。素朴法(θ=1\theta = 1)で ESS ÷n\div n が 0.000167 と極端に小さいのは、重みが完全に均等でも命中率が pp しかないためです。

横軸を提案分布の平均θとし、左軸に有効サンプルサイズESS÷n(青い実線・対数軸)、右軸に相対誤差RMSE(赤い破線・対数軸)を重ねた図。青は θ=1 の 0.000167 から上昇して θ=2 で最大 0.155 に達し、その後 θ=10 の 0.000016 まで下がる。赤は逆に θ=1 の 18.67% から下がって θ=2〜2.5 付近で最小 0.7% 台になり、その後 θ=8 の 793% まで上昇し、θ=10 では 97.92% へ下がって見える(推定値が0に潰れて100%で飽和したため)。緑の点線が θ=2.0 に引かれ「理論の目安 θ=a/d=2.0」と注釈されている

θ\thetaESS ÷ nn相対誤差(40回反復の RMSE)
1.0(素朴)0.00016718.67%
1.20.0047014.25%
1.50.0524891.46%
1.80.1309920.76%
2.00.1549490.78%
2.50.1069700.71%
3.00.0423821.48%
4.00.0040396.09%
6.00.00004649.46%
8.00.000017793.03%
10.00.00001697.92%

ESS の山と誤差の谷は、ほぼ同じ位置に立ちます。 厳密には ESS の最大が θ=2.0\theta = 2.0、相対誤差の最小が θ=2.5\theta = 2.5 で1目盛りずれていますが、40反復のばらつきの範囲です。そして緑の点線(理論の目安 2.0)が ESS の頂点と一致しています。真値を使わずに最適な設定の近傍を特定できる、というのが要点です。

注意点が1つあります。 θ=8\theta = 8 の相対誤差 793% に対して θ=10\theta = 10 は 97.92% と、数字だけ見ると改善しています。これは改善ではありません。 θ=10\theta = 10 では推定値がほぼ 0 に潰れ、「常に 0 と答える」状態に近づいたために相対誤差が 100% で飽和しているだけです。ESS はどちらも 0.00002 前後で、正しく破綻を示しています。相対誤差だけを見ると誤読します。

常用しない4つの理由

理由根拠になった数値
① 問いによって効果が桁で違う層別が期待値で9707倍、中央値で1.75倍(いずれも n=105n = 10^5。倍率は nn にほぼ比例して開く)
② 外すと素朴法より悪化する重点サンプリングの θ=6\theta = 6 で分散 3.29 倍
③ 標準誤差が過小評価され、失敗を検知できないθ=10\theta = 10 で実際が報告の 4.34 倍、40/40 回外れた
④ 良い設計には「答えの居場所」の事前知識が必要最適 θ\theta \approx しきい値 ÷d\div\, d

実務での判断はこうなります。まず素朴なモンテカルロ法で回す。nn を増やして間に合うならそれで終わり(③の危険を負う必要がない)。nn をいくら増やしても届かないときだけ、分散減少法を持ち出す。そのときは必ず複数の設定で回して答えが一致するか確認するθ=2\theta = 2θ=2.5\theta = 2.5 が一致し、θ=10\theta = 10 だけ外れることが検知の手がかりになります)。


ブートストラップ法・並べ替え検定・ジャックナイフ法

最後に、データを使い回す3つの手法を整理します。3つとも「手元のデータから作り直す」ので混ざりやすいのですが、作っている分布が違います。 これが1点の要約です。

ブートストラップ法
第11回
並べ替え検定
第15回
ジャックナイフ法
第10回
作る分布推定値のばらつき帰無仮説のもとでの分布推定値のばらつき
答える問いこの推定値はどれくらいブレるか2群が同じ分布から来ているとしたら、これほどの差が出るかこの推定値はどれくらいブレるか
出力標準誤差・信頼区間p値標準誤差・偏りの補正
やること復元抽出(同じ人が2回出る)群のラベルをシャッフル(非復元)1個ずつ抜く
分布の中心観測値のまま0(帰無仮説の値)。ただし差の形の統計量に限る観測値のまま
乱数必要必要(全列挙できれば不要)不要(決定的)
計算回数1万〜10万(任意)(2010)=184,756\binom{20}{10} = 184{,}756(全列挙可)nn 通りだけ
根拠となる仮定手元の標本を母集団の代わりに使う帰無仮説のもとでラベルが交換可能統計量が滑らか(1次近似)

同じデータで3つ回した

A群 10人(平均 66.00)、B群 10人(平均 56.30)、差 9.700 です。

左右2パネルの図。左は並べ替え検定の帰無分布で、全184,756通りのヒストグラム(橙)が0を中心に左右対称に広がり、観測された差9.7の位置に赤い実線、その鏡像である-9.7に赤い点線、中心0に青い破線が引かれている。タイトルに両側 p = 0.0196。右はブートストラップ法の分布で、10万回のヒストグラム(緑)が観測値9.7を中心に広がり、95%信頼区間[2.8, 16.7]が青い帯で示され、0の位置に灰色の破線がある

左は分布の中心が 0 です。 「差がない世界」を作っているので当然そうなります。観測値 9.7 がどれくらい端にあるかを見て p 値を出します。右は分布の中心が観測値 9.7 のまま。 「同じ調査をやり直したら差はどれくらい動くか」を見ています。この2枚の中心の違いが、両者の違いのすべてでした。

方法結果参考値
並べ替え検定(全 184,756 通りを列挙)両側 p = 0.019637(3,628 通りが観測以上に極端)帰無分布の中心 −0.000000・標準偏差 4.2681
ブートストラップ法(10万回)標準誤差 3.5547/95%信頼区間 [2.800, 16.700]分布の中心 9.6871
ジャックナイフ法(A群10通り+B群10通りを群別に計算して合成)標準誤差 3.7418ウェルチの標準誤差 3.7418 と一致

ジャックナイフ法の検算が面白いところです。 A群の平均のジャックナイフ標準誤差は 3.1972 で、s/n=3.1972s/\sqrt{n} = 3.1972小数第4位まで完全に一致しました(B群も 1.9439 と 1.9439)。

これは偶然ではなく、平均に対してはジャックナイフ法が s/ns/\sqrt{n} を厳密に再現するためです。θ^(i)xˉ=(xixˉ)/(n1)\hat\theta_{(i)} - \bar x = -(x_i - \bar x)/(n-1) を代入すると、ジャックナイフ分散が s2/ns^2/n にぴったりなります。
そして上の表で「差の標準誤差 3.7418 がウェルチと一致」と書きましたが、これも検算ではなく恒等式の確認です。群ごとの標準誤差を SEA2+SEB2\sqrt{SE_A^2 + SE_B^2} で合成する式が、ウェルチの標準誤差の定義そのものだからです。なおこれは群別に計算して合成した場合の話で、20点をプールして1個ずつ抜くと係数が変わり 3.8443 になって一致しません。

だから「平均の標準誤差」を出したいだけならジャックナイフ法は不要(公式がある)。公式がない統計量(中央値・相関係数・分位点)のときに意味が出ます。 その場合は偏りの補正 θ^jack=nθ^(n1)θˉ()\hat\theta_{\text{jack}} = n\hat\theta - (n-1)\bar\theta_{(\cdot)} も併せて使います。

もう1点。ブートストラップ法の標準誤差 3.5547 がジャックナイフ・ウェルチの 3.7418 より小さいのは、乱数のゆらぎではなく系統的な差です。群内の復元抽出は分母 nn の分散に対応するので、3.7418×9/10=3.54983.7418 \times \sqrt{9/10} = 3.5498 とほぼ一致します(SSA/100+SSB/100\sqrt{SS_A/100 + SS_B/100} を直接計算しても 3.5498)。nn が小さいときは n/(n1)n/(n-1) の補正を入れるか、この差を過度に解釈しないのが安全です。

使い分けの覚え方はこうです。

  • p値が欲しい → 並べ替え検定(帰無仮説の世界を作る)
  • 信頼区間・標準誤差が欲しい → ブートストラップ法
  • 乱数を使いたくない・軽くしたい → ジャックナイフ法(ただし中央値のようなガタつく統計量には弱い)

試験では「復元か非復元か」「分布の中心が観測値か 0 か」で判別できます。

1点だけ注意です。並べ替え検定が厳密に検定しているのは「平均に差がない」ではなく「2群の分布が同一」という強い帰無仮説です。平均だけ等しく分散が違う場合には、厳密な有意水準は保証されません。また「帰無分布の中心が 0」は平均差のような差の形の統計量に限った性質で(左右対称になるのは nA=nBn_A = n_B のとき)、順位和のような統計量では中心は 0 になりません。


自分が間違えていたこと

この章を学ぶ前、次のように思っていました。全部違いました。

① モンテカルロ法は速くて正確な計算法だと思っていた。

逆です。遅くて不正確です。 1変数の期待値では等間隔グリッドに1億倍以上の精度差で負けました(誤差 4.91e−10 対 6.86e−02。典型誤差 0.0223 で比べても約 4.5×1074.5 \times 10^7 倍)。長所は精度でも速度でもなく次元に鈍感なことだけ。「精度で勝つ」のではなく「他の方法が全滅する場所でも生き残る」という勝ち方でした。

1/n1/\sqrt{n} は「収束が遅い」という欠点だと思っていた。

次元に鈍感という長所でした。 グリッドの誤差指数は 2/d-2/d で、d=1d=1 では 2.001-2.001(実測)と圧倒的に速いのに、d=8d=8 では 0.261-0.261 まで劣化します。モンテカルロ法は 0.472-0.472 のまま。交差点は d=4d = 4 でした。

③ モンテカルロ法は次元の呪いを受けないと思っていた。

受けます。ただし「傾き」ではなく「高さ」に出ます。 σ÷\sigma \div 答え が次元とともに、平均の推定では縮み(d=32d=32 で 0.1768)、積の期待値では増え(28.78)、まれな事象では暴走します(65536)。3ケースすべて傾きは 0.50-0.50 のままで、違うのは出発点の高さだけでした。

④ 棄却法をモンテカルロ法の一種だと思っていた。

別カテゴリです。棄却法は「乱数を作る」技術で出力は標本、モンテカルロ法は「乱数を使う」技術で出力は数値。同じダーツから両方が出るので混同しやすいのですが、個数を使うか座標を使うかで別れます。

⑤ 逆関数法にヤコビアンは出てこないと思っていた。

出ていました。ヤコビアン du/dx=F(x)=f(x)|du/dx| = F'(x) = f(x) で、密度そのものだったのです。「累積分布関数の傾きが密度」という最初の観察が、そのままヤコビアンでした。1次元では両者が同じものなので気づかなかっただけです。

⑥ 分散減少法は「使えるなら常に使うべき技術」だと思っていた。

外すと素朴法より悪化します。重点サンプリングの θ=6\theta = 6 で分散が 3.29 倍。さらに悪いことに、θ=10\theta = 10 では標準誤差が実際のばらつきの4分の1しか報告されず、40回中40回が真値から10%以上外れました。 失敗を検知できないのが最大の問題でした。

⑦ 相対誤差が小さくなれば改善だと思っていた。

θ=8\theta = 8 の 793% から θ=10\theta = 10 の 97.92% への「改善」は改善ではありません。推定値が 0 に潰れて相対誤差が 100% で飽和しただけでした。値域に上限がある指標では、良くなったのか壊れたのかが区別できません。

⑧ 「平均と分散が理論値と合ったから正しい」と考えていた。

ボックス=ミュラー法でヤコビアンの rr を落とした誤り版は、分散 1.00147(理論 1)で合格します。尖度が 9.1698(理論 3)、原点付近の割合が 21.83%(理論 7.97%)でようやく破綻が見えました。同じ構造は RANDU でも起きており、平均・分散・適合度 χ2\chi^2 はすべて合格するのに3次元では15枚の平面しかありません。低次元の要約統計量は、高次元の破綻を隠します。

⑨ 擬似乱数の最大の弱点は周期だと思っていた。

現代の生成器では周期は問題になりません(PCG64 なら毎秒10億個で 102210^{22} 年)。問題は規則性と、同じシードでの並行実行でした。

⑩ 「FF が計算できるならシミュレーションは不要」と考えていた。

半分正しく、半分間違いでした。分かれ目は「FF が計算できるか」ではなく「知りたい量が何変数の積分か」。20本の合計PVの期待値は式で出ますが(471.103)、中央値(456.4)は出ません。そして実務で使うのは後者でした。 ⑪ この記事を書いている最中にも、同じ罠を踏みました。

σ÷\sigma \div 答え の表(ケースB)で、d=32d = 32 の値を標本標準偏差で1回測って 42.83 と書いていました。 厳密値は 28.78 です。シードを変えると 21〜76 に動きます。cos\prod\cosd=32d=32 は尖度が 4.3×1054.3 \times 10^5 で、σ\sigma そのものが推定できない領域でした。

指摘を受けて閉じた式 (π2/8)d1\sqrt{(\pi^2/8)^d - 1} に置き換えました。「母分散が無限だと標準偏差が暴れる」という、この記事で自分が書いた話をそのまま踏んだわけです。定性的な主張(σ\sigma が指数的に増える)は正しかったので、余計に気づきにくかった。


要点まとめ

論点結論
章の構造乱数を「作る」技術(出力=標本)と「使う」技術(出力=数値)の2つ。モンテカルロ法は後者を指す
逆関数法の原理累積分布関数の縦軸に一様乱数を置いて横軸に落とす。傾きが急なところに多く落ちる=密度が高い
なぜ正しいかxx 軸の区間と uu 軸の区間が対応し、uu 軸側の長さがその区間の確率になる(連続で狭義増加なら1対1)。200万個で判定が全件一致
1行の証明P(Xx)=P(uF(x))=F(x)P(X \le x) = P(u \le F(x)) = F(x)。使うのは「FF が単調非減少かつ右連続」だけ
どんな分布でも作れる理由累積分布関数は単調非減少・右連続。水平部分があっても一般化逆関数 inf{x:F(x)u}\inf\{x: F(x)\ge u\} で通る。分布の情報は FF の形だけが持っている
離散分布累積分布関数が確率 pkp_k の分だけ垂直に跳ぶので、幅 pkp_kuu が同じ値に写る
変数変換との関係逆関数法は1次元・単調な場合の特殊ケース。ヤコビアン =F(x)=f(x)= F'(x) = f(x)
棄却法の原理密度を面積として見て、覆いの中に一様に点を打ち、下に落ちた点の xx を採る
採択率覆いの中に入っている密度の面積 ÷ 覆いの面積。覆いが分布なら =1/c= 1/cc=supf/gc = \sup f/g、必ず c1c \ge 1
覆いの選び方長方形 0.3133 → コーシー分布 0.6577 → 指数分布 0.7602。重い裾で軽い裾を覆う(逆は不可)
長方形のジレンマ狭くすると採択率は上がるが裾が切れて別の分布になる
棄却法の限界d=15d=15 で200万点から19個。d=20d=20 で 4063万回に1回。だから高次元では MCMC
ボックス=ミュラー法2次元正規を極座標で見ると角度は一様・距離の2乗は平均2の指数分布。両方とも簡単に作れる
その効率一様乱数2個で正規乱数2個。無駄ゼロ(棄却法は 6.383 個必要)
ヤコビアンの役割dxdy=rdrdθdx\,dy = r\,dr\,d\thetarrS=r2S=r^22rdr2r\,dr に吸収される。落とすと尖度 9.17(理論 9)になるが分散は 1.00 で合格してしまうr=logur = -\log u とした場合)
擬似乱数完全に決定的。周期はパラメータ次第で mm より短くなる(a=9,c=0,m=16a=9,c=0,m=16 で周期2)
周期は問題か現代の生成器では問題にならない。問題は規則性(RANDU は3次元で15枚の平面)
欠陥の見つけ方1次元の検定(平均・分散・χ2\chi^2)は全部通る。次元を上げないと見えない
シードと再現性同じライブラリの同じバージョンでのみ再現。並行実行で同じシードは実質サンプル数が増えない
シミュレーションの正当性①任意の分布を作れる(第32章)+②大数の法則(第7章)の2本柱
1変数での優劣等間隔グリッドが1億倍以上勝つ(単一実現値。典型誤差で比べても約4500万倍)。モンテカルロ法は点の置き場所を雑にしているだけ
誤差の法則グリッド(中点則・被積分関数が2階微分可能)は n2/dn^{-2/d}、モンテカルロは n1/2n^{-1/2}交差は d=4d=4(不連続な量なら n1/dn^{-1/d} で交差は d=2d=2
高次元でのグリッドd=20d=20 で軸10点なら 102010^{20} 回。毎秒10億回でも 3175 年
モンテカルロと次元の呪い傾きではなく高さに出る。 nn を増やせば必ず解決するが、必要な nn が天文学的
母分散が無限のとき標準偏差の推定値がシードごとに 655〜2814 と暴れる。存在しない量を測っている
パレート分布 α=1.5\alpha=1.5 の精度標本平均のばらつきは n1/3n^{-1/3}(実測 −0.318)。nn 10倍で 2.15 分の1しか縮まない
仮定の感度上限の想定を100倍動かすと中央値 490.5→490.6(不動)、標準偏差 412→1525(3.7倍)。分位点で語れば仮定が入らない
分散減少法の4手法対照変量法・層別サンプリング・制御変量法・重点サンプリング。期待値の推定なら4つとも無偏(重点は台の被覆、制御変量は bb を別標本で決めることが条件。分位点は素朴法を含めどれも有限標本では無偏でない)
効果の目標依存層別サンプリングは期待値で 9707 倍、中央値で 1.75 倍n=105n=10^5)。加法的な目標に強く、倍率は nn に比例して開く
重みの意味p÷qp \div q歪めた分を割り戻す係数(第21回の不均等抽出と同じ)
重みが復元することq(k)×w(k)=p(k)q(k) \times w(k) = p(k) が全 kk で一致(差 101710^{-17} 台)
理想の提案分布事象に条件づけた分布。分散ちょうど 0。ただし正規化定数が答えそのもので作れない
重みに必要な情報観測点の密度だけ。答え(裾確率・分位点)は不要。循環する設定はシミュレーション不要な設定
まれな事象での威力P(S>100)=3.76×1023P(S>100) = 3.76 \times 10^{-23} を素朴法は 10710^7 回で命中0。重点サンプリングは 10510^5 回で誤差 1.03%
目安 θ=a/d\theta = a/d条件付き分布の1本あたりの平均が a/da/d(実測 2.0888)。指数傾斜+母関数で導出。チェルノフ上界と同じ tt
常用しない理由外すと悪化(θ=6\theta=6 で 3.29 倍)/標準誤差が 4.34 倍過小になり失敗を検知できない
実務での診断ESS =(v)2/v2= (\sum v)^2 / \sum v^2真値を使わずに最適 θ\theta の近傍を特定できる(ESS の山は θ=2.0\theta=2.0、誤差の谷は θ=2.5\theta=2.5
3つの再標本化法ブートストラップ=復元・中心は観測値・信頼区間/並べ替え=シャッフル・中心は0(差の形の統計量のとき)・p値/ジャックナイフ=1個抜き・乱数不要
ジャックナイフの検算平均に対しては s/ns/\sqrt{n} を厳密に再現(3.1972 と 3.1972)。公式がない統計量で意味が出る

試験対策としての優先順位

優先度項目
最優先逆関数法(X=F1(u)X = F^{-1}(u) を具体的な分布で書けること。指数分布 log(1u)/λ-\log(1-u)/\lambda、ワイブル分布、幾何分布 log(1u)/log(1p)\lceil \log(1-u)/\log(1-p) \rceil、一般の離散分布は累積確率と比べる)
優先棄却法の採択率 =1/c= 1/ccc の求め方/モンテカルロ積分の誤差が 1/n1/\sqrt{n} であること/ブートストラップ法と並べ替え検定の違い
普通ボックス=ミュラー法の式/χ2(2)=\chi^2(2) = 平均2の指数分布/擬似乱数の周期とシード/ジャックナイフ法(標準誤差と偏りの補正 nθ^(n1)θˉ()n\hat\theta - (n-1)\bar\theta_{(\cdot)}
軽く分散減少法(4つの名前と「何をしているか」だけ。導出は不要)

準1級で手を動かす計算問題は逆関数法に集中しています。 FF を書いて uu について解く、という操作を分布ごとに確実にやれるようにするのが最短です。分散減少法は用語と使いどころを答えられれば十分でした。


連載を振り返る(全34回)

これで公式ワークブックの全32章を一周しました。回番号と章番号がずれているのは、第2章(母関数)を後回しにして第9回に置き、第6章を第6回・第7回の2回に分けたためです(第30章のモデル選択は第32回、第32章のシミュレーションが今回)。本編としては最終回なので、最初の状態から何が変わったのかを書き残しておきます。

出発点:「結局これ何に使うんだっけ」が答えられなかった

第1回にこう書きました。

公式テキストは一通り目を通しました。それなのに、いま範囲を見返しても後半はほとんど頭に残っていません。数式が難しかったという話ではなく、「この手法、結局何に使うんだっけ?」 が答えられない状態です。

一度通読して挫折した状態からの再挑戦でした。方針は3つだけ決めました。定義ではなく「何に使う道具か」から入る。生成AIに説明させる。その説明を自分で計算・シミュレーションして検証する。

何が効いたのか

振り返って、明確に効いたやり方が4つあります。

① 数式より先に「定義そのものの図」を出す。

抽象的なイメージ図ではなく、定義を絵にすると何が見えるかを描く。イェンセンの不等式は E[g(X)]g(E[X])E[g(X)] \ge g(E[X]) という式ではピンと来ませんでしたが、「g(E[X])g(E[X]) は曲線上の点、E[g(X)]E[g(X)] は弦の中点、凸なら弦は曲線の上」という3点の図を見た瞬間に「そらそうだろ」という気持ちになりました。決定係数も「3本の縦線を測るだけ」に分解したら通りました。今回の逆関数法も、累積分布関数を横から読む図が入口でした。

② 用語を後回しにして、先に「測るもの」を見せる。

用語を定義してから中身に入ると詰まります。逆にしました。R2R^2 なら「①実測値から平均までの距離、②予測値から平均まで、③実測値から予測値まで」を図で測ってから、最後に「①②③に名前を付けただけ」として平方和という言葉を出す。今回も、重みを「p÷qp \div q」と定義する前に「25倍ズルしたから1回を 1/25 回分として数える」を先に置きました。

③ 自分の間違いが最良の教材だった。

各回で査読を入れて、自分の誤りを数えました。第16回で5件、第17回で8件、第21回で9件、第24回で12件、第29回で7件、第31回で11件……。この誤りのリストが、記事の中でいちばん価値のある部分になりました。 読者も同じ場所で間違えるからです。そして自分にとっても、間違えた箇所は二度と忘れません。

今回も⑧「平均と分散が合ったから正しい」の思い込みが2か所(ボックス=ミュラー法の rr と RANDU)で同時に露出しました。同じ形の罠を2回踏んだので、これはもう習性です。

④ 同じ道具が章をまたいで何度も出てくる。

これが最大の発見でした。32章はバラバラな手法の集まりではなく、少数の道具の使い回しでした。とくに繰り返し出てきたのは次の5つです。

道具どこで再登場したか
σ/n\sigma/\sqrt{n} と精度の限界第8回(中心極限定理)→ 第11回(区間の幅)→ 第21回(標本設計)→ 今回(モンテカルロ誤差)
固有値・固有ベクトル第22回(定常分布)→ 第24回(主成分)→ 第25回(判別)→ 第27回(因子)
母関数第9回(畳み込みを掛け算に)→ 今回(指数傾斜と重点サンプリングの最適設計)
残差に落として考える第16回(偏回帰係数)→ 第17回(てこ比)→ 第27回(偏相関)→ 今回(制御変量法)
変数変換とヤコビアン第4回(定義)→ 今回(逆関数法とボックス=ミュラー法)

とくに今回は回収の回でした。 逆関数法のヤコビアンが第4回、重点サンプリングの最適設計が第9回の母関数、シミュレーションの正当性が第8回の大数の法則、棄却法の高次元崩壊が第33回の MCMC の動機、そして重みが第21回の不均等抽出。5つの章とつながりました。

まだ弱いところ

正直に書いておきます。

  • 多次元正規分布は過去問(2019年6月)で手が止まった箇所で、第24回・第27回で扱いましたが手計算の速度はまだ足りません
  • 線形代数(固有値の手計算)は 2×2 なら追えますが、3×3 以上は時間がかかります
  • 章別の演習量が足りていません。ここからは過去問中心に切り替えます

数字で見た連載

項目
本編34回(第1回は方針。第2〜34回の33本で全32章。第6章だけ2回に分けたので 33 本 = 32 章 + 1)
番外編統計の記号の基本期待値の定義MCMCを自作した記録
要点まとめノート確率の土台編推測統計編線形モデル編確率過程編多変量解析編発展編
全体のまとめ統計検定準1級・独学連載のまとめ

最初に「後半はほとんど頭に残っていない」と書いた状態から、少なくとも「どの章の道具が何のためにあるか」は答えられるようになりました。 一度通読しただけでは埋まらなかった穴が、自分で数字を出して理論値と突き合わせるという作業で埋まったのだと思います。

シミュレーションの章を最後に置いたのは結果的に正解でした。連載でずっと使ってきた検証手段そのものを検証する回になったからです。「1/n1/\sqrt{n} でしか精度が上がらない」という制約のもとで34回分の数値検証をしてきたわけで、その制約が「遅さ」ではなく「次元への鈍感さ」だったと分かったのは、最後に来る発見としてちょうど良い形でした。


次回

本編はここで完結です。次回からは試験対策編に入ります。

残っている穴は演習量です。

ここからは過去問を解いて、間違えた箇所を章に戻って埋める作業に切り替えます。連載としては「どこで詰まったか」と「その原因がどの章の穴だったか」を記録していく形になります。過去問を解いてみると、詰まる箇所はほぼ例外なく既習の章の穴でした。範囲の判別自体はできるようになっているので、あとは穴を1つずつ塞ぐ段階です。

この連載の全体像とこれまでの回は統計検定準1級・独学連載のまとめにあります。