高级优化器
目录1.Momentum动量2.自适应学习率3.Adam和AdamW神经网络的基础优化算法是随机梯度下降 (SGD)。SGD是一种迭代型的算法在训练开始的时候模型参数被随机初始化记为然后依次更新为。在每个迭代时刻t随机从训练集中选择一小批样本计算损失函数以及参数的梯度则参数更新的公式为基础的SGD算法容易遇到以下问题1训练被卡在不理想的梯度为0的点 (全局极小点或鞍点)。虽然随机梯度下降具有一定的逃离能力但当微批的大小较大 (为了提高训练效率) 或者平原的范围较大时训练仍然有可能被卡在不理想的优化点。2不同参数方向上的梯度幅度可能相差较大梯度大的参数可能会来回振荡而梯度小的参数迭代速度又过慢。1.Momentum动量带动量的SGD不仅会利用当前时刻的梯度同时会用到历史梯度信息其中为梯度。则参数更新的公式为可以按时刻逐步展开一下动量的计算公式......ps:动量的效果类似给梯度增加了“惯性”梯度较大但是来回振荡的方向会互相抵消从而加速收敛。在同一圈的loss一样越往中心loss越小。同时动量的累积效果可以得优化过程在损失函数的平坦区域或局部极小点附近能够“冲过”这些区域从而找到更好的极小值点。2.自适应学习率在优化过程中不同的参数方向上所需要的学习率可能会有所不同1由于神经网络的稀疏性每个参数被激活 (即对应的输入不为零) 的频率不同因此激活频率低的参数方向需要较大的学习率以加快收敛。2即使进行了数据归一化不同参数方向上梯度的幅度仍然存在差异。梯度幅度大的方向需要较小的学习率以防止振荡甚至发散梯度幅度小的方向需要较大的学习率以加快收敛。参数更新的公式如下历史上梯度平方的加权和历史上梯度平方的加权平均表示在过去一段时间每一个参数方向上梯度的幅度大小3.Adam和AdamWAdam优化算法集成了动量和自适应学习率算法如下Adam 惯性动量走得稳 自适应学习率走得快 偏差修正起步准 可选权重衰减防过拟合 可选 Amsgrad更抗崩。本质是给神经网络训练做「智能导航」—— 既带惯性冲得稳又能自动调速走得快。可以把神经网络训练想象成在一座凹凸不平的山上要走到山谷最低点损失最小的参数。 普通 SGD 是盲人瞎走每步只看脚下坡度Adam 带了两个核心 buff动量一阶矩像小球下坡带惯性能冲过小土坑不走回头路更稳更快自适应学习率二阶矩每个方向自动调速 —— 陡坡慢走、平路快走不用手动统一调步长这段伪代码还额外加了两个可选功能权重衰减防止参数 “长太大” 过拟合Amsgrad防止学习率突然暴跌训练更稳在Adam算法中L2正则项的梯度是直接计入在中的 (权重为)也被包含在一阶矩 ()和二阶矩 ()的计算中。但在一些训练任务中例如BERT微调这种做法的效果不好此时应该使用如下的AdamW算法此时在梯度中没有计入L2正则项的影响因此对于一阶矩和二阶矩的计算没有影响只是在参数更新的时候加入了weight decay的影响。用weight decay 要用AdamWAdamW 原版 Adam 把权重衰减从梯度里拎出来直接作用在参数上。解决原版 Adam 加 L2 正则效果拉胯的问题比如 BERT 微调场景。 因为正则和优化解耦了所以在微调大模型BERT、GPT 等时效果更稳定现在是深度学习微调的主流优化器。AdamW 是目前深度学习训练、大模型微调的主流优化器整体优势远大于局限但它也不是万能的劣势可以分成「AdamW 自身特有的局限」和「Adam 系列共有的通病」两部分来看一、AdamW 特有的劣势对比标准 Adam使用门槛更高参数分组容易踩坑。AdamW 的权重衰减是直接作用在参数上的力度更 “直接”如果直接给所有参数统一加权重衰减很容易出现精度下降。 实际使用中偏置项、BatchNorm/LayerNorm 的缩放平移参数γ/β通常不应该加权重衰减—— 这些参数负责数值缩放和偏移强制衰减会破坏归一化的作用。因此需要手动把参数分成「权重项加衰减」和「偏置 / 归一化项不加衰减」两组分别设置增加了使用复杂度新手很容易踩坑。权重衰减超参数更敏感调参成本高。标准 Adam 的 L2 正则混在梯度里会被自适应学习率稀释λ 的影响比较温和而 AdamW 的权重衰减直接按比例缩放参数λ 对最终效果的影响更直接、更剧烈。 λ 设大了模型会欠拟合、学不动设小了起不到防过拟合的作用且不同任务、不同模型的最优值差异很大需要更多调参实验。简单小任务上收益不明显甚至反效果。在小型数据集、简单模型从零训练的场景过拟合风险很低权重衰减的解耦优势体现不出来。如果设置了不合适的权重衰减反而会限制模型的拟合能力效果和标准 Adam 拉不开差距甚至更差。二、Adam 系列共有的通病对比 SGD 动量显存 / 内存占用显著更高。AdamW 需要为每个可训练参数维护一阶矩 m、二阶矩 v 两个状态变量显存占用约为普通 SGD 的 3 倍。在超大模型训练时会大幅增加显存压力需要配合混合精度、梯度检查点等优化手段才能跑起来。泛化能力通常弱于精心调参的 SGD。大量研究和工业实践表明在图像分类、目标检测等计算机视觉任务中充分调参的 SGD 动量往往能收敛到更平滑的极小值模型的泛化性、鲁棒性更好。 AdamW 虽然解决了标准 Adam 泛化差的部分问题但自适应学习率的特性依然容易让模型收敛到尖锐的局部最优点在分布外数据、鲁棒性测试上的表现通常略逊于调优后的 SGD。训练后期易震荡极限收敛精度有限。自适应学习率的逻辑是 “梯度小则步长大”即使到了训练后期梯度已经很小分母也会同步变小步长不会足够收敛容易在最优点附近来回震荡很难达到极高的数值精度。 在超分辨率、精密数值拟合等对收敛精度要求极高的任务中AdamW 的最终效果往往不如 “后期逐步降低学习率” 的 SGD。极端稀疏梯度场景易不稳定。在梯度极度稀疏的场景如大规模推荐系统、离散特征训练很多参数很久才更新一次梯度二阶矩 v 的估计会严重不准可能出现步长突然放大、训练震荡的问题通常需要配合梯度裁剪、学习率 warmup 等技巧来稳定训练。Adam和AdamW优化器的PyTorch文档链接如下:Adam — PyTorch 2.13 documentationhttps://docs.pytorch.org/docs/2.13/generated/torch.optim.Adam.html#torch.optim.AdamAdamW — PyTorch 2.13 documentationhttps://docs.pytorch.org/docs/2.13/generated/torch.optim.AdamW.html#torch.optim.AdamW在模型训练中绝大部分时候使用的都是AdamW优化器一般情况下使用默认的超参数即可达到理想的效果。尝试一下在MNIST实验中使用Adam/AdamW优化器观察不同优化器对于收敛速度和优化结果的影响。