· 深度学习

微调中的前向传播和反向传播:step、epoch 与梯度累积怎么算

前向算预测与 loss、反向算梯度、优化器更新参数——再把这套流程换算成步数:一个 step 跑几次、梯度累积怎么改变次数、epoch 怎么折算,附面试速记版。

一句话先理清

前向传播:算预测、算损失;反向传播:算梯度、更新参数。

微调 = 带损失的监督训练,本质和普通神经网络训练一样,只是初始权重是预训练好的,一般只更新部分参数(LoRA就是只更新低秩矩阵,冻结主干)。

1. 前向传播(Forward)做什么

输入样本 → 模型按当前权重做推理

  1. 把 prompt/输入token 送入模型
  2. 逐层矩阵运算、激活、注意力计算,得到 logits(每个token的预测得分)
  3. 和标签(真实答案)对比,计算 loss损失值(交叉熵为主)

✅ 输出:预测结果 + loss ✅ 特点:只读权重,不修改权重

2. 反向传播(Backward)做什么

从 loss 往回链式求导(链式法则)

  1. 对 loss 求每个可训练参数的梯度 \frac{\partial loss}{\partial w}
  2. 拿到梯度后,交给优化器(AdamW)
  3. 优化器按梯度、学习率、动量等规则更新可训练参数

✅ 输出:所有可训练参数的梯度,然后更新权重 ✅ 特点:不计算预测,只算梯度、改参数

LoRA微调场景:主干大模型权重冻结,反向只算LoRA矩阵的梯度,显存省很多。

3. 一次微调里多少次前向、反向?

先定义两个概念:

  • step(一步/一次更新):一次梯度计算 + 一次参数更新
  • batch:这一步里一次性喂给模型的样本数量

👉 1个训练step = 1次前向传播 + 1次反向传播 流程: 前向(算loss) → 反向(算梯度) → 优化器step(更新参数)

注意梯度累积(gradient accumulation)是特例: 梯度累积 N 次:连续跑 N 次前向+反向,梯度累加,只在第N次做完才更新一次参数 此时:1次参数更新 = N次前向传播 + N次反向传播

再区分 epoch

  • 1 epoch:把整个训练数据集全部过一遍 假设数据集一共 1000 条样本,batch size=10,无梯度累积: 一个epoch有 1000 / 10 = 100 step → 1 epoch = 100 次前向 + 100 次反向

举个 SFT-LoRA 实操例子

数据集:5000条
batch_size=4,梯度累积=2,学习率2e-4,训练3 epoch
  • 每一次参数更新:2次前向、2次反向
  • 每epoch step数:5000 / 4 / 2 = 625 step(参数更新次数)
  • 总前向次数:625 × 2 × 3 = 3750
  • 总反向次数:同上,3750

4. 容易踩坑的区分

  1. 推理(inference)只有前向,没有反向,不更新权重
  2. 前向一定在反向前面;没有 loss 就没法反向
  3. 反向传播不改变权重本身,只是算出梯度;权重更新是优化器的动作,发生在backward之后
  4. 梯度检查点(gradient checkpointing):牺牲少量前向重算,省显存,会在前向的时候不存全部中间激活,反向时重新跑一部分前向计算,这是工程优化,不改变上面的逻辑

极简总结版(面试可以直接背)

  • 前向传播:输入数据经过模型计算得到预测值,计算损失;只读参数,不更新。
  • 反向传播:利用链式法则从损失求可训练参数梯度;得到梯度后由优化器更新参数。
  • 默认无梯度累积:1个训练step = 1次前向 + 1次反向;开启梯度累积N,则1次参数更新对应N次前向+N次反向。
分享:
返回文章列表

相关文章

前向传播与反向传播概述

微调场景下的前向产物、反向传播机制,以及冻结参数与 LoRA 等不同策略对反向计算图的实际影响。