1. 优化器基础概念与核心作用
在深度学习模型的训练过程中,优化器扮演着至关重要的角色。简单来说,优化器就是决定如何根据损失函数的梯度来更新模型参数的算法。如果把模型训练比作下山的过程,损失函数就是高度,参数就是我们的位置坐标,而优化器则决定了我们每一步该往哪个方向走、走多远。
传统梯度下降法(Gradient Descent)是最基础的优化方法,它直接沿着当前梯度的反方向更新参数。但在实际应用中,我们通常会使用其变种——随机梯度下降(SGD, Stochastic Gradient Descent),因为它在大型数据集上计算效率更高。SGD每次只用一个或一小批(mini-batch)样本来计算梯度,虽然单个步骤的方向可能不够准确,但长期来看依然能收敛到较好的解。
提示:虽然SGD简单有效,但在处理非凸优化问题时容易陷入局部最优或鞍点,这也是后续各种改进型优化器试图解决的问题。
优化器的核心挑战在于如何平衡"收敛速度"和"收敛稳定性"这两个看似矛盾的目标。好的优化器应该能够:
- 在平坦区域加速前进
- 在陡峭区域谨慎行进
- 避免在局部最优或鞍点停滞
- 对超参数选择不过于敏感
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 经典优化器原理与实现细节
2.1 SGD与带动量的SGD
标准SGD的参数更新公式非常简单:
code复制θ = θ - η·∇J(θ)
其中η是学习率,∇J(θ)是损失函数对参数θ的梯度。虽然实现简单,但SGD有几个明显缺点:
- 在损失函数曲面不同方向曲率差异大时(即条件数高),收敛速度慢
- 容易在鞍点附近振荡
- 对学习率的选择非常敏感
带动量的SGD(Momentum SGD)通过引入"惯性"概念来改善这些问题:
code复制v = γ·v + η·∇J(θ)
θ = θ - v
其中γ是动量系数(通常设为0.9),v是速度项。这种机制有两个好处:
- 在梯度方向一致的维度上加速前进(动量累积)
- 在梯度方向变化的维度上减少振荡(动量抵消)
实际使用中,PyTorch的实现方式如下:
python复制optimizer = torch.optim.SGD(model.parameters(),
lr=0.01,
