各种优化器对比--BGD/SGD/MBGD/MSGD/NAG/Adagrad/Adam
指数加权平均 (exponentially weighted averges)
先说一下指数加权平均, 公式如下:
\]
- \(\theta_t\) 是第t天的观测值
- \(v_t\) 是用来替代\(\theta_t\)的估计值,也就是加权平均值
- \(\beta\) 超参数
设 \(\beta = 0.9\) , 那么公式可以化简为:
\]
它考虑到了之前所有观测值,但是事件越靠近的观测值权重越大,时间越久远的观测值权重就很小了。
在 \(\beta = 0.9\)时,很多资料认为\(0.9^{10} \approx 0.35 \approx 1 / e\), 把这个数当成一个分界点,权重降低到这个分界点之下就可以忽略不计,而 \(\beta^{\frac{1}{1-\beta}} \approx 1 / e\) , 所以把上面两个公式合到一起就可以认为指数加权平均就是最近 \(N=\frac{1}{1-\beta}\)天的加权平均值
所以
- \(\beta\) 越小, 加权平均的数据越少,就容易出现震荡
- \(\beta\) 越大, 加权平均考虑的数据就越多,当出现震荡的时候会由于历史数据的权重导致震荡的幅度减小
Batch Gradient Descent (BGD)
BGD使用整个数据集来计算梯度,这里的损失函数是所有输入的样本数据的loss的和,单个样本的loss可以用交叉熵或者均方误差来计算。
\]
缺点是每次更新数据都需要计算整个数据集,速度很慢,不能实时的投入数据更新模型。对于凸函数可以收敛到全局最小值,对于非凸函数只能收敛到局部最小值。这是最朴素的优化器了
Stochastic Gradient Descent(SGD)
由于BGD计算梯度太过费时,SGD每次只计算一个样本的loss,然后更新参数。计算时可以先打乱数据,然后一条一条的将数据输入到模型中
\]
他的缺点是更新比较频繁,会有严重的震荡。
当我们稍微减小learning rate, SGD和BGD的收敛性是一样的
Mini-Batch Gradient Descent (MBGD)
每次接收batch个样本,然后计算它们的loss的和。
\]
对于鞍点, BGD会在鞍点附近停止更新,而MSGD会在鞍点周围来回震荡。
Monentum SGD
加入了v的概念,起到一个类似惯性的作用。在更新梯度的时候会照顾到之前已有的梯度。这里的\(v_t\)就是梯度的加权平均
v_{t}=\gamma v_{t-1}+\eta \nabla_{\theta} J(\theta) \\
\theta=\theta-v_{t}
\end{array}
\]
它可以在梯度方向不变的维度上使速度变快,在梯度方向有所改变的维度上更新速度更慢,可以抵消某些维度的摆动,加快收敛并减小震荡。\(\gamma\)一般取值为0.9
Nesterov Accelerated Gradient
它用 \(\theta-\gamma v_{t-1}\)来近似估计下一步 \(\theta\)会到达的位置
v_{t}=\gamma v_{t-1}+\eta \nabla_{\theta} J\left(\theta-\gamma v_{t-1}\right) \\
\theta=\theta-v_{t}
\end{array}
\]
能够让算法提前看到前方的地形梯度,如果前面的梯度比当前位置的梯度大,那我就可以把步子迈得比原来大一些,如果前面的梯度比现在的梯度小,那我就可以把步子迈得小一些
这个算法的公式竟然可以转化为下面的等价的公式:
d_{i}=\beta d_{i-1}+g\left(\theta_{i-1}\right)+\beta\left[g\left(\theta_{i-1}\right)-g\left(\theta_{i-2}\right)\right] \\
\theta_{i}=\theta_{i-1}-\alpha d_{i}
\end{array}
\]
后面的梯度相减可以认为是梯度的导数,也就是loss的二阶导数。也就是用二阶导数判断了一下曲线的趋势。其中 \(\gamma\)一般取值为0.9
Adagrad (Adaptive gradient algorithm)
可以对低频的参数做较大的更新,对高频的参数做较小的更新。
\]
这个算法很有意思,G是在某个维度上,t从0开始到现在的所有梯度的平方和。所以对于经常更新的参数,学习率会越来越小,而对于不怎么更新的参数,他的学习率会变得相对更高。
\(\theta\)一般设置为0.01,他的缺点是分母会不断累计,最终学习率会变得非常小。如果初始梯度很大,会导致学习率变得很小。它适合用于稀疏数据。
Adadelta
对Adagrad的改进,对某个维度的历史维度进行平方、相加、开方
\]
\]
\]
解决了历史梯度一直累加导致的学习率下降问题, \(\epsilon\) 是为了方式分母为0加上的极小值, \(rho\)一般取值为0.9
Adaptive Moment Estimation (Adam)
同时考虑了梯度的平方和梯度的指数衰减。建议\(\beta_1\)=0.9, \(\beta_2\)=0.999, \(\eta\)=10e-8
\]
\]
\hat{m}{t}=\frac{m{t}}{1-\beta_{1}^{t}},
\hat{v}{t}=\frac{v{t}}{1-\beta_{2}^{t}}
\end{array}
\]
\]
Adam取得了比其他方法更好的效果
总结
如果数据是稀疏的,就用自适用方法,即 Adagrad, Adadelta, RMSprop, Adam。
参考资料:
https://www.cnblogs.com/guoyaohua/p/8542554.html
https://arxiv.org/pdf/1609.04747.pdf
各种优化器对比--BGD/SGD/MBGD/MSGD/NAG/Adagrad/Adam的更多相关文章
- 三种梯度下降法的对比(BGD & SGD & MBGD)
常用的梯度下降法分为: 批量梯度下降法(Batch Gradient Descent) 随机梯度下降法(Stochastic Gradient Descent) 小批量梯度下降法(Mini-Batch ...
- pytorch1.0进行Optimizer 优化器对比
pytorch1.0进行Optimizer 优化器对比 import torch import torch.utils.data as Data # Torch 中提供了一种帮助整理数据结构的工具, ...
- 深度学习笔记:优化方法总结(BGD,SGD,Momentum,AdaGrad,RMSProp,Adam)
深度学习笔记:优化方法总结(BGD,SGD,Momentum,AdaGrad,RMSProp,Adam) 深度学习笔记(一):logistic分类 深度学习笔记(二):简单神经网络,后向传播算法及实现 ...
- [转载]机器学习优化方法总结:SGD,Momentum,AdaGrad,RMSProp,Adam
[转载]机器学习优化方法总结:SGD,Momentum,AdaGrad,RMSProp,Adam https://blog.csdn.net/u010089444/article/details/76 ...
- 三种梯度下降算法的区别(BGD, SGD, MBGD)
前言 我们在训练网络的时候经常会设置 batch_size,这个 batch_size 究竟是做什么用的,一万张图的数据集,应该设置为多大呢,设置为 1.10.100 或者是 10000 究竟有什么区 ...
- 各种梯度下降 bgd sgd mbgd adam
转载 https://blog.csdn.net/itchosen/article/details/77200322 各种神经网络优化算法:从梯度下降到Adam方法 在调整模型更新权重和偏差 ...
- Tensorflow-各种优化器总结与比较
优化器总结 机器学习中,有很多优化方法来试图寻找模型的最优解.比如神经网络中可以采取最基本的梯度下降法. 梯度下降法(Gradient Descent) 梯度下降法是最基本的一类优化器,目前主要分为三 ...
- Tensorflow 中的优化器解析
Tensorflow:1.6.0 优化器(reference:https://blog.csdn.net/weixin_40170902/article/details/80092628) I: t ...
- Tensorflow 2.0 深度学习实战 —— 详细介绍损失函数、优化器、激活函数、多层感知机的实现原理
前言 AI 人工智能包含了机器学习与深度学习,在前几篇文章曾经介绍过机器学习的基础知识,包括了监督学习和无监督学习,有兴趣的朋友可以阅读< Python 机器学习实战 >.而深度学习开始只 ...
随机推荐
- springBoot项目实现发送邮件功能
需要的依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- HMS Core Discovery第17期直播预告|音随我动,秒变音色造型师
[导读] 随着音视频内容品类的不断丰富及音乐创作门槛不断降低,大量用户正热切的参与到全民创作的大潮中.我们应该怎么去拥抱移动端影音潜力市场?音频编辑又可以有什么新玩法? 本期直播<音随我动,秒变 ...
- 贪吃蛇(C语言版)链表实现
贪吃蛇 gitee:贪吃蛇C语言版: Snake 蛇的结构 typedef struct Snake { int x; int y; struct Snake *next; }; 游戏开始欢迎界面 / ...
- HTML+JS+CSS 实现随机跳转到一个网址
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta http ...
- PHP随机图片API
相比上一个版本代码缩短了 此版本为图片专用 查看代码 <?php $img=file('img.txt');//txt文件 $url=array_rand($img);//imgtxt文档里面图 ...
- 【Java】学习路径50-线程死锁问题
生活化的例子:比如说有两个人,一把刀和一把叉子: 第一个人先需要一把刀,然后还需要一把叉子: 第二个人先需要一把叉子,然后还需要一把刀. 我们理想的情况是:一个人拿着刀,然后再拿到叉子,把事情做完,然 ...
- QtCreator像C# region一样折叠代码
C# #region "comment" [code] #endregion 就可以在VS中实现代码折叠了 QtCreator #pragma region "comme ...
- 创建swarm集群并自动编排
1.基础环境配置 主机名 master node1 node2 IP地址 192.168.***.1 192.168.***.2 192.168.***.3 角色 管理节点 工作节点 工作节点 ...
- Neo4j在linux上的安装与Springboot的集成
Neo4j在linux上的安装与Springboot的集成 在linux安装: 前提:安装配置好java环境 1.下载neo4j 官方社区版下载地址:https://neo4j.com/downloa ...
- JDBC连接池&JDBCTemplate
今日内容 1. 数据库连接池 2. Spring JDBC : JDBC Template 数据库连接池 1. 概念:其实就是一个容器(集合),存放数据库连接的容器. 当系统初始化好后,容器被创建,容 ...