当前位置: 首页 > article >正文

Optimizer 梯度下降优化算法

1. 前言当前使用的许多优化算法是对梯度下降法的衍生和优化。在微积分中对多元函数的参数求偏导数把求得的各个参数的导数以向量的形式写出来就是梯度。梯度就是函数变化最快的地方。梯度下降是迭代法的一种在求解机器学习算法的模型参数时即无约束问题时梯度下降是最常采用的方法之一。这里定义一个通用的思路框架方便我们后面理解各算法之间的关系和改进。首先定义待优化参数目标函数学习率为然后我们进行迭代优化假设当前的epoch为t则有计算目标函数关于当前参数的梯度根据历史梯度计算一阶动量和二阶动量计算当前时刻的下降梯度根据下降梯度进行更新其中为下一个时刻的参数为当前时刻t参数后面的描述我们都将结合这个框架来进行。这里提一下一些概念鞍点一个光滑函数的鞍点邻域的曲线曲面或超曲面都位于这点的切线的不同边。例如这个二维图形像个马鞍在x-轴方向往上曲在y-轴方向往下曲鞍点就是 (0, 0)。指数加权平均、偏差修正可参见这篇文章2. 梯度下降 (GD)在GD中没有动量的概念也就是说在上述框架中则我们在当前时刻需要下降的梯度就是则使用梯度下降法更新参数为假设当前样本为每当样本输入时参数即进行更新梯度下降算法中模型参数的更新调整与代价函数关于模型参数的梯度有关即沿着梯度的方向不断减小模型参数从而最小化代价函数。基本策略可以理解为“在有限视距内寻找最快路径下山”因此每走一步参考当前位置最陡的方向即梯度进而迈出下一步更形象的如下图标准的梯度下降主要有两个缺点训练速度慢在应用于大型数据集中每输入一个样本都要更新一次参数且每次迭代都要遍历所有的样本会使得训练过程及其缓慢需要花费很长时间才能得到收敛解。容易陷入局部最优解由于是在有限视距内寻找下山的反向当陷入平坦的洼地会误以为到达了山地的最低点从而不会继续往下走。所谓的局部最优解就是鞍点落入鞍点梯度为0使得模型参数不在继续更新。3. 批量梯度下降 (BGD)BGD相对于标准GD进行了改进改进的地方通过它的名字应该也能看出来也就是不再是想标准GD一样对每个样本输入都进行参数更新而是针对一个批量的数据输入进行参数更新。我们假设批量训练样本总数为n样本为则在第i对样本上损失函数关于参数的梯度为则使用BGD更新参数为从上面的公式我们可以看到BGD其实是在一个批量的样本数据中求取该批量样本梯度的均值来更新参数即每次权值调整发生在批量样本输入之后而不是每输入一个样本就更新一次模型参数这样就会大大加快训练速度但是还是不够我们接着往下看。4. 随机梯度下降 (SGD)随机梯度下降法不像BGD每一次参数更新需要计算整个数据样本集的梯度而是每次参数更新时仅仅选取一个样本计算其梯度参数更新公式为公式看起来和上面标准GD一样但是注意了这里的样本是从批量中随机选取一个而标准GD是所有的输入样本都进行计算。可以看到BGD和SGD是两个极端SGD由于每次参数更新仅仅需要计算一个样本的梯度训练速度很快即使在样本量很大的情况下可能只需要其中一部分样本就能迭代到最优解由于每次迭代并不是都向着整体最优化方向导致梯度下降的波动非常大如下图更容易从一个局部最优跳到另一个局部最优准确度下降。论文中提到当缓慢降低学习率时SGD会显示与BGD相同的收敛行为几乎一定会收敛到局部非凸优化或全局最小值凸优化。SGD的优点虽然看起来SGD波动非常大会走很多弯路但是对梯度的要求很低计算梯度快而且对于引入噪声大量的理论和实践工作证明只要噪声不是特别大SGD都能很好地收敛。应用大型数据集时训练速度很快。比如每次从百万数据样本中取几百个数据点算一个SGD梯度更新一下模型参数。相比于标准梯度下降法的遍历全部样本每输入一个样本更新一次参数要快得多。SGD的缺点SGD在随机选择梯度的同时会引入噪声使得权值更新的方向不一定正确次要。SGD也没能单独克服局部最优解的问题主要。5. 小批量梯度下降MBGD也叫作SGD小批量梯度下降法就是结合BGD和SGD的折中对于含有n个训练样本的数据集每次参数更新选择一个大小为 m(mn) 的 mini-batch 数据样本计算其梯度其参数更新公式如下小批量梯度下降法即保证了训练的速度又能保证最后收敛的准确率目前的SGD默认是小批量梯度下降算法。常用的小批量尺寸范围在50到256之间但可能因不同的应用而异。MBGD的缺点Mini-batch gradient descent 不能保证很好的收敛性learning rate 如果选择的太小收敛速度会很慢如果太大loss function 就会在极小值处不停地震荡甚至偏离有一种措施是先设定大一点的学习率当两次迭代之间的变化低于某个阈值后就减小 learning rate不过这个阈值的设定需要提前写好这样的话就不能够适应数据集的特点。对于非凸函数还要避免陷于局部极小值处或者鞍点处因为鞍点所有维度的梯度都接近于0SGD 很容易被困在这里会在鞍点或者局部最小点震荡跳动因为在此点处如果是BGD的训练集全集带入则优化会停止不动如果是mini-batch或者SGD每次找到的梯度都是不同的就会发生震荡来回跳动。SGD对所有参数更新时应用同样的 learning rate如果我们的数据是稀疏的我们更希望对出现频率低的特征进行大一点的更新且learning rate会随着更新的次数逐渐变小。6. 动量momentum算法思想参数更新时在一定程度上保留之前更新的方向同时又利用当前batch的梯度微调最终的更新方向简言之就是通过积累之前的动量来加速当前的梯度。从这里开始我们引入一阶动量的概念在mini-batch SGD的基础之上也就是说在最开始说的框架中而不变参数更新公式如下一阶动量是各个时刻梯度方向的指数移动平均值约等于最近个时刻的梯度向量和的平均值移动平均是啥看最上面的文章。也就是说t时刻的下降方向不仅由当前点的梯度方向决定而且由此前累积的下降方向决定。的经验值为0.9这就意味着下降方向主要是此前累积的下降方向并略微偏向当前时刻的下降方向。在梯度方向改变时momentum能够降低参数更新速度从而减少震荡在梯度方向相同时momentum可以加速参数更新从而加速收敛如下图动量主要解决SGD的两个问题随机梯度的方法引入的噪声Hessian矩阵病态问题可以理解为SGD在收敛过程中和正确梯度相比来回摆动比较大的问题。7. Nesterov加速梯度NAG (Nesterov accelerated gradient) 算法是Momentum动量算法的变种。momentum保留了上一时刻的梯度对其没有进行任何改变NAG是momentum的改进在梯度更新时做一个矫正具体做法就是在当前的梯度上添加上一时刻的动量梯度改变为参数更新公式如下加上nesterov项后梯度在大的跳跃后进行计算对当前梯度进行校正。下图是momentum和nesterrov的对比表述图如下Nesterov动量梯度的计算在模型参数施加当前速度之后因此可以理解为往标准动量中添加了一个校正因子。在凸批量梯度的情况下Nesterov动量将额外误差收敛率从k步后改进到然而在随机梯度情况下Nesterov动量对收敛率的作用却不是很大。Momentum和Nexterov都是为了使梯度更新更灵活。但是人工设计的学习率总是有些生硬下面介绍几种自适应学习率的方法。8. AdagradAdagrad其实是对学习率进行了一个约束对于经常更新的参数我们已经积累了大量关于它的知识不希望被单个样本影响太大希望学习速率慢一些对于偶尔更新的参数我们了解的信息太少希望能从每个偶然出现的样本身上多学一些即学习速率大一些。而该方法中开始使用二阶动量才意味着“自适应学习率”优化算法时代的到来。我们前面都没有好好的讨论二阶动量二阶动量是个啥它是用来度量历史更新频率的二阶动量是迄今为止所有梯度值的平方和即在最上面的框架中在这里也就是说我们的学习率现在是一般为了避免分母为0会在分母上加一个小的平滑项从这里我们就会发现是恒大于0的而且参数更新越频繁二阶动量越大学习率就越小这一方法在稀疏数据场景下表现非常好参数更新公式如下细心的小伙伴应该会发现Adagrad还是存在一个很明显的缺点仍需要手工设置一个全局学习率如果设置过大的话会使regularizer过于敏感对梯度的调节太大中后期分母上梯度累加的平方和会越来越大使得参数更新量趋近于0使得训练提前结束无法学习9. Adadelta由于AdaGrad调整学习率变化过于激进我们考虑一个改变二阶动量计算方法的策略不累积全部历史梯度而只关注过去一段时间窗口的下降梯度即Adadelta只累加固定大小的项并且也不直接存储这些项仅仅是近似计算对应的平均值指数移动平均值这就避免了二阶动量持续累积、导致训练过程提前结束的问题了参数更新公式如下观察上面的参数更新公式我们发现还是依赖于全局学习率但是原作者在此基础之上做出了一定的处理上式经过牛顿迭代法之后得到Adadelta最终迭代公式如下式其中此时可以看出Adadelta已经不依赖全局learning rate了Adadelta有如下特点训练初中期加速效果不错很快训练后期反复在局部最小值附近抖动10. RMSpropRMSProp算法修改了AdaGrad的梯度平方和累加为指数加权的移动平均使得其在非凸设定下效果更好。设定参数全局初始率默认设为0.001decay rate默认设置为0.9一个极小的常量通常为参数更新公式如下其中其实RMSprop依然依赖于全局学习率RMSprop算是Adagrad的一种发展和Adadelta的变体效果趋于二者之间适合处理非平稳目标包括季节性和周期性——对于RNN效果很好11. 自适应却动量估计 (Adam)其实有了前面的方法Adam和Nadam的出现就很理所当然的了因为它们结合了前面方法的一阶动量和二阶动量。我们看到SGD-M和NAG在SGD基础上增加了一阶动量AdaGrad和AdaDelta在SGD基础上增加了二阶动量参数更新公式如下按照最开始总结的计算框架通常情况下默认值为、和Adam通常被认为对超参数的选择相当鲁棒特点如下Adam梯度经过偏置校正后每一次迭代学习率都有一个固定范围使得参数比较平稳结合了Adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的优点为不同的参数计算不同的自适应学习率也适用于大多非凸优化问题——适用于大数据集和高维空间。12. AdaMaxAdamax是Adam的一种变体此方法对学习率的上限提供了一个更简单的范围即使用无穷范式参数更新公式如下通常情况下默认值为、和13. Nadam其实如果说要集成所有方法的优点于一身的话Nadam应该就是了Adam遗漏了啥没错就是Nesterov项我们在Adam的基础上加上Nesterov项就是Nadam了参数更新公式如下可以看出Nadam对学习率有更强的约束同时对梯度的更新也有更直接的影响。一般而言在使用带动量的RMSprop或Adam的问题上使用Nadam可以取得更好的结果。来张直观的动态图展示上述优化算法的效果下图描述了在一个曲面上6种优化器的表现下图在一个存在鞍点的曲面比较6中优化器的性能表现下图图比较了6种优化器收敛到目标点五角星的运行过程14. 总结那种优化器最好该选择哪种优化算法目前还没能够达达成共识。Schaul et al (2014) 展示了许多优化算法在大量学习任务上极具价值的比较。虽然结果表明具有自适应学习率的优化器表现的很鲁棒不分伯仲但是没有哪种算法能够脱颖而出。目前最流行并且使用很高的优化器算法包括SGD、具有动量的SGD、RMSprop、具有动量的RMSProp、AdaDelta和Adam。在实际应用中选择哪种优化器应结合具体问题同时也优化器的选择也取决于使用者对优化器的熟悉程度比如参数的调节等等。对于稀疏数据尽量使用学习率可自适应的优化方法不用手动调节而且最好采用默认值SGD通常训练时间更长但是在好的初始化和学习率调度方案的情况下结果更可靠如果在意更快的收敛并且需要训练较深较复杂的网络时推荐使用学习率自适应的优化方法。AdadeltaRMSpropAdam是比较相近的算法在相似的情况下表现差不多。在想使用带动量的RMSprop或者Adam的地方大多可以使用Nadam取得更好的效果如果验证损失较长时间没有得到改善可以停止训练。添加梯度噪声高斯分布到参数更新可使网络对不良初始化更加健壮并有助于训练特别深而复杂的网络。参考文献收藏 | 各种 Optimizer 梯度下降优化算法回顾和总结

