nn.Module模块提供了网络骨架,nn.functional提供了各式各样的损失函数,而Autograd又自动实现了求导与反向传播机制,这时候还缺少一个如何进行模型优化、加速收敛的模块,nn.optim应运而生。
nn.optim中包含了各种常见的优化算法,包括随机梯度下降算法SGD(Stochatic Gradient Descent,随机梯度下降)、Adam(Adaptive Moment Esitmation)、Adagrad、RMSProp。

SGD方法
梯度下降(Gradient Descent)是迭代法中的一种,是指沿着梯度下降的方向求解极小值,一般可用于求解最小二乘问题。在深度学习中,当前更常使用的是SGD算法,以一个小批次(Mini Batch)的数据为单位,计算一个批次的梯度,然后反向传播优化,并更新参数

梯度影响学习参数更新的程度,是训练中非常重要的一个超参数。SGD优化算法的好处主要有两点:

  • 分担训练压力:当前数据集通常数量较多,尺度较大,使用较大的数据同时训练显然不现实,SGD则提供了小批量训练并优化网络的方法,有效分担了GPU等计算硬件的压力

  • 加快收敛:由于SGD一次只采用少量的数据,这意味着会有更多次的梯度更新,在某些数据集中,其收敛速度会更快

    当然SGD也有其自身的缺点:

  • 初始学习率难以确定:SGD算法依赖于一个较好的学习率,但设置初始学习率并不直观,并且对于不同的任务,其初始值也不固定

  • 容易陷入局部最优:SGD虽然采用了小步快走的思想,但是容易陷入局部的最优解,难以跳出
    有效解决局部最优的做法是增加动量(momentum),其概念来自于物理学,在此是指更新的时候一定程度上保留之前更新的方向,同时利用当前批次的梯度进行微调,得到最终的梯度,可以增加优化的稳定性,降低陷入局部最优难以跳出的风险,其函数如下:

    当此次梯度下降方向与上次相同时,梯度会变大,也就会加速收敛。当梯度方向不同时,梯度会变小,从而一直梯度更新的震荡,增加稳定性。在训练的中后期,梯度会在局部极小值周围震荡,此时g_t接近于0,但动量的存在使得梯度更新并不是0,从而有可能跳出局部最优解。
    最然SGD算法并不完美,但在当今的深度学习算法中仍然取得了大量的应用,使用SGD有时候能够获得性能更佳的模型

Adam方法
在SGD之外,Adam是另一个较为常见的优化算法。Adam利用了梯度的一阶矩与二阶矩动态地估计调整每一个参数的学习率,是一种学习率自适应算法
Adam的有点在于经过调整后,每一次迭代的学习率都在一个确定的范围之内,使得参数更新更加平稳。此外,Adam算法可以使模型更快收敛,尤其使用与一些深层网络,或者神经网络较为复杂的场景

我们计算了梯度的指数平均和梯度平方的指数平均(等式1和等式2)。为了得出学习步幅,等式3在学习率上乘以梯度的平均(类似动量),除以梯度平方平均的均方根(类似RMSProp)。等式4是权重更新步骤
超参数β1一般取0.9,β2一般取0.99,φ 一般定为1e-10

下面利用PyTorch来搭建常用的优化器,传入的参数包括网络中需要学习优化的Tensor对象、学习率和权值衰减等

from torch import optim
optimizer = optim.SGD(model.parameters(),lr=0.001,momentum=0.9)
optimizer = optim.Adam([var1,var2],lr=0.0001)

下面通过一个三层感知机的例子来介绍基本的优化过程:
mlp.py

from torch import nnclass MLP(nn.Module):def __init__(self, in_dim, hid_dim1, hid_dim2, out_dim):super(MLP, self).__init__()#通过Sequential快速搭建三层的感知机self.layer = nn.Sequential(nn.Linear(in_dim, hid_dim1),nn.ReLU(),nn.Linear(hid_dim1, hid_dim2),nn.ReLU(),nn.Linear(hid_dim2, out_dim),nn.ReLU())def forward(self, x):x = self.layer(x)return x

