一个 batch 内的参数优化流程:前向传播 → 损失计算 → 反向传播 → 参数更新。
1. 前向传播
对 batch 数据执行前向计算:
$$Y_{\text{pred}} = f_{\theta}(X)$$
其中 $X$ 为输入(形状 (batch_size, input_dim)),$Y_{\text{pred}}$ 为模型预测值。
计算损失函数:
$$\mathcal{L} = \text{Loss}(Y_{\text{pred}}, Y_{\text{true}})$$
常见损失函数:
| 任务类型 | 损失函数 |
|---|---|
| 分类 | Cross Entropy Loss |
| 回归 | MSELoss |
2. 反向传播
PyTorch 自动记录操作形成计算图,通过自动微分计算梯度:
$$\frac{\partial \mathcal{L}}{\partial \theta} = \nabla_{\theta} \mathcal{L}$$
梯度存储在每个参数的 tensor.grad 属性中:
| |
3. 参数更新
优化器使用梯度更新参数:
$$\theta = \theta - \eta \cdot \nabla_{\theta} \mathcal{L}$$
其中 $\eta$ 为学习率,$\nabla_{\theta} \mathcal{L}$ 为当前 batch 梯度。
| |
完整训练循环:
| |
4. 梯度清零
PyTorch 默认梯度累积,每个 batch 后需手动清零:
| |
否则梯度会在多个 batch 间累积,影响训练效果。
总结
| 步骤 | 操作 | 代码 |
|---|---|---|
| 前向传播 | 计算预测值和损失 | y_pred = model(x) |
| 反向传播 | 计算梯度 | loss.backward() |
| 参数更新 | 更新权重 | optimizer.step() |
| 梯度清零 | 防止累积 | optimizer.zero_grad() |
该流程每个 batch 执行一次,迭代优化参数直至收敛。
张芷铭的个人博客
Comments