【模型训练】SGD的那些变种,真的比SGD强吗

随机梯度下降法 (SGD) SGD的基本思想是通过逐个样本或小批量样本来更新模型参数,而不是使用整个数据集。这种方法大大提高了计算效率,特别是在处理大规模数据集时。 阅读详情

文章首发于微信公众号《有三AI》

【模型训练】SGD的那些变种,真的比SGD强吗

深度学习框架目前基本上都是使用梯度下降算法及其变种进行优化,通常意义上大家会认为原始的梯度下降算法是最弱的,但事实上并非如此。

很多的论文依然采用了原始的梯度下降算法而不采用更高级的算法,今天就以一个实践例子来给大家展示一下各类算法的比较,所有内容参考文章【An overview of gradient descent optimization algorithms】。

 

01 梯度下降算法

本文目标不是为了从零开始讲清楚优化算法,所以有些细节和基础就略过。

梯度下降算法,即通过梯度的反方向来进行优化,批量梯度下降(Batch gradient descent)用公式表述如下:

写成伪代码如下:

for i in range(nb_epochs):

    params_grad = evaluate_gradient(loss_function, data, params) 

    params = params - learning_rate * params_grad

上面的梯度下降算法用到了数据集所有的数据,这在解决实际问题时通常是不可能,想想imagenet1000有100G以上的图像,内存装不下,速度也很慢。

我们需要在线能够实时计算,于是一次取一个样本,就有了随机梯度下降(Stochastic gradient descent),简称sgd。

公式如下:

写成伪代码如下:

for i in range(nb_epochs): 

    np.random.shuffle(data)

    for example in data:

        params_grad = evaluate_gradient(loss_function , example , params) 

        params = params - learning_rate * params_grad

sgd方法缺点很明显,梯度震荡,所以就有了后来大家常用的小批量梯度下降算法(Mini-batch gradient descent)。

伪代码如下:

for i in range(nb_epochs): 

    np.random.shuffle(data)
    for batch in get_batches(data, batch_size=50):

        params_grad = evaluate_gradient(loss_function, batch, params) 

        params = params - learning_rate * params_grad

下面我们要形成共识,说sgd算法,实际上指的就是mini-batch gradient descent算法,没有人会去一次拿整个数据集或者一个样本进行优化。

当然还是要总结一下SGD算法的毛病。

(1)学习率大小和策略选择困难,想必动手经验丰富的自然懂。

(2)学习率不够智能,对所有参数一视同仁。

(3)同时面临局部极值和鞍点的问题。

可能有同学不知道鞍点怎么回事,简单来说,它就是在某一些方向梯度下降,另一些方向梯度上升,形状似马鞍,抄来一张图如下,红点就是鞍点。

 

02 梯度下降方法改进

1.1 动量法                  

改进方法那么多,我觉得真正最有用的就是它。

前面说了梯度下降算法是按照梯度的反方向进行参数更新,但是刚开始的时候梯度不稳定呀,方向改变是很正常的,梯度就是抽疯了似的一下正一下反,导致做了很多无用的迭代。

而动量法做的很简单,相信之前的梯度。如果梯度方向不变,就越发更新的快,反之减弱当前梯度。

画成图就是这样。

效果对比就这意思。

 

1.2 nesterov动量法                  

仍然是动量法,只是它要求这个下降更加智能。

既然动量法已经把前一次的梯度和当前梯度融合,那何不更进一步,直接先按照前一次梯度方向更新一步将它作为当前的梯度,看下面的式子就明白了。

 

 

如上图,自己领会。

nesterov的好处就是,当梯度方向快要改变的时候,它提前获得了该信息,从而减弱了这个过程,再次减少了无用的迭代。

 

1.3 Adagrad法                  

思路很简单,不同的参数是需要不同的学习率的,有的要慢慢学,有的要快快学,所以就给了一个权重咯,而且是用了历史上所有的梯度幅值。

 

1.4 Adadelta与Rmsprop                 

adagrad用了所有的梯度,问题也就来了,累加的梯度幅值是越来越大的。导致学习率前面的乘因子越来越小,后来就学不动了呀。

