torch.optim

torch.optim是一个实现了各种优化算法的库。大部分常用的方法得到支持,并且接口具备足够的通用性,使得未来能够集成更加复杂的方法。

如何使用optimizer

为了使用torch.optim,你需要构建一个optimizer对象。这个对象能够保持当前参数状态并基于计算得到的梯度进行参数更新。

构建

为了构建一个Optimizer,你需要给它一个包含了需要优化的参数(必须都是Variable对象)的iterable。然后,你可以设置optimizer的参
数选项,比如学习率,权重衰减,等等。

例子:

optimizer = optim.SGD(model.parameters(), lr = 0.01, momentum=0.9)
optimizer = optim.Adam([var1, var2], lr = 0.0001)

为每个参数单独设置选项

Optimizer也支持为每个参数单独设置选项。若想这么做,不要直接传入Variable的iterable,而是传入dict的iterable。每一个dict都分别定
义了一组参数,并且包含一个param键,这个键对应参数的列表。其他的键应该optimizer所接受的其他参数的关键字相匹配,并且会被用于对这组参数的
优化。

注意:

你仍然能够传递选项作为关键字参数。在未重写这些选项的组中,它们会被用作默认值。当你只想改动一个参数组的选项,但其他参数组的选项不变时,这是
非常有用的。

例如,当我们想指定每一层的学习率时,这是非常有用的:

optim.SGD([
                {'params': model.base.parameters()},
                {'params': model.classifier.parameters(), 'lr': 1e-3}
            ], lr=1e-2, momentum=0.9)

这意味着model.base的参数将会使用1e-2的学习率,model.classifier的参数将会使用1e-3的学习率,并且0.9的momentum将会被用于所
有的参数。

进行单次优化

所有的optimizer都实现了step()方法,这个方法会更新所有的参数。它能按两种方式来使用:

optimizer.step()

这是大多数optimizer所支持的简化版本。一旦梯度被如backward()之类的函数计算好后,我们就可以调用这个函数。

例子

for input, target in dataset:
    optimizer.zero_grad()
    output = model(input)
    loss = loss_fn(output, target)
    loss.backward()
    optimizer.step()

optimizer.step(closure)

一些优化算法例如Conjugate Gradient和LBFGS需要重复多次计算函数,因此你需要传入一个闭包去允许它们重新计算你的模型。这个闭包应当清空梯度,
计算损失,然后返回。

例子:

for input, target in dataset:
    def closure():
        optimizer.zero_grad()
        output = model(input)
        loss = loss_fn(output, target)
        loss.backward()
        return loss
    optimizer.step(closure)

算法

class torch.optim.Optimizer(params, defaults) [source]

Base class for all optimizers.

参数:

  • params (iterable) —— Variable 或者 dict的iterable。指定了什么参数应当被优化。
  • defaults —— (dict):包含了优化选项默认值的字典(一个参数组没有指定的参数选项将会使用默认值)。

load_state_dict(state_dict) [source]

加载optimizer状态

参数:

state_dict (dict) —— optimizer的状态。应当是一个调用state_dict()所返回的对象。

state_dict() [source]

dict返回optimizer的状态。

它包含两项。

  • state - 一个保存了当前优化状态的dict。optimizer的类别不同,state的内容也会不同。
  • param_groups - 一个包含了全部参数组的dict。

step(closure) [source]

进行单次优化 (参数更新).

参数:

  • closure (callable) – 一个重新评价模型并返回loss的闭包,对于大多数参数来说是可选的。

zero_grad() [source]

清空所有被优化过的Variable的梯度.

class torch.optim.Adadelta(params, lr=1.0, rho=0.9, eps=1e-06, weight_decay=0)[source]

实现Adadelta算法。

它在ADADELTA: An Adaptive Learning Rate Method.中被提出。

参数:

  • params (iterable) – 待优化参数的iterable或者是定义了参数组的dict
  • rho (float, 可选) – 用于计算平方梯度的运行平均值的系数(默认:0.9)
  • eps (float, 可选) – 为了增加数值计算的稳定性而加到分母里的项(默认:1e-6)
  • lr (float, 可选) – 在delta被应用到参数更新之前对它缩放的系数(默认:1.0)
  • weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认: 0)

step(closure) [source]

进行单次优化 (参数更新).

