梯度下降优化算法-Adam

Adam(Adaptive Moment Estimation)是一种结合了动量法(Momentum)和 RMSProp 的自适应学习率优化算法。它通过计算梯度的一阶矩(均值)和二阶矩(未中心化的方差)来调整每个参数的学习率,从而在深度学习中表现出色。


1. Adam 的数学原理

1.1 动量法和 RMSProp 的回顾

  • 动量法:通过引入动量变量,加速梯度下降并减少震荡。
  • RMSProp:通过指数加权移动平均计算历史梯度平方和,自适应调整学习率。

Adam 结合了这两种方法的优点,同时计算梯度的一阶矩和二阶矩。


1.2 Adam 的更新规则

Adam 的更新规则分为以下几个步骤:

1.2.1 梯度计算

首先,计算当前时刻的梯度:

g t = ∇ θ J ( θ t ) g_t = \nabla_\theta J(\theta_t) gt=θJ(θt)

其中:

  • g t g_t gt 是当前时刻的梯度向量,形状与参数 θ t \theta_t θt 相同。

1.2.2 一阶矩估计(动量)

Adam 使用指数加权移动平均来计算梯度的一阶矩(均值):

m t = β 1 ⋅ m t − 1 + ( 1 − β 1 ) ⋅ g t m_t = \beta_1 \cdot m_{t-1} + (1 - \beta_1) \cdot g_t mt=β1mt1+(1β1)gt

其中:

  • m t m_t mt 是梯度的一阶矩估计。
  • β 1 \beta_1 β1 是一阶矩的衰减率,通常取值在 [ 0.9 , 0.99 ) [0.9, 0.99) [0.9,0.99) 之间。
  • 初始时, m 0 m_0 m0 通常设置为 0。

1.2.3 二阶矩估计(RMSProp)

Adam 使用指数加权移动平均来计算梯度的二阶矩(未中心化的方差):

v t = β 2 ⋅ v t − 1 + ( 1 − β 2 ) ⋅ g t 2 v_t = \beta_2 \cdot v_{t-1} + (1 - \beta_2) \cdot g_t^2 vt=β2vt1+(1β2)gt2

其中:

  • v t v_t vt 是梯度的二阶矩估计。
  • β 2 \beta_2 β2 是二阶矩的衰减率,通常取值在 [ 0.99 , 0.999 ) [0.99, 0.999) [0.99,0.999) 之间。
  • g t 2 g_t^2 gt2 表示对梯度向量 g t g_t gt 逐元素平方。
  • 初始时, v 0 v_0 v0 通常设置为 0。

1.2.4 偏差校正

由于 m t m_t mt v t v_t vt 初始值为 0,在训练初期会偏向 0,因此需要进行偏差校正:

m ^ t = m t 1 − β 1 t \hat{m}_t = \frac{m_t}{1 - \beta_1^t} m^t=1β1tmt

v ^ t = v t 1 − β 2 t \hat{v}_t = \frac{v_t}{1 - \beta_2^t} v^t=1β2tvt

其中:

  • m ^ t \hat{m}_t m^t 是校正后的一阶矩估计。
  • v ^ t \hat{v}_t v^t 是校正后的二阶矩估计。
  • t t t 是当前时间步。

1.2.5 参数更新

最后,Adam 的参数更新公式为:

θ t + 1 = θ t − η v ^ t + ϵ ⋅ m ^ t \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \cdot \hat{m}_t θt+1=θtv^t +ϵηm^t

其中:

  • η \eta η 是全局学习率。
  • ϵ \epsilon ϵ 是一个很小的常数(通常为 1 0 − 8 10^{-8} 108),用于避免分母为零。
  • v ^ t + ϵ \sqrt{\hat{v}_t} + \epsilon v^t +ϵ 是对校正后的二阶矩估计逐元素开平方。

2. Adam 的详细推导

2.1 一阶矩和二阶矩的意义

  • 一阶矩 m t m_t mt:类似于动量法,表示梯度的指数加权移动平均,用于加速收敛。
  • 二阶矩 v t v_t vt:类似于 RMSProp,表示梯度平方的指数加权移动平均,用于自适应调整学习率。

2.2 偏差校正的作用

偏差校正的目的是解决初始阶段 m t m_t mt v t v_t vt 偏向 0 的问题。通过除以 1 − β 1 t 1 - \beta_1^t 1β1t 1 − β 2 t 1 - \beta_2^t 1β2t,可以校正估计值,使其更接近真实值。


