重新参数化器¶
pyro.infer.reparam
模块包含用于 pyro.poutine.handlers.reparam()
效果的重参数化策略。这些策略对于改变条件较差的参数空间的几何形状以使后验更好地成形非常有用。这些策略可以与各种推断算法一起使用,例如 Auto*Normal
引导和 MCMC。
- class ReparamMessage[source]¶
-
- fn: Callable¶
- value: Optional[torch.Tensor]¶
- class Reparam[source]¶
用于重新参数化的抽象基类。
派生类应该实现
apply()
。- apply(msg: pyro.infer.reparam.reparam.ReparamMessage) pyro.infer.reparam.reparam.ReparamResult [source]¶
应用重新参数化的抽象方法。
自动策略¶
这些重新参数化策略通过
register_reparam_strategy()
注册,并通过
poutine.reparam(config=name_of_strategy)
按名称访问。
有关用法,请参见 reparam()
。
- class Strategy[source]¶
基础类:
abc.ABC
用于重新参数化配置策略的抽象基类。
派生类必须实现
configure()
方法。- Variables
config (dict) – 一个字典配置。这将在模型第一次运行时被填充。之后,它可以作为参数用于
poutine.reparam(config=___)
。
- class MinimalReparam[源代码]¶
基础类:
pyro.infer.reparam.strategies.Strategy
最小重参数化策略,仅对那些可能导致错误的站点进行重参数化,例如
Stable
和ProjectedNormal
随机变量。示例:
@MinimalReparam() def model(...): ...
这相当于:
@poutine.reparam(config=MinimalReparam()) def model(...): ...
- configure(msg: dict) Optional[pyro.infer.reparam.reparam.Reparam] [source]¶
- class AutoReparam(*, centered: Optional[float] = None)[源代码]¶
基础类:
pyro.infer.reparam.strategies.Strategy
应用一组推荐的重新参数化器。这些目前包括:
MinimalReparam
,TransformReparam
, 一个完全可学习的LocScaleReparam
, 和GumbelSoftmaxReparam
.示例:
@AutoReparam() def model(...): ...
这相当于:
@poutine.reparam(config=AutoReparam()) def model(...): ...
警告
此策略可能会在Pyro版本之间改变行为。 要检查或保存给定行为,请在至少运行一次模型后提取
.config
字典。- Parameters
居中 – 用于
LocScaleReparam
重新参数化的可选居中参数。 如果为None(默认值),居中将被学习。如果为[0.0,1.0]
中的浮点数,则为固定居中。要完全去中心化(例如在MCMC中),设置为0.0。
- configure(msg: dict) Optional[pyro.infer.reparam.reparam.Reparam] [源代码]¶
共轭更新¶
- class ConjugateReparam(guide)[source]¶
基础类:
pyro.infer.reparam.reparam.Reparam
实验性的 重新参数化为共轭更新分布。
这使用
conjugate_update()
方法更新先验分布fn
。指南可以是分布对象,也可以是输入模型*args,**kwargs
并返回分布对象的可调用对象。指南可以是近似的或学习的。例如,考虑模型和朴素变分指南:
total = torch.tensor(10.) count = torch.tensor(2.) def model(): prob = pyro.sample("prob", dist.Beta(0.5, 1.5)) pyro.sample("count", dist.Binomial(total, prob), obs=count) guide = AutoDiagonalNormal(model) # learns the posterior over prob
我们可以不使用这个学习到的指南,而是手动计算“prob”的共轭后验分布,然后在推理过程中使用一个更简单的指南,在这种情况下是一个空指南:
reparam_model = poutine.reparam(model, { "prob": ConjugateReparam(dist.Beta(1 + count, 1 + total - count)) }) def reparam_guide(): pass # nothing remains to be modeled!
- Parameters
指南 (Distribution 或 可调用) – 一个似然分布或返回指南分布的可调用对象。仅支持少数几种分布,具体取决于先验分布的
conjugate_update()
实现。
位置-尺度去中心化¶
- class LocScaleReparam(centered=None, shape_params=None)[source]¶
基础类:
pyro.infer.reparam.reparam.Reparam
通用的去中心化重参数化器 [1] 用于由
loc
和scale
(可能还有额外的shape_params
)参数化的潜在变量。这种重新参数化仅适用于潜在变量,而不适用于似然函数。
- [1] Maria I. Gorinova, Dave Moore, Matthew D. Hoffman (2019)
“概率程序的自动重新参数化” https://arxiv.org/pdf/1906.03028.pdf
- Parameters
Gumbel-Softmax¶
- class GumbelSoftmaxReparam[源代码]¶
基础类:
pyro.infer.reparam.reparam.Reparam
用于
RelaxedOneHotCategorical
潜在变量的重新参数化器。这对于将多模态后验转换为单模态后验非常有用。请注意,这会使每个事件的潜在维度增加1。
这种重新参数化仅适用于潜在变量,而不适用于似然函数。
转换后的分布¶
- class TransformReparam[source]¶
基础类:
pyro.infer.reparam.reparam.Reparam
用于
pyro.distributions.torch.TransformedDistribution
潜在变量的重新参数化器。这对于具有复杂几何变换的转换分布非常有用,其中后验在
base_dist
空间中具有简单的形状。这种重新参数化仅适用于潜在变量,而不适用于似然函数。
离散余弦变换¶
- class DiscreteCosineReparam(dim=- 1, smooth=0.0, *, experimental_allow_batch=False)[源代码]¶
基础:
pyro.infer.reparam.unit_jacobian.UnitJacobianReparam
离散余弦重新参数化器,使用
DiscreteCosineTransform
。这对于顺序模型非常有用,在这些模型中,沿时间轴的耦合(例如带状精度矩阵)引入了长程相关性。这重新参数化为频域表示,其中后验协方差应更接近对角线,从而提高SVI中对角线引导的准确性,并提高HMC中对角质量矩阵的有效性。
当对沿时间维度近似连续的变量进行重新参数化时,设置
smooth=1
。对于沿时间轴近似连续可微的变量,设置smooth=2
。这种重新参数化仅适用于潜在变量,而不适用于似然函数。
- Parameters
dim (int) – 沿此维度进行变换。必须为负数。 这是从右边开始计算的绝对维度。
smooth (float) – 平滑参数。当为0时,这将白噪声转换为白噪声;当为1时,这将布朗噪声转换为白噪声;当为-1时,这将紫噪声转换为白噪声;等等。允许任何实数。https://en.wikipedia.org/wiki/Colors_of_noise.
experimental_allow_batch (bool) – 实验性允许跨批次维度耦合。目标批次维度及其右侧的所有批次维度将转换为事件维度。默认为 False。
哈尔变换¶
- class HaarReparam(dim=- 1, flip=False, *, experimental_allow_batch=False)[source]¶
基础:
pyro.infer.reparam.unit_jacobian.UnitJacobianReparam
Haar小波重新参数化器,使用一个
HaarTransform
.这对于顺序模型非常有用,在这些模型中,沿时间轴的耦合(例如带状精度矩阵)引入了长程相关性。这重新参数化为频域表示,其中后验协方差应更接近对角线,从而提高SVI中对角线引导的准确性,并提高HMC中对角质量矩阵的有效性。
这种重新参数化仅适用于潜在变量,而不适用于似然函数。
单位雅可比变换¶
- class UnitJacobianReparam(transform, suffix='transformed', *, experimental_allow_batch=False)[source]¶
基础类:
pyro.infer.reparam.reparam.Reparam
用于
Transform
对象的重新参数化器,其雅可比行列式为1。- Parameters
学生T分布¶
- class StudentTReparam[source]¶
基础类:
pyro.infer.reparam.reparam.Reparam
用于
StudentT
随机变量的辅助变量重参数化器。这与
LinearHMMReparam
结合使用非常有用,因为它允许 将StudentT过程视为条件高斯过程, 从而通过GaussianHMM
进行廉价推断。
稳定分布¶
- class LatentStableReparam[source]¶
基础类:
pyro.infer.reparam.reparam.Reparam
用于
Stable
潜在变量的辅助变量重参数化器。这在推断潜在变量时非常有用,因为
Stable
的log_prob()
方法尚未实现。这使用了Chambers-Mallows-Stuck方法 [1],创建了一对无参数的辅助分布(
Uniform(-pi/2,pi/2)
和Exponential(1)
),这些分布具有定义良好的.log_prob()
方法,从而允许在基于似然的推理算法(如SVI和MCMC)中使用重新参数化的稳定分布。这种重新参数化仅适用于潜在变量,不适用于似然函数。 对于与似然兼容的重新参数化,请参见
SymmetricStableReparam
或StableReparam
。- [1] J.P. Nolan (2017).
稳定分布:重尾数据的模型。 https://edspace.american.edu/jpnolan/wp-content/uploads/sites/1720/2020/09/Chap1.pdf
- class SymmetricStableReparam[source]¶
基础类:
pyro.infer.reparam.reparam.Reparam
对称
Stable
随机变量的辅助变量重参数化器(即那些skew=0
的变量)。这在推断对称的
Stable
变量时非常有用,因为log_prob()
尚未实现。这将对称的
Stable
随机变量重新参数化为完全偏斜的(skew=1
)Stable
尺度混合的Normal
随机变量。参见[1]的命题3(但请注意我们有所不同,因为Stable
使用了Nolan的连续S0参数化)。- [1] Alvaro Cartea and Sam Howison (2009)
“使用Levy-Stable过程进行期权定价” https://pdfs.semanticscholar.org/4d66/c91b136b2a38117dd16c2693679f5341c616.pdf
- class StableReparam[源代码]¶
基础类:
pyro.infer.reparam.reparam.Reparam
用于任意
Stable
随机变量的辅助变量重参数化器。这在推断非对称的
Stable
变量时非常有用,因为log_prob()
尚未实现。这将重新参数化一个
Stable
随机变量 为两个其他稳定随机变量的和,一个是对称的,另一个 是完全偏斜的(应用[1]的属性2.3.a)。完全偏斜的 变量如LatentStableReparam
中所示进行采样,而对称的 变量如SymmetricStableReparam
中所示进行分解。- [1] V. M. Zolotarev (1986)
“一维稳定分布”
投影正态分布¶
- class ProjectedNormalReparam[source]¶
基础类:
pyro.infer.reparam.reparam.Reparam
用于
ProjectedNormal
潜在变量的重新参数化器。这种重新参数化仅适用于潜在变量,而不适用于似然函数。
隐马尔可夫模型¶
- class LinearHMMReparam(init=None, trans=None, obs=None)[源代码]¶
基础类:
pyro.infer.reparam.reparam.Reparam
用于
LinearHMM
随机变量的辅助变量重参数化器。这依赖于组件重新参数化器来创建辅助随机变量,条件是在这些变量下,该过程变为一个
GaussianHMM
。如果observation_dist
是一个TransformedDistribution
,这会重新排序这些变换,使得结果是一个TransformedDistribution
的GaussianHMM
。这对于训练
LinearHMM
分布的参数非常有用,其log_prob()
方法未定义。为了在存在非高斯因素(如Stable()
、StudentT()
或LogNormal()
)的情况下进行推理,请配置StudentTReparam
、StableReparam
、SymmetricStableReparam
等组件重新参数化器,用于init
、trans
和scale
。例如:hmm = LinearHMM( init_dist=Stable(1,0,1,0).expand([2]).to_event(1), trans_matrix=torch.eye(2), trans_dist=MultivariateNormal(torch.zeros(2), torch.eye(2)), obs_matrix=torch.eye(2), obs_dist=TransformedDistribution( Stable(1.5,-0.5,1.0).expand([2]).to_event(1), ExpTransform())) rep = LinearHMMReparam(init=SymmetricStableReparam(), obs=StableReparam()) with poutine.reparam(config={"hmm": rep}): pyro.sample("hmm", hmm, obs=data)
- Parameters
站点分割¶
- class SplitReparam(sections, dim)[source]¶
基础类:
pyro.infer.reparam.reparam.Reparam
重新参数化器,用于沿维度分割随机变量,类似于
torch.split()
.这对于使用不同的重参数化器或推理方法处理张量的不同部分非常有用。例如,在对时间序列执行HMC推理时,您可以首先应用
DiscreteCosineReparam
或HaarReparam
,然后应用SplitReparam
将其拆分为低频和高频 组件,最后将低频组件与全局变量一起添加到full_mass
矩阵中。
神经传输¶
- class NeuTraReparam(guide)[源代码]¶
基础类:
pyro.infer.reparam.reparam.Reparam
多个潜在变量的神经传输重参数化器 [1]。
这使用了一个训练过的
AutoContinuous
引导来改变模型的几何形状,通常用于例如MCMC中。示例用法:# Step 1. Train a guide guide = AutoIAFNormal(model) svi = SVI(model, guide, ...) # ...train the guide... # Step 2. Use trained guide in NeuTra MCMC neutra = NeuTraReparam(guide) model = poutine.reparam(model, config=lambda _: neutra) nuts = NUTS(model) # ...now use the model in HMC or NUTS...
这种重新参数化仅适用于潜在变量,不适用于似然函数。 请注意,所有站点必须共享一个共同的
NeuTraReparam
实例,并且模型必须具有静态结构。- [1] Hoffman, M. et al. (2019)
“使用神经传输在哈密顿蒙特卡洛中中和不良几何” https://arxiv.org/abs/1903.03704
- Parameters
指南 (AutoContinuous) – 一个训练好的指南。
结构化预处理¶
- class StructuredReparam(guide: pyro.infer.autoguide.structured.AutoStructured)[源代码]¶
基础类:
pyro.infer.reparam.reparam.Reparam
多个潜在变量的预处理重新参数化器。
这使用了一个训练过的
AutoStructured
引导来改变模型的几何形状,通常用于例如MCMC中。示例用法:# Step 1. Train a guide guide = AutoStructured(model, ...) svi = SVI(model, guide, ...) # ...train the guide... # Step 2. Use trained guide in preconditioned MCMC model = StructuredReparam(guide).reparam(model) nuts = NUTS(model) # ...now use the model in HMC or NUTS...
这种重新参数化仅适用于潜在变量,不适用于似然函数。 请注意,所有站点必须共享一个共同的
StructuredReparam
实例,并且模型必须具有静态结构。注意
这可以被视为
NeuTraReparam
[1] 的一个受限结构化版本,结合了在MAP估计站点上的poutine.condition
(NeuTra变换是一个精确的重参数化器,但对点估计的条件引入了模型近似)。- [1] Hoffman, M. et al. (2019)
“使用神经传输在哈密顿蒙特卡洛中中和不良几何” https://arxiv.org/abs/1903.03704
- Parameters
指南 (AutoStructured) – 一个训练好的指南。