尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Adam凭什么比SGD快?手写三组优化器,NumPy跑出10个数量级差距,ML数学基础第8期
标前七期我们攒齐了半套装备第2期注意力是矩阵乘法第3期softmax第4期交叉熵第5期LayerNorm第6期反向传播第7期讲学习率。今天把第7期留的尾巴收了学习率调对之后优化器本身还能不能再快先摆个靶子。Rosenbrock函数长得像一根香蕉谷底又细又长是优化器的经典考场。起点(-1, 1)函数值4.0目标是走到谷底的(1, 1)。SGD学习率0.001跑2000步函数值还剩7.42e-02。能走但慢。慢在哪香蕉谷底两个方向的坡度差了上百倍。学习率按最陡的方向设到了平缓方向就只能一步步挪。这时候动量(momentum)登场。想法很直观梯度方向基本一致的时候把历史梯度累积起来越走越快方向来回震荡的时候正负抵消自动减速。像推着一个小球滚下山有惯性。代码不长核心就三行importnumpyasnpdefrosenbrock(x):return(1-x[0])**2100*(x[1]-x[0]**2)**2defgrad(x):g0-2*(1-x[0])-400*x[0]*(x[1]-x[0]**2)g1200*(x[1]-x[0]**2)returnnp.array([g0,g1])defmomentum(x0,lr0.001,beta0.9,steps2000):xx0.copy()vnp.zeros(2)# 速度累积历史梯度for_inrange(steps):vbeta*vgrad(x)x-lr*vreturnrosenbrock(x)beta0.9是惯例相当于记住最近10步左右的梯度方向。Adam是两步再往前动量管往哪走再加一个每步走多大。它给每个参数单独算学习率梯度一直很大的方向步子自动调小梯度稀稀拉拉的方向步子自动放大。用梯度平方的滑动平均来估计每个方向的忙碌程度。另外有个容易忽略的细节叫偏差修正刚开始滑动平均都是0前几步会被低估除以(1-beta^t)把它修正回来。defadam(x0,lr0.01,steps2000):xx0.copy()mnp.zeros(2)# 一阶矩梯度的滑动平均(动量)vnp.zeros(2)# 二阶矩梯度平方的滑动平均(自适应步长)b1,b20.9,0.999fortinrange(1,steps1):ggrad(x)mb1*m(1-b1)*g vb2*v(1-b2)*g*g mhm/(1-b1**t)# 偏差修正vhv/(1-b2**t)x-lr*mh/(np.sqrt(vh)1e-8)returnrosenbrock(x)环境只要numpypip install numpy就行。四组实验我机器上真实跑出来的数字起点都是(-1, 1)都跑2000步SGD学习率0.0017.42e-02Momentum学习率0.0018.97e-09Adam学习率0.0011.23e-01Adam学习率0.011.74e-19看出门道了吗。动量是质变同样学习率Momentum比SGD快了7个数量级。Adam在学习率0.01时最猛1.74e-19基本贴着谷底。但注意第三行Adam在学习率0.001时只走到1.23e-01还不如SGD。这就是今天最大的坑Adam不是无脑强它照样吃学习率学习率没设对再花哨的自适应也救不了。第7期讲学习率不是白讲的优化器换得再勤学习率这一课都躲不掉。为什么Adam在小学习率下反而拉胯它的自适应步长是按历史梯度平方来缩放的Rosenbrock这种狭长山谷里二阶矩估计会把本就不大的步子压得更小2000步根本走不到谷底。调大到0.01一阶矩的动量效果才放出来。所以Adam的自适应不是不用调是调起来和SGD不是一个手感。第二个坑Adam快但不总是最好。小模型、数据干净、调参时间充足的时候SGD动量调好了泛化经常更好。Adam是开箱即用的选择SGD是愿意花时间调的选择。面试被问为什么默认用Adam别只背收敛快把这句也带上。收藏这篇下次有人问你Adam和SGD的区别直接把这四组数字甩出来比背公式管用。下期预告第9期讲正则化——L2、Dropout、早停三个防止过拟合的手段NumPy手写看效果。这个系列在专栏《ML数学基础》里连着更新从矩阵乘法一路写到优化器关注后专栏里能连着看。讨论你训模型时默认用Adam还是SGD有没有遇到过Adam还不如SGD的时候最后怎么解决的—— Cyrus
RELATED

相关推荐

为什么 Spring Boot 3 的虚拟线程没让接口变快:JDK 21 pinning 排查记录

为什么 Spring Boot 3 的虚拟线程没让接口变快:JDK 21 pinning 排查记录

本文摘要:启用虚拟线程后接口吞吐不升反降,根因是请求路径上的native方法调用导致pinning。用tracePinnedThreads定位后将文件I/O迁移到NIO API即可解决。 一、问题与结论 Spring Boot 3.2 JDK 21,Tomcat 10.1.15,8 核容器&…

📅 2026/11/5 5:26:19
【WSL】NodeJs安装

【WSL】NodeJs安装

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/11/5 5:21:19
08IO流技术

08IO流技术

File类File类是Java中用于表示文件和目录路径的抽象表示,属于java.io包。它不直接操作文件内容,而是提供对文件系统中文件和目录的创建、删除、重命名、查询属性等操作的支持。构造方法通过字符串路径创建。File file new File("example.txt"…

📅 2026/11/5 5:21:19
MORE NEWS

更多资讯

📰

Markdown论文写作工具链:智能排版与文献管理实践

1. 项目概述:论文写作效率革命去年帮导师带本科生毕业论文时,我亲眼目睹了学生们在deadline前熬夜改格式、查重、调参考文献的崩溃场景。直到发现这个开源的论文写作工具链,才意识到原来90%的机械性工作都可以自动化完成。PaperRed本质上是一…

📰

开源推荐算法解析:从特征工程到部署优化

1. 开源推荐算法的行业背景与意义当一家全球顶级社交平台突然宣布公开其核心推荐算法源代码时,整个科技圈都会为之震动。这就像米其林餐厅突然公开了招牌菜的完整食谱,让业界得以窥见那些影响数十亿用户内容消费的"秘密配方"。推荐系统作为内容…

📰

Blender原点操作本质:五种模式的空间逻辑与工程避坑指南

1. 这不是“调个点”那么简单:Blender原点操作的本质与真实痛点在Blender里点几下鼠标把原点挪来挪去,看起来只是个基础操作——但如果你做过角色绑定、程序化建模、动画重定向,或者导出模型到Unity/Unreal时突然发现旋转轴歪了、缩放崩了、蒙…

📰

东北大学高数上期末核心突破:可导性判定与极值拐点辨析

简介:本资源为东北大学《高等数学(上)》历年期末考试真题汇编,面向该校及同类理工科高校本科生,专用于考前系统复习、考点查漏与解题能力强化。试卷覆盖2005—2007年三套完整试题,题型规范、难度梯度合理&a…

📰

Blender原点操作全解析:从空间逻辑到工业级精度

1. Blender中物体原点操作:为什么它比建模本身更常让我停下手来反复调试?在Blender里,我见过太多人花三小时雕一个逼真的机械臂,却在导出时发现整个模型歪着飞出去;也见过有人把角色动画做得行云流水,一绑定…

📰

2KB SRAM Arduino多任务:SCoop协作式调度实战

简介:面向Arduino开发者与单片机并发编程学习者的SCoop多线程库完整源码包,适合在资源受限的AVR等平台上组织多任务、提升程序响应与执行效率。压缩包共58个文件、约726KB,以29个ino示例、12个txt说明与变更日志、7个h头文件、7个cpp实现为主…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