概率分布 - torch.distributions¶
The distributions
包含可参数化的概率分布和采样函数。这允许构建随机计算图和用于优化的随机梯度估计器。此包通常遵循 TensorFlow Distributions 包的设计。
无法直接通过随机样本进行反向传播。但是,有两种主要方法可以创建可以反向传播的代理函数。它们是得分函数估计器/似然比估计器/REINFORCE 和路径导数估计器。REINFORCE 通常被视为强化学习中策略梯度方法的基础,而路径导数估计器通常被视为变分自动编码器中的重新参数化技巧。虽然得分函数只需要样本的值 ,但路径导数需要导数 . 以下部分将讨论强化学习示例中的这两种方法。有关更多详细信息,请参阅 Gradient Estimation Using Stochastic Computation Graphs 。
得分函数¶
当概率密度函数对其参数可微时,我们只需要使用 sample()
和 log_prob()
来实现 REINFORCE
where are the parameters, is the learning rate, is the reward and is the probability of taking action in state given policy .
在实践中,我们会从网络的输出中采样一个动作,在环境中应用这个动作,然后使用 log_prob
来构建一个等效的损失函数。请注意,我们使用负号是因为优化器使用梯度下降,而上面的规则假设梯度上升。对于分类策略,实现 REINFORCE 的代码如下
probs = policy_network(state)
# Note that this is equivalent to what used to be called multinomial
m = Categorical(probs)
action = m.sample()
next_state, reward = env.step(action)
loss = -m.log_prob(action) * reward
loss.backward()
路径导数¶
实现这些随机/策略梯度的另一种方法是使用来自 rsample()
方法的重新参数化技巧,其中参数化随机变量可以通过无参数随机变量的参数化确定性函数来构建。因此,重新参数化的样本变得可微。实现路径导数的代码如下
params = policy_network(state)
m = Normal(*params)
# Any distribution with .has_rsample == True could work based on the application
action = m.rsample()
next_state, reward = env.step(action) # Assuming that reward is differentiable
loss = -reward
loss.backward()
分布¶
- class torch.distributions.distribution.Distribution(batch_shape=torch.Size([]), event_shape=torch.Size([]), validate_args=None)[source]¶
基类:
object
Distribution 是概率分布的抽象基类。
- property arg_constraints: Dict[str, Constraint]¶
返回一个字典,从参数名称到
Constraint
对象,这些对象应该由该分布的每个参数满足。 不需要张量的参数不需要出现在此字典中。
- property batch_shape: Size¶
返回参数被批处理的形状。
- enumerate_support(expand=True)[source]¶
返回包含离散分布支持的所有值的张量。结果将枚举维度 0,因此结果的形状将为 (cardinality,) + batch_shape + event_shape(其中对于单变量分布 event_shape = ())。
请注意,这会以锁步方式枚举所有批处理张量 [[0, 0], [1, 1], …]。使用 expand=False,枚举发生在 dim 0 沿,但其余批处理维度是单例维度,[[0], [1], ..。
要遍历完整的笛卡尔积,请使用 itertools.product(m.enumerate_support())。
- property event_shape: Size¶
返回单个样本的形状(不进行批处理)。
- expand(batch_shape, _instance=None)[source]¶
返回一个新的分布实例(或填充由派生类提供的现有实例),其批处理维度扩展到 batch_shape。此方法在分布的参数上调用
expand
。因此,这不会为扩展的分布实例分配新的内存。此外,当首次创建实例时,这不会在 __init__.py 中重复任何参数检查或参数广播。- 参数
batch_shape (torch.Size) – 想要的扩展大小。
_instance – 由需要覆盖 .expand 的子类提供的新的实例。
- 返回值
批处理维度扩展到 batch_size 的新的分布实例。
- rsample(sample_shape=torch.Size([]))[source]¶
如果分布参数是批处理的,则生成一个 sample_shape 形状的重新参数化样本或 sample_shape 形状的重新参数化样本批次。
- 返回类型
- sample(sample_shape=torch.Size([]))[source]¶
如果分布参数是批量的,则生成一个形状为 sample_shape 的样本或形状为 sample_shape 的样本批次。
- 返回类型
- static set_default_validate_args(value)[source]¶
设置是否启用验证。
默认行为模仿 Python 的
assert
语句:默认情况下验证处于启用状态,但如果 Python 在优化模式下运行(通过python -O
),则会禁用验证。验证可能很昂贵,因此您可能希望在模型工作后禁用它。- 参数
value (bool) – 是否启用验证。
- property support: Optional[Any]¶
返回一个
Constraint
对象,表示此分布的支持。
指数族¶
- class torch.distributions.exp_family.ExponentialFamily(batch_shape=torch.Size([]), event_shape=torch.Size([]), validate_args=None)[source]¶
基类:
Distribution
ExponentialFamily 是概率分布的抽象基类,这些分布属于指数族,其概率质量/密度函数的形式定义如下
其中 表示自然参数, 表示充分统计量, 是给定族对数归一化函数, 是载体测度。
注意
此类是 Distribution 类和属于指数族的分布之间的中介,主要用于检查 .entropy() 和解析 KL 散度方法的正确性。我们使用此类通过 AD 框架和 Bregman 散度来计算熵和 KL 散度(由 Frank Nielsen 和 Richard Nock 提供,指数族的熵和交叉熵)。
伯努利¶
- class torch.distributions.bernoulli.Bernoulli(probs=None, logits=None, validate_args=None)[source]¶
-
创建一个由
probs
或logits
参数化的伯努利分布(但不能同时使用两者)。样本是二进制的(0 或 1)。它们以概率 p 取值 1,以概率 1 - p 取值 0。
示例
>>> m = Bernoulli(torch.tensor([0.3])) >>> m.sample() # 30% chance 1; 70% chance 0 tensor([ 0.])
- arg_constraints = {'logits': Real(), 'probs': Interval(lower_bound=0.0, upper_bound=1.0)}¶
- has_enumerate_support = True¶
- property logits¶
- property mean¶
- property mode¶
- property param_shape¶
- property probs¶
- support = Boolean()¶
- property variance¶
Beta¶
- class torch.distributions.beta.Beta(concentration1, concentration0, validate_args=None)[source]¶
-
由
concentration1
和concentration0
参数化的 Beta 分布。示例
>>> m = Beta(torch.tensor([0.5]), torch.tensor([0.5])) >>> m.sample() # Beta distributed with concentration concentration1 and concentration0 tensor([ 0.1046])
- 参数
- arg_constraints = {'concentration0': GreaterThan(lower_bound=0.0), 'concentration1': GreaterThan(lower_bound=0.0)}¶
- property concentration0¶
- property concentration1¶
- has_rsample = True¶
- property mean¶
- property mode¶
- support = Interval(lower_bound=0.0, upper_bound=1.0)¶
- property variance¶
二项式¶
- class torch.distributions.binomial.Binomial(total_count=1, probs=None, logits=None, validate_args=None)[source]¶
基类:
Distribution
创建一个由
total_count
参数化的二项分布,以及probs
或logits
(但不能同时使用两者)。total_count
必须与probs
/logits
可广播。示例
>>> m = Binomial(100, torch.tensor([0 , .2, .8, 1])) >>> x = m.sample() tensor([ 0., 22., 71., 100.]) >>> m = Binomial(torch.tensor([[5.], [10.]]), torch.tensor([0.5, 0.8])) >>> x = m.sample() tensor([[ 4., 5.], [ 7., 6.]])
- arg_constraints = {'logits': Real(), 'probs': Interval(lower_bound=0.0, upper_bound=1.0), 'total_count': IntegerGreaterThan(lower_bound=0)}¶
- has_enumerate_support = True¶
- property logits¶
- property mean¶
- property mode¶
- property param_shape¶
- property probs¶
- property support¶
- property variance¶
Categorical¶
- class torch.distributions.categorical.Categorical(probs=None, logits=None, validate_args=None)[source]¶
基类:
Distribution
创建一个由
probs
或logits
参数化的类别分布(但不能同时使用两者)。注意
它等效于
torch.multinomial()
从中采样的分布。样本是来自的整数,其中K是
probs.size(-1)
。如果probs是长度为K的一维数组,则每个元素是采样该索引处类的相对概率。
如果probs是N维数组,则前N-1维被视为一批相对概率向量。
注意
probs参数必须是非负、有限且具有非零和,并且它将被归一化为沿最后一个维度求和为1。
probs
将返回此归一化值。 logits参数将被解释为未归一化的对数概率,因此可以是任何实数。它也将被归一化,以便得到的概率沿最后一个维度求和为1。logits
将返回此归一化值。另请参见:
torch.multinomial()
示例
>>> m = Categorical(torch.tensor([ 0.25, 0.25, 0.25, 0.25 ])) >>> m.sample() # equal probability of 0, 1, 2, 3 tensor(3)
- arg_constraints = {'logits': IndependentConstraint(Real(), 1), 'probs': Simplex()}¶
- has_enumerate_support = True¶
- property logits¶
- property mean¶
- property mode¶
- property param_shape¶
- property probs¶
- property support¶
- property variance¶
Cauchy¶
- class torch.distributions.cauchy.Cauchy(loc, scale, validate_args=None)[source]¶
基类:
Distribution
从柯西(洛伦兹)分布中采样。独立正态分布随机变量的比率分布,其均值为 0 遵循柯西分布。
示例
>>> m = Cauchy(torch.tensor([0.0]), torch.tensor([1.0])) >>> m.sample() # sample from a Cauchy distribution with loc=0 and scale=1 tensor([ 2.3214])
- arg_constraints = {'loc': Real(), 'scale': GreaterThan(lower_bound=0.0)}¶
- has_rsample = True¶
- property mean¶
- property mode¶
- support = Real()¶
- property variance¶
Chi2¶
- class torch.distributions.chi2.Chi2(df, validate_args=None)[source]¶
Bases:
Gamma
创建由形状参数
df
参数化的卡方分布。这与Gamma(alpha=0.5*df, beta=0.5)
完全等效示例
>>> m = Chi2(torch.tensor([1.0])) >>> m.sample() # Chi2 distributed with shape df=1 tensor([ 0.1046])
- arg_constraints = {'df': GreaterThan(lower_bound=0.0)}¶
- property df¶
ContinuousBernoulli¶
- class torch.distributions.continuous_bernoulli.ContinuousBernoulli(probs=None, logits=None, lims=(0.499, 0.501), validate_args=None)[source]¶
-
创建一个由
probs
或logits
参数化的连续伯努利分布(但不能同时使用两者)。该分布在 [0, 1] 中得到支持,并由 'probs'(在 (0,1) 中)或 'logits'(实值)参数化。请注意,与伯努利分布不同,'probs' 不对应于概率,'logits' 不对应于对数几率,但由于与伯努利分布的相似性,使用了相同的名称。有关更多详细信息,请参见 [1]。
示例
>>> m = ContinuousBernoulli(torch.tensor([0.3])) >>> m.sample() tensor([ 0.2538])
[1] 连续伯努利:修正变分自动编码器中的普遍错误,Loaiza-Ganem G 和 Cunningham JP,NeurIPS 2019。 https://arxiv.org/abs/1907.06845
- arg_constraints = {'logits': Real(), 'probs': Interval(lower_bound=0.0, upper_bound=1.0)}¶
- has_rsample = True¶
- property logits¶
- property mean¶
- property param_shape¶
- property probs¶
- property stddev¶
- support = Interval(lower_bound=0.0, upper_bound=1.0)¶
- property variance¶
Dirichlet¶
- class torch.distributions.dirichlet.Dirichlet(concentration, validate_args=None)[source]¶
-
创建一个由浓度参数化的狄利克雷分布
concentration
。示例
>>> m = Dirichlet(torch.tensor([0.5, 0.5])) >>> m.sample() # Dirichlet distributed with concentration [0.5, 0.5] tensor([ 0.1046, 0.8954])
- 参数
浓度 (张量) – 分布的浓度参数(通常称为 alpha)
- arg_constraints = {'concentration': IndependentConstraint(GreaterThan(lower_bound=0.0), 1)}¶
- has_rsample = True¶
- property mean¶
- property mode¶
- support = Simplex()¶
- property variance¶
指数¶
- class torch.distributions.exponential.Exponential(rate, validate_args=None)[source]¶
-
创建一个由
rate
参数化的指数分布。示例
>>> m = Exponential(torch.tensor([1.0])) >>> m.sample() # Exponential distributed with rate=1 tensor([ 0.1046])
- arg_constraints = {'rate': GreaterThan(lower_bound=0.0)}¶
- has_rsample = True¶
- property mean¶
- property mode¶
- property stddev¶
- support = GreaterThanEq(lower_bound=0.0)¶
- property variance¶
FisherSnedecor¶
- class torch.distributions.fishersnedecor.FisherSnedecor(df1, df2, validate_args=None)[source]¶
基类:
Distribution
创建由
df1
和df2
参数化的 Fisher-Snedecor 分布。示例
>>> m = FisherSnedecor(torch.tensor([1.0]), torch.tensor([2.0])) >>> m.sample() # Fisher-Snedecor-distributed with df1=1 and df2=2 tensor([ 0.2453])
- arg_constraints = {'df1': GreaterThan(lower_bound=0.0), 'df2': GreaterThan(lower_bound=0.0)}¶
- has_rsample = True¶
- property mean¶
- property mode¶
- support = GreaterThan(lower_bound=0.0)¶
- property variance¶
Gamma¶
- class torch.distributions.gamma.Gamma(concentration, rate, validate_args=None)[source]¶
-
创建一个由形状
concentration
和rate
参数化的 Gamma 分布。示例
>>> m = Gamma(torch.tensor([1.0]), torch.tensor([1.0])) >>> m.sample() # Gamma distributed with concentration=1 and rate=1 tensor([ 0.1046])
- 参数
- arg_constraints = {'concentration': GreaterThan(lower_bound=0.0), 'rate': GreaterThan(lower_bound=0.0)}¶
- has_rsample = True¶
- property mean¶
- property mode¶
- support = GreaterThanEq(lower_bound=0.0)¶
- property variance¶
Geometric¶
- class torch.distributions.geometric.Geometric(probs=None, logits=None, validate_args=None)[source]¶
基类:
Distribution
创建一个由
probs
参数化的几何分布,其中probs
是伯努利试验成功的概率。注意
torch.distributions.geometric.Geometric()
-th 次试验是第一次成功,因此在 中抽取样本,而torch.Tensor.geometric_()
k-th 次试验是第一次成功,因此在 中抽取样本。示例
>>> m = Geometric(torch.tensor([0.3])) >>> m.sample() # underlying Bernoulli has 30% chance 1; 70% chance 0 tensor([ 2.])
- arg_constraints = {'logits': Real(), 'probs': Interval(lower_bound=0.0, upper_bound=1.0)}¶
- property logits¶
- property mean¶
- property mode¶
- property probs¶
- support = IntegerGreaterThan(lower_bound=0)¶
- property variance¶
Gumbel¶
- class torch.distributions.gumbel.Gumbel(loc, scale, validate_args=None)[source]¶
Bases:
TransformedDistribution
从 Gumbel 分布中采样。
示例
>>> m = Gumbel(torch.tensor([1.0]), torch.tensor([2.0])) >>> m.sample() # sample from Gumbel distribution with loc=1, scale=2 tensor([ 1.0124])
- arg_constraints: Dict[str, Constraint] = {'loc': Real(), 'scale': GreaterThan(lower_bound=0.0)}¶
- property mean¶
- property mode¶
- property stddev¶
- support = Real()¶
- property variance¶
HalfCauchy¶
- class torch.distributions.half_cauchy.HalfCauchy(scale, validate_args=None)[source]¶
Bases:
TransformedDistribution
创建一个由 scale 参数化的半柯西分布,其中
X ~ Cauchy(0, scale) Y = |X| ~ HalfCauchy(scale)
示例
>>> m = HalfCauchy(torch.tensor([1.0])) >>> m.sample() # half-cauchy distributed with scale=1 tensor([ 2.3214])
- arg_constraints: Dict[str, Constraint] = {'scale': GreaterThan(lower_bound=0.0)}¶
- has_rsample = True¶
- property mean¶
- property mode¶
- property scale¶
- support = GreaterThanEq(lower_bound=0.0)¶
- property variance¶
HalfNormal¶
- class torch.distributions.half_normal.HalfNormal(scale, validate_args=None)[source]¶
Bases:
TransformedDistribution
创建由 scale 参数化的半正态分布,其中
X ~ Normal(0, scale) Y = |X| ~ HalfNormal(scale)
示例
>>> m = HalfNormal(torch.tensor([1.0])) >>> m.sample() # half-normal distributed with scale=1 tensor([ 0.1046])
- arg_constraints: Dict[str, Constraint] = {'scale': GreaterThan(lower_bound=0.0)}¶
- has_rsample = True¶
- property mean¶
- property mode¶
- property scale¶
- support = GreaterThanEq(lower_bound=0.0)¶
- property variance¶
Independent¶
- class torch.distributions.independent.Independent(base_distribution, reinterpreted_batch_ndims, validate_args=None)[source]¶
基类:
Distribution
将分布的一些批次维度重新解释为事件维度。
这主要用于更改
log_prob()
结果的形状。例如,要创建一个与多元正态分布具有相同形状的对角正态分布(因此它们可以互换),您可以>>> from torch.distributions.multivariate_normal import MultivariateNormal >>> from torch.distributions.normal import Normal >>> loc = torch.zeros(3) >>> scale = torch.ones(3) >>> mvn = MultivariateNormal(loc, scale_tril=torch.diag(scale)) >>> [mvn.batch_shape, mvn.event_shape] [torch.Size([]), torch.Size([3])] >>> normal = Normal(loc, scale) >>> [normal.batch_shape, normal.event_shape] [torch.Size([3]), torch.Size([])] >>> diagn = Independent(normal, 1) >>> [diagn.batch_shape, diagn.event_shape] [torch.Size([]), torch.Size([3])]
- 参数
base_distribution (torch.distributions.distribution.Distribution) – 基础分布
reinterpreted_batch_ndims (int) – 要重新解释为事件维度的批次维度数量
- arg_constraints: Dict[str, Constraint] = {}¶
- property has_enumerate_support¶
- property has_rsample¶
- property mean¶
- property mode¶
- property support¶
- property variance¶
InverseGamma¶
- class torch.distributions.inverse_gamma.InverseGamma(concentration, rate, validate_args=None)[source]¶
Bases:
TransformedDistribution
创建一个由
concentration
和rate
参数化的逆伽马分布,其中X ~ Gamma(concentration, rate) Y = 1 / X ~ InverseGamma(concentration, rate)
示例
>>> m = InverseGamma(torch.tensor([2.0]), torch.tensor([3.0])) >>> m.sample() tensor([ 1.2953])
- 参数
- arg_constraints: Dict[str, Constraint] = {'concentration': GreaterThan(lower_bound=0.0), 'rate': GreaterThan(lower_bound=0.0)}¶
- property concentration¶
- has_rsample = True¶
- property mean¶
- property mode¶
- property rate¶
- support = GreaterThan(lower_bound=0.0)¶
- property variance¶
Kumaraswamy¶
- class torch.distributions.kumaraswamy.Kumaraswamy(concentration1, concentration0, validate_args=None)[source]¶
Bases:
TransformedDistribution
从 Kumaraswamy 分布中采样。
示例
>>> m = Kumaraswamy(torch.tensor([1.0]), torch.tensor([1.0])) >>> m.sample() # sample from a Kumaraswamy distribution with concentration alpha=1 and beta=1 tensor([ 0.1729])
- 参数
- arg_constraints: Dict[str, Constraint] = {'concentration0': GreaterThan(lower_bound=0.0), 'concentration1': GreaterThan(lower_bound=0.0)}¶
- has_rsample = True¶
- property mean¶
- property mode¶
- support = Interval(lower_bound=0.0, upper_bound=1.0)¶
- property variance¶
LKJCholesky¶
- class torch.distributions.lkj_cholesky.LKJCholesky(dim, concentration=1.0, validate_args=None)[source]¶
基类:
Distribution
LKJ 分布用于相关矩阵的下三角 Cholesky 因子。该分布由
concentration
参数 控制,以使从 Cholesky 因子生成的相关矩阵 的概率与 成正比。因此,当concentration == 1
时,我们在相关矩阵的 Cholesky 因子上具有均匀分布。L ~ LKJCholesky(dim, concentration) X = L @ L' ~ LKJCorr(dim, concentration)
请注意,此分布对相关矩阵的 Cholesky 因子进行采样,而不是对相关矩阵本身进行采样,因此与 [1] 中针对 LKJCorr 分布的推导略有不同。对于采样,这使用 [1] 第 3 节中的洋葱方法。
示例
>>> l = LKJCholesky(3, 0.5) >>> l.sample() # l @ l.T is a sample of a correlation 3x3 matrix tensor([[ 1.0000, 0.0000, 0.0000], [ 0.3516, 0.9361, 0.0000], [-0.1899, 0.4748, 0.8593]])
参考文献
[1] 基于藤和扩展洋葱方法生成随机相关矩阵 (2009),Daniel Lewandowski、Dorota Kurowicka、Harry Joe。多元分析杂志。100. 10.1016/j.jmva.2009.04.008
- arg_constraints = {'concentration': GreaterThan(lower_bound=0.0)}¶
- support = CorrCholesky()¶
Laplace¶
- class torch.distributions.laplace.Laplace(loc, scale, validate_args=None)[source]¶
基类:
Distribution
创建由
loc
和scale
参数化的拉普拉斯分布。示例
>>> m = Laplace(torch.tensor([0.0]), torch.tensor([1.0])) >>> m.sample() # Laplace distributed with loc=0, scale=1 tensor([ 0.1046])
- arg_constraints = {'loc': Real(), 'scale': GreaterThan(lower_bound=0.0)}¶
- has_rsample = True¶
- property mean¶
- property mode¶
- property stddev¶
- support = Real()¶
- property variance¶
LogNormal¶
- class torch.distributions.log_normal.LogNormal(loc, scale, validate_args=None)[source]¶
Bases:
TransformedDistribution
创建一个对数正态分布,由
loc
和scale
参数化,其中X ~ Normal(loc, scale) Y = exp(X) ~ LogNormal(loc, scale)
示例
>>> m = LogNormal(torch.tensor([0.0]), torch.tensor([1.0])) >>> m.sample() # log-normal distributed with mean=0 and stddev=1 tensor([ 0.1046])
- arg_constraints: Dict[str, Constraint] = {'loc': Real(), 'scale': GreaterThan(lower_bound=0.0)}¶
- has_rsample = True¶
- property loc¶
- property mean¶
- property mode¶
- property scale¶
- support = GreaterThan(lower_bound=0.0)¶
- property variance¶
低秩多元正态分布¶
- class torch.distributions.lowrank_multivariate_normal.LowRankMultivariateNormal(loc, cov_factor, cov_diag, validate_args=None)[source]¶
基类:
Distribution
创建一个多元正态分布,其协方差矩阵具有由
cov_factor
和cov_diag
参数化的低秩形式。covariance_matrix = cov_factor @ cov_factor.T + cov_diag
示例
>>> m = LowRankMultivariateNormal(torch.zeros(2), torch.tensor([[1.], [0.]]), torch.ones(2)) >>> m.sample() # normally distributed with mean=`[0,0]`, cov_factor=`[[1],[0]]`, cov_diag=`[1,1]` tensor([-0.2102, -0.5429])
- 参数
注意
当 cov_factor.shape[1] << cov_factor.shape[0] 时,协方差矩阵的行列式和逆矩阵的计算将被避免,这得益于 Woodbury 矩阵恒等式 和 矩阵行列式引理。由于这些公式,我们只需要计算小尺寸“电容”矩阵的行列式和逆矩阵。
capacitance = I + cov_factor.T @ inv(cov_diag) @ cov_factor
- arg_constraints = {'cov_diag': IndependentConstraint(GreaterThan(lower_bound=0.0), 1), 'cov_factor': IndependentConstraint(Real(), 2), 'loc': IndependentConstraint(Real(), 1)}¶
- property covariance_matrix¶
- has_rsample = True¶
- property mean¶
- property mode¶
- property precision_matrix¶
- property scale_tril¶
- support = IndependentConstraint(Real(), 1)¶
- property variance¶
MixtureSameFamily¶
- class torch.distributions.mixture_same_family.MixtureSameFamily(mixture_distribution, component_distribution, validate_args=None)[source]¶
基类:
Distribution
MixtureSameFamily 分布实现了一个(批次)混合分布,其中所有组件都来自同一分布类型的不同参数化。它由一个 Categorical “选择分布”(在 k 个组件上)和一个组件分布参数化,即一个 Distribution,其最右边的批次形状(等于 [k])索引每个(批次)组件。
示例
>>> # Construct Gaussian Mixture Model in 1D consisting of 5 equally >>> # weighted normal distributions >>> mix = D.Categorical(torch.ones(5,)) >>> comp = D.Normal(torch.randn(5,), torch.rand(5,)) >>> gmm = MixtureSameFamily(mix, comp) >>> # Construct Gaussian Mixture Model in 2D consisting of 5 equally >>> # weighted bivariate normal distributions >>> mix = D.Categorical(torch.ones(5,)) >>> comp = D.Independent(D.Normal( ... torch.randn(5,2), torch.rand(5,2)), 1) >>> gmm = MixtureSameFamily(mix, comp) >>> # Construct a batch of 3 Gaussian Mixture Models in 2D each >>> # consisting of 5 random weighted bivariate normal distributions >>> mix = D.Categorical(torch.rand(3,5)) >>> comp = D.Independent(D.Normal( ... torch.randn(3,5,2), torch.rand(3,5,2)), 1) >>> gmm = MixtureSameFamily(mix, comp)
- 参数
mixture_distribution – torch.distributions.Categorical 类实例。管理选择组件的概率。类别数必须与 component_distribution 的最右边的批次维度匹配。必须具有标量 batch_shape 或与 component_distribution.batch_shape[:-1] 匹配的 batch_shape
component_distribution – torch.distributions.Distribution 类实例。最右边的批次维度索引组件。
- arg_constraints: Dict[str, Constraint] = {}¶
- property component_distribution¶
- has_rsample = False¶
- property mean¶
- property mixture_distribution¶
- property support¶
- property variance¶
Multinomial¶
- class torch.distributions.multinomial.Multinomial(total_count=1, probs=None, logits=None, validate_args=None)[source]¶
基类:
Distribution
创建由
total_count
参数化的多项式分布,以及probs
或logits
(但不能同时使用)。probs
的最内层维度索引类别。所有其他维度索引批次。请注意,如果只调用
log_prob()
,则不需要指定total_count
(参见下面的示例)。注意
probs 参数必须是非负的、有限的,并且具有非零的总和,它将在最后一个维度上被归一化为总和为 1。
probs
将返回此归一化值。 logits 参数将被解释为未归一化的对数概率,因此可以是任何实数。它也将被归一化,以便得到的概率在最后一个维度上总和为 1。logits
将返回此归一化值。sample()
需要所有参数和样本共享一个 total_count。log_prob()
允许每个参数和样本具有不同的 total_count。
示例
>>> m = Multinomial(100, torch.tensor([ 1., 1., 1., 1.])) >>> x = m.sample() # equal probability of 0, 1, 2, 3 tensor([ 21., 24., 30., 25.]) >>> Multinomial(probs=torch.tensor([1., 1., 1., 1.])).log_prob(x) tensor([-4.1338])
- arg_constraints = {'logits': IndependentConstraint(Real(), 1), 'probs': Simplex()}¶
- property logits¶
- property mean¶
- property param_shape¶
- property probs¶
- property support¶
- property variance¶
多元正态分布¶
- class torch.distributions.multivariate_normal.MultivariateNormal(loc, covariance_matrix=None, precision_matrix=None, scale_tril=None, validate_args=None)[source]¶
基类:
Distribution
创建一个由均值向量和协方差矩阵参数化的多元正态(也称为高斯)分布。
The multivariate normal distribution can be parameterized either in terms of a positive definite covariance matrix or a positive definite precision matrix or a lower-triangular matrix with positive-valued diagonal entries, such that . This triangular matrix can be obtained via e.g. Cholesky decomposition of the covariance.
示例
>>> m = MultivariateNormal(torch.zeros(2), torch.eye(2)) >>> m.sample() # normally distributed with mean=`[0,0]` and covariance_matrix=`I` tensor([-0.2102, -0.5429])
- 参数
注意
只能指定
covariance_matrix
或precision_matrix
或scale_tril
之一。使用
scale_tril
将更有效率:内部所有计算都基于scale_tril
。如果传递了covariance_matrix
或precision_matrix
,它仅用于使用 Cholesky 分解计算相应的下三角矩阵。- arg_constraints = {'covariance_matrix': PositiveDefinite(), 'loc': IndependentConstraint(Real(), 1), 'precision_matrix': PositiveDefinite(), 'scale_tril': LowerCholesky()}¶
- property covariance_matrix¶
- has_rsample = True¶
- property mean¶
- property mode¶
- property precision_matrix¶
- property scale_tril¶
- support = IndependentConstraint(Real(), 1)¶
- property variance¶
负二项分布¶
- class torch.distributions.negative_binomial.NegativeBinomial(total_count, probs=None, logits=None, validate_args=None)[source]¶
基类:
Distribution
创建一个负二项分布,即在获得
total_count
次失败之前,成功独立且相同的伯努利试验次数的分布。每次伯努利试验成功的概率为probs
。- 参数
- arg_constraints = {'logits': Real(), 'probs': HalfOpenInterval(lower_bound=0.0, upper_bound=1.0), 'total_count': GreaterThanEq(lower_bound=0)}¶
- property logits¶
- property mean¶
- property mode¶
- property param_shape¶
- property probs¶
- support = IntegerGreaterThan(lower_bound=0)¶
- property variance¶
Normal¶
- class torch.distributions.normal.Normal(loc, scale, validate_args=None)[source]¶
-
创建正态分布(也称为高斯分布),由
loc
和scale
参数化。示例
>>> m = Normal(torch.tensor([0.0]), torch.tensor([1.0])) >>> m.sample() # normally distributed with loc=0 and scale=1 tensor([ 0.1046])
- arg_constraints = {'loc': Real(), 'scale': GreaterThan(lower_bound=0.0)}¶
- has_rsample = True¶
- property mean¶
- property mode¶
- property stddev¶
- support = Real()¶
- property variance¶
OneHotCategorical¶
- class torch.distributions.one_hot_categorical.OneHotCategorical(probs=None, logits=None, validate_args=None)[source]¶
基类:
Distribution
创建一个由
probs
或logits
参数化的独热编码分类分布。样本是大小为
probs.size(-1)
的独热编码向量。注意
参数 probs 必须是非负、有限且和不为零的,并且它将被归一化为在最后一个维度上求和为 1。
probs
将返回此归一化值。参数 logits 将被解释为未归一化的对数概率,因此可以是任何实数。它也将被归一化,以便得到的概率在最后一个维度上求和为 1。logits
将返回此归一化值。另请参阅:
torch.distributions.Categorical()
,了解probs
和logits
的规范。示例
>>> m = OneHotCategorical(torch.tensor([ 0.25, 0.25, 0.25, 0.25 ])) >>> m.sample() # equal probability of 0, 1, 2, 3 tensor([ 0., 0., 0., 1.])
- arg_constraints = {'logits': IndependentConstraint(Real(), 1), 'probs': Simplex()}¶
- has_enumerate_support = True¶
- property logits¶
- property mean¶
- property mode¶
- property param_shape¶
- property probs¶
- support = OneHot()¶
- property variance¶
Pareto¶
- class torch.distributions.pareto.Pareto(scale, alpha, validate_args=None)[source]¶
Bases:
TransformedDistribution
从帕累托 I 型分布中采样。
示例
>>> m = Pareto(torch.tensor([1.0]), torch.tensor([1.0])) >>> m.sample() # sample from a Pareto distribution with scale=1 and alpha=1 tensor([ 1.5623])
- arg_constraints: Dict[str, Constraint] = {'alpha': GreaterThan(lower_bound=0.0), 'scale': GreaterThan(lower_bound=0.0)}¶
- property mean¶
- property mode¶
- property support¶
- property variance¶
泊松分布¶
- class torch.distributions.poisson.Poisson(rate, validate_args=None)[source]¶
-
创建一个由
rate
参数化的泊松分布,它是速率参数。样本是非负整数,其概率质量函数由下式给出:
示例
>>> m = Poisson(torch.tensor([4])) >>> m.sample() tensor([ 3.])
- 参数
rate (数字, 张量) – 速率参数
- arg_constraints = {'rate': GreaterThanEq(lower_bound=0.0)}¶
- property mean¶
- property mode¶
- support = IntegerGreaterThan(lower_bound=0)¶
- property variance¶
RelaxedBernoulli¶
- class torch.distributions.relaxed_bernoulli.RelaxedBernoulli(temperature, probs=None, logits=None, validate_args=None)[source]¶
Bases:
TransformedDistribution
创建一个 RelaxedBernoulli 分布,由
temperature
参数化,以及probs
或logits
(但不能同时使用两者)。这是一个 Bernoulli 分布的松弛版本,因此值在 (0, 1) 之间,并且具有可重新参数化的样本。示例
>>> m = RelaxedBernoulli(torch.tensor([2.2]), ... torch.tensor([0.1, 0.2, 0.3, 0.99])) >>> m.sample() tensor([ 0.2951, 0.3442, 0.8918, 0.9021])
- arg_constraints: Dict[str, Constraint] = {'logits': Real(), 'probs': Interval(lower_bound=0.0, upper_bound=1.0)}¶
- has_rsample = True¶
- property logits¶
- property probs¶
- support = Interval(lower_bound=0.0, upper_bound=1.0)¶
- property temperature¶
LogitRelaxedBernoulli¶
- class torch.distributions.relaxed_bernoulli.LogitRelaxedBernoulli(temperature, probs=None, logits=None, validate_args=None)[source]¶
基类:
Distribution
创建一个由
probs
或logits
(但不是两者)参数化的 LogitRelaxedBernoulli 分布,它是 RelaxedBernoulli 分布的对数几率。样本是 (0, 1) 中值的对数几率。有关更多详细信息,请参见 [1]。
[1] The Concrete Distribution: A Continuous Relaxation of Discrete Random Variables (Maddison 等人,2017)
[2] Categorical Reparametrization with Gumbel-Softmax (Jang 等人,2017)
- arg_constraints = {'logits': Real(), 'probs': Interval(lower_bound=0.0, upper_bound=1.0)}¶
- property logits¶
- property param_shape¶
- property probs¶
- support = Real()¶
RelaxedOneHotCategorical¶
- class torch.distributions.relaxed_categorical.RelaxedOneHotCategorical(temperature, probs=None, logits=None, validate_args=None)[source]¶
Bases:
TransformedDistribution
创建一个由
temperature
参数化,并由probs
或logits
参数化的 RelaxedOneHotCategorical 分布。 这是一个OneHotCategorical
分布的松弛版本,因此它的样本位于单纯形上,并且是可重新参数化的。示例
>>> m = RelaxedOneHotCategorical(torch.tensor([2.2]), ... torch.tensor([0.1, 0.2, 0.3, 0.4])) >>> m.sample() tensor([ 0.1294, 0.2324, 0.3859, 0.2523])
- arg_constraints: Dict[str, Constraint] = {'logits': IndependentConstraint(Real(), 1), 'probs': Simplex()}¶
- has_rsample = True¶
- property logits¶
- property probs¶
- support = Simplex()¶
- property temperature¶
StudentT¶
- class torch.distributions.studentT.StudentT(df, loc=0.0, scale=1.0, validate_args=None)[source]¶
基类:
Distribution
创建由自由度
df
、均值loc
和尺度scale
参数化的学生 t 分布。示例
>>> m = StudentT(torch.tensor([2.0])) >>> m.sample() # Student's t-distributed with degrees of freedom=2 tensor([ 0.1046])
- arg_constraints = {'df': GreaterThan(lower_bound=0.0), 'loc': Real(), 'scale': GreaterThan(lower_bound=0.0)}¶
- has_rsample = True¶
- property mean¶
- property mode¶
- support = Real()¶
- property variance¶
TransformedDistribution¶
- class torch.distributions.transformed_distribution.TransformedDistribution(base_distribution, transforms, validate_args=None)[source]¶
基类:
Distribution
Distribution 类的一个扩展,它对基本分布应用一系列变换。令 f 为应用的变换的组合
X ~ BaseDistribution Y = f(X) ~ TransformedDistribution(BaseDistribution, f) log p(Y) = log p(X) + log |det (dX/dY)|
请注意,
TransformedDistribution
的.event_shape
是其基本分布和变换的最大形状,因为变换会在事件之间引入相关性。TransformedDistribution
的一个使用示例是# Building a Logistic Distribution # X ~ Uniform(0, 1) # f = a + b * logit(X) # Y ~ f(X) ~ Logistic(a, b) base_distribution = Uniform(0, 1) transforms = [SigmoidTransform().inv, AffineTransform(loc=a, scale=b)] logistic = TransformedDistribution(base_distribution, transforms)
更多示例,请查看
Gumbel
、HalfCauchy
、HalfNormal
、LogNormal
、Pareto
、Weibull
、RelaxedBernoulli
和RelaxedOneHotCategorical
的实现。- arg_constraints: Dict[str, Constraint] = {}¶
- property has_rsample¶
- rsample(sample_shape=torch.Size([]))[source]¶
如果分布参数是批处理的,则生成一个 sample_shape 形状的重新参数化样本或 sample_shape 形状的重新参数化样本批次。首先从基本分布中采样,并对列表中的每个变换应用 transform()。
- sample(sample_shape=torch.Size([]))[source]¶
如果分布参数是批处理的,则生成一个 sample_shape 形状的样本或 sample_shape 形状的样本批次。首先从基本分布中采样,并对列表中的每个变换应用 transform()。
- property support¶
Uniform¶
- class torch.distributions.uniform.Uniform(low, high, validate_args=None)[source]¶
基类:
Distribution
从半开区间
[low, high)
生成均匀分布的随机样本。示例
>>> m = Uniform(torch.tensor([0.0]), torch.tensor([5.0])) >>> m.sample() # uniformly distributed in the range [0.0, 5.0) tensor([ 2.3418])
- arg_constraints = {'high': Dependent(), 'low': Dependent()}¶
- has_rsample = True¶
- property mean¶
- property mode¶
- property stddev¶
- property support¶
- property variance¶
VonMises¶
- class torch.distributions.von_mises.VonMises(loc, concentration, validate_args=None)[source]¶
基类:
Distribution
圆形冯·米塞斯分布。
此实现使用极坐标。
loc
和value
参数可以是任何实数(为了便于无约束优化),但会被解释为模 2 pi 的角度。- 示例:
>>> m = VonMises(torch.tensor([1.0]), torch.tensor([1.0])) >>> m.sample() # von Mises distributed with loc=1 and concentration=1 tensor([1.9777])
- 参数
loc (torch.Tensor) – 以弧度表示的角度。
concentration (torch.Tensor) – 集中参数
- arg_constraints = {'concentration': GreaterThan(lower_bound=0.0), 'loc': Real()}¶
- has_rsample = False¶
- property mean¶
提供的均值是循环的。
- property mode¶
- sample(sample_shape=torch.Size([]))[source]¶
冯·米塞斯分布的采样算法基于以下论文:D.J. Best 和 N.I. Fisher,“冯·米塞斯分布的有效模拟”。应用统计(1979):152-157。
采样始终在内部以双精度进行,以避免在浓度值较小时 _rejection_sample() 中出现挂起,这种情况在单精度下大约在 1e-4 处开始发生(参见问题 #88443)。
- support = Real()¶
- property variance¶
提供的方差是循环的。
Weibull¶
- class torch.distributions.weibull.Weibull(scale, concentration, validate_args=None)[source]¶
Bases:
TransformedDistribution
从双参数威布尔分布中采样。
示例
>>> m = Weibull(torch.tensor([1.0]), torch.tensor([1.0])) >>> m.sample() # sample from a Weibull distribution with scale=1, concentration=1 tensor([ 0.4784])
- arg_constraints: Dict[str, Constraint] = {'concentration': GreaterThan(lower_bound=0.0), 'scale': GreaterThan(lower_bound=0.0)}¶
- property mean¶
- property mode¶
- support = GreaterThan(lower_bound=0.0)¶
- property variance¶
Wishart¶
- class torch.distributions.wishart.Wishart(df, covariance_matrix=None, precision_matrix=None, scale_tril=None, validate_args=None)[source]¶
-
创建一个 Wishart 分布,该分布由一个对称正定矩阵 或其 Cholesky 分解
示例
>>> m = Wishart(torch.Tensor([2]), covariance_matrix=torch.eye(2)) >>> m.sample() # Wishart distributed with mean=`df * I` and >>> # variance(x_ij)=`df` for i != j and variance(x_ij)=`2 * df` for i == j
- 参数
注意
只能指定
covariance_matrix
、precision_matrix
或scale_tril
中的一个。使用scale_tril
将更有效率:所有内部计算都基于scale_tril
。如果传递了covariance_matrix
或precision_matrix
,则仅使用它通过 Cholesky 分解计算相应的下三角矩阵。‘torch.distributions.LKJCholesky’ 是一个受限的 Wishart 分布。[1]参考文献
[1] Wang, Z., Wu, Y. and Chu, H., 2018. On equivalence of the LKJ distribution and the restricted Wishart distribution. [2] Sawyer, S., 2007. Wishart Distributions and Inverse-Wishart Sampling. [3] Anderson, T. W., 2003. An Introduction to Multivariate Statistical Analysis (3rd ed.). [4] Odell, P. L. & Feiveson, A. H., 1966. A Numerical Procedure to Generate a SampleCovariance Matrix. JASA, 61(313):199-203. [5] Ku, Y.-C. & Bloomfield, P., 2010. Generating Random Wishart Matrices with Fractional Degrees of Freedom in OX.
- arg_constraints = {'covariance_matrix': PositiveDefinite(), 'df': GreaterThan(lower_bound=0), 'precision_matrix': PositiveDefinite(), 'scale_tril': LowerCholesky()}¶
- property covariance_matrix¶
- has_rsample = True¶
- property mean¶
- property mode¶
- property precision_matrix¶
- rsample(sample_shape=torch.Size([]), max_try_correction=None)[source]¶
警告
在某些情况下,基于Bartlett分解的采样算法可能会返回奇异矩阵样本。默认情况下会执行多次尝试来纠正奇异样本,但最终可能仍然返回奇异矩阵样本。奇异样本可能会在.log_prob()中返回-inf值。在这种情况下,用户应该验证样本,并相应地修复df的值或调整.rsample参数中的max_try_correction值。
- property scale_tril¶
- support = PositiveDefinite()¶
- property variance¶
KL 散度¶
- torch.distributions.kl.kl_divergence(p, q)[source]¶
计算两个分布之间的 Kullback-Leibler 散度 。
- 参数
p (Distribution) – 一个
Distribution
对象。q (Distribution) – 一个
Distribution
对象。
- 返回值
形状为 batch_shape 的 KL 散度批次。
- 返回类型
- 引发
NotImplementedError – 如果分布类型尚未通过
register_kl()
注册。
- KL 散度目前针对以下分布对实现:
Bernoulli
和Bernoulli
Bernoulli
和Poisson
Beta
和Beta
Beta
和ContinuousBernoulli
Beta
和Exponential
Beta
和Gamma
Beta
和Normal
Beta
和Pareto
Beta
和Uniform
Binomial
和Binomial
Categorical
和Categorical
Cauchy
和Cauchy
ContinuousBernoulli
和ContinuousBernoulli
ContinuousBernoulli
和Exponential
ContinuousBernoulli
和Normal
ContinuousBernoulli
和Pareto
ContinuousBernoulli
和Uniform
Dirichlet
和Dirichlet
Exponential
和Beta
Exponential
和ContinuousBernoulli
Exponential
和Exponential
Exponential
和Gamma
Exponential
和Gumbel
Exponential
和Normal
Exponential
和Pareto
Exponential
和Uniform
ExponentialFamily
和ExponentialFamily
Gamma
和Beta
Gamma
和ContinuousBernoulli
Gamma
和Exponential
Gamma
和Gamma
Gamma
和Gumbel
Gamma
和Normal
Gamma
和Pareto
Gamma
和Uniform
Geometric
和Geometric
Gumbel
和Beta
Gumbel
和ContinuousBernoulli
Gumbel
和Exponential
Gumbel
和Gamma
Gumbel
和Gumbel
Gumbel
和Normal
Gumbel
和Pareto
Gumbel
和Uniform
HalfNormal
和HalfNormal
Independent
和Independent
Laplace
和Beta
Laplace
和ContinuousBernoulli
Laplace
和Exponential
Laplace
和Gamma
Laplace
和Laplace
Laplace
和Normal
Laplace
和Pareto
Laplace
和Uniform
LowRankMultivariateNormal
和LowRankMultivariateNormal
LowRankMultivariateNormal
和MultivariateNormal
MultivariateNormal
和LowRankMultivariateNormal
MultivariateNormal
和MultivariateNormal
Normal
和Beta
Normal
和ContinuousBernoulli
Normal
和Exponential
Normal
和Gamma
Normal
和Gumbel
Normal
和Laplace
Normal
和Normal
Normal
和Pareto
Normal
和Uniform
OneHotCategorical
和OneHotCategorical
Pareto
和Beta
Pareto
和ContinuousBernoulli
Pareto
和Exponential
Pareto
和Gamma
Pareto
和Normal
Pareto
和Pareto
Pareto
和Uniform
Poisson
和Bernoulli
Poisson
和Binomial
Poisson
和Poisson
TransformedDistribution
和TransformedDistribution
Uniform
和Beta
Uniform
和ContinuousBernoulli
Uniform
和Exponential
Uniform
和Gamma
Uniform
和Gumbel
Uniform
和Normal
Uniform
和Pareto
Uniform
和Uniform
- torch.distributions.kl.register_kl(type_p, type_q)[source]¶
装饰器,用于将成对函数注册到
kl_divergence()
。用法@register_kl(Normal, Normal) def kl_normal_normal(p, q): # insert implementation here
查找返回最具体的 (类型, 类型) 匹配,按子类排序。如果匹配不明确,则会引发 RuntimeWarning。例如,要解决不明确的情况
@register_kl(BaseP, DerivedQ) def kl_version1(p, q): ... @register_kl(DerivedP, BaseQ) def kl_version2(p, q): ...
您应该注册第三个最具体的实现,例如
register_kl(DerivedP, DerivedQ)(kl_version1) # Break the tie.
Transforms¶
- class torch.distributions.transforms.AffineTransform(loc, scale, event_dim=0, cache_size=0)[source]¶
通过逐点仿射映射进行变换 .
- class torch.distributions.transforms.CatTransform(tseq, dim=0, lengths=None, cache_size=0)[source]¶
变换函数,以与
torch.cat()
兼容的方式,将一系列变换 tseq 按组件应用于 dim 上的每个子矩阵,子矩阵的长度为 lengths[dim]。示例
x0 = torch.cat([torch.range(1, 10), torch.range(1, 10)], dim=0) x = torch.cat([x0, x0], dim=0) t0 = CatTransform([ExpTransform(), identity_transform], dim=0, lengths=[10, 10]) t = CatTransform([t0, t0], dim=0, lengths=[20, 20]) y = t(x)
- class torch.distributions.transforms.ComposeTransform(parts, cache_size=0)[source]¶
将多个变换组合成一个链。组合的变换负责缓存。
- class torch.distributions.transforms.CorrCholeskyTransform(cache_size=0)[source]¶
将一个长度为 的无约束实数向量 转换为 D 维相关矩阵的 Cholesky 分解因子。该 Cholesky 分解因子是一个下三角矩阵,对角线元素为正数,每行欧几里得范数为 1。转换过程如下:
首先,我们将 x 转换为按行排列的下三角矩阵。
For each row of the lower triangular part, we apply a signed version of class
StickBreakingTransform
to transform into a unit Euclidean length vector using the following steps: - Scales into the interval domain: . - Transforms into an unsigned domain: . - Applies . - Transforms back into signed domain: .
- class torch.distributions.transforms.CumulativeDistributionTransform(distribution, cache_size=0)[source]¶
通过概率分布的累积分布函数进行转换。
- 参数
分布 (分布) – 用于变换的累积分布函数的分布。
示例
# Construct a Gaussian copula from a multivariate normal. base_dist = MultivariateNormal( loc=torch.zeros(2), scale_tril=LKJCholesky(2).sample(), ) transform = CumulativeDistributionTransform(Normal(0, 1)) copula = TransformedDistribution(base_dist, [transform])
- class torch.distributions.transforms.IndependentTransform(base_transform, reinterpreted_batch_ndims, cache_size=0)[source]¶
另一个变换的包装器,将
reinterpreted_batch_ndims
个最右侧维度的额外部分视为依赖项。这不会影响正向或反向变换,但在log_abs_det_jacobian()
中会将最右侧的reinterpreted_batch_ndims
个维度相加。
- class torch.distributions.transforms.LowerCholeskyTransform(cache_size=0)[source]¶
从无约束矩阵到具有非负对角线项的下三角矩阵的变换。
这对于根据其 Cholesky 分解参数化正定矩阵很有用。
- class torch.distributions.transforms.PositiveDefiniteTransform(cache_size=0)[source]¶
从无约束矩阵到正定矩阵的变换。
- class torch.distributions.transforms.ReshapeTransform(in_shape, out_shape, cache_size=0)[source]¶
单位雅可比变换,用于重塑张量的最右侧部分。
请注意,
in_shape
和out_shape
必须具有相同数量的元素,就像torch.Tensor.reshape()
一样。- 参数
in_shape (torch.Size) – 输入事件形状。
out_shape (torch.Size) – 输出事件形状。
- class torch.distributions.transforms.SoftplusTransform(cache_size=0)[source]¶
通过映射 进行转换。当 时,实现将恢复为线性函数。
- class torch.distributions.transforms.TanhTransform(cache_size=0)[source]¶
通过映射 进行转换。
它等效于
` ComposeTransform([AffineTransform(0., 2.), SigmoidTransform(), AffineTransform(-1., 2.)]) `
但是这在数值上可能不稳定,因此建议使用 TanhTransform。请注意,在处理 NaN/Inf 值时,应使用 cache_size=1。
- class torch.distributions.transforms.SoftmaxTransform(cache_size=0)[source]¶
通过 然后归一化,将无约束空间转换为单纯形。
这不是双射的,不能用于 HMC。但是,这主要按坐标进行(除了最终的归一化),因此适用于按坐标进行的优化算法。
- class torch.distributions.transforms.StackTransform(tseq, dim=0, cache_size=0)[source]¶
变换函子,它以与
torch.stack()
兼容的方式,对 dim 中的每个子矩阵按组件应用一系列变换 tseq。示例
x = torch.stack([torch.range(1, 10), torch.range(1, 10)], dim=1) t = StackTransform([ExpTransform(), identity_transform], dim=1) y = t(x)
- class torch.distributions.transforms.StickBreakingTransform(cache_size=0)[source]¶
从无约束空间到通过 stick-breaking 过程获得的更高一维单纯形的变换。
这种变换源于 Dirichlet 分布的 stick-breaking 构造中的迭代 sigmoid 变换:第一个 logit 通过 sigmoid 变换为第一个概率和所有其他概率,然后该过程递归。
这是双射的,适用于 HMC;但是它将坐标混合在一起,不太适合优化。
- class torch.distributions.transforms.Transform(cache_size=0)[source]¶
可逆变换的抽象类,具有可计算的对数行列式雅可比矩阵。它们主要用于
torch.distributions.TransformedDistribution
。缓存对于逆运算代价昂贵或数值不稳定的变换很有用。请注意,必须小心处理记忆值,因为自动微分图可能会反转。例如,以下代码在有或没有缓存的情况下都能正常工作
y = t(x) t.log_abs_det_jacobian(x, y).backward() # x will receive gradients.
但是,以下代码在缓存时由于依赖关系反转而会出错
y = t(x) z = t.inv(y) grad(z.sum(), [y]) # error because z is x
派生类应该实现
_call()
或_inverse()
中的一个或两个。将 bijective=True 设置为 True 的派生类还应该实现log_abs_det_jacobian()
。- 参数
cache_size (int) – 缓存大小。如果为零,则不进行缓存。如果为一,则缓存最新的单个值。仅支持 0 和 1。
- 变量
domain (
Constraint
) – 表示此变换有效输入的约束。codomain (
Constraint
) – 表示此变换有效输出的约束,这些输出是逆变换的输入。bijective (bool) – 此变换是否双射。变换
t
是双射的当且仅当t.inv(t(x)) == x
且t(t.inv(y)) == y
对每个x
在域中和y
在陪域中。非双射变换至少应保持较弱的伪逆性质t(t.inv(t(x)) == t(x)
和t.inv(t(t.inv(y))) == t.inv(y)
。sign (int 或 Tensor) – 对于双射单变量变换,这应该为 +1 或 -1,具体取决于变换是单调递增还是递减。
- property sign¶
返回雅可比行列式的符号,如果适用。通常,这仅对双射变换有意义。
约束¶
实现了以下约束
constraints.boolean
constraints.cat
constraints.corr_cholesky
constraints.dependent
constraints.greater_than(lower_bound)
constraints.greater_than_eq(lower_bound)
constraints.independent(constraint, reinterpreted_batch_ndims)
constraints.integer_interval(lower_bound, upper_bound)
constraints.interval(lower_bound, upper_bound)
constraints.less_than(upper_bound)
constraints.lower_cholesky
constraints.lower_triangular
constraints.multinomial
constraints.nonnegative
constraints.nonnegative_integer
constraints.one_hot
constraints.positive_integer
constraints.positive
constraints.positive_semidefinite
constraints.positive_definite
constraints.real_vector
constraints.real
constraints.simplex
constraints.symmetric
constraints.stack
constraints.square
constraints.symmetric
constraints.unit_interval
- torch.distributions.constraints.cat¶
是
_Cat
的别名
- torch.distributions.constraints.dependent_property¶
是
_DependentProperty
的别名
- torch.distributions.constraints.greater_than¶
是
_GreaterThan
的别名
- torch.distributions.constraints.greater_than_eq¶
是
_GreaterThanEq
的别名
- torch.distributions.constraints.independent¶
别名
_IndependentConstraint
- torch.distributions.constraints.integer_interval¶
别名
_IntegerInterval
- torch.distributions.constraints.interval¶
别名
_Interval
- torch.distributions.constraints.half_open_interval¶
别名
_HalfOpenInterval
- torch.distributions.constraints.less_than¶
别名
_LessThan
- torch.distributions.constraints.multinomial¶
别名
_Multinomial
- torch.distributions.constraints.stack¶
别名
_Stack
约束注册表¶
PyTorch 提供两个全局的 ConstraintRegistry
对象,它们将 Constraint
对象链接到 Transform
对象。这两个对象都输入约束并返回变换,但它们对双射性的保证不同。
biject_to(constraint)
会查找从constraints.real
到给定constraint
的双射Transform
。返回的变换保证具有.bijective = True
并且应该实现.log_abs_det_jacobian()
。transform_to(constraint)
会查找从constraints.real
到给定constraint
的非双射Transform
。返回的变换不保证实现.log_abs_det_jacobian()
。
transform_to()
注册表对于对概率分布的约束参数执行无约束优化很有用,这些参数由每个分布的 .arg_constraints
字典指示。这些变换通常会过度参数化一个空间以避免旋转;因此,它们更适合于像 Adam 这样的逐坐标优化算法。
loc = torch.zeros(100, requires_grad=True)
unconstrained = torch.zeros(100, requires_grad=True)
scale = transform_to(Normal.arg_constraints['scale'])(unconstrained)
loss = -Normal(loc, scale).log_prob(data).sum()
biject_to()
注册表对于哈密顿蒙特卡罗很有用,在哈密顿蒙特卡罗中,来自具有约束 .support
的概率分布的样本在无约束空间中传播,并且算法通常是旋转不变的。
dist = Exponential(rate)
unconstrained = torch.zeros(100, requires_grad=True)
sample = biject_to(dist.support)(unconstrained)
potential_energy = -dist.log_prob(sample).sum()
注意
transform_to
和 biject_to
不同的一个例子是 constraints.simplex
: transform_to(constraints.simplex)
返回一个 SoftmaxTransform
,它只是对输入进行指数运算并归一化;这是一个廉价且大部分是逐坐标的操作,适用于 SVI 等算法。相反,biject_to(constraints.simplex)
返回一个 StickBreakingTransform
,它将输入双射到一个少一个维度的空间;这是一个更昂贵、数值稳定性更差的变换,但对于 HMC 等算法是必需的。
biject_to
和 transform_to
对象可以通过用户定义的约束和变换使用它们的 .register()
方法进行扩展,作为单例约束上的函数
transform_to.register(my_constraint, my_transform)
或者作为参数化约束上的装饰器
@transform_to.register(MyConstraintClass)
def my_factory(constraint):
assert isinstance(constraint, MyConstraintClass)
return MyTransform(constraint.param1, constraint.param2)
您可以通过创建一个新的 ConstraintRegistry
对象来创建自己的注册表。
- class torch.distributions.constraint_registry.ConstraintRegistry[source]¶
将约束链接到变换的注册表。
- register(constraint, factory=None)[source]¶
在该注册表中注册一个
Constraint
子类。用法@my_registry.register(MyConstraintClass) def construct_transform(constraint): assert isinstance(constraint, MyConstraint) return MyTransform(constraint.arg_constraints)
- 参数
constraint (
Constraint
的子类) –Constraint
的子类,或所需类的单例对象。factory (Callable) – 一个可调用对象,它输入一个约束对象并返回一个
Transform
对象。