Pytorch基础(十)——优化器(SGD,Adagrad,RMSprop,Adam,LBFGS等)

一、概念

Pytorch中优化器的目的:将损失函数计算出的差值Loss减小。
优化过程:优化器计算网络参数的梯度,然后使用一定的算法策略来对参数进行计算,用新的参数来重新进行训练,最终降低Loss。
其中官网提供了13种优化算法,其中主要的有5种:SGD(stochastic gradient descent 随机梯度下降),Adagrad(自适应梯度算法),Adam(Adaptive Moment Estimation 自适应矩估计),RMSprop(Root Mean Square Prop 均方根),LBFGS(Limited-memory Broyden–Fletcher–Goldfarb–Shanno 有限内存中进行BFGS算法),其他均为改进算法,比如Adadelta是Adagrad的改进算法。
其中还有很多算法细节可能后续会慢慢补充。

二、介绍和示例

2.1 SGD算法

SGD算法可实现随机梯度下降(可选动量)。
torch.optim.SGD(params, lr=, momentum=0, dampening=0, weight_decay=0, nesterov=False)
params:可迭代参数以优化或定义参数组。
lr:初始学习率,可随着训练过程不断调整学习率。
momentum:动量,通常设置为0.9,0.8。momentum又称为动量梯度下降。
dampening:动量阻尼,默认为0。
weight_decay:权值衰减系数,即L2正则化。
nesterov:启用牛顿动量。Nesterov是Momentum的变种,就是梯度的计算方法有所不同,先用当前的速度v更新一遍权重θ,然后用更新参数p计算梯度g。
动量法:
在这里插入图片描述
nesterov:
在这里插入图片描述

learning_rate = 1e-2
optim = torch.optim.SGD(wzh.parameters(), lr=learning_rate, momentum=0.9, weight_decay=1e-2)# 优化器调优
optim.zero_grad()
loss.backward()
optim.step()

2.2、Adagrad

Adagrad算法可以自适应的给所有的参数分配学习率,学习率的大小与梯度的大小成反比。
torch.optim.Adagrad(params, lr=0.01, lr_decay=0, weight_decay=0, initial_accumulator_value=0, eps=1e-10)
lr_decay:学习率衰减因子,默认为0。
eps :将其添加到分母以提高数值稳定性,默认值为1e-10,其主要的作用是避免分母为0.
在这里插入图片描述

optim1 = torch.optim.Adagrad(wzh.parameters(), lr=learning_rate, lr_decay=0, weight_decay=0.01,initial_accumulator_value=0, eps=1e-10)

2.3 RMSprop

RMSprop算法是Adagrad的改进形式,特点是使用指数衰减滑动平均来更新梯度平方,以避免Adagrad累计梯度平方导致学习率过小的缺点。
torch.optim.RMSprop(params, lr=0.01, alpha=0.99, eps=1e-08, weight_decay=0, momentum=0, centered=False)
alpha:平滑常数,默认为0.99。
centered:如果为真,计算中心 RMSProp,梯度通过其方差的估计进行归一化。
在这里插入图片描述

由官网给出的公式可以看出,用α的值来更新梯度平方。

optim2 = torch.optim.RMSprop(wzh.parameters(), lr=learning_rate, alpha=0.99, eps=1e-8, weight_decay=0.01,momentum=0, centered=False)

2.4 Adam

Adam算法结合了RMSProp和Momentum的算法思路,由公式可以看出,分别用m和v两个动量来对梯度进行计算,可以说是目前应用相当广泛的优化器算法。
betas:用于计算梯度及其平方的运行平均值的系数,默认值为(0.9, 0.999)。
amsgrad:是否使用论文 On the Convergence of Adam and Beyond 中该算法的 AMSGrad 变体,默认值为false。
在这里插入图片描述

optim3 = torch.optim.Adam(wzh.parameters(), lr=learning_rate, betas=(0.9, 0.999), eps=1e-8, weight_decay=0.01,amsgrad=False)