相关文章:

Optimizer 梯度下降优化算法

1. 前言 当前使用的许多优化算法,是对梯度下降法的衍生和优化。在微积分中,对多元函数的参数求偏导数,把求得的各个参数的导数以向量的形式写出来就是梯度。梯度就是函数变化最快的地方。梯度下降是迭代法的一种,在求解机器学习算…...

数据可视化实战:如何通过Python定制个性化图表样式

1. Python数据可视化基础:从默认样式到个性化定制 第一次用Matplotlib画图时,我被它默认生成的蓝色折线图震惊了——这配色和PPT里的图表简直如出一辙。但当我学会调整第一个参数后,整个数据呈现方式发生了翻天覆地的变化。Python的可视化库之…...

【SLAM导航实战解析】- 基于已知地图的AMCL定位与move_base路径规划

1. AMCL定位与move_base导航的核心原理 第一次接触机器人导航时,我被AMCL算法中那些跳动的粒子云深深吸引。想象一下,你的机器人就像在玩一场高科技版的"躲猫猫"游戏——它不知道自己在哪里,但通过不断观察周围环境特征&#xff0c…...

一、组合逻辑设计实战——从波形图到上板验证的多路选择器

1. 从零开始搭建多路选择器工程 第一次接触FPGA开发的朋友可能会觉得无从下手,其实只要按照标准流程一步步来,很快就能上手。我刚开始做数字电路设计时,最头疼的就是工程文件管理混乱,后来养成了规范化的习惯,效率提升…...

