优化器(Optimizer)介绍

2023-05-16

Gradient Descent(Batch Gradient Descent,BGD)

梯度下降法是最原始,也是最基础的算法。

它将所有的数据集都载入,计算它们所有的梯度,然后执行决策。(即沿着梯度相反的方向更新权重)

优点是在凸函数能收敛到最小值。但显而易见的是,这方法计算量太大。假如我们的数据集很大的话,普通的GPU是完全执行不来的。还有一点,它逃不出鞍点,也容易收敛到局部最小值(也就是极小值)。

Stochastic Gradient Descent

参考:
https://zhuanlan.zhihu.com/p/27609238 (关于海森矩阵的没学过)
https://blog.csdn.net/bvl10101111/article/details/72615621 (Momentum)

随机梯度下降法相比较BGD,其实就是计算梯度时根据的数据不同。SGD根据的是一整个数据集的随机一部分(上网有些介绍都是说根据每一个样本,emmm,但是现在都是采用一个随机的部分样本)。

也就是说,它更新的速度比较频繁。因为我们随机选取的小批量数据(mini-batch)并不是太多,所以计算的过程也并不是很复杂。相比起BGD,我们在相同的时间里更新的次数多很多,也自然能更快的收敛。

但还是有缺点的,一个是CS231n提到的:

这里我不是很明了,涉及到了海森矩阵。原话是假设二维的例子中损失函数在某个方向变化很快但在另外个方向变化很慢,SGD就会在变化慢的方向来回,导致变化快的方向不会有很大的跨度。

不过在看了一个例子我觉得很形象,在https://zhuanlan.zhihu.com/p/21486826。它用:

这里写图片描述
类比:

我们可以很清楚的联想起来,在滑板的时候,假如你的起点在两边的边上,你能够想象,你下降最快的方向不是沿着左右两边,而是斜着向下。这样,我们权重更新的方向也会跟着一样。

还有一个是噪声会相对较大。这个很容易理解,因为你应用在整个训练集的模型,它更新的梯度却是利用训练集的一部分。但在网上找资料的时候,https://zhuanlan.zhihu.com/p/36816689,讲了噪声如何帮助SGD逃出鞍点。

但是CS231n是用了另外一种方法来使得SGD克服上面所提到的缺点,例如。那就是加上一个动量(Momentum)。

可以看到,现在SGD更新的梯度不仅是算出来的梯度,更要加上上一步的梯度。但有个参数 ρ ρ 让我们调整上一步梯度占的比重。

现在来看看如何做到克服上面的问题的。前面说到无法逃离鞍点和极小值(哪个方向损失都增大)是因为梯度都为0,因此停滞不前。但由于这个Momentum的出现,导致在哪个地点都还有一定的梯度,所以我们的网络可以继续更新下去。至于那个之字形,我画了一个图。

在标记的蓝色那个点,如果不加Momentum,更新的方向就是蓝色向量。但是由于我们加了个上一步的梯度,也就是绿色的向量,现在我们更新的向量是黄色的,也就是不再是垂直方向,而是在水平方向。这在一定程度就克服了上面说的缺陷。

Nesterov

图片来自于:https://blog.csdn.net/tsyccnh/article/details/76673073(也有讲解不同的优化器)

Momentum:
这里写图片描述
Nesterov:
这里写图片描述

其实这个作图有点让人混乱,因为这样看它们好像是更新一样的梯度。其实不是的。在第二幅图里面,C走到D是根据C那个点的梯度,然后作者把BD连起来说这是B点实际梯度下降的方向。所以,我们应该要搞清楚!!!它们不是一样的。

我们可以让每个字母代表对应点的参数, g(a) g ( a ) 代表 a a 的梯度,那:

Momentum:g(b)=ρg(a)+g(b)g(b)=bαg(b)Nesterov:g(b)=ρg(a)+g(bαρg(a))=ρg(a)+g(c)g(b)=bαg(b)

当然,也有人认为Nesterov只是多算了一次梯度,但事实并不是这样。
有位大神在http://www.360doc.com/content/16/1010/08/36492363_597225745.shtml最下面推理了过程,可以得出结论为:

结论:在原始形式中,Nesterov Accelerated Gradient(NAG)算法相对于Momentum的改进在于,以“向前看”看到的梯度而不是当前位置梯度去更新。经过变换之后的等效形式中,NAG算法相对于Momentum多了一个本次梯度相对上次梯度的变化量,这个变化量本质上是对目标函数二阶导的近似。由于利用了二阶导的信息,NAG算法才会比Momentum具有更快的收敛速度。

AdaGrad

