完整教程:【人工智能】神经网络的优化器optimizer(四):Adam自适应动量优化器

news/2025/11/21 18:36:54/文章来源:https://www.cnblogs.com/ljbguanli/p/19254144

完整教程:【人工智能】神经网络的优化器optimizer(四):Adam自适应动量优化器

一.算法背景

        Adam(Adaptive Moment Estimation)是一种广泛应用于深度学习模型训练的自适应优化算法,由Diederik P. Kingma和Jimmy Lei Ba于2014年提出,旨在解决传统优化算法在深度学习中的局限性。它融合了Momentum动量优化器和RMSProp动态自适应学习率优化器两种主流优化技术的优势。

二.数学公式

        Adam优化器通过计算梯度的一阶矩(均值)和二阶矩(方差)来为每个参数自适应地调整学习率。其数学实现步骤如下:

        一阶矩阵估计(动量项,类似于动量优化器中的动量计算,记录梯度的指数加权平均值):

m_{t}=\beta_{1} m_{t-1}+(1-\beta _{1}^{t})g_{t}

        二阶矩阵估计(自适应学习率项,类似于RMSProp,记录梯度平方的指数加权平均值):

V_{t}=\beta_{2} V_{t-1}+(1-\beta _{2}^{t})g_{t}

        偏差修正(下面会说为什么要做这个):

m_{t}=\frac{m_{t}}{1-\beta_{1}^{t}}

V_{t}=\frac{V_{t}}{1-\beta_{2}^{t}}

        参数更新(和前几个优化器的更新流程一样):

\Theta _{t+1}=\Theta _{t}-\eta \cdot \frac{m_{t}}{\sqrt{V_{t}+\epsilon }}

        代码实现如下:

import numpy as np
from collections import OrderedDict
import matplotlib.pyplot as plt
class Adam:def __init__(self, lr=0.001, beta1=0.9, beta2=0.999):self.lr = lrself.beta1 = beta1self.beta2 = beta2self.iter = 0self.m = Noneself.v = Nonedef update(self, params, grads):if self.m is None:self.m, self.v = {}, {}for key, val in params.items():self.m[key] = np.zeros_like(val)self.v[key] = np.zeros_like(val)self.iter += 1lr_t  = self.lr * np.sqrt(1.0 - self.beta2**self.iter) / (1.0 - self.beta1**self.iter)for key in params.keys():self.m[key] += (1 - self.beta1) * (grads[key] - self.m[key])self.v[key] += (1 - self.beta2) * (grads[key]**2 - self.v[key])params[key] -= lr_t * self.m[key] / (np.sqrt(self.v[key]) + 1e-7)
optimizers= Adam(lr=0.3)
init_pos = (-7.0, 2.0)
params = {}
params['x'], params['y'] = init_pos[0], init_pos[1]
grads = {}
grads['x'], grads['y'] = 0, 0
x_history = []
y_history = []
def f(x, y):return x**2 / 20.0 + y**2
def df(x, y):return x / 10.0, 2.0*y
for i in range(30):x_history.append(params['x'])y_history.append(params['y'])grads['x'], grads['y'] = df(params['x'], params['y'])optimizers.update(params, grads)
x = np.arange(-10, 10, 0.01)
y = np.arange(-5, 5, 0.01)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)
# for simple contour line
mask = Z > 7
Z[mask] = 0
idx = 1# plot
plt.subplot(2, 2, idx)
idx += 1
plt.plot(x_history, y_history, 'o-', color="red")
plt.contour(X, Y, Z)
plt.ylim(-10, 10)
plt.xlim(-10, 10)
plt.plot(0, 0, '+')
# colorbar()
# spring()
plt.title("Momentum")
plt.xlabel("x")
plt.ylabel("y")
plt.show()

        运行结果如下:

三.为什么要进行偏差修正

        它解决了指数加权平均在初始阶段的估计偏差问题。Adam优化器使用指数加权移动平均(EWMA)来计算梯度的一阶矩(m)和二阶矩(v)估计。在初始阶段,这些估计值会存在系统性偏差,原因在于:

  1. 初始化问题‌:m和v通常初始化为0向量,导致初始估计明显偏低,在t较小时,1-\beta ^{t}接近于0,导致未修正的m和v远小于真实梯度统计量,计算出的学习率会异常偏大。

  2. 指数加权特性‌:早期时间步的估计值受初始值影响较大, 修正项随着t的增加逐渐趋近于1,在训练后期影响变小,但在初期至关重要。

  3. 训练不稳定:参数更新幅度在初期波动剧烈,可能错过合理的优化方向,增加收敛到次优解的风险,需要更多迭代次数才能克服初始偏差,特别是在稀疏梯度问题上表现更差。

        进行偏差修正后,从第一轮迭代就开始积累有意义的梯度统计量,加速模型早期的学习过程,减少对初期学习率的敏感度,使默认参数(β₁=0.9, β₂=0.999)在大多数情况下都能良好工作。

        误差修正通过以下数学公式实现:

m_{t}=\frac{m_{t}}{1-\beta_{1}^{t}}

V_{t}=\frac{V_{t}}{1-\beta_{2}^{t}}

        其中:

  • \beta _{1}\beta_{2}是衰减率(通常取0.9和0.999)

  • t是当前时间步(迭代次数)

  • m_{t}v_{t}是未修正的矩估计

        以下使用代码对不进行偏差修正和进行偏差修正的参数更新轨迹和损失函数收敛的对比:

import numpy as np
import matplotlib.pyplot as plt
class AdamWithCorrection:"""带误差修正的Adam优化器"""def __init__(self, learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-8):self.learning_rate = learning_rateself.beta1 = beta1self.beta2 = beta2self.epsilon = epsilonself.m = Noneself.v = Noneself.t = 0self.history = {'params': [], 'loss': []}def update(self, params, grads, loss):if self.m is None:self.m = np.zeros_like(params)self.v = np.zeros_like(params)self.t += 1self.m = self.beta1 * self.m + (1 - self.beta1) * gradsself.v = self.beta2 * self.v + (1 - self.beta2) * (grads ** 2)# 误差修正m_hat = self.m / (1 - self.beta1 ** self.t)v_hat = self.v / (1 - self.beta2 ** self.t)params -= self.learning_rate * m_hat / (np.sqrt(v_hat) + self.epsilon)self.history['params'].append(params.copy())self.history['loss'].append(loss)return params
class AdamWithoutCorrection:"""不带误差修正的Adam优化器"""def __init__(self, learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-8):self.learning_rate = learning_rateself.beta1 = beta1self.beta2 = beta2self.epsilon = epsilonself.m = Noneself.v = Noneself.t = 0self.history = {'params': [], 'loss': []}def update(self, params, grads, loss):if self.m is None:self.m = np.zeros_like(params)self.v = np.zeros_like(params)self.t += 1self.m = self.beta1 * self.m + (1 - self.beta1) * gradsself.v = self.beta2 * self.v + (1 - self.beta2) * (grads ** 2)# 无误差修正params -= self.learning_rate * self.m / (np.sqrt(self.v) + self.epsilon)self.history['params'].append(params.copy())self.history['loss'].append(loss)return params
# 定义优化问题
def loss_function(x):return np.sum(0.5 * x**2)  # 简单的二次函数
def gradient_function(x):return x  # 梯度就是x本身
# 初始化参数
params_corr = np.array([3.0, -2.0])
params_no_corr = params_corr.copy()
# 初始化优化器
optimizer_corr = AdamWithCorrection(learning_rate=0.1)
optimizer_no_corr = AdamWithoutCorrection(learning_rate=0.1)
# 优化过程
for i in range(100):grads_corr = gradient_function(params_corr)grads_no_corr = gradient_function(params_no_corr)loss_corr = loss_function(params_corr)loss_no_corr = loss_function(params_no_corr)params_corr = optimizer_corr.update(params_corr, grads_corr, loss_corr)params_no_corr = optimizer_no_corr.update(params_no_corr, grads_no_corr, loss_no_corr)
# 可视化结果
plt.figure(figsize=(15, 5))
# 1. 参数轨迹对比
plt.subplot(1, 2, 1)
params_history_corr = np.array(optimizer_corr.history['params'])
params_history_no_corr = np.array(optimizer_no_corr.history['params'])
plt.plot(params_history_corr[:, 0], params_history_corr[:, 1], label='With Correction', color='blue')
plt.plot(params_history_no_corr[:, 0], params_history_no_corr[:, 1], label='Without Correction', color='red')
plt.scatter([0], [0], color='green', marker='*', s=200, label='Optimal Point')
plt.title('Parameter Trajectory Comparison')
plt.xlabel('Parameter 1')
plt.ylabel('Parameter 2')
plt.legend()
plt.grid(True)
# 2. 损失曲线对比
plt.subplot(1, 2, 2)
plt.plot(optimizer_corr.history['loss'], label='With Correction', color='blue')
plt.plot(optimizer_no_corr.history['loss'], label='Without Correction', color='red')
plt.title('Loss Convergence Comparison')
plt.xlabel('Iteration')
plt.ylabel('Loss')
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()

        运行代码可以清晰地看到两者之间的区别:

四.和其他优化器的对比

        与其他优化器的对比:

        特点对比:

特性AdamSGDMomentumRMSProp
自适应学习率
动量机制
参数独立调整
偏差修正
收敛速度中等中等
超参数数量4123

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

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

相关文章

轻松速通:TTS播放、文件播放与录音的核心功能解析!

无论是开发语音助手、音频播放器,还是录音工具,TTS播放、文件播放与录音都是绕不开的核心功能。本文提炼核心流程,帮你跳过冗余细节,快速掌握这三大功能的核心实现逻辑。 一、概述 本文档详细介绍了基于 Air8000 开…

2025 中国法兰阀门十大品牌推荐:密封升级 + 场景适配,优质厂家护航流体系统安全

法兰阀门作为管道连接中的核心部件,凭借连接牢固、密封性能好的优势,广泛应用于石油化工、市政工程、能源电力、船舶制造等众多领域。2025 年,随着工业生产规模扩大与民生基建升级,市场对法兰阀门的密封可靠性、耐…

FPGA专用CLKUSR时钟引脚严重警告——Cyclone 10 GX

FPGA专用CLKUSR时钟引脚严重警告——Cyclone 10 GXCyclone 10 gx器件 使用Cyclone 10 gx器件时,由于把硬件给的管脚tcl脚本拉到工程里面了,编译后发现一个Critical Warning如下Critical Warning(18326): The design …

OPCUA探讨(五)——客户端代码解读:监控变量值与报警

本系列文章: OPCUA 探讨(一)——测试与开发环境搭建 OPCUA 探讨(二)——服务器节点初探 OPCUA 探讨(三)——客户端代码解读:基本配置与会话连接 OPCUA 探讨(四)——客户端代码解读:浏览服务器节点树 OPCUA …

2025 年度中国截止阀十大品牌推荐:绿色智造 + 特种工况突破,引领行业高质量发展

2025 年,随着 “双碳” 战略深入推进与高端制造业升级,截止阀作为流体系统的 “控制中枢”,其应用场景正加速向大口径、高压力、超低温、耐腐蚀等苛刻工况延伸,同时绿色智造、数字化运维与全生命周期质量管控成为行…

修改DTS适配遥控用户码

在将该DTS文件提交到Kernel后,若需适配遥控用户码,需修改 红外遥控(remote-controller)相关节点配置,具体对应DTS中的 pwm@ff420030 节点(RK3399常见红外遥控驱动节点),以下是具体修改位置及步骤: 一、定位需…