《我的世界》Python编程实战:从零搭建你的自动化游戏世界

1. 环境准备:搭建你的Python版《我的世界》控制台 十年前我第一次用Python控制《我的世界》时,那种用代码生成城堡的震撼感至今难忘。现在让我们从零开始,用最新稳定版本的工具链,带你快速搭建这个神奇的环境。整个过程就像组装乐…...

如何用AI技术将单张图片转换为专业PSD分层文件:Layerdivider完全指南

如何用AI技术将单张图片转换为专业PSD分层文件:Layerdivider完全指南 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider Layerdivider是一款基于…...

HTML5中Vuex持久化插件中WebStorage的底层配置

Vuex 持久化依赖插件(如 vuex-persistedstate),底层调用 localStorage/sessionStorage 或自定义 storage,通过 key、paths 控制存储键名与字段,JSON 序列化限制数据类型,reducer 可过滤敏感信息或动态控制持…...

为Git设置全局勾子,自动追加提交信息

当多人一起开发软件时,我们通常希望 Git 提交日志里能自动带上一些额外内容,比如项目名称、任务编号(像 JIRA ID)或者分支类型,因为这些信息对之后做代码审查、追踪修改记录,或者配合自动化流程都很有帮助&…...

Windows远程桌面mstsc命令的隐藏玩法:从编辑RDP文件到多显示器适配

