点击文末 阅读原文,体验感更好哦!

前面学习过了Pytorch中优化器optimizer的基本属性和方法,优化器optimizer的主要功能是 “管理模型中的可学习参数,并利用参数的梯度grad以一定的策略进行更新”。本节内容分为4部分,(1)、(2)首先了解2个重要概念Learning rate学习率和momentum动量,(3)在此基础上,学习Pytorch中的SGD随机梯度下降优化器;(4)最后,了解Pytorch提供的十种优化器。

learning rate 学习率

上节课优化器(一)讲过梯度下降法的更新思路,也就是要求损失函数Loss或者参数朝着梯度的负方向去变化。为了更好的理解梯度下降法,下面给出一个例子。

引例:

图1 梯度下降法公式应用

然而,从上面的例子中可以看出梯度下降法不仅没能使得y(或Loss值)降低至0甚至使得y变得更大了。

引例实验

代码演示梯度下降法全过程。

构造“损失函数”绘制函数$y=4x^2$图像,该y值可类比为Loss值,梯度下降法的目的在于使得Loss值逐步降低至0。

图2 构造损失函数曲线

迭代更新部分此外,当前梯度下降法公式还没有考虑到学习率lr的影响,因此下述实验学习率不设置即为lr=1,最大迭代参数为4。

# -------------- gradient descent -------------

flag = 1

if flag:

iter_rec, loss_rec, x_rec = list(), list(), list()

//当前公式还没有考虑学习率的影响,因此该参数lr设为 1

lr = 1 # /1. /.5 /.2 /.1 /.125

//迭代次数设为 4

max_iteration = 4 # /1. 4 /.5 4 /.2 20 200

for i in range(max_iteration):

//输入x 计算 Loss

y = func(x)

//反向传播计算梯度

y.backward()

print("Iter:{}, X:{:8}, X.grad:{:8}, loss:{:10}".format(

i, x.detach().numpy()[0], x.grad.detach().numpy()[0], y.item()))

x_rec.append(x.item())

//这里的x.data.sub_的 inplace操作可完成参数的更新

x.data.sub_(lr * x.grad) # x -= x.grad 数学表达式意义: x = x - x.grad # 0.5 0.2 0.1 0.125

//执行更新之后,对参数的梯度进行清零

x.grad.zero_()

iter_rec.append(i)

loss_rec.append(y)

对损失函数使用梯度下降法的输出结果

从图3可以看出,迭代4次,Loss值不仅没有降低反而升高到了188万,同时最终参数x的梯度值也达到了$10^3$,直接引发了梯度爆炸现象

图3 对上述函数使用梯度下降法输出结果

学习率为什么使用了梯度下降法,Loss值并没有减小反而增大?观察图1所示梯度下降法的求解过程,可以看出每次迭代时由于梯度grad()较大,从而引起新的参数变大进而导致Loss函数值不降反升,梯度爆炸等现象。因此,为了控制参数更新的步伐,就在原本的公式基础上引入了学习率LR,如下所示。

实验

依次设置学习率为0.5、0.2、0.1、0.125,观察Loss函数值及函数曲线变化情况

# ------------------ gradient descent -------------

flag = 1

if flag:

iter_rec, loss_rec, x_rec = list(), list(), list()

//当前公式还没有考虑学习率的影响,因此该参数lr设为 1

lr = 0.5 # /0.5 /0.2 /0.1 /0.125

//迭代次数设为 4

max_iteration = 4 # /1. 4 /.5 4 /.2 20 200

for i in range(max_iteration):

//输入x 计算 Loss

y = func(x)

//反向传播计算梯度

y.backward()

print("Iter:{}, X:{:8}, X.grad:{:8}, loss:{:10}".format(

i, x.detach().numpy()[0], x.grad.detach().numpy()[0], y.item()))

x_rec.append(x.item())

//这里的x.data.sub_的 inplace操作可完成参数的更新

x.data.sub_(lr * x.grad) # x -= x.grad 数学表达式意义: x = x - x.grad # 0.5 0.2 0.1 0.125

//执行更新之后,对参数的梯度进行清零

x.grad.zero_()

iter_rec.append(i)

loss_rec.append(y)

实验结果

如果预先能知道损失函数Loss的函数表达式,就可以预先求得在学习率为0.125时,Loss就可以直接下降为0。但是通常,是不可能获得损失函数表达式的,因此0.125并不能直接求得。那么,该如何设置学习率呢?下面观察多个学习率之间Loss的变化情况。

多个学习率之间Loss变化情况

实验结果

图4 多学习率Loss曲线的变化情况

< 总结 >

学习率

功能:用来控制更新的步伐

使用:设置学习率时,不能过大否则导致梯度爆炸、Loss值激增现象,也不能太小,这样就导致Loss值很难收敛。

通常设置为0.01.

