神经网络的SGD、Momentum、AdaGrad、Adam最优化方法及其python实现

  • 一、SGD
  • 二、Momentum-动量
  • 三、AdaGrad
  • 四、Adam

一、SGD

右边的值更新左边的值,每次更新朝着梯度方向前进一小步。

class SGD:"""随机梯度下降法(Stochastic Gradient Descent)"""def __init__(self, lr=0.01):self.lr = lrdef update(self, params, grads):for key in params.keys():params[key] -= self.lr * grads[key] 

二、Momentum-动量

SGD实现简单,有些问题可能没有效果,比如f(x,y)=(1/20)x^ 2 +y ^2

SGD低效的根本原因:梯度的方向没有指向最小值的方向。如果函数形状非均向,如呈现延伸状,搜索路径就非常低效,有可能呈现z字形移动。

Momentum-动量方法公式:

v表示物体在梯度方向受的力,αv作用是让物体逐渐减速(α小于1,常数,如0.9之类的数)。

动量法的好处,x轴方向受力小,但是每一次梯度变化的方向不变,速度方向不变,一直在这个方向受力,往那个方向走的速度会加速。但是y轴受到正反方向的力,他们会抵消,让y不稳定,因此和SGD相比,能更快的向x轴方向靠近。

简的来说,SGD的话就是他y方向梯度大,步子跨的猛的话就z形了,动量的目的是梯度大的那块,迈步子时候让它考虑到上一次的步子是往哪走的。如果相反方向走的话,其实是抵消了一部分v,这样的话如果步子跨得猛,他也得少一点步子。如下图所示,对于f(x,y)=(1/20)x^ 2 +y ^2用SGD的话,m想走到y,它在y轴摇摆的厉害,但是,用动量,y轴摇摆抵消了,而且x轴速度还增加了,多好。

class Momentum:"""Momentum SGD"""def __init__(self, lr=0.01, momentum=0.9):self.lr = lrself.momentum = momentumself.v = Nonedef update(self, params, grads):if self.v is None:self.v = {}for key, val in params.items():                                self.v[key] = np.zeros_like(val)for key in params.keys():self.v[key] = self.momentum*self.v[key] - self.lr*grads[key] params[key] += self.v[key]

三、AdaGrad

h保存了梯度的平方和,圆圈就表示矩阵相乘。

由于乘上根号h分之1,参数的元素中,变动较大的元素的学习率将变小。

这是一种学习率衰减的手法,梯度下降太快了,山谷太陡峭了,那我就让你走的步子减小,这样一来,你不容易直接一步跨俩山峰(山峰是啥懂得都懂,嘿嘿)。

class AdaGrad:"""AdaGrad"""def __init__(self, lr=0.01):self.lr = lrself.h = Nonedef update(self, params, grads):if self.h is None:self.h = {}for key, val in params.items():self.h[key] = np.zeros_like(val)for key in params.keys():self.h[key] += grads[key] * grads[key]params[key] -= self.lr * grads[key] / (np.sqrt(self.h[key]) + 1e-7)

四、Adam

结合了Momentum和AdaGrad方法。

看代码去吧

很多人喜欢用Adam哦

class Adam:"""Adam (http://arxiv.org/abs/1412.6980v8)"""def __init__(self, lr=0.001, beta1=0.9, beta2=0.999):self.lr = lrself.beta1 = beta1self.beta2 = beta2self.iter = 0self.m = Noneself.v = Nonedef update(self, params, grads):if self.m is None:self.m, self.v = {}, {}for key, val in params.items():self.m[key] = np.zeros_like(val)self.v[key] = np.zeros_like(val)self.iter += 1lr_t  = self.lr * np.sqrt(1.0 - self.beta2**self.iter) / (1.0 - self.beta1**self.iter)         for key in params.keys():#self.m[key] = self.beta1*self.m[key] + (1-self.beta1)*grads[key]#self.v[key] = self.beta2*self.v[key] + (1-self.beta2)*(grads[key]**2)self.m[key] += (1 - self.beta1) * (grads[key] - self.m[key])self.v[key] += (1 - self.beta2) * (grads[key]**2 - self.v[key])params[key] -= lr_t * self.m[key] / (np.sqrt(self.v[key]) + 1e-7)#unbias_m += (1 - self.beta1) * (grads[key] - self.m[key]) # correct bias#unbisa_b += (1 - self.beta2) * (grads[key]*grads[key] - self.v[key]) # correct bias#params[key] += self.lr * unbias_m / (np.sqrt(unbisa_b) + 1e-7)