Windows远程桌面mstsc命令的隐藏玩法:从编辑RDP文件到多显示器适配 远程桌面连接(Remote Desktop Connection)是Windows系统中一个极为实用的功能,尤其对于需要频繁管理多台计算机的IT专业人员来说。大多数人可能只使用过图形界面…...

【Windows】使用启动U盘重装Windows10系统

一、准备 启动盘,详情见:【Windows】制作Windows10系统U盘,启动盘制作步骤要重装系统的电脑。 提示 重装系统前一定要备份自己的数据 二、重装系统 (一)BIOS设置(以惠普战66为例) 这一步的…...

Vue项目里用腾讯地图API把地址转成经纬度,我踩过的坑你别再踩了

Vue项目实战:腾讯地图地址解析避坑指南 第一次在Vue项目里集成腾讯地图API时,我天真地以为这不过是个简单的接口调用。直到连续三个晚上被各种报错折磨得怀疑人生,才意识到每个环节都藏着意想不到的坑。本文将分享我从零开始实现地址转经纬度…...

别再为4G视频卡顿发愁!手把手教你用阿里云ECS和coturn搭建专属TURN中继服务器

4G视频传输卡顿终结者:基于阿里云ECS的TURN中继服务器实战指南 当你在偏远工地调试RV1106芯片的监控摄像头时,是否经历过这样的崩溃瞬间——4G网络下视频画面频繁卡顿,关键帧丢失得像打满马赛克的抽象画?这往往不是信号强度的问题…...