参数:

  • closure (callable) – 一个重新评价模型并返回loss的闭包,对于大多数参数来说是可选的。

class torch.optim.Adagrad(params, lr=0.01, lr_decay=0, weight_decay=0)[source]

实现Adagrad算法。

它在 Adaptive Subgradient Methods for Online Learning and Stochastic Optimization中被提出。

参数:

  • params (iterable) – 待优化参数的iterable或者是定义了参数组的dict
  • lr (float, 可选) – 学习率(默认: 1e-2)
  • lr_decay (float, 可选) – 学习率衰减(默认: 0)
  • weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认: 0)

step(closure) [source]

进行单次优化 (参数更新).

参数:

  • closure (callable) – 一个重新评价模型并返回loss的闭包,对于大多数参数来说是可选的。

class torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)[source]

实现Adam算法。

它在Adam: A Method for Stochastic Optimization中被提出。

参数:

  • params (iterable) – 待优化参数的iterable或者是定义了参数组的dict
  • lr (float, 可选) – 学习率(默认:1e-3)
  • betas (Tuple[floatfloat], 可选) – 用于计算梯度以及梯度平方的运行平均值的系数(默认:0.9,0.999)
  • eps (float, 可选) – 为了增加数值计算的稳定性而加到分母里的项(默认:1e-8)
  • weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认: 0)

step(closure) [source]

进行单次优化 (参数更新).

参数:

  • closure (callable) – 一个重新评价模型并返回loss的闭包,对于大多数参数来说是可选的。

class torch.optim.Adamax(params, lr=0.002, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)[source]

实现Adamax算法(Adam的一种基于无穷范数的变种)。

它在Adam: A Method for Stochastic Optimization中被提出。

参数:

  • params (iterable) – 待优化参数的iterable或者是定义了参数组的dict
  • lr (float, 可选) – 学习率(默认:2e-3)
  • betas (Tuple[floatfloat], 可选) – 用于计算梯度以及梯度平方的运行平均值的系数
  • eps (float, 可选) – 为了增加数值计算的稳定性而加到分母里的项(默认:1e-8)
  • weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认: 0)

step(closure) [source]

进行单次优化 (参数更新).

参数:

  • closure (callable) – 一个重新评价模型并返回loss的闭包,对于大多数参数来说是可选的。

class torch.optim.ASGD(params, lr=0.01, lambd=0.0001, alpha=0.75, t0=1000000.0, weight_decay=0)[source]

实现平均随机梯度下降算法。

它在Acceleration of stochastic approximation by averaging中被提出。

参数:

  • params (iterable) – 待优化参数的iterable或者是定义了参数组的dict
  • lr (float, 可选) – 学习率(默认:1e-2)
  • lambd (float, 可选) – 衰减项(默认:1e-4)
  • alpha (float, 可选) – eta更新的指数(默认:0.75)
  • t0 (float, 可选) – 指明在哪一次开始平均化(默认:1e6)
  • weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认: 0)

step(closure) [source]

进行单次优化 (参数更新).

参数:

  • closure (callable) – 一个重新评价模型并返回loss的闭包,对于大多数参数来说是可选的。

class torch.optim.LBFGS(params, lr=1, max_iter=20, max_eval=None, tolerance_grad=1e-05, tolerance_change=1e-09, history_size=100, line_search_fn=None)[source]

实现L-BFGS算法。

警告

这个optimizer不支持为每个参数单独设置选项以及不支持参数组(只能有一个)

警告

目前所有的参数不得不都在同一设备上。在将来这会得到改进。

注意

这是一个内存高度密集的optimizer(它要求额外的param_bytes * (history_size + 1) 个字节)。如果它不适应内存,尝试减小history size,或者使用不同的算法。

参数:

  • lr (float) – 学习率(默认:1)
  • max_iter (int) – 每一步优化的最大迭代次数(默认:20))
  • max_eval (int) – 每一步优化的最大函数评价次数(默认:max * 1.25)
  • tolerance_grad (float) – 一阶最优的终止容忍度(默认:1e-5)
  • tolerance_change (float) – 在函数值/参数变化量上的终止容忍度(默认:1e-9)
  • history_size (int) – 更新历史的大小(默认:100)

step(closure) [source]

进行单次优化 (参数更新).

