🔍 反向传播:神经网络的「灵魂」修炼法则
- [一、先搞懂:神经网络的参数 & 更新路径](#一、先搞懂:神经网络的参数 & 更新路径)
-
- [1.1 参数怎么算?](#1.1 参数怎么算?)
- [1.2 关键特性:越往前,更新路径越多](#1.2 关键特性:越往前,更新路径越多)
- [二、核心数学基石:链式法则 ⛓️](#二、核心数学基石:链式法则 ⛓️)
-
- [2.1 链式法则公式](#2.1 链式法则公式)
- [2.2 一句话理解](#2.2 一句话理解)
- 三、第一步:前向传播(Forward)✨
-
- [3.1 加权聚合](#3.1 加权聚合)
- [3.2 Sigmoid 激活](#3.2 Sigmoid 激活)
- [3.3 输出层计算](#3.3 输出层计算)
- [3.4 损失函数(均方误差)](#3.4 损失函数(均方误差))
- 四、第二步:反向传播(Backward)🔥
-
- [4.1 求梯度三步走(以更新 W₅为例)](#4.1 求梯度三步走(以更新 W₅为例))
- [4.2 链式相乘得到梯度](#4.2 链式相乘得到梯度)
- [五、第三步:参数更新 🔁](#五、第三步:参数更新 🔁)
-
- [5.1 梯度下降公式](#5.1 梯度下降公式)
- [5.2 示例更新 W₅](#5.2 示例更新 W₅)
- [5.3 整体流程](#5.3 整体流程)
- 六、网络结构可视化(Mermaid)
- [七、关键代码实现(Python 核心片段)](#七、关键代码实现(Python 核心片段))
- [八、总结 ✅](#八、总结 ✅)
从参数更新到梯度传递,一文吃透 BP 算法的底层逻辑
在神经网络的世界里,前向传播负责预测,反向传播负责学习。如果说前向传播是神经网络 "看世界、出结果" 的过程,那么反向传播(Backpropagation,BP)就是它 "知错就改、持续进化" 的核心机制。它像一位严谨的导师,拿着损失值,从输出层一路回溯,逐层修正网络权重,让模型越来越精准。
今天,我们就从参数计数→链式法则→前向演算→反向求导→参数更新全链路,把反向传播掰开揉碎讲清楚👇
一、先搞懂:神经网络的参数 & 更新路径
1.1 参数怎么算?
神经网络的参数,主要是权重 W + 偏置 B。以简易双层网络为例:
-
输入层 → 隐藏层:4 个参数
-
隐藏层 → 输出层:8 个参数
-
输出层内部:6 个参数
✅ 总参数:4 + 8 + 6 = 20 个
1.2 关键特性:越往前,更新路径越多
反向传播是从后往前逐层传递的:
-
输出层参数:更新路径单一,仅依赖当前节点
-
隐藏层 / 输入层参数:会被多条路径叠加影响
这也是浅层参数更容易出现梯度波动的原因。
二、核心数学基石:链式法则 ⛓️
反向传播的本质,就是链式法则 + 梯度下降。
2.1 链式法则公式
复合函数求导:
中间变量会被约掉,最终直接得到 y 对 x 的梯度,这就是梯度能逐层向前传递的数学依据。
2.2 一句话理解
想更新前面的权重,必须先算后面的梯度,一层一层往前 "递推"。
三、第一步:前向传播(Forward)✨
前向传播 = 加权聚合 + 激活函数 + 损失计算。
3.1 加权聚合
以隐藏层神经元 H₁为例:
代入数值:
3.2 Sigmoid 激活
3.3 输出层计算
3.4 损失函数(均方误差)
代入:
-
outₒ₁=0.75,target=0.01
-
outₒ₂≈0.77,target=0.99
四、第二步:反向传播(Backward)🔥
这是最关键的一步:用损失求梯度,用梯度更新权重。
4.1 求梯度三步走(以更新 W₅为例)
我们要算: f r a c p a r t i a l E t o t a l p a r t i a l W 5 frac{partial E_{total}}{partial W_5} fracpartialEtotalpartialW5
1️⃣ 损失对输出求导
2️⃣ 激活函数对净输入求导
3️⃣ 净输入对权重求导
4.2 链式相乘得到梯度
五、第三步:参数更新 🔁
梯度到手,开始更新权重:
5.1 梯度下降公式
-
η:学习率(示例取 0.5)
-
∇W:刚才算出的梯度
5.2 示例更新 W₅
5.3 整体流程
算损失 → 反向求梯度 → 更新权重 → 再次前向 → 循环迭代
这就是一轮 Epoch的完整逻辑。
六、网络结构可视化(Mermaid)
输入I1
隐藏层H1
输入I2
隐藏层H2
输出O1
输出O2
损失Etotal
图表说明:实线为前向传播(输入→输出),虚线为反向传播(损失→权重更新),清晰展示梯度从后往前逐层传递的路径。
七、关键代码实现(Python 核心片段)
python
import math
import numpy as np
# 1. Sigmoid激活函数
def sigmoid(x):
return 1 / (1 + math.exp(-x))
# 2. 前向传播
def forward(I1, I2, W1, W2, W5, B1, B2):
# 隐藏层
net_H1 = W1 * I1 + W2 * I2 + B1
out_H1 = sigmoid(net_H1)
# 输出层
net_O1 = W5 * out_H1 + B2
out_O1 = sigmoid(net_O1)
return out_H1, out_O1
# 3. 反向传播求梯度
def backward(out_O1, out_H1, target):
dE_out = -(target - out_O1)
dOut_net = out_O1 * (1 - out_O1)
dNet_W = out_H1
grad = dE_out * dOut_net * dNet_W
return grad
# 4. 参数更新
def update_weight(W_old, grad, lr=0.5):
return W_old - lr * grad
# 示例调用
out_H1, out_O1 = forward(0.05, 0.1, 0.15, 0.2, 0.4, 0.35, 0.6)
grad = backward(out_O1, out_H1, 0.01)
W5_new = update_weight(0.4, grad)
print("更新后的W5:", round(W5_new, 4))
八、总结 ✅
-
前向传播:从输入到输出,完成预测并计算损失
-
反向传播:用链式法则从后往前算梯度
-
参数更新:用梯度下降公式修正权重
-
核心 :越靠前的层,梯度路径越多,更新越敏感

反向传播不是玄学,它只是微积分 + 迭代优化的工程实现。吃透它,你就真正读懂了神经网络 "学习" 的本质。