Adam优化器算法详解及代码实现

文章目录

  • 学习率调整与梯度估计修正
    • RMSprop 算法
    • 动量法
  • Adam

学习率调整与梯度估计修正

在介绍Adam算法之前,先谈谈Adam中两个关键的算法:学习率调整(RMSprop 算法)梯度估计修正

RMSprop 算法

学习率是神经网络优化时的重要超参数。在标准的梯度下降法中,每个参数在每次迭代时都使用相同的学习率,但是学习率如果过大就不会收敛,如果过小则收敛速度太慢。

RMSprop 算法是 Geoff Hinton 提出的一种自适应学习率的方法【RMSprop】,可以在有些情况下避免 AdaGrad 算法中学习率不断单调下降以至于过早衰减的缺点。

RMSprop 算法首先计算每次迭代梯度 𝒈𝑡 平方的指数衰减移动平均𝐺𝑡 :
在这里插入图片描述

其中,β为自定义衰减率(例如0.9)。

然后,根据指数衰减移动平均𝐺𝑡 计算参数更新差值Δ𝜃𝑡 :
在这里插入图片描述
其中, 𝛼 是初始的学习率,𝜖 是为了保持数值稳定性而设置的非常小的常数。

动量法

在随机(小批量)梯度下降法中,如果每次选取样本数量比较小,损失会呈现振荡的方式下降.也就是说,随机梯度下降方法中每次迭代的梯度估计和整个训练集上的最优梯度并不一致,具有一定的随机性。一种有效地缓解梯度估计随机性的方式是通过使用最近一段时间内的平均梯度来代替当前时刻的随机梯度来作为参数更新的方向,从而提高优化速度。

动量法用之前积累动量来替代真正的梯度,在第 𝑡 次迭代时,计算负梯度的“加权移动平均”作为参数的更新方向:
在这里插入图片描述
其中, 𝜌 为动量因子,通常设为 0.9,𝛼 为学习率。

动量法将每个参数的实际更新差值表示为最近一段时间内梯度的加权平均值。在迭代前期,梯度方向都一致,动量法加速参数更新幅度;在迭代后期,剃度方向会不一致,在收敛值附近振荡,动量法会降低参数更新幅度。

类比于物理学,动量法把当前梯度看做当前时刻受理参数的加速度,为了计算当前时刻的速度,应当考虑前一时刻速度和当前加速度共同作用的结果,因此参数的更新直接依赖于前一时刻的更新量和当前时刻的梯度,而不仅仅是当前梯度。另外,𝜌 扮演了阻力的作用。

Adam

Adam是由 OpenAI 的 Diederik Kingma 和多伦多大学的 Jimmy Ba于2015年提出的一种随机优化方法。
在这里插入图片描述

原文链接:ADAM: A METHOD FOR STOCHASTIC OPTIMIZATION:https://arxiv.org/pdf/1412.6980.pdf%5D

Adam算法结合RMSprop 算法和动量法,不但使用动量作为参数更新方向,而且可以自适应调整学习率来改进梯度下降。

  1. 计算梯度平方 g𝑡 平方的指数加权平均(RMSprop );
    在这里插入图片描述
g[:] = beta2 * s + (1 - beta2) * torch.mul(p.grad, p.grad)
  1. 计算梯度 g𝑡 的指数加权平均(动量法);
    在这里插入图片描述
    其中, 𝛽1 和 𝛽2 分别为两个移动平均的衰减率,在Adam原文中取值为 𝛽1 = 0.9, 𝛽2 = 0.999。
m[:] = beta1 * v + (1 - beta1) * p.grad
  1. 对偏差进行修正
    在这里插入图片描述
m_bias_corr = m / (1 - beta1 ** hyperparams['t'])
g_bias_corr = g / (1 - beta2 ** hyperparams['t'])
  1. 计算参数更新差值
    在这里插入图片描述
p[:] -= hyperparams['lr'] * m_bias_corr / (torch.sqrt(g_bias_corr) + eps)

在Adam论文原文中,对Adam的算法描述如下:

在这里插入图片描述

