Gradient Descent
梯度下降通过沿损失梯度方向反复调整权重来训练模型。内容涵盖学习率、SGD、动量和 Adam。
梯度下降是一种迭代式优化算法,用于训练大多数机器学习模型,从线性回归到大型神经网络皆是如此。每一步都会计算损失函数相对于每个模型权重的梯度,然后让每个权重沿相反方向移动一小步,也就是损失下降最快的方向。更新规则为 w ← w − η∇L(w),其中 η 是学习率。一种常见的比喻是:一名徒步者在浓雾中下山,看不到山谷,只能感受脚下的坡度并一步步向下走,直到地面变平。
梯度下降如何工作#
每次迭代分为三个部分。前向传播计算预测结果和损失,反向传播计算损失相对于每个权重的梯度,优化器则更新权重。根据多元微积分中梯度的定义,梯度在损失曲面上指向上坡方向,因此减去梯度会让权重沿下坡方向移动。
不同变体的区别在于每一步使用多少数据。批量梯度下降会在完整的训练数据集上计算精确梯度,准确但在大型数据集上速度较慢。随机梯度下降(SGD)使用单个样本估算梯度,而小批量梯度下降是深度学习中的标准方法,它会对数十到数千个样本求平均,形成批次大小,以保持 GPU繁忙。小批量梯度中的噪声也有助于权重越过鞍点和尖锐的极小值。完整遍历一次训练集称为一个轮次。
选择学习率#
学习率决定步长,通常是梯度下降中首先要调整的超参数。学习率过低会浪费计算资源,让参数缓慢地接近极小值;学习率过高则会越过极小值。对于二次损失,任何高于 2 除以损失曲率的学习率,都会让每一步离极小值比上一步更远。下面的代码使用 PyTorch和三个学习率来最小化 (w − 2)²;该函数的曲率为 2:
import torch
# Minimize loss(w) = (w - 2)^2, whose minimum is at w = 2, with three learning rates
for lr in [0.1, 0.5, 1.1]:
w = torch.tensor(5.0, requires_grad=True)
for step in range(20):
loss = (w - 2) ** 2
loss.backward() # w.grad now holds the slope 2 * (w - 2)
with torch.no_grad():
w -= lr * w.grad # step against the gradient
w.grad.zero_()
print(f"Learning rate {lr}: w = {w.item():.4f} after 20 steps")学习率为 0.1 时,经过 20 步权重仍为 2.0346;学习率为 0.5 时,由于它等于曲率的倒数,结果正好达到 2.0000;学习率为 1.1 时,每一步的偏差都会增大,直到 w 达到 117.0129。实际训练计划会先进行短暂的预热,然后降低学习率,通常采用余弦曲线,使早期步骤保持稳定,后期步骤精确收敛。
动量、Adam 与现代优化器#
普通梯度下降会在损失曲面的狭窄谷地间来回振荡,因此大多数训练都使用改进的更新规则。动量会累积历史梯度的滑动平均并沿其方向移动,从而减轻振荡,加快沿一致方向的进展。Adam 优化器还会跟踪每个参数的梯度平方,为每个权重设置自适应步长;AdamW则将权重衰减与更新过程解耦。Muon使用 Newton-Schulz 迭代对每个二维权重矩阵的动量更新进行正交化,避免单一方向主导更新步幅。使用 optimizer="auto"进行 Ultralytics YOLO26 训练时,会选择 AdamW,并根据类别数量调整学习率,最多运行 10,000 次迭代;对于更长的训练,还可以选择 MuSGD,它会将 Muon 风格的正交化更新应用于卷积和线性权重,并与 SGD 结合。
实际应用#
梯度下降是几乎所有深度学习系统背后的训练引擎。在自动驾驶车辆中,它会调整目标检测网络,使数百万帧中行人、标志和车辆的预测框与标注框之间的差距缩小。在医学图像分析中,它会拟合卷积神经网络,以便在 MRI 和 CT 扫描中区分肿瘤和健康组织。大型语言模型也以同样的方式训练,通常使用 AdamW 在数万亿个词元上进行训练。










