几种优化算法的比较(BGD、SGD、Adam、RMSPROP)

2023-10-27

前言

这里讨论的优化问题指的是,给定目标函数f(x),我们需要找到一组参数x,使得f(x)的值最小。

本文以下内容假设读者已经了解机器学习基本知识,和梯度下降的原理。

Batch gradient descent

梯度更新规则:
BGD 采用整个训练集的数据来计算 cost function 对参数的梯度:

 

缺点:
由于这种方法是在一次更新中,就对整个数据集计算梯度,所以计算起来非常慢,遇到很大量的数据集也会非常棘手,而且不能投入新数据实时更新模型。

我们会事先定义一个迭代次数 epoch,首先计算梯度向量 params_grad,然后沿着梯度的方向更新参数 params,learning rate 决定了我们每一步迈多大。

Batch gradient descent 对于凸函数可以收敛到全局极小值,对于非凸函数可以收敛到局部极小值。

SGD(Stochastic gradient descent)

梯度更新规则:
和 BGD 的一次用所有数据计算梯度相比,SGD 每次更新时对每个样本进行梯度更新,
对于很大的数据集来说,可能会有相似的样本,这样 BGD 在计算梯度时会出现冗余,
而 SGD 一次只进行一次更新,就没有冗余,而且比较快,并且可以新增样本。

 

缺点:
但是 SGD 因为更新比较频繁,会造成 cost function 有严重的震荡。

BGD 可以收敛到局部极小值,当然 SGD 的震荡可能会跳到更好的局部极小值处。

当我们稍微减小 learning rate,SGD 和 BGD 的收敛性是一样的。

Mini-batch gradient descent

梯度更新规则:
MBGD 每一次利用一小批样本,即 n 个样本进行计算,
这样它可以降低参数更新时的方差,收敛更稳定,
另一方面可以充分地利用深度学习库中高度优化的矩阵操作来进行更有效的梯度计算。

 

 

和 SGD 的区别是每一次循环不是作用于每个样本,而是具有 n 个样本的批次

超参数设定值:
n 一般取值在 50~256

缺点:
Mini-batch gradient descent 不能保证很好的收敛性,

  1. learning rate 如果选择的太小,收敛速度会很慢,如果太大,loss function 就会在极小值处不停地震荡甚至偏离。

有一种措施是先设定大一点的学习率,当两次迭代之间的变化低于某个阈值后,就减小 learning rate,不过这个阈值的设定需要提前写好,这样的话就不能够适应数据集的特点。

  1. 此外,这种方法是对所有参数更新时应用同样的 learning rate,如果我们的数据是稀疏的,我们更希望对出现频率低的特征进行大一点的更新。

  2. 另外,对于非凸函数,还要避免陷于局部极小值处,或者鞍点处,因为鞍点周围的error 是一样的,所有维度的梯度都接近于0,SGD 很容易被困在这里。

鞍点就是:一个光滑函数的鞍点邻域的曲线,曲面,或超曲面,都位于这点的切线的不同边。
例如这个二维图形,像个马鞍:在x-轴方向往上曲,在y-轴方向往下曲,鞍点就是(0,0)

 

 

Momentum

SGD方法的一个缺点是,其更新方向完全依赖于当前的batch,因而其更新十分不稳定。解决这一问题的一个简单的做法便是引入momentum。

momentum即动量,它模拟的是物体运动时的惯性,即更新的时候在一定程度上保留之前更新的方向,同时利用当前batch的梯度微调最终的更新方向。这样一来,可以在一定程度上增加稳定性,从而学习地更快,并且还有一定摆脱局部最优的能力:

Δxt=ρΔxt−1−ηgt

其中,ρ 即momentum,表示要在多大程度上保留原来的更新方向,这个值在0-1之间,在训练开始时,由于梯度可能会很大,所以初始值一般选为0.5;当梯度不那么大时,改为0.9。η 是学习率,即当前batch的梯度多大程度上影响最终更新方向,跟普通的SGD含义相同。ρ 与 η 之和不一定为1。

