レプリカ交換モンテカルロ法で乱数の生成

41
レプリカ交換モンテカルロ法 で乱数の生成 5Tokyo. ciPy @teramonagi

Upload: tera-monagi

Post on 15-Jan-2015

3.671 views

Category:

Technology


1 download

DESCRIPTION

第五回Tokyo.Scipyでのトーク資料です。

TRANSCRIPT

Page 1: レプリカ交換モンテカルロ法で乱数の生成

レプリカ交換モンテカルロ法で乱数の生成

第5回Tokyo. ciPy

@teramonagi

Page 2: レプリカ交換モンテカルロ法で乱数の生成

目次

1. 自己紹介

2. モチベーション

3. マルコフ連鎖モンテカルロ法

4. レプリカ交換モンテカルロ法

5. まとめ

2

Page 3: レプリカ交換モンテカルロ法で乱数の生成

1. 自己紹介

3

Page 4: レプリカ交換モンテカルロ法で乱数の生成

• @teramonagi

• Numpy/Scipy歴:2年程度

• Tokyo. でお世話になっております

•仕事:半導体→金融

•言語:C++/R/python/VBA/F#

•興味:数理/Simulation/データ分析

自己紹介

4

Page 5: レプリカ交換モンテカルロ法で乱数の生成

2. モチベーション

5

Page 6: レプリカ交換モンテカルロ法で乱数の生成

(主に私の)モチベーション

•乱数をよく生成するので、統一的な共通の枠組で楽に乱数生成したい

–「○○分布の時はA法、××分布の時はB法を使う」は面倒

•出来れば確率密度関数を指定するだけでOKな仕組みが欲しい

6

Page 7: レプリカ交換モンテカルロ法で乱数の生成

そんな貴方の我儘を 適える素敵な魔法

7

Page 8: レプリカ交換モンテカルロ法で乱数の生成

3. マルコフ連鎖モンテカルロ法

8

Page 9: レプリカ交換モンテカルロ法で乱数の生成

マルコフ連鎖モンテカルロ法

•略して

–MCMC(Markov Chain MonteCarlo)

•指定した確率(密度)関数に従う乱数をマルコフ連鎖を活用することで生成するモンテカルロ法のこと

•かなり汎用的な枠組み

9

Page 10: レプリカ交換モンテカルロ法で乱数の生成

MCMCの詳しい話は…

• 【パターン認識と機械学習 下】の

11章、サンプリング法を参照

10

Page 11: レプリカ交換モンテカルロ法で乱数の生成

細かい突っ込んだ話は…

• 【計算統計 2 マ

ルコフ連鎖モンテカルロ法とその周辺】を参照

11

Page 12: レプリカ交換モンテカルロ法で乱数の生成

MCMCの直感的な説明 •標本空間上の点を逐次的に移動

•今いる所の近所に移動、確率密度の高い付近でちょっと長居、そしてまたウロウロする手法

12

確率 密度

標本空間上の点

Page 13: レプリカ交換モンテカルロ法で乱数の生成

MCMCの直感的な説明

13

図:MCMCでサンプリングされる点の軌跡イメージ (2次元正規分布)

Page 14: レプリカ交換モンテカルロ法で乱数の生成

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

Page 15: レプリカ交換モンテカルロ法で乱数の生成

MCMCで正規分布の生成

•平均・標準偏差がそれぞれ

となる正規分布 を生成

(次元は2次元に設定)

•平均(3,3),標準偏差2行2列の単位行列として設定

• メトロポリス法を10,000回試行

|xN

