优化器是什么?SGD、Momentum、Adam 有什么区别?

优化器是什么?SGD、Momentum、Adam有什么区别?
上篇聊完梯度消失和梯度爆炸,你可能在想:为什么梯度会不稳定?怎么才能让训练更顺畅?
答案跟优化器有关。梯度消失和梯度爆炸说的是"方向不准",而优化器决定的是"怎么根据这个方向更新参数"。同一个梯度,优化器不同,效果天差地别。
优化器:决定参数怎么走的那只手
训练神经网络,本质上是找一组参数让损失函数最小。
损失函数衡量的是"模型预测"和"真实答案"之间的差距。优化器的任务就是不断调整参数,让这个差距越来越小。
核心公式很简单:新参数 = 旧参数 - 学习率 × 梯度
梯度告诉优化器哪个方向是下坡,学习率决定这一步迈多大。这个过程重复几百上千次,参数就慢慢变"聪明"了。
想象你在多维曲面上找一个最低点。起点是随机初始化的地方,终点是某个低洼处。梯度下降就是每一步都往最陡的下坡方向走。
问题是,这个曲面可能极其复杂。有平坦的 plateau,有陡峭的峡谷,还有很多小坑。如果优化器只会"低头看脚下",就容易走弯路。

所以需要不同的优化器。
SGD:最老实的笨办法
SGD,即随机梯度下降,每次只用1个样本(或少量样本)计算梯度。
为什么要"随机"?因为算全部数据的梯度太慢了。如果有100万条数据,每次迭代都要过一遍全部数据,训练一轮可能要几个小时。
SGD的思路是:用1个样本的梯度来近似全部样本的梯度。虽然不准确,但速度快。
深度学习里常用的是 Mini-batch SGD。每次用几十到几百个样本来估计梯度,在"准确度"和"速度"之间找平衡。Batch Size 一般设成 32、64、128 这些 2 的幂次。
SGD最大的问题是"晃"。

看这张图,SGD的Loss曲线不是平滑下降的,而是来回波动。特别是在最优解附近,晃来晃去就是停不下来。
原因很简单:每个batch的样本不一样,梯度估计有噪声。就像在浓雾里下山,你每次只能看清脚下一米,偶尔会往错误方向迈一步。
这个"晃"有坏处:收敛慢,最终精度可能差那么一点点。
但也有好处:有时候能帮助跳出局部最优。SGD的噪声反而让它不会困在小的局部最优里。
调参的时候,学习率是最关键的一个参数。设大了震荡剧烈,设小了收敛像蜗牛爬。
Momentum:给梯度加个惯性
Momentum,中文叫动量法,核心思想是"累积历史梯度"。
物理里有个概念:一个滚动的球有惯性,往某个方向滚的时间越长,继续往那个方向滚的趋势越大。Momentum就是借鉴了这个思想。
公式变成这样:
速度 = 动量系数 × 旧速度 + 当前梯度
参数 = 旧参数 - 学习率 × 速度动量系数通常设为0.9。这意味着历史梯度占大头,当前梯度只占10%。
想象一个小球在山坡上滚。当前坡度变陡了,但小球不会马上垂直下落,而是沿着之前的方向偏移一下。

这样做有两个好处:
一是相关方向加速。连续几轮梯度都往东,那速度越来越大,更新步子越来越快。
二是摇摆方向减速。如果这轮梯度往东,下轮往西,速度会相互抵消,晃动的幅度就小了。
我以前用Momentum训练图像分类模型,明显感觉比SGD收敛快,而且曲线平滑很多。
Adam:自适应学习率的集大成者
Adam是Adaptive Moment Estimation的缩写,2014年提出,迅速成为深度学习的默认优化器。
它聪明在哪里?
Adam同时用了两个东西:动量(一阶矩)和自适应学习率(二阶矩)。
动量帮你"顺着惯性走",自适应学习率帮你"知道路况"。
什么是自适应学习率?梯度大的方向,学习率自动变小;梯度小的方向,学习率自动变大。
这就好比登山时,遇到陡坡就小步谨慎,碰到平路就大步快走。
Adam怎么做到的?
它维护两个移动平均:一个是梯度的均值(类似Momentum),一个是梯度平方的均值(反映梯度大小)。
用梯度平方的均值来调整学习率:大梯度→小步长,小梯度→大步长。
默认学习率0.001。听起来很小,但Adam会自动调节。
实际用下来,Adam对学习率的初始值确实不那么敏感。我一般直接用0.001,很少需要改。
Adam的公式比较复杂,但效果简单粗暴:大多数任务直接用Adam,效果都不会太差。

三种优化器怎么选
没有最好,只有最适合。

总结一下:
SGD像老黄牛。慢,但稳。最终精度往往最好。适合搞研究、写论文、刷比赛。
Momentum像山地自行车。比SGD快,比Adam省心。是很多工程的默认选择。
Adam像智能导航。快,自动化程度高。但有时候"聪明反被聪明误",在测试集上可能略输Momentum一点点。
关键区别:Adam训练快,Momentum测试准。
追求模型上线后的最终表现,用Momentum值得。
快速迭代一个想法,Adam帮你省时间。
大规模预训练模型(GPT、BERT这些),清一色用Adam,参数量太大,Adam的收敛速度优势明显。
实战建议
别纠结,按这个来:

快速实验阶段,用Adam。它能让你快速验证想法是否靠谱。
追求最终精度,用Momentum。学习率和动量系数要仔细调。
超大规模训练,用AdamW(带权重衰减的Adam)。防止参数过大导致过拟合。
另外,Batch Size和学习率要配合调整。Batch Size翻倍,学习率也可以适当加大。这个很多人会忘。
总结
优化器是深度学习的引擎。没有它,参数永远停在初始化状态。
梯度消失和梯度爆炸是"方向问题",Batch Normalization可以缓解。但真正的解决之道,往往需要配合合适的优化器。
Adam虽好,但不是银弹。面对越来越大的模型、越来越复杂的数据,理解每种优化器的本质,才能做出明智选择。
下次模型不收敛或者收敛太慢,先检查一下:优化器选对了吗?学习率合适吗?
有时候,换个优化器,问题就迎刃而解了。