Adadelta就只是动了一丢丢小心思,用移动平均的方法计算累加梯度,只累加了一个窗口的梯度,而且计算方法也更有效。

并且,将学习率用前一时刻参数的平方根来代替,最终更新算法变成了这样。

RMSprop方法的不同就在于分子上还是使用学习率η而不是Adadelta中的

这个方法在Hinton的课程中使用,没有发表成论文,毕竟有Adadelta了没有发表必要。

1.5 adam法                  

最后就是这个adam算法,作为最晚出现的,当然是集大成者。

adam对梯度的一阶和二阶都进行了估计与偏差修正,使用梯度的一阶矩估计和二阶矩估计来动态调整每个参数的学习率。

看出来了吧,与adadelta和rmsprop如出一辙,与momentum sgd也颇为相似。上面的式子根据梯度对参数更新的幅度进行了动态调整,所以adam对学习率没有那么敏感。

1.6 adamax 

将adam使用的二阶矩变成更高阶,就成了adamax算法。

1.7 nadam法                  

nag加上adam,就成了nadam方法,即带有动量项的adam,所以形式也很简单,如下,可以将其分别与adam算法和nag算法的式子比较看看。

说了这么多,对上面各种方法从一个鞍点开始优化,表现如何的预期效果图如下。

理论上,就是上面这样的。文章作者会告诉你对于数据稀疏的问题,用自适应学习率算法就好了,而且使用人家推荐的参数就好。其中,adam会最佳。

 

03 各种方法表现究竟如何

上面说了这么多理论,分析起来头头是道,各种改进版本似乎各个碾压SGD算法,然而根据笔者经验,很多时候仔细调优后的SGD算法绝对吊打其他算法。

实验结果看下图,基础任务模型和数据集上次已经说过,此处不再赘述。

所有方法都采用作者们的默认配置,并且进行了比较,不好的结果就不拿出来了。

  • nesterov方法,与sgd算法同样的配置。

  • adam算法,m1=0.9,m2=0.999,lr=0.001。

  • rms算法,rms_decay=0.9,lr=0.001。

  • adagrad,adadelta学习率不敏感。

怎么着,好像都不如SGD算法呀。为什么呢?留言讨论吧。

感谢各位看官的耐心阅读,不足之处希望多多指教。后续内容将会不定期奉上,欢迎大家关注有三公众号 有三AI!

 

深度学习(二),终于理解了深度学习原理--SPGD(SGD)优化算法的实现原理 SPGD优化算法的实现原理: SGD算法广泛应用于各种深度学习的优化模型算法中,这几天终于把该算法的优化原理研究明白了 首先,我们假设一个函数y = 2x-1,对应的 x = 1,2,3,4,5,6,7,8,9 y = 1,3,5,7,9,11,13,15,17 但是如果我们不知道该函数对应的数学关系,而只是x,y的值,如何让计算机去计算这个模型的数学函数,并且预测x = 20时候的值呢? 代码在最后。。。。。 SPGD算法原理: 首先建立模型,假设这个函数是一个二元一次方程:y = axx+bx+c; 阅读详情

相关推荐

随机梯度下降法 SGD

1. 梯度下降 batch_size = 1: SGD batch_size = n: mini-batch batch_size = 全部训练集大小:batch SGD 对比: (1)batch SGD: 噪声小, 幅度大一些; (2)mini-batch SGD: 效率高, 收敛快; 我们实际在pytorch等框架使用的SGD,只要指定的batch size不等于 1, 就是 mini-batch SGD。 (3)SGD:大部分时候向着全局最小值靠近, 但是有时候会远离最小值,SGD会有很多的噪声。 S

rosefun96的博客 1万+

python中sgd模型_菜鸟笔记Python3——机器学习(一) :梯度下降模型

参考资料 chapter2Training Machine Learning Algorithms for Classifcation引言:在学习过基本的单层感知机模型之后,我们现在来学习了解另一种单层神经网络模型:ADAptive LInear NEuron (Adaline) 自适应线性神经单元 这种 Adaline 的特别之处在于 它引入了损失函数 cost functionAdaline ...

