hamiltonian monte carloによるベイズ推定ソフトウェアstanの紹介

33
Hamiltonian Monte Carloによる ベイズ推定ソフトウェアStan紹介 森林総合研究所 森林植生研究領域 伊東宏樹 2014-07-28 4領域セミナー

Upload: hiroki-ito

Post on 23-Aug-2014

714 views

Category:

Science


2 download

DESCRIPTION

Hamiltonian Monte Carloによるベイズ推定ソフトウェアStanの紹介

TRANSCRIPT

Page 1: Hamiltonian Monte Carloによるベイズ推定ソフトウェアStanの紹介

Hamiltonian Monte Carloによるベイズ推定ソフトウェアStanの

紹介

森林総合研究所 森林植生研究領域 伊東宏樹

2014-07-28 4領域セミナー

Page 2: Hamiltonian Monte Carloによるベイズ推定ソフトウェアStanの紹介

本日の話題

• Hamiltonian Monte Carlo (HMC)!

• Stan

Page 3: Hamiltonian Monte Carloによるベイズ推定ソフトウェアStanの紹介

Hamiltonian Monte Carlo• 通常のMCMC (Markov chain Monte Carlo)との違い

• 「運動量」パラメーターをつかって、推定値を更新する。

• Hybrid Monte Carloともよばれる。

• MCMC + deterministic simulation method!

• 収束がはやくなる。

Page 4: Hamiltonian Monte Carloによるベイズ推定ソフトウェアStanの紹介

通常のMCMC(Metropolis-Hastingsアルゴリズム)

事後確率

推定値0

ランダムウォーク(+採択/不採択)

Page 5: Hamiltonian Monte Carloによるベイズ推定ソフトウェアStanの紹介

HMC事後確率

推定値0

上り勾配では速く

下り勾配では遅く「運動量」をもって

動く(+採択/不採択)

Page 6: Hamiltonian Monte Carloによるベイズ推定ソフトウェアStanの紹介

http://mc-stan.org/

Page 7: Hamiltonian Monte Carloによるベイズ推定ソフトウェアStanの紹介

Stan

Sampling through adaptive neighborhoods (Gelman et al. 2013)

Page 8: Hamiltonian Monte Carloによるベイズ推定ソフトウェアStanの紹介

Stanisław Ulam (1909–1984)http://en.wikipedia.org/wiki/Stanislaw_Ulam#mediaviewer/File:STAN_ULAM_HOLDING_THE_FERMIAC.jpg

Page 9: Hamiltonian Monte Carloによるベイズ推定ソフトウェアStanの紹介

Stan開発履歴2012年8月  1.0リリース2012年12月 1.1リリース2013年3月 1.2リリース2013年10月 2.0リリース2013年12月 2.1リリース2014年2月 2.2リリース2014年6月 2.3リリース2014年7月 2.4リリース

Page 10: Hamiltonian Monte Carloによるベイズ推定ソフトウェアStanの紹介

Stan 3種の実装• RStan!

• Rから!

• PyStan!• Pythonから!

• CmdStan!• シェルコマンドラインから

Page 11: Hamiltonian Monte Carloによるベイズ推定ソフトウェアStanの紹介

Stanの特長

• Hamiltonian Monte Carlo, No-U-Turn Samplerによる事後分布サンプリング

• モデルコードをC++に変換し、さらにネイティブバイナリにコンパイルして実行

Page 12: Hamiltonian Monte Carloによるベイズ推定ソフトウェアStanの紹介

BUGSとの違い• データ・パラメーターは型を指定して宣言

• 分布の名前などが違う

• 命令文は書かれた順に実行される

• 離散値パラメーターの推定は(いまのところ)できない(HMCの制約)

Page 13: Hamiltonian Monte Carloによるベイズ推定ソフトウェアStanの紹介

変数型整数 int

実数 real

ベクトル vector

行ベクトル row_vector

行列 matrix などなど

Page 14: Hamiltonian Monte Carloによるベイズ推定ソフトウェアStanの紹介

久保緑本*10章10.3節のモデルで比較BUGS model!{! for (i in 1:N) {! Y[i] ~ dbin(q[i], 8)! logit(q[i]) <- beta + r[i]! }! beta ~ dnorm(0, 1.0E-4)! for (i in 1:N) {! r[i] ~ dnorm(0, tau)! }! tau <- 1 / (s * s)! s ~ dunif(0, 1.0E+4)!}!!http://hosho.ees.hokudai.ac.jp/~kubo/stat/iwanamibook/fig/hbm/model.bug.txt

Stan data {! int<lower=0> N;! int<lower=0> Y[N];!}!parameters {! real beta;! real r[N];! real<lower=0> s;!}!transformed parameters {! real q[N];!! for (i in 1:N) {! q[i] <- inv_logit(beta + r[i]);! }!}!model {! for (i in 1:N) {! Y[i] ~ binomial(8, q[i]);! }! beta ~ normal(0, 1.0e+2);! r ~ normal(0, s);! s ~ uniform(0, 1.0e+4);!}

