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)
見にくいかもしれませんが、グラフ中の小さな赤い点が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をすんなり理解できるみたいですが、物理分かってない私みたいな人間には目が回りそうです。日々精進