如何理解Adam算法(Adaptive moment estimation)?

2023-11-03

作者:薰风初入弦
链接:https://www.zhihu.com/question/323747423/answer/790457991
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

文章和论文看不懂,通常有三个原因:

  1. 对前置知识掌握不佳
  2. 没有结合理论与实践
  3. 没有对知识形象理解

Adam本质上实际是RMSProp+动量。但如果你对随机梯度下降SGD的知识,以及Adam之前的几个更新方法一无所知。那么当你看到一个“复杂的”Adam看了就头大(请不要嘲笑初学者,当年我也觉得深度学习各个地方都超复杂)。

即使你看了论文和文章,如果不结合代码与实现,知道的也只是别人口中的“xxx的本质其实是xxx”,但这种别人的本质对你自己了解帮助不大。

最后,如果有个动图,Demo,实例,那么对你的帮助当然就更大啦。

这里我就结合这三点,好好讲一讲什么是Adam

本文翻译&改编自CS231n课件,链接见参考文献部分

一、引言 Introduction

现在假设你对反向传播的计算梯度的内容比较了解(不了解的欢迎在评论留言,我考虑有时间写),一旦能使用反向传播计算解析梯度,梯度就能被用来进行参数更新了。

进行参数更新有好几种方法,接下来都会进行讨论。深度网络的最优化是现在非常活跃的研究领域。(具体的细节看论文,请)

二、前置知识(Adam有关的更新方法)

  1. 普通更新

最简单的沿着负梯度方向改变参数(梯度指向的是上升方向,但要最小化损失函数)。

假设有一个参数向量x及其梯度dx,那么最简单的更新的形式是:

# 普通更新
x += - learning_rate * dx

其中,learning_rate是一个超参数,它是一个固定常量

当在整个数据集上进行计算时,只要学习率足够低,总是能在损失函数上得到非负的进展。

2. 动量(Momentum)更新

该方法从物理角度上对于最优化问题得到的启发。

损失值是山的高度(因此高度势能

 

,所以有

 

)。最优化过程可以看做是模拟参数向量(即质点)在地形上滚动的过程。因为作用于质点的力与梯度潜在能量

 

)有关,质点所受的力就是损失函数的(负)梯度。

重力势能,中学常识之一

还有,因为 F=ma,所以在这个观点下(负)梯度与质点的加速度成比例

注意这个理解与随机梯度下降(SDG)不同,在SGD中,梯度影响位置

而在这个版本的更新中,物理观点建议梯度只是影响速度,然后速度再影响位置

    # 动量更新
    v = mu * v - learning_rate * dx # 与速度融合
    x += v # 与位置融合
    

在这里引入了一个初始=0的 变量v 和一个超参数mu。变量 mu 在最优化的过程中被看做动量(一般值设为0.9),但其物理意义与摩擦系数更一致

这个变量有效地抑制了速度,降低了系统的动能,不然质点在山底永远不会停下来。

通过交叉验证,mu通常设为[0.5,0.9,0.95,0.99]中的一个。和学习率随着时间退火(下文有讨论)类似,动量随时间变化能略微效果,其中动量在学习过程的后阶段会上升

一个典型的设置是刚开始0.5,多个周期(epoch)中慢慢提升到0.99。

通过动量更新,参数向量会在任何有持续梯度的方向上增加速度。

3. Nesterov动量

与普通动量不同,最近比较流行。在理论上对于凸函数能更好的收敛,在实践中也表现更好。

核心思路 :

当参数向量位于某个位置 x 时,观察上面的动量更新公式,动量部分(momentum step)会通过mu * v改变参数向量。

因此,如要计算梯度,那么可以将未来的近似位置 x+mu*v看做是“向前看”,这个点在我们一会儿要停止的位置附近。因此,计算 x+mu*v的梯度而不是“旧”位置 x 的梯度就有意义了。

Nesterov动量

既然动量会把参数带到绿色箭头指向的点,那就不要在原点(红色点)那里计算梯度了。

使用Nesterov动量,我们就在这个“向前看”的地方计算梯度。

也就是说,添加一些注释后,实现代码如下:

x_ahead = x + mu * v
#   计算dx_ahead(在x_ahead处的梯度,而不是在x处的梯度)
v = mu * v - learning_rate * dx_ahead
x += v  

上面的程序还得写 dx_ahead,就很麻烦。

但通过对 x_ahead = x + mu * v 使用变量变换进行改写是可以做到的,然后用x_ahead而不是x来表示上面的更新。

也就是说,实际存储的参数向量总是向前一步版本。x_ahead 的公式(将其重新命名为x)就变成了:

v_prev = v # 存储备份
v = mu * v - learning_rate * dx # 速度更新保持不变
x += -mu * v_prev + (1 + mu) * v # 位置更新变了形式