终端:

>>> import torch
>>> from mlp import MLP
>>> from torch import optim
>>> from torch import nn
>>> #实例化模型,并赋予每一层的维度
>>> model = MLP(28*28,300,200,10)
>>> model    #打印model的结构,由3个全连接层组成
MLP((layer): Sequential((0): Linear(in_features=784, out_features=300, bias=True)(1): ReLU()(2): Linear(in_features=300, out_features=200, bias=True)(3): ReLU()(4): Linear(in_features=200, out_features=10, bias=True)(5): ReLU())
)
>>> #采用SGD优化器,学习率为0.01
>>> optimizer = optim.SGD(params = model.parameters(),lr=0.01)
>>> data = torch.randn(10,28*28)
>>> data
tensor([[-0.9042, -0.2768,  1.0551,  ...,  0.4825, -0.6427, -0.7589],[-1.3073, -0.5553, -0.4306,  ..., -0.9818, -1.1010, -0.1162],[-1.9565,  0.6977, -0.6221,  ...,  0.0488, -0.6585, -0.3977],...,[-1.6100,  0.5664,  0.1511,  ...,  0.2569,  0.8622, -2.1218],[-0.9872, -0.3189,  0.1302,  ..., -0.2465, -2.3916,  1.4722],[-0.7321,  0.6455,  1.4625,  ..., -0.5394,  0.4357, -0.1728]])
>>> output = model(data)
>>> #由于是10个分类,因此label元素从0到9,一共10个样本
>>> label = torch.Tensor([1,0,4,7,9,3,4,5,3,2]).long()
>>> label
tensor([1, 0, 4, 7, 9, 3, 4, 5, 3, 2])
>>> #求损失
>>> criterion = nn.CrossEntropyLoss()
>>> loss = criterion(output,label)
>>> loss
tensor(2.2849, grad_fn=<NllLossBackward>)
>>> #清空梯度,在每次优化前都需要进行此操作
>>> optimizer.zero_grad()
>>> #损失的反向传播
>>> loss.backward()
>>> #利用优化器进行梯度更新
>>> optimizer.step()

对于训练过程中的学习率调整,需要注意以下两点:

  • 学习率动态调整:对于训练过程中动态的调整学习率,可以在迭代次数超过一定值后,重新赋予optim优化器新的学习率
  • 不同参数层分配不同的学习率:优化器也可以很方便地实现将不同的网络层分配成不同的学习率,即对于特殊的层单独赋予学习率其余的保持默认的整体学习率,具体实例如下:
