自动指南生成

自动指南

class AutoGuide(model, *, create_plates=None)[source]

基础类:pyro.nn.module.PyroModule

自动指南的基类。

派生类必须实现forward()方法,使用与基类model相同的*args, **kwargs

自动指南可以单独使用,也可以组合在 AutoGuideList 对象中使用。

Parameters
  • model (callable) – 一个pyro模型。

  • create_plates (可调用) – 一个可选的函数,输入与 model() 相同的 *args,**kwargs 并返回一个 pyro.plate 或可迭代的 plates。未返回的 plates 将像往常一样自动创建。这对于数据子采样非常有用。

property model
call(*args, **kwargs)[source]

调用forward()并将指南的参数值作为tuple而不是dict返回的方法,这是JIT跟踪的要求。与forward()不同,此方法可以通过torch.jit.trace_module()进行跟踪。

警告

一旦PyTorch JIT跟踪器开始接受dict作为有效返回类型,此方法可能会被移除。请参阅问题 _

sample_latent(**kwargs)[source]

在给定与基础model相同的*args, **kwargs的情况下,对编码的潜在变量进行采样。

median(*args, **kwargs)[source]

返回每个潜在变量的后验中值。

Returns

一个字典,将样本站点名称映射到中位数张量。

Return type

dict

training: bool

自动指南列表

class AutoGuideList(model, *, create_plates=None)[source]

基础类:pyro.infer.autoguide.guides.AutoGuide, torch.nn.modules.container.ModuleList

容器类,用于组合多个自动或自定义指南。

示例用法:

guide = AutoGuideList(my_model)
guide.append(AutoDiagonalNormal(poutine.block(model, hide=["assignment"])))
guide.append(AutoDiscreteParallel(poutine.block(model, expose=["assignment"])))
svi = SVI(model, guide, optim, Trace_ELBO())
Parameters

model (callable) – 一个 Pyro 模型

append(part)[source]

为模型的一部分添加自动或自定义指南。该指南应通过阻止模型以限制到样本站点的子集来创建。任何两个部分都不应在任何一个样本站点上操作。

Parameters

部分 (AutoGuide可调用) – 要添加的部分指南

add(part)[source]

已弃用的别名,用于 append()

forward(*args, **kwargs)[source]

一个复合指南,具有与基础model相同的*args, **kwargs

注意

此方法由Module内部使用。 用户应改用__call__()

Returns

一个字典,将样本站点名称映射到采样值。

Return type

dict

median(*args, **kwargs)[source]

返回每个潜在变量的后验中值。

Returns

一个字典,将样本站点名称映射到中位数张量。

Return type

dict

quantiles(quantiles, *args, **kwargs)[source]

返回每个潜在变量的后验分位数值。

Parameters

quantiles (list) – 一个介于0和1之间的请求分位数的列表。

Returns

一个字典,将样本站点名称映射到分位数张量。

Return type

dict

training: bool

自动可赎回

class AutoCallable(model, guide, median=<function AutoCallable.<lambda>>)[source]

基础类:pyro.infer.autoguide.guides.AutoGuide

AutoGuide 用于简单可调用指南的包装器。

这用于内部组合自动指南与用户定义的简单可调用指南,例如:

def my_local_guide(*args, **kwargs):
    ...

