PyTorch 训练循环的核心,它们对应的是梯度清零 → 反向传播 → 更新参数。 按执行顺序详细拆开。
1. optimizer.zero_grad()
— 梯度清零
做什么:把上一次迭代计算的梯度清零。
为什么要清零: 在 PyTorch 中,梯度是累加的(不是自动覆盖),如果不清零,新的梯度会叠加到旧梯度上,导致计算结果错误。
类比:
就像在白板上写字,每次计算前要先擦干净,不然新公式会和旧公式混在一起。
2. loss.backward()
— 反向传播
做什么:从
loss
开始,自动计算每个参数的梯度。 为什么能自动算: PyTorch 里所有张量运算会被构建成计算图,调用
backward()
时,它会沿着计算图从输出向输入回溯,用链式法则计算梯度。类比:
你知道最终分数(loss)与各个环节(参数)的关系,
backward()
就是倒推每个环节对结果的影响有多大。
3. optimizer.step()
— 更新参数
做什么:用上一步算好的梯度更新模型参数(权重和偏置)。
更新公式(以SGD为例):
其中:
:参数(比如权重 w) :学习率(lr) :梯度
类比:
你沿着梯度指引的方向调整参数,就像沿着山坡往低处走,最终找到“谷底”——最优解。
三行一起理解
zero_grad()
→ 擦干净梯度白板loss.backward()
→ 根据当前预测结果,计算每个参数的梯度step()
→ 根据梯度调整参数,让下一次预测更接近真实值