Nesterov Momentum

这是对传统momentum方法的一项改进,由Ilya Sutskever(2012 unpublished)在Nesterov工作的启发下提出的。

其基本思路如下图:

 

Nesterov Momentum

首先,按照原来的更新方向更新一步(棕色线),然后在该位置计算梯度值(红色线),(则在计算梯度时,不是在当前位置,而是未来的位置上)然后用这个梯度值修正最终的更新方向(绿色线)。上图中描述了两步的更新示意图,其中蓝色线是标准momentum更新路径。

公式描述为: 

Δxt=ρΔxt−1−ηΔf(xt+ρΔxt−1)

Adagrad

上面提到的方法对于所有参数都使用了同一个更新速率。但是同一个更新速率不一定适合所有参数。比如有的参数可能已经到了仅需要微调的阶段,但又有些参数由于对应样本少等原因,还需要较大幅度的调动。

Adagrad就是针对这一问题提出的,自适应地为各个参数分配不同学习率的算法。

 

其中gt 同样是当前的梯度,连加和开根号都是元素级别的运算。eta 是初始学习率,由于之后会自动调整学习率,所以初始值就不像之前的算法那样重要了。而ϵ是一个比较小的数,用来保证分母非0。

其含义是,对于每个参数,随着其更新的总距离增多,其学习速率也随之变慢。

Adadelta

Adagrad算法存在三个问题

  • 其学习率是单调递减的,训练后期学习率非常小
  • 其需要手工设置一个全局的初始学习率
  • 更新xt时,左右两边的单位不统一

Adadelta针对上述三个问题提出了比较漂亮的解决方案。

首先,针对第一个问题,我们可以只使用adagrad的分母中的累计项离当前时间点比较近的项。

这里ρ是衰减系数,通过这个衰减系数,我们令每一个时刻的gt随之时间按照ρ指数衰减,这样就相当于我们仅使用离当前时刻比较近的gt信息,从而使得还很长时间之后,参数仍然可以得到更新。

RMSprop

RMSprop 是 Geoff Hinton 提出的一种自适应学习率方法。

RMSprop 和 Adadelta 都是为了解决 Adagrad 学习率急剧下降问题的,

梯度更新规则:
RMSprop 与 Adadelta 的第一种形式相同:

 

 

超参数设定值:
Hinton 建议设定 γ 为 0.9, 学习率 η 为 0.001。

Adam

这个算法是另一种计算每个参数的自适应学习率的方法。

除了像 Adadelta 和 RMSprop 一样存储了过去梯度的平方 vt 的指数衰减平均值 ,也像 momentum 一样保持了过去梯度 mt 的指数衰减平均值:

 

 

如果 mt 和 vt 被初始化为 0 向量,那它们就会向 0 偏置,所以做了偏差校正,
通过计算偏差校正后的 mt 和 vt 来抵消这些偏差:

 

 

梯度更新规则:

 

 

超参数设定值:
建议 β1 = 0.9,β2 = 0.999,ϵ = 10e−8

实践表明,Adam 比其他适应性学习方法效果要好。

如何选择?

如果数据是稀疏的,就用自适用方法,即 Adagrad, Adadelta, RMSprop, Adam。

RMSprop, Adadelta, Adam 在很多情况下的效果是相似的。

Adam 就是在 RMSprop 的基础上加了 bias-correction 和 momentum,

随着梯度变的稀疏,Adam 比 RMSprop 效果会好。

整体来讲,Adam 是最好的选择。

很多论文里都会用 SGD,没有 momentum 等。SGD 虽然能达到极小值,但是比其它算法用的时间长,而且可能会被困在鞍点。

如果需要更快的收敛,或者是训练更深更复杂的神经网络,需要用一种自适应的算法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

