共计 1894 个字符,预计需要花费 5 分钟才能阅读完成。
梯度下降的数学本质
在神经网络训练中,梯度下降(Gradient Descent)是优化模型参数的核心方法。BP 反向传播(Backpropagation)算法通过链式法则高效计算梯度。让我们从一个简单的全连接层开始推导:

设神经网络的第 $l$ 层输出为:
$$
z^{(l)} = W^{(l)}a^{(l-1)} + b^{(l)}
$$
其中 $a^{(l-1)}$ 是上一层激活值,$W^{(l)}$ 和 $b^{(l)}$ 为待优化参数。
损失函数 $L$ 对参数的偏导数计算遵循链式法则:
$$
\frac{\partial L}{\partial W^{(l)}} = \frac{\partial L}{\partial z^{(l)}} \cdot \frac{\partial z^{(l)}}{\partial W^{(l)}} = \delta^{(l)} \cdot a^{(l-1)T}
$$
这里的 $\delta^{(l)} = \frac{\partial L}{\partial z^{(l)}}$ 被称为误差项,其向后传播的计算为:
$$
\delta^{(l-1)} = (W^{(l)T}\delta^{(l)}) \odot \sigma'(z^{(l-1)})
$$
其中 $\odot$ 表示逐元素相乘,$\sigma’$ 是激活函数的导数。
优化器对比与实现
PyTorch 中常见的优化器实现差异显著:
# PyTorch 2.0+ 优化器示例
import torch.optim as optim
# 原始 SGD
optimizer = optim.SGD(model.parameters(), lr=0.1)
# 带动量的 SGD
optimizer = optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
# Adam 优化器
optimizer = optim.Adam(model.parameters(), lr=0.001, betas=(0.9, 0.999))
实际训练时建议添加学习率调度和梯度裁剪:
# 学习率余弦衰减
scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=100)
# 梯度裁剪
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
梯度消失 / 爆炸解决方案
- 权重初始化:
- Xavier 初始化:适合 sigmoid/tanh
$$
W \sim U(-\sqrt{6/(n_{in}+n_{out})}, \sqrt{6/(n_{in}+n_{out})})
$$ -
He 初始化:适合 ReLU 系列
$$
W \sim N(0, \sqrt{2/n_{in}})
$$ -
激活函数选择:
- LeakyReLU:$\text{LeakyReLU}(x) = \max(0.01x, x)$
-
SELU:自带归一化特性
-
批量归一化:
self.bn = nn.BatchNorm2d(out_channels)
性能测试方案
在 CIFAR-10 上的测试流程:
-
准备数据加载器
train_loader = torch.utils.data.DataLoader(datasets.CIFAR10(..., transform=train_transform), batch_size=128, shuffle=True) -
使用 torch.profiler 分析:
with torch.profiler.profile(activities=[torch.profiler.ProfilerActivity.CUDA]) as prof: train_one_epoch() print(prof.key_averages().table())
生产环境建议
- 学习率 warm-up:前 5 个 epoch 线性增加学习率
- 混合精度训练:
scaler = torch.cuda.amp.GradScaler() with torch.cuda.amp.autocast(): outputs = model(inputs) - 分布式训练 :注意
DistributedDataParallel中的find_unused_parameters参数
开放性问题思考
- 二阶优化方法(如 L -BFGS)虽然收敛快,但在深度网络中面临:
- Hessian 矩阵计算复杂度高
-
随机梯度下的稳定性问题
-
梯度下降与遗传算法结合的可能方向:
- 用遗传算法优化超参数
- 在梯度更新中加入随机变异
这些技术选择需要根据具体任务特点权衡。例如计算机视觉任务通常偏好 Adam+Warmup,而 NLP 任务可能更适合 Vanilla SGD。理解算法背后的数学原理,才能做出合理的工程决策。
