优化

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

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

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

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

get_state() Dict[source]

获取与所有优化器相关的状态,以字典形式返回,包含键值对(参数名称,优化状态字典)

set_state(state_dict: Dict) None[source]

使用从先前调用get_state()获得的状态设置与所有优化器关联的状态

save(filename: str) None[source]
Parameters

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

将优化器状态保存到磁盘

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

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

从磁盘加载优化器状态

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

pyro.optim.adagrad_rmsprop.AdagradRMSPropPyroOptim包装在一起。

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

pyro.optim.clipped_adam.ClippedAdamPyroOptim包装在一起。

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]

基础:pyro.optim.optim.PyroOptim

一个用于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()
__call__(params: Union[List, ValuesView], *args, **kwargs) None[source]
step(*args, **kwargs) None[源代码]

接受与PyTorch调度器相同的参数 (例如,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] ‘自动微分变分推断’, 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
  • 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]

执行单个优化步骤。

Parameters

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

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

step(closure: Optional[Callable] = None) Optional[Any][源代码]
Parameters

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

执行单个优化步骤。

class HorovodOptimizer(pyro_optim: pyro.optim.optim.PyroOptim, **horovod_kwargs)[源代码]

基础: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

Param

一个Pyro优化器实例。

Parameters

**horovod_kwargs – 传递给 horovod.torch.DistributedOptimizer()的额外参数。

__call__(params: Union[List, ValuesView], *args, **kwargs) None[源代码]

PyTorch 优化器

Adadelta(optim_args, clip_args=None)

使用PyroOptim包装torch.optim.Adadelta

Adagrad(optim_args, clip_args=None)

使用PyroOptim包装torch.optim.Adagrad

Adam(optim_args, clip_args=None)

使用PyroOptim包装torch.optim.Adam

AdamW(optim_args, clip_args=None)

使用PyroOptim包装torch.optim.AdamW

SparseAdam(optim_args, clip_args=None)

使用PyroOptim包装torch.optim.SparseAdam

Adamax(optim_args, clip_args=None)

使用PyroOptim包装torch.optim.Adamax

ASGD(optim_args, clip_args=None)

使用PyroOptim包装torch.optim.ASGD

SGD(optim_args, clip_args=None)

使用PyroOptim包装torch.optim.SGD

RAdam(optim_args, clip_args=None)

使用PyroOptim包装torch.optim.RAdam

Rprop(optim_args, clip_args=None)

使用PyroOptim包装torch.optim.Rprop

RMSprop(optim_args, clip_args=None)

使用PyroOptim包装torch.optim.RMSprop

NAdam(optim_args, clip_args=None)

使用PyroOptim包装torch.optim.NAdam

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

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

Facade 用于将 Optimizer 对象 包装在 MultiOptimizer 接口中。

class MixedMultiOptimizer(parts: List)[source]

基础类:pyro.optim.multi.MultiOptimizer

容器类,用于组合不同的MultiOptimizer实例以处理不同的参数。

Parameters

部分 (列表) – 一个包含 (names, optim) 对的列表,其中每个 names 是一个参数名称的列表,每个 optim 是一个 MultiOptimizerPyroOptim 对象 用于指定的参数。所有的 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]