几种优化算法的比较(BGD、SGD、Adam、RMSPROP) 的相关文章

  • el-form表单中el-form-item嵌套表格嵌套表单校验

  • spss对数据进行聚类分析(系统聚类法和k-均值聚类法)和判别分析(费歇尔和贝叶斯)。

    为了方便大家理解 以三道题为例 实现聚类分析和判别分析的演示 1 为了研究世界各国森林 草原资源的分布规律 共抽取了21个国家的数据 每个国家4项指标 原始数据见下表 试用该原始数据对国别进行系统聚类和K 均值聚类 分3类 分析 国别 森林
  • 文章发布系统的设计与实现

    摘 要 随着计算机技术的迅速发展 网络正以一种前所未有的冲击力影响着人类的生产和生活 网络的快速发展 颠覆了传统的信息传播方式 冲破了传统的时间 空间的局限性 继而引发了人类阅读方式的变革 现如今 网络阅读已成为一种新的时尚 在这种趋势下
  • ESP8266 WIFI模块实现远程wifi控制

    http www geek workshop com thread 11266 1 1 html http bbs elecfans com forum php mod viewthread tid 536464 http www extr
  • Ubuntu18.04.6 配置固定ip、ssh登录、root账号

    上文讲解了如何下载安装ubuntu https blog csdn net weixin 47491957 article details 128839639 ubuntu在安装完成后 是不能进行ssh登录 且没有root账号 本文带来如何
  • 深入剖析 Python 最常用数据结构:列表(List) & 元组(Tuple)

    1 定义 列表和元组 都是一个可以放置任意数据类型的有序集合 在大多数编程语言中 集合内元素的数据类型必须保持一致 但在 Python 的列表与元组中 没有这个约束 示例 列表 List Tom 22 33 tony 元组 Tuple Ch
  • 网易新闻的api

    一些新闻的api 一 网易 http c m 163 com nc article headline T1348647853363 0 40 html 头条 http c 3g 163 com nc article list T146728
  • 浏览器网页被劫持

    你是否遇到过网页被劫持 正常打开却发现 这种情况能容忍吗 能忍但是没必要 首先打开浏览器网页被劫持不要慌 浏览器右键打开属性 你会发现目标 后面 这里多了一个网址 把它干掉你会发现 大无语事件发生了 好家伙 想直接干掉这个还没权限 右键属性
  • 桌面图标有蓝色阴影终极解决方法

    桌面图标有蓝色阴影 桌面图标背景出现蓝色阴影是怎么回事呢 通常情况下桌面图标变成蓝色背景是由于一些错误的设置而导致的 虽然它不影响系统的正常运行 但是看起来总是不舒服的 网上也有很多处理桌面图标背景出现蓝色阴影的方法 但大都不太全面 引起这
  • Android 手机影音 开发过程记录(四)

    前一篇已经将视频播放页面的布局弄好了 这一篇主要来处理播放页面的各种逻辑 播放 暂停 上 下一个视频 音量 进度 逻辑比较多 一点一点贴代码 顶部布局的逻辑 显示系统时间 时间是一秒一秒更新的 所以可以通过循环发消息的方法来更新系统时间 相
  • 离散对数密码学原理

    一 简介 离散对数被誉为当代密码学领域的三大基础之一 1976年 Diffifie和Hellman提出了一种密钥协商协议 产生了首个离散对数系统模型 8年后 ElGamal提出了基于离散对数系统的公钥加密和签名方法 并奠定了离散对数密码学基
  • 解决Visual Studio 2017启动后不显示窗体

    今晚启动VS等了很久都没有显示窗体 电脑也没有卡死的迹象 只是在任务栏里显示了图标 试了很多常规操作 检查兼容性的时候发现一个叫devenv exe的程序似乎是导致这个问题的原因 有趣的是我在Windows上看到了有人提交了这个问题 有的人
  • apache配置双向ssl认证(笔记)

    一 CA自签 Linux下先安装openssl 安装路径于 usr local openssl 1 修改openssl配置文件 etc pki tls openssl cnf 设置好 dir usr local openssl ssl mi
  • 随笔之---基于信号量实现,生产者与消费者模型

    Class BoundedBuffer mutex new Semaphore 1 hasBuffer new Semaphore n 有n个空buffer 用来装数据 hasData new Semaphore 0 记录有数据的buffe
  • Java导出压缩包zip文件

    需要导出一些图片和一个文本 一起放到zip压缩包中 GetMapping downloadZip public void downloadZip HttpServletResponse response throws IOException
  • 解决ffmpeg视频转码后视频清晰度下降的问题

    清晰度 Chrome不支持非h264编码的mp4视频播放 可通过ffmpeg将视频转码成h264编码 ffmpeg i input mp4 vcodec h264 b v 0 output mp4 注 如果不加参数 b v 0 会有精度损失
  • Flutter Text控件在不同手机上不居中的问题

    在最近flutter页面改造过程中 发现通过Contail包裹Text控件设置上下padding时 在华为魅族和vivo等手机上并没有居中展示 所以通过查看控件属性 得以解决此类问题 可以看到上面的在华为手机上明显偏下了 使用 Contai
  • 找出一批正整数中的最大偶数_c语言求一批正整数的奇数和-求奇数和输入一批正整数c语言程序-找出一批正整数中最大的偶数c语言...

    include stdio h int main int a 10 i j k printf 输入10个整数 n for i k 0 i lt 10 i scanf d a k for j 0 j if a k a j k k printf
  • [疯狂Java]面向对象:单例模式

    1 单例模式的应用 1 单例类就是指该类最多只能创建一个对象 不能创建超过一个的对象 2 这样做的原因 要么就是为了降低系统开销 要么这种类型的对象创建了多个没有任何意义 最多只需要一个就行 例如窗口管理器 假脱机打印设备 数据库引擎访问结
  • TCP传输过程详解——三次握手、四次挥手

    TCP 3 1 三次握手 重点 3 2 四次挥手 重点 3 3 通过序列号与确认应答提高可靠性 3 4 重发超时的确定 3 5 以段为单位发送数据 3 6 利用窗口控制提高速度 3 7 滑动窗口控制 3 8 窗口控制中的重发控制 TCP T

