NumPyro vs PyStan
Python でベイズ統計モデリングをするには幾つか選択肢があるかと思うのですが、今回は NumPyro と PyStan で比較を行ってみました。
世の中的には Stan が標準ではあるのですが、NumPyro もなかなか良い部分がありますよ…ということで、今回こうした記事を投稿しています。
今回は Eight Schools という有名な例題に関して、NumPyro と PyStan でコードを書いたものをこちらのブログにアップロードしています。
同じ例題を実装したものを比較してみることで、大雑把な違いのようなものが伝わればいいな…というのが、この記事の意図です。
実は、実行速度なども測ってみたのですが、私が Stan についてあまり詳しくないため、うまく Chain を並列実行させることができませんでした。
従いまして、速度の比較としてはあまり良い情報源にはなっていないのですが、少しでも参考になる部分がありましたら幸いです。
■ PyStan でのサンプリングの実行時間: 10秒程度
■ NumPyro でのサンプリングの実行時間: 15秒程度
■ Stan のコードのコンパイルの時間: 1分程度
今回の比較ではサンプリングの際のオプションなどもあまり細かく合わせられていないので、全然正当な比較とはいえないのですが「なんとなくこんな感じ」という雰囲気が伝わればいいな…という思いで、今回こうした結果を公開してみています。NumPyro の場合は、コンパイルの時間がないのですが、NumPyro の場合は「サンプリングの実行時間」の中にコンパイルの時間が含まれています。
NumPyro の場合は、コンパイルの待ち時間が比較的短いので、モデルの修正を頻繁に繰り返したりする場合には、NumPyro の方が若干使い易い気がしました。この辺は C/C++ みたいなコンパイル言語と Python みたいなインタープリタ言語との使い勝手の違いみたいなものが、そのまま受け継がれている印象を持っています。
ただ、PyStan の方はサンプリングの際に比較的丁寧なワーニングが出るので、この辺りの教育的配慮は Stan の方が優秀だと思います。丁寧なワーニングが出るという点では、PyMC3 も優秀なのですが、現状ではサンプリングが若干遅いので、線形回帰や GLM あたりをやるのにはあまり気にならないのですが、もっと複雑なモデルを扱う際にはやはりサンプリングが高速な NumPyro や Stan あたりが快適かもしれないです。
PyMC3 も次のバージョン4では、バックエンドが高速化される予定があるので、初めて確率プログラミングをやってみる人は、(無事に開発が進むと仮定して)あと1年か2年先くらいを見込んで、とりあえず PyMC3 で始める…というのも Python ユーザーなら、ありかもしれません。
ただ、どうせ1年先か2年先を考えるのであれば、実はアヒル本とかをじっくり真面目に勉強した方が確実…という気もします。
最終的には、どれか1個を真面目にやれば、他を勉強するときにも役に立つので、あまり変わらないという気もします。悩ましいですね…
Eight Schools の例題について
Eight Schools の例題ですが、今回こちらの例題がどういう例題なのかについては、私の方では詳しい解説はしませんでした。
基本的には「8つの学校で、ある種のコーチングの手法を試して、その効果がテストの点数にどのように現れたか」を表すデータを解析するような例題になっています。
Eight Schools に関しては、Google で検索すると日本語でもいくつか解説をされている方のブログ等も見つかるかと思いますので、ぜひそちらを参照して頂けたらと思います。