多変量正規分布の落とし穴を回避!PyTorch Probability Distributionsのarg_constraints属性で安全な確率モデリング


arg_constraints 属性

arg_constraints 属性は、dict オブジェクトであり、各キーは分布のパラメータ名に対応し、各値はパラメータの制約を表す constraints.Constraint オブジェクトです。

  • scale_tril パラメータ

    • キー: 'scale_tril'
    • 値: constraints.LowerTriangular()
    • 制約: scale_tril パラメータは下三角行列である必要があります。
    • キー: 'loc'
    • 値: constraints.Real()
    • 制約: loc パラメータは実数値である必要があります。

import torch
from torch.distributions import constraints
from torch.distributions import MultivariateNormal

# パラメータを定義
loc = torch.zeros(2)
scale_tril = torch.eye(2)

# 多変量正規分布を作成
mvnormal = MultivariateNormal(loc, scale_tril)

# パラメータの制約を確認
arg_constraints = mvnormal.arg_constraints
print(arg_constraints['loc'])  # constraints.Real()
print(arg_constraints['scale_tril'])  # constraints.LowerTriangular()

arg_constraints 属性の重要性

  • 分布のパラメータを更新する際に、制約を考慮した更新を行うことができます。
  • 分布の確率密度関数やサンプリング操作の正確性を保証します。
  • パラメータの値が制約を満たしていることを保証します。


import torch
from torch.distributions import constraints
from torch.distributions import MultivariateNormal

# パラメータを定義
loc = torch.zeros(2)
scale_tril = torch.eye(2)

# 多変量正規分布を作成
mvnormal = MultivariateNormal(loc, scale_tril)

# サンプルを生成
sample = mvnormal.sample()

# サンプルが分布の制約を満たしていることを確認
print(mvnormal.arg_constraints['loc'].validate(sample))  # True
print(mvnormal.arg_constraints['scale_tril'].validate(scale_tril))  # True
  1. locscale_tril パラメータを使用して、多変量正規分布 mvnormal を作成します。
  2. mvnormal.sample() を使用して、分布からサンプルを生成します。
  3. mvnormal.arg_constraints['loc'].validate(sample)mvnormal.arg_constraints['scale_tril'].validate(scale_tril) を使用して、サンプルとパラメータが分布の制約を満たしていることを確認します。

この例は、arg_constraints 属性を使用して、分布のパラメータとサンプルが制約を満たしていることを確認する方法を示しています。

  • 他の確率分布や制約を使用することもできます。詳細は、PyTorch Probability Distributions のドキュメントを参照してください。
  • このコードは、Python 3.7 と PyTorch 1.10.1 でテストされています。


パラメータの事前チェック (Manual validation)

コード中で、MultivariateNormal を生成する前に、自分でパラメータ (locscale_tril) が制約を満たしていることを確認します。

import torch
from torch.distributions import MultivariateNormal

# パラメータを定義
loc = torch.zeros(2)
scale_tril = torch.eye(2)

# パラメータの制約を確認
if not torch.all(torch.isreal(loc)):
  raise ValueError("loc must be a real tensor")

if not torch.islower(scale_tril):
  raise ValueError("scale_tril must be a lower triangular matrix")

# 多変量正規分布を作成 (制約を満たしている場合のみ)
mvnormal = MultivariateNormal(loc, scale_tril)

カスタムの分布クラスの作成 (Custom distribution)

独自の分布クラスを作成し、その中でパラメータの制約を検証するロジックを実装します。PyTorch の Distribution クラスを継承して、独自の分布を定義できます。

validate_args オプションを使用した初期化 (Initialization with validate_args)

MultivariateNormal を初期化するときに、validate_args=True オプションを渡します。既定では validate_argsTrue ですが、明示的に指定することで、無効なパラメータが渡されたときに例外が発生するようにできます。

mvnormal = MultivariateNormal(loc, scale_tril, validate_args=True)

サンプリング時の再帰チェック (Validation during sampling)

arg_constraints の代替ではないですが、サンプリング時に mvnormal.sample() の出力が分布のサポート内に収まっていることを確認することもできます。 ただし、これは arg_constraints が担っていたような、パラメータ自体の検証にはなりません。

arg_constraints 属性の代替としては、パラメータの事前チェック、カスタムな分布クラスの作成、validate_args オプションの使用などが考えられます。