3. RMSprop

非常高效,但没发表的适应性学习率方法。有趣的是,使用这个方法的人论文中都引用自Geoff Hinton的Coursera课程的第六课的第29页PPT。他修改了Adagrad方法,让方法不那么激进。

具体说来,就是它使用了一个梯度平方的滑动平均:

cache = decay_rate * cache + (1 - decay_rate) * dx**2
x += - learning_rate * dx / (np.sqrt(cache) + eps)

在上面的代码中,decay_rate是一个超参数常用[0.9,0.99,0.999]

x+=和Adagrad中是一样的,但是cache变量是不同的。因此,RMSProp仍然是基于梯度的大小来对每个权重的学习率进行修改,这同样效果不错。但其更新不会让学习率单调变小。

以上就是所有需要的前置知识,接下来就是正题了。

三、Adam

AdamRMSProp的动量版。简化的代码是下面这样:

    m = beta1*m + (1-beta1)*dx
    v = beta2*v + (1-beta2)*(dx**2)
    x += - learning_rate * m / (np.sqrt(v) + eps)

注意,这方法和RMSProp很像,除了使用的是平滑版的梯度m,而不是原始梯度dx。

推荐参数值eps=1e-8, beta1=0.9, beta2=0.999。

在实际操作中,推荐Adam作为默认算法,一般比RMSProp要好一点。

但是也可以试试SGD+Nesterov动量。

完整的Adam更新算法也包含了一个偏置(bias)矫正机制,因为m,v两个矩阵初始为0,在没有完全热身之前存在偏差,需要采取一些补偿措施。

不同最优化方法效果

注意基于动量的方法射偏了的情况,使得最优化过程看起来像是一个球滚下山的样子。

上图展示了一个马鞍状的最优化地形,其中对于不同维度它的曲率不同(一个维度下降另一个维度上升)。注意SGD很难突破对称性,一直卡在顶部。而RMSProp之类的方法能够看到马鞍方向有很低的梯度。

因为在RMSProp更新方法中的分母项,算法提高了在该方向的有效学习率,使得RMSProp能够继续前进。

参考文献:

http://cs231n.github.io/neural-networks-3/

转载于:

https://www.zhihu.com/question/323747423/answer/790457991

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

如何理解Adam算法(Adaptive moment estimation)? 的相关文章

  • 分隔符File.separator和File.pathSeparator和\\ 的区别

    一 File pathSeparator在win7上输出的话 显示为 分号 二 而 File separator 才是路径分隔符 注 可移植行强 是首选 三 在不同系统上不一样
  • React.memo 如何使用?

    大家好 我是前端西瓜哥 最近做的新功能有性能问题 所以我想尝试优化一下 React 组件的性能 下面我们来好好学习一下 React memo 的用法 组件状态更新和重渲染 当某个组件里的状态发生改变时 React 会调用该组件的 rende
  • cuda流硬件原理和多流优化

    创建流 cudaStream t stream cudaStreamCreate stream kernel lt lt lt gt gt gt 分配符第四个参数可带stream GPU将顺序执行已经放到stream中的工作 fun lt

