梯度优化算法Adam
最近读一个代码发现用了一个梯度更新方法, 刚开始还以为是什么奇奇怪怪的梯度下降法, 最后分析一下是用一阶梯度及其二次幂做的梯度更新。网上搜了一下, 果然就是称为Adam的梯度更新算法, 全称是:自适应矩估计(adaptive moment estimation)
国际惯例, 参考博文:
一文看懂各种神经网络优化算法:从梯度下降到Adam方法
Adam:一种随机优化方法
An overview of gradient descent optimization algorithms
梯度下降优化算法综述
Hinton的神经网络课程第六课
理论
由于参考博客介绍的很清晰, 我就直接撸公式了:
假设tt时刻, 目标函数对于参数的一阶导数是gtgt,那么我们可以先计算
mtvt=β1mt−1+(1−β1)gt=β2vt−1+(1−β2)g2t
mt=β1mt−1+(1−β1)gtvt=β2vt−1+(1−β2)gt2
接下来计算
mt^=mt1−βt1vt^=vt1−βt2
mt^=mt1−β1tvt^=vt1−β2t
最后我们的梯度更新方法就是
θt+1=θt−η⋅mt^vt^−−√+ϵ
θt+1=θt−η⋅mt^vt^+ϵ
注意几个量, ηη是学习步长, 剩下的三个参数取值的建议是β1=0.9,β2=0.999,ϵ=10−8β1=0.9,β2=0.999,ϵ=10−8, 分母中的ϵϵ是为了防止除零. 其实这个步长的话,一般来说是建议选η=0.001η=0.001之类的, 注意βt1,βt2β1t,β2t中的tt是参与指数运算的
其实再看一下公式,其实就是当前时刻的梯度更新利用了上一时刻的平方梯度vtvt的指数衰减均值vt^vt^和上一时刻的梯度mtmt的指数衰减均值mt^mt^
代码实现
以下非一个神经网络的完整实现, 主要在于看看定义网络参数以后怎么去使用Adam去更新每一时刻的梯度, 在theano中的实现方法如下:
先看看神经网络的参数
self.layers = [
self.W0, self.W1, self.W2,
self.b0, self.b1, self.b2]
self.params = sum([layer.params for layer in self.layers], [])
1
2
3
4
5
然后初始化一开始时候的mt,vtmt,vt,分别对应代码中的m0params,m1paramsm0params,m1params
self.params = network.params
self.m0params = [theano.shared(np.zeros(p.shape.eval(), dtype=theano.config.floatX), borrow=True) for p in self.params]
self.m1params = [theano.shared(np.zeros(p.shape.eval(), dtype=theano.config.floatX), borrow=True) for p in self.params]
self.t = theano.shared(np.array([1], dtype=theano.config.floatX))
1
2
3
4
定义目标函数=损失函数+正则项:
cost = self.cost(network, input, output) + network.cost(input)
1
计算当前梯度
gparams = T.grad(cost, self.params)
1
计算m0params,m1paramsm0params,m1params
m0params = [self.beta1 * m0p + (1-self.beta1) * gp for m0p, gp in zip(self.m0params, gparams)]
m1params = [self.beta2 * m1p + (1-self.beta2) * (gp*gp) for m1p, gp in zip(self.m1params, gparams)]
1
2
使用Adam梯度更新
params = [p - self.alpha *
((m0p/(1-(self.beta1**self.t[0]))) /
(T.sqrt(m1p/(1-(self.beta2**self.t[0]))) + self.eps))
for p, m0p, m1p in zip(self.params, m0params, m1params)]
1
2
3
4
然后更新下一时刻网络中的梯度值,m0paramsm0params,m1paramsm1params,tt
updates = ([( p, pn) for p, pn in zip(self.params, params)] +
[(m0, m0n) for m0, m0n in zip(self.m0params, m0params)] +
[(m1, m1n) for m1, m1n in zip(self.m1params, m1params)] +
[(self.t, self.t+1)])
---------------------
作者:风翼冰舟
来源:CSDN
原文:https://blog.csdn.net/zb1165048017/article/details/78392623
版权声明:本文为博主原创文章,转载请附上博文链接!
相关文章
- 数据结构与算法(周鹏-未出版)-第六章 树-习题
- 测试员的算法面试题-找众数
- (《机器学习》完整版系列)第9章 聚类——9.4 高斯混合模型EM算法详细推导
- 10个梯度下降优化算法+备忘单
- 洗牌算法与又一次排序
- 基于NSGA算法的水库端调度优化matlab仿真
- 基于支持向量机和NSGA-II算法的非晶合金变压器结构优化
- 【MATLAB教程案例18】各种仿生优化算法的相似性分析以及MATLAB编程实现技巧
- 基于NSGAII的多目标优化算法的MATLAB仿真
- 基于GA优化算法的磁性贴片位置布置优化算法matlab仿真
- 基于梯度优化的混沌PSO算法matlab仿真以及在磁悬浮球系统方面的应用
- 【NSGAII】基于NSGAII的多目标优化算法的MATLAB仿真
- 基于COPE协议的RLNCBR算法的matlab仿真
- MAX-SUM算法信息传递规则的优化
- Dijkstra最短路径算法的优化和改进
- 空间滤波 - 锐化处理 - 二阶差分算法(拉普拉斯)
- C#,生成字符串整数校验码(Checksum)的谷歌(Google)算法与源代码
- 【Matlab算法】修正G-N法求解非线性最小二乘优化问题(附修正G-N法MATLAB代码)
- imu_tk标定算法原理
- 【毕业设计_课程设计】基于mtcnn的实时高精度人脸检查算法实现
- 深度优化算法 ( DFS )
- 浅析Java中不使用的对象应赋值为null的深层理解:基本没必要的原因、JVM中局部变量表(运行时候的栈状态)和slot(运行时栈里的索引)的理解、Java的栈优化(重用栈索引节约内存空间)、GC的可达性分析算法-如何找到root树根(栈中引用的对象)、如何断开栈中引用与堆的联系(重写栈索引)
- 118、【回溯算法】leetcode ——40. 组合总和 II:回溯法+剪枝优化(C++版本)
- 华为OD机试 - 能力组队(JavaScript) | 机试题+算法思路+考点+代码解析 【2023】
- 华为OD机试 - 太阳能板的安装(JavaScript) | 机试题+算法思路+考点+代码解析 【2023】
- 华为OD机试 -找车位(Java) | 机试题+算法思路+考点+代码解析 【2023】
- javascript数据结构与算法 零(前记+前言)
- 【深度学习】——梯度下降优化算法(批量梯度下降、随机梯度下降、小批量梯度下降、Momentum、Adam)
- [游戏测试]基于人工智能博弈树,极大极小(Minimax)搜索算法并使用Alpha-Beta剪枝算法优化实现的可人机博弈的AI智能五子棋游戏。
- [项目说明]-基于人工智能博弈树,极大极小(Minimax)搜索算法并使用Alpha-Beta剪枝算法优化实现的可人机博弈的AI智能五子棋游戏。