前向传播和反向传播关系

前向传播和反向传播是深度学习中紧密相连、不可分割的两个过程。它们共同构成了神经网络训练的核心循环。

你可以把它们想象成一次“探险”:

  • 前向传播:是你从起点走到终点的过程。你记录下沿途的路况(计算中间结果)。
  • 反向传播:是你发现终点不是目标后,沿着原路返回,并根据之前的记录告诉每一段路应该怎么调整才能更接近目标(计算梯度)。

一、核心关系

  1. 依赖关系:反向传播严重依赖前向传播。前向传播计算了所有神经元的输出,并保存了计算这些输出所需的所有中间变量(如输入值、权重、输出值)。没有这些中间结果,反向传播就无法通过链式法则计算梯度。
  2. 目的不同
    • 前向传播的目的是:给定输入和参数,计算模型的预测输出,从而得到损失值(Loss),衡量预测的好坏。
    • 反向传播的目的是:根据前向传播算出的损失值,计算损失函数关于每一个参数(权重、偏置)的梯度。这个梯度指明了“如何微调参数才能让损失减小”。
  3. 过程相反:正如其名,前向传播是从输入层到输出层;而反向传播是从输出层返回到输入层。

工作流程就是一个循环:
输入数据 -> 前向传播 -> 计算损失 -> 反向传播 -> 更新参数 -> (重复...)


二、一个超级简单的例子

让我们用一个最简单的神经网络来演示:它只有1个输入节点1个输出节点,没有隐藏层。这本质上就是一个线性模型。

定义:

  • 输入值:x=2x = 2x=2
  • 真实标签:ytrue=5y_{true} = 5ytrue=5
  • 权重:w=0.5w = 0.5w=0.5 (这是我们希望通过训练来调整的参数)
  • 偏置:b=1.0b = 1.0b=1.0 (另一个要调整的参数)
  • 模型预测输出:y^=w∗x+b\hat{y} = w * x + by^=wx+b
  • 损失函数(均方误差 MSE):Loss=12(y^−ytrue)2Loss = \frac{1}{2}(\hat{y} - y_{true})^2Loss=21(y^ytrue)2 (前面的 12\frac{1}{2}21 是为了求导后形式更简洁)

我们的目标是求出 LossLossLosswwwbbb 的梯度,即 ∂Loss∂w\frac{\partial Loss}{\partial w}wLoss∂Loss∂b\frac{\partial Loss}{\partial b}bLoss

第1步:前向传播 (Forward Pass)

这是从输入计算到损失的过程。

  1. 计算预测值 y^\hat{y}y^
    y^=w∗x+b=0.5∗2+1.0=1.0+1.0=2.0\hat{y} = w * x + b = 0.5 * 2 + 1.0 = 1.0 + 1.0 = 2.0y^=wx+b=0.52+1.0=1.0+1.0=2.0
  2. 计算损失 LossLossLoss
    Loss=12(y^−ytrue)2=12(2.0−5.0)2=12∗(−3.0)2=12∗9.0=4.5Loss = \frac{1}{2}(\hat{y} - y_{true})^2 = \frac{1}{2}(2.0 - 5.0)^2 = \frac{1}{2} * (-3.0)^2 = \frac{1}{2} * 9.0 = 4.5Loss=21(y^ytrue)2=21(2.05.0)2=21(3.0)2=219.0=4.5

至此,前向传播完成。我们得到当前模型的损失是 4.5。同时,我们记录下了所有中间值:x=2x=2x=2, w=0.5w=0.5w=0.5, b=1.0b=1.0b=1.0, y^=2.0\hat{y}=2.0y^=2.0

第2步:反向传播 (Backward Pass)

现在我们知道了最终误差是 4.5,我们要反向计算每个参数对这个误差负有多少“责任”。

我们使用链式法则从后往前求导。

a) 计算 ∂Loss∂w\frac{\partial Loss}{\partial w}wLoss

我们希望知道 www 的变化如何影响 LossLossLoss。根据计算图:
w→y^→Lossw \rightarrow \hat{y} \rightarrow Losswy^Loss

