通过 Python 示例理解反向传播 — 第3部分
Source: Dev.to
回顾(第 2 部分)
在上一篇文章中,我们将 平方残差和(SSR) 对偏置 (b_3) 作图,以可视化损失的最小位置。粉色曲线展示了两者的关系,曲线的最低点对应于最佳偏置值。
使用梯度下降寻找最佳偏置
与其手动评估大量偏置值,我们可以使用梯度下降。这需要计算 SSR 对 (b_3) 的导数。
通过链式法则求导
[ \frac{\partial \text{SSR}}{\partial b_3} = \sum_{i=1}^{n} \frac{\partial \text{SSR}}{\partial \hat{y}_i} \cdot \frac{\partial \hat{y}_i}{\partial b_3} ]
对于每个训练样本,其贡献为:
[ -2 \times (y_i - \hat{y}_i) \times 1 ]
其中 (y_i) 为真实目标,(\hat{y}_i) 为预测值(预测对偏置的导数为 1)。
第一次迭代( (b_3 = 0) )
输入向量 ([0, 1, 0]) 时模型预测:
| 样本 | (y_i) | (\hat{y}_i) |
|---|---|---|
| 1 | 0 | -2.6 |
| 2 | 1 | -1.6 |
| 3 | 0 | -2.61 |
梯度为:
[ \begin{aligned} &-2 \times (0 - (-2.6)) \times 1 \ &;+; -2 \times (1 - (-1.6)) \times 1 \ &;+; -2 \times (0 - (-2.61)) \times 1 \ &= -15.7 \end{aligned} ]
使用学习率 (\alpha = 0.1):
[ \text{步长} = \text{梯度} \times \alpha = -15.7 \times 0.1 = -1.57 ]
[ b_3^{\text{new}} = b_3^{\text{old}} - \text{步长} = 0 - (-1.57) = 1.57 ]
绿色曲线(新预测)此时看起来有所改善。
第二次迭代( (b_3 = 1.57) )
预测值变为:
| 样本 | (y_i) | (\hat{y}_i) |
|---|---|---|
| 1 | 0 | -1.03 |
| 2 | 1 | -0.03 |
| 3 | 0 | -1.04 |
梯度:
[ \begin{aligned} &-2 \times (0 - (-1.03)) \times 1 \ &;+; -2 \times (1 - (-0.03)) \times 1 \ &;+; -2 \times (0 - (-1.04)) \times 1 \ &= -6.26 \end{aligned} ]
步长:
[ \text{步长} = -6.26 \times 0.1 = -0.626 ]
更新偏置:
[ b_3^{\text{new}} = 1.57 - (-0.626) = 2.19 ]
收敛
重复更新步骤会使梯度的绝对值逐渐减小。当 (b_3 \approx 2.61) 时,梯度接近 0,表明损失已经达到最小。因此,(b_3 = 2.61) 是此简单示例的最佳偏置。
要点
梯度下降提供了一种高效的方法来定位 SSR 曲线的最小点,而无需穷举搜索。通过在梯度相反方向上迭代调整偏置,我们能够快速收敛到最优值。
欢迎在 Python notebook 中实验这些计算,以加深对概念的理解。