weixin_28757113的博客 1383

AI学习指南深度学习篇-随机梯度下降法(Stochastic Gradient Descent,SGD)简介

随机梯度下降法是深度学习中一种重要且高效的优化算法,具有速度快、能够适应在线学习、避免陷入局部极小值等优势。通过本文的介绍和示例说明,希望读者能够更好地理解SGD的原理和应用场景,为深度学习的学习和实践提供帮助。

俞兆鹏的博客 2161

回归模型中的哑变量

在构建回归模型时,如果自变量X为连续性变量,回归系数β可以解释为:在其他自变量不变的条件下,X每改变一个单位,所引起的因变量Y的平均变化量;如果自变量X为二分类变量,例如是否饮酒(1=是,0=否),则回归系数β可以解释为:其他自变量不变的条件下,X=1(饮酒者)与X=0(不饮酒者)相比,所引起的因变量Y的平均变化量。但是,当自变量X为多分类变量时,例如职业、学历、血型、疾病严重程度等等,此时仅用一...

a8131357leo的博客 3万+

AI学习指南深度学习篇-SGD的变种算法

在深入讨论SGD的变种之前,首先需要了解SGD的基本概念。SGD通过随机抽取样本进行梯度更新,这样的好处在于大幅度减少计算量,使得在线学习成为可能。每次只利用一个样本或一个小批量样本可能会导致更新方向的波动,影响模型的收敛。学习率的设置较为重要,如果学习率过大,可能发生发散;而如果学习率过小,则收敛速度慢。因此,在实际应用中,单一的SGD往往不足以支撑复杂深度学习模型的训练,而需要引入一些变种算法。

俞兆鹏的博客 1459

AI学习指南深度学习篇-SGD的训练与反向传播

随机梯度下降(Stochastic Gradient Descent,SGD)是一种用于优化机器学习算法的迭代方法。与传统的梯度下降算法不同,SGD在每次迭代中仅使用一个样本的梯度来更新模型参数,而不是使用整个数据集的平均梯度。这使得SGD能够更快地更新参数,适用于大型数据集。

俞兆鹏的博客 1483

基于LSTM的Chatbot实例(4) — 基于SGD的模型参数训练及优化

一、SGD基本知识   前几篇文章中已经介绍了我们的seq2seq模型使用均方误差作为损失函数,使用SGD算法(随机梯度下降)算法来训练模型参数,实例中代码如下: net = tflearn.regression(real_output_sequence, optimizer='sgd', learning_rate=0.1, loss='mean_square')   大多数机器学习任务最...

Alice 3705

ArcGIS实战:手把手教你用DEM和灾害点数据,5步搞定地质灾害风险区划图

本文详细介绍了使用ArcGIS进行地质灾害风险评估的完整流程,从DEM和灾害点数据出发,通过五步标准化操作生成专业风险区划图。重点讲解了信息量模型的应用,帮助读者掌握GIS技术在地质灾害易发性评价中的实践方法,提升风险评估效率与准确性。

weixin_30696427的博客 427

大模型训练效率革命:AdamW与SGD优化算法深度测评

你是否还在为大模型训练时的收敛速度慢、显存占用高而烦恼?本文将通过实测对比当前主流的AdamW与SGD两种优化算法,帮助你一文搞定大模型训练的效率难题。读完本文你将了解:两种算法的核心原理差异、在不同硬件环境下的性能表现、以及如何通过配置文件快速切换优化器。 ## 算法原理对比 优化算法是大模型训练的"引擎",直接决定了模型收敛速度和最终性能。AdamW(Adam with Weight De...

gitblog_00459的博客 1107

modbus-esp8266库深度解析:工业级Modbus协议栈实现

Modbus是一种广泛应用于工业自动化领域的通用串行通信协议,其核心在于标准化的功能码、寄存器模型与帧结构设计。基于RTU、ASCII和TCP三种传输变体,Modbus协议通过主从架构实现设备间可靠数据交互,具备低开销、高兼容性与强实时性等技术价值。在边缘计算与工业物联网场景中,它被广泛用于PLC通信、传感器数据采集、HMI集成及远程固件升级(FOTA)等关键任务。针对ESP8266/ESP32等Wi-Fi微控制器平台,modbus-esp8266库提供了完整协议栈支持,涵盖多实例并发、回调驱动架构、零拷贝