nginx性能优化之tcp调优

本文分享自天翼云开发者社区《nginx性能优化之tcp调优》.作者:江****禄 nginx在tcp连接上有2个如下配置:tcp_nodelay on , tcp_nopush off。这两个配置在tcp连接中的具体原理如何呢?在网络拥塞控制领域,我们知道有…

2025年11月安徽聚乙烯瓶、高阻隔瓶、聚酯瓶、农药瓶供应商排行榜:安徽金汇龙包装领跑行业

摘要 2025年农药包装行业迎来技术升级浪潮,随着环保政策收紧和智能制造的推进,农药瓶供应商面临新的机遇与挑战。本文基于市场调研数据和技术参数分析,为您呈现2025年11月农药瓶供应商综合排名,并提供详细对比表单…

2025年11月中国/安徽/聚乙烯瓶、高阻隔瓶、聚酯瓶、农药瓶厂家TOP10推荐:安徽金汇龙包装强势登顶

摘要 随着农药包装行业标准化进程加速,2025年聚乙烯瓶市场需求持续增长,行业技术门槛显著提升。本文基于生产工艺、质量控制、研发能力等维度,对全国聚乙烯瓶生产企业进行综合评估,为农药生产企业提供供应商选择参…

rich dataset 3D人体场景数据集

https://rich.is.tue.mpg.de/download.php

ICPC2025沈阳打铁日志

11.14坐飞机出发了,到沈阳挺晚了还尝了大油边。 11.15下午他们在打省赛,所以热身赛调到晚上了,午饭吃的餐票(味道一般,重点是菜的种类太少了,就十多个),衣服是绿马甲,我和y都不太合身,投壶好难,队长中5个,后…

UModel 数据治理:运维世界模型构建实践

阿里云推出 UModel 统一建模框架,将实体、关系、数据、知识、行动融为一体,为大模型提供可推理、可交互的运维世界模型,推动可观测从‘被动响应’迈向‘主动优化’的新阶段。作者:元乙 点击此处,观看视频解读! 从…

【springboot】 WebMvcConfigurer的使用

org.springframework.web.servlet.config.annotation.WebMvcConfigurer 的使用 一、基本概念 WebMvcConfigurer 接口提供了一组回调方法,用于配置 Spring MVC 的各种方面,如视图解析器、拦截器、跨域请求、消息转换器…

2025年11月21日

2025年11月21日class Solution { public:int singleNumber(vector<int>& nums) {int ans=0;for(int i:nums){ans=ans^i;}return ans;} };

实用指南:一文搞懂 DeepSeek API:兼容 OpenAI 接口的智能对话模型调用指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

形容词Test

1.Stamp-collecting can be enjoyed by the rich ad the poor alike. stamp n.邮票 can be enjoyed:can 情态动词,后接原型。is enjoyed 一般现在时的被动语态。alike:同样地(deepseek说alike在这里是副词,修饰by…

James Watsons

the high IQ happens when an East Asian but knows English. its just some B just knows 26 English.

2025年11月江苏/徐州vr设备、vr体验馆、5d影院、9d影院、拓普互动厂家推荐榜:拓普互动强势登顶

摘要 2025年9D影院行业迎来爆发式增长,技术革新和市场需求双重驱动下,品牌竞争日趋激烈。本文基于市场调研数据、技术参数对比和用户反馈,为您呈现2025年11月最具竞争力的9D影院品牌排行榜。本榜单旨在为投资者、采…

计算机网络:物理层 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年11月中国/江苏/徐州vr设备、vr体验馆、5d影院、9d影院、拓普互动厂家TOP10:拓普互动领跑榜单

摘要 2025年9D影院行业迎来爆发式增长,技术创新与市场需求双重驱动下,行业竞争格局逐渐清晰。本文基于市场调研数据、用户反馈和专业技术评测,为您呈现2025年11月最具实力的9D影院品牌排行榜,为投资决策提供参考依…