重新参数化器¶
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.UnitJacobianReparamHaar小波重新参数化器,使用一个
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) – 一个训练好的指南。