weixin_42315569的博客 351

【深度学习·命运-73】SGD

SGD 是梯度下降法的一个变种,它通过在每次迭代时使用单个样本或小批量样本(mini-batch)来更新模型参数,而不是在整个训练集上计算梯度,从而使得训练过程更为高效。虽然标准的SGD可能在训练过程中存在较大的波动,但它的计算效率和较快的收敛速度使其成为许多机器学习算法的核心。这使得每次更新的计算量较小,更新过程更加频繁,但因为只用了一个样本的梯度,可能会导致更新方向上有较大的波动。每次只计算一个样本的梯度,而不是计算整个数据集的平均梯度,因此SGD的计算效率大大提高,尤其适用于大规模数据集。

m0_69378371的博客 1305

如何用python开发“跳一跳”游戏【附源码】

jump_start_time = pygame.time.get_ticks() # 记录跳跃开始时间。jump_duration = current_time - jump_start_time # 计算跳跃持续时间。current_time = pygame.time.get_ticks() # 获取当前时间。jump_velocity = -15 # 设置跳跃的初始速度。# 如果小球跳跃结束,重置跳跃状态。# 根据跳跃持续时间计算跳跃高度。# 移除超出屏幕的障碍物。

helloshili2011的博客 2497

SGD和带momentum的SGD算法

参考: https://crazyang.blog.youkuaiyun.com/article/details/84618536 1、关于SGD算法: 随机梯度下降算法的出现是因为,BGD的迭代速度在大数据量下会变得很慢,因为它每次迭代都是用的是所有的数据样本。而SGD一次迭代只需要使用一个样本。可以根据这一个样本来计算梯度。 # 随机梯度下降SGD # 拟合函数为:y = theta * x # 代价函数为:J = 1 / (2 * m) * ((theta * x) - y) * ((theta * x) -

You1022的博客 1万+

配电网可靠性评估(一)—最小路法和非序贯蒙特卡洛模拟法的matlab实现

电力系统的可靠性研究是相关领域的热点问题。根据研究对象的不同,又可分为发电系统的可靠性,输电系统的可靠性和配电系统的可靠性。配电网在电力系统中处于最末端的位置,直接和用户相连,一旦出现故障情况,就会在用户侧表现为停电事故。因此对配电网的可靠性评估有着重大意义。......

配电网和matlab的博客 1万+

moveit——基于octomap的碰撞检测

机械臂对棚顶进行碰撞检测。

如果想成为中心,那么就到中心去吧。 1357

python中sgd模型_语言模型SGD

转述:Recurrent Neural Networks Tutorial, Part 2 – Implementing a RNN with Python, Numpy and Theano这里主要记录下上面那篇文字里所说的loss的计算和SGD。作者采用的是交叉熵的Loss,公式如下这里把一个字作为一个训练样本,一个句子作为一个mini-batch。计算整个训练语料Loss的代码块为:def ...

weixin_28872105的博客 934

把 ABAP ALE Change Pointers 讲透:从 CDHDR/CDPOS 到 BDCP2,再到 RBDMIDOC 的自动分发链路

摘要:SAP ALE Change Pointers机制在系统集成中实现业务变更与数据分发的解耦。它记录业务对象变更(如SAP主数据修改),但不立即发送,而是由后续分发逻辑决定发送时机和方式。该机制包含两层:Change Documents记录审计级变更明细,Change Pointers标记需分发的关键变更。配置核心包括全局开关、消息类型激活和字段选择。典型应用如零售价格条件变更自动推送至POS系统,通过BDCP2表存储待处理队列,由RBDMIDOC程序定时评估生成IDoc。运维需关注定期清理和性能优化,

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 210

YOLO目标检测模型训练时如何选择优化器?SGD vs Adam与GPU效率

