【神经网络科普|复习】全网最基础最易懂的BP神经网络数学原理推导及简单变体应用
你是否也疑惑于为什么隐藏层必须用非线性激活函数?不用的话,多增加几个隐藏层行不行?学习率设置太大或太小,具体会出现什么问题?怎么判断自己设置的学习率是否合适?BP 网络训练时,误差一直不下降或下降到一定程度就不动了,大概率是什么原因?怎么解决?想要自己更改参数更新步骤,但是AI太笨调不好同时自己不会推导?本文从初学者的角度,基于基础概念、理论逻辑到实际应用,层层推进讲解BP神经网络,哪怕你完全没接
【神经网络科普|复习】全网最基础最易懂的BP神经网络数学原理推导及简单变体应用
导言:
你是否也疑惑于为什么隐藏层必须用非线性激活函数?不用的话,多增加几个隐藏层行不行?学习率设置太大或太小,具体会出现什么问题?怎么判断自己设置的学习率是否合适?BP 网络训练时,误差一直不下降或下降到一定程度就不动了,大概率是什么原因?怎么解决?想要自己更改参数更新步骤,但是AI太笨调不好同时自己不会推导?本文从初学者的角度,基于基础概念、理论逻辑到实际应用,层层推进讲解BP神经网络,哪怕你完全没接触过机器学习,也能轻松看懂核心原理,看完就能入门。
叠甲:
小编也是初学者,针对自己学习应用中出现的难点及网上大家的困惑进行系统性梳理,若有错漏请评论多多指教!If OK then goto 目录
目录
1. 基础概念
------神经元的工作过程与处理选择
------梯度变化
------前馈与反向传播
------BP基本结构
2. 理论推导与原因
------变量与符号定义
------隐层计算
------输出层计算
------误差计算
------参数值更新
3. 变体应用及难点
------应用特点
------应用领域
------训练难点
正文
1. 基础概念
1.1 神经元的工作过程与处理选择
神经元是神经网络结构模仿的对象,它是神经网络的基本单元。神经元像我们大脑中的神经细胞,每个神经元都能完成接收信息–>处理信息–>输出信息的简单工作。网络中输入层接收信息,隐层处理信息,输出层输出信息。对于简单的数据,单个隐层就能提取到合适的特征给输出层,进而得到正确结果(误差极小),而复杂信息就需要多层隐层或者多个神经元连接起来才能逐步细化数据特征,得到较好结果。
1.2 前馈网络
前馈即正向传播,数据流仅沿单一方向流动,从输入层,历经隐层计算,从输出层输出。
1.3 反向传播
反向传播与前馈的数据流方向相反,数据为输出层产生的误差(需人为定义如何计算误差,定义见下文),数据流从输出层反向传递至网络隐层和输入层,并依据误差信号的梯度变化,对各层连接权值及阈值进行迭代更新的过程。反向传播与前馈过程形成闭环,通过不断修正权值与阈值,逐步降低网络预测误差,实现网络的自主学习。
1.4 梯度变化
梯度变化的目的是为了指导单个参数的更新,不改变其他参数时误差怎么变而存在。梯度变化使用偏导数来表示,偏导数的核心作用是 固定其他所有参数不变,只研究某一个参数的微小变化,对误差 E 产生的变化率和变化方向。
1.5 BP基本结构
BP(Back Propagation)神经网络是一种基于误差反向传播算法的多层前馈神经网络,根据梯度下降机制实现参数的自适应调整,减少训练时的预测值与真实值之间的误差,从已知数据中学习规律,得到最终判断或预测结果。
BP网络的基本架构为分层排布,依次为输入层、隐层(单或多层)、输出层,各层神经元之间通过连接权值相互关联。

输入层的神经元数量,由经过预处理的数据维度决定,原始数据有几个指标,输入层就有几个神经元,它不做任何复杂处理,只负责把原始数据完整地传递给隐藏层。
输出层输出层的神经元数量,由我们的任务目标决定。例如判断这种任务,输出层通常为1个神经元;如果是鸢尾花3个品种这种多分类任务,输出层就有3个神经元。
误差就是训练时BP网络的预测结果和实际正确结果之间的差距。比如我们用网络预测鸢尾花品种,网络预测是"品种A",但实际是"品种B",这两者之间的差距就是误差;再比如时序预测中,网络预测明天气温是25℃,实际明天气温是23℃,这个2℃的差距就是误差。误差是神经网络"学习进步"的依据,误差越大,说明网络的预测越不准确,需要调整的幅度越大;误差越小,说明网络的预测越准确,越接近正确结果。BP神经网络的核心目标,就是不断减少误差,直到误差小到我们可以接受的程度。
隐层的神经元数量没有固定标准,需要根据任务难度调整。任务越复杂,隐层神经元数量通常越多;简单任务,少量神经元就足够。
那么遇到复杂信息时,到底该增加隐藏层层数,还是增加神经元个数呢?
(1)增加神经元个数(在同一个隐层内放置多个神经元)
核心作用:增强当前层的特征提取能力,适合单一层面的复杂信息。在这一层中添加多个神经元,每个新增的神经元,都会和上一层(输入层)的所有神经元建立连接(带有权重),也会和下一层(输出层)的所有神经元建立连接,相当于给同一层大脑增加更多思考单元。

