重新参数化器

pyro.infer.reparam 模块包含用于 pyro.poutine.handlers.reparam() 效果的重参数化策略。这些策略对于改变条件较差的参数空间的几何形状以使后验更好地成形非常有用。这些策略可以与各种推断算法一起使用,例如 Auto*Normal 引导和 MCMC。

class ReparamMessage[source]
name: str
fn: Callable
value: Optional[torch.Tensor]
is_observed: Optional[bool]
class ReparamResult[source]
fn: Callable
value: Optional[torch.Tensor]
is_observed: bool
class Reparam[source]

用于重新参数化的抽象基类。

派生类应该实现 apply()

apply(msg: pyro.infer.reparam.reparam.ReparamMessage) pyro.infer.reparam.reparam.ReparamResult[source]

应用重新参数化的抽象方法。

Parameters

name (dict) – 一个简化的Pyro消息,包含以下字段: - name: str 样本站点的名称 - fn: Callable 一个分布 - value: Optional[torch.Tensor] 一个观察值或初始值 - is_observed: bool 表示value是否为观察值

Returns

一个简化的Pyro消息,包含字段 fn, value, 和 is_observed

Return type

dict

__call__(name, fn, obs)[源代码]

已弃用。 子类应改为实现 apply()。 这将在未来的版本中移除。

自动策略

这些重新参数化策略通过 register_reparam_strategy() 注册,并通过 poutine.reparam(config=name_of_strategy) 按名称访问。 有关用法,请参见 reparam()

class Strategy[source]

基础类:abc.ABC

用于重新参数化配置策略的抽象基类。

派生类必须实现 configure() 方法。

Variables

config (dict) – 一个字典配置。这将在模型第一次运行时被填充。之后,它可以作为参数用于 poutine.reparam(config=___)

abstract configure(msg: dict) Optional[pyro.infer.reparam.reparam.Reparam][source]

输入一个样本站点并返回 None 或一个 Reparam 实例。

这将在第一次模型执行时调用;后续执行将使用存储在self.config中的重新参数化器。

Parameters

msg (dict) – 一个可能重新参数化的示例站点。

Returns

一个可选的重新参数化实例。

__call__(msg_or_fn: Union[dict, Callable])[源代码]

策略可以用作装饰器来重新参数化模型。

Parameters

msg_or_fn – 公共用途:要装饰的模型。(内部用途:为重新参数化配置的站点)。

class MinimalReparam[源代码]

基础类:pyro.infer.reparam.strategies.Strategy

最小重参数化策略,仅对那些可能导致错误的站点进行重参数化,例如 StableProjectedNormal 随机变量。

示例:

@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() 实现。

apply(msg)[source]

位置-尺度去中心化

class LocScaleReparam(centered=None, shape_params=None)[source]

基础类:pyro.infer.reparam.reparam.Reparam

通用的去中心化重参数化器 [1] 用于由 locscale(可能还有额外的 shape_params)参数化的潜在变量。

这种重新参数化仅适用于潜在变量,而不适用于似然函数。

[1] Maria I. Gorinova, Dave Moore, Matthew D. Hoffman (2019)

“概率程序的自动重新参数化” https://arxiv.org/pdf/1906.03028.pdf

Parameters
  • 居中 (float) – 可选的居中参数。如果为 None(默认),则在 [0,1] 范围内学习每个站点每个元素的居中参数。如果为 0,则完全去中心化分布;如果为 1,则保持居中分布不变。

  • shape_params (tuplelist) – 可选的附加参数名称列表,从中心分布复制到非中心分布时保持不变。如果不存在,将复制分布中 .arg_constraints 中的所有参数。

apply(msg)[source]

Gumbel-Softmax

class GumbelSoftmaxReparam[源代码]

基础类:pyro.infer.reparam.reparam.Reparam

用于RelaxedOneHotCategorical潜在变量的重新参数化器。

这对于将多模态后验转换为单模态后验非常有用。请注意,这会使每个事件的潜在维度增加1。

这种重新参数化仅适用于潜在变量,而不适用于似然函数。

apply(msg)[source]

转换后的分布

class TransformReparam[source]

基础类:pyro.infer.reparam.reparam.Reparam

用于pyro.distributions.torch.TransformedDistribution潜在变量的重新参数化器。

这对于具有复杂几何变换的转换分布非常有用,其中后验在base_dist空间中具有简单的形状。

这种重新参数化仅适用于潜在变量,而不适用于似然函数。

apply(msg)[源代码]

离散余弦变换

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中对角质量矩阵的有效性。

这种重新参数化仅适用于潜在变量,而不适用于似然函数。

Parameters
  • dim (int) – 沿此维度进行变换。必须为负数。 这是从右边开始计算的绝对维度。

  • flip (bool) – 是否在应用Haar变换之前翻转时间轴。默认为false。

  • experimental_allow_batch (bool) – 实验性允许跨批次维度耦合。目标批次维度及其右侧的所有批次维度将被转换为事件维度。默认为 False。

单位雅可比变换

class UnitJacobianReparam(transform, suffix='transformed', *, experimental_allow_batch=False)[source]

基础类:pyro.infer.reparam.reparam.Reparam

用于Transform对象的重新参数化器,其雅可比行列式为1。

Parameters
  • transform (Transform) – 一个其雅可比行列式为1的变换。

  • suffix (str) – 要附加到转换后站点的后缀。

  • experimental_allow_batch (bool) – 实验性允许跨批次维度耦合。目标批次维度及其右侧的所有批次维度将转换为事件维度。默认为 False。

apply(msg)[source]

学生T分布

class StudentTReparam[source]

基础类:pyro.infer.reparam.reparam.Reparam

用于StudentT随机变量的辅助变量重参数化器。