我们累计每一次梯度的平方,接着让学习率除以它的开方。这个的作用是为了改变不同参数的学习率。假如一个参数的梯度一直很大,那么通过这个约束,它改变的就越少。假如一个参数的梯度一直很小,那么通过这个约束它,它变化的也就越快。这里的 1e7 1 e − 7 是防止分母为0。

但问题是,因为是一直在累积的,这个grad_squared一定会变得越来越大,最后的结果是,权重更新的步长也会不可避免的变得很小。为了克服这个问题,有了RMSpro。

RMSprop

可以看出来,它只是改变了grad_squared。添加了一个衰减率(一般0.9或者0.99),可以使得grad_squared的变化不会因为时间的累积而变得太大。

但也由于衰减的问题,grad_squard是可能导致我们训练一直在变慢的。(我理解是后面累积的梯度太少了,但因为前面的梯度太多,没有办法加速,当然,我没有找到资料,但斯坦福课程上面Johnson是这样说的)

PS:有些人将RMSprop和Nesterov结合起来。

Adam

可以看出来,红色的部分是类似与Momentum的方法,而蓝色的部分则是利用了RMSprop的衰减。因此这个算法是很好的结合了这两个的优点。

之所以有绿色方框的Bias Correction是因为想要避免一个情况:一开始的梯度太小,因此学习率除以second_moment的值太大,步长太大容易跑到一个奇怪的地方。导致收敛之后的效果不好。因此我们有了Bias correction,学习率也是除以second_unbias。

Adam一般来说是收敛最快的优化器,所以被用的更为频繁。当然,它还有变体AdamMax,但知道了Adam再去看其它也不是很难了。

总览

这里写图片描述
这里写图片描述
图片来自: https://blog.csdn.net/u010089444/article/details/76725843
图片作者:Alec Radford

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

优化器(Optimizer)介绍 的相关文章

  • linux 安装JDK

    一 下载JDK 版本 xff1a jdk 8u191 linux x64 tar gz 链接 xff1a https pan baidu com s 1w9HpHBRPHCfoiEpGSKJqXA 提取码 xff1a whya 二 安装 创
  • java调用DLL之jna

    一 添加maven依赖 span class token comment lt https mvnrepository com artifact net java dev jna jna gt span span class token t
  • 三、vue :定义变量、v-for、v-on示例

    一 vue定义变量 let xff1a 定义变量const xff1a 定义常量 contst定义常量时 xff0c 必须赋值 指向的对象不可改变 xff0c 但是对象中的属性 contst obj 61 name 39 张三 39 obj
  • 二、vue插值操作

    一 Mustache mustache语法就是两个大括号 34 34 mastache语法不仅直接可以写值 xff0c 也可以写一些简单的表达式 span class token tag span class token tag span
  • 二、vue中v-bind使用

    一 v bind基本使用 一个页面中 xff0c 除了标签内容需要动态绑定外 xff0c 标签的属性也需要动态绑定 xff0c 例如 xff1a a元素的href属性和img元素的src属性 这时就需要用到v bind了 span clas
  • 四、vue计算属性的使用

    通常 xff0c 在模板中可直接通过插值语法显示data中的属性 xff0c 但是在某些情况 xff0c 需要将某些数据进行转化后显示或者将多个数据结合起来显示 计算属性的基本使用 span class token tag span cla
  • firewall-cmd 端口管理

    1 开放端口 firewall span class token operator span cmd span class token operator span zone 61 public span class token operat
  • BIND 高级特性(二)-- 动态更新(转)

    BIND 高级特性 xff08 二 xff09 xff0d xff0d 动态更新 转 64 more 64 在很多大的网络中为了简化维护量 xff0c 都使用了DHCP来动态分配IP地址 这样就要求DNS也能够动态的添加和删除记录 BIND

