無粋な日々に

頭の中のメモ。分からないことを整理する

stan: Divergent transitions after warmupの警告が出る場合

stanでサンプリングを行っていると次のような警告がでる場合があります。

1: There were 15 divergent transitions after warmup.
2: Examine the pairs() plot to diagnose sampling problems

おっかないので、ドキュメントを読んで整理してみました。部分的にしか理解してない状態ですので、間違いがありましたら教えてもらえると嬉しいです。

なんの警告なのか

MCMCでは推定するパラメタを表す擬似粒子を考えて、事後分布が作り出す(位置エネルギー)場を粒子がどういうふうに動くか、その軌跡をシミュレートします。この軌跡がある一定の基準から遠くに大きく外れて行くことをdivergence(発散?逸脱?)と呼んでいます。divergenceが大きくなると、このシミュレーションは信頼できないため、devegent trasitionsの警告がでます。

どいういうときに発生するか

シミュレーションは、1ステップごと逐次的に探索をしながら行われるのですが、事後分布がぐにゃぐにゃにカーブしているケースでは、ステップ幅が事後分布のカーブに対して十分に小さな値でないと、分布の形状をキャプチャできず、本来たどるべき軌跡から逸脱してしまいます。一方でステップ幅が小さすぎると、探索が少しずつしか進まず非効率になったり、途中で(Uターンする前に)停止してしまう可能性があります。最急降下法と同じ感じですね。 場所によってカーブの大きさが異なるような事後分布では、ある場所では非効率な探索ステップになり、ある場所では逸脱が大きくなるようなステップになってしまいます。これが警告の主な原因とのこと。

どうすればいいか

シンプルな対処としてadapt_deltaパラメタを大きくする と書いてあります。adapt_deltaはデフォルトで0.8に設定されていますので、stan()control引数でlist(adapt_delta = 0.99)のように0.8より大きい値を指定します。この値を大きくするとステップ幅を強制的に小さくできます。

# `adapt_delta`を0.8より大きくして、ステップ幅を小さくする
fit <- stan(..., control = list(adapt_delta = 0.99))

結果的にサンプリングに時間がかかるようになる可能性がありますが、ウォームアップ後にdivergenceが発生して結果の信頼性が落ちるよりはマシだろうという考えです。

もう少し詳細な対処法

警告文に出ているようにpairs()を使って結果を図示して診断することで、もう少し詳しく診断できます。

# 結果のペアプロット
pairs(fit)

f:id:messefor:20200829231632p:plain

見にくいかもしれませんが、グラフ中の小さな赤い点がdevegent trasitionsですが、この赤い点が1. 対角の下半分(下三角)のグラフに出ているか、2.上半分(上三角)に出ているか、で性質や対処法が若干変わります。上の例では下三角にdevegent trasitionsが出ています。

1.上三角にでている場合は、単純にadapt_deltaを大きくすれば良いですが、2.下三角に出ている場合adapt_deltaを大きくするだけで改善するケースは限られています。devegent trasitionsの数が小さい場合は改善する可能性があるので、とりあえずにadapt_deltaを大きくしましょう。それでも改善しない場合は、事後分布の形がシンプルになるように、モデルの表現を変更する必要があります。 特に階層モデルを使う場合にこのケースが発生しやすいとのこと。

対処法をまとめると、

devegent trasitions(赤い点)が出る位置 対処
1.上三角部分にあるグラフに出ている adapt_delta を大きくする
2.下三角部分にあるグラフに出ている - adapt_delta を大きくする(改善するケースは限定的)
- 事後分布の形が単純になるようにモデルを変更する

事後分布の形がシンプルになるように、モデルの表現を変更する というのはかなり難しそうに思えますが、別機会に詳細をまとめてみたいと思います。


物理出身の方は、MCMCやHMCをすんなり理解できるみたいですが、物理分かってない私みたいな人間には目が回りそうです。日々精進

 参考文献