サンプリング法のノート

• 逆関数法
公開コピー誌
分布関数 F (x)
サンプリング法のノート
(
)
∫
=
f (x)dx
がわかっていて、その逆関数
F −1 (z) が計算できるときの方法。0∼1 のあいだの一様乱数
z を x = F −1 (z) によって変換すると x は f (x) に従う。こ
暗黒通信団
れは 0∼1 のあいだに f (x) に従った目盛りをふっておくよう
なイメージである。
• 階段関数の近似サンプリング
逆関数法を任意確率分布に拡張する際の方法。f (x) の定義域
1 はじめに
●
を微小区分に分割し、その和が 1 になるようにしておく。一
本稿は確率分布からのサンプリングについてまとめたノートである。
様乱数を発生させ、その位置がどこにあるかを探索する。乱
サンプリングというのは、ある与えられた確率分布 f (x) から標本列
数発生毎に探索が発生する点が問題である。
を得ること、要するに複雑な分布に従う乱数を発生させるための方法
• 棄却法(Rejection sampling)
である。本稿は短いので Web で一般公開するが、自分は専門家では
任意確率分布を発生させるときの方法。f (x) を覆うような単
ないので情報の利用は自己責任でお願いしたい。なお、本稿は一様乱
純な領域に点を打ち、点の位置が f (x) 以下であればその x を
数を得るアルゴリズムについて深く掘ったものではない。現実問題と
乱数値として返す。そうでないなら点を打ち直す。覆い方が
して一様乱数を計算機で得るにはメルセンヌツイスタ (以下 MT) が
悪いと何回も点を打つことになる点が問題である。f (x) を覆
標準的であり、他の方法は極端な計算量軽減や特殊な CPU での動作
うような関数を「提案分布」と呼ぶ。
など用途が限られている。万一物理乱数が必要な場合は統計数理研究
• 適応的棄却サンプリング
所のページから無料で取得することもできる。乱数の評価について
棄却法において、f (x) を覆う分布自体を学習する方法。分
は NIST テストが有名であるが、本稿はそれについてもふれない*1 。
布 p(x) の観測値に基づいてその場で提案分布を構築してゆ
本稿はその前提として一様乱数を発生させるエンジン (MT など) は
く。大抵は線分で区切って凸関数状に覆う(包絡分布)。分布
既にあるものとする。
を確実に覆える関数であることが大事。あるいは、後述する
現代のサンプリング法は大きく分けて MCMC とそれ以外に大別
Metropolis-Hastings ステップをおく方法もある。
される。個人的には MCMC を理解するには、MCMC 以外の素朴な
• 分布 f (x) に特化したサンプリング法
乱数発生器から入ったほうが理解しやすいと思うので、その順に排列
正規分布を発生させる Box-Muller 変換や、一様乱数を発生さ
した。
せるメルセンヌツイスタなどは分布に特化した方法といえる。
そ の 他「 重 点 サ ン プ リ ン グ*2 」や「SIR(sampling-importance-
2 乱数と逐次処理
●
resampling)*3 」がある。
一様乱数を使った処理と逐次処理アルゴリズムの関係について、一般
こうしてみると、分布 f (x) が必ずしも積分できないところに本
的な枠組みは次のようなものである。ある区間 x ∈ [a, b] の間で n 個
当の問題がある。f (x) が離散値で与えられている場合は一度数値積
の一様乱数 {x1 , x2 , ..., xn } を発生させて処理 f (x) を反復すると
分しておく方法もあるが、f (x) 自体が動的に変化する場合は現実的
いうことは、a から b にステップ |a − b|/n 毎に逐次的に処理 f (x)
ではない。MCMC はそうした場合にも対応できるアルゴリズムで
を繰り返すことに統計的に等しい。
ある。
∫
b
顕著な例は積分である。
f (x)dx は
a
n
∑
f (i) · |a − b|/n に近似
4 MCMC(Markov chain Monte Carlo) 法
●
i=1
され、それは n 個の乱数を発生させて f (x) を計算し加算すること
マルコフ連鎖とは有限個の状態があって、変数が現在の状態に応じ
よっても実現される。つまり範囲と刻み幅が明確な反復計算は多数
て確率的に次の状態に遷移するネットワークモデルである。MCMC
の一様乱数を使った処理に置き換えることができる。通常の逐次処
法は、マルコフ連鎖を構成する各状態を「密度関数の各値」に対応さ
理と乱数を使った方法の違いは収束方法である。逐次処理は処理が
せ、密度関数に従ったサンプリングを行おうとするものである。必然
終わるまで本質的に値は分からない。その代わり処理が終われば厳
的にサンプリング値同士に相関がうまれるが、十分間をとれば独立と
密な結果を得られる。一方で乱数を使った処理は、処理の回数に応じ
見なせるという仮定の下で実行される。マルコフ過程によって状態
て徐々に正確な値に近づくため、最終的な値の予測値を処理の途中で
が収束する場合、それは一意であり、かつ開始位置によらないという
得られる。その代わり処理を無限回行うまで(それは不可能である)
性質がある(一意性初期値非依存性、あるいはエルゴード性)。本稿
厳密な結果は得られない。
ではこの点について証明はしない。現実の MCMC 法は「マルコフ
連鎖を使う」という発想の他に「提案分布を使う」という発想が必要
3 古典的サンプリング
●
である。以下ではこれらを順に概説する。
*1
円周率の数列は乱数か、などという問題にはこれが出てくるが、あくまで統計的な方法なので絶対判定はできない。
期待値計算のためだけに密度関数を変数変換してサンプリングし、逆変換で期待値を求める。
*3 重点サンプリングの改良。変数変換部分自体を学習する。
*2
1
• そもそもの発想(ナイーブな MCMC)
もする。
x を多数の微小区間 x ∼ x + δx に分割し、密度関数を分割し
• ギブスサンプリング
た長方形領域 δxf (x) を一つの状態とみなす。そしてその面
密度関数の次元が高い場合、またそれぞれの次元の密度関数
積を、その状態に移行する遷移確率であるとする。
が複雑な相関を持っている場合、次元毎に適切な提案分布を
いま、あるサンプル x0 が得られているとすると、次の状態は
決めることは、それ自体が困難になる。MCMC はせっかく
x0 が大きくなるか小さくなるかのどちらかである、とする。
高次元に使えるのに、提案分布が適切でないために使い物に
そこで、x0 の(密度関数のグラフで)右隣の関数のと左隣の
ならなくなるのは残念だ。そこで、すべての次元から一度に
関数値を計算してやり、その比に従って x0 を右か左かに移動
サンプルするのではなく、個々の次元に関してサンプリング
し、新しい x の値をサンプルにする。この方法は原理的に隣
を行い、ある次元でサンプリングを行うときは、他の次元の分
接する密度関数の値を計算するだけなので積分作業が必要な
布は直前のサンプル値で代表させてしまうということが行わ
い。つまりどんな複雑な分布でも使える。さらに、使う量は、
れる。つまり、あるステップではある 1 つの確率変数 x にの
密度関数の値の比だけなので、密度関数も規格化されている
み着目し、他の確率変数 (y, z, ...) は、直前に得られたサンプ
必要がない。これはかなり大きな利点である*4 。マルコフ連
ル値 (yn , zn , ...) の定数と見て xn+1 をサンプリングする。次
鎖を使う方法は、高次元の分布であっても、さほど計算量を
のステップでは今度は xn+1 , zn , ... を定数として yn+1 をサ
爆発させずに計算できるという利点もある*5 。
ンプリングし、さらにその次は、xn+1 , yn+1 , ... を定数として
• メトロポリス (MT) 法
zn+1 をサンプリングする。こうして一巡すればまた xn+2 の
ところがこのナイーブな発想では系列相関が強すぎる上に、
サンプリングに戻る。これがギブスサンプリングである。特
一つの致命的な問題が発生する。確率分布が複数の区間に分
に条件付き確率が書き下せる場合にサンプルを得る場合に使
断されている場合、初期状態が属する区間以外には絶対に遷
われる。
• メトロポリス・ヘイスティングス (M-H) 法
移できなくなる、という問題だ。そこで、初期状態からある
程度遠くへ飛び跳ねることで、区間の壁を乗り越える必要が
メトロポリス法を非対称分布に拡張したものである。まず
出てくる。
は初期サンプル値 x0 の次のサンプル候補 x を、提案分布
そのためにはどうするか。ある程度遠くへ飛び跳ねることも
q(x; x0 ) に従って生成する。ここで目標分布 f (x) に対して、
確率分布に従って行う。この際の確率分布は「対称」であるこ
a1 =
とが必要である*6 。でないと、飛び跳ね方がグラフの右に寄っ
たり左に寄ったりして正しい確率分布を再現できない。この
a2 =
「飛び跳ねる」ための分布を「提案分布(jumping distribu-
tion)」という。正規分布や一様分布は対称なので提案分布と
f (x)
f (x0 )
q(x0 ; x) *7
q(x; x0 )
という 2 つの値を計算し、その積 a = a1 a2 を計算する。新
してよく使われる。要するに、何か現在の値を中心にして対
しいサンプル x1 は次の条件で選択される。
称な分布に従って乱数を振り、その値を新しい候補としてナ
▷ a ≥ 1 ならば x1 = x
イーブなマルコフ連鎖法を使うのだ。提案分布によって飛び
▷ a < 1 なら、a の確率で x1 = x、1 − a の確率で x1 = x0
跳ねて、元の値と飛び跳ねた先の値の比にしたがって、遷移す
M-H 法は提案分布と密度関数の形が似ている場合に、うまく
るかどうかを決める方法はメトロポリス法と呼ばれ MCMC
動作することが知られているが、M-H 法を使う場合、そもそ
の中でも最も基本的な実装である。提案分布によってどの程
も密度関数の値は未知であることが多い。
度の距離を飛び跳ねたらいいかという自由度が発生するが、
• その他の MCMC
一般に飛び跳ねる距離が大きくなれば棄却率も高まり、小さ
マルチカノニカル法、交換法(MCMCMC、温度並列アニー
くなればサンプル間の相関が強くなる。そこで出てきた乱数
リング法)などがある。割愛。
列の自己相関をはかり、棄却率との兼ね合いで、飛び跳ねる
量をアドホックに設定したり、n 個飛ばしでサンプルを集め
たりもする。
5 プログラミング
●
MCMC のサンプリングは、十分にサンプルの量が多ければ
多くの資料は R を使うことを推奨している。R はフリーでありマル
もとの密度関数に従ったサンプリングができるが、量が少な
チプラットフォームであり推薦できる逸品であるが、困ったことに他
いと初期値の影響を受ける。そこで通常は、burn-in といっ
のプログラムとの結合がしにくい。例えば R の出力には余計な情報
て、はじめの数千、数万サンプルは捨てられるのが常である。
が付いてきて、これを黙らせるのは大変である。また、スクリプトに
burn-in のあいだに、提案分布の「飛び跳ねる量」を決めたり
「#!/usr/bin/R」のようなヘッダを付けてシェルから実行すること
もできない。R の自動実行は「R CMD BATCH command.r」というよ
*4
*5
*6
*7
確率密度関数の正規化係数を計算するのは、つまり密度関数を全区間で積分することになるので非常に難しい。マルコフ連鎖を使う方法は、これを回避で
きるので、有用である。
高次元になるほどに棄却率が指数関数的に増大することを「次元の呪い」という。多くの棄却サンプリング法は次元の呪いの影響を受ける。MCMC 法で
は一般に指数関数的な爆発は起こらないため、階層ベイズモデルや高次元な統計モデルからのサンプルを生成する方法としてよく使われる。
正確には「詳細釣合条件」と呼ばれる条件に定式化される。割愛。
これは 2 つの提案分布 (x0 から x へとその逆方向) の比率であり、提案分布が対称なら a2 = 1 である。
2
うな書式になり、少し使いにくい。さらに R の関数群は他の言語か
結果は以下のように、元の密度関数が規格化されていなくても、
ら直接呼べない。
密 度 関 数 に 比 例 し た サ ン プ リ ン グ が で き て い る 。点 線 は 関 数
| exp(−x2 ) sin 2x cos 3x| で、実線が得られたサンプルのヒストグ
…といういくつかの事情から、ここでは C++のやりかたを書いて
おく。非常に単純だし、実際に自分が使っているのがこの方法だから
ラムである。
である。R の資料は既にネットにたくさんあるので調べるのは容易
0.7
である。
0.6
/* MCMC の実験:メトロポリス法 */
// 標準偏差 s の正規分布を発生させる randnormal(s) 関数を仮定
0.5
#include <iostream>
f(x)
/* 密度関数:規格化されていない点に注意 */
double f(double x){
return fabs(exp(-x*x)*sin(2*x)*cos(3*x));
0.4
0.3
}
0.2
/* main */
int main(){
0.1
unsigned int iterate=1000000;
/* 初期値 */
0.0
-3
double x=randuniform(1.)-0.5, xnew;
-2
-1
0
1
2
x
for(unsigned int i=0;i<iterate;i++){
/* 提案:かなりアドホック */
xnew=s.randnormal(2.)+x;
/* 判定 */
サンプリング法のノート
if(f(xnew)/(f(xnew)+f(x))>randuniform(1.)){
2014 年 9 月 28 日 初版(Web 公開版)発行
x=xnew;
著 者 シ(し)
発行者 星野 香奈 (ほしの かな)
発行所 同人集合 暗黒通信団 (http://www.mikaka.org/~kana/)
〒277-8691 千葉県柏局私書箱 54 号 D 係
頒 価 0 円 / ISBN978-4-87310-Free C0041
}
if(i>1000){/* 最初の 1000 個を捨てる */
∑
∞
·`·
std::cout<<x<<std::endl;
}
読む人いるのかなぁ
c
⃝Copyright
2014 暗黒通信団
}
}
3
Printed in Japan
3