:),(

15

Page 16: レプリカ交換モンテカルロ法で乱数の生成

MCMCで正規分布の生成

16 図:2次元正規分布 by MCMC

Page 17: レプリカ交換モンテカルロ法で乱数の生成

MCMCで正規分布の生成

17

図:2次元正規分布の周辺分布(青)by MCMC と、その確率密度(赤線)

Page 18: レプリカ交換モンテカルロ法で乱数の生成

実際のコード(一部) 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

Page 19: レプリカ交換モンテカルロ法で乱数の生成

MCMCで正規分布生成

19

•結果(概要)

–X方向:平均:3.05,標準偏差:1.03

–Y方向:平均:3.00,標準偏差:1.03

• うまくいっているように思える

• これはいい方法ダゾ!!!

Page 20: レプリカ交換モンテカルロ法で乱数の生成

混合正規分布

•正規分布の重ね合わせで表現される分布

•密度関数:

•パラメータ

正規分布の混合数

混合ウェイト([0,1])

N

i

ii xNwxp1

|

:

:

iw

N

20

Page 21: レプリカ交換モンテカルロ法で乱数の生成

混合正規分布の例(1次元)

図:1次元混合正規分布の例 (平均±3,ウェイト3:7,標準偏差1(共通),混合数2) 21

Page 22: レプリカ交換モンテカルロ法で乱数の生成

MCMCで混合正規分布生成

• 2次元の混合正規分布を生成 –混合数:2 –パラメータ

• メトロポリス法を10,000回試行

7.0,10

01,2,2,,

3.0,10

01,2,2,,

222

111

w

w

22

Page 23: レプリカ交換モンテカルロ法で乱数の生成

MCMCで混合正規分布生成

23 図:2次元混合正規分布 by MCMC

Page 24: レプリカ交換モンテカルロ法で乱数の生成

7.0,10

01,3,3,,

3.0,10

01,3,3,,

222

111

w

w

MCMCで混合正規分布生成

• 2次元の混合正規分布を生成 –混合数:2 –パラメータ

• メトロポリス法を10,000回試行 24

Page 25: レプリカ交換モンテカルロ法で乱数の生成

MCMCで混合正規分布生成

25 図:2次元混合正規分布 by MCMC

Page 26: レプリカ交換モンテカルロ法で乱数の生成

MCMCで混合正規分布生成

26 図:2次元混合正規分布 by MCMC

Page 27: レプリカ交換モンテカルロ法で乱数の生成

うまくいかない理由

• MCMC(メトロポリス法)は確率が高い

場所の側もまた高い確率を持つだろうという思想が根底にある。

• MCMC(メトロポリス法)≒局所的な探索。

確率が連続でほぼに0なるような深い谷を越えることは難しい

• どうにかうまくやれる方法はないか?

27

Page 28: レプリカ交換モンテカルロ法で乱数の生成

4. レプリカ交換モンテカルロ法

28

Page 29: レプリカ交換モンテカルロ法で乱数の生成

レプリカ交換モンテカルロ法

• 異なるパラメータを持つ確率分布(レプリカ)を考えてそれらを交換するモンテカルロ法

–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

Page 30: レプリカ交換モンテカルロ法で乱数の生成

REMCのアルゴリズム

1. 異なるパラメーターを持つ系を同時・並列にMCMC

2. 各MCMC間の位置をメトロポリス法等で入れ替える

3. 1と2を繰り返す

30

※今扱っている問題だと、パラメータは平均ベクトルに該当

Page 31: レプリカ交換モンテカルロ法で乱数の生成

1:異なるパラメーター系のMCMC

31

3,3

2,2

1,1

メトロポリス法 でイケない

メトロポリス法 でイケる

図:平均ベクトルのみが異なる3つのレプリカ系

Page 32: レプリカ交換モンテカルロ法で乱数の生成

1:異なるパラメーター系のMCMC

32

3,3

2,2

1,1

独立に MCMCを実行

レプリカ①

レプリカ②

レプリカ③

Page 33: レプリカ交換モンテカルロ法で乱数の生成

2:位置の交換

33 レプリカ① レプリカ②

2つのレプリカを選択

Page 34: レプリカ交換モンテカルロ法で乱数の生成

2:位置の交換

34 レプリカ① レプリカ②

位置を交換!

Page 35: レプリカ交換モンテカルロ法で乱数の生成

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

Page 36: レプリカ交換モンテカルロ法で乱数の生成

REMCで混合正規分布生成

36 図:2次元混合正規分布 by REMC

3,3

Page 37: レプリカ交換モンテカルロ法で乱数の生成

REMC vs MCMC

37

図:REMC vc MCMC REMCの場合、確率が非常に小さくなる領域を乗

り越えて移動できている様子がわかる

3,3 3,3

Page 38: レプリカ交換モンテカルロ法で乱数の生成

38

うまくいったね!

Page 39: レプリカ交換モンテカルロ法で乱数の生成

5. まとめ

39

Page 40: レプリカ交換モンテカルロ法で乱数の生成

まとめ

• 汎用的な乱数生成法としてMCMCを紹介

• MCMCではうまくいかないようなケースに対してREMCを適用

• 結果、REMCだと比較的うまくいくようだ

• 分布依存部分をもっとうまく切り分けたい。。。

40

Page 41: レプリカ交換モンテカルロ法で乱数の生成

github.com/teramonagi/Pyremc

41

Source code is available here…