优化

模块 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 参数的字典或返回此类字典的可调用对象

__call__(params: Union[List, ValuesView], *args, **kwargs) None[source]
参数

params (字符串的可迭代对象) – 参数列表

对 params 中的每个参数执行优化步骤。如果某个参数从未见过,则为其初始化一个优化器。

get_state() Dict[source]

获取与所有优化器关联的状态,其形式为字典,键值对为(参数名称,优化器状态字典)

set_state(state_dict: Dict) None[source]

使用之前调用 get_state() 获取的状态来设置与所有优化器关联的状态

save(filename: str) None[source]
参数

filename (str) – 要保存到的文件名

将优化器状态保存到磁盘

load(filename: str, map_location=None) None[source]
参数
  • filename (str) – 要加载的文件名

  • map_location (function, torch.device, 字符串字典) – torch.load() 的 map_location 参数

从磁盘加载优化器状态

AdagradRMSProp(optim_args: Dict) pyro.optim.optim.PyroOptim[source]

pyro.optim.adagrad_rmsprop.AdagradRMSProp 包装为 PyroOptim

ClippedAdam(optim_args: Dict) pyro.optim.optim.PyroOptim[source]

pyro.optim.clipped_adam.ClippedAdam 包装为 PyroOptim

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()
__call__(params: Union[List, ValuesView], *args, **kwargs) None[source]
step(*args, **kwargs) None[source]

接受与 PyTorch scheduler 相同的参数(例如,ReduceLROnPlateau 的可选参数 loss

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。

参数

参数
  • params – 要优化的参数的可迭代对象或定义参数组的字典

  • eta (float) – 设置步长比例(可选;默认值:1.0)

  • t (float) – t,可选): 动量参数(可选;默认值:0.1)

  • delta (float) – 调制控制步长缩放方式的指数(可选:默认值:1e-16)

share_memory() None[source]
step(closure: Optional[Callable] = None) Optional[Any][source]

执行单个优化步骤。

参数

closure – 一个(可选的)闭包,用于重新评估模型并返回损失。

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

step(closure: Optional[Callable] = None) Optional[Any][source]
参数

closure – 一个可选的闭包,用于重新评估模型并返回损失。

执行单个优化步骤。

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() 的额外参数。

__call__(params: Union[List, ValuesView], *args, **kwargs) None[source]

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) – 一个字典,将参数名称映射到存储在参数存储中的无约束值。

返回

一个字典,将参数名称映射到更新后的无约束值。

返回类型

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 是一个用于指定参数的 MultiOptimizerPyroOptim 对象。所有 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]