A Blog Entry on Bayesian Computation by an Applied Mathematician
$$
$$
Stan 言語
はじめに
Stan 言語は確率モデルを3つのブロックに分けて記述する.
その3つとはデータ,パラメータとモデルである.
以上の3要素により,事後分布が定まる.それぞれの要素は,対応した名前を持ったスコープ {}
内で,この順番で定義される慣習がある.
以前のスコープ内で定義された識別子は,その後のスコープでも利用可能になる.
Code
stan_code <- "
data {
int<lower=0> N; // N >= 0
array[N] int<lower=0, upper=1> y; // y[n] in {0, 1}
}
parameters {
real<lower=0, upper=1> theta; // theta in [0, 1]
}
model {
theta ~ beta(1, 1); // uniform prior
y ~ bernoulli(theta); // observation model
}
"
その後 Stan プログラムは事後分布の対数密度を表す C++ 関数にコンパイルされる.
最終的にこの対数尤度を用いて,その勾配を自動微分により計算し,Hamiltonian Monte Carlo による事後分布サンプリングを実行する.
Stan エコシステムの詳説は次節 2 に回し,ここでは Stan 言語の基本に集中する.
確率的プログラミング言語
Stan 言語のように確率モデルを記述する(より正確には事後分布の尤度を記述する高級)言語を 確率的プログラミング言語 (PPL: Probabilistic Programming Language) という.
最初期の確率的プログラミング言語の1つに WinBUGS (Lunn et al., 2000 ) の実装に代表される BUGS (Bayesian analysis Using Gibbs Sampling) がある.
BUGS では事後分布を詳細に 有向グラフィカルモデル (DAG) で記述し,Gibbs Sampling により事後分布をサンプリングするという仕組みであった.
Stan 言語はさらに柔軟に,(正規化されているとは限らない)対数尤度を記述できるようになっている.
理想的にはあらゆる確率モデルを扱いたいものであるが,現状の Stan 言語はパラメータとしては連続変数のみを持つモデルのみが定義可能である.
data
ブロック
Stan は静的な型システムを持ち,変数宣言の際には必ず型を指定する必要がある.
なお,各ブロック内において,あらゆる変数宣言は全ての非宣言的文の前に来る必要がある.
{
real variable1 = 5 ;
variable1 /= 2 ; // ここでエラー
real variable2 = exp(variable1);
}
parameters
ブロック
parameters
ブロックも同様にして変数を宣言する.
model
ブロックで使われる変数は,data
, parameters
ブロックのいずれかで宣言されている必要がある.
model
ブロック
モデルブロックでは対数密度関数の値が変数 target
として保持されており,target()
関数でアクセス可能である.
各サンプリング文は次のような明示的な文と等価になる:
beta ~ normal(0 , 1 ); // syntax sugar
target += normal_lpdf(beta | 0 , 1 ); // 実際の処理に近い
ループと制御
for (n in N1:N2) {
// Statements executed for each N1 <= n <= N2
}
if (condition) {
// Statements evaluated if condition is true
} else {
// Statements evaluated if condition is false
}
Stan エコシステム
Stan の推論エンジン
Stan の推論エンジンとして,HMC の他に2つの C++ アルゴリズムが用意されており,それぞれ BFGS 法による点推定と変分推定を実装している.
Stan 数学ライブラリ
Stan 言語により定義された確率モデル(対数密度関数)が実際に評価可能にするための C++ 関数のライブラリである.
基本的な数学的関数や統計的関数に加えて,自動微分が実装されており,対数密度関数の勾配や Hessian も計算可能である.
Stan インターフェイス
CmdStan
の仕組み
CmdStan
は makefiles の集合からなる最も軽量な,コマンドラインベースのインターフェイスである.
これを直接 R で wrap した CmdStanR
パッケージ や CmdStanPy
パッケージが存在し,同時に Julia Stan.jl
, Mathematica MathematicaStan
, Matlab MatlabStan
, Stata StataStan
からも利用可能である.
Stan の Math ライブラリ,Algorithm ライブラリなどの出力をテキストファイルで出力してやり取りする.
CmdStan
は最も軽量なインターフェイスであり,Stan
の性能を純粋に引き出す場合に使われる.
CmdStan
のインストール
CmdStan Installation によると,conda
による方法とソースからのインストールの2つの方法がある.
一方で次稿で扱う CmdStanR
を通じてインストールすることもできる:
RStan
と PyStan
R
と Python
という2大言語を Stan と直接繋げるインターフェイスを提供している.
CmdStan
のように一度テキストファイルに書き出すということがなく,メモリ上でやり取りされるが,それ故に CmdStan
よりも追加の処理が多くなりがちである.
References
Carpenter, B., Gelman, A., Hoffman, M. D., Lee, D., Goodrich, B., Betancourt, M., … Riddell, A. (2017).
Stan: A probabilistic programming language .
Journal of Statistical Software ,
76 (1), 1–32.
Gelman, A., Lee, D., and Guo, J. (2015).
Stan: A probabilistic programming language for bayesian inference and optimization .
Journal of Educational and Behavioral Statistics ,
40 (5), 530–543.
Lunn, D. J., Thomas, A., Best, N., and Spiegelhalter, D. (2000).
WinBUGS - a bayesian modelling framework: Concepts, structure, and extensibility .
Statistics and Computing ,
10 (4), 325–337.