2.5 LBFGS

LBFGS是BFGS四位大佬一起开发的一个算法,可以有效节省系统内存,缩小BFGS算法迭代产生的n维D矩阵,只保留部分步数。
pytorch中也可以使用改算法,但需要注意:
1:此优化器不支持每个参数选项和参数组(只能有一个)。
2:现在所有参数都必须在一个设备上。
3:这是一个非常占用内存的优化器(它需要额外的 param_bytes * (history_size + 1) 字节)。 如果它不适合内存尝试减少历史记录大小,或使用不同的算法。
torch.optim.LBFGS(params, lr=1, max_iter=20, max_eval=None, tolerance_grad=1e-07, tolerance_change=1e-09, history_size=100, line_search_fn=None)
max_iter:每个优化步骤的最大迭代次数,默认值20。
max_eval:每个优化步骤的最大函数评估次数,默认值max_iter * 1.25.
tolerance_grad:一阶最优性的终止容限,默认值1e-5。
tolerance_change:函数值/参数更改的终止容差,默认值1e-9。
history_size:更新历史大小 。
line_search_fn:“strong_wolfe”或“None” 。
详细原理部分可见:
一文读懂L-BFGS算法

optim3 = torch.optim.LBFGS(wzh.parameters(), lr=1, max_iter=20, max_eval=None, tolerance_grad=1e-07, tolerance_change=1e-09, history_size=100, line_search_fn=None)

三、参考文章

通俗易懂理解(梯度下降)优化算法:Momentum、AdaGrad、RMSProp、Adam

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256175.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【图像处理】——改变图像的大小(降采样重采样)下采样和上采样

转载自:https://jingyan.baidu.com/article/a3a3f81139be1f8da2eb8ade.html 上采样、下采样和金字塔加速参考:https://blog.csdn.net/Eastmount/article/details/89341077 目录 1、拉伸图片——重采样 2、缩小图片 1)三次插值法cv2.INTER_CUBIC

一段代码到可执行程序所有经历

如果你写的代码是hello.c,你的程序将经历下面的步骤到达硬盘或者内存成为可执行文件。 第一步:hello.c(文本)经过预编译生成hello.i(文本) 第二步:hello.i(文本)经过编译…

js获取url参数值

今天碰到要在一个页面获取另外一个页面url传过来的参数,一开始很本能的想到了用 split("?")这样一步步的分解出需要的参数。 后来想了一下,肯定会有更加简单的方法的!所以在网上找到了两个很又简单实用的方法,mark下 方…

[PyCharm]unindent does not match any outer indentation level解决方法

转载:https://www.jianshu.com/p/b34f30717eb2 问题出现原因 1、代码前后缩进量不一致 2、tab和space混用(如果一段代码既使用space又使用tab进行缩进,会发生错误,这个时候PyCharm会自动进行判断,根据设置的预先缩进…

为什么要选择Apache Pulsar(二)

这是介绍Apache Pulsar关键特性系列文章的第二篇。Pulsar是由Yahoo开发并开源的下一代发布订阅消息系统。在第一篇文章里,我们介绍了Pulsar对消息模型的灵活支持、多租户、多地域复制和持久性。在这一篇文章里,我们将继续介绍Pulsar的IO隔离机制、伸缩性…

Yolov5目标检测模型运行遇到的相关问题汇总

一、yolov5-5.0常见错误 1. pycocotools工具包无法安装 具体报错如下: requirements: pycocotools>2.0 not found and is required by YOLOv5 pkg_resources.DistributionNotFound: The pycocotools>2.0 distribution was not found and is required by th…

PHP反射之类的反射