学习率用来控制更新的步伐;在设置学习率时,不能过大比如0.5、0.3如图4(1)可能导致梯度爆炸、Loss值激增现象;学习率也不能太小,这样就导致Loss值很难收敛,进入收敛需要花费大量时间。

momentum 动量

在优化器中除了学习率还有momentum动量

Momentum(动量、冲量)

结合当前梯度与上一次更新信息,用于当前更新

< 预备知识 >指数加权平均是在时间序列中经常使用的求取平均值的方法,其思想:求取当前时刻的平均值,距离当前时刻越近的参数值参考性越大,所占的权重也就越大,这些权重随着时间间隔增大是成指数下降的。如下图5所示讨论了指数加权平均的计算原理,根据一温度散点图,列写了其计算式。

图5 指数加权平均计算原理

图6 距离当前时刻越远权重成指数衰减下降

由于$\beta$控制着权重的记忆周期,$\beta$值越小,记忆周期越长,作用越远;通常,会设置beta=0.9,beta=0.9的物理意义是更加关注当前时刻10天左右的数据。($\frac{1}{(1-\beta)}=\frac{1}{1-0.9}=10$)

通过上述例子,了解到指数加权平均中具有1个非常重要的参数$\beta$,该$\beta$对应到梯度下降中就是momentum系数。

< momentum加入,随机梯度下降公式更新 >了解了momentum系数,下面就给出Pytorch中加入了momentum系数后,随机梯度下降中更新公式:

①仅考虑学习率的梯度下降:$$ w{i+1}=wi-lrg(w_i) $$ ②加入momentum系数后随机梯度下降更新公式:$$ v_{i}=mv{i-1}+*g(wi) $$$$ w{i+1}=wi+lr*v{i} $$ $w{i+1}$:第i+1次更新的参数;$lr$:学习率;$vi$:更新量,$m$:momentum系数,对应指数加权平均就是$\beta$值;$g(wi)$:$w_i的梯度$

更新公式不再乘以梯度而是更新量$vi$,该更新量$vi$由两部分构成,不仅有当前的梯度信息$g(w_i)$还有上一时刻的更新信息。


下面进行带上momentum的随机梯度下降实验,观察Loss的变化。具体操作是:观察1个较小学习率0.01和1个较大学习率0.03 和 其中1个加了momentum后,观察两种情况下的Loss曲线。

图7 实验结果分析

图8 实验结果分析

最后,尝试了多次momentum,直到momentum=0.63时,学习率为0.01的Loss比学习率为0.03的Loss更快收敛。设置合适mometum系数,考虑当前梯度信息结合之前的梯度信息,可以加速更新模型参数。

Momentum(动量、冲量)

结合当前梯度与上一次更新信息,用于当前参数,从而实现惯性思想,加速模型收敛。

torch.optim.SGD

Pytorch中提供的最常用、实用的优化器SGD

optim.SGD(params,lr=<object object>,

momentum=0,dampening=0,

weight_decay=0,nesterov=False)

主要参数:

params:管理的参数组

lr:初始学习率

momentum:动量系数,beta

weight_decay:L2正则化系数

nesterov:是否采用NAG

解释(1)params(optimizer属性paramgroups):管理的参数组参数组是1个list,其中的每1个元素是dict,dict中又很多key,这些key中最重要的是 params——其中的value就是管理的参数;(2)weightdecay:用来设置L2正则化系数;(3)nesterov:布尔变量,通常设置为False,控制是否采用NAG这一梯度下降方法,参考 《 On the importance of initialization and momentum in deep learning》

Pytorch的十种优化器

1、optim.SGD:随机梯度下降法 2、optim.Adagrad:自适应学习率梯度下降法(对每个可学习参数具有1个自适应学习率) 3、optim.RMSprop:Adagrad的改进 4、optim.Adadelta:Adagrad的改进 5、optim.Adam:RMSprop结合Momentum 6、optim.Adamax:Adam增加学习率上限 7、optim.SparseAdam:稀疏版Adam 8、optim.ASGD:随机平均梯度下降 9、optim.Rprop:弹性反向传播(优化器应用场景在所有样本full_batch 一起计算梯度) 10、optim.LBFGS:BFGS的改进

图9 其他优化器相关文献

