Hamiltonian Monte Carloについて学んだ
Hamiltonian Monte Carlo(HMC)について学んだのでメモ。
前提/対象/自身の学習前の知識
- MCMCについてなんとなく知っている
- 物理に関してはよく知らない
- MCMCの主な用途はBayes
- 共役事前分布でない事前分布を使ったときもどうやって事後分布/予測分布を得るのかきちんと知っておきたい。
- 解りにくかった理由の一つに参考にするものによって記号がいろいろ違ったのがあるので、この記事では位置は全てとした。
参考文献
- ゼロからできるMCMC
Metropolis法
ある(確率密度)関数を近似するのに、の番目のサンプルの候補をある を満たす確率分布、例えばを使ってと生成し、確率で採択、不採択ならとする方法。 このマルコフ連鎖がエルゴード的(ergodicity)であれば定常分布を持ち、更に釣り合い条件が成り立てばその定常分布と近似したい分布(確率密度関数)が一致する。 このとき
- 1ステップごとの幅を広くとると採択率が低くなってしまう
- 1ステップごとの幅を狭くすると自己相関が長くなってしまう ので、ステップ幅をうまく設定する必要がある。
Metropolis-Hastings法
Metropolis-Hastings法はMetropolis法のという条件を満たさないを用いる代わりに採択率をそれに応じて調整して詳細釣り合い条件を成り立たせる方法。 これによってうまくを選べば元の位置から遠い、かつ採択率の高いをサンプルすることができる。ただし、どのようなを選べばよいかについては自明ではない。
Hamiltonian Monte-Carlo
Hamiltonian Monte-Carlo(HMC)はMetropolis-Hastings法の一種で、よいの構成法を与えてくれる。
以前HMCを理解しようとした際はこの辺りから理解が追い付かず
- なぜ運動量を導入するの?
- Hamiltonianって何?
- Leap-Frog法って何?
みたいな疑問を全て咀嚼することなく"現在のサンプルを物体の位置として、近似する目標の関数から計算される位置エネルギーを考え、それに加えて正規分布から発生させた乱数を運動量とすることでその物体の動きが決まる。それを時間を進めてある程度動かした先の位置を次のサンプル候補とすると採択率の良い、離れたサンプルが取れるらしい"という程度の理解をしていた。 とりあえずこれでそこまで遠い理解ではないものの、今回は1つ1つ確認したのでその手順を書いておく。
理解の手順
- Hamiltonianを用いて採択率を決めると詳細釣り合い条件が成り立つということをひとまず受け入れる。
- Hamiltonianとは何か導出してみる
- HMCのアルゴリズムを見てみる
- Leap-Frog法について理解する
- Hamiltonianを用いて採択率を決めると詳細釣り合い条件が成り立つということを確認する という順番で追っていった。
Hamiltonianとは何か導出してみる
後々のため、位置、速度、加速度としてそれぞれ, 運動量として, 運動エネルギーを, 位置エネルギーをとする。
Hamiltonianについて調べようとするとまず
"HamiltonianとはLagrangianをLegendre変換したものである"
といった表記が見つかる。全て知らないので一つ一つ見ていく。
Lagrangian
Lagrangian はで定義される。まずなんでこう定義されたのかについて調べる。
ニュートンの運動方程式は
と書け、また位置エネルギー から, 運動エネルギー と書ける。
これをまとめて(以後、偏微分は本来各次元ごとに、という意味でとすべきなのだろうけど省略)
ここで先ほどのようにと定義すれば、はの関数で、はの関数なので
であり、
と書き直すことができる。これは、直交座標→極座標のような座標変換に対して不変なのでうれしいらしい。(ニュートンの運動方程式は不変ではない)
Legendre変換
ある関数の全微分に対し、, とおくと、はと書けて となる。(を代入した)
この変数変換をLegendre変換と呼ぶ。
Hamiltonian
ここまで来てやっとHamiltonianが出てくる。Lagrangian の全微分は
とかけて、だから
Hamiltonian と定義してやれば(ここもは本来次元の総和()とすべき)
ここで後者は と変形した。 これはというLegendre変換と解釈できる。
これらを用いると
であって、の時間変化量が
であることが確認できる。
HMCのアルゴリズムを見てみる
HMCの大まかなアルゴリズムは
1. 初期位置θを決める 2. 決められたステップ数繰り返したら終了 3. 運動量pを標準正規分布からサンプルする 4. 現在の位置(θ, p)でのHamiltonianを計算する 5. Leap-Frog法を使って物体の移動をシミュレーションする(この間、Hamiltonianは大体保存される。時間を離散化している分完全には保存されない。) 6. シミュレーション終了位置の(θ’, p')でのHamiltonianを計算する 7. 初期位置と終了位置でのHamiltonianを使って採択するかしないかを決め、2に戻る
次に見なければいけないのはLeap-Frog法に関して。
Leap-Frog法
これ自体はそこまで難しくなく、Euler法のように次のタイムステップでの状態を計算していく方法。
ただし詳細釣り合い条件を簡単にするためにはそれぞれのステップは可逆でないといけない*1。そのため、Leap-Frog法を使う必要がある。
Leap-Frog法は2つのパラメータを交互に時間を進めていく方法で、をステップ後の状態として
HMCの詳細釣り合い条件
ここまでくればあとは詳細釣り合い条件を確認すればよい。Leap-Frog法は可逆であるのでLeap-Frogの前後をとすればこれは標準正規分布からがサンプルされる確率と等しく、これに採択率を掛ければ遷移確率が求まる。また、逆にを考えると同様に遷移確率は標準正規分布からがサンプルされる確率と採択率の積で、これがのどちらの場合も等しくなることを確認すればよい。
このあと
PyMC等に組み込まれているsamplerはNUTS(No U-Turn Sampler)というHMCのパラメータチューニング(Leap-Frogのステップ幅とステップ数)をうまくやってくれる方法で
- ステップ数を決めずにシミュレーションをする、U-turnを始めたらストップ
- シミュレーションしたステップから適当に選んで次の位置とする、このとき、詳細釣り合い条件を壊さないようにする
- ステップ幅もうまく決めてくれるらしい
とよく解っていないので次に見るとしたらここかな。
*1:遷移を変数変換と見た時のJacobianが1というのも見るが、同値なのかどうかは解らない