神经网络的SGD、Momentum、AdaGrad、Adam最优化方法及其python实现相关推荐

  1. DL之DNN优化技术:DNN优化器的参数优化—更新参数的四种最优化方法(SGD/Momentum/AdaGrad/Adam)的案例理解、图表可视化比较

    DL之DNN优化技术:DNN优化器的参数优化-更新参数的四种最优化方法(SGD/Momentum/AdaGrad/Adam)的案例理解.图表可视化比较 目录 四种最优化方法简介 优化器案例理解 输出结 ...

  2. DL之DNN:自定义MultiLayerNet(5*100+ReLU+SGD/Momentum/AdaGrad/Adam四种最优化)对MNIST数据集训练进而比较不同方法的性能

    DL之DNN:自定义MultiLayerNet(5*100+ReLU+SGD/Momentum/AdaGrad/Adam四种最优化)对MNIST数据集训练进而比较不同方法的性能 目录 输出结果 设计思 ...

  3. NN学习技巧之参数最优化的四种方法对比(SGD, Momentum, AdaGrad, Adam),基于MNIST数据集

    前面几篇博文分析了每一种参数优化方案,现在做一个对比,代码参考斋藤的红鱼书第六章. 实验对mnist数据集的6万张图片训练,使用5层全连接神经网络(4个隐藏层,每个隐藏层有100个神经元),共迭代20 ...

  4. 深度学习笔记:优化方法总结(BGD,SGD,Momentum,AdaGrad,RMSProp,Adam)

    深度学习笔记(一):logistic分类  深度学习笔记(二):简单神经网络,后向传播算法及实现  深度学习笔记(三):激活函数和损失函数  深度学习笔记:优化方法总结  深度学习笔记(四):循环神经 ...

  5. 深度学习入门-ANN神经网络参数最优化问题(SGD,Momentum,AdaGrad,RMSprop,Adam)

    这里写目录标题 1. 参数优化 1.1 随机梯度下降法(SGD) 1.2 Momentum 动量法 1.3 AdaGrad 1.4 RMSprop 1.5 Adam 1. 参数优化 本文总结一下ANN ...

  6. 优化方法总结(BGD,SGD,Momentum,AdaGrad,RMSProp,Adam)

    本文介绍常见的一阶数值优化算法,这些方法在现代神经网络框架(tensorflow, caffe, torch)中已经是标准配置. 问题 设系统参数为ω.对于样本i,其代价函数为Qi(ω).在n个样本组 ...

  7. 优化器,SGD+Momentum;Adagrad;RMSProp;Adam

    Optimization 随机梯度下降(SGD): 当损失函数在一个方向很敏感在另一个方向不敏感时,会产生上面的问题,红色的点以"Z"字形梯度下降,而不是以最短距离下降:这种情况在 ...

  8. 一个框架看懂优化算法之异同 SGD/AdaGrad/Adam

    Adam那么棒,为什么还对SGD念念不忘 (1) -- 一个框架看懂优化算法 机器学习界有一群炼丹师,他们每天的日常是: 拿来药材(数据),架起八卦炉(模型),点着六味真火(优化算法),就摇着蒲扇等着 ...

  9. 各种优化器SGD,AdaGrad,Adam,LBFGS都做了什么?

    文章目录 各种优化器SGD,AdaGrad,Adam,LBFGS都做了什么? 1. SGD: 2. SGD+Momentum: 3. NAG(Nesterov Accelerated Gradient ...

最新文章

  1. 远程桌工具-Remote Desktop Organizer
  2. css(面试第2天)用css绘制三角形
  3. 关于windows图形编程 Hello2 程序的问题
  4. 【转】使用命令行方式创建和启动android模拟器
  5. 会计行业被计算机取代马云,会计人:为什么我神烦“人工智能取代说”?
  6. 如何在Red Hat Linux上安装和配置FreeIPA
  7. php mysql 降_php fork太多进程导致整体性能下降,mysql down掉的解决._PHP教程
  8. cdn搭建原理_直播平台如何搭建?
  9. regex 正则表达式零宽度正预测先行断言 and 零宽度正回顾后发断言
  10. 华盛顿大学研发PaperID技术,可在纸上印刷RFID电子标签
  11. 从食品质检员到代码工程师,大哥你就这样跳槽进了阿里巴巴?
  12. notebook打开外部文件_NOTEBOOK文件扩展名 - 什么是.notebook以及如何打开? - ReviverSoft...
  13. 马铃薯淀粉生产线的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  14. 如何查看电脑的SN码?
  15. HCIE - 2204-MPLS
  16. 中国地质大学英语语音学习笔记(五):英语连读——相邻两元音读音(词间或词内)的连读方法和辅音加半元音(词间或词内)的连读技巧
  17. Java正则获取小括号中的内容_java正则表达式获取大括号小括号内容并判断数字和小数亲测可用...
  18. 解决caffe编译时//usr/lib/x86_64-linux-gnu/libSM.so.6: undefined reference to `uuid_unparse_lower@UUI
  19. 2、oracle全文检索
  20. Flink获取外部传递参数的两种方式

热门文章

  1. 第六章 计算机性能测试
  2. zoj 1091 Knight Moves
  3. python读txt文件报错UnicodeDecodeError: ‘gbk‘ codec can‘t decode
  4. Pandas 统计分析基础 笔记4 任务4.4 使用分组聚合进行组内计算
  5. 复习----使用链表实现队列(先进先出)及迭代
  6. python里 try里怎么用int函数_如何在不使用try / catch的情况下测试Python枚举中是否存在int值?...
  7. php对象数组转数组_php 数组对象互相转换
  8. echarts 折线上写数值_前端ECharts数据可视化图表案例与介绍
  9. C#session共享+redis_技术干货分享:基于SpringBoot+Redis的Session共享与单点登录
  10. sendmail发送html邮件,尝试使用sendmail发送/发送html电子邮件,但显示电子邮件的源代码...