2.3 小常数 ϵ \epsilon ϵ 的作用

小常数 ϵ \epsilon ϵ 的作用是避免分母为零。具体来说:

  • v ^ t \hat{v}_t v^t 很小时, v ^ t + ϵ \sqrt{\hat{v}_t} + \epsilon v^t +ϵ 接近于 ϵ \epsilon ϵ,避免学习率过大。
  • v ^ t \hat{v}_t v^t 很大时, ϵ \epsilon ϵ 的影响可以忽略不计。

3. PyTorch 中的 Adam 实现

在 PyTorch 中,Adam 通过 torch.optim.Adam 实现。以下是 torch.optim.Adam 的主要参数:

参数名含义
params需要优化的参数(通常是模型的参数)。
lr全局学习率(learning rate),即 η \eta η,默认值为 1 0 − 3 10^{-3} 103
betas一阶矩和二阶矩的衰减率,即 ( β 1 , β 2 ) (\beta_1, \beta_2) (β1,β2),默认值为 (0.9, 0.999)。
eps分母中的小常数 ϵ \epsilon ϵ,用于避免除零,默认值为 1 0 − 8 10^{-8} 108
weight_decay权重衰减(L2 正则化)系数,默认值为 0。
amsgrad是否使用 AMSGrad 变体,默认值为 False

3.1 使用 Adam 的代码示例

以下是一个使用 Adam 的完整代码示例:

import torch
import torch.nn as nn
import torch.optim as optim# 定义一个简单的线性模型
model = nn.Linear(10, 1)# 定义损失函数
criterion = nn.MSELoss()# 定义优化器,使用 Adam
optimizer = optim.Adam(model.parameters(), lr=0.001, betas=(0.9, 0.999), eps=1e-8, weight_decay=0.01)# 模拟输入数据和目标数据
inputs = torch.randn(32, 10)  # 32 个样本,每个样本 10 维
targets = torch.randn(32, 1)  # 32 个目标值# 训练过程
for epoch in range(100):# 前向传播outputs = model(inputs)loss = criterion(outputs, targets)# 反向传播optimizer.zero_grad()  # 清空梯度loss.backward()        # 计算梯度# 更新参数optimizer.step()       # 更新参数# 打印损失if (epoch + 1) % 10 == 0:print(f"Epoch [{epoch+1}/100], Loss: {loss.item():.4f}")

3.2 参数设置说明

  1. 学习率 (lr)

    • 学习率 η \eta η 控制每次参数更新的步长。
    • 在 Adam 中,学习率会自适应调整,因此初始学习率可以设置得稍小一些。
  2. 衰减率 (betas)

    • 一阶矩衰减率 β 1 \beta_1 β1 和二阶矩衰减率 β 2 \beta_2 β2 分别控制一阶矩和二阶矩的衰减速度。
    • 默认值为 (0.9, 0.999),适用于大多数情况。
  3. 小常数 (eps)

    • 小常数 ϵ \epsilon ϵ 用于避免分母为零,通常设置为 1 0 − 8 10^{-8} 108
  4. 权重衰减 (weight_decay)

    • 权重衰减系数用于 L2 正则化,防止过拟合。
  5. AMSGrad (amsgrad)

    • 如果设置为 True,则使用 AMSGrad 变体,解决 Adam 在某些情况下的收敛问题。

4. 总结

  • Adam 的核心思想:结合动量法和 RMSProp,通过计算梯度的一阶矩和二阶矩,自适应调整学习率。
  • Adam 的更新公式
    m t = β 1 ⋅ m t − 1 + ( 1 − β 1 ) ⋅ g t m_t = \beta_1 \cdot m_{t-1} + (1 - \beta_1) \cdot g_t mt=β1mt1+(1β1)gt
    v t = β 2 ⋅ v t − 1 + ( 1 − β 2 ) ⋅ g t 2 v_t = \beta_2 \cdot v_{t-1} + (1 - \beta_2) \cdot g_t^2 vt=β2vt1+(1β2)gt2
    m ^ t = m t 1 − β 1 t \hat{m}_t = \frac{m_t}{1 - \beta_1^t} m^t=1β1tmt
    v ^ t = v t 1 − β 2 t \hat{v}_t = \frac{v_t}{1 - \beta_2^t} v^t=1β2tvt
    θ t + 1 = θ t − η v ^ t + ϵ ⋅ m ^ t \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \cdot \hat{m}_t θt+1=θtv^t +ϵηm^t
  • PyTorch 实现:使用 torch.optim.Adam,设置 lrbetaseps 等参数。
  • 优缺点
    • 优点:自适应学习率,适合非凸优化问题,收敛速度快。
    • 缺点:需要手动调整超参数(如 β 1 \beta_1 β1 β 2 \beta_2 β2)。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RAG是否被取代(缓存增强生成-CAG)吗?