最近在琢磨如何用PHP实现站点的插件功能,需要用到反射,于是现学了一下,笔记如下: class Person {public $name Lily;public $gender male;public $age 20;public function eat(){echo Lily is eating!;}public function run(){…

数据结构(复习)--------关于平衡二叉树(转载)

在上一个专题中,我们在谈论二叉查找树的效率的时候。不同结构的二叉查找树,查找效率有很大的不同(单支树结构的查找效率退化成了顺序查找)。如何解决这个问题呢?关键在于如何最大限度的减小树的深度。正是基于这个想法…

mysql外键

效果 a,b,c 如果c设置到a的外键,那么只能在删除c的记录后,才能删除a的记录。 https://stackoverflow.com/questions/1905470/cannot-delete-or-update-a-parent-row-a-foreign-key-constraint-fails CREATE TABLE IF NOT EXISTS advertisers ( adverti…

C++总结笔记(一)—— 基础知识汇总

很长时间没有再复习C的基础知识&#xff0c;现在将一些容易遗忘的知识点做一个简单的汇总。 1、注释 ❤️分为单行注释和多行注释 //cout<<endl;/*int i1;cout<<i<<endl;*/2、常量 ❤️宏常量&#xff1a;#define &#xff0c;宏常量没有类型&#xff0c;…

微软自带iscsi客户端对iqn的要求

节点名称&#xff1a;Microsoft iSCSI 发起程序严格遵守为 iSCSI 节点名称指定的规则。这些规则也适用于 Microsoft iSCSI 发起程序节点名称以及发现的任何目标节点名称。构建 iSCSI 节点名称的规则&#xff08;如 iSCSI 规范以及“iSCSI 名称的字符串配置文件”Internet 草稿中…

【Python数据结构】——链表

仅仅为了记录 # 定义一个类&#xff0c;用于创建链表的结点 class LNode():def __init__(self,elem,next_ None):# 类的初始化方法,在实例化类的时候会自动调用self.elem elemself.next next_list1 LNode(1)# 类的实例化&#xff0c;LNode(1)为第一个链表结点&#xff0c;…

天猫双11凭什么达到1682亿?这些支撑技术或许可以告诉你

历年「双 11」都会掀起一股买买买的购物热潮 阿里巴巴将这个原本普通的日子赋予了非凡的意义 今年&#xff0c;天猫以 1682 亿的成交额再破记录 而在这一系列疯狂“秒杀”动作的背后 有一个叫云化架构的技术体系支撑着十几亿人的消费狂欢 12 月 8 日 ArchSummit 阿里技术专场 来…

PageLayoutControl的基本操作

整理了下对PageLayoutControl的基本功能操作 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071…

C++总结笔记(二)——指针

一、概念 1.1 指针的原理 找到一个比较精练的概述指针原理的句子&#xff1a; 指针变量就是在内存中保存变量的地址&#xff0c;然后通过地址来访问数据。 int a 1; int* p &a; cout << p << endl;009DFEB4可以知道变量p在内存中的值就是a的地址&#xff…

Content的startActivity方法需添加FLAG_ACTIVITY_NEW_TASK flag

Content的startActivity方法需添加FLAG_ACTIVITY_NEW_TASK flag转载于:https://www.cnblogs.com/zhujiabin/p/5085688.html

【图像处理】——图像内插法

参考:https://blog.csdn.net/lovexlsforever/article/details/79508602 cv2.resize函数 當我們縮小影像時,使用CV_INTER_AREA會有比較好的效果,當我們放大影像,CV_INTER_CUBIC會有最好的效果 void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, dou…

while read line 用法详细介绍

循环中的重定向 或许你应该在其他脚本中见过下面的这种写法&#xff1a; while read line do … done < file 刚开始看到这种结构时&#xff0c;很难理解< file是如何与循环配合在一起工作的。因为循环内有很多条命令&#xff0c;而我们之前接触的重定向都是为一条命令工…

C++总结笔记(三)—— 结构体

一、概念 结构体是一种可以自定义数据类型的类型格式&#xff0c;一般用struct关键字进行定义。 //创建食物的结构体 struct Food {//属性名string name; //名字int Price; //价格 };结构体有三种定义变量的方法。 1.1 定义结构体后再声明变量&#xff0c;然后在对变量的…