BP(BackPropagation)神经网络是1986年由Rumelhart和McClelland为首的科学家提出的概念,是一种按照误差逆向传播算法训l练的多层前馈神经网络,是应用最广泛的神经网络。
感知器(Perceptron)就是神经网络中最基本、最标准的“一个节点”(即一个人工神经元)。一个感知器由输入项、权重、偏置、激活函数、输出组成,如下图所示:
各个组件的功能如下:
假设我们要预测房价,收集到3条真实数据:
| 样本 | 面积(㎡) | 房龄(年) | 真实房价(万) |
|---|---|---|---|
| 1 | 80 | 5 | 200 |
| 2 | 100 | 10 | 230 |
| 3 | 120 | 15 | 250 |
从数学上来看,感知器是一个由激活函数包裹的线性函数: \begin{equation} y = 激活函数( w_1x_1 + w_2x_2 + ... + b ) \end{equation} 我们可以计算它的输出,输出 = 激活函数( $w_1×面积 + w_2×房龄 + b$ ),设初始参数:$w_1=2.0, w_2=0.5, b=10$,激活函数用线性激活(直接输出不加压)。那么, 对于样本1:
80×2.0 + 5×0.5 + 10 = 160 + 2.5 + 10 = 172.5(万)
真实值是200万,误差 = 200 - 172.5 = +27.5万(低了)
对于样本2:
100×2.0 + 10×0.5 + 10 = 200 + 5 + 10 = 215(万)
真实值230万,误差 = 230 - 215 = +15万(低了)
对于样本3计算:
120×2.0 + 15×0.5 + 10 = 240 + 7.5 + 10 = 257.5(万)
真实值250万,误差 = 250 - 257.5 = -7.5万(高了)
那个根据上面的计算结果,我们需要调整权重,看上面三个误差:
因此,矛盾出现了,同一个$w_1$,增大它会让样本1和2变准,但会让样本3更不准;减小它会让样本3变准,但会让样本1和2更不准。
再来看一个例子。假设现在房价预测加入第三个特征:距离地铁站的距离(公里),权重记为$w_3$。
| 样本 | 面积(㎡) | 房龄(年) | 距地铁(km) | 真实房价(万) | |
|---|---|---|---|---|---|
| 1 | 80 | 5 | 0.5 | 200 | |
| 2 | 100 | 10 | 1.0 | 230 | |
| 3 | 120 | 15 | 1.5 | 250 | |
| 4 | 90 | 8 | 2.0 | 210 | |
单个感知器(无激活函数)要解方程组:
这是 4个方程,4个未知数$(w_1, w_2, w_3, b)$。4个方程4个未知数确实有可能有唯一解,但前提是这4个方程彼此独立且一致,否则:
当样本数 > 权重数 + 1 时,单个感知器(线性模型)必然存在无法消除的误差
通过上面两个例子,我们可以看出,单个神经网络存在局限性
为了解决单传感器的局限,一个有效的办法就是将它们连接起来。因为:
那么多个感知器是如何连接在一起?在宏观上,BP神经网络由输入层、隐含层(也称中间层)和输出层构成,其中隐含层有一层或者多层。每一层可以有若干个节点。层与层之间节点的连接状态通过权重来体现,如下图所示:
其中数据在网络中的传播路径如下:
上中,实线代表正向传播,虚线代表反向传播。可以看到,整个网络宏观上了,和闭环控制系统类似:信号通过计算,得到实际值,与预期值比较获得差值,根据差值来调整系统的参数。
既然BP神经网络和闭环控制系统如此相似,为什么BP在1986年才被发明,而控制论在1940年代就有了?因为:
BP的突破性在于:它借用了微积分的链式求导法则,把“输出端的误差”一层层地“反推”回输入端,精确计算出每一个权重该负多大责任,即“梯度反向传播”。
比如,在水文预测中,我们$\hat{y} = w_1 × x_1 + w_2 × x_2 + b$预测未来的水位,其中:
现在有一组样本:
模型初始参数(随机初始化):
有了上面的数据,就通过前向传播,计算预测值:$\hat{y}= w_1 × x_1 + w_2 × x_2 + b=0.40 × 5.0 + 0.60 × 2.8 + 0.10=3.78(米)$,因此,模型预测下游水位为 3.78 米,而真实值是 3.50 米,差了 0.28 米。
接下来是计算损失(误差)。我们用均方误差(MSE)作为损失函数,则损失$ L = (\hat{y} - y)² / 2=(3.78 - 3.50)² / 2=0.0392$
除以2是为了后面求导时消去系数,让公式更整洁,不影响学习方向。
0.0392 就是当前模型在这个样本上的损失值。我们的目标是通过调整$ w_1、w_2、b$,让这个损失值降下来。
反向传播的核心是链式法则:损失$L$先对预测值$\hat{y}求导,再分别对每个参数求导,从而知道每个参数对最终损失负有多大责任。
第一步是计算损失$L$对预测值 $\hat{y}$ 的导数 \begin{equation} \frac{dL}{d \hat{y}} = \hat{y} - y \end{equation} 带入数据$\frac{dL}{d \hat{y}} = 3.78 - 3.50=0.28$
这个 0.28 的含义是:预测值每增加 1 米,损失增加 0.28。
第二步,计算$L$对参数$w_1$ 的梯度(链式法则) \begin{equation} \frac{dL}{dw₁} = \frac{dL}{d \hat{y}} \frac{d \hat{y}}{d w_1} \end{equation} 其中$ \hat{y} = w_1 × x_1 + w_2 × x_2 + b$,对 $w_1$ 求偏导,则有$d \hat{y}/dw_1 = x_1 = 5.0$,所以,$dL/dw₁ = 0.28 × 5.0 = 1.4$.这里,梯度的含义是$w_1$ 每增加 1,损失 $L$ 大约增加 1.4。梯度为正,说明损失随 $w_1$ 增大而增大,所以要让损失下降,应该减小 $w_1$。
同理,计算 $L$对参数$w_2$的梯度$dL/dw_2 = (dL/d \hat{y}) × (d \hat{y}/dw_2)= x_2 = 2.8= 0.28 × 2.8= 0.784$,这里梯度的含义是$w_2$ 每增加 1,损失 L 增加 0.784。梯度为正,同样应该减小 w₂,只是调整幅度比 w₁ 小一些。最后,计算$ L $对参数 $b$的梯度dL/db = (dL/d\hat{y}) × (d\hat{y}/db)= 0.28 × 1= 0.28$
简单汇总梯度:
| 参数 | 梯度值 | 含义 |
|---|---|---|
| $w_1$ | +1.4 | 降雨量权重偏大,导致预测偏高,需要调低 |
| $w_2$ | +0.784 | 上游水位权重偏大,导致预测偏高,需要调低 |
| b | +0.28 | 偏置项偏大,导致预测偏高,需要调低 |
梯度下降的更新规则是:
新参数 = 旧参数 - 学习率 × 梯度
学习率η 我们设为 0.01(一个常用的保守值,保证每次只走一小步):
用更新后的参数重新做一次前向传播$\hat{y}_{new} = 0.386 × 5.0 + 0.59216 × 2.8 + 0.0972= 3.685248(米)$ 新损失:$L_{new} = (3.685248 - 3.50)² / 2 ≈ 0.01716$ 对比:
| 项目 | 更新前 | 更新后 |
|---|---|---|
| 预测值ŷ | 3.78 | 3.685 |
| 损失L | 0.0392 | 0.0172 |
| 误差(ŷ - y) | +0.28 | +0.185 |
损失从 0.0392 降到了 0.0172,下降了约 56%。仅仅一轮迭代,模型就朝着正确的方向迈进了一大步。