AXI Memory Mapped to PCI Express IP核在Vivado中的高效集成与应用

1. AXI Memory Mapped to PCI Express IP核基础解析 第一次接触这个IP核时,我盯着文档发了半小时呆——名字实在太长了!后来在实际项目中摸爬滚打才发现,它其实就是个"翻译官",专门解决AXI4总线和PCIe协议之间的语言不通…...

自媒体内容没人看,可能不是你写得差,是“开头”就把人劝退了

你有没有过这种体验:辛辛苦苦写了一篇稿子,自己觉得挺好,发出去阅读量却惨淡。你安慰自己“可能是选题不好”,但同样的选题,别人写就能火。问题可能不在选题,在开头。我统计过自己近30篇文章的数据&#xf…...

Teamocil与tmux深度集成:核心命令和API完全解析

Teamocil与tmux深度集成:核心命令和API完全解析 【免费下载链接】teamocil Theres no I in Teamocil. At least not where you think. Teamocil is a simple tool used to automatically create windows and panes in tmux with YAML files. 项目地址: https://gi…...

从项目管理到芯片设计:聊聊DAG最长路径在‘关键路径’计算中的那些事儿

从项目管理到芯片设计:DAG最长路径在关键路径计算中的实战应用 在软件研发项目中,你是否遇到过这样的困境:明明每个任务都按时完成,但项目总工期却一再延误?或者在芯片设计流程中,如何确定哪些工序的延迟会…...

《异常检测——从经典算法到深度学习》3 基于One-Class SVM的工业时序数据异常检测实战

1. One-Class SVM算法在工业时序数据中的独特价值 第一次接触工业设备振动数据时,我被密密麻麻的波形图搞得头晕眼花。工厂老师傅指着屏幕上突然出现的尖峰说:"这就是轴承快坏了的征兆,但人工看太费劲了"。这正是One-Class SVM大显…...

Android13 Launcher3自定义Workspace网格布局与图标间距实战

1. 理解Launcher3的Workspace布局机制 在Android系统中,Launcher3是负责管理桌面、应用抽屉和快捷栏的核心组件。Workspace作为Launcher3的关键部分,决定了应用图标、文件夹和小工具的排列方式。Android13对Launcher3的架构做了进一步优化,使…...

逆向实战:手把手教你用Node.js复现QQ音乐sign生成算法(附完整代码)

逆向工程实战:Node.js还原QQ音乐API签名生成机制 每次打开QQ音乐播放器,那些流畅跳动的音频数据背后都藏着一套精密的加密舞蹈。作为开发者,当我们试图通过程序化方式获取这些资源时,总会遇到那个令人头疼的sign参数——它像一道电…...

Python实战:Intel RealSense D435i多模态数据采集与可视化全流程解析