#对于model中需要单独赋予学习率的层,如special层,则使用‘lr’关键字单独赋予
optimizer = optim.SGD([{'params': model.special.parameters(),'lr': 0.001},{'prarms': model.base.parameters()},lr=0.0001]

PyTorch基础:神经网络工具箱torch.nn(优化器nn.optim)相关推荐

  1. NLP 神经网络训练慎用 Adam 优化器

    https://www.jianshu.com/p/48e71b72ca67 NLP 神经网络训练慎用 Adam 优化器 theoqian关注 12019.02.10 16:01:45字数 499阅读 ...

  2. Pytorch框架中SGD&Adam优化器以及BP反向传播入门思想及实现

    因为这章内容比较多,分开来叙述,前面先讲理论后面是讲代码.最重要的是代码部分,结合代码去理解思想. SGD优化器 思想: 根据梯度,控制调整权重的幅度 公式: 权重(新) = 权重(旧) - 学习率 ...

  3. 【Pytorch神经网络理论篇】 10 优化器模块+退化学习率

    1 优化器模块的作用 1.1 反向传播的核心思想 反向传播的意义在于告诉模型我们需要将权重修改到什么数值可以得到最优解,在开始探索合适权重的过程中,正向传播所生成的结果与实际标签的目标值存在误差,反向 ...

  4. pytorch学习笔记十二:优化器

    前言 机器学习中的五个步骤:数据 --> 模型 --> 损失函数 --> 优化器 --> 迭代训练,通过前向传播,得到模型的输出和真实标签之间的差异,也就是损失函数,有了损失函 ...

  5. PyTorch 实现批训练和 Optimizer 优化器

    批训练 import torch import torch.utils.data as DataBATCH_SIZE = 5x = torch.linspace(1, 10, 10) # this i ...

  6. 【Pytorch学习笔记三】Pytorch神经网络包nn和优化器optm(一个简单的卷积神经网络模型的搭建)

    文章目录 一, 神经网络包nn 1.1定义一个网络 1.2 损失函数 二.优化器 nn构建于 Autograd之上,可用来定义和运行神经网络, PyTorch Autograd 让我们定义计算图和计算 ...

  7. Pytorch:优化器、损失函数与深度神经网络框架

    Pytorch: 优化器.损失函数与深度神经网络框架 Copyright: Jingmin Wei, Pattern Recognition and Intelligent System, Schoo ...

  8. PyTorch基础-Adam优化器使用-06

    当不知道使用什么优化器的时候可以使用adam优化器 代码 import numpy as np import torch from torch import nn,optim from torch.a ...

  9. 一文详解Pytorch中的优化器Optimizer

    本文将结合源码与代码示例详细解析Optimizer的五大方法. 1. 前言 优化器主要用在模型训练阶段,用于更新模型中可学习的参数.torch.optim提供了多种优化器接口,比如Adam.RAdam ...

  10. pytorch adagrad_【学习笔记】Pytorch深度学习—优化器(二)

    点击文末 阅读原文,体验感更好哦! 前面学习过了Pytorch中优化器optimizer的基本属性和方法,优化器optimizer的主要功能是 "管理模型中的可学习参数,并利用参数的梯度gr ...

最新文章

  1. “分布式哈希”和“一致性哈希”的概念与算法实现
  2. owncloud nginx php,nginx配置owncloud记录。
  3. tensorflow训练神经网络时loss出现nan的问题
  4. pscad与matlab接口,PSCAD/EMTDC与Matlab接口研究
  5. CentOS出错You don#39;t have permission to access on this server
  6. MP3 Toolkit(音频剪辑常用软件工具箱) | 音频剪辑软件免费版哪个好用?
  7. python实现遗传算法
  8. 拖延症测试皮肤软件,桌面时钟软件
  9. 常见网络延迟测量方法
  10. 安装xposed(解决xposed问题)
  11. “世界很美好,值得你为之奋斗”我只同意后半句。
  12. ps制作的html手机怎么使用,ps制作手机的教程
  13. echarts世界地图,国家名称翻译
  14. 小芳同学的错题总结(十四)
  15. 使用for循环同时便利两个列表
  16. C++——迪杰斯特拉算法弗洛伊德算法(DijkstraFloyd)for Neuedu
  17. 兔年伊始谈闲书:三体-乌合之众-百年孤独 和《猫城记》(随笔)
  18. 流量消费透明化成为运营商新课题
  19. 卷积神经网络在深度学习中新发展的5篇论文推荐
  20. 微信没有备份怎么恢复聊天记录?还能恢复吗?

热门文章

  1. [英语] 自建专业词典
  2. 解决新版浏览器autoplay不能自动播放的问题
  3. 软考试题合格率如何?
  4. 计算机语言中print是什么意思,PASCAL 语言中print是什么意思?
  5. 【基础篇】SpringBoot 自定义 Banner
  6. DNS 动态域名解析
  7. 快手正与NBA洽谈战略合作,涉及内容版权和商业化
  8. 仿照苏宁易购小程序页面
  9. Thread-Specific Data(线程私有数据)
  10. AS179-92LF pHEMT GaAs FET单刀双掷(SPDT)开关SKYWORKS