> 反向传播算法 = 多元微积分 + [[链式法则]] (在多层结构上的系统应用)。这就是它的数学来源与本质所在
> 把神经网络想象成一个 n 个权重参数和 k 个bias 参数的超大函数,反向传播使得我们每次只关注前一层,也就是只关注 n 和 k 中的一部分即可
> 每个 W 矩阵里的每个位置下次变化的 unit
**反向传播计算的是:每个参数(W矩阵中的每个元素)应该如何调整的方向和幅度**
```python
# 梯度告诉我们的是:
# "如果我把这个参数增加一点点,损失函数会如何变化"
W_new = W_old - learning_rate * gradient_W
# ↑
# 这是反向传播计算出来的
```
# 具体例子
假设有个2×2的权重矩阵:
```python
W = [[w11, w12],
[w21, w22]]
# 反向传播后得到梯度:
gradient_W = [[0.5, -0.3], # w11应该减小0.5, w12应该增加0.3
[0.2, 0.8]] # w21应该减小0.2, w22应该减小0.8
# 如果learning_rate = 0.1,下次更新:
W_new = [[w11 - 0.05, w12 + 0.03],
[w21 - 0.02, w22 - 0.08]]
```
# 梯度的含义
```python
# 对于某个具体的权重 w_ij
gradient = ∂Loss/∂w_ij # 损失函数对这个权重的偏导数
# 含义:
# gradient > 0: 增加w_ij会增加损失 → 应该减小w_ij
# gradient < 0: 增加w_ij会减少损失 → 应该增加w_ij
# |gradient|大: 这个权重对损失影响大 → 调整幅度大
# |gradient|小: 这个权重对损失影响小 → 调整幅度小
```
# 可视化理解
```Java
损失函数曲面:
↑ Loss
│ ╱╲
│ ╱ ╲
│ ╱ ╲
│ ╱ ● ╲ ← 当前位置
│ ╱ ↓ ╲
│╱gradient ╲
└────────────→ w_ij
梯度指向损失增加最快的方向
所以我们要反方向更新(梯度下降)
```
# 完整的反向传播过程
```python
# 1. 前向传播
input → W1 → activation → W2 → output → loss
# 2. 反向传播(计算每个参数的梯度)
loss → ∂loss/∂output → ∂loss/∂W2 → ∂loss/∂activation → ∂loss/∂W1
# 3. 参数更新
W1 = W1 - lr * ∂loss/∂W1 # 每个元素都这样更新
W2 = W2 - lr * ∂loss/∂W2
```