优化¶
模块 pyro.optim 为 Pyro 中的优化提供支持。它特别提供了 PyroOptim,用于包装 PyTorch 优化器并管理动态生成参数的优化器(有关讨论,请参阅教程 SVI Part I)。任何自定义优化算法也在此处。
Pyro 优化器¶
- is_scheduler(optimizer) bool [source]¶
帮助方法,用于确定 PyTorch 对象是 PyTorch 优化器(返回 false)还是包装在 LRScheduler 中的优化器(例如
ReduceLROnPlateau
或_LRScheduler
的子类,返回 true)。
- class PyroOptim(optim_constructor: Union[Callable, torch.optim.optimizer.Optimizer, Type[torch.optim.optimizer.Optimizer]], optim_args: Union[Dict, Callable[[...], Dict]], clip_args: Optional[Union[Dict, Callable[[...], Dict]]] = None)[source]¶
基类:
object
用于包装 torch.optim.Optimizer 对象,有助于管理动态生成参数的包装器。
- 参数
optim_constructor – 一个 torch.optim.Optimizer
optim_args – 优化器的学习参数字典或返回此类字典的可调用对象
clip_args – clip_norm 和/或 clip_value 参数的字典或返回此类字典的可调用对象
- AdagradRMSProp(optim_args: Dict) pyro.optim.optim.PyroOptim [source]¶
- ClippedAdam(optim_args: Dict) pyro.optim.optim.PyroOptim [source]¶
- DCTAdam(optim_args: Dict) pyro.optim.optim.PyroOptim [source]¶
将
pyro.optim.dct_adam.DCTAdam
包装为PyroOptim
。
- class PyroLRScheduler(scheduler_constructor, optim_args: Dict, clip_args: Optional[Dict] = None)[source]¶
基类:
pyro.optim.optim.PyroOptim
用于包装
lr_scheduler
对象的包装器,用于调整动态生成参数的学习率。- 参数
scheduler_constructor – 一个
lr_scheduler
optim_args – 优化器的学习参数字典或返回此类字典的可调用对象。必须包含键 'optimizer',其值为 pytorch 优化器
clip_args – clip_norm 和/或 clip_value 参数的字典或返回此类字典的可调用对象。
示例
optimizer = torch.optim.SGD scheduler = pyro.optim.ExponentialLR({'optimizer': optimizer, 'optim_args': {'lr': 0.01}, 'gamma': 0.1}) svi = SVI(model, guide, scheduler, loss=TraceGraph_ELBO()) for i in range(epochs): for minibatch in DataLoader(dataset, batch_size): svi.step(minibatch) scheduler.step()
- class AdagradRMSProp(params, eta: float = 1.0, delta: float = 1e-16, t: float = 0.1)[source]¶
基类:
torch.optim.optimizer.Optimizer
实现了 Adagrad 算法和 RMSProp 的融合。有关精确的更新方程,请参见参考文献 [1] 中的方程 10 和 11。
参考文献: [1] ‘自动微分变分推断 (Automatic Differentiation Variational Inference)’,Alp Kucukelbir, Dustin Tran, Rajesh Ranganath, Andrew Gelman, David M. Blei URL: https://arxiv.org/abs/1603.00788 [2] ‘课程 6.5 RmsProp: 用梯度的近期大小的移动平均值来除以梯度 (Lecture 6.5 RmsProp: Divide the gradient by a running average of its recent magnitude)’,Tieleman, T. 和 Hinton, G.,COURSERA: 机器学习神经网络 (Neural Networks for Machine Learning)。 [3] ‘在线学习和随机优化的自适应次梯度方法 (Adaptive subgradient methods for online learning and stochastic optimization)’,Duchi, John, Hazan, E 和 Singer, Y。
参数
- 参数
- class ClippedAdam(params, lr: float = 0.001, betas: Tuple = (0.9, 0.999), eps: float = 1e-08, weight_decay=0, clip_norm: float = 10.0, lrd: float = 1.0)[source]¶
基类:
torch.optim.optimizer.Optimizer
- 参数
params – 要优化的参数的可迭代对象或定义参数组的字典
lr – 学习率(默认值:1e-3)
betas (Tuple) – 用于计算梯度及其平方的移动平均值的系数(默认值:(0.9, 0.999))
eps – 添加到分母中以提高数值稳定性的项(默认值:1e-8)
weight_decay – 权重衰减(L2 惩罚)(默认值:0)
clip_norm – 梯度被裁剪到的范数大小(默认值:10.0)
lrd – 学习率衰减的速率(默认值:1.0)
对 torch.optim.Adam 中实现的 Adam 算法的小修改,以包含梯度裁剪和学习率衰减。
参考文献
随机优化方法 (A Method for Stochastic Optimization),Diederik P. Kingma, Jimmy Ba https://arxiv.org/abs/1412.6980
- class HorovodOptimizer(pyro_optim: pyro.optim.optim.PyroOptim, **horovod_kwargs)[source]¶
基类:
pyro.optim.optim.PyroOptim
用于
PyroOptim
优化器的分布式包装器。此类包装了一个
PyroOptim
对象,类似于horovod.torch.DistributedOptimizer()
包装torch.optim.Optimizer
的方式。注意
这需要安装
horovod.torch
,例如通过pip install pyro[horovod]
。详情请参阅 https://horovod.readthedocs.io/en/stable/install.html- 参数
一个 Pyro 优化器实例。
- 参数
**horovod_kwargs – 传递给
horovod.torch.DistributedOptimizer()
的额外参数。
PyTorch 优化器¶
- Adadelta(optim_args, clip_args=None)¶
将
torch.optim.Adadelta
包装为PyroOptim
。
- Adagrad(optim_args, clip_args=None)¶
将
torch.optim.Adagrad
包装为PyroOptim
。
- Adam(optim_args, clip_args=None)¶
将
torch.optim.Adam
包装为PyroOptim
。
- AdamW(optim_args, clip_args=None)¶
将
torch.optim.AdamW
包装为PyroOptim
。
- SparseAdam(optim_args, clip_args=None)¶
将
torch.optim.SparseAdam
包装为PyroOptim
。
- Adamax(optim_args, clip_args=None)¶
将
torch.optim.Adamax
包装为PyroOptim
。
- ASGD(optim_args, clip_args=None)¶
将
torch.optim.ASGD
包装为PyroOptim
。
- SGD(optim_args, clip_args=None)¶
将
torch.optim.SGD
包装为PyroOptim
。
- RAdam(optim_args, clip_args=None)¶
将
torch.optim.RAdam
包装为PyroOptim
。
- Rprop(optim_args, clip_args=None)¶
将
torch.optim.Rprop
包装为PyroOptim
。
- RMSprop(optim_args, clip_args=None)¶
将
torch.optim.RMSprop
包装为PyroOptim
。
- NAdam(optim_args, clip_args=None)¶
将
torch.optim.NAdam
包装为PyroOptim
。
- LRScheduler(optim_args, clip_args=None)¶
将
torch.optim.LRScheduler
包装为PyroLRScheduler
。
- LambdaLR(optim_args, clip_args=None)¶
将
torch.optim.LambdaLR
包装为PyroLRScheduler
。
- MultiplicativeLR(optim_args, clip_args=None)¶
将
torch.optim.MultiplicativeLR
包装为PyroLRScheduler
。
- StepLR(optim_args, clip_args=None)¶
将
torch.optim.StepLR
包装为PyroLRScheduler
。
- MultiStepLR(optim_args, clip_args=None)¶
将
torch.optim.MultiStepLR
包装为PyroLRScheduler
。
- ConstantLR(optim_args, clip_args=None)¶
将
torch.optim.ConstantLR
包装为PyroLRScheduler
。
- LinearLR(optim_args, clip_args=None)¶
将
torch.optim.LinearLR
包装为PyroLRScheduler
。
- ExponentialLR(optim_args, clip_args=None)¶
将
torch.optim.ExponentialLR
包装为PyroLRScheduler
。
- SequentialLR(optim_args, clip_args=None)¶
将
torch.optim.SequentialLR
包装为PyroLRScheduler
。
- PolynomialLR(optim_args, clip_args=None)¶
将
torch.optim.PolynomialLR
包装为PyroLRScheduler
。
- CosineAnnealingLR(optim_args, clip_args=None)¶
将
torch.optim.CosineAnnealingLR
包装为PyroLRScheduler
。
- ChainedScheduler(optim_args, clip_args=None)¶
将
torch.optim.ChainedScheduler
包装为PyroLRScheduler
。
- ReduceLROnPlateau(optim_args, clip_args=None)¶
将
torch.optim.ReduceLROnPlateau
包装为PyroLRScheduler
。
- CyclicLR(optim_args, clip_args=None)¶
将
torch.optim.CyclicLR
包装为PyroLRScheduler
。
- CosineAnnealingWarmRestarts(optim_args, clip_args=None)¶
将
torch.optim.CosineAnnealingWarmRestarts
包装为PyroLRScheduler
。
- OneCycleLR(optim_args, clip_args=None)¶
将
torch.optim.OneCycleLR
包装为PyroLRScheduler
。
高阶优化器¶
- class MultiOptimizer[source]¶
基类:
object
利用高阶导数的优化器基类。
高阶优化器通常使用
torch.autograd.grad()
而不是torch.Tensor.backward()
,因此需要与通常的 Pyro 和 PyTorch 优化器不同的接口。在此接口中,step()
方法输入一个待微分的loss
张量,并且反向传播会在优化器内部触发一次或多次。派生类必须实现
step()
以计算导数并原地更新参数。示例
tr = poutine.trace(model).get_trace(*args, **kwargs) loss = -tr.log_prob_sum() params = {name: site['value'].unconstrained() for name, site in tr.nodes.items() if site['type'] == 'param'} optim.step(loss, params)
- step(loss: torch.Tensor, params: Dict) None [source]¶
给定可微分的
loss
张量,对参数执行原地优化步骤。注意,这会分离更新后的张量。
- 参数
loss (torch.Tensor) – 一个可微分的张量,待最小化。有些优化器要求此张量可多次微分。
params (dict) – 一个字典,将参数名称映射到存储在参数存储中的无约束值。
- get_step(loss: torch.Tensor, params: Dict) Dict [source]¶
给定可微分的
loss
张量,计算参数的优化步骤,并返回更新后的值。注意,这会保留更新后张量的导数。
- 参数
loss (torch.Tensor) – 一个可微分的张量,待最小化。有些优化器要求此张量可多次微分。
params (dict) – 一个字典,将参数名称映射到存储在参数存储中的无约束值。
- 返回
一个字典,将参数名称映射到更新后的无约束值。
- 返回类型
- class PyroMultiOptimizer(optim: pyro.optim.optim.PyroOptim)[source]¶
基类:
pyro.optim.multi.MultiOptimizer
用于将
PyroOptim
对象包装在MultiOptimizer
接口中的外观类。- step(loss: torch.Tensor, params: Dict) None [source]¶
- class TorchMultiOptimizer(optim_constructor: torch.optim.optimizer.Optimizer, optim_args: Dict)[source]¶
基类:
pyro.optim.multi.PyroMultiOptimizer
用于将
Optimizer
对象包装在MultiOptimizer
接口中的外观类。
- class MixedMultiOptimizer[source]¶
基类:
pyro.optim.multi.MultiOptimizer
用于为不同参数组合不同的
MultiOptimizer
实例的容器类。- 参数
parts (list) – 一个包含
(names, optim)
对的列表,其中每个names
是参数名称列表,每个optim
是一个用于指定参数的MultiOptimizer
或PyroOptim
对象。所有names
组合起来应该覆盖所有期望优化的参数。- 引发
ValueError – 如果任何名称被多个优化器优化。
- step(loss: torch.Tensor, params: Dict)[source]¶
- get_step(loss: torch.Tensor, params: Dict) Dict [source]¶
- class Newton(trust_radii: Dict = {})[source]¶
基类:
pyro.optim.multi.MultiOptimizer
实现了
MultiOptimizer
,对批量低维变量执行牛顿更新,可选地通过每个参数的trust_radius
进行正则化。详情请参阅newton_step()
。get_step()
的结果将是可微分的,但step()
的更新值将是分离的。- 参数
trust_radii (dict) – 一个字典,将参数名称映射到信任区域半径。缺失的名称将使用未正则化的牛顿更新,相当于无限信任半径。
- get_step(loss: torch.Tensor, params: Dict)[source]¶