レプリカ交換モンテカルロ法で乱数の生成
DESCRIPTION
第五回Tokyo.Scipyでのトーク資料です。TRANSCRIPT
レプリカ交換モンテカルロ法で乱数の生成
第5回Tokyo. ciPy
@teramonagi
目次
1. 自己紹介
2. モチベーション
3. マルコフ連鎖モンテカルロ法
4. レプリカ交換モンテカルロ法
5. まとめ
2
1. 自己紹介
3
• @teramonagi
• Numpy/Scipy歴:2年程度
• Tokyo. でお世話になっております
•仕事:半導体→金融
•言語:C++/R/python/VBA/F#
•興味:数理/Simulation/データ分析
自己紹介
4
2. モチベーション
5
(主に私の)モチベーション
•乱数をよく生成するので、統一的な共通の枠組で楽に乱数生成したい
–「○○分布の時はA法、××分布の時はB法を使う」は面倒
•出来れば確率密度関数を指定するだけでOKな仕組みが欲しい
6
そんな貴方の我儘を 適える素敵な魔法
7
3. マルコフ連鎖モンテカルロ法
8
マルコフ連鎖モンテカルロ法
•略して
–MCMC(Markov Chain MonteCarlo)
•指定した確率(密度)関数に従う乱数をマルコフ連鎖を活用することで生成するモンテカルロ法のこと
•かなり汎用的な枠組み
9
MCMCの詳しい話は…
• 【パターン認識と機械学習 下】の
11章、サンプリング法を参照
10
細かい突っ込んだ話は…
• 【計算統計 2 マ
ルコフ連鎖モンテカルロ法とその周辺】を参照
11
MCMCの直感的な説明 •標本空間上の点を逐次的に移動
•今いる所の近所に移動、確率密度の高い付近でちょっと長居、そしてまたウロウロする手法
12
確率 密度
大
小
標本空間上の点
MCMCの直感的な説明
13
図:MCMCでサンプリングされる点の軌跡イメージ (2次元正規分布)
MCMC(メトロポリス法) 1. #適当なサイズだけ回す
2. SIZE = 10000
3. #初期状態を生成
4. x = [initial()] * SIZE
5. for i in range(1,SIZE):
6. #①:現在の状態から次の状態(候補)を選定
7. x_proposed = propose_next(x[i])
8. #②:確率密度の比を計算,target=密度関数
9. ratio = target(x_proposed) / target(x[i])
10. #③:一様乱数と比較し、遷移 or 元の状態のままを決定
11. if(np.random.uniform(size=1) < ratio):
12. x[i] = x_proposed
13. else:
14. x[i] = x[i-1]
14 Code:メトロポリス法実装例 in python
MCMCで正規分布の生成
•平均・標準偏差がそれぞれ
となる正規分布 を生成
(次元は2次元に設定)
•平均(3,3),標準偏差2行2列の単位行列として設定
• メトロポリス法を10,000回試行
|xN
:),(
15
MCMCで正規分布の生成
16 図:2次元正規分布 by MCMC
MCMCで正規分布の生成
17
図:2次元正規分布の周辺分布(青)by MCMC と、その確率密度(赤線)
実際のコード(一部) 1. #正規分布の平均値
2. MU = 3.0
3. #シミュレーション・サイズ
4. SIZE_SIMULATION = 10000
5. X0 = np.array([0,0])
6. #次候補の選定関数
7. propose_next = lambda x:x+0.5*np.random.normal(size=len(x))
8. #target関数&MCMCオブジェクト生成
9. target = generate_target(MU)
10. mcmc = pyremc.MCMC(X0, target, propose_next, 10)
11. #MCMC実行
12. x = X0
13. for i in range(SIZE_SIMULATION):
14. x = np.vstack((x, mcmc.next()))
15. plot_result(x, MU)
18 Code:シミュレーションコード一部抜粋 in python
MCMCで正規分布生成
19
•結果(概要)
–X方向:平均:3.05,標準偏差:1.03
–Y方向:平均:3.00,標準偏差:1.03
• うまくいっているように思える
• これはいい方法ダゾ!!!
混合正規分布
•正規分布の重ね合わせで表現される分布
•密度関数:
•パラメータ
正規分布の混合数
混合ウェイト([0,1])
N
i
ii xNwxp1
|
:
:
iw
N
20
混合正規分布の例(1次元)
図:1次元混合正規分布の例 (平均±3,ウェイト3:7,標準偏差1(共通),混合数2) 21
MCMCで混合正規分布生成
• 2次元の混合正規分布を生成 –混合数:2 –パラメータ
• メトロポリス法を10,000回試行
7.0,10
01,2,2,,
3.0,10
01,2,2,,
222
111
w
w
22
MCMCで混合正規分布生成
23 図:2次元混合正規分布 by MCMC
7.0,10
01,3,3,,
3.0,10
01,3,3,,
222
111
w
w
MCMCで混合正規分布生成
• 2次元の混合正規分布を生成 –混合数:2 –パラメータ
• メトロポリス法を10,000回試行 24
MCMCで混合正規分布生成
25 図:2次元混合正規分布 by MCMC
MCMCで混合正規分布生成
26 図:2次元混合正規分布 by MCMC
うまくいかない理由
• MCMC(メトロポリス法)は確率が高い
場所の側もまた高い確率を持つだろうという思想が根底にある。
• MCMC(メトロポリス法)≒局所的な探索。
確率が連続でほぼに0なるような深い谷を越えることは難しい
• どうにかうまくやれる方法はないか?
27
4. レプリカ交換モンテカルロ法
28
レプリカ交換モンテカルロ法
• 異なるパラメータを持つ確率分布(レプリカ)を考えてそれらを交換するモンテカルロ法
–Replica Exchange MonteCarlo(REMC)
• 別名:パラレル・テンパリング法
• 元々はスピングラスのシミュレーション手法 – Hukushima-Nemoto, (1996), Multiple coupled Markov
chain MC , Parallel tempering
– Swendsen RH and Wang JS (1986) Replica Monte Carlo simulation of spin glasses Physical Review Letters 57
29
REMCのアルゴリズム
1. 異なるパラメーターを持つ系を同時・並列にMCMC
2. 各MCMC間の位置をメトロポリス法等で入れ替える
3. 1と2を繰り返す
30
※今扱っている問題だと、パラメータは平均ベクトルに該当
1:異なるパラメーター系のMCMC
31
3,3
2,2
1,1
メトロポリス法 でイケない
メトロポリス法 でイケる
図:平均ベクトルのみが異なる3つのレプリカ系
1:異なるパラメーター系のMCMC
32
3,3
2,2
1,1
独立に MCMCを実行
レプリカ①
レプリカ②
レプリカ③
2:位置の交換
33 レプリカ① レプリカ②
2つのレプリカを選択
2:位置の交換
34 レプリカ① レプリカ②
位置を交換!
REMCのコード 1. self._counter+=1
2. #①:全てのレプリカをMCMCで回す
3. for index_replica in range(self._replica_size):
4. self._mcmcs[index_replica].next()
5. #②:適当な交換頻度で位置の交換
6. if(self._counter % self._exchange_frequency == 0):
7. index_exchange = int(np.random.uniform(0,
self._replica_size-1))
8. x1 = self._mcmcs[index_exchange ].x
9. x2 = self._mcmcs[index_exchange+1].x
10. target1 = self._mcmcs[index_exchange ]._target
11. target2 = self._mcmcs[index_exchange+1]._target
12. #③:位置の交換はメトロポリス法に従う形で実行
13. if(np.random.uniform(size=1) <
(target1(x2)*target2(x1))/(target1(x1)*target2(x2))):
14. self._mcmcs[index_exchange].x,
self._mcmcs[index_exchange+1].x = np.copy(x2),np.copy(x1)
35 Code:REMC実装例(一部抜粋) in python
REMCで混合正規分布生成
36 図:2次元混合正規分布 by REMC
3,3
REMC vs MCMC
37
図:REMC vc MCMC REMCの場合、確率が非常に小さくなる領域を乗
り越えて移動できている様子がわかる
3,3 3,3
38
うまくいったね!
5. まとめ
39
まとめ
• 汎用的な乱数生成法としてMCMCを紹介
• MCMCではうまくいかないようなケースに対してREMCを適用
• 結果、REMCだと比較的うまくいくようだ
• 分布依存部分をもっとうまく切り分けたい。。。
40
github.com/teramonagi/Pyremc
41
Source code is available here…