随机推荐

  • 【JUC并发】黑马程序员:自定义连接池,享元模式+AtomicIntegerArray+synchronized+wait()+notify()

    另一版本请查看本人博客 黑马JUC 自定义连接池 享元模式 AtomicIntegerArray Semaphore 一个线上商城应用 QPS 达到数千 如果每次都重新创建和关闭数据库连接 性能会受到极大影响 这时 预先创建好一批连接 放入
  • 关于手机常见音频POP音产生的原因以及解决思路(一)——耳机插入与拔出

    最近在项目上debug音频POP音问题 属于手机音频关闭播放后的一小段时间产生的POP音 音频PA采用的是某知名厂商的模拟PA 无论数字PA还是模拟PA 虽然有所差别 但是debug思路是相似的 只是换汤不换药而已 其实 在手机音频POP音
  • vs2019如何输入参数然后运行

    可以在 Visual Studio 2019 中输入参数并运行程序的方法如下 打开 Visual Studio 2019 打开要输入参数并运行的项目 在项目解决方案资源管理器窗口中 右键单击要运行的程序文件 然后选择 属性 在 属性 窗口中
  • 用最小二乘法OLS做回归,并解读结果

    使用OLS做回归 使用OLS做多元线性回归拟合 from sklearn import linear model cross validation feature selection preprocessing import statsmo
  • MySQL-索引与事务

    MySQL 关于索引与事务知识点 无聊 突然想尝试着默写一下索引与事务中的知识点 顺带总结总结面试常考问题 默写完在文章后面继续补充默写中没有提及的重要知识点 单纯的尝试尝试看能记住多少 索引 为什么要使用索引 面试中如果遇到这样的概念问题
  • 70.写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度

    char型指针 当没有带号时 指的是内存的某一个位置 带号时 指的是这个位置上存储的内容 当它指向一个字符串时 指向的是字符串的第一位 当p 的时候 就是指针往后挪一位的意思 include
  • 毕业3年,Java程序员年薪拿到20万,他是怎么做到的?

    我14年专科毕业 到今已有3个年头 期间入职过两家公司 很多次学习技术 都是走到临门一脚 然后就没有往下了 我和大牛之间的差距就是 别人看完了源码 而我只是会用 这是我20170412做的一次笔记 最后记住就是有多少种设计模式 系统的了解一
  • Revit门窗标记的BoundingBox之Transform转换

    最近在尝试门窗标记与主体的位置匹配 在获取标记 IndepentTag 的BoundingBoxXYZ时 发现但凡是倾斜的标记 所获取的BoundingBoxXYZ永远是正交的 这就无法计算出标记相对于门窗主体图元方向的实际长度和高度 有没
  • 1716 计算力扣银行的钱

    题目描述 Hercy 想要为购买第一辆车存钱 他 每天 都往力扣银行里存钱 最开始 他在周一的时候存入 1 块钱 从周二到周日 他每天都比前一天多存入 1 块钱 在接下来每一个周一 他都会比 前一个周一 多存入 1 块钱 给你 n 请你返回
  • 计算机网络之Token、JWT

    文章目录 计算机网络之Token JWT 1 登录验证的方式 2 token定义 3 taken刷新 4 JWT跨域认证 5 JWT跨域认证起源 6 JWT原理 7 JWT的数据结构 7 1介绍 7 2Header 7 3Playload
  • 14.大数据学习之旅——HBASE表设计&HBase优化

    HBASE表设计 Rowkey设计 Rowkey是不可分割的字节数 按字典排序由低到高存储在表中 在设计HBase表时 Rowkey设计是最重要的事情 应该基于预期的访问模式来为Rowkey建 模 Rowkey决定了访问HBase表时可以得
  • Nginx的负载均衡 - 整体架构

    Nginx版本 1 9 1 我的博客 http blog csdn net zhangskd 什么是负载均衡 我们知道单台服务器的性能是有上限的 当流量很大时 就需要使用多台服务器来共同提供服务 这就是所谓的集群 负载均衡服务器 就是用来把
  • mysql属于dql语句的是_mysql学习日记——DQL语句

    DQL 查询语句 select字段列表from表名列表where条件列表group by分组字段having分组之后的条件order by排序 limit 分页限定 基础查询 1 多个字段的查询 select 字段名1 字段名2 from
  • Visual Studio 2015 的安装和使用

    VS2015 是现在微软公司最新也是最强大的IDE 可以开发C C VB Android iOS等多种语言和平台的应用程序 而且 对应的免费版本VS2015 社区版 也出来了 如果只是为了初学或者是想尝试一下VS的同学 可以下载VS2015
  • 网络工程师干货:华为设备故障管理命令大全

    alarm 系统视图 命令功能 alarm命令用来进入告警管理视图 命令格式 alarm 使用实例 进入告警管理视图
  • selenium处理网页下拉加载数据爬取并存入excel

    前言 之前有个同学询问我是否能够爬取知乎的全部回答 当初只会Scrapy无法实现下拉的数据全部加载 后来在意外中接触了selenium的自动化测试 看出了selenium的模拟能力的强大 而昨天有个同学问我能否爬取中国工商银行远程银行的精彩
  • 编译ROS PCL工程时出现找不到包的问题

    编译PCL工程时 如果出现类似这样的问题 Add the installation prefix of visualization to CMAKE PREFIX PATH or set 则意味着编译器找不到相关包 则我们可以通过添加 fi
  • 基于qt的人脸识别

    文章目录 前言 一 Ubuntu中运行效果 二 代码部分 1 工程结构 2 camera代码 移植到linux板子上面的思路 前言 提示 这里可以添加本文要记录的大概内容 今天准备用qt做一个人脸识别功能 同时看能不能移植到板子上面 提示
  • 电子电路技术基础之频率响应

    电子电路技术基础之放大电路的频率响应 文章目录 电子电路技术基础之放大电路的频率响应 前言 一 频率响应概述 基本概念 二 波特图 总结 前言 郑老师模电课听课笔记 23 一 频率响应概述 基本概念 高通电路 传输特性 下限截止频率 最大值
  • 如何理解Adam算法(Adaptive moment estimation)?

    作者 薰风初入弦 链接 https www zhihu com question 323747423 answer 790457991 来源 知乎 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 文章和论文看不懂 通常有