参数:

  • closure (callable) – 一个重新评价模型并返回loss的闭包,对于大多数参数来说是可选的。

class torch.optim.RMSprop(params, lr=0.01, alpha=0.99, eps=1e-08, weight_decay=0, momentum=0, centered=False)[source]

实现RMSprop算法。

由G. Hinton在他的课程中提出.

中心版本首次出现在Generating Sequences With Recurrent Neural Networks.

参数:

  • params (iterable) – 待优化参数的iterable或者是定义了参数组的dict
  • lr (float, 可选) – 学习率(默认:1e-2)
  • momentum (float, 可选) – 动量因子(默认:0)
  • alpha (float, 可选) – 平滑常数(默认:0.99)
  • eps (float, 可选) – 为了增加数值计算的稳定性而加到分母里的项(默认:1e-8)
  • centered (bool, 可选) – 如果为True,计算中心化的RMSProp,并且用它的方差预测值对梯度进行归一化
  • weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认: 0)

step(closure) [source]

进行单次优化 (参数更新).

参数:

  • closure (callable) – 一个重新评价模型并返回loss的闭包,对于大多数参数来说是可选的。

class torch.optim.Rprop(params, lr=0.01, etas=(0.5, 1.2), step_sizes=(1e-06, 50))[source]

实现弹性反向传播算法。

参数:

  • params (iterable) – 待优化参数的iterable或者是定义了参数组的dict
  • lr (float, 可选) – 学习率(默认:1e-2)
  • etas (Tuple[floatfloat], 可选) – 一对(etaminus,etaplis), 它们分别是乘法的增加和减小的因子(默认:0.5,1.2)
  • step_sizes (Tuple[floatfloat], 可选) – 允许的一对最小和最大的步长(默认:1e-6,50)

step(closure) [source]

进行单次优化 (参数更新).

参数:

  • closure (callable) – 一个重新评价模型并返回loss的闭包,对于大多数参数来说是可选的。

class torch.optim.SGD(params, lr=, momentum=0, dampening=0, weight_decay=0, nesterov=False)[source]

实现随机梯度下降算法(momentum可选)。

Nesterov动量基于On the importance of initialization and momentum in deep learning中的公式.

参数:

  • params (iterable) – 待优化参数的iterable或者是定义了参数组的dict
  • lr (float) – 学习率
  • momentum (float, 可选) – 动量因子(默认:0)
  • weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认:0)
  • dampening (float, 可选) – 动量的抑制因子(默认:0)
  • nesterov (bool, 可选) – 使用Nesterov动量(默认:False)

例子:

>>> optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
>>> optimizer.zero_grad()
>>> loss_fn(model(input), target).backward()
>>> optimizer.step()

Note

带有动量/Nesterov的SGD的实现稍微不同于Sutskever等人以及其他框架中的实现。

考虑动量的具体情况,更新可以写成

v=ρ∗v+g

p=p−lr∗v

其中,p、g、v和ρ分别是参数、梯度、速度和动量。

这跟Sutskever等人以及其他框架的实现是相反的,它们采用这样的更新

v=ρ∗v+lr∗g

p=p−v

Nesterov的版本也类似地被修改了。

step(closure) [source]

进行单次优化 (参数更新).

参数:

  • closure (callable) – 一个重新评价模型并返回loss的闭包,对于大多数参数来说是可选的。

