> 反向传播算法 = 多元微积分 + [[链式法则]] (在多层结构上的系统应用)。这就是它的数学来源与本质所在 > 把神经网络想象成一个 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 ```