PyTorchで多変量正規分布を操る: precision_matrixの役割と代替方法を徹底解説


torch.distributions.multivariate_normal.MultivariateNormal.precision_matrixは、PyTorchの「Probability Distributions」モジュールにおける多変量正規分布オブジェクトのプロパティの一つであり、精度行列と呼ばれる行列を返します。この行列は、多変量正規分布の分散共分散行列の逆行列を表し、分布の形状と分散の度合いを制御する重要な役割を担います。

数学的背景

多変量正規分布は、平均ベクトル μ と分散共分散行列 Σ を用いてパラメータ化されます。分散共分散行列は、各変数の分散と共分散情報を含む対称行列です。一方、精度行列は分散共分散行列の逆行列であり、Σ^{-1} と表されます。

precision_matrix プロパティの役割

precision_matrix プロパティは、MultivariateNormal オブジェクト作成時に precision_matrix 引数で指定された行列を返します。この行列が指定されない場合は、分散共分散行列 Σ の逆行列が自動的に計算されて返されます。

precision_matrix を使用する利点

  • モデルの収束を改善するのに役立つ場合があります。
  • 特定のドメイン知識に基づいて精度行列を直接定義できる場合に便利です。
  • 分散共分散行列よりも計算効率が良い場合があります。

注意点

  • 精度行列のすべての固有値が正である必要があります。
  • 精度行列は必ず対称行列である必要があります。
import torch
import torch.distributions as distributions

# 分散共分散行列を定義
covariance_matrix = torch.tensor([[1.0, 0.5], [0.5, 1.0]])

# 多変量正規分布を作成
mvnormal1 = distributions.MultivariateNormal(loc=torch.zeros(2), covariance_matrix=covariance_matrix)

# 精度行列を取得
precision_matrix1 = mvnormal1.precision_matrix

# 精度行列を直接定義
precision_matrix2 = torch.tensor([[2.0, -1.0], [-1.0, 2.0]])

# 多変量正規分布を作成
mvnormal2 = distributions.MultivariateNormal(loc=torch.zeros(2), precision_matrix=precision_matrix2)

# 精度行列を取得
precision_matrix2 = mvnormal2.precision_matrix

print(precision_matrix1)
print(precision_matrix2)
  • torch.distributions.multivariate_normal オブジェクトには、covariance_matrixscale_tril プロパティも存在します。これらのプロパティは、それぞれ分散共分散行列とスケーリング下三角行列を表します。


import torch
import torch.distributions as distributions

# サンプルデータを作成
data = torch.randn(1000, 2)

# 真の平均ベクトルと分散共分散行列を定義
true_mean = torch.zeros(2)
true_covariance_matrix = torch.tensor([[1.0, 0.5], [0.5, 1.0]])

# 最大尤度推定に基づいて多変量正規分布を推定
mvnormal = distributions.MultivariateNormal(loc=true_mean, covariance_matrix=true_covariance_matrix)
nll = mvnormal.log_prob(data)
nll = nll.mean()
nll.backward()

# 推定された平均ベクトルと分散共分散行列を取得
estimated_mean = mvnormal.loc
estimated_covariance_matrix = mvnormal.covariance_matrix

# 推定結果と真の値を比較
print("真の平均ベクトル:", true_mean)
print("推定された平均ベクトル:", estimated_mean)
print("真の分散共分散行列:")
print(true_covariance_matrix)
print("推定された分散共分散行列:")
print(estimated_covariance_matrix)
  1. 2次元ガウス分布に従うサンプルデータを作成します。
  2. 真の平均ベクトルと分散共分散行列を定義します。
  3. 最大尤度推定に基づいて、サンプルデータから多変量正規分布を推定します。
  4. 推定された平均ベクトルと分散共分散行列を取得します。
  5. 推定結果と真の値を比較します。

この例は、MultivariateNormal オブジェクトを使用して多変量正規分布を推定し、その統計量を計算する方法を示しています。

  • 多変量正規分布の推定は、様々な統計モデリングや機械学習タスクにおいて重要な役割を果たします。
  • 推定された分散共分散行列は、サンプルデータに基づいて計算されるため、真の値とは異なる場合があります。
  • このコードでは、最大尤度推定を使用して多変量正規分布を推定しています。他の推定方法も存在します。


  • scale_tril: スケーリング下三角行列
  • covariance_matrix: 分散共分散行列

covariance_matrix を使用する場合

分散共分散行列は、各変数の分散と変数間の共分散を含む対称行列です。

import torch
import torch.distributions as distributions

# 分散共分散行列を定義
covariance_matrix = torch.tensor([[1.0, 0.5], [0.5, 1.0]])

# 多変量正規分布を作成
mvnormal = distributions.MultivariateNormal(loc=torch.zeros(2), covariance_matrix=covariance_matrix)

スケーリング下三角行列は、分散共分散行列の Cholesky 分解の下三角行列です。

import torch
import torch.distributions as distributions

# スケーリング下三角行列を定義
scale_tril = torch.tensor([[1.0, 0.0], [0.5, 0.866]])  # Cholesky分解の下三角行列

# 多変量正規分布を作成
mvnormal = distributions.MultivariateNormal(loc=torch.zeros(2), scale_tril=scale_tril)

どちらを使用するか?

  • パラメータ化の好み
    問題に応じて、どちらのパラメータ化がより直感的または便利な場合があります。
  • 数値安定性
    scale_tril は数値的に安定な計算を提供する場合があります。
  • 計算効率
    scale_tril を使用すると、計算効率が向上する場合があります。特に、サンプル生成や確率密度関数の計算において。

注意

  • precision_matrix を直接使用する場合、数値的な問題が発生する可能性があります。特に、行列の条件数が悪い場合。
  • covariance_matrixscale_tril は互いに変換可能です。

ほとんどの場合、covariance_matrix または scale_tril を使用することを推奨します。これらのパラメータは、一般的により効率的で安定な計算を提供します。ただし、特定のアプリケーションや計算要件に応じて、precision_matrix を使用することも可能です。