第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の直感的な説明




図:MCMCでサンプリングされる点の軌跡イメージ
        (2次元正規分布)       13
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]

        Code:メトロポリス法実装例 in python
                                                      14
MCMCで正規分布の生成
• 平均・標準偏差がそれぞれ ( ,  ) : 
となる正規分布 N x |   を生成
(次元は2次元に設定)
• 平均(3,3),標準偏差2行2列の単位
  行列として設定
• メトロポリス法を10,000回試行
                          15
MCMCで正規分布の生成




 図:2次元正規分布 by MCMC
                     16
MCMCで正規分布の生成




図:2次元正規分布の周辺分布(青)by MCMC
     と、その確率密度(赤線)
                           17
実際のコード(一部)
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)


  Code:シミュレーションコード一部抜粋 in python
                                                                    18
MCMCで正規分布生成
• 結果(概要)
  –X方向:平均:3.05,標準偏差:1.03
  –Y方向:平均:3.00,標準偏差:1.03
• うまくいっているように思える
• これはいい方法ダゾ!!!

                       19
混合正規分布
• 正規分布の重ね合わせで表現され
  る分布            N
• 密度関数: px       wi N x |  i 
                i 1
• パラメータ
  N : 正規分布の混合数
 wi : 混合ウェイト([0,1])
                                   20
混合正規分布の例(1次元)




      図:1次元混合正規分布の例
(平均±3,ウェイト3:7,標準偏差1(共通),混合数2)
                            21
MCMCで混合正規分布生成
• 2次元の混合正規分布を生成
  –混合数:2
  –パラメータ
                             1 0     
  1 ,  1 , w1    2,2, 
                                 ,0.3 
                              0 1     
                                     
                                1 0     
  2 ,  2 , w2     2,2, 
                                    ,0.7 
                                 0 1     
                                        
• メトロポリス法を10,000回試行
                                               22
MCMCで混合正規分布生成




 図:2次元混合正規分布 by MCMC
                       23
MCMCで混合正規分布生成
• 2次元の混合正規分布を生成
  –混合数:2
  –パラメータ
                             1 0     
  1 ,  1 , w1    3,3, 
                                 ,0.3 
                              0 1     
                                     
                                1 0     
  2 ,  2 , w2     3,3, 
                                    ,0.7 
                                 0 1     
                                        
• メトロポリス法を10,000回試行
                                               24
MCMCで混合正規分布生成




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




 図:2次元混合正規分布 by MCMC
                       26
うまくいかない理由
• 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
   3,3                    メトロポリス法
                                  でイケる
                  2,2

                                 1,1

メトロポリス法
 でイケない
 図:平均ベクトルのみが異なる3つのレプリカ系 31
1:異なるパラメーター系のMCMC
   3,3                    独立に
                              MCMCを実行
                  2,2

  レプリカ①                          1,1


                  レプリカ②
                                 レプリカ③ 32
2:位置の交換
        2つのレプリカを選択




レプリカ①     レプリカ②
                  33
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)

      Code:REMC実装例(一部抜粋) in python                                35
REMCで混合正規分布生成
      3,3




  図:2次元混合正規分布 by REMC
                        36
REMC vs MCMC
   3,3       3,3




        図:REMC vc MCMC
REMCの場合、確率が非常に小さくなる領域を乗
   り越えて移動できている様子がわかる
                       37
うまくいったね!



           38
5. まとめ

         39
まとめ
• 汎用的な乱数生成法としてMCMCを紹
  介
• MCMCではうまくいかないようなケース
  に対してREMCを適用
• 結果、REMCだと比較的うまくいくようだ
• 分布依存部分をもっとうまく切り分けた
  い。。。
                     40
Source code is available here…


github.com/teramonagi/Pyremc



                             41

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