所以:
∂Loss∂w=∂Loss∂y^∗∂y^∂w\frac{\partial Loss}{\partial w} = \frac{\partial Loss}{\partial \hat{y}} * \frac{\partial \hat{y}}{\partial w}wLoss=y^Losswy^

  1. 计算 ∂Loss∂y^\frac{\partial Loss}{\partial \hat{y}}y^Loss
    Loss=12(y^−ytrue)2Loss = \frac{1}{2}(\hat{y} - y_{true})^2Loss=21(y^ytrue)2
    ∂Loss∂y^=2∗12∗(y^−ytrue)1=(y^−ytrue)\frac{\partial Loss}{\partial \hat{y}} = 2 * \frac{1}{2} * (\hat{y} - y_{true})^{1} = (\hat{y} - y_{true})y^Loss=221(y^ytrue)1=(y^ytrue)
    代入值(2.0−5.0)=−3.0(2.0 - 5.0) = -3.0(2.05.0)=3.0

  2. 计算 ∂y^∂w\frac{\partial \hat{y}}{\partial w}wy^
    y^=w∗x+b\hat{y} = w * x + by^=wx+b
    ∂y^∂w=x\frac{\partial \hat{y}}{\partial w} = xwy^=x
    代入值222

  3. 两者相乘:
    ∂Loss∂w=(−3.0)∗(2)=−6.0\frac{\partial Loss}{\partial w} = (-3.0) * (2) = -6.0wLoss=(3.0)(2)=6.0

梯度是 -6.0! 这意味着:

  • 如果我们将 www 增加一个很小的量,损失会减少(因为梯度为负,损失变化与参数变化方向相反)。
  • 为了降低损失,我们应该将 www 增加

b) 计算 ∂Loss∂b\frac{\partial Loss}{\partial b}bLoss

路径为:
b→y^→Lossb \rightarrow \hat{y} \rightarrow Lossby^Loss

所以:
∂Loss∂b=∂Loss∂y^∗∂y^∂b\frac{\partial Loss}{\partial b} = \frac{\partial Loss}{\partial \hat{y}} * \frac{\partial \hat{y}}{\partial b}bLoss=y^Lossby^

  1. ∂Loss∂y^\frac{\partial Loss}{\partial \hat{y}}y^Loss 我们已经算过了:−3.0-3.03.0
  2. 计算 ∂y^∂b\frac{\partial \hat{y}}{\partial b}by^
    y^=w∗x+b\hat{y} = w * x + by^=wx+b
    ∂y^∂b=1\frac{\partial \hat{y}}{\partial b} = 1by^=1
  3. 两者相乘:
    ∂Loss∂b=(−3.0)∗(1)=−3.0\frac{\partial Loss}{\partial b} = (-3.0) * (1) = -3.0bLoss=(3.0)(1)=3.0

梯度是 -3.0! 同样,为了降低损失,我们应该将 bbb 增加

第3步:更新参数

现在我们得到了梯度,就可以用梯度下降法更新参数了。假设学习率 α=0.1\alpha = 0.1α=0.1

  • wnew=wold−α∗∂Loss∂w=0.5−0.1∗(−6.0)=0.5+0.6=1.1w_{new} = w_{old} - \alpha * \frac{\partial Loss}{\partial w} = 0.5 - 0.1 * (-6.0) = 0.5 + 0.6 = 1.1wnew=woldαwLoss=0.50.1(6.0)=0.5+0.6=1.1
  • bnew=bold−α∗∂Loss∂b=1.0−0.1∗(−3.0)=1.0+0.3=1.3b_{new} = b_{old} - \alpha * \frac{\partial Loss}{\partial b} = 1.0 - 0.1 * (-3.0) = 1.0 + 0.3 = 1.3bnew=boldαbLoss=1.00.1(3.0)=1.0+0.3=1.3

看!参数按照我们计算出的梯度方向进行了更新。 你可以想象,如果用新的参数 w=1.1w=1.1w=1.1, b=1.3b=1.3b=1.3 再进行一次前向传播:
y^new=1.1∗2+1.3=2.2+1.3=3.5\hat{y}_{new} = 1.1*2 + 1.3 = 2.2 + 1.3 = 3.5y^new=1.12+1.3=2.2+1.3=3.5
Lossnew=12(3.5−5.0)2=12∗(−1.5)2=1.125Loss_{new} = \frac{1}{2}(3.5-5.0)^2 = \frac{1}{2}*(-1.5)^2 = 1.125Lossnew=21(3.55.0)2=21(1.5)2=1.125

损失从 4.5 降到了 1.125!这说明通过一次“前向+反向”传播,我们的模型确实变得更好了。

总结

在这个例子中,你可以清晰地看到:

  1. 前向传播利用输入 xxx 和参数 w,bw, bw,b 计算出了预测值 y^\hat{y}y^ 和损失 LossLossLoss
  2. 反向传播利用前向传播产生的 y^\hat{y}y^,通过链式法则,反推出损失对每个参数的梯度。
  3. 这个梯度指明了参数更新的方向和幅度

没有前向传播,反向传播就是无米之炊;没有反向传播,前向传播的结果就无法用于改进模型。二者相辅相成,是神经网络学习的基石。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sky丶Mamba

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值