【DeepLearning】优化算法:SGD、GD、mini-batch GD、Moment、RMSprob、Adam
优化算法
1 GD/SGD/mini-batch GD
GD:Gradient Descent,就是传统意义上的梯度下降,也叫batch GD。
SGD:随机梯度下降。一次只随机选择一个样本进行训练和梯度更新。
mini-batch GD:小批量梯度下降。GD训练的每次迭代一定是向着最优方向前进,但SGD和mini-batch GD不一定,可能会”震荡“。把所有样本一次放进网络,占用太多内存,甚至内存容纳不下如此大的数据量,因此可以分批次训练。可见,SGD是mini-batch GD的特例。
2 动量梯度下降
一个有用的方法:指数加权平均。
假如有N天的数据,\(a_1,a_2,a_3,...,a_N\)
如果想拟合一条比较平滑的曲线,怎么做呢。可以使用指数加权平均。概括的说,就是平均前m天的数据作为一个数据点:
\(b_0=0\)
\(b_t = \beta*b_{t-1} + (1-\beta)*a_t\)
比如\(\beta\)取0.9,那么就相当于是平均了10天的数据,这会比较平滑。
为什么叫指数加权平均?是因为,将\(b_t\)计算公式中的\(b_{t-1}\)展开,依次展开下去,会发现:
\(b_t = \beta*(\beta*b_{t-2}+(1-\beta)*a_{t-1})+(1-\beta)*a_t\)
合并一下,前面的数据乘以\(\beta\)的m次方的平均值。因此叫做指数加权平均。
指数加权平均的偏差修正:
很显然,上面公式汇总,假如\(\beta=0.9\),是要平均前10天的数据,则前9天的数据,做加权平均,并没有足够的数据,这会导致前九天数据偏小。举例来说,第一天\(b_1\)仅仅是\(a_1\)的十分之一。可以做偏差修正:
\(b_0=0\)
\(b_t = \beta*b_{t-1} + (1-\beta)*a_t\)
\(b_t = \frac{b_t}{1-\beta ^t}\)
有了指数加权平均的基本知识,就可以讲Moment Gradient Descent。
带动量的梯度下降,他是为了加快学习速度的优化算法。假如参数W方向希望学的快一点,b方向学的慢一点。普通的梯度下降的结果可能恰恰相反,使得b方向学的比较快,从而引发震荡。所以想要让b方向学的慢一点,这时可以用动量梯度下降。算法如下:
For each epco \(t\):
cal \(dW,dB\) for each mini-batch.
\(V_{dW}=\beta*V_{d_W}+(1-\beta)*dW\)
\(V_{db}=\beta*V_{d_b}+(1-\beta)*db\)
\(W = W-\alpha*V_{dW}\)
\(b=b-\alpha*V_{db}\)
可见,就是将梯度做了指数加权平均。至于为什么叫动量梯度下降,可能是因为\(V_{dW}\)的计算式中,把\(dW\)看作加速度,把\(V_{dW}\)看作速度。
3 RMSprob
Root Mean Square prob。
这是另一种加快学习的方法。其基本思想也是让b学的慢一点,让W学的快一点,从而更快更准的趋向于最优点。
For each epco \(t\):
cal \(dW,dB\) for each mini-batch.
\(S_{dW}=\beta*S_{dW}+(1-\beta)*(dW)^2\)
\(S_{db}=\beta*S_{db}+(1-\beta)*(db)^2\)
\(W = W-\alpha*\frac{dW}{\sqrt{S_{dW}}}\)
\(b = b-\alpha*\frac{db}{\sqrt{S_{db}}}\)
可见,当梯度较大,则会使得\(S\)较大,从而使得更新变缓慢。
4 Adam
Adaptive Moment Estimation
这是比较普遍的适用于各种网络的一种方法。称作自适应的动量梯度下降。这是上面动量梯度下降和RMSprob的结合版本,效果比较好。两者做加权指数平均的时候,都做了修正。
For each epco \(t\):
cal \(dW,dB\) for each mini-batch.
\(V_{dW}=\beta_1*V_{d_W}+(1-\beta_1)*dW\)
\(V_{db}=\beta_1*V_{d_b}+(1-\beta_1)*db\)
\(S_{dW}=\beta_2*S_{dW}+(1-\beta_2)*(dW)^2\)
\(S_{db}=\beta_2*S_{db}+(1-\beta_2)*(db)^2\)
\(V_{dW}^{correction} = \frac{V_{dW}}{1-\beta_1^t}\)
\(V_{db}^{correction} = \frac{V_{db}}{1-\beta1^t}\)
\(S_{dW}^{correction} = \frac{S_{dW}}{1-\beta_2^t}\)
\(S_{db}^{correction} = \frac{S_{db}}{1-\beta_2^t}\)
\(W = W-\alpha*\frac{V_{dW}^{correction}}{\sqrt{S_{dW}^{correcti}}+\varepsilon}\)
\(b = b-\alpha*\frac{V_{db}^{correction}}{\sqrt{S_{db}^{correcti}}+\varepsilon}\)
可见,就是在RMSprob中,用动量梯度下降中的梯度指数加权代替梯度,同时所有指数加权项都做了偏差修正。另外,分母加了\(\varepsilon\),这是为了防止除以很小的数造成不稳定。公式中共有4个超参数,他们的取值经验是:
\(\alpha\):学习率,需要调试
\(\beta_1\):取0.9
\(\beta_2\):Adam的作者建议取0.999
\(\varepsilon\):取\(10^{-8}\),并不影响学习效果。
另外,值得注意的是,学习过程中可能有两种窘境,一是困在局部最优,另一个是遇平缓区学习的过慢。采用mini-batch下前者出现的概率很小,即使困在最优也能跳出来,前提是数据量足够。但后者比较棘手,Adam是个比较好的优化算法,一定程度上解决了这个问题。
5 学习率衰减
训练过程中,随着迭代次数,学习率相应减少。
在FB的一篇论文中,使用了不同时间段(迭代次数区间段)采用不同的学习率的方法,效果比较好。
【DeepLearning】优化算法:SGD、GD、mini-batch GD、Moment、RMSprob、Adam的更多相关文章
- 优化深度神经网络(二)优化算法 SGD Momentum RMSprop Adam
Coursera吴恩达<优化深度神经网络>课程笔记(2)-- 优化算法 深度机器学习中的batch的大小 深度机器学习中的batch的大小对学习效果有何影响? 1. Mini-batch ...
- ng-深度学习-课程笔记-7: 优化算法(Week2)
1 Mini-batch梯度下降 在做梯度下降的时候,不选取训练集的所有样本计算损失函数,而是切分成很多个相等的部分,每个部分称为一个mini-batch,我们对一个mini-batch的数据计算代价 ...
- 吴恩达深度学习笔记(五) —— 优化算法:Mini-Batch GD、Momentum、RMSprop、Adam、学习率衰减
主要内容: 一.Mini-Batch Gradient descent 二.Momentum 四.RMSprop 五.Adam 六.优化算法性能比较 七.学习率衰减 一.Mini-Batch Grad ...
- 转载: scikit-learn学习之K-means聚类算法与 Mini Batch K-Means算法
版权声明:<—— 本文为作者呕心沥血打造,若要转载,请注明出处@http://blog.csdn.net/gamer_gyt <—— 目录(?)[+] ================== ...
- deeplearning.ai 改善深层神经网络 week2 优化算法 听课笔记
这一周的主题是优化算法. 1. Mini-batch: 上一门课讨论的向量化的目的是去掉for循环加速优化计算,X = [x(1) x(2) x(3) ... x(m)],X的每一个列向量x(i)是 ...
- 深度学习必备:随机梯度下降(SGD)优化算法及可视化
补充在前:实际上在我使用LSTM为流量基线建模时候,发现有效的激活函数是elu.relu.linear.prelu.leaky_relu.softplus,对应的梯度算法是adam.mom.rmspr ...
- 聚类K-Means和大数据集的Mini Batch K-Means算法
import numpy as np from sklearn.datasets import make_blobs from sklearn.cluster import KMeans from s ...
- deeplearning.ai 改善深层神经网络 week2 优化算法
这一周的主题是优化算法. 1. Mini-batch: 上一门课讨论的向量化的目的是去掉for循环加速优化计算,X = [x(1) x(2) x(3) ... x(m)],X的每一个列向量x(i)是 ...
- DeepLearning.ai学习笔记(二)改善深层神经网络:超参数调试、正则化以及优化--Week2优化算法
1. Mini-batch梯度下降法 介绍 假设我们的数据量非常多,达到了500万以上,那么此时如果按照传统的梯度下降算法,那么训练模型所花费的时间将非常巨大,所以我们对数据做如下处理: 如图所示,我 ...
随机推荐
- Python编程从入门到实践笔记——类
Python编程从入门到实践笔记——类 #coding=gbk #Python编程从入门到实践笔记——类 #9.1创建和使用类 #1.创建Dog类 class Dog():#类名首字母大写 " ...
- 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU开发那些事 - 索引
大家好,我是痞子衡,是正经搞技术的痞子.本系列痞子衡给大家介绍的是飞思卡尔i.MX RT系列微控制器相关知识. 飞思卡尔半导体(现恩智浦半导体)于2017年开始推出的i.MX RT系列开启了高性能MC ...
- [Vue] vuex进行组件间通讯
vue 组件之间数据传输(vuex) 初始化 store src/main.js import Vuex from "vuex"; Vue.use(Vuex); new Vue({ ...
- GitHub 可以免费创建私人仓库啦
如果你不知道什么是 GitHub,也可以往下看,只不过可能感受不会那么深啦. 昨天,GitHub 博客发表了文章 其中比较重要的已经用蓝色线标注了. GitHub 支持开发者创建免费私人仓库,但是需要 ...
- Jmeter API Performance Test
笔者最近了解 Apache组织开发了基于Java的压力测试工具Apache JMeter.如有兴趣可自行搜索它的相关信息.笔者记录了一些使用方法,如有错误或遗漏,欢迎联系改正. 官方下载地址:http ...
- elementUi的时间选择器在IE浏览器的赋值问题--前端
项目技术:vue+elementUi,组件化 出现的问题:在IE浏览器(IE10+),唤醒组件加载赋值,表单中el-input等框赋值正确,el-date-picker选择器没有显示所附的值(或显示p ...
- React create-react-app Build fails after eject: Cannot find module '@babel/plugin-transform-react-jsx'
运行 npm run eject 出现报错 Build fails after eject: Cannot find module '@babel/plugin-transform-react-jsx ...
- Dynamics 365-为什么查到的Record的Id是Guid初始值
通过代码查询CRM数据,这个是开发经常会碰到的情况,获取返回的EntityCollection之后,我们会拿Entity.Id做进一步操作.笔者最近碰到的情况,是Entity.Id是个初始值.先上一段 ...
- Android Studio教程10-Intent的详细使用
目录 1. Intent启动器 1.1. Intent的用途 1. 启动Activity 3. 传递广播 1.2. Intent类型 1.显示Intent 2.隐式Intent 2. 构建Intent ...
- (办公)springmvc->controller的统一异常层,返回json
controller里面写的代码,很多时候,没有写try{}catch(Exceiption ex){},结果就是系统出错,就算是接口,参数正确也会返回404,这个是不应该的. 下面是代码,以后参考 ...