MCMC¶
MCMC¶
- class MCMC(kernel, num_samples, warmup_steps=None, initial_params=None, num_chains=1, hook_fn=None, mp_context=None, disable_progbar=False, disable_validation=True, transforms=None, save_params=None)[source]¶
基础类:
pyro.infer.mcmc.api.AbstractMCMC
马尔可夫链蒙特卡罗算法的包装类。具体的MCMC算法是TraceKernel实例,需要作为
kernel
参数提供给构造函数。注意
当num_chains > 1时,使用python多进程来在多个进程中运行并行链。这伴随着python中多进程的常见注意事项,例如用于初始化
kernel
的模型必须可以通过pickle序列化,并且性能/约束将依赖于平台(例如,在Windows中只有“spawn”上下文可用)。这在Windows平台上也没有经过广泛的测试。- Parameters
kernel –
TraceKernel
类的一个实例,当给定一个执行轨迹时,它会从目标(后验)分布中返回另一个样本轨迹。num_samples (int) – 需要生成的样本数量,不包括在预热阶段丢弃的样本。
warmup_steps (int) – 预热迭代次数。在预热阶段生成的样本将被丢弃。如果未提供,默认值与num_samples相同。
num_chains (int) – 并行运行的MCMC链的数量。根据num_chains是1还是大于1,这个类内部会分派到_UnarySampler或_MultiSampler。
initial_params (dict) – 包含在无约束空间中用于启动马尔可夫链的初始张量的字典。前导维度的大小必须与num_chains的大小匹配。如果未指定,参数值将从先验中采样。
hook_fn – 一个Python可调用对象,接受(kernel, samples, stage, i)作为参数。stage可以是sample或warmup,i表示给定阶段的第i个样本。这可以用于实现额外的日志记录,或者更一般地,为每个生成的样本运行任意代码。
mp_context (str) – 当num_chains > 1时使用的多进程上下文。 仅适用于Python 3.5及以上版本。对于CUDA,请使用mp_context=”spawn”。
disable_progbar (bool) – 禁用进度条和诊断更新。
disable_validation (bool) – 禁用分布验证检查。 默认为
True
,禁用验证,因为不同的转换将导致异常。切换到False
以启用验证,或切换到None
以保留现有的全局值。transforms (dict) – 字典,指定了从受限空间到无约束空间的样本点的转换。
save_params (List[str]) – 可选的参数名称子集列表,用于在采样和诊断期间保存。这在具有大量无关变量的模型中非常有用。默认为None,保存所有参数。
- get_samples(num_samples=None, group_by_chain=False)[source]¶
从MCMC运行中获取样本,可能会进行有放回的重新采样。
有关参数详情,请参见:
select_samples
。
- run(*args, **kwargs)[source]¶
运行MCMC以生成样本并填充self._samples。
示例用法:
def model(data): ... nuts_kernel = NUTS(model) mcmc = MCMC(nuts_kernel, num_samples=500) mcmc.run(data) samples = mcmc.get_samples()
- Parameters
args – 由
MCMCKernel.setup
接受的可选参数。kwargs – 可选的由
MCMCKernel.setup
接受的关键字参数。
- summary(prob=0.9)[source]¶
打印一个汇总表,显示从后验获得的样本的诊断信息。显示的诊断信息包括均值、标准差、中位数、90%可信区间、
effective_sample_size()
、split_gelman_rubin()
。- Parameters
prob (float) – 可信区间内样本的概率质量。
流式MCMC¶
- class StreamingMCMC(kernel, num_samples, warmup_steps=None, initial_params=None, statistics=None, num_chains=1, hook_fn=None, disable_progbar=False, disable_validation=True, transforms=None, save_params=None)[源代码]¶
基础类:
pyro.infer.mcmc.api.AbstractMCMC
MCMC以流式方式计算所需的统计量。对于此类,不保留样本,只保留聚合统计量。这对于运行内存消耗大的模型非常有用,我们只关心特定的统计量(特别是在内存受限的环境中,如GPU)。
有关可用的流操作,请参见
streaming
。
MCMCKernel¶
HMC¶
- class HMC(model=None, potential_fn=None, step_size=1, trajectory_length=None, num_steps=None, adapt_step_size=True, adapt_mass_matrix=True, full_mass=False, transforms=None, max_plate_nesting=None, jit_compile=False, jit_options=None, ignore_jit_warnings=False, target_accept_prob=0.8, init_strategy=<function init_to_uniform>, *, min_stepsize: float = 1e-10, max_stepsize: float = 10000000000.0)[源代码]¶
基础类:
pyro.infer.mcmc.mcmc_kernel.MCMCKernel
简单的哈密顿蒙特卡洛核,其中
step_size
和num_steps
需要由用户明确指定。参考文献
[1] 使用哈密顿动力学的MCMC, Radford M. Neal
- Parameters
model – 包含Pyro原语的Python可调用对象。
potential_fn – Python 可调用对象,用于计算势能,输入为真实支持参数的字典。
step_size (float) – 确定在使用哈密顿动力学计算轨迹时,verlet积分器所采取的单个步长的大小。如果未指定,它将设置为1。
trajectory_length (float) – MCMC轨迹的长度。如果未指定,它将设置为
step_size x num_steps
。如果未指定num_steps
,它将设置为\(2\pi\)。num_steps (int) – 模拟哈密顿动力学的离散步数。轨迹结束时的状态将作为提议返回。该值始终等于
int(trajectory_length / step_size)
。adapt_step_size (bool) – 一个标志,用于决定我们是否希望在预热阶段使用双平均方案来调整步长。
adapt_mass_matrix (bool) – 一个标志,用于决定我们是否希望在预热阶段使用Welford方案来调整质量矩阵。
full_mass (bool) – 一个标志,用于决定质量矩阵是密集的还是对角的。
transforms (dict) – 可选的字典,用于指定将具有约束支持的样本站点转换为无约束空间的变换。该变换应该是可逆的,并且实现log_abs_det_jacobian。如果未指定且模型具有约束支持的站点,将应用自动变换,如
torch.distributions.constraint_registry
中所指定的。max_plate_nesting (int) – 可选的最大嵌套次数限制
pyro.plate()
上下文。如果模型包含可以并行枚举的离散采样点,则需要此参数。jit_compile (bool) – 可选参数,表示是否使用PyTorch JIT来跟踪对数密度计算,并在积分器中使用此优化的可执行跟踪。
jit_options (dict) – 一个包含可选参数的字典,用于
torch.jit.trace()
函数。ignore_jit_warnings (bool) – 当
jit_compile=True
时,忽略JIT跟踪器的警告的标志。默认值为False。target_accept_prob (float) – 增加此值将导致步长变小,因此采样将更慢且更稳健。默认为0.8。
init_strategy (callable) – 每个站点的初始化函数。 有关可用函数,请参见初始化部分。
min_stepsize (float) – 适应策略中步长的下限。
max_stepsize (float) – 适应策略中步长的上限。
注意
在内部,质量矩阵将根据潜在变量的名称顺序进行排序,而不是它们在模型中出现的顺序。
示例
>>> true_coefs = torch.tensor([1., 2., 3.]) >>> data = torch.randn(2000, 3) >>> dim = 3 >>> labels = dist.Bernoulli(logits=(true_coefs * data).sum(-1)).sample() >>> >>> def model(data): ... coefs_mean = torch.zeros(dim) ... coefs = pyro.sample('beta', dist.Normal(coefs_mean, torch.ones(3))) ... y = pyro.sample('y', dist.Bernoulli(logits=(coefs * data).sum(-1)), obs=labels) ... return y >>> >>> hmc_kernel = HMC(model, step_size=0.0855, num_steps=4) >>> mcmc = MCMC(hmc_kernel, num_samples=500, warmup_steps=100) >>> mcmc.run(data) >>> mcmc.get_samples()['beta'].mean(0) tensor([ 0.9819, 1.9258, 2.9737])
- property initial_params¶
- property inverse_mass_matrix¶
- property mass_matrix_adapter¶
- property num_steps¶
- property step_size¶
NUTS¶
- class NUTS(model=None, potential_fn=None, step_size=1, adapt_step_size=True, adapt_mass_matrix=True, full_mass=False, use_multinomial_sampling=True, transforms=None, max_plate_nesting=None, jit_compile=False, jit_options=None, ignore_jit_warnings=False, target_accept_prob=0.8, max_tree_depth=10, init_strategy=<function init_to_uniform>)[source]¶
-
No-U-Turn Sampler 内核,提供了一种高效便捷的运行哈密顿蒙特卡洛的方法。积分器在每次调用
sample
时动态调整步数,以确保哈密顿轨迹的最佳长度 [1]。因此,生成的样本通常比由HMC
内核生成的样本具有更低的自相关性。可选地,NUTS 内核还提供了在预热阶段调整步长的能力。参考棒球示例,了解如何在Pyro中使用NUTS进行贝叶斯推断。
参考文献
- [1] The No-U-turn sampler: adaptively setting path lengths in Hamiltonian Monte Carlo,
马修·D·霍夫曼和安德鲁·格尔曼。
- [2] A Conceptual Introduction to Hamiltonian Monte Carlo,
迈克尔·贝坦科特
- [3] Slice Sampling,
拉德福德·M·尼尔
- Parameters
model – 包含Pyro原语的Python可调用对象。
potential_fn – Python 可调用对象,用于计算势能,输入为真实支持参数的字典。
step_size (float) – 确定在使用哈密顿动力学计算轨迹时,verlet积分器所采取的单个步长的大小。如果未指定,它将设置为1。
adapt_step_size (bool) – 一个标志,用于决定我们是否希望在预热阶段使用双平均方案来调整步长。
adapt_mass_matrix (bool) – 一个标志,用于决定我们是否希望在预热阶段使用Welford方案来调整质量矩阵。
full_mass (bool) – 一个标志,用于决定质量矩阵是密集的还是对角的。
use_multinomial_sampling (bool) – 一个标志,用于决定我们是否要使用“多项式采样”或“切片采样”来沿着其轨迹采样候选者。切片采样在原始的NUTS论文[1]中使用,而多项式采样在[2]中建议。默认情况下,此标志设置为True。如果设置为False,NUTS将使用切片采样。
transforms (dict) – 可选的字典,用于指定将具有约束支持的样本站点转换为无约束空间的变换。该变换应该是可逆的,并且实现log_abs_det_jacobian。如果未指定且模型具有约束支持的站点,将应用自动变换,如
torch.distributions.constraint_registry
中所指定的。max_plate_nesting (int) – 可选的最大嵌套次数限制
pyro.plate()
上下文。如果模型包含可以并行枚举的离散采样点,则需要此参数。jit_compile (bool) – 可选参数,表示是否使用PyTorch JIT来跟踪对数密度计算,并在积分器中使用此优化的可执行跟踪。
jit_options (dict) – 一个包含可选参数的字典,用于
torch.jit.trace()
函数。ignore_jit_warnings (bool) – 当
jit_compile=True
时,忽略JIT跟踪器的警告的标志。默认值为False。target_accept_prob (float) – 步长适应方案的目标接受概率。增加此值将导致步长变小,因此采样会更慢但更稳健。默认为0.8。
max_tree_depth (int) – NUTS采样器的倍增方案期间创建的二叉树的最大深度。默认为10。
init_strategy (callable) – 每个站点的初始化函数。 有关可用函数,请参见初始化部分。
示例
>>> true_coefs = torch.tensor([1., 2., 3.]) >>> data = torch.randn(2000, 3) >>> dim = 3 >>> labels = dist.Bernoulli(logits=(true_coefs * data).sum(-1)).sample() >>> >>> def model(data): ... coefs_mean = torch.zeros(dim) ... coefs = pyro.sample('beta', dist.Normal(coefs_mean, torch.ones(3))) ... y = pyro.sample('y', dist.Bernoulli(logits=(coefs * data).sum(-1)), obs=labels) ... return y >>> >>> nuts_kernel = NUTS(model, adapt_step_size=True) >>> mcmc = MCMC(nuts_kernel, num_samples=500, warmup_steps=300) >>> mcmc.run(data) >>> mcmc.get_samples()['beta'].mean(0) tensor([ 0.9221, 1.9464, 2.9228])
随机游走核¶
- class RandomWalkKernel(model, init_step_size: float = 0.1, target_accept_prob: float = 0.234)[source]¶
基础类:
pyro.infer.mcmc.mcmc_kernel.MCMCKernel
简单的无梯度核,利用模型无约束潜在空间中的各向同性高斯随机游走。控制核方差的步长在预热期间通过一个简单的适应方案进行调整,该方案针对用户提供的接受概率。
- Parameters
示例
>>> true_coefs = torch.tensor([1., 2., 3.]) >>> data = torch.randn(2000, 3) >>> dim = 3 >>> labels = dist.Bernoulli(logits=(true_coefs * data).sum(-1)).sample() >>> >>> def model(data): ... coefs_mean = torch.zeros(dim) ... coefs = pyro.sample('beta', dist.Normal(coefs_mean, torch.ones(3))) ... y = pyro.sample('y', dist.Bernoulli(logits=(coefs * data).sum(-1)), obs=labels) ... return y >>> >>> hmc_kernel = RandomWalkKernel(model, init_step_size=0.2) >>> mcmc = MCMC(hmc_kernel, num_samples=200, warmup_steps=100) >>> mcmc.run(data) >>> mcmc.get_samples()['beta'].mean(0) tensor([ 0.9819, 1.9258, 2.9737])
- property initial_params¶
块质量矩阵¶
- class BlockMassMatrix(init_scale=1.0)[source]¶
基础类:
object
实验性 此类用于调整(逆)质量矩阵,并提供有用的方法来计算涉及质量矩阵的代数项。
质量矩阵将具有块结构,可以通过使用
configure()
方法与相应的结构化mass_matrix_shape参数来指定。- Parameters
init_scale (float) – 用于构建初始质量矩阵的初始比例。
- property inverse_mass_matrix¶
- kinetic_grad(r)[source]¶
计算动能相对于动量r的梯度。 它等同于在给定动量r的情况下计算速度。
- Parameters
r (dict) – 一个将站点名称映射到张量动量的字典。
- Returns
字典将站点名称映射到相应的梯度
- property mass_matrix_size¶
一个字典,将站点名称映射到相应质量矩阵的大小。
- scale(r_unscaled, r_prototype)[source]¶
计算 M^{1/2} @ r_unscaled。
请注意,r 是从具有尺度 mass_matrix_sqrt 的高斯分布生成的。此方法将对其进行缩放。
实用工具¶
- initialize_model(model, model_args=(), model_kwargs={}, transforms=None, max_plate_nesting=None, jit_compile=False, jit_options=None, skip_jit_warnings=False, num_chains=1, init_strategy=<function init_to_uniform>, initial_params=None)[source]¶
给定一个带有Pyro原语的Python可调用对象,生成以下使用HMC/NUTS内核进行推理所需的模型特定属性:
使用HMC核采样的初始参数,
一个潜在函数,其输入是无约束空间中的参数字典,
将model的潜在位置转换为无约束空间,
一个原型跟踪,用于MCMC以消耗来自采样参数的跟踪。
- Parameters
model – 一个包含Pyro原语的Pyro模型。
model_args (tuple) – 可选的由model接受的参数。
model_kwargs (dict) – 可选的由model接受的kwargs。
transforms (dict) – 可选的字典,用于指定将具有约束支持的样本站点转换为无约束空间的变换。该变换应该是可逆的,并且实现log_abs_det_jacobian。如果未指定且模型具有约束支持的站点,将应用自动变换,如
torch.distributions.constraint_registry
中所指定的。max_plate_nesting (int) – 可选的最大嵌套次数限制
pyro.plate()
上下文。如果模型包含可以并行枚举的离散采样点,则需要此参数。jit_compile (bool) – 可选参数,表示是否使用PyTorch JIT来跟踪对数密度计算,并在积分器中使用此优化的可执行跟踪。
jit_options (dict) – 一个包含可选参数的字典,用于
torch.jit.trace()
函数。ignore_jit_warnings (bool) – 当
jit_compile=True
时,忽略JIT跟踪器的警告的标志。默认值为False。num_chains (int) – 并行链的数量。如果 num_chains > 1, 返回的 initial_params 将是一个包含 num_chains 个元素的列表。
init_strategy (callable) – 每个站点的初始化函数。 有关可用函数,请参见初始化部分。
initial_params (dict) – 包含在无约束空间中初始张量的字典,用于启动马尔可夫链。
- Returns
一个元组,包含 (initial_params, potential_fn, transforms, prototype_trace)