guide = AutoGuideList(model)
guide.append(AutoDelta(poutine.block(model, expose=['my_global_param']))
guide.append(my_local_guide)  # automatically wrapped in an AutoCallable

要指定一个中位数可调用对象,你可以改为:

def my_local_median(*args, **kwargs)
    ...

guide.append(AutoCallable(model, my_local_guide, my_local_median))

对于需要访问板块等更复杂的指南,用户应改为子类化 AutoGuide

Parameters
  • model (callable) – 一个 Pyro 模型

  • 指南 (可调用) – 一个Pyro指南(通常仅覆盖模型的一部分)

  • median (callable) – 一个可选的 callable,返回一个字典,将样本站点名称映射到计算的中位数张量。

forward(*args, **kwargs)[source]
training: bool

自动归一化

class AutoNormal(model, *, init_loc_fn=<function init_to_feasible>, init_scale=0.1, create_plates=None)[source]

基础类:pyro.infer.autoguide.guides.AutoGuide

这个AutoGuide的实现使用了一个具有对角协方差矩阵的正态分布来构建整个潜在空间的引导。该引导不依赖于模型的*args, **kwargs

它应该等同于 :class: AutoDiagonalNormal,但具有更方便的站点名称,并且对 TraceMeanField_ELBO 有更好的支持。

AutoDiagonalNormal中,如果你的模型有N个命名参数,维度为k_i且总和k_i = D,你会得到一个长度为D的均值向量和一个长度为D的sigma向量。这个指南为你提供了N个不同的正态分布,你可以通过名称调用它们。

用法:

guide = AutoNormal(model)
svi = SVI(model, guide, ...)
Parameters
  • model (callable) – 一个Pyro模型。

  • init_loc_fn (callable) – 每个站点的初始化函数。 请参阅 初始化 部分以获取可用的函数。

  • init_scale (float) – 每个(未约束转换的)潜在变量的标准差的初始比例。

  • create_plates (可调用) – 一个可选的函数,输入与 model() 相同的 *args,**kwargs 并返回一个 pyro.plate 或可迭代的 plates。未返回的 plates 将像往常一样自动创建。这对于数据子采样非常有用。

scale_constraint = SoftplusPositive(lower_bound=0.0)
forward(*args, **kwargs)[source]

一个自动指南,具有与基础 model 相同的 *args, **kwargs

注意

此方法由Module内部使用。 用户应改用__call__()

Returns

一个字典,将样本站点名称映射到采样值。

Return type

dict

median(*args, **kwargs)[source]

返回每个潜在变量的后验中值。

Returns

一个字典,将样本站点名称映射到中位数张量。

Return type

dict

quantiles(quantiles, *args, **kwargs)[source]

返回每个潜在变量的后验分位数。示例:

print(guide.quantiles([0.05, 0.5, 0.95]))
Parameters

quantiles (torch.Tensorlist) – 一个介于0和1之间的请求分位数列表。

Returns

一个字典,将样本站点名称映射到分位数值的张量。

Return type

dict

training: bool

AutoDelta

class AutoDelta(model, init_loc_fn=<function init_to_median>, *, create_plates=None)[source]

基础类:pyro.infer.autoguide.guides.AutoGuide

这个AutoGuide的实现使用Delta分布来在整个潜在空间上构建一个MAP指南。该指南不依赖于模型的*args, **kwargs

注意

此类在受限空间中进行MAP推理。

用法:

guide = AutoDelta(model)
svi = SVI(model, guide, ...)

潜在变量使用init_loc_fn()进行初始化。要更改默认行为,请创建一个自定义的init_loc_fn(),如初始化中所述,例如:

def my_init_fn(site):
    if site["name"] == "level":
        return torch.tensor([-1., 0., 1.])
    if site["name"] == "concentration":
        return torch.ones(k)
    return init_to_sample(site)
Parameters
  • model (callable) – 一个Pyro模型。

  • init_loc_fn (callable) – 每个站点的初始化函数。 请参阅 初始化 部分以获取可用的函数。

  • create_plates (可调用) – 一个可选的函数,输入与 model() 相同的 *args,**kwargs 并返回一个 pyro.plate 或可迭代的 plates。未返回的 plates 将像往常一样自动创建。这对于数据子采样非常有用。

forward(*args, **kwargs)[来源]

一个自动指南,具有与基础model相同的*args, **kwargs

注意

此方法由Module内部使用。 用户应改用__call__()

Returns

一个字典,将样本站点名称映射到采样值。

Return type

dict

median(*args, **kwargs)[source]

返回每个潜在变量的后验中值。

Returns

一个字典,将样本站点名称映射到中位数张量。

Return type

dict

training: bool

自动连续

class AutoContinuous(model, init_loc_fn=<function init_to_median>)[source]

基础类:pyro.infer.autoguide.guides.AutoGuide

连续值自动微分变分推断实现的基类 [1]。

这使用了torch.distributions.transforms来将每个受限的潜在变量转换为无约束空间,然后将所有变量连接成一个单一的无约束潜在变量。每个派生类都实现了一个get_posterior()方法,返回这个单一无约束潜在变量的分布。

假设模型结构和潜在维度是固定的,并且所有潜在变量都是连续的。

Parameters

model (callable) – 一个 Pyro 模型

参考:

[1] Automatic Differentiation Variational Inference,

阿尔普·库库埃尔比尔,达斯汀·特兰,拉杰什·兰加纳特,安德鲁·格尔曼,大卫·M·布莱

Parameters
  • model (callable) – 一个Pyro模型。

  • init_loc_fn (callable) – 每个站点的初始化函数。 请参阅 初始化 部分以获取可用的函数。

get_base_dist()[来源]

返回后验的基本分布,当重新参数化为TransformedDistribution时。这不应依赖于模型的*args, **kwargs

posterior = TransformedDistribution(self.get_base_dist(), self.get_transform(*args, **kwargs))
Returns

TorchDistribution 实例表示基础分布。

get_transform(*args, **kwargs)[source]

返回当后验被重新参数化为TransformedDistribution时应用于基础分布的变换。这可能取决于模型的*args, **kwargs

posterior = TransformedDistribution(self.get_base_dist(), self.get_transform(*args, **kwargs))
Returns

一个 Transform 实例。

get_posterior(*args, **kwargs)[source]

返回后验分布。

sample_latent(*args, **kwargs)[source]

在给定与基础model相同的*args, **kwargs的情况下,对编码的潜在变量进行采样。

forward(*args, **kwargs)[source]

一个自动指南,具有与基础model相同的*args, **kwargs

注意

此方法由Module内部使用。 用户应改用__call__()

Returns

一个字典,将样本站点名称映射到采样值。

Return type

dict

median(*args, **kwargs)[source]

返回每个潜在变量的后验中值。

Returns

一个字典,将样本站点名称映射到中位数张量。

Return type

dict

quantiles(quantiles, *args, **kwargs)[source]

返回每个潜在变量的后验分位数。示例:

print(guide.quantiles([0.05, 0.5, 0.95]))
Parameters

quantiles (torch.Tensorlist) – 一个介于0和1之间的请求分位数列表。

Returns

一个字典,将样本站点名称映射到分位数值的张量。

Return type

dict

training: bool

自动多元正态分布

class AutoMultivariateNormal(model, init_loc_fn=<function init_to_median>, init_scale=0.1)[source]

基础类: pyro.infer.autoguide.guides.AutoContinuous

这个AutoContinuous的实现使用多元正态分布的Cholesky分解来构建整个潜在空间的引导。该引导不依赖于模型的*args, **kwargs

用法:

guide = AutoMultivariateNormal(model)
svi = SVI(model, guide, ...)

默认情况下,均值向量由init_loc_fn()初始化,而Cholesky因子初始化为单位矩阵乘以一个小因子。

Parameters
  • model (callable) – 一个生成模型。

  • init_loc_fn (callable) – 每个站点的初始化函数。 请参阅 初始化 部分以获取可用的函数。

  • init_scale (float) – 每个(未约束转换的)潜在变量的标准差的初始比例。

scale_constraint = SoftplusPositive(lower_bound=0.0)
scale_tril_constraint = UnitLowerCholesky()
get_base_dist()[source]
get_transform(*args, **kwargs)[source]
get_posterior(*args, **kwargs)[source]

返回一个多元正态后验分布。

training: bool

自动对角正态

class AutoDiagonalNormal(model, init_loc_fn=<function init_to_median>, init_scale=0.1)[source]

基础类: pyro.infer.autoguide.guides.AutoContinuous

这个AutoContinuous的实现使用了一个具有对角协方差矩阵的正态分布来构建整个潜在空间的引导。该引导不依赖于模型的*args, **kwargs

用法:

guide = AutoDiagonalNormal(model)
svi = SVI(model, guide, ...)

默认情况下,均值向量初始化为零,尺度初始化为单位矩阵乘以一个小因子。

Parameters
  • model (callable) – 一个生成模型。

  • init_loc_fn (callable) – 每个站点的初始化函数。 请参阅 初始化 部分以获取可用的函数。

  • init_scale (float) – 每个(未约束转换的)潜在变量的标准差的初始比例。

scale_constraint = SoftplusPositive(lower_bound=0.0)
get_base_dist()[来源]
get_transform(*args, **kwargs)[source]
get_posterior(*args, **kwargs)[source]

返回一个对角正态后验分布。

training: bool

自动低秩多元正态分布

class AutoLowRankMultivariateNormal(model, init_loc_fn=<function init_to_median>, init_scale=0.1, rank=None)[source]

基础类: pyro.infer.autoguide.guides.AutoContinuous

这个AutoContinuous的实现使用了一个低秩加对角线的多元正态分布来在整个潜在空间上构建一个引导。这个引导不依赖于模型的*args, **kwargs

用法:

guide = AutoLowRankMultivariateNormal(model, rank=10)
svi = SVI(model, guide, ...)

默认情况下,cov_diag 被初始化为一个小的常数,而 cov_factor 被随机初始化,使得平均而言 cov_factor.matmul(cov_factor.t()) 的规模与 cov_diag 相同。

Parameters
  • model (callable) – 一个生成模型。

  • rank (intNone) – 协方差矩阵低秩部分的秩。 默认值约为 sqrt(latent dim)

  • init_loc_fn (callable) – 每个站点的初始化函数。 请参阅 初始化 部分以获取可用的函数。

  • init_scale (float) – 每个(未约束变换的)潜在变量的标准差的近似初始比例。

scale_constraint = SoftplusPositive(lower_bound=0.0)
get_posterior(*args, **kwargs)[源代码]

返回一个低秩多元正态后验分布。

training: bool

自动归一化流

class AutoNormalizingFlow(model, init_transform_fn)[源代码]

基础类: pyro.infer.autoguide.guides.AutoContinuous

这个AutoContinuous的实现使用了一个通过对角正态分布进行一系列双射变换(例如各种TransformModule子类)来构建整个潜在空间的指南。该指南不依赖于模型的*args, **kwargs

用法:

transform_init = partial(iterated, block_autoregressive,
                         repeats=2)
guide = AutoNormalizingFlow(model, transform_init)
svi = SVI(model, guide, ...)
Parameters
  • model (callable) – 一个生成模型

  • init_transform_fn – 一个可调用对象,当提供潜在维度时,返回一个Transform的实例,或者如果变换具有可训练参数,则返回TransformModule

get_base_dist()[来源]
get_transform(*args, **kwargs)[source]
get_posterior(*args, **kwargs)[源代码]
training: bool

AutoIAFNormal

class AutoIAFNormal(model, hidden_dim=None, init_loc_fn=None, num_transforms=1, **init_transform_kwargs)[source]

基础类:pyro.infer.autoguide.guides.AutoNormalizingFlow

这个AutoContinuous的实现使用了一个通过AffineAutoregressive变换的对角正态分布来构建整个潜在空间的指南。该指南不依赖于模型的*args, **kwargs

用法:

guide = AutoIAFNormal(model, hidden_dim=latent_dim)
svi = SVI(model, guide, ...)
Parameters
  • model (callable) – 一个生成模型

  • hidden_dim (list[int]) – IAF中的隐藏维度数量

  • init_loc_fn (callable) –

    每个站点的初始化函数。 请参阅 初始化 部分以获取可用的函数。

    警告

    此参数仅用于保持向后兼容性, 实际上没有效果。

  • num_transforms (int) – 连续使用的AffineAutoregressive变换的数量。

  • init_transform_kwargs – 其他关键字参数由 affine_autoregressive() 接受。

training: bool

自动拉普拉斯近似

class AutoLaplaceApproximation(model, init_loc_fn=<function init_to_median>)[source]

基础类: pyro.infer.autoguide.guides.AutoContinuous

拉普拉斯近似(二次近似)在无约束空间中通过多元正态分布近似后验 \(\log p(z | x)\)。在内部,它使用Delta分布在整个(无约束的)潜在空间上构建一个MAP指南。其 协方差由在z的MAP点处的\(-\log p(x, z)\)的Hessian矩阵的逆给出。

用法:

delta_guide = AutoLaplaceApproximation(model)
svi = SVI(model, delta_guide, ...)
# ...then train the delta_guide...
guide = delta_guide.laplace_approximation()

默认情况下,均值向量被初始化为经验先验中位数。

Parameters
  • model (callable) – 一个生成模型

  • init_loc_fn (callable) – 每个站点的初始化函数。 请参阅 初始化 部分以获取可用的函数。

get_posterior(*args, **kwargs)[源代码]

返回用于MAP推断的Delta后验分布。

laplace_approximation(*args, **kwargs)[来源]

返回一个AutoMultivariateNormal实例,其后验的locscale_tril由拉普拉斯近似给出。

training: bool

自动离散并行

class AutoDiscreteParallel(model, *, create_plates=None)[source]

基础类:pyro.infer.autoguide.guides.AutoGuide

一个离散的均值场指南,它为模型中的每个离散站点学习一个潜在的离散分布。

forward(*args, **kwargs)[source]

一个自动指南,具有与基础model相同的*args, **kwargs

注意

此方法由Module内部使用。 用户应改用__call__()

Returns

一个字典,将样本站点名称映射到采样值。

Return type

dict

training: bool

自动结构化

class AutoStructured(model, *, conditionals: Union[str, Dict[str, Union[str, Callable]]] = 'mvn', dependencies: Union[str, Dict[str, Dict[str, Union[str, Callable]]]] = 'linear', init_loc_fn: Callable = <function init_to_feasible>, init_scale: float = 0.1, create_plates: Optional[Callable] = None)[源代码]

基础类:pyro.infer.autoguide.guides.AutoGuide

结构化指南,其条件分布为Delta、Normal、MultivariateNormal或通过可调用函数定义,其潜在变量可以在无约束空间中线性依赖,或通过可调用函数的剪切依赖。

用法:

def model(data):
    x = pyro.sample("x", dist.LogNormal(0, 1))
    with pyro.plate("plate", len(data)):
        y = pyro.sample("y", dist.Normal(0, 1))
        pyro.sample("z", dist.Normal(y, x), obs=data)

# Either fully automatic...
guide = AutoStructured(model)

# ...or with specified conditional and dependency types...
guide = AutoStructured(
    model, conditionals="normal", dependencies="linear"
)

# ...or with custom dependency structure and distribution types.
guide = AutoStructured(
    model=model,
    conditionals={"x": "normal", "y": "delta"},
    dependencies={"x": {"y": "linear"}},
)

一旦训练完成,本指南可以与 StructuredReparam 一起使用,以预处理模型用于HMC和NUTS推理。

注意

如果你声明了一个高维下游变量对低维上游变量的依赖关系,你可能希望为该权重使用较低的学习率,例如:

def optim_config(param_name):
    config = {"lr": 0.01}
    if "deps.my_downstream.my_upstream" in param_name:
        config["lr"] *= 0.1
    return config

adam = pyro.optim.Adam(optim_config)
Parameters
  • model (callable) – 一个Pyro模型。

  • 条件 – 可以是单一的分布类型,也可以是一个字典,将每个潜在变量名称映射到一个分布类型。分布类型可以是字符串,如{“delta”, “normal”, “mvn”},或者是一个可调用对象,该对象返回一个来自零均值(或近似中心)噪声分布的样本(这样的可调用对象通常在内部调用pyro.param()pyro.sample())。

  • dependencies – 依赖类型,或者是一个将每个站点名称映射到其上游依赖的依赖类型的字典。如果只提供了一个依赖类型,依赖结构将被推断。依赖类型要么是字符串“linear”,要么是一个将扁平化的上游扰动映射到扁平化的下游扰动的可调用对象。字符串“linear”等同于nn.Linear(upstream.numel(), downstream.numel(), bias=False)。依赖不能包含循环或自环。

  • init_loc_fn (callable) – 每个站点的初始化函数。 请参阅 初始化 部分以获取可用的函数。

  • init_scale (float) – 每个(未约束转换的)潜在变量的标准差的初始比例。

  • create_plates (可调用) – 一个可选的函数,输入与 model() 相同的 *args,**kwargs 并返回一个 pyro.plate 或可迭代的 plates。未返回的 plates 将像往常一样自动创建。这对于数据子采样非常有用。

scale_constraint = SoftplusPositive(lower_bound=0.0)
scale_tril_constraint = SoftplusLowerCholesky()
get_deltas()
forward(*args, **kwargs)[source]
median(*args, **kwargs)[source]
training: bool

自动高斯

class AutoGaussian(*args, **kwargs)[source]

基础类:pyro.infer.autoguide.guides.AutoGuide

具有最优条件独立结构的高斯指南。

这相当于一个全秩的AutoMultivariateNormal指南, 但具有由模型中的依赖性和板块确定的稀疏精度矩阵[1]。根据模型结构,这可能具有比AutoMultivariateNormal渐近更好的统计效率。

本指南实现了多种计算后端。所有后端都使用相同的统计最优参数化。默认的“dense”后端具有与AutoMultivariateNormal相似的计算复杂度。实验性的“funsor”后端在时间和空间上可以渐近地更便宜(使用高斯张量变量消除[2,3]),但会产生较大的常数开销。“funsor”后端需要funsor,可以通过pip install pyro-ppl[funsor]安装。

本指南目前不依赖于模型的 *args, **kwargs

示例:

guide = AutoGaussian(model)
svi = SVI(model, guide, ...)

使用实验性funsor后端的示例:

!pip install pyro-ppl[funsor]
guide = AutoGaussian(model, backend="funsor")
svi = SVI(model, guide, ...)

参考文献

[1] S.Webb, A.Goliński, R.Zinkov, N.Siddharth, T.Rainforth, Y.W.Teh, F.Wood (2018)

“生成模型的有效摊销推理的忠实反演” https://dl.acm.org/doi/10.5555/3327144.3327229

[2] F.Obermeyer, E.Bingham, M.Jankowiak, J.Chiu, N.Pradhan, A.M.Rush, N.Goodman

(2019) “用于板块因子图的张量变量消除” http://proceedings.mlr.press/v97/obermeyer19a/obermeyer19a.pdf

[3] F. Obermeyer, E. Bingham, M. Jankowiak, D. Phan, J. P. Chen

(2019) “概率编程中的功能张量” https://arxiv.org/abs/1910.10775

Parameters
  • model (callable) – 一个Pyro模型。

  • init_loc_fn (callable) – 每个站点的初始化函数。 请参阅 初始化 部分以获取可用的函数。

  • init_scale (float) – 每个(未约束转换的)潜在变量的标准差的初始比例。

  • backend (str) – 用于执行高斯张量变量消除的后端。默认为“dense”;其他选项包括“funsor”。

scale_constraint = SoftplusPositive(lower_bound=0.0)
forward(*args, **kwargs) Dict[str, torch.Tensor][来源]
median(*args, **kwargs) Dict[str, torch.Tensor][source]

返回每个潜在变量的后验中值。

Returns

一个字典,将样本站点名称映射到中位数张量。

Return type

dict

training: bool

自动消息发送器

class AutoMessenger(model: Callable, *, amortized_plates: Tuple[str, ...] = ())[源代码]

基础类: pyro.poutine.guide.GuideMessenger, pyro.nn.module.PyroModule

GuideMessenger 自动指南的基类。

Parameters
  • model (callable) – 一个Pyro模型。

  • amortized_plates (tuple) – 一个包含应共享引导参数的板块名称的元组。这对于子采样非常有用,其中引导参数可以在所有板块之间共享。

call(*args, **kwargs)[源代码]

调用forward()并将指南的参数值作为tuple而不是dict返回的方法,这是JIT跟踪的要求。与forward()不同,此方法可以通过torch.jit.trace_module()进行跟踪。

警告

一旦PyTorch JIT跟踪器开始接受dict作为有效返回类型,此方法可能会被移除。请参阅问题 _

training: bool

自动普通信使

class AutoNormalMessenger(model: Callable, *, init_loc_fn: Callable = functools.partial(<function init_to_mean>, fallback=<function init_to_feasible>), init_scale: float = 0.1, amortized_plates: Tuple[str, ...] = ())[source]

基础类:pyro.infer.autoguide.effect.AutoMessenger

AutoMessenger 具有均值场正态后验。

任何站点的平均场后验都是一个转换后的正态分布。 这个后验等同于 AutoNormalAutoDiagonalNormal,但允许 通过子类化进行自定义。

派生类可以在特定站点覆盖get_posterior()的行为,并仅将均值场正态行为作为默认行为,例如:

def model(data):
    a = pyro.sample("a", dist.Normal(0, 1))
    b = pyro.sample("b", dist.Normal(0, 1))
    c = pyro.sample("c", dist.Normal(a + b, 1))
    pyro.sample("obs", dist.Normal(c, 1), obs=data)

class MyGuideMessenger(AutoNormalMessenger):
    def get_posterior(self, name, prior):
        if name == "c":
            # Use a custom distribution at site c.
            bias = pyro.param("c_bias", lambda: torch.zeros(()))
            weight = pyro.param("c_weight", lambda: torch.ones(()),
                                constraint=constraints.positive)
            scale = pyro.param("c_scale", lambda: torch.ones(()),
                               constraint=constraints.positive)
            a = self.upstream_value("a")
            b = self.upstream_value("b")
            loc = bias + weight * (a + b)
            return dist.Normal(loc, scale)
        # Fall back to mean field.
        return super().get_posterior(name, prior)

请注意,上面我们手动计算了 loc = bias + weight * (a + b)。 或者,我们可以通过设置 loc = bias + weight * prior.loc 来重用模型端的计算:

class MyGuideMessenger_v2(AutoNormalMessenger):
    def get_posterior(self, name, prior):
        if name == "c":
            # Use a custom distribution at site c.
            bias = pyro.param("c_bias", lambda: torch.zeros(()))
            scale = pyro.param("c_scale", lambda: torch.ones(()),
                               constraint=constraints.positive)
            weight = pyro.param("c_weight", lambda: torch.ones(()),
                                constraint=constraints.positive)
            loc = bias + weight * prior.loc
            return dist.Normal(loc, scale)
        # Fall back to mean field.
        return super().get_posterior(name, prior)
Parameters
  • model (callable) – 一个Pyro模型。

  • init_loc_fn (callable) – 每个站点的初始化函数。 请参阅 初始化 部分以获取可用的函数。

  • init_scale (float) – 每个(未约束转换的)潜在变量的标准差的初始比例。

  • amortized_plates (tuple) – 一个包含应共享引导参数的板块名称的元组。这对于子采样非常有用,其中引导参数可以在所有板块之间共享。

get_posterior(name: str, prior: pyro.distributions.distribution.Distribution) Union[pyro.distributions.distribution.Distribution, torch.Tensor][source]
median(*args, **kwargs)[source]
training: bool

自动层次化普通消息传递器

class AutoHierarchicalNormalMessenger(model: Callable, *, init_loc_fn: Callable = functools.partial(<function init_to_mean>, fallback=<function init_to_feasible>), init_scale: float = 0.1, amortized_plates: Tuple[str, ...] = (), init_weight: float = 1.0, hierarchical_sites: Optional[list] = None)[source]

基础类:pyro.infer.autoguide.effect.AutoNormalMessenger

AutoMessenger 具有均值场正态后验,条件依赖于所有依赖项。

在任何位置的均值场后验都是一个转换后的正态分布,其均值取决于该位置在模型中的依赖值:

loc_total = loc + transform.inv(prior.mean) * weight

其中prior.mean的值取决于模型中的上游站点, loc是未转换空间中均值的独立组成部分, weight是按元素缩放先验均值的因子。 这种方法不适用于没有均值的分布。

派生类可以覆盖特定的站点,并将其简单地用作默认值,请参阅AutoNormalMessenger文档以获取示例。

Parameters
  • model (callable) – 一个Pyro模型。

  • init_loc_fn (callable) – 每个站点的初始化函数。 请参阅 初始化 部分以获取可用的函数。

  • init_scale (float) – 每个(未约束转换的)潜在变量的标准差的初始比例。

  • init_weight (float) – 每个潜在变量的后验均值中层次站点贡献权重的初始值。

  • hierarchical_sites (list) – 具有层次依赖关系的潜在变量(模型站点)列表。 如果为None,则假定所有站点都具有层次依赖关系。如果为None,对于没有上游站点的站点, 指南的位置和权重表示/学习与先验的偏差。

weight_type = 'element-wise'
get_posterior(name: str, prior: pyro.distributions.distribution.Distribution) Union[pyro.distributions.distribution.Distribution, torch.Tensor][源代码]
median(*args, **kwargs)[source]
training: bool

自回归信使

class AutoRegressiveMessenger(model: Callable, *, init_loc_fn: Callable = functools.partial(<function init_to_mean>, fallback=<function init_to_feasible>), init_scale: float = 0.1, amortized_plates: Tuple[str, ...] = ())[source]

基础类:pyro.infer.autoguide.effect.AutoMessenger

AutoMessenger 使用先验依赖结构递归地进行仿射变换的先验。

任何位置的后验都是先验的学习仿射变换,条件是上游后验样本。仿射变换在无约束空间中操作。这仅支持连续的潜在变量。

派生类可以在特定站点覆盖get_posterior()的行为,并将回归行为简单地用作默认值,例如:

class MyGuideMessenger(AutoRegressiveMessenger):
    def get_posterior(self, name, prior):
        if name == "x":
            # Use a custom distribution at site x.
            loc = pyro.param("x_loc", lambda: torch.zeros(prior.shape()))
            scale = pyro.param("x_scale", lambda: torch.ones(prior.shape())),
                               constraint=constraints.positive
            return dist.Normal(loc, scale).to_event(prior.event_dim())
        # Fall back to autoregressive.
        return super().get_posterior(name, prior)

警告

本指南目前不支持基于jit的elbos。

Parameters
  • model (callable) – 一个Pyro模型。

  • init_loc_fn (callable) – 每个站点的初始化函数。 请参阅 初始化 部分以获取可用的函数。

  • init_scale (float) – 每个(未约束转换的)潜在变量的标准差的初始比例。

  • amortized_plates (tuple) – 一个包含应共享引导参数的板块名称的元组。这对于子采样非常有用,其中引导参数可以在所有板块之间共享。

get_posterior(name: str, prior: pyro.distributions.distribution.Distribution) Union[pyro.distributions.distribution.Distribution, torch.Tensor][source]
training: bool

初始化

pyro.infer.autoguide.initialization 模块包含用于自动引导的初始化函数。

初始化的标准接口是一个函数,该函数输入一个Pyro跟踪site字典,并返回一个适当大小的value,作为指南估计的初始约束值。

init_to_feasible(site=None)[source]

初始化为任意可行点,忽略分布参数。

init_to_sample(site=None)[source]

从先验中随机抽样进行初始化。

init_to_median(site=None, num_samples=15, *, fallback: Optional[Callable] = <function init_to_feasible>)[source]

初始化为先验中位数;如果均值未定义,则回退到 fallback(默认为 init_to_feasible())。

Parameters

fallback (callable) – 对于未在 values 中指定的站点,使用回退初始化策略。

Raises

ValueError – 如果 fallback=None 并且在 values 中没有为站点提供值。

init_to_mean(site=None, *, fallback: Optional[Callable] = <function init_to_median>)[source]

初始化为先验均值;如果均值未定义,则回退到 fallback(默认为 init_to_median())。

Parameters

fallback (callable) – 回退初始化策略,适用于未在 values 中指定的站点。

Raises

ValueError – 如果 fallback=None 并且在 values 中没有为站点提供值。

init_to_uniform(site: Optional[dict] = None, radius: float = 2.0)[source]

在无约束域的(-radius, radius)区域内随机初始化一个点。

Parameters

radius (float) – 指定在无约束域中绘制初始点的范围。

init_to_value(site: Optional[dict] = None, values: dict = {}, *, fallback: Optional[Callable] = <function init_to_uniform>)[source]

初始化为values中指定的值。对于未出现在values中的站点,回退到fallback(默认为init_to_uniform())策略。

Parameters
  • values (dict) – 以站点名称为键的初始值字典。

  • fallback (callable) – 回退初始化策略,适用于未在 values 中指定的站点。

Raises

ValueError – 如果 fallback=None 并且在 values 中没有为站点提供值。

init_to_generated(site=None, generate=<function <lambda>>)[source]

初始化为由回调函数generate返回的另一种初始化策略,该回调函数在每次模型执行时调用一次。

这类似于 init_to_value(),但可以在每次模型执行时生成不同的(例如随机的)值。例如,要生成值并返回 init_to_value,你可以定义:

def generate():
    values = {"x": torch.randn(100), "y": torch.rand(5)}
    return init_to_value(values=values)

my_init_fn = init_to_generated(generate=generate)
Parameters

generate (callable) – 一个可调用对象,返回另一个初始化函数,例如返回一个init_to_value(values={...}),其中填充了一个随机样本的字典。

class InitMessenger(init_fn)[source]

基础类: pyro.poutine.messenger.Messenger

通过使用初始化策略中的值替换.sample()调用来初始化站点。这主要用于自动引导类的内部使用。

Parameters

init_fn (callable) – 一个初始化函数。