*久保拓弥(2012) データ解析のための統計モデリング入門, 岩波書店

Page 15: Hamiltonian Monte Carloによるベイズ推定ソフトウェアStanの紹介

分布名の違いの例BUGS Stan

正規分布 dnorm( normal(μ, σ)

二項分布 dbin(p, N) binomial(N, p)

ポアソン分布 dpois(λ) poisson(λ)

一様分布 dunif(α, β) uniform(α, β)

Page 16: Hamiltonian Monte Carloによるベイズ推定ソフトウェアStanの紹介

実行例> library(rstan)! 要求されたパッケージ Rcpp をロード中です ! 要求されたパッケージ inline をロード中です !! 次のパッケージを付け加えます: ‘inline’ !! 以下のオブジェクトはマスクされています (from ‘package:Rcpp’) : !! registerPlugin !!rstan (Version 2.2.0, packaged: 2014-02-14 04:29:17 UTC, GitRev: 52d7b230aaa0)!> !> # read data!> d <- read.csv(url("http://hosho.ees.hokudai.ac.jp/~kubo/stat/iwanamibook/fig/hbm/data7a.csv"))!> !

久保緑本10章10.3節のモデルを例に

Page 17: Hamiltonian Monte Carloによるベイズ推定ソフトウェアStanの紹介

> model <- '!+ data {!+ int<lower=0> N; // sample size!+ int<lower=0> Y[N]; // response variable!+ }!+ parameters {!+ real beta;!+ real r[N];!+ real<lower=0> s;!+ }!+ transformed parameters {!+ real q[N];!+ !+ for (i in 1:N) {!+ q[i] <- inv_logit(beta + r[i]); // 生存確率!+ }!+ }!+ model {!+ for (i in 1:N) {!+ Y[i] ~ binomial(8, q[i]); // 二項分布!+ }!+ beta ~ normal(0, 1.0e+2); // 無情報事前分布!+ r ~ normal(0, s); // 階層事前分布!+ s ~ uniform(0, 1.0e+4); // 無情報事前分布!+ }'!>

Page 18: Hamiltonian Monte Carloによるベイズ推定ソフトウェアStanの紹介

> data <- list(N = nrow(d), Y = d$y)!> !> fit <- stan(model_code = model, data = data, pars = c("beta", "s"),!+ warmup = 100, iter = 10100, thin = 10, chains = 3)!!TRANSLATING MODEL 'model' FROM Stan CODE TO C++ CODE NOW.!COMPILING THE C++ CODE FOR MODEL 'model' NOW.!SAMPLING FOR MODEL 'model' NOW (CHAIN 1).!Iteration: 10100 / 10100 [100%] (Sampling)!Elapsed Time: 0.222008 seconds (Warm-up)! 18.2454 seconds (Sampling)! 18.4674 seconds (Total)!![…]!!SAMPLING FOR MODEL 'model' NOW (CHAIN 3).!Iteration: 10100 / 10100 [100%] (Sampling)!Elapsed Time: 0.249295 seconds (Warm-up)! 18.7859 seconds (Sampling)! 19.0352 seconds (Total)

Page 19: Hamiltonian Monte Carloによるベイズ推定ソフトウェアStanの紹介

結果> print(fit, digits = 2)!Inference for Stan model: model.!3 chains, each with iter=10100; warmup=100; thin=10; !post-warmup draws per chain=1000, total post-warmup draws=3000.!! mean se_mean sd 2.5% 25% 50% 75% 97.5% n_eff Rhat!beta 0.04 0.01 0.33 -0.60 -0.18 0.04 0.27 0.69 3000 1!s 3.04 0.01 0.37 2.41 2.78 3.02 3.27 3.80 2807 1!lp__ -443.66 0.18 9.50 -463.66 -449.84 -443.33 -437.14 -425.83 2805 1!!Samples were drawn using NUTS(diag_e) at Tue Jun 17 15:45:43 2014.!For each parameter, n_eff is a crude measure of effective sample size,!and Rhat is the potential scale reduction factor on split chains (at !convergence, Rhat=1).

Page 20: Hamiltonian Monte Carloによるベイズ推定ソフトウェアStanの紹介

> traceplot(fit)

Page 21: Hamiltonian Monte Carloによるベイズ推定ソフトウェアStanの紹介

OpenBUGSとの速度比較• 久保緑本10章10.3節のモデル

• chain: 3

• iteration: 10000

• burn-in (warmup): 100

• thin: 10

• Mac Pro (2.8 GHz Quad-Core Intel Xeon)

• OS X 10.9.3

• OpenBUGS 3.2.2

• RStan/CmdStan 2.2.0

Page 22: Hamiltonian Monte Carloによるベイズ推定ソフトウェアStanの紹介

OpenBUGSとの速度比較OpenBUGS

RStan

CmdStan (並列実行)

0 75 150 225 300

compilerun

実行時間(秒)

*OpenBUGSの実行時間にはWineのオーバーヘッド含む。 ただし、Linux上でLinux版OpenBUGSとStanとを比較してもほぼ同様の結果。

Page 23: Hamiltonian Monte Carloによるベイズ推定ソフトウェアStanの紹介

実行例(2)

Zero-Inflated Negative Binomial Model

Page 24: Hamiltonian Monte Carloによるベイズ推定ソフトウェアStanの紹介

0 1 2 3 4 5 6 7 8 9 11 13 15 17

y

count

0

10

20

30

40 0が多いデータ

Page 25: Hamiltonian Monte Carloによるベイズ推定ソフトウェアStanの紹介

モデルθ: 存在確率 α, β: 負の二項分布のパラメーター

p(y|� ,�,� ) =

�(1��)+� �NegBin(0|�,� ) (y = 0)

� �NegBin(y|� ,� ) (y > 0)

Page 26: Hamiltonian Monte Carloによるベイズ推定ソフトウェアStanの紹介

data {! int<lower=1> N;! int<lower=0> y[N];!}!parameters {! real<lower=0, upper=1> theta;! real<lower=0> alpha;! real<lower=0> beta;!}!model {! // priors! theta ~ uniform(0, 1);! alpha ~ uniform(0, 100);! beta ~ uniform(0, 100);! for (i in 1:N) {! if (y[i] == 0) {! increment_log_prob(log((1 - theta)! + theta * (beta / (beta + 1))^alpha));! } else {! increment_log_prob(bernoulli_log(1, theta)! + neg_binomial_log(y[i], alpha, beta));! }! }!}!generated quantities {! real mu;! mu <- alpha / beta;!}

Page 27: Hamiltonian Monte Carloによるベイズ推定ソフトウェアStanの紹介

increment_log_prob()

• increment_log_prob(x)は、対数事後確率にxを加算する

• 既存の分布では尤度を記述できないときなど

Page 28: Hamiltonian Monte Carloによるベイズ推定ソフトウェアStanの紹介

Rコード

library(rstan)!model <- stan_model("zinb.stan")!fit <- sampling(model, data = list(N = n, y = y),! chains = 4,! iter = 2000, warmup = 1000, thin = 1)

コンパイルとサンプリングを別に実行することもできる。

Page 29: Hamiltonian Monte Carloによるベイズ推定ソフトウェアStanの紹介

結果> print(fit, digits = 2)!Inference for Stan model: zinb.!4 chains, each with iter=2000; warmup=1000; thin=1; !post-warmup draws per chain=1000, total post-warmup draws=4000.!! mean se_mean sd 2.5% 25% 50% 75% 97.5% n_eff Rhat!theta 0.68 0.00 0.09 0.53 0.62 0.67 0.73 0.88 601 1.00!alpha 1.24 0.02 0.50 0.49 0.87 1.16 1.53 2.39 581 1.00!beta 0.27 0.00 0.10 0.13 0.20 0.26 0.33 0.48 639 1.00!mu 4.53 0.02 0.73 3.09 4.05 4.52 4.99 6.00 1797 1.00!lp__ -218.77 0.05 1.34 -222.19 -219.37 -218.42 -217.79 -217.26 693 1.01!!Samples were drawn using NUTS(diag_e) at Sun Jul 13 10:54:12 2014.!For each parameter, n_eff is a crude measure of effective sample size,!and Rhat is the potential scale reduction factor on split chains (at !convergence, Rhat=1).

Page 30: Hamiltonian Monte Carloによるベイズ推定ソフトウェアStanの紹介
Page 31: Hamiltonian Monte Carloによるベイズ推定ソフトウェアStanの紹介

まとめ• Stanのよいところ

• (一般に)実行速度が速い。

• (原理的に)通常のMCMCより収束がよい。

• Stanのよくないところ

• 離散値パラメーターの推定ができない。

• 参考文献などまだ少ない。

Page 32: Hamiltonian Monte Carloによるベイズ推定ソフトウェアStanの紹介

参考文献

• Gelman A. et al. (2013) Bayesian Data Analysis (3rd ed.) Chapman & Hall/CRC!

• Stan Development Team (2014) Stan Modeling Language User’s Guide and Reference Manual version 2.3 http://mc-stan.org/manual.html

Page 33: Hamiltonian Monte Carloによるベイズ推定ソフトウェアStanの紹介

ネット上の解説• Teito Nakagawa: Stanチュートリアル

• http://www.slideshare.net/teitonakagawa/stantutorialj!

• Takashi J. Ozaki: MCMCの計算にStanを使ってみた(超基礎・導入編) • http://tjo.hatenablog.com/entry/2013/11/06/201735!

• berobero11: Stanのマニュアルの8章~12章の私的メモ • http://heartruptcy.blog.fc2.com/blog-entry-88.html