常用梯度优化器工具从SGD到Adam

常用梯度优化器工具从SGD到Adam
1、SGD随机梯度下降法公式2、Momentum动量法1与SGD的区别SGD是一个轻球无惯性做梯度下降寻找loss极小值而Momentum则是一个重球有惯性做梯度下降寻找loss极小值。2公式1.梯度计算2.动量累积项3.参数更新公式含义1.算出当前坡面坡度梯度2.结合之前滚动的惯性加权得到平滑后的总下降速度3.带着这个惯性速度沿着损失下降方向更新模型参数3动量的作用连续多步梯度同向时积累速度下坡更快梯度来回左右震荡时正反梯度互相抵消走得更稳减少来回抖动。3、AdamAdam Momentum Adaptive Learning Rate即Adam动量自适应学习率1公式1.梯度计算2.动量累积项3.梯度波动剧烈程度累积项存梯度平方的滑动平均。如果某个参数梯度忽大忽小波动剧烈则数值很大如果某个参数梯度长期平缓、变化小则数值很小4.偏差修正迭代早期更新力度不足分母是放大修正。迭代几百上千步后修正几乎失效不影响后期收敛5.更新参数更新方向是带惯性的平滑梯度自适应步长缩放若参数梯度波动大则大则分母大最后实际学习率变小。若参数梯度平滑则小则分母小最后实际学习率变大。就像这个方向坑坑洼洼步子迈小一点防止冲过最低点路面平坦可以大部快跑快速抵达极小值。2公式步骤说明1.算出当前梯度2.用历史梯度算平滑惯性一阶动量3.用历史梯度平方判断路面颠簸程度二阶动量4.修正前几步偏小的动量偏差5.根据颠簸程度自动缩放学习率带着惯性更新模型参数3与SGD、Momentum的区别方法名优点缺点SGD无惯性、全参数同一学习率震荡严重、平坦区域走不动、不同参数适配差Momentum有惯性但所有参数共用一套学习率没法给波动大 / 平缓的参数单独调步子Adam既有惯性加速稳收敛又给每个参数动态调学习率4、AdamW1Adam的痛点我们平时为了防止过拟合会加L2正则于是损失函数变成求梯度后梯度会多出一项所以普通Adam更新时梯度里混入了最后更新式等价致命问题L2正则的惩罚项被二阶动量做了归一化缩放。梯度波动大的参数分母很大会把权重衰减的惩罚力度压得特别小梯度波动小的参数分母很小惩罚又会被放大。那么权重衰减力度对每个参数不统一正则失效泛化变差。2公式前5步和Adam一模一样。第6步独立权重衰减wdWeight Decay权重衰减的设计初衷惩罚那些能放大输入噪声、提升模型复杂度的特征权重Conv/Linear.weight).1.bias仅平移输出不放大噪声、不增加复杂度不需要衰减2.LayerNorm的参数仅校正特征分布、稳定训练不参与特征拟合衰减会破坏归一化3Adamw标准用法# 把参数分成两组一组衰减、一组不衰减 decay_params [] no_decay_params [] for name, param in model.named_parameters(): # 匹配bias、LayerNorm参数不衰减 if name.endswith(.bias) or norm.weight in name or norm.bias in name: no_decay_params.append(param) else: decay_params.append(param) optimizer torch.optim.AdamW([ {params: decay_params, weight_decay: 0.01}, {params: no_decay_params, weight_decay: 0.0} ], lr1e-3)