艾伯特(http://www.aibbt.com/)国内第一家人工智能门户

PyTorch官方中文文档:torch.optim的更多相关文章

  1. PyTorch官方中文文档:torch.optim 优化器参数

    内容预览: step(closure) 进行单次优化 (参数更新). 参数: closure (callable) –...~ 参数: params (iterable) – 待优化参数的iterab ...

  2. PyTorch官方中文文档:torch.nn

    torch.nn Parameters class torch.nn.Parameter() 艾伯特(http://www.aibbt.com/)国内第一家人工智能门户,微信公众号:aibbtcom ...

  3. PyTorch官方中文文档:PyTorch中文文档

    PyTorch中文文档 PyTorch是使用GPU和CPU优化的深度学习张量库. 说明 自动求导机制 CUDA语义 扩展PyTorch 多进程最佳实践 序列化语义 Package参考 torch to ...

  4. PyTorch官方中文文档:torch

    torch 包 torch 包含了多维张量的数据结构以及基于其上的多种数学操作.另外,它也提供了多种工具,其中一些可以更有效地对张量和任意类型进行序列化. 它有CUDA 的对应实现,可以在NVIDIA ...

  5. PyTorch官方中文文档:torch.Tensor

    torch.Tensor torch.Tensor是一种包含单一数据类型元素的多维矩阵. Torch定义了七种CPU tensor类型和八种GPU tensor类型: Data tyoe CPU te ...

  6. PyTorch官方中文文档:自动求导机制

    自动求导机制 本说明将概述Autograd如何工作并记录操作.了解这些并不是绝对必要的,但我们建议您熟悉它,因为它将帮助您编写更高效,更简洁的程序,并可帮助您进行调试. 从后向中排除子图 每个变量都有 ...

  7. ReactNative官方中文文档0.21

    整理了一份ReactNative0.21中文文档,提供给需要的reactnative爱好者.ReactNative0.21中文文档.chm  百度盘下载:ReactNative0.21中文文档 来源: ...

  8. 学习Python 新去处:Python 官方中文文档

    Python 作为世界上最好用的语言,官方支持的文档一直没有中文.小伙伴们已经习惯了原汁原味的英文文档,但如果有官方中文文档,那么查阅或理解速度都会大大提升.本文将介绍隐藏在 Python 官网的中文 ...

  9. django2.0 官方中文文档地址

    django2.0 官方开始发布中文文档了,之前还想着一直翻译完成所有有必要的内容,想着可以省事一些了,打开以后看了一下,发现官方的中文文档还没翻译完成, 现在(2018-7-10)最新章节是是  编 ...

随机推荐

  1. ASM字节码框架学习之动态代理

    ASM字节码操纵框架,可以直接以二进制的形式来来修改已经存在的类或者创建新的类.ASM封装了操作字节码的大部分细节,并提供了非常方便的接口来对字节码进行操作.ASM框架是全功能的,使用ASM字节码框架 ...

  2. 数据分析之pandas教程------数据处理

    目录 1  数据合并 1.1  实现数据库表join功能 1.2  实现union功能 2  数据转换 2.1  轴旋转 2.2  数据转换 2.2.1  去重 2.2.2  对某一列运用函数 2.2 ...

  3. HTML 5.2 新特性介绍

    本文译自 What's New in HTML 5.2? 作者 Ire Aderinokun,是一位前端开发者和 UI 设计师. 就在不到一个月之前,HTML 5.2 成为了 W3C 的官方推荐规范( ...

  4. laravel服务容器-----深入理解控制反转(IoC)和依赖注入(DI)

    首先大家想一想什么是容器,字面意思就是盛放东西的东西,常见的变量,对象属性都是容器,一个容器能够装什么东西,完全在于你对这个容器的定义.有的容器不仅仅只是存文本,变量,而是对象,属性,那么我们通过这种 ...

  5. mac qq怎么删除全部聊天记录

    找到 ./Users/user/Library/Containers/com.tencent.qq/ 删除com.tencent.qq文件夹就行.

  6. CentOS7 修改网卡名称为eth0

    前言 无论是RHEL 7.还是CentOS 7都使用了NetworkManager.service来进行网络管理,当然network服务还是可以继续使用的,但也将会是过渡期的残留品了. 除此之外7版本 ...

  7. CentOS7 安装 Tomcat

    安装 JDK Tomcat 的安装依赖 JDK,在安装 Tomcat 之前需要先安装 Java JDK.输入命令 java -version,如果显示 JDK 版本,证明已经安装了 JDK java ...

  8. PHP中::的使用

    访问静态变量,静态属性,const修饰的变量.

  9. C语言_来了解一下GCC编译器编译C可执行脚本的过程

    GCC简介    Linux系统下的gcc(GNU C Compiler)是GNU推出的功能强大.性能优越的多平台编译器,是GNU的代表作品之一.gcc是可以在多种硬体平台上编译出可执行程序的超级编译 ...

  10. Nexus3将本地jar包添加到仓库

    新建一个文件夹,将要上传的jar包放进去,然后创建一个pom文件,例如xx.jar,pom.xml 首先创建一个目录 方便执行上传的时候url参数 也可以不创建, 上传XML curl -v -u a ...