引言: 本文深入研究一种名为缓存增强生成(CAG)的新技术如何工作并减少/消除检索增强生成(RAG)弱点和瓶颈。 LLMs 可以根据输入给他的信息给出对应的输出,但是这样的工作方式很快就不能满足应用的需要: 因…

TCP三次握手和四次挥手

TCP 三次握手和四次挥手 TCP(传输控制协议)是一种面向连接的协议,在建立连接和断开连接时分别需要通过 三次握手 和 四次挥手 来确保通信的可靠性和完整性。 1. 三次握手 三次握手是 TCP 建立连接的过程,确保客户端和服务器双方…

在线免费快速无痕去除照片海报中的文字logo

上期和大家分享了用photoshop快速无痕去除照片海报中的文字logo的方法,有的同学觉得安装PS太麻烦,有那下载安装时间早都日落西山了,问有没有合适的在线方法可以快速去除;达芬奇上网也尝试了几个网站,今天分享一个对国人…

VS C++ 配置OPENCV环境

VS C 配置OPENCV环境 1.下载opencv2.安装环境3.opencv环境4.VS配置opencv环境5.EXE执行文件路径的环境lib和dll需要根据是debug还是release环境来区分使用哪个 6.Windows环境 1.下载opencv 链接: link 2.安装环境 双击运行即可 3.opencv环境 include文件路径:opencv\build\…

excel如何查找一个表的数据在另外一个表是否存在

比如“Sheet1”有“张三”、“李四”“王五”三个人的数据,“Sheet2”只有“张三”、“李四”的数据。我们通过修改“Sheet1”的“民族”或者其他空的列,修改为“Sheet2”的某一列。这样修改后筛选这个修改的列为空的或者为出错的,就能找到两…

电路研究9.2.2——合宙Air780EP分组域相关命令

这个好像是GPRS网络相关的&#xff0c;我过来研究一下。 8.1GPRS 网络注册状态&#xff1a;ATCGREG 设置指令控制关于GPRS注册状态非请求结果码的显示。 当<n>1 并且 MT 的 GPRS 注册状态发生改变&#xff0c;即会有CGREG:<stat>的 URC 上报。 当 <n>2 并 且…

DeepSeek R1:中国AI黑马的崛起与挑战

文章目录 技术突破&#xff1a;从零开始的推理能力进化DeepSeek R1-Zero&#xff1a;纯RL训练的“自我觉醒”DeepSeek R1&#xff1a;冷启动与多阶段训练的平衡之道 实验验证&#xff1a;推理能力的全方位跃升基准测试&#xff1a;超越顶尖闭源模型蒸馏技术&#xff1a;小模型的…

UiAutomator的详细介绍

UIAutomator作为一种高效的测试框架&#xff0c;通过自动化手段显著提升了用户界面&#xff08;UI&#xff09;测试的效率与准确性。它不仅支持自动生成功能测试用例&#xff0c;还允许开发者在不同设备上执行这些测试&#xff0c;确保了应用程序的一致性和稳定性。 以下是对 …

开源物业管理系统赋能社区管理提升居民服务体验与满意度

内容概要 在现代物业管理中&#xff0c;开源物业管理系统的出现为社区管理带来了新的契机。这种系统的核心思想是通过开放、共享的方式&#xff0c;为各类物业管理需求提供灵活的解决方案。从基本的信息传递到复杂的投诉处理&#xff0c;开源物业管理系统能够根据不同社区的实…

【深入理解FFMPEG】命令行阅读笔记

这里写自定义目录标题 第三章 FFmpeg工具使用基础3.1 ffmpeg常用命令3.1.13.1.3 转码流程 3.2 ffprobe 常用命令3.2.1 ffprobe常用参数3.2.2 ffprobe 使用示例 3.3 ffplay常用命令3.3.1 ffplay常用参数3.3.2 ffplay高级参数3.3.4 ffplay快捷键 第4章 封装与解封装4.1 视频文件转…