在YOLO目标检测模型训练中,SGD凭借更高的收敛精度和GPU效率成为工业界首选,尤其适合大规模稳定训练;而Adam虽收敛平稳,但显存占用高、泛化性弱,更适合微调与快速验证。实际应用需权衡精度、速度与资源限制。

weixin_30598047的博客 1357

FD.io/VPP — VPP 的实现原理解析

目录 文章目录目录VPPVPP 的关键创新技术数据报文的矢量处理标量报文处理方式I-cache miss 问题矢量数据报文处理方式标量 v.s. 矢量报文处理流程Packet Processing Graph(数据报文处理图)Packet Processing Graph 的处理流程Graph Node Plugin 机制 VPP WIKI:https://wiki.fd.io/view/VPP Docs:https://fd.io/docs/vpp/master/index.html Github:ht

烟云的计算 2593

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

深度学习训练效率革命:PaddlePaddle梯度下降变种全解析

你还在为模型训练收敛慢、精度波动发愁?作为工业级深度学习框架,PaddlePaddle(飞桨)内置10+优化算法,从基础SGD到自适应学习率家族全覆盖。本文将拆解五大梯度下降变种的实现原理,通过对比实验揭示收敛性规律,并提供[飞桨官方优化器工具](https://link.gitcode.com/i/54836733dc69ed7070c0161aa6b075c3)的实战指南,帮你实现训练效率30...

gitblog_00150的博客 767

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【大模型面试每日一题】Day 7:为什么大模型训练选择 Adam 而非 SGD?Adam 的关键改进是什么?

【大模型面试每日一题】Day 7:为什么大模型训练选择 Adam 而非 SGD?Adam 的关键改进是什么?

2302_79932616的博客 1279

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

最优化分布式训练效率:Ludwig同步与异步SGD全解析

你还在为分布式训练中的节点同步问题烦恼吗?当模型训练从单GPU升级到多节点集群时,90%的工程师都会遇到梯度同步延迟或资源利用率低下的困境。本文将通过Ludwig框架的实战案例,详解同步SGD(随机梯度下降)与异步SGD两种分布式策略的实现原理、性能对比及选型指南,帮你在10分钟内掌握大规模模型训练的效率优化技巧。 ## 分布式训练核心挑战:梯度一致性与训练速度的平衡 在分布式训练中,多个计算...

gitblog_01025的博客 817

ICLR 2025 | EDiT:一种基于 Local SGD 策略的大模型高效分布式训练方法

本文分析了在大规模集群中使用现有分布式训练方法训练 LLM 时存在的问题,并进一步分析了现有解决方案——Local SGD 方法存在的问题。在此基础上,提出了一种叫做 EDiT 的针对 LLM 的新颖的高效分布式训练方法。

DB_GPT的博客 1214

随机梯度下降 (Stochastic Gradient Descent, SGD)

SGD 是梯度下降法的一种变体。与批量梯度下降法不同,SGD 在每次迭代中仅使用一个样本(或一个小批量样本)的梯度来更新参数。它能更快地更新参数,并且可以更容易地跳出局部最优解。

LS_Ai的博客 1907

TensorFlow Privacy项目实战:基于DP-SGD的MNIST分类模型保护训练

本文将通过TensorFlow Privacy项目中的DP-SGD优化器,演示如何在MNIST数据集上训练一个具备差分隐私保护的卷积神经网络模型。我们将深入探讨差分隐私随机梯度下降(DP-SGD)的核心原理、实现方式以及在实际应用中的注意事项。 ## 差分隐私基础 差分隐私是一种严格的数学框架,它通过向计算过程添加精心校准的噪声,确保外部观察者无法确定特定个体是否参与了数据集。在机器学习领域,

gitblog_00946的博客 776
上一篇: 【AI研究院】头条与抖音背后的AILab怎么样
下一篇: 【模型训练】如何选择最适合你的学习率变更策略
言有三
言有三 领域专家: 人工智能技术领域 领域专家: 人工智能技术领域
博客等级 码龄15年 3635粉丝 976原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

言有三

三人行必有AI

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值