随机推荐

  • ICCV19 (Oral)

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 本文作者 洪晓鹏 https zhuanlan zhihu com p 127956794 本文已由原作者授权 不得擅自二次转载 Zhiheng Ma Xing Wei
  • 苹果发布iOS16正式版,各机型升级建议

    文章目录 前言 升级注意事项 iOS 16增加了哪些功能 1 锁屏界面大改动 2 全新专注模式 3 查看Wi Fi密码 4面容ID横屏解锁 5 电量百分比 6 支持任天堂Switch手柄 7 键盘输入震动 8 隐藏相册支持加密 9 清理重复
  • Linux 信号(三) —— 强大的sigaction

    在Linux中 对于信号的收发有着两组函数 1 入门版 发送函数 int kill pid t pid int sig 接收函数 sighandler t signal int signum sighandler t handler 这组函
  • MyBatis进阶版

    本文有点难 目录 1 一些区分 1 1参数占位符 和 1 1 1SQL注入 1 1 2like查询 1 2resultType和resultMap 2 映射查询 2 1一对一表映射 2 2一对多表映射 3 动态SQL 3 1标签 3 2标签
  • esp32使用fft算法显示音乐频谱

    演示参考下方视频 源码链接在视频末尾获取 点击查看视频 介绍 本项目使用esp32s3 ifd4 2 声音传感器以及tft显示屏构成 使用快速傅里叶变换算法处理采集到的音频数据 fft处理后的数据使用lvgl显示在tft屏幕上 电路图 源码
  • SpringBoot MongoDB批量删除指定日期前的文件

    SpringBoot MongoDB批量删除指定日期前的文件 Query query new Query LocalDateTime localDateTime LocalDateTime of 2021 6 1 0 0 0 query a
  • 《动手学深度学习 Pytorch版》 2.1 数据操作

    2 1 1 数据操作 注意此处 import 的不是 pytorch 而是 torch Torch 是采用 lua 语言实现的 从某种程度上说 PyTorch 是 Torch 的 Python 版本 当然还是有部分差别的 import to
  • python学生分布_python统计函数库scipy.stats的用法解析

    背景 总结统计工作中几个常用用法在python统计函数库scipy stats的使用范例 正态分布 以正态分布的常见需求为例了解scipy stats的基本使用方法 1 生成服从指定分布的随机数 norm rvs通过loc和scale参数可
  • CDUA 图形学 Texture Reference 实验

    下面是对Texture Reference的实验 代码改自 CUDA C PROGRAMMING GUIDE PG 02829 001 v10 0 October 2018 p54 因为这里比较贴近计算机图形学 故移到图形学中去 版权所有
  • Java基础面试题一:请说说抽象类和接口的区别?

    1 抽象类实例 abstract class person public String name 可以有普通成员变量 public static String sex 可以有静态成员变量 public static void eat 可以有
  • 用GDB跟踪观察共享库函数的地址翻译过程

    用GDB跟踪观察共享库函数的地址翻译过程 用GDB观察共享库函数的翻译过程 研究了一下共享库函数是怎样加载到当前进程中的 开始共享库函数地址放在GOT中 第一次调用时 ld将其翻译成函数在程序空间的真实地址 用GDB跟踪了一下整个过程 记录
  • 宋浩概率论笔记(二)随机变量

    本章节内容较多 是概率论与数理统计中最为重要的章节 对于概率密度和分布函数的理解与计算要牢牢掌握 才能在后期的学习中更得心应手
  • 安装docker后启动报错Failed to set version to docker-desktop: exit code: -1

    背景 我想用PC Windows 上的VS code连接远程服务器 Linux 内的docker容器 这样能用编辑器editor修改文件 更加方便 VS code的插件remote container能达到这一目的 按照它的指示guide
  • 性能自动化测试

    性能自动化测试 1 为什么要做性能测试 2 什么是性能测试 3 性能测试分类 1 压力测试 2 负载测试 3 配置测试 4 基准测试 5 并发测试 6 容量测试 7 稳定性测试 4 什么时候需要进行何种性能测试 5 性能测试常见指标 1 响
  • Iterable的常见方法以及含义

    1 Iterable Iterable是java集合接口的顶级接口之一 这是这个接口中的iterator方法 用来返回一个实现了Iterator接口的对象 1 1Iterator接口中的方法 1 1 1forEachRemaining方法
  • MultipartFile.transferTo(dest) 报找不到文件

    MultipartFile transferTo dest 报找不到文件 今天使用transferTo这个方法进行上传文件的使用发现了一些路径的一些问题 查找了一下记录问题所在 前端上传网页 使用的是单文件上传的方式
  • C++调用C函数

    前言 以前见到extern C 这样的语句 只是简单地知道跟外部链接有关 但是没有深刻理解它的意思 首先 为什么要使用extern C 修饰符 C 调用其它语言的函数 由于编译器生成函数的机制不一样 所以需要经过特殊处理 才可以调用 调用C
  • SQL 四种语言基本操作

    SQL Structured Query Language 结构化查询语言 SQL主要4个部分 数据定义类SQL DDL DATE DEFINITION LANGUAGE CREATE 创建数据库及其对象 表 索引 视图 存储过程 函数和触
  • 线索二叉树的先序、中序、后序

    线索二叉树的先序 中序 后序 Name 线索二叉树 Copyright Author lkm Date 30 09 21 14 50 Description include
  • 几种优化算法的比较(BGD、SGD、Adam、RMSPROP)

    前言 这里讨论的优化问题指的是 给定目标函数f x 我们需要找到一组参数x 使得f x 的值最小 本文以下内容假设读者已经了解机器学习基本知识 和梯度下降的原理 Batch gradient descent 梯度更新规则 BGD 采用整个训