这与 LinearHMMReparam 结合使用非常有用,因为它允许 将StudentT过程视为条件高斯过程, 从而通过 GaussianHMM 进行廉价推断。

这通过引入一个辅助的Gamma变量来重新参数化一个StudentT,在该条件下结果是Normal

apply(msg)[source]

稳定分布

class LatentStableReparam[source]

基础类:pyro.infer.reparam.reparam.Reparam

用于Stable潜在变量的辅助变量重参数化器。

这在推断潜在变量时非常有用,因为Stablelog_prob()方法尚未实现。

这使用了Chambers-Mallows-Stuck方法 [1],创建了一对无参数的辅助分布(Uniform(-pi/2,pi/2)Exponential(1)),这些分布具有定义良好的 .log_prob() 方法,从而允许在基于似然的推理算法(如SVI和MCMC)中使用重新参数化的稳定分布。

这种重新参数化仅适用于潜在变量,不适用于似然函数。 对于与似然兼容的重新参数化,请参见 SymmetricStableReparamStableReparam

[1] J.P. Nolan (2017).

稳定分布:重尾数据的模型。 https://edspace.american.edu/jpnolan/wp-content/uploads/sites/1720/2020/09/Chap1.pdf

apply(msg)[source]
class SymmetricStableReparam[source]

基础类:pyro.infer.reparam.reparam.Reparam

对称Stable随机变量的辅助变量重参数化器(即那些skew=0的变量)。

这在推断对称的 Stable 变量时非常有用,因为 log_prob() 尚未实现。

这将对称的Stable随机变量重新参数化为完全偏斜的(skew=1Stable尺度混合的Normal随机变量。参见[1]的命题3(但请注意我们有所不同,因为Stable使用了Nolan的连续S0参数化)。

[1] Alvaro Cartea and Sam Howison (2009)

“使用Levy-Stable过程进行期权定价” https://pdfs.semanticscholar.org/4d66/c91b136b2a38117dd16c2693679f5341c616.pdf

apply(msg)[source]
class StableReparam[源代码]

基础类:pyro.infer.reparam.reparam.Reparam

用于任意Stable随机变量的辅助变量重参数化器。

这在推断非对称的Stable变量时非常有用,因为log_prob()尚未实现。

这将重新参数化一个Stable随机变量 为两个其他稳定随机变量的和,一个是对称的,另一个 是完全偏斜的(应用[1]的属性2.3.a)。完全偏斜的 变量如LatentStableReparam中所示进行采样,而对称的 变量如SymmetricStableReparam中所示进行分解。

[1] V. M. Zolotarev (1986)

“一维稳定分布”

apply(msg)[source]

投影正态分布

class ProjectedNormalReparam[source]

基础类:pyro.infer.reparam.reparam.Reparam

用于ProjectedNormal潜在变量的重新参数化器。

这种重新参数化仅适用于潜在变量,而不适用于似然函数。

apply(msg)[source]

隐马尔可夫模型

class LinearHMMReparam(init=None, trans=None, obs=None)[源代码]

基础类:pyro.infer.reparam.reparam.Reparam

用于LinearHMM随机变量的辅助变量重参数化器。

这依赖于组件重新参数化器来创建辅助随机变量,条件是在这些变量下,该过程变为一个GaussianHMM。如果observation_dist是一个TransformedDistribution,这会重新排序这些变换,使得结果是一个TransformedDistributionGaussianHMM

这对于训练LinearHMM分布的参数非常有用,其log_prob()方法未定义。为了在存在非高斯因素(如Stable()StudentT()LogNormal())的情况下进行推理,请配置StudentTReparamStableReparamSymmetricStableReparam等组件重新参数化器,用于inittransscale。例如:

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
  • init (Reparam) – 初始分布的可选重新参数化器。

  • trans (Reparam) – 用于转换分布的可选重新参数化器。

  • obs (Reparam) – 观测分布的可选重参数化器。

apply(msg)[source]

站点分割

class SplitReparam(sections, dim)[source]

基础类:pyro.infer.reparam.reparam.Reparam

重新参数化器,用于沿维度分割随机变量,类似于 torch.split().

这对于使用不同的重参数化器或推理方法处理张量的不同部分非常有用。例如,在对时间序列执行HMC推理时,您可以首先应用 DiscreteCosineReparamHaarReparam,然后应用 SplitReparam 将其拆分为低频和高频 组件,最后将低频组件与全局变量一起添加到 full_mass 矩阵中。

Parameters
  • sections – 单个块的大小或每个块的大小列表。

  • dim (int) – 沿哪个维度进行分割。默认为-1。

Type

list(int)

apply(msg)[source]

神经传输

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) – 一个训练好的指南。

reparam(fn=None)[source]
apply(msg)[source]
transform_sample(latent)[source]

给定来自扭曲后验的潜在样本(可能包含批次维度),返回模型中潜在站点的样本dict

Parameters

latent – 从扭曲的后验中采样(可能是批量的)。请注意,批量维度不得与模型中的板维度冲突,即任何批量维度 d < - max_plate_nesting

Returns

一个由模型中的潜在位置键控的样本dict

Return type

dict

结构化预处理

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) – 一个训练好的指南。

reparam(fn=None)[source]
apply(msg)[source]
transform_samples(aux_samples, save_params=None)[source]

给定来自扭曲后验的潜在样本(可能包含批次维度),返回模型中潜在站点的样本dict

Parameters
  • aux_samples (dict) – 将站点名称映射到每个潜在辅助站点的张量值(或者如果指定了save_params,则仅映射到计算所需参数所需的那些潜在辅助站点)。

  • save_params (list) – 一个可选的站点名称列表,用于保存。这在具有大量干扰变量的模型中非常有用。默认为None,保存所有参数。

Returns

一个由模型中的潜在位置键控的样本dict

Return type

dict