目录标题
- 1. 为什么反向传播必须要有前向传播的值?
- 2. 为什么“先执行前向传播”不是“根本原因”?
- 3. 一个形象的比喻
保存前向传播的中间结果(比如 x 和 y),是为了能够顺利执行反向传播的必要条件。
1. 为什么反向传播必须要有前向传播的值?
正如你所说,在乘法节点z = x × y z = x \times yz=x×y中:
- 如果你要求z zz对x xx的导数∂ z ∂ x \frac{\partial z}{\partial x}∂x∂z,结果是y yy。
- 如果你要求z zz对y yy的导数∂ z ∂ y \frac{\partial z}{\partial y}∂y∂z,结果是x xx。
如果你只知道函数是乘法,但不知道具体的x xx是具体啥值(比如x是100),y yy是具体啥值(比如y是2),你反向传播时算出来的就只能是抽象的y yy和x xx,无法得出具体的梯度数值。
所以,前向传播时产生的数值(如输入x xx、y yy和输出z zz),必须在内存中保存下来(缓存),供反向传播计算局部导数时使用。
2. 为什么“先执行前向传播”不是“根本原因”?
根本原因在于:数学上的“链式法则”是从输出端向输入端推导的。
- 前向传播(Forward):是为了求出预测结果,进而算出损失函数L LL(比如你用模型预测了一个数字,发现预测错了,产生了误差L LL)。
- 反向传播(Backward):是为了求出参数梯度来更新模型。我们要从损失L LL开始,倒推回去求各个参数的导数。
顺序决定了因果:
因为我们要求“损失L LL对参数的导数”,而L LL是通过前向传播计算出来的,所以逻辑上必须先是前向传播(产生L LL和中间缓存),然后才是反向传播(利用L LL和中间缓存求导)。
3. 一个形象的比喻
想象你在剥洋葱(前向传播):
你一层一层剥开,把剥下来的皮和中间看到的形态(中间变量x , y x, yx,y)放在旁边的桌子上(保存缓存)。
剥到最后,你发现洋葱芯坏了(算出了损失L LL)。
现在你要写一份报告,说明“为什么芯会坏”(反向传播求导):
你只能顺着刚才剥皮的顺序,从芯开始往回看。每往回走一层,你都要看一眼刚才放在桌子上的皮(利用之前保存的x , y x, yx,y)来记录问题。
如果你刚才剥皮的时候没把皮留桌上(前向传播不保存中间值),你现在往回看时就没有参考,报告就写不下去了。