随机推荐

  • Vue内置指令——v-show

    v show的用法与v if类似 xff0c 不同的是带有 v show 的元素始终会被渲染并保留在 DOM 中 v show 只是简单地切换元素的 CSS 属性 display span class token doctype span
  • QtCreator按顺序编译多个子项目

    QtCreator按顺序编译多个子项目 0 环境1 创建子项目2 创建SubProjectSln的子项目3 三个项目内容3 1 Dll3 2 Lib3 3 UiApp 4 构建 0 环境 Qt5 3 2 mingw482 32 1 创建子项
  • windows与wsl互相访问

    找出能与WSL2连接的那个IP 启动WSL2 xff0c 键入如下命令 xff1a span class token function cat span etc resolv conf 如 xff1a nameserver 172 27 1
  • 平衡树的深度与最少结点数问题

    对于一棵平衡树 xff0c 如果以NhNh表示深度为h时含有的最少结点数 有如下的规律 xff1a N0 61 0 N1 61 1 N2 61 2 Nh 61 Nh 1 43 Nh 2 43 1 这里研究的是最小结点数 xff0c 最多结点
  • ubuntu报错记录:bash:XXX.sh权限不够统一解决办法

    在Ubuntu上执行提示如下报错时 xff1a bash xxx sh权限不够 其中的xxx表示报错文件名 解决办法 span class token function sudo span span class token function
  • Ubuntu 修改中文字体教程

    刚刚开始使用Ubuntu xff0c 在终端代码里可以看到奇奇怪怪丑陋的中文字体 xff0c 怎么换成更好看的中文字体呢 看了很多教程都是通过修改终端字体来实现 xff0c 但这样就不能使用自己想要的英文字体了 xff0c 比如我使用 So
  • STM32接口FSMC与FMC控制 XXROM

    FMC是STM32F429 439专有的 xff0c 因为驱动SDRAM时需要定时刷新 xff0c 而FSMC存在于F1和F4中我们常用的芯片中 他们的全称为 xff1a Flexible static memory controller
  • springcloud通过nacos整合seata遇到的问题

    1 配置完成后 xff0c 启动seata server服务器 xff0c 注册到nacos xff0c 启动client后访问接口 xff0c 报错如下 xff1a io seata common exception FrameworkE
  • mysql和redis双写一致性策略分析

    mysql和redis双写一致性策略分析 一 什么是双写一致性 当我们更新了mysql中的数据后也可以同时保证redis中的数据同步更新 xff1b 数据读取的流程 xff1a 1 读取redis 如果value 61 null 直接返回
  • js使用微信分享功能

    在使用微信分享 包括微信api里的其他方法 之前 xff0c 需要有一些准备 比如要准备 appId timestamp nonceStr signature 这四个数据 xff0c 只有在有这四个字段后 xff0c 我们才可以去使用微信的
  • the server send a disconnect packet/Start timer (TIMER_SHUTDOWN, 180).

    root 64 localhost Server rpm ivh xterm 215 5 el5 i386 rpm warning xterm 215 5 el5 i386 rpm Header V3 DSA signature NOKEY
  • IDEA和VSCode编辑器修改终端Terminal

    修改 Idea 终端 Terminal 为 GitBash 打开设置 xff08 快捷键 xff1a Ctrl 43 Alt 43 S xff09 xff0c 进入 Plugins 搜索栏搜索 Terminal xff0c 查看 Termi
  • 在PowerShell上创建并进入一个目录

    1 开始 运行 powershell 2 直接输入 xff0c 你想要把新建目录放在哪个盘下面 xff0c 我选的是d盘 xff0c 然后回车就会出现PS D gt 的字样 3 直接在后面输入new item xff08 新建目录 xff0
  • 13.5 JOIN语句

    13 5 JOIN语句 MySQL中的JOIN语句为各种连接查询 主要用来连接MySQL中的两个表或多个表 实现两个表或多个表之间的连接查询 13 5 1 INNER JOIN语句 INNER JOIN语句也叫作内连接语句 能够返回与连接条
  • 如何在Windows上使用cmd递归删除文件或文件夹?批量删除指定大小的图片文件

    如何在Windows上使用cmd递归删除文件或文件夹 xff1f span class token keyword for span r R span class token keyword in span span class token
  • QT中编译MQTT模块

    1 下载MQTT源码 下载地址 xff1a https github com qt qtmqtt https github com qt qtmqtt 不要下载点开链接后默认出现的版本 xff0c 选择和QT对应版本的源码 2 解压源码 u
  • python爬虫---网易云音乐下载

    python爬虫爬取网易云音乐 1 实现功能2 具体实现1 搜索部分2 下载歌曲1 再次获取信息2 下载 3 结语 Github完整代码获取 xff1a https github com Lian Zekun python spilder
  • httpd功能特性及配置介绍(一)

    一次web请求的基本过程 xff1a 建立连接 gt 接受请求 gt 处理请求 gt 访问资源 gt 构建响应 gt 发送响应 gt 记录日志 web服务器的输入 输出结构 单线程I O结构 多线程I O结构 复用的I O结构 复用的多线程
  • 不准再说linux丑,Ubuntu20.04+kde美化,动态桌面,软件安装

    ubuntu20 04美化教程 xff0c 附加动态壁纸教程 安装ubuntu kde ubuntu官网下载好最新发行版ubuntu20 04 xff0c 制作启动盘以最小安装 xff0c 安装系统 xff0c 然后替换 etc apt s
  • 优化器(Optimizer)介绍

    Gradient Descent xff08 Batch Gradient Descent xff0c BGD xff09 梯度下降法是最原始 xff0c 也是最基础的算法 它将所有的数据集都载入 xff0c 计算它们所有的梯度 xff0c