-
增加隐层层数(如在一个神经元内放多层隐层)
核心作用:实现特征的层层加工、逐步细化,适合多层面的复杂信息。比如时序预测中,需要先提取"每日气温变化"的浅层特征,再加工"每周气温趋势"的中层特征,最后整合"每月气温规律"的深层特征,这时就需要增加隐藏层层数,相当于多个人分工协作,一人处理一层特征,层层递进拆解复杂问题。

补充:一般是优先增加神经元个数,再考虑增加隐藏层层数。因为增加隐藏层层数会让网络变得复杂,容易出现"训练困难、误差不下降"的问题。建构网络一般先通过调整同一隐藏层的神经元个数适配复杂信息,若效果仍不好,再逐步增加1-2个隐藏层即可。
BP网络中有很多需要人为定义或者替换的东西。不人工定义就无法训练的有输入层/隐层/输出层的神经元数量,超参数(各层的连接权值、阈值、学习率值,最大迭代次数、误差阈值)等。BP神经网络可以替换的内容(根据目标任务进行优化)有激活函数、误差计算方式、学习率的计算方式、梯度下降策略等。
在下文理论推导中,需要先理解以下两个概念:
(1)权重:用来表示上一层信息对下一层神经元的重要程度,权重越大,说明该信息越重要,对下一层的影响越大;
(2)阈值(偏置bias):用来控制信息的传递,只有当整合后的信息超过这个门槛,神经元才会输出信息;如果没超过门槛,神经元就不会输出信息(可以理解为不够重要的信息,就不传递了)
2. 理论推导
2.1 变量与符号定义
输入值 : X 1 , X 2 , … , X n 预测值 : Y 1 , Y 2 , … , Y m 权值 : ω i j , ω j k 各层节点数 : n ( 输入层 ) , l ( 隐层 ) , m ( 输出层 ) 阈值 : a ( 隐层 ) , b ( 输出层 ) \begin{matrix} 输入值 & :X_{1},X_{2},\ldots,X_{n} \\ 预测值 & :Y_{1},Y_{2},\ldots,Y_{m} \\ 权值 & :\omega_{ij},\omega_{jk} \\ 各层节点数 & :n(输入层),l(隐层),m(输出层) \\ 阈值 & :a(隐层),b(输出层) \end{matrix} 输入值预测值权值各层节点数阈值:X1,X2,…,Xn:Y1,Y2,…,Ym:ωij,ωjk:n(输入层),l(隐层),m(输出层):a(隐层),b(输出层)
2.2 隐层(中间层)计算
步骤1:对xi线性加权求和(此使用标准的单隐层 BP 神经网络隐层计算方式,也可以用其他形式);
步骤2:通过sigmoid或其他非线性激活函数将net1j做非线性变换。
Step1:
n e t 1 j = ∑ i = 1 n ω i j x i − a j , j = 1 , 2 , … , l ( 1 ) {net}_{1j} = \sum_{i = 1}^{n}{\omega_{ij}x_{i} - a_{j}},\quad j = 1,2,\ldots,l (1) net1j=i=1∑nωijxi−aj,j=1,2,…,l(1)
Step2:
H j = f ( n e t 1 j ) , j = 1 , 2 , … , l ( 2 ) H_{j} = f({net}_{1j}),\quad j = 1,2,\ldots,l(2) Hj=f(net1j),j=1,2,…,l(2)
其中激活函数:
f ( x ) = 1 1 + e − x ,即 S i g m o i d ( 3 ) f(x) = \frac{1}{1 + e^{- x}},即Sigmoid(3) f(x)=1+e−x1,即Sigmoid(3)
其导数:
f ′ ( x ) = f ( x ) ( 1 − f ( x ) ) f^{\ \ '}(x) = f(x)(1 - f(x)) f ′(x)=f(x)(1−f(x))
常用的激活函数替代形式:
ReLU激活: H j = m a x ( 0 , ∑ i = 1 n ω i j x i − a j ) H_{j} = max(0,\sum_{i = 1}^{n}{\omega_{ij}x_{i} - a_{j}}) Hj=max(0,∑i=1nωijxi−aj),反向传播时,导数在输入大于0时为1,小于0时为0。
tanh激活: H j = t a n h ( ∑ i = 1 n ω i j x i − a j ) H_{j} = tanh(\sum_{i = 1}^{n}{\omega_{ij}x_{i} - a_{j}}) Hj=tanh(∑i=1nωijxi−aj),导数为 1 − H j 2 1 - H_{j}^{2} 1−Hj2,图像类似Sigmoid但是输出范围在[-1,1]。
Q1:为什么需要用到非线性激活函数?
如果没有非线性激活函数,无论有多少个隐藏层,仍然是多层线性变换叠加后,仍然等价于一个线性变换,和直接用一层线性回归没有区别,无法处理异或、分类边界弯曲等复杂问题。
f ( w 2 ( w 1 x + b 1 ) + b 2 = ( w 2 w 1 ) x + ( b 1 + b 2 ) f(w_{2}(w_{1}x + b_{1}) + b_{2} = (w_{2}w_{1})x + {(b}_{1} + b_{2}) f(w2(w1x+b1)+b2=(w2w1)x+(b1+b2)
加入 Sigmoid 这样的非线性激活函数后,网络就具备了拟合任意复杂函数的能力,这也就是通用近似定理,此处简单介绍,不展开数学推导。
P.S. 通用近似定理(Universal Approximation Theorem
通用近似定理的核心结论是:一个包含至少一个隐层,且隐层使用连续、有界、单调递增的激活函数(如Sigmoid、tanh等)的前馈神经网络,在满足一定条件下,可以以任意精度逼近任意定义在实数域闭子集上的连续函数。
简单来说,只要网络的结构足够合理(有隐层、激活函数合适),它就有能力拟合任何复杂的连续映射关系,无论这个关系多么曲折、非线性。
使用这个定理时,需要注意如下两点:
(1)定理说的是,可以设计个神经网络尽可能好地去"近似"某个特定函数,而不是说"准确"计算这个函数。我们通过增加隐含层神元的个数来提升近似的精度。
(2)被近似的函数,必须连续函数如果函数是非连续的,也就是说有极陡跳跃的函数,那神经网络就"爱莫能助"了。

感兴趣的同学也可以去查阅数学推导和 相关代码的实现,注意定理仅保证存在性,不提供构造方法,实际训练仍依赖优化算法与数据质量。
(35 封私信 / 80 条消息) 通用近似定理(Universal Approximation Theorem) - 知乎

图:Pytorch的构造方法
Q2:net1函数不是线性的时候,不用非线性激活函数行不行?
即使net1j本身是非线性的,仍然需要在隐层使用非线性激活函数,原因如下:
(1)保证梯度可导与反向传播:反向传播算法依赖链式法则,要求每一层的变换都可导。如果 net1j 是一个不可导的非线性函数(例如分段函数、阶跃函数),梯度无法计算,BP 算法就失效了。
(2)增强表达能力:即使 net1j 是非线性的,它的形式通常是固定的(比如多项式、三角函数),而通过线性加权可导激活的方式,可以让网络在训练中自动学习到更灵活的非线性模式。
(3)避免梯度消失/爆炸:直接使用复杂的非线性net1j可能导致梯度在反向传播时急剧衰减或爆炸,而激活函数是精心设计的,能更好地控制梯度流。
2.3 输出层计算
n e t 2 k = ∑ j=1 l ω j k H j − b k , k = 1 , 2 , … , m ( 4 ) {net}_{2k} = \sum_{\text{j=1}}^{l}{\omega_{jk}H_{j} - b_{k}},\quad k = 1,2,\ldots,m (4) net2k=j=1∑lωjkHj−bk,k=1,2,…,m(4)
Y k = n e t 2 k , k = 1 , 2 , … , m ( 5 ) Y_{k} = {net}_{2k},\quad k = 1,2,\ldots,m(5) Yk=net2k,k=1,2,…,m(5)
Q3:为什么输出层 Y k \mathbf{Y}_{\mathbf{k}} Yk是对 H j \mathbf{H}_{\mathbf{j}} Hj的函数,为什么这么定义?
这里的 Y k Y_{k} Yk是对隐层输出 H j H_{j} Hj的线性加权求和。隐层 H j H_{j} Hj的作用是特征提取:它将原始输入 x i x_{i} xi转换为更抽象、更具区分度的特征表示。输出层 Y k Y_{k} Yk的作用是决策/回归:它利用这些提取好的特征 H j H_{j} Hj,通过线性组合(或再经过一次激活)来产生最终的预测结果。这种设计让网络可以先学习复杂的特征,再用简单的方式进行决策,大大提升了学习效率和表达能力。
· 结构上:信息必须从隐层流向输出层。
· 功能上:隐层负责特征提取,输出层负责基于特征进行决策。
· 算法上:这种依赖关系保证了误差可以反向传播,从而更新整个网络的参数。
2.4 误差计算
单个输出节点误差,其中 O k O_{k} Ok为训练集中的已给出的真实结果值:
e k = O k − Y k , k = 1 , 2 , … , m ( 6 ) e_{k} = O_{k} - Y_{k},\quad k = 1,2,\ldots,m (6) ek=Ok−Yk,k=1,2,…,m(6)
网络总误差E(此处使用均方误差MSE的一种变体,一般用于回归预测和二分类,与sigmoid搭配):
E = 1 2 ∑ k = 1 m ( O k − Y k ) 2 ( 7 ) E = \frac{1}{2}\sum_{k = 1}^{m}(O_{k} - Y_{k})^{2}(7) E=21k=1∑m(Ok−Yk)2(7)
常见误差还有交叉熵,也能配合sigmoid或者softmax。
2.5 连接权
通用公式:
θ ( r + 1 ) = θ ( r ) + Δ θ ( r ) \theta(r + 1) = \theta(r) + \Delta\theta(r) θ(r+1)=θ(r)+Δθ(r)
梯度下降权值更新公式:
Δ θ ( r ) = − η ∂ E ∂ θ ( r ) \Delta\theta(r) = - \eta\frac{\partial E}{\partial\theta(r)} Δθ(r)=−η∂θ(r)∂E
其中,r为训练到第r轮, η \eta η为学习率, ∂ E ∂ θ ( r ) \frac{\partial E}{\partial\theta(r)} ∂θ(r)∂E为误差对权重的偏导数(也即梯度)。
Q4:为什么有个负号?
∂ E ∂ θ ( r ) \frac{\partial E}{\partial\theta(r)} ∂θ(r)∂E (梯度)表示第r轮参数(BP中为权重w和阈值a,b)的变化会如何影响误差。正梯度意味着参数权重变大,误差变大;负梯度意味着参数权重变大,误差变小。而BP的目标是让误差E越来越小,所以必须往梯度的反方向调整权重。
Q5:为什么需要有学习率?学习率是怎么帮助找到全局最优的?
拟合到全局最优就像登山攀登最高峰,连绵不断的山峰有多个高峰,但"只在此山中"让我们看不到最高的峰,步伐大能更快爬山(收敛快),找最高峰,步伐慢用时更长(收敛慢)。梯度只告诉我们拟合的方向(高峰在哪个方向,不一定为最高峰),没告诉我们走多大的一步,过大过小的步子都可能导致网络不收敛,因此引入学习率来控制每一步的步长。学习率决定了每次迭代沿负梯度方向前进的距离。通过不断迭代,误差E逐步下降,最终收敛到误差函数的极小值点,在大多数实际问题中,这就是可接受的全局最优解。在简单的BP网络中,学习率一般设定为同一个值,当然也可以设定为不同的值,取决于网络的优化需要。
当然,现在的网络都是用可学习的学习率,比如Adam,不用自己操心了。
注意:梯度下降本身不能保证一定找到全局最优,但合适的学习率能最大程度逼近全局最优,逼近≠就是。
BP网络中的使用:
(1)隐层权值更新
ω i j ( r + 1 ) = ω i j ( r ) + Δ ω i j ( r ) = ω i j ( r ) + η ∑ k = 1 m e k ω j k ∙ H j ( 1 − H j ) ∙ x i \omega_{ij}(r + 1) = \omega_{ij}(r) + \Delta\omega_{ij}(r)\ = \omega_{ij}(r) + \eta\sum_{k = 1}^{m}e_{k}\omega_{jk} \bullet H_{j}(1 - H_{j}) \bullet x_{i} ωij(r+1)=ωij(r)+Δωij(r) =ωij(r)+ηk=1∑mekωjk∙Hj(1−Hj)∙xi
Δ ω i j ( r ) = − η ∂ E ∂ ω i j ( r ) = − η ∑ k = 1 m e k ω j k ∙ H j ( 1 − H j ) ∙ x i \Delta\omega_{ij}(r) = - \eta\frac{\partial E}{\partial\omega_{ij}(r)}\ = - \eta\sum_{k = 1}^{m}e_{k}\omega_{jk} \bullet H_{j}(1 - H_{j}){\bullet x}_{i} Δωij(r)=−η∂ωij(r)∂E =−ηk=1∑mekωjk∙Hj(1−Hj)∙xi
推导:式(1)(2)得到 H j H_{j} Hj是 ω i j ( r ) \omega_{ij}(r) ωij(r)的函数,由(4)(5)可得 Y k Y_{k} Yk是 H j H_{j} Hj的函数,(6)(7)可得E是 Y k Y_{k} Yk的函数,因此,
∂ E ∂ ω i j ( r ) = ∂ E ∂ H j ∙ ∂ H j ∂ ω i j ( r ) = ∂ E ∂ Y j k ∙ ∂ Y j k ∂ H j ∙ ∂ H j ∂ ω i j ( r ) \frac{\partial E}{\partial\omega_{ij}(r)}\ = \frac{\partial E}{\partial H_{j}}\ \bullet \frac{\partial H_{j}}{\partial\omega_{ij}(r)}\ = {\frac{\partial E}{\partial Y_{jk}}\ \bullet \frac{\partial Y_{jk}}{\partial H_{j}} \bullet \frac{\partial H_{j}}{\partial\omega_{ij}(r)}}_{} ∂ωij(r)∂E =∂Hj∂E ∙∂ωij(r)∂Hj =∂Yjk∂E ∙∂Hj∂Yjk∙∂ωij(r)∂Hj
同时,对单个j有,
∂ E ∂ Y k = − ( O k − Y k ) = − e k \frac{\partial E}{\partial Y_{k}} = - (O_{k} - Y_{k}) = - e_{k} ∂Yk∂E=−(Ok−Yk)=−ek
∂ Y k j ∂ H j = ∑ k = 1 m ω j k \frac{\partial Y_{kj}}{\partial H_{j}} = \sum_{k = 1}^{m}\omega_{jk} ∂Hj∂Ykj=k=1∑mωjk
因此,
∂ E ∂ H j = − ∑ k = 1 m e k ω j k \frac{\partial E}{\partial H_{j}} = - \sum_{k = 1}^{m}e_{k}\omega_{jk} ∂Hj∂E=−k=1∑mekωjk
和 H j = f ( n e t 1 j ) = f ( ∑ i = 1 n ω i j x i − a j ) {H_{j} = f(net}_{1j}) = f(\sum_{i = 1}^{n}{\omega_{ij}x_{i} - a_{j})} Hj=f(net1j)=f(∑i=1nωijxi−aj)(式1,2,3)得
∂ H j ∂ ω i j ( r ) = ∂ H j ∂ n e t 1 j ∙ ∂ n e t 1 j ∂ ω i j ( r ) = f ′ ( n e t 1 j ) ∙ f ′ ( ω i j ( r ) ) \frac{\partial H_{j}}{\partial\omega_{ij}(r)} = \frac{\partial H_{j}}{\partial{net}_{1j}} \bullet \frac{\partial{net}_{1j}}{\partial\omega_{ij}(r)} = f^{\ \ '}({net}_{1j}) \bullet f^{\ \ '}(\omega_{ij}(r)) ∂ωij(r)∂Hj=∂net1j∂Hj∙∂ωij(r)∂net1j=f ′(net1j)∙f ′(ωij(r))
其中,
f ′ ( n e t 1 j ) = f ( n e t 1 j ) ( 1 − f ( n e t 1 j ) = H j ( 1 − H j ) ( 由 f ′ ( x ) = f ( x ) ( 1 − f ( x ) ) ) f^{\ \ '}({net}_{1j}) = f({net}_{1j})(1 - f({net}_{1j}) = H_{j}(1 - H_{j})\ \ \ \ \ \ (由f^{\ \ '}(x) = f(x)(1 - f(x))) f ′(net1j)=f(net1j)(1−f(net1j)=Hj(1−Hj) (由f ′(x)=f(x)(1−f(x)))
f ′ ( ω i j ( r ) ) = x i ,(因为( 1 )中的 ∑ i = 1 n ω i j x i 中 ∑ i = 1 n 是针对 ω i j 而不是 x i 的) f^{\ \ '}(\omega_{ij}(r)) = x_{i},(因为(1)中的\sum_{i = 1}^{n}{\omega_{ij}x_{i}}中\sum_{i = 1}^{n}{}是针对\omega_{ij}而不是x_{i}的) f ′(ωij(r))=xi,(因为(1)中的i=1∑nωijxi中i=1∑n是针对ωij而不是xi的)
因此把各项相乘,
∂ E ∂ ω i j ( r ) = − ∑ k = 1 m e k ω j k ∙ H j ( 1 − H j ) ∙ x i \frac{\partial E}{\partial\omega_{ij}(r)}\ = - \sum_{k = 1}^{m}e_{k}\omega_{jk} \bullet H_{j}(1 - H_{j})\ \bullet x_{i} ∂ωij(r)∂E =−k=1∑mekωjk∙Hj(1−Hj) ∙xi
(2)输出层权值更新
ω j k ( r + 1 ) = ω j k ( r ) + Δ ω j k ( r ) = ω j k ( r ) + η e k H j \omega_{jk}(r + 1) = \omega_{jk}(r) + \Delta\omega_{jk}(r) = \omega_{jk}(r) + \eta e_{k}H_{j} ωjk(r+1)=ωjk(r)+Δωjk(r)=ωjk(r)+ηekHj
j = 1 , 2 , … , l ; k = 1 , 2 , … , m j = 1,2,\ldots,l;\quad k = 1,2,\ldots,m j=1,2,…,l;k=1,2,…,m
推导:
Δ ω j k ( r ) = − η ∂ E ∂ ω j k ( r ) \Delta\omega_{jk}(r) = - \eta\frac{\partial E}{\partial\omega_{jk}(r)} Δωjk(r)=−η∂ωjk(r)∂E
∂ E ∂ ω j k ( r ) = ∂ E ∂ Y k ∙ ∂ Y k ∂ ω j k ( r ) \frac{\partial E}{\partial\omega_{jk}(r)} = \frac{\partial E}{\partial Y_{k}} \bullet \frac{\partial Y_{k}}{\partial\omega_{jk}(r)} ∂ωjk(r)∂E=∂Yk∂E∙∂ωjk(r)∂Yk
又由(4)(5)可得 Y k Y_{k} Yk是 H j H_{j} Hj的函数,(6)(7)可得E是 Y k Y_{k} Yk的函数,因此,
∂ E ∂ Y k = − ( O k − Y k ) = − e k \frac{\partial E}{\partial Y_{k}} = - (O_{k} - Y_{k}) = - e_{k} ∂Yk∂E=−(Ok−Yk)=−ek
∂ Y k j ∂ ω j k ( r ) = H j \frac{\partial Y_{kj}}{\partial\omega_{jk}(r)} = H_{j} ∂ωjk(r)∂Ykj=Hj
因此把各项相乘,
∂ E ∂ ω j k ( r ) = − e k H j \frac{\partial E}{\partial\omega_{jk}(r)} = - e_{k}H_{j} ∂ωjk(r)∂E=−ekHj
(3)输出层阈值更新
b k ( r + 1 ) = b k ( r ) + Δ b k ( r ) = b k ( r ) − η e k b_{k}(r + 1) = b_{k}(r) + \Delta b_{k}(r)\ = b_{k}(r) - \eta e_{k} bk(r+1)=bk(r)+Δbk(r) =bk(r)−ηek
j = 1 , 2 , … , l ; k = 1 , 2 , … , m j = 1,2,\ldots,l;\quad k = 1,2,\ldots,m j=1,2,…,l;k=1,2,…,m
推导:
Δ b k ( r ) = − η ∂ E ∂ b k ( r ) \Delta b_{k}(r) = - \eta\frac{\partial E}{\partial b_{k}(r)} Δbk(r)=−η∂bk(r)∂E
又由(4)(5)可得 Y k Y_{k} Yk是 b k b_{k} bk的函数,在第r轮中因此,
∂ E ∂ b k ( r ) = ∂ E ∂ Y k ∙ ∂ Y k ∂ b k ( r ) = − e k ∙ ( − 1 ) = e k \frac{\partial E}{\partial b_{k}(r)} = \frac{\partial E}{\partial Y_{k}} \bullet \frac{\partial Y_{k}}{\partial b_{k}(r)} = - e_{k} \bullet ( - 1) = e_{k} ∂bk(r)∂E=∂Yk∂E∙∂bk(r)∂Yk=−ek∙(−1)=ek
(4)隐层阈值更新
a j ( r + 1 ) = a j ( r ) + Δ a j ( r ) = a j ( r ) − η H j ( 1 − H j ) ∑ k = 1 m e k ω j k a_{j}(r + 1) = a_{j}(r) + \Delta a_{j}(r) = a_{j}(r) - \eta H_{j}(1 - H_{j})\sum_{k = 1}^{m}e_{k}\omega_{jk} aj(r+1)=aj(r)+Δaj(r)=aj(r)−ηHj(1−Hj)k=1∑mekωjk
推导:
Δ a j ( r ) = − η ∂ E ∂ a j ( r ) \Delta a_{j}(r) = - \eta\frac{\partial E}{\partial a_{j}(r)} Δaj(r)=−η∂aj(r)∂E
∂ E ∂ a j ( r ) = ∂ E ∂ H j ∙ ∂ H j ∂ a j ( r ) = ∂ H j ∂ Y k ∙ ∂ Y k ∂ H j ∙ ∂ H j ∂ a j ( r ) \frac{\partial E}{\partial a_{j}(r)} = \frac{\partial E}{\partial H_{j}} \bullet \frac{\partial H_{j}}{\partial a_{j}(r)} = \frac{\partial H_{j}}{\partial Y_{k}} \bullet \frac{\partial Y_{k}}{\partial H_{j}} \bullet \frac{\partial H_{j}}{\partial a_{j}(r)} ∂aj(r)∂E=∂Hj∂E∙∂aj(r)∂Hj=∂Yk∂Hj∙∂Hj∂Yk∙∂aj(r)∂Hj
式(1)(2)得到 H j H_{j} Hj是 a j a_{j} aj的函数,在第r轮中因此,
∂ H j ∂ a j ( r ) = − 1 \frac{\partial H_{j}}{\partial a_{j}(r)} = - 1 ∂aj(r)∂Hj=−1
剩余 ∂ H j ∂ Y k ∙ ∂ Y k ∂ H j \frac{\partial H_{j}}{\partial Y_{k}} \bullet \frac{\partial Y_{k}}{\partial H_{j}} ∂Yk∂Hj∙∂Hj∂Yk在本节(1)中推过了不推了。
3. 变体应用及难点
3.1 应用特点
BP神经网络本质是一种非线性映射模型,核心优势的是能够通过对多维度、时序或多源输入特征进行自动学习、特征提取与综合拟合,无需人工手动构建输入与输出之间的关联逻辑,仅需设定基础函数(如激活函数、误差函数)和足够样本,就能自动建立从已知特征空间到未知目标输出的非线性关系。因此,凡是需要从历史数据或多维参数中,预测未来、未知或待评估指标的问题,均适用于该模型。
BP神经网络更适合中小规模问题,符合以下特点的场景,用它能达到最优效果。
(1)输入特征可量化、多维度:输入数据是具体的数值(如温度、长度、传感器数值),且有多个指标(如鸢尾花4个指标、设备运行5个参数),无法用简单线性公式描述关联;
(2)任务目标是预测或分类:需要从已知数据推导未知结果(预测),或给数据划分类别(分类),比如预测销量、识别故障类型;
(3)有足够多的样本数据:样本数量能支撑网络学习规律(一般几十到几千个样本即可,零基础入门可从几百个样本开始),样本越规范、越全面,网络训练效果越好;
(4)输入与输出存在非线性关联:如果是简单线性关联(如距离=速度×时间),用传统方法更高效;若关联复杂、非直线,BP神经网络优势明显;
(5)无需手动构建逻辑规则:不想手动编写输入与输出的关联逻辑,希望网络自动学习规律,节省人工成本。
Q6:相比于传统方法,为什么BP神经网络能在很少轮次中得到较小的误差?
① 非线性拟合能力更强:传统方法(如线性回归)只能处理简单的线性关系(如单价固定,销量越多总收入越多),面对多因素、非线性的复杂问题(如气温受湿度、风速、季节等多因素影响),无法精准拟合,需要大量手动调整才能接近正确结果;而BP神经网络通过隐层和非线性激活函数,能自动捕捉复杂的非线性关系,无需人工干预,因此训练轮次更少、误差下降更快。
② 自动特征提取更高效:传统方法需要人工手动提取特征(比如分析鸢尾花时,手动计算花瓣长宽比作为特征),不仅繁琐,还容易遗漏关键特征,导致误差较大;BP神经网络的隐层能自动提取、融合特征,快速找到输入与输出的核心关联,减少无效计算,因此能在很少轮次内达到较小误差。
3.2 应用领域
BP神经网络具有非线性映射能力强、自学习、自适应、泛化能力强(即对未知数据的预测能力强)等核心特点,无需复杂的人工干预,仅需提供样本数据就能完成学习和预测。小编按照使用频次进行排列如下:
- 分类识别:
- 图像识别:手写数字、人脸、物体识别
- 文字 / 语音识别
- 故障诊断:机械、电力、电子设备故障分类
- 医学诊断:心电图、肿瘤、疾病分类
- 模式识别:指纹、声纹、行为识别
- 预测与拟合
- 时间序列预测:股价、销量、流量、天气
- 电池预测:剩余寿命、容量衰减、SOC 估计
- 能耗预测、负荷预测
- 非线性函数拟合、数据回归
- 控制领域
- 机器人控制、运动控制
- 自适应控制、PID 参数优化
- 工业过程自动控制
- 数据处理与建模
- 数据压缩、特征提取
- 非线性系统建模
- 信号处理、滤波
- 其他常见应用
- 推荐系统:商品、视频、音乐推荐
- 金融:信用评估、风险评估
- 交通:车流量预测、交通状态识别
3.3 训练难点
BP神经网络虽然入门简单、应用广泛,但在实际训练过程中,很容易遇到误差不下降、预测不准、训练效率低等问题,以下是3个最常见、最难解决的核心难点,结合零基础学习者的痛点,拆解原因并给出简单易操作的解决方案,无需复杂操作。
难点1:训练时误差一直不下降(或下降到一定程度就停滞不动)
这是最常见的训练痛点,很多零基础学习者会误以为是网络结构不行,实则核心原因的是网络无法继续学习到有效规律,具体原因及解决方案如下:
核心原因:① 样本数据问题(最主要):样本数量太少,网络无法学习到稳定的规律;样本数据杂乱,包含异常值(如鸢尾花样本中混入其他花的数据),导致网络学习到错误规律;② 网络结构不合理:网络结构错误;隐层神经元数量太少,无法提取足够的特征;或神经元数量太多,导致网络过拟合(只记住样本数据,无法应对未知数据);③ 学习率设置不当:学习率太大,误差来回震荡;学习率太小,参数更新太慢,无法逼近最小误差;④ 初始权值/阈值设置不当:初始值太大或太小,导致网络陷入局部最优(误差不再下降,但不是最小误差)。
解决方案:① 优化样本:增加高质量样本,剔除数据中的异常值、杂乱数据,保证样本的规范性和全面性;② 调整网络结构:优先调整隐层神经元数量,从少量(5-10个)开始尝试,逐步增加,避免一开始设置过多;③ 调整学习率:从0.01-0.1之间开始尝试,观察误差变化,误差震荡则减小,误差下降慢则适当增大;④ 重新设置初始权值/阈值:将初始值设为0附近的随机小值,重新训练,避免陷入局部最优。
难点2:过拟合问题(训练误差很小,测试误差很大)
过拟合是BP神经网络训练中最隐蔽的难点,很多零基础学习者会误以为训练误差越小越好,实则过拟合会导致网络只会死记硬背样本,不会灵活应对未知数据,比如训练时能准确识别已知的鸢尾花样本,但遇到新的鸢尾花样本就预测错误。
核心原因:① 隐层神经元数量过多,网络过于复杂,把样本中的偶然规律当成了通用规律(比如样本中某朵鸢尾花的花瓣有瑕疵,网络就把瑕疵当成了该品种的特征);② 样本数量太少,或样本类型单一,网络无法学习到通用规律;③ 训练轮次过多,网络过度学习样本,导致泛化能力下降。
解决方案:① 调整隐层神经元数量:减少过多的神经元,保留能提取核心特征的数量,避免网络过于复杂;② 增加样本数量和多样性:补充不同类型的样本,让网络学习到通用规律,而非偶然规律;③ 控制训练轮次:当训练误差下降到一定程度、趋于平稳时,停止训练,避免过度训练;④ 简单优化:可适当增加误差惩罚,让网络避免过度关注样本中的偶然细节。
难点3:学习率难以把控(设置不当导致训练失败)
学习率是BP神经网络训练的核心参数,也是零基础学习者最易踩坑的难点——学习率没有固定标准,设置太大或太小,都会导致训练失败,且难以直观判断设置是否合理。
核心问题:① 学习率太大:参数更新步长过大,误差来回震荡,始终无法收敛到最小误差,甚至误差越来越大,训练无法继续;② 学习率太小:参数更新步长过小,训练速度极慢,需要上千、上万轮训练才能接近最优误差,甚至会一直卡在局部最优,误差无法继续下降;③ 固定学习率无法适配全程训练:训练前期需要较大学习率快速逼近最优区域,后期需要较小学习率精细调整,固定学习率无法兼顾。
解决方案:① 初始学习率选择:优先从0.01-0.1之间选择,不用追求最优值,先保证训练能正常收敛;② 动态调整学习率(简单版):训练前期用稍大的学习率(如0.05),当误差下降趋于平稳时,适当减小学习率(如调整为0.01),精细化调整;③ 观察误差判断:训练时实时观察误差变化,误差震荡则立即减小学习率,误差下降极慢则适当增大,逐步尝试找到合适的范围;④ 零基础简化方案:若不会动态调整,可选择0.01作为初始学习率,多数简单场景(如鸢尾花识别、简单时序预测)都能正常训练。
代码仓库
参考文献:
- 周志华.机器学习[M].北京:清华大学出版社,2016.
- alg-flody.https://blog.csdn.net/daigualu/article/details/73746337.
- wentingtu. http://www.cnblogs.com/wentingtu/archive/2012/06/05/2536425.html
- 赵申剑,黎彯君,符天凡,李凯(译).深度学习(《Deep learning》 中文译本)[M].北京:人民邮电出版社,2017.
下一讲:BP神经网络的常见变体
更多推荐
所有评论(0)