递归搜索回溯综合练习(十五题)

目录 1.找出所有子集的异或总和再求和 2.全排列2 3.电话号码的字母组合 4.括号生成 5.组合 6.目标和 1.path作为全局变量 2.path用于传参 7.组合总和 方法一&#xff1a;按照每个空选什么数字进行递归 方法二&#xff1a;按照每个数字选几个进行递归 8.字母大小写全排…

JWT实现单点登录

文章目录 JWT实现单点登录JWT 简介存在问题及解决方案登录流程后端程序实现前端保存Tokenstore存放信息的缺点及解决 校验流程&#xff1a;为gateway增加登录校验拦截器 另一种单点登录方法&#xff1a;Token&#xff0b;Redis实现单点登录 JWT实现单点登录 登录流程&#xff…

qt-QtQuick笔记之常见项目类简要介绍

qt-QtQuick笔记之常见项目类简要介绍 code review! 文章目录 qt-QtQuick笔记之常见项目类简要介绍1.QQuickItem2.QQuickRectangle3.QQuickImage4.QQuickText5.QQuickBorderImage6.QQuickTextInput7.QQuickButton8.QQuickSwitch9.QQuickListView10.QQuickGridView11.QQuickPopu…

循环神经网络(RNN)+pytorch实现情感分析

目录 一、背景引入 二、网络介绍 2.1 输入层 2.2 循环层 2.3 输出层 2.4 举例 2.5 深层网络 三、网络的训练 3.1 训练过程举例 1&#xff09;输出层 2&#xff09;循环层 3.2 BPTT 算法 1&#xff09;输出层 2&#xff09;循环层 3&#xff09;算法流程 四、循…

Autosar-Os是怎么运行的?(多核系统运行)

写在前面&#xff1a; 入行一段时间了&#xff0c;基于个人理解整理一些东西&#xff0c;如有错误&#xff0c;欢迎各位大佬评论区指正&#xff01;&#xff01;&#xff01; 目录 1.Autosar多核操作系统 1.1多核启动过程 1.2多核运行过程 1.2.1核间任务同步 1.2.2Counte…

【C语言练习题】正弦函数

题目&#xff1a; 根据麦克劳林公式计算正弦值。 输入格式 x ε 注&#xff1a;x 为角(弧度)&#xff0c;ε 为计算精度。 输出格式 y 注&#xff1a;y 为 x 的正弦值&#xff0c;输出 6 位小数。 输入样例1 0.5235987755982989 0.00000001输出样例1 0.500000输入样例2 314.68…

GBase 8a 9.5.3.27 DBlink配置---源端GBase

原理图 1.目标端集群将数据请求由gcluster的5258端口发送至dblink的9898端口 2.Dblink将请求由9898端口转发至源端集群的5258端口 3.源端数据库将接收的请求生成执行计划&#xff0c;由gcluster的5258端口下发至各gnode的5050端口 4.源端的5050端口接收到执行计划进行查询&…

二次封装的方法

二次封装 我们开发中经常需要封装一些第三方组件&#xff0c;那么父组件应该怎么传值&#xff0c;怎么调用封装好的组件原有的属性、插槽、方法&#xff0c;一个个调用虽然可行&#xff0c;但十分麻烦&#xff0c;我们一起来看更简便的方法。 二次封装组件&#xff0c;属性怎…

*胡闹厨房*

前期准备 详细教程 一、创建项目 1、选择Universal 3D,创建项目 2、删除预制文件Readme:点击Remove Readme Assets,弹出框上点击Proceed 3、Edit-Project Setting-Quality,只保留High Fidelity 4、打开 Assets-Settings ,保留URP-HighFidelity-Renderer 和 URP-High…

Effective Objective-C 2.0 读书笔记—— objc_msgSend

Effective Objective-C 2.0 读书笔记—— objc_msgSend 文章目录 Effective Objective-C 2.0 读书笔记—— objc_msgSend引入——静态绑定和动态绑定OC之中动态绑定的实现方法签名方法列表 其他方法objc_msgSend_stretobjc_msgSend_fpretobjc_msgSendSuper 尾调用优化总结参考文…