优化¶
模块 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对象的包装器。
- Parameters
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]¶
使用
PyroOptim
包装pyro.optim.dct_adam.DCTAdam
。
- class PyroLRScheduler(scheduler_constructor, optim_args: Dict, clip_args: Optional[Dict] = None)[source]¶
-
一个用于
lr_scheduler
对象的包装器,用于调整动态生成参数的学习率。- Parameters
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] ‘自动微分变分推断’, Alp Kucukelbir, Dustin Tran, Rajesh Ranganath, Andrew Gelman, David M. Blei URL: https://arxiv.org/abs/1603.00788 [2] ‘第6.5讲 RmsProp:将梯度除以其最近幅度的运行平均值’, Tieleman, T. 和 Hinton, G., COURSERA: 机器学习中的神经网络. [3] ‘在线学习和随机优化的自适应次梯度方法’, Duchi, John, Hazan, E 和 Singer, Y.
参数:
- Parameters
- 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
- Parameters
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算法进行了小幅修改,以包括梯度裁剪和学习率衰减。
参考
一种随机优化方法, Diederik P. Kingma, Jimmy Ba https://arxiv.org/abs/1412.6980
- class HorovodOptimizer(pyro_optim: pyro.optim.optim.PyroOptim, **horovod_kwargs)[源代码]¶
-
PyroOptim
优化器的分布式封装。这个类包装了一个
PyroOptim
对象,类似于horovod.torch.DistributedOptimizer()
包装一个torch.optim.Optimizer
的方式。注意
这需要安装
horovod.torch
,例如通过pip install pyro[horovod]
。详情请参见 https://horovod.readthedocs.io/en/stable/install.html- Param
一个Pyro优化器实例。
- Parameters
**horovod_kwargs – 传递给
horovod.torch.DistributedOptimizer()
的额外参数。
PyTorch 优化器¶
- Adadelta(optim_args, clip_args=None)¶
- Adagrad(optim_args, clip_args=None)¶
- Adam(optim_args, clip_args=None)¶
- AdamW(optim_args, clip_args=None)¶
- SparseAdam(optim_args, clip_args=None)¶
- Adamax(optim_args, clip_args=None)¶
- ASGD(optim_args, clip_args=None)¶
- SGD(optim_args, clip_args=None)¶
- RAdam(optim_args, clip_args=None)¶
- Rprop(optim_args, clip_args=None)¶
- RMSprop(optim_args, clip_args=None)¶
- NAdam(optim_args, clip_args=None)¶
- LRScheduler(optim_args, clip_args=None)¶
使用
PyroLRScheduler
包装torch.optim.LRScheduler
。
- LambdaLR(optim_args, clip_args=None)¶
使用
PyroLRScheduler
包装torch.optim.LambdaLR
。
- MultiplicativeLR(optim_args, clip_args=None)¶
使用
PyroLRScheduler
包装torch.optim.MultiplicativeLR
。
- StepLR(optim_args, clip_args=None)¶
使用
PyroLRScheduler
包装torch.optim.StepLR
。
- MultiStepLR(optim_args, clip_args=None)¶
使用
PyroLRScheduler
包装torch.optim.MultiStepLR
。
- ConstantLR(optim_args, clip_args=None)¶
使用
PyroLRScheduler
包装torch.optim.ConstantLR
。
- LinearLR(optim_args, clip_args=None)¶
使用
PyroLRScheduler
包装torch.optim.LinearLR
。
- ExponentialLR(optim_args, clip_args=None)¶
使用
PyroLRScheduler
包装torch.optim.ExponentialLR
。
- SequentialLR(optim_args, clip_args=None)¶
使用
PyroLRScheduler
包装torch.optim.SequentialLR
。
- PolynomialLR(optim_args, clip_args=None)¶
使用
PyroLRScheduler
包装torch.optim.PolynomialLR
。
- CosineAnnealingLR(optim_args, clip_args=None)¶
使用
PyroLRScheduler
包装torch.optim.CosineAnnealingLR
。
- ChainedScheduler(optim_args, clip_args=None)¶
使用
PyroLRScheduler
包装torch.optim.ChainedScheduler
。
- ReduceLROnPlateau(optim_args, clip_args=None)¶
使用
PyroLRScheduler
包装torch.optim.ReduceLROnPlateau
。
- CyclicLR(optim_args, clip_args=None)¶
使用
PyroLRScheduler
包装torch.optim.CyclicLR
。
- CosineAnnealingWarmRestarts(optim_args, clip_args=None)¶
使用
PyroLRScheduler
包装torch.optim.CosineAnnealingWarmRestarts
。
- OneCycleLR(optim_args, clip_args=None)¶
使用
PyroLRScheduler
包装torch.optim.OneCycleLR
。
高阶优化器¶
- 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
张量执行参数的原地优化步骤。请注意,这会分离更新后的张量。
- Parameters
loss (torch.Tensor) – 一个需要最小化的可微张量。 一些优化器要求这个张量可以多次微分。
params (dict) – 一个字典,将参数名称映射到存储在参数存储中的无约束值。
- get_step(loss: torch.Tensor, params: Dict) Dict [source]¶
计算给定可微
loss
张量的参数优化步骤,返回更新后的值。请注意,这会保留更新张量上的导数。
- Parameters
loss (torch.Tensor) – 一个需要最小化的可微张量。 一些优化器要求这个张量可以多次微分。
params (dict) – 一个将参数名称映射到存储在参数存储中的无约束值的字典。
- Returns
一个字典,将参数名称映射到更新的无约束值。
- Return type
- 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
Facade 用于将
Optimizer
对象 包装在MultiOptimizer
接口中。
- class MixedMultiOptimizer(parts: List)[source]¶
基础类:
pyro.optim.multi.MultiOptimizer
容器类,用于组合不同的
MultiOptimizer
实例以处理不同的参数。- Parameters
部分 (列表) – 一个包含
(names, optim)
对的列表,其中每个names
是一个参数名称的列表,每个optim
是一个MultiOptimizer
或PyroOptim
对象 用于指定的参数。所有的names
应该一起划分所有需要优化的参数。- Raises
ValueError – 如果任何名称被多个优化器优化。
- step(loss: torch.Tensor, params: Dict)[source]¶
- get_step(loss: torch.Tensor, params: Dict) Dict [来源]¶
- class Newton(trust_radii: Dict = {})[source]¶
基础类:
pyro.optim.multi.MultiOptimizer
实现了
MultiOptimizer
,该优化器对批处理的低维变量执行牛顿更新,并可选地通过每个参数的trust_radius
进行正则化。详情请参见newton_step()
。get_step()
的结果将是可微分的,然而从step()
更新的值将被分离。- Parameters
trust_radii (dict) – 一个将参数名称映射到信任区域半径的字典。缺少的名称将使用未正则化的牛顿更新,相当于无限的信任半径。
- get_step(loss: torch.Tensor, params: Dict)[source]¶