反向传播和自动微分有什么区别,计算图如何得到梯度?
先用自己的话答,再看参考说法
60 秒是练习上限,不是必须凑满。原理题讲清因果,设计题讲清约束,项目题只讲真实证据。
别照着背。参考说法只用于对照;直接回答问题,简单题说清楚就收尾。项目题只用自己的经历和数字。
参考内容当前已显示;开始口述后会暂时隐藏。
面试时怎么答
先区分两个层次:自动微分是一套按基本算子导数组合精确梯度的方法,反向传播是标量输出场景下高效的反向模式。用 \(z=f(x,y)\) 的计算图说明梯度沿边传播并在分叉处累加。追问数值微分时,要说它用于校验,存在截断与舍入误差,不是训练时的主要求导方式。
可以这样答:
自动微分把程序拆成有已知导数的基本算子,再按链式法则组合出精确到浮点误差的梯度;反向传播是神经网络中常用的反向模式,从标量 loss 向前驱节点传播伴随量,同一参数经多条路径影响 loss 时,梯度要相加。一次反向就能得到大量参数梯度,代价是需要保存或重算前向中间值。
核心回答
自动微分把程序拆成有已知局部导数的基本算子,并按链式法则精确组合导数;反向传播是神经网络上使用反向模式自动微分高效求梯度的具体算法。前向计算保存必要的中间量,反向从标量损失的伴随值 1 出发,沿图反序累计每个节点的向量—雅可比积,最终得到所有参数梯度。
展开说明
前向模式随输入方向传播 Jacobian-vector product,适合输入维度少、输出维度多;反向模式传播 vector-Jacobian product,标量损失对应一个输出、参数却很多,因此训练神经网络更合算。自动微分不是符号求导,也不是有限差分:它运行实际程序并应用局部求导规则,除浮点误差外不引入有限差分的截断近似。
工程实践
显存常被反向所需的激活占用,可用激活检查点以重算换显存。自定义算子需要定义正确的 backward,并用有限差分只做小规模梯度检查。原地修改、意外 detach、混合精度下溢或未清零累计梯度,都是“能运行但学不动”的常见原因。
常见追问
- 反向传播为什么要累加梯度? 一个节点可能沿多条路径影响损失,链式法则要求把所有下游路径的贡献相加。
- 为什么不直接构造完整 Jacobian? 完整矩阵通常巨大;VJP/JVP 只计算真正需要的乘积,节省时间和内存。
- 二阶梯度怎样得到? 在一阶梯度计算本身也被记录为可微计算图时,再对其执行自动微分;代价和算子支持需单独评估。
一句话复习
自动微分是按计算图组合局部导数的机制,反向传播是标量损失训练中高效的反向模式实现。
参考资料
评论与补充
评论会直接显示在这道题下面。可以写自己的答法、继续追问或指出错误,不需要 GitHub 账号,也不会跳转到 Issue;内容会公开,请勿填写个人隐私、公司机密或受保密约束的材料。
正在连接站内评论服务…
正在加载评论…
还没有评论,你可以先写下自己的理解或追问。