Skip to content

PyTorch 训练循环的核心,它们对应的是梯度清零 → 反向传播 → 更新参数。 按执行顺序详细拆开。

1. optimizer.zero_grad() — 梯度清零

  • 做什么:把上一次迭代计算的梯度清零。

  • 为什么要清零: 在 PyTorch 中,梯度是累加的(不是自动覆盖),如果不清零,新的梯度会叠加到旧梯度上,导致计算结果错误。

  • 类比:

    就像在白板上写字,每次计算前要先擦干净,不然新公式会和旧公式混在一起。


2. loss.backward() — 反向传播

  • 做什么:从 loss 开始,自动计算每个参数的梯度 LossParam

  • 为什么能自动算: PyTorch 里所有张量运算会被构建成计算图,调用 backward() 时,它会沿着计算图从输出向输入回溯,用链式法则计算梯度。

  • 类比:

    你知道最终分数(loss)与各个环节(参数)的关系,backward() 就是倒推每个环节对结果的影响有多大。


3. optimizer.step() — 更新参数

  • 做什么:用上一步算好的梯度更新模型参数(权重和偏置)。

  • 更新公式(以SGD为例)

    θ:=θηLossθ

    其中:

    • θ:参数(比如权重 w)
    • η:学习率(lr)
    • Lossθ:梯度
  • 类比:

    你沿着梯度指引的方向调整参数,就像沿着山坡往低处走,最终找到“谷底”——最优解。


三行一起理解

  1. zero_grad() → 擦干净梯度白板
  2. loss.backward() → 根据当前预测结果,计算每个参数的梯度
  3. step() → 根据梯度调整参数,让下一次预测更接近真实值