Path: blob/master/site/ja/probability/examples/Bayesian_Gaussian_Mixture_Model.ipynb
25118 views
Copyright 2018 The TensorFlow Probability Authors.
Licensed under the Apache License, Version 2.0 (the "License");
ベイジアンガウス混合モデルとハミルトニアン MCMC
この Colab では、TensorFlow Prabability のプリミティブのみを使用してベイジアンガウス混合モデル(BGMM)の事後確率からサンプルを取得する方法を説明します。
モデル
次元 ごとの 混合コンポーネントでは、次のベイジアンガウス混合モデルを使用して iid サンプルをモデリングします。
scale
引数にはすべて、cholesky
セマンティクスがあります。これは TF Distributions の方法であるため、それを使用します(計算上のメリットにより、一部にこの方法が使用されています)。
ここでも目標は、事後確率からサンプルを生成することです。
が存在しないところに注目してください。関心があるのは、 でスケーリングしない確率変数のみです。(幸いにも、 の除外を処理する TF 分布があります。)
It is not possible to directly sample from this distribution owing to a computationally intractable normalization term.
正規化が困難な分布からサンプリングするには、メトロポリスヘイスティングスアルゴリズムを使用することができます。
TensorFlow Probability では、メトロポリスヘイスティングス法に基づくいくつかの手法を含む多数の MCMC オプションが用意されています。このノートブックでは、ハミルトニアンモンテカルロ法(tfp.mcmc.HamiltonianMonteCarlo
)を使用します。HMC は急速に収束することが可能で、(座標的であるのに対し)同時に状態空間をサンプリングし、TF の美徳の 1 つである自動微分を利用するため、ほとんどにおいて適切なオプションです。それを踏まえると、BGMM 事後確率からのサンプリングは実際、ギブスサンプリングなどの他のアプローチよりも優れている場合があります。
実際にモデルを構築する前に、新しいタイプの分布を定義する必要があります。上記のモデルの仕様から、逆共分散行列、つまり「精度行列」(https://en.wikipedia.org/wiki/Precision_(statistics)))を使って MVN をパラメータ化することは明らかです。これを TF で行うには、Bijector
を使用する必要があります。この Bijector
は前方変換を使用します。
Y = tf.linalg.triangular_solve((tf.linalg.matrix_transpose(chol_precision_tril), X, adjoint=True) + loc
.
また、log_prob
計算は、次のように単に逆になります。
X = tf.linalg.matmul(chol_precision_tril, X - loc, adjoint_a=True)
.
HMC に必要なのは log_prob
だけであるため、つまり、tf.linalg.triangular_solve
を絶対に呼び出さないようにします(tfd.MultivariateNormalTriL
の場合と同じように)。tf.linalg.matmul
はキャッシュロイヤリティに優れていることから、通常は高速で行われるため、これは有利です。
tfd.Independent
分布はある分布の独立したドローを統計的に独立した座標を使った多変量分布に変換します。log_prob
の計算の観点では、この「メタ分布」はイベント次元の単純な和として表されます。
また、スケール行列の adjoint
(「転置」)を取っていることにも注目してください。これは、精度が共分散である場合、すなわち であり、 である場合に where となるためです。
この分布にはそれとなくコツがいるため、思った通りに MVNCholPrecisionTriL
が動作することをさっと検証しましょう。
サンプルの平均と共分散が真の平均と共分散に近いため、分布は適切に実装されているようです。次に、MVNCholPrecisionTriL
tfp.distributions.JointDistributionNamed
を使用して、BGMM モデルを指定します。観測モデルでは、tfd.MixtureSameFamily
を使用して、自動的に ドローを統合します。
「トレーニング」データを生成する
このデモでは、いくつかのランダムデータをサンプリングします。
HMC を使用したベイジアン推論
TFD を使用してモデルを指定し、観測データを取得したので、HMC を実行するために必要な材料がすべて揃いました。
これを行うには、サンプリングしないものを「突き止める」ために部分適用を使用します。この場合は、observations
のみを突き止める必要があります。(ハイパーパラメータは joint_log_prob
関数シグネチャの一部ではなく、前の分布にすでにベイクされています。)
制約のない表現
ハミルトニアンモンテカルロ法(HMC)では、ターゲットの対数確率関数がその引数に関して微分可能である必要があります。さらに、HMC は、状態空間が制約されていない場合に、はるかに高い有効性を見せることがあります。
つまり、BGMM 事後確率からサンプリングする場合には、大きく 2 つの問題を対処する必要があるということになります。
は離散確率ベクトルを表すため、 と である必要があります。
は可逆共分散行列を表すため、、すなわち正定値である必要があります。
この要件を解決するには、次のことを行う必要があります。
制約された変数を制約のない空間に変換する
制約のない空間で MCMC を実行する
制約のない変数を制約された空間に変換する
MVNCholPrecisionTriL
と同様に、確率変数を制約のない空間に変換するには、Bijector
を使用します。
ここで、チェーンを実行し、事後の平均を出力します。
結論
この単純な Colab では、TensorFlow Probability のプリミティブを使用して階層的ベイジアン混合モデルを構築する方法を説明しました。