Adam和学习率衰减(learning rate decay)

2023-11-09

1、梯度下降法更新参数

梯度下降法参数更新公式:

其中,η 是学习率,θt是第 t 轮的参数,J(θt) 是损失函数,∇J(θt) 是梯度。

在最简单的梯度下降法中,学习率 ηη 是常数,是一个需要实现设定好的超参数,在每轮参数更新中都不变,在一轮更新中各个参数的学习率也都一样。

为了表示简便,令,所以梯度下降法可以表示为:

 

2、Adam 更新参数

Adam,全称 Adaptive Moment Estimation,是一种优化器,是梯度下降法的变种,用来更新神经网络的权重。

Adam 更新公式:

在 Adam 原论文以及一些深度学习框架中,默认值为 η=0.001,β1=0.9,β2=0.999,ϵ=1e−8。其中,β1 和 β2 都是接近 1 的数,ϵ 是为了防止除以 0。gt 表示梯度。

咋一看很复杂,接下一一分解:

前两行:

这是对梯度和梯度的平方进行滑动平均,使得每次的更新都和历史值相关。

中间两行:

这是对初期滑动平均偏差较大的一个修正,叫做 bias correction,当 tt 越来越大时,1−βt1和 1−βt2 都趋近于 1,这时 bias correction 的任务也就完成了。

最后一行:

这是参数更新公式。

学习率为,每轮的学习率不再保持不变,在一轮中,每个参数的学习率也不一样了,这是因为 η 除以了每个参数轮梯度均方和的平方根,即,而每个参数的梯度都是不同的,所以每个参数的学习率即使在同一轮也就不一样了。(可能会有疑问,t前面没有 999 轮更新怎么办,那就有多少轮就算多少轮,这个时候还有 bias correction 在。)

而参数更新的方向也不只是当前轮的梯度 gtgt 了,而是当前轮和过去共轮梯度的平均。

有关滑动平均的理解,可以参考我之前的博客:https://www.cnblogs.com/wuliytTaotao/p/9479958.html

 

3、Adam + 学习率衰减

在 StackOverflow 上有一个问题 Should we do learning rate decay for adam optimizer - Stack Overflow,我也想过这个问题,对 Adam 这些自适应学习率的方法,还应不应该进行 learning rate decay?

论文 《DECOUPLED WEIGHT DECAY REGULARIZATION》的 Section 4.1 有提到:

Since Adam already adapts its parameterwise learning rates it is not as common to use a learning rate multiplier schedule with it as it is with SGD, but as our results show such schedules can substantially improve Adam’s performance, and we advocate not to overlook their use for adaptive gradient algorithms.

上述论文是建议我们在用 Adam 的同时,也可以用 learning rate decay。

我也简单的做了个实验,在 cifar-10 数据集上训练 LeNet-5 模型,一个采用学习率衰减 tf.keras.callbacks.ReduceLROnPlateau(patience=5),另一个不用。optimizer 为 Adam 并使用默认的参数,η=0.001。结果如下:

加入学习率衰减和不加两种情况在 test 集合上的 accuracy 分别为: 0.5617 和 0.5476。(实验结果取了两次的平均,实验结果的偶然性还是有的)

通过上面的小实验,我们可以知道,学习率衰减还是有用的。(当然,这里的小实验仅能代表一小部分情况,想要说明学习率衰减百分之百有效果,得有理论上的证明。)

当然,在设置超参数时就可以调低 η 的值,使得不用学习率衰减也可以达到很好的效果,只不过参数更新变慢了。

将学习率从默认的 0.001 改成 0.0001,epoch 增大到 120,实验结果如下所示:

加入学习率衰减和不加两种情况在 test 集合上的 accuracy 分别为: 0.5636 和 0.5688。(三次实验平均,实验结果仍具有偶然性)

这个时候,使用学习率衰减带来的影响可能很小。

那么问题来了,Adam 做不做学习率衰减呢?
我个人会选择做学习率衰减。(仅供参考吧。)在初始学习率设置较大的时候,做学习率衰减比不做要好;而当初始学习率设置就比较小的时候,做学习率衰减似乎有点多余,但从 validation set 上的效果看,做了学习率衰减还是可以有丁点提升的。

ReduceLROnPlateau 在 val_loss 正常下降的时候,对学习率是没有影响的,只有在 patience(默认为 10)个 epoch 内,val_loss 都不下降 1e-4 或者直接上升了,这个时候降低学习率确实是可以很明显提升模型训练效果的,在 val_acc 曲线上看到一个快速上升的过程。对于其它类型的学习率衰减,这里没有过多地介绍。

 

4、Adam 衰减的学习率

从上述学习率曲线来看,Adam 做学习率衰减,是对 η 进行,而不是对  进行,但有区别吗?

学习率衰减一般如下:

  • exponential_decay:
    decayed_learning_rate = learning_rate * decay_rate ^ (global_step / decay_steps)

  • natural_exp_decay:
    decayed_learning_rate = learning_rate * exp(-decay_rate * global_step / decay_steps)

  • ReduceLROnPlateau
    如果被监控的值(如‘val_loss’)在 patience 个 epoch 内都没有下降,那么学习率衰减,乘以一个 factor
    decayed_learning_rate = learning_rate * factor

这些学习率衰减都是直接在原学习率上乘以一个 factor ,对 η 或对操作,结果都是一样的。

 

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

Adam和学习率衰减(learning rate decay) 的相关文章

随机推荐

  • pytorch每日一学24(torch.quantize_per_tensor()、torch.quantize_per_channel())使用映射过程将tensor进行量化

    第24个方法 torch quantize per tensor input scale zero point dtype Tensor torch quantize per channel input scales zero points
  • 用JSP实现简单的四则运算

    用JSP实现简单的四则运算 作者 GGG166 首先定义一个Java的CompuerBean类放在beans包中用来计算两个数的四则运算 代码如下 作者 GGG166 package beans public class CompuerBe
  • 机器学习实战第一章——读书笔记

    数据挖掘 使用机器学习方法挖掘大量数据来帮助发现不太明显的规律 这称作数据挖掘 机器学习分类标准 一 有监督学习和无监督学习 1 有监督学习 提供带标签的训练集 k 近邻算法 线性回归 逻辑回归 支持向量机 SVM 决策树和随机森林 神经网
  • blender 渲染预览按钮不见了怎么办

    如果你在使用 Blender 时发现渲染预览按钮不见了 你可以尝试以下方法来解决这个问题 检查是否切换到了其他工作区 Blender 中有多个工作区 每个工作区都有自己的工具栏和面板 如果你切换到了其他工作区 渲染预览按钮可能不在屏幕上 检
  • 计算机网络基础知识--应用层协议HTTP、FTP、SMTP

    目录 1 HTTP 协议 HTTP 特点 HTTP 与HTTPS 的区别 HTTP 请求报文 HTTP 响应报文 2 FTP 协议 与TFTP 协议 FTP 协议 TFTP 协议 3 SMTP 协议 POP3协议与IMAP协议 SMTP协议
  • C语言中,数组首地址,数组元素首地址,数组名的区别

    目录 前言 一 什么是指针 二 正式介绍 1数组名和数组首元素地址 2 arr和 arr的区别 总结 前言 刚刚接触指针 一直想搞明白数组首地址 数组元素首地址 数组名的区别 花了点时间还是搞懂了 一 什么是指针 其实指针就是地址 地址就是
  • 表单嵌套表单涉及的校验和数据回显

    props中接收父组件的传值 data中定义表单的初始值 不能写成空对象 会报错 在created中对编辑的情况进行赋值 注意不能直接赋值 数据不是响应式的 需要使用到this set props formData type Object
  • Java-JavaWeb—(12)Maven

    1 Maver简介 1 1Maver是什么 Maven的本质是一个项目管理工具 将项目开发和管理过程抽象成一个项目对象模型 POM Maven是用Java语言编写的 他管理的东西统统以面向对象的形式进行设计 最终他把一个项目看成一个对象 而
  • JVM之垃圾回收机制

    垃圾回收机制 垃圾回收时机 System gc JVM垃圾回收机制决定 垃圾回收策略 如何判断对象已死 引用计数算法 可达性分析算法 需要垃圾回收的内存 方法区 元空间 堆 新生代 Young Generation 老年代 Old Gene
  • 深度学习基础学习-注意力机制(计算机视觉中)

    在网上看到很多关于注意力机制的说明 下面自己总结一下 大佬绕道 下面放几个文章的链接 添深度学习中的注意力模型 计算机视觉中的注意力机制 图像处理注意力机制Attention汇总 注意力机制详述 注意力机制总结 空间注意力机制和通道注意力机
  • Apache Kafka 编程实战-java客户端开发例子(入门教程轻松学)

    作者 稀有气体 来源 CSDN 原文 https blog csdn net liyiming2017 article details 82805479 版权声明 本文为博主原创文章 转载请附上博文链接 本入门教程 涵盖Kafka核心内容
  • 解决VNC server 连接不上的问题

    关于VNC server的配置可参考 Rock pi 开启VNC远程桌面适用于VNC KDE桌面 启动vnc server 但是连不上 因为只监听了127 0 0 1 所以需要在启动VNC server时添加参数 localhost no
  • 关于一个轻量、可靠的移动端 Vue 组件库

    最近挖掘到一个非常好用的组件库Vant 这边放一下vant官网链接 有兴趣的可以去尝试一下 Vant 4 Lightweight Mobile UI Components built on Vue 那么很多人就要问 Vant它到底好在那 我
  • npm-nrm安装执行报错问题解决

    npm nrm安装执行报错问题解决 问题一 nrm执行报错 internal validators js 124 throw new ERR INVALID ARG TYPE name string value 打开nrm目录下的cli j
  • Flutter Stack布局中定位的方式

    前言 想要记录一下Stack布局中 定位的两种方式 代码 省略无关代码 child new Column children
  • React-Hooks之useImperativeHandle使用,让父组件操纵子组件的状态和方法

    您好 如果喜欢我的文章 可以关注我的公众号 量子前端 将不定期关注推送前端好文 useImperativeHandle是react官方为了简便我们的ref操作 同时还可以让子组件返回给父组件自身的状态和方法去调用 useRef将ref绑定到
  • Qt加载动态链接库

    Qt加载动态链接库 1 直接在pro文件中添加 首先将 a 或者 lib 和 dll文件放入某一目录中 一般是放入程序目录下 例如在程序目录下放入了mydll lab和mydll dll文件 然后在 pro文件中添加 LIBS L PWD
  • 【C#学习笔记】打开新进程

    using System using System Collections Generic using System ComponentModel using System Data using System Drawing using S
  • unity动画倒播与动态设置循环

    动画倒播 之前都是使用混合动画的方法实现无缝衔接倒播的动作 这次的动画混合因为两段动画不一致 丢失了一部分动画 我哪里敢麻烦美工爸爸重做一个 另一方面觉得只要把动画倒播就能轻松搞定这个问题 然后我就踩了下坑 大部分的方法都是使用旧动画系统
  • Adam和学习率衰减(learning rate decay)

    1 梯度下降法更新参数 梯度下降法参数更新公式 其中 是学习率 t是第 t 轮的参数 J t 是损失函数 J t 是梯度 在最简单的梯度下降法中 学习率 是常数 是一个需要实现设定好的超参数 在每轮参数更新中都不变 在一轮更新中各个参数的学