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) 算法的包装类。特定的 MCMC 算法是 TraceKernel 的实例,需要作为
kernel
参数提供给构造函数。注意
当 num_chains > 1 时,使用 Python 多进程并行运行多个链。这伴随着 Python 多进程通常需要注意的事项,例如用于初始化
kernel
的模型必须可通过 pickle 序列化,并且性能/约束将依赖于平台(例如,Windows 中只有“spawn”上下文可用)。此功能尚未在 Windows 平台上进行广泛测试。- 参数
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()
- 参数
args –
MCMCKernel.setup
接收的可选位置参数。kwargs –
MCMCKernel.setup
接收的可选关键字参数。
- summary(prob=0.9)[source]¶
打印一个摘要表,显示从后验分布获得的样本的诊断信息。显示的诊断信息包括均值、标准差、中位数、90% 置信区间、
effective_sample_size()
和split_gelman_rubin()
。- 参数
prob (float) – 置信区间内样本的概率质量。
StreamingMCMC¶
- 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)[source]¶
基类:
pyro.infer.mcmc.api.AbstractMCMC
StreamingMCMC 以流式方式计算所需的统计信息。此类不保留样本,仅保留汇总统计信息。这对于运行内存密集型模型很有用,尤其是当您只关心特定统计信息时(在 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)[source]¶
基类:
pyro.infer.mcmc.mcmc_kernel.MCMCKernel
简单的哈密尔顿蒙特卡洛核,其中
step_size
和num_steps
需要用户明确指定。参考文献
[1] MCMC Using Hamiltonian Dynamics,Radford M. Neal
- 参数
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) – 一个标志,决定是否在热身阶段使用对偶平均方案自适应调整
step_size
。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 (NUTS) 核,提供了一种高效便捷的运行哈密尔顿蒙特卡洛的方法。积分器在每次调用
sample
时动态调整步数,以确保哈密尔顿轨迹的最佳长度 [1]。因此,生成的样本通常比HMC
核生成的样本具有更低的自相关性。可选地,NUTS 核还提供了在热身阶段自适应调整步长的能力。请参考 棒球示例,了解如何使用 NUTS 在 Pyro 中进行贝叶斯推断。
参考文献
- [1] The No-U-turn sampler: adaptively setting path lengths in Hamiltonian Monte Carlo,
Matthew D. Hoffman 和 Andrew Gelman。
- [2] A Conceptual Introduction to Hamiltonian Monte Carlo,
Michael Betancourt
- [3] Slice Sampling,
Radford M. Neal
- 参数
model – 包含 Pyro 基本元素的 Python 可调用对象。
potential_fn – Python 可调用对象,计算势能,输入是实数支持参数的字典。
step_size (float) – 决定 Verlet 积分器在使用哈密尔顿动力学计算轨迹时单步的大小。如果未指定,将设置为 1。
adapt_step_size (bool) – 一个标志,决定是否在热身阶段使用对偶平均方案自适应调整
step_size
。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])
RandomWalkKernel¶
- class RandomWalkKernel(model, init_step_size: float = 0.1, target_accept_prob: float = 0.234)[source]¶
基类:
pyro.infer.mcmc.mcmc_kernel.MCMCKernel
一个简单的无梯度核,在模型的无约束潜在空间中利用各向同性高斯随机游走。控制核方差的步长在热身期间通过一个简单的自适应方案进行调整,该方案以用户提供的接受概率为目标。
- 参数
示例
>>> 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¶
BlockMassMatrix¶
- class BlockMassMatrix(init_scale=1.0)[source]¶
基类:
object
实验性 (EXPERIMENTAL) 此类用于自适应调整(逆)质量矩阵,并提供有用的方法来计算涉及质量矩阵的代数项。
质量矩阵将具有块结构,可通过使用
configure()
方法并传入相应的结构化 mass_matrix_shape 参数来指定。- 参数
init_scale (float) – 用于构建初始质量矩阵的初始尺度。
- property inverse_mass_matrix¶
- kinetic_grad(r)[source]¶
计算动能关于动量 r 的梯度。这等价于计算给定动量 r 的速度。
- 参数
r (dict) – 一个字典,将位点名称映射到张量动量。
- 返回
一个字典,将位点名称映射到相应的梯度
- 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 中消耗采样参数的轨迹。
- 参数
model – 一个包含 Pyro 基本元素的 Pyro 模型。
model_args (tuple) – model 接收的可选位置参数。
model_kwargs (dict) – model 接收的可选关键字参数。
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) – 包含无约束空间中用于启动马尔可夫链的初始张量的字典。
- 返回
一个元组,包含 (initial_params, potential_fn, transforms, prototype_trace)