咨询电话: 020-88888888
Pytorch-优化器optimizer!
发布于 2024-05-06 05:49 阅读()
?
二、优化器基本属性
- defaults:优化器超参数
- state:参数的缓存,如momentum的缓存
- params_groups:管理的参数组
- _step_count:记录更新次数,学习率调整中使用
三、优化器基本方法
- zero_grad():清空所管理参数的梯度
- step():执行一步更新操作
- add_param_group():添加参数组
- state_dict():获取优化器当前状态信息字典
- load_state_dict():加载状态信息字典
pytorch特性:张量梯度不自动清零。
四、以SGD优化器为例(随机梯度下降)
import torch.optim as optim
optim.SGD(params, lr=<required parameter>, momentum=0, dampening=0, weight_decay=0, nesterov=False)
原始的梯度下降法:没有添加momentum的情况下的计算公式:
? ? ? ------------------------------------------------(1)
其中的??表示学习率,
?表示?
?的梯度,然后依次进行更新参数;
以实际代码来看一下不同的学习对梯度下降的影响!
以简单的二次函数:? ,对这个函数的x进行求导数:
![](https://img-blog.csdnimg.cn/20200824214947402.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzY4NzM2Ng==,size_16,color_FFFFFF,t_70)
?使用梯度下降法,即添加一个学习率的情况:这里我们选择从上图二次函数x = 2的时刻开始进行更新;
学习率具体作用是干嘛的呢?:可以理解为控制更新的步伐;
参考博文:
![](https://img-blog.csdnimg.cn/20200824215731304.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzY4NzM2Ng==,size_16,color_FFFFFF,t_70)
?此时的学习率设置为0.02,虽然可以到达最小值,但是速度还是很慢,需要走很多步;尝试设置大一点学习率,其实就是调参数;
最佳的学习率设置为:0.125,观察一下最终的效果如何,从下图可以看出相比上一个学习率而言,这个只需要两步就可以达到最小值;
![](https://img-blog.csdnimg.cn/20200824220028998.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzY4NzM2Ng==,size_16,color_FFFFFF,t_70)
那么我们如何能够最快找到合适的学习率呢?如果我们站在上帝视角绝对可以!!!
下面我们看一下在多个学习率情况下的效果如何:
我们这里设置学习的范围为:[0.01,0.2]? 所有的学习率都设置在这个区间内
?
![](https://img-blog.csdnimg.cn/20200824220432469.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzY4NzM2Ng==,size_16,color_FFFFFF,t_70)
?从上图5可以看出,在iteration为0时,学习率为0.136时刻下降的最快!这就是针对二次函数??使用梯度下降法最佳的学习率!!!
但是梯度下降法存在两个缺点:
- 训练速度慢:每走一步都需要计算调整下一步的方向,下山的速度变慢。对于大数据集而言,每输入一个样本都需要更新一次参数,并且每次迭代都要遍历所有的样本。会使得训练过程相当缓慢,需要花费很长时间才能得到收敛。
- 容易陷入局部最优解:由于是在有限视距内寻找下山方向。当陷入平坦的洼地,会误以为到达了山地的最低点,从而不会继续走下去。所谓的局部最优解就是鞍点,梯度为0,使得模型参数不会再继续更新。
于是学者们又提出添加momentum(动量或者冲量):结合当前梯度与上一次更新信息,用于当前更新!
主要分为两个情况:
一、momentum
其中 ?表示第i+1次更新的参数,lr表示学习率,
?表示更新量,
?表示momentum系数,
?表示?
?的梯度。(一般训练时的动量设置为0.9)
下面以100次更新为例:
二、Nesterov版本进行了类似的修改。参数和上面的定义是一样的!
以上两种情况都是动量优化法,引入物理中的动量思想,加速梯度下降,主要有上面两种方法。由上图梯度下降法,从山顶到山底,没有阻力的情况下,它的动量会越来越大,如果遇到阻力,速度就会变小。动量优化方法就是基于此思想,使得梯度方向在不变的维度上,参数更新变快,梯度有所改变时,更新参数变慢,这样就能加快收敛并且减少动荡。
下面整体再以代码的形式看一下optim.SGD:(以RMB二分类为例)
![](https://img-blog.csdnimg.cn/20200824223948914.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzY4NzM2Ng==,size_16,color_FFFFFF,t_70)
测试效果:
五、其他优化器
1. optim.SGD:随机梯度下降法《On the importance of initialization and momentum in deep learning 》
2. optim.Adagrad:自适应学习率梯度下降法
3. optim.RMSprop: Adagrad的改进http://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf
4. optim.Adadelta: Adagrad的改进《 AN ADAPTIVE LEARNING RATE METHOD》
5. optim.Adam:RMSprop结合Momentum《Adam: A Method for Stochastic Optimization》
6. optim.Adamax:Adam增加学习率上限《Adam: A Method for Stochastic Optimization》
7. optim.SparseAdam:稀疏版的Adam
8. optim.ASGD:随机平均梯度下降
9. optim.Rprop:弹性反向传播《Martin Riedmiller und Heinrich Braun》
10. optim.LBFGS:BFGS的改进
新闻资讯
-
关于开展“清朗·优化营商网络环 07-01
-
电竞大神是女生 07-01
-
持续优化营商“软”环境, 培育 07-01
-
神经网络拓扑结构是什么,神经网 07-01
-
代充抖币,信息差项目,一个月搞 07-01
-
抖音极速版最新版下载_3 07-01
-
SEO工作原理及优化解析 07-01
-
关于进一步建立健全涉企服务工作 07-01