张芷铭的个人博客

一个 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 属性中:

1
loss.backward()  # 计算所有参数梯度

3. 参数更新

优化器使用梯度更新参数:

$$\theta = \theta - \eta \cdot \nabla_{\theta} \mathcal{L}$$

其中 $\eta$ 为学习率,$\nabla_{\theta} \mathcal{L}$ 为当前 batch 梯度。

1
optimizer.step()  # 更新参数

完整训练循环:

1
2
3
4
5
optimizer = optim.Adam(model.parameters(), lr=0.001)

optimizer.zero_grad()  # 清除上一轮梯度
loss.backward()        # 计算梯度
optimizer.step()       # 更新参数

4. 梯度清零

PyTorch 默认梯度累积,每个 batch 后需手动清零:

1
optimizer.zero_grad()

否则梯度会在多个 batch 间累积,影响训练效果。

总结

步骤操作代码
前向传播计算预测值和损失y_pred = model(x)
反向传播计算梯度loss.backward()
参数更新更新权重optimizer.step()
梯度清零防止累积optimizer.zero_grad()

该流程每个 batch 执行一次,迭代优化参数直至收敛。

Comments