共计 2177 个字符,预计需要花费 6 分钟才能阅读完成。
数学推导:梯度下降的链式法则
反向传播(Backpropagation)的核心是链式法则的递归应用。设损失函数为 (L), 第 (l) 层输出为 (h^l), 权重矩阵 (W^l), 偏置 (b^l), 则梯度计算可表示为:

[\frac{\partial L}{\partial W^l} = \frac{\partial L}{\partial h^{l}} \cdot \frac{\partial h^{l}}{\partial W^{l}} ]
-
前向传播阶段:
[h^l = \sigma(W^l h^{l-1} + b^l) ]
其中 (\sigma) 为激活函数 -
反向传播阶段:
- 输出层梯度:
[\delta^L = \nabla_{h^L} L \odot \sigma'(z^L) ] - 隐藏层梯度:
[\delta^l = ((W^{l+1})^T \delta^{l+1}) \odot \sigma'(z^l) ] - 参数梯度:
[\frac{\partial L}{\partial W^l} = \delta^l (h^{l-1})^T ]
[\frac{\partial L}{\partial b^l} = \delta^l ]
优化器对比与 PyTorch 实现
1. 基础 SGD
# PyTorch 2.0+
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
2. Momentum 优化
optimizer = torch.optim.SGD(model.parameters(),
lr=0.1,
momentum=0.9 # 引入历史梯度加权
)
3. Adam 优化器
optimizer = torch.optim.Adam(model.parameters(),
lr=0.001,
betas=(0.9, 0.999), # 一阶 / 二阶矩估计系数
eps=1e-8
)
工程技巧:
– 学习率衰减
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)
– 梯度裁剪
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
梯度消失 / 爆炸解决方案
1. 权重初始化
- Xavier 初始化(适合 tanh/sigmoid):
[W \sim U(-\sqrt{\frac{6}{n_{in}+n_{out}}}, \sqrt{\frac{6}{n_{in}+n_{out}}}) ] - He 初始化(适合 ReLU):
[W \sim N(0, \sqrt{\frac{2}{n_{in}}}) ]
2. 激活函数选型
# LeakyReLU 解决神经元死亡问题
self.act = nn.LeakyReLU(negative_slope=0.01)
# SELU 自带归一化特性
self.act = nn.SELU()
3. 批量归一化层
self.bn = nn.BatchNorm2d(num_features=64)
性能测试方案
CIFAR-10 对比实验
for epoch in range(100):
train_loss = train_one_epoch(model, train_loader)
val_loss = validate(model, val_loader)
# 记录 loss 曲线
writer.add_scalars('Loss', {'train':train_loss, 'val':val_loss}, epoch)
显存分析
with torch.profiler.profile(activities=[torch.profiler.ProfilerActivity.CUDA]
) as prof:
model(inputs)
print(prof.key_averages().table(sort_by="cuda_memory_usage"))
生产环境建议
-
学习率 warm-up(Transformer 常用):
scheduler = torch.optim.lr_scheduler.LambdaLR( optimizer, lr_lambda=lambda epoch: min((epoch + 1) / 10.0, 1.0) # 前 10epoch 线性增长 ) -
混合精度训练:
scaler = torch.cuda.amp.GradScaler() with torch.cuda.amp.autocast(): outputs = model(inputs) loss = criterion(outputs, labels) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update() -
分布式训练注意:
- 使用
DistributedDataParallel而非DataParallel - 注意
all_reduce操作的同步开销
开放性问题
- 二阶优化可行性:
- L-BFGS 需要精确的 Hessian 矩阵估计
-
在大规模参数下计算代价过高
-
遗传算法结合:
- 可作为全局搜索补充梯度下降
- 但进化操作的计算成本较高
实践心得
在图像分类任务中,Adam+Warmup+BN 的组合往往能取得不错的效果起点。值得注意的是,当遇到验证集 loss 震荡时,适当调小学习率并增加梯度裁剪阈值往往能稳定训练过程。混合精度训练在 RTX 3090 上实测可减少 30% 显存占用,但对最终模型精度影响需要谨慎评估。
正文完
