前向传播、反向传播
《动手学深度学习》-4.7-笔记
是前向传播(Forward Propagation)?
就是 模型拿到输入 → 一步一步计算输出(预测结果) 的过程。
你可以把神经网络想象成一个“公式接力赛”:
-
输入图片(或数据)从输入层进入
-
每一层(卷积层、全连接层)都做一堆数学运算(比如:加权、激活函数)
-
最终得到输出结果(比如:是猫还是狗)
👀 举个例子:
输入图像 ➜ 卷积层 ➜ 池化层 ➜ 全连接层 ➜ Softmax ➜ 预测标签
这整个过程就是前向传播。
神经网络训练的核心机制:前向传播 + 反向传播 + 梯度计算 + 正则化。
反向传播?
前向传播做完后,模型得到了结果,但它不知道对不对。
所以要和 真实标签比对,用损失函数打分。
然后从后往前一层一层地计算 每一层的“错误”(梯度),告诉模型该怎么改参数。
它就像一个“反思过程”:
-
输出层发现错了,告诉上一层
-
上一层再告诉上一层,直到回到最开始
“计算图”?
PyTorch 在你执行前向传播时,悄悄地在背后画了一张图,叫 计算图,
每一个操作(加、乘、激活函数)都在图上留下“痕迹”。
有了这张图,它就可以在反向传播时,沿着图的反方向走回去,自动算出每一层的偏导数(梯度)。
“链式法则”?为什么提它?
在数学里,如果一个值依赖另一个值,而那个值又依赖另一个值,我们就用“链式法则”来求导。
举个例子:
z = f(y),y = g(x)
那 z 关于 x 的导数就是:dz/dx = dz/dy × dy/dx
神经网络中,输出结果依赖一层又一层参数,每层都要通过链式法则来一层层传导梯度。
正则项?
正则项是一种“限制模型不要学得太过头”的技术,
它的目的是为了防止过拟合。
为什么训练比预测更占内存(显存)?
因为训练时:
-
需要 保存前向传播中每一层的中间结果(中间变量)
-
以便后面反向传播要用来算梯度
所以:网络层越多、batch 越大 → 保存的中间值越多 → 更容易显存溢出(OOM)网络层越多、batch 越大 → 保存的中间值越多 → 更容易显存溢出(OOM)
概念 | 通俗解释 |
---|---|
前向传播 | 模型根据输入算出预测 |
反向传播 | 模型根据错误反向调整每一层 |
计算图 | PyTorch 在背后画的运算路线图 |
自动微分 | PyTorch 自动帮你算导数的魔法 |
正则化 | 惩罚模型学得太复杂,避免过拟合 |
链式法则 | 求导数时一步步向前“乘导数” |
显存占用高 | 因为要保存每一层的中间结果 |
为什么训练比预测慢 | 因为训练多了反向传播这一步,还要算导数 |