1. 环境准备与设备连接 第一次接触Intel RealSense D435i时,我也被它丰富的传感器配置惊艳到了。这款深度相机不仅能采集彩色图像,还能同步获取深度图和左右红外图像,非常适合做三维重建、手势识别等应用。不过刚开始用Python操作它时&#x…...

告别Windows和TwinCAT:用树莓派+开源IgH搭建低成本EtherCAT主站测试平台

树莓派IgH:低成本搭建工业级EtherCAT主站全指南 工业自动化领域长期被高价商业解决方案垄断,直到开源项目IgH EtherCAT的出现打破了这一局面。本文将手把手教你用树莓派和IgH搭建一个功能完整的EtherCAT主站测试平台,成本不到商业方案的1/10。…...

RS232、RS485与Modbus:工业通信协议与接口标准的深度解析

1. 工业通信的基石:RS232与RS485的前世今生 第一次接触工业通信时,我被各种接口标准搞得晕头转向。直到在某个自动化产线调试现场,老师傅指着设备后面密密麻麻的接线端子说:"搞懂RS232和RS485,你就掌握了工业通信…...

Tern项目配置终极指南:快速搭建企业级JavaScript分析环境

Tern项目配置终极指南:快速搭建企业级JavaScript分析环境 【免费下载链接】tern A JavaScript code analyzer for deep, cross-editor language support 项目地址: https://gitcode.com/gh_mirrors/te/tern Tern是一款强大的JavaScript代码分析工具&#xff…...

SiameseAOE中文-base作品集:抽取结果可视化热力图,直观呈现用户关注焦点分布

SiameseAOE中文-base作品集:抽取结果可视化热力图,直观呈现用户关注焦点分布 1. 引言:从海量评论中“看见”用户心声 你有没有遇到过这样的困扰?面对成千上万条用户评论、产品反馈或社交媒体帖子,想要快速了解大家最…...

Quant-UX文件格式深度解析:理解JSON结构实现自定义导入导出

Quant-UX文件格式深度解析:理解JSON结构实现自定义导入导出 【免费下载链接】quant-ux Quant-UX - Prototype, Test and Learn 项目地址: https://gitcode.com/gh_mirrors/qu/quant-ux Quant-UX是一款强大的原型设计与测试工具,其核心功能之一是通…...

PHP final关键字怎么用?

在 PHP 中,final 关键字可以防止 class 和 function 被修改或覆盖。它有助于保护代码的重要部分,确保在进行修改时不会意外破坏它们。 final 关键字用于 class 的定义、class 中的 method,以及 class 的 constant property 的定义。 final …...

CodeceptJS性能优化实战:10个技巧大幅减少测试执行时间

CodeceptJS性能优化实战:10个技巧大幅减少测试执行时间 【免费下载链接】CodeceptJS Supercharged End 2 End Testing Framework for NodeJS 项目地址: https://gitcode.com/gh_mirrors/co/CodeceptJS CodeceptJS作为一款Supercharged End 2 End Testing Fra…...

树莓派4B 无盘化部署实战:从零构建网络启动环境

1. 为什么需要无盘化部署? 第一次接触树莓派无盘启动这个概念时,我也觉得挺神奇的。毕竟树莓派一直以来都是依赖SD卡启动的,突然说可以完全不用存储介质,直接从网络启动系统,这听起来就像变魔术一样。但当我真正在实验…...

大模型剪枝(二)Wanda实战:无需再训练的高效LLM压缩方案

1. 从理论到实践:为什么Wanda值得一试? 上次我们聊了Wanda论文的核心思想,很多朋友留言说,原理听起来很巧妙,但具体怎么用代码实现?效果到底怎么样?会不会把模型“剪废了”?今天&…...

智能合约开发革命:solmate 完整指南 - 现代、高效且节省 gas 的构建模块

智能合约开发革命:solmate 完整指南 - 现代、高效且节省 gas 的构建模块 【免费下载链接】solmate Modern, opinionated, and gas optimized building blocks for smart contract development. 项目地址: https://gitcode.com/gh_mirrors/so/solmate solmate…...