pytorch adagrad_【学习笔记】Pytorch深度学习—优化器(二)相关推荐

  1. 深度学习入门之PyTorch学习笔记:深度学习介绍

    深度学习入门之PyTorch学习笔记:深度学习介绍 绪论 1 深度学习介绍 1.1 人工智能 1.2 数据挖掘.机器学习.深度学习 1.2.1 数据挖掘 1.2.2 机器学习 1.2.3 深度学习 第 ...

  2. 学习笔记:深度学习(3)——卷积神经网络(CNN)理论篇

    学习时间:2022.04.10~2022.04.12 文章目录 3. 卷积神经网络CNN 3.1 卷积神经网络的概念 3.1.1 什么是CNN? 3.1.2 为什么要用CNN? 3.1.3 人类的视觉 ...

  3. 【长篇博文】Docker学习笔记与深度学习环境的搭建和部署(二)

    长篇博文记录学习流程不容易,请关注.转发.点赞.评论,谢谢! 上一篇文章:Docker学习笔记与深度学习环境的搭建和部署(一) 文章末尾附加nvidia455.23.cuda11.1.cudnn8.0 ...

  4. ScalersTalk 机器学习小组第 21 周学习笔记(深度学习-10)

    ScalersTalk 机器学习小组第 21 周学习笔记(深度学习-10) Scalers点评:机器学习小组是成长会的内部小组,这是成长会机器学习小组第21周学习笔记,也是深度学习第10次的复盘笔记 ...

  5. 学习笔记:深度学习(6)——基于深度学习的语言模型

    学习时间:2022.04.22~2022.04.25 文章目录 5. 基于深度学习的语言模型 5.1 从NNLM到词嵌入 5.1.1 神经网络语言模型 NNLM 5.1.2 基于循环神经网络的语言模型 ...

  6. 深度学习入门之PyTorch学习笔记:深度学习框架

    深度学习入门之PyTorch学习笔记 绪论 1 深度学习介绍 2 深度学习框架 2.1 深度学习框架介绍 2.1.1 TensorFlow 2.1.2 Caffe 2.1.3 Theano 2.1.4 ...

  7. [深度学习笔记(1)]深度学习入门

    本系列是博主刚开始接触深度学习时写的一些笔记,写的很早了一直没有上传,趁着假期上传一下,作为分享,希望能帮助到你. 目录 前言 一.什么是深度学习 二.深度学习的应用 三.深度神经网络的难题 3.1 ...

  8. 第1周学习笔记:深度学习和pytorch基础

    目录 一 视频学习 1.绪论 2.深度学习概述 二 代码学习 1.Pytorch基础练习 2.螺旋数据分类 一 视频学习 1.绪论 人工智能(Artificial Intelligence):使一部机 ...

  9. Pytorch模型训练实用教程学习笔记:四、优化器与学习率调整

    前言 最近在重温Pytorch基础,然而Pytorch官方文档的各种API是根据字母排列的,并不适合学习阅读. 于是在gayhub上找到了这样一份教程<Pytorch模型训练实用教程>,写 ...

  10. 学习笔记:深度学习(8)——基于PyTorch的BERT应用实践

    学习时间:2022.04.26~2022.04.30 文章目录 7. 基于PyTorch的BERT应用实践 7.1 工具选取 7.2 文本预处理 7.3 使用BERT模型 7.3.1 数据输入及应用预 ...

最新文章

  1. 何为OKR?为何使用OKR?
  2. JQuery 扩展多语言支持
  3. Azure PowerShell (1) PowerShell整理
  4. apache camel_Apache Camel简介
  5. 发布react项目到linux服务器,nginx上部署react项目的实例方法
  6. freebsd运行php,FreeBSD学习笔记16-FreeBSD下安装PHP
  7. 报告PPT--Python程序设计,不仅仅是学习编程(35页)
  8. oracle去除检查非空,oracle 主键,非空,检查,唯一,默认,外键约束
  9. mysql自定义序号_mysql序列_mysql序列号生成器 mysql自定义函数生成序列号的例子...
  10. 迅雷精简版绿色优化版
  11. 编码浅析 ASCII EASCII GBK系列 Uincode UTF-8/16/32
  12. 计算机主板的结构平面草图,10分钟浓缩10年 教你看懂主板基本结构
  13. 2018下半年计算机学科竞赛,2018年度下半年五大学科竞赛,其他赛事时间预告高一高二请收好,不要错过报名.doc...
  14. 集运系统,集运下单系统,国际物流集运系统,转运系统源码 集运系统源码
  15. 高音符號的由來是怎樣的
  16. TCP/IP网络编程之多进程服务端(一)
  17. 浮点型数据单片机传输
  18. 不出千元!打造耐用、高效SCSI硬盘系统(转)
  19. Python常用设计模式—创建型模式
  20. Excel数值累加操作演示(一)

热门文章

  1. SAP Spartacus里如何查看HTTP请求的状态
  2. Visual Studio Code的用户设置相关
  3. 如何使用SAP Analytics Cloud统计C4C系统每天新建的Lead个数和预测趋势
  4. 如何在SAP S/4HANA Cloud系统里创建employee
  5. BadI /ui2/catalog_provider_bd
  6. SAP UI5 ConnectionManager - drives initialization of odata model
  7. SAP UI5 getHeaderFooterOptions
  8. git提交后的自动化流程构建
  9. GraphQL在SAP Kyma中的广泛应用
  10. hierarchy change - ERP side debugging