下面给出Adam的简单实现:

def adam(params, states, hyperparams):
    beta1, beta2, eps = 0.9, 0.99, 1e-6
    for p, (m, g) in zip(params, states):
        with torch.no_grad():
            m[:] = beta1 * m + (1 - beta1) * p.grad
            g[:] = beta2 * g + (1 - beta2) * torch.mul(p.grad, p.grad)
            m_bias_corr = m / (1 - beta1 ** hyperparams['t'])
            g_bias_corr = g / (1 - beta2 ** hyperparams['t'])
            p[:] -= hyperparams['lr'] * m_bias_corr / (torch.sqrt(g_bias_corr) + eps)
        p.grad.data.zero_()
    hyperparams['t'] += 1

Adam记录梯度的一阶矩,即过去梯度与当前梯度的平均,体现了惯性保持;还记录了梯度的二阶矩,即过去过去梯度平方与当前梯度平方的平均,体现了环境感知能力,为不同参数产生自适应的学习速率。

因此,Adam优化器具有以下优点:

  • 实现简单,计算高效,内存占有量少;

  • 适合解决含大规模数据和参数的优化问题

  • 适用于不稳定的目标函数

  • 适用于解决包含很高噪声或稀疏梯度的问题

  • 超参数可以很直观地解释,并且基本上只需极少量的调参

  • 自然地调整学习率

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/1005.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机组成原理(3)-哈工大

概述存储器分类按存储介质分类第一个是易失的,后面三个是非易失的按存取方式分类按在计算机中的作用分类RAM可读可写 ROM只读存储器的层次结构存储器的三个主要特性的关系缓存-主存层次和主存-辅存层次时间局部性就是cpu访问了一个数据,在不久的将来可能…

python学习——【第六弹】

前言 上一篇文章 python学习——【第五弹】中我们了解了python中的不可变序列元组,这篇文章接着介绍可变序列 字典。 字典 字典的实现原理: 字典,顾名思义其实现原理和字典类似,字典中的元素都是key—value,以键值对…

操作系统学习笔记 ---- 网络系统

1 DMA技术 直接内存访问(Direct Memory Access) 技术。 在进行 I/O 设备和内存的数据传输的时候,数据搬运的工作全部交给 DMA 控制器,而 CPU 不再参与任何与数据搬运相关的事情,这样 CPU 就可以去处理别的事务。 DM…

js逆向学习、安卓逆向

JS基础 提示信息 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn 安卓逆向 1.模拟器环境搭建 Magisk 是一套用于定制 Android 的开源软件,支持高于 Android 5.0 的设备。 以下是一些功能亮点: MagiskSU:为应用程序提供 root 访…

什么是 .com 域名?含义和用途又是什么?

随着网络的发展,网络上出现了各种不同后缀的域名,这些域名的后缀各有不同的含义,也有不同的用途。今天,我们就一起来探讨一下 .com 后缀的域名知识。 .com 域名是一种最常见的顶级域名,它是由美国国家网络信息中心&…

第3章 多层感知器

这章节我们来解决的问题是:如何使用神经网络实现逻辑电路中的“异或门”模型?如下图:根据第2章我们知道,单层感知器是能够解决“与门”、“或门”、“非门”这些简单的线性问题,但是不能解决“异或门”这类非线性问题。…

内存函数的简单实用

本篇要分享的是常见的内存函数 前面分享的函数都是和字符串相关,但是当我们在操作数据的时候不仅仅要操作字符数据 接下来分享几个与内存相关的函数 目录 本篇要分享的是常见的内存函数 1.memcpy 2.memmove 自定函数模拟实现memmove函数 3.memcmp 4.memset …

【算法经典题集】DP和枚举(持续更新~~~)

😽PREFACE🎁欢迎各位→点赞👍 收藏⭐ 评论📝📢系列专栏:算法经典题集🔊本专栏涉及到的知识点或者题目是算法专栏的补充与应用💪种一棵树最好是十年前其次是现在DPDP就是动态规划&a…

Web前端 JS WebAPI

1、操作DOM 1.1、什么DOM? DOM(Document Object Model——文档对象模型):DOM是浏览器提供的一套专门用来操作网页内容的功能 DOM作用:开发网页内容特效和实现用户交互 DOM树是什么? 将 HTML 文档以树状…

手把手教你使用vue创建第一个vis.js

先看一下实现效果吧 ,如下图 : 为什么要写这篇文章呢?因为之前有浅浅的了解一下vis.js,后期开发中没有使用vis,所以太深奥的也不懂,但是当时是用js写的。这两天有人问我用vue怎么写,然后说看到…

减治法实现插入排序,减治法实现二叉查找树(二叉搜索数,二叉排序数)的创建、插入与查找(含解析与代码实现)

🎊【数据结构与算法】专题正在持续更新中,各种数据结构的创建原理与运用✨,经典算法的解析✨都在这儿,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏 🪔本系列专栏 -…

嵌入式软件开发之Linux下C编程

目录 前沿 Hello World! 编写代码 编译代码 GCC编译器 gcc 命令 编译错误警告 编译流程 Makefile 基础 何为 Makefile Makefile 的引入 前沿 在 Windows 下我们可以使用各种各样的 IDE 进行编程,比如强大的 Visual Studio。但是在Ubuntu 下如何进…

【Java版oj】day10 井字棋、密码强度等级

目录 一、井字棋 (1)原题再现 (2)问题分析 (3)完整代码 二、密码强度等级 (1)原题再现 (2)问题分析 (3)完整代码 一、井字棋 &a…

CAT8网线测试仪使用中:线缆的抗干扰参数解读以及线缆工艺改进注意事项

FLUKE Agent platform -深圳维信,带你更深入的了解铜缆测试,详细为您讲解什么是TCL/ELTCL,他们对数据的传输到底有什么影响呢? 前情分析:为什么用双绞线传输信号?(一图就懂) TCL&a…

【深度解刨C语言】符号篇(全)

文章目录一.注释二.续行符与转义符1.续行符2.转义符三.回车与换行四.逻辑操作符五.位操作符和移位操作符六.前置与后置七.字符与字符串八./和%1.四种取整方式2.取模与取余的区别和联系3./两边异号的情况1.左正右负2.左负右正九.运算符的优先级一.注释 注释的两种符号&#xff…

Sentinel

SentinelSentinel介绍什么是Sentinel?为什么需要流量控制?为什么需要熔断降级?一些普遍的使用场景本文介绍参考:Sentinel官网《Spring Cloud Alibaba 从入门到实战.pdf》Sentinel下载/安装项目演示构建项目控制台概览演示之前需先明确&#…

【webrtc】ICE 到VCMPacket的视频内存分配

ice的数据会在DataPacket 构造是进行内存分配和拷贝而后DataPacket 会传递给rtc模块处理rtc模块使用DataPacket 构造rtp包最终会给到OnReceivedPayloadData 进行rtp组帧。吊炸天的是DataPacket 竟然没有声明析构方法。RtpVideoStreamReceiver::OnReceivedPayloadData 的内存是外…

3.网络爬虫——Requests模块get请求与实战

Requests模块get请求与实战requests简介:检查数据请求数据保存数据前言: 前两章我们介绍了爬虫和HTML的组成,方便我们后续爬虫学习,今天就教大家怎么去爬取一个网站的源代码(后面学习中就能从源码中找到我们想要的数据…

普通Java工程师 VS 优秀架构师

1 核心能力 1.1 要成为一名优秀的Java架构师 只懂技术还远远不够,懂技术/懂业务/懂管理的综合型人才,才是技术团队中的绝对核心。 不仅仅是架构师,所有的技术高端岗位,对人才的综合能力都有较高的标准。 架构路线的总设计师 规…

安卓渐变的背景框实现

安卓渐变的背景框实现1.背景实现方法1.利用PorterDuffXfermode进行图层的混合,这是最推荐的方法,也是最有效的。2.利用canvas裁剪实现,这个方法有个缺陷,就是圆角会出现毛边,也就是锯齿。3.利用layer绘制边框1.背景 万…