BP(Back Propagation)神经网络——原理篇

Author:AXYZdong 自动化专业 工科男
有一点思考,有一点想法,有一点理性!
定个小小目标,努力成为习惯!在最美的年华遇见更好的自己!
CSDN@AXYZdong,CSDN首发,AXYZdong原创
唯一博客更新的地址为: 👉 AXYZdong的博客 👈
B站主页为:AXYZdong的个人主页

前言

神经网络控制是20世纪80年代以来,在人工神经网络(Artificial Neural Networks,ANN)研究取得的突破性进展基础上发展起来的自动控制领域的前沿学科之一。它是智能控制的一个新的分支,为解决复杂的 非线性、不确定、不确知 系统的控制问题开辟了一条新的途径。

1. 什么是神经网络?

神经网络包括 生物神经网络人工神经网络

  • 生物神经网络,一般指生物的大脑神经元、细胞、触点等组成的网络,用于产生生物的意识、帮助生物进行思考和行动。
  • 人工神经网络(Artificial Neural Networks,简写为ANN)也简称为神经网络,是一种模仿动物神经网络行为特征,进行分布式并行信息处理的数学模型。这种网络依靠系统的复杂程度,通过调整内部大量节点之间相互连接的关系,从而达到处理信息的目的。

2. BP神经网络理论基础

BP (Back Propagation) 神经网络是1986年由 Rumelhart 和 McClelland 为首的科学家提出的概念,是一种按照误差逆向传播算法训练的多层前馈神经网络,是应用最广泛的神经网络。

2.1 感知器(Perceptron)网络

感知器(Perceptron)网络是早期仿生学研究的成果,在1950s由 Frank Rosenblatt 第一次引入,是一种神经网络模型。

人眼睛的视网膜由排成矩阵的光传感元件组成,这些传感元件的输出连接到一些神经元。当输入达到一定水平或者有一定类型的输入产生时,神经元就给出输出。

感知器的基本思想就在于此,即当输入的活动超过一定的内部阈值时,神经元被激活,当输入具有一定的特点时,出发速率也增加。

感知器——BP神经网络中的单个节点

  • 由输入项、权重、偏置、激活函数、输出组成。
  • 输入节点: x 1 , x 2 , x 3 , . . . , x i x_1,x_2,x_3,...,x_i x1x2x3...xi
  • 权重: w 1 , w 2 , w 3 , . . . , w i w_1,w_2,w_3,...,w_i w1w2w3...wi
  • 偏置: b b b
  • 激活函数: f f f
  • 输出节点: o u t p u t output output

在这里插入图片描述

▲ 感知器组成

2.2 BP神经网络的结构与传播规则

BP神经网络是一种典型的非线性算法。

BP神经网络由 输入层隐含层(也称中间层)和 输出层 构成 ,其中隐含层有一层或者多层。每一层可以有若干个节点。层与层之间节点的连接状态通过 权重 来体现。

只有一个隐含层:传统的浅层神经网络;有多个隐含层:深度学习的神经网络。

在这里插入图片描述

▲ 典型BP神经网络的结构

BP神经网络的核心步骤如下。其中,实线代表正向传播,虚线代表反向传播。

在这里插入图片描述

▲ BP神经网络的核心步骤

  • 正向传播
    数据(信息、信号)从输入端输入后,沿着网络的指向,乘以对应的权重后再加和,再将结果作为输入在激活函数中计算,将计算的结果作为输入传递给下一个节点。依次计算,直到得到最终结果。
    通过每一层的感知器,层层计算,得到输出,每个节点的输出作为下一个节点的输入。这个过程就是正向传播。在这里插入图片描述
▲ 感知器

  • 反向传播
    将输出的结果与期望的输出结果进行比较,将比较产生的误差利用网络进行反向传播,本质是一个“负反馈”的过程。
    通过多次迭代,不断地对网络上的各个节点间的权重进行调整(更新),权重的调整(更新)采用梯度下降法。

  • sigmoid 函数
    δ ( x ) = 1 1 + e − x \delta (x)=\frac{1}{1+e^{-x}} δ(x)=1+ex1
    特点: d δ ( x ) d x = [ 1 − δ ( x ) ] ⋅ δ ( x ) \frac{d\delta (x)}{dx}=[1-\delta (x)]\cdot\delta (x) dxdδ(x)=[1δ(x)]δ(x)
    在这里插入图片描述

▲ sigmoid 函数图像

为了简单起见,本文涉及的激活函数均为 sigmoid函数

从机器学习的角度来看,我们的任务就是:给定了一组数据集,其中包含了输入数据 x x x 和输出的真实结果 y y y,如何寻找一组最佳的神经网络参数,使得网络计算得到的推测值 y ^ \hat y y^ 能够与真实值 y y y 吻合程度最高?

2.3 梯度下降学习法

在正向传播的过程中,有一个 与期望的结果比较是否满意 的环节,在这个环节中实际的输出结果与期望的输出结果之间就会产生一个误差,为了减小这个误差,这也就转换为了一个优化过程,对于任何优化问题,总是会有一个目标函数 (objective function),这个目标函数就是 损失函数(Loss function)

L o s s = 1 2 ∑ i = 1 n ( y i − y ^ i ) 2 = 1 2 ∑ i = 1 [ y i − ( w x i + b ) ] 2 Loss=\frac{1}{2}\sum_{i=1}^n(y_i-\hat y_i)^2=\frac{1}{2}\sum_{i=1}[y_i-(wx_i+b)]^2 Loss=21i=1n(yiy^i)2=21i=1[yi(wxi+b)]2

为了让实际的输出结果与期望的输出结果之间的误差最小,就要寻找这个函数的最小值。
在这里插入图片描述

▲ BP神经网络的核心步骤

  • 通过迭代的方法寻找函数最小值

解析解:通过严格的公示推倒计算,给出的方程的精确解,任意精度下满足方程。
数值解:在一定条件下,通过某种近似计算得到的解,能够在给定的精度下满足方程。
迭代的方法寻找函数最小值 就是通过 梯度下降 + 迭代 的方式寻找数值解。

在这里插入图片描述

▲ 迭代示意图

迭代的方法一般都要经过多次,因为函数最小值的寻找可能要经过多次迭代,而在每一次的迭代中,各层节点之间的权重也将不断地迭代更新。
W ( t + 1 ) = W ( t ) − η ∂ L o s s ∂ w + α [ W ( t ) − W ( t − 1 ) ] W_{(t+1)}=W_{(t)}-\eta \frac{\partial Loss}{\partial w}+\alpha [W_{(t)}-W_{(t-1)}] W(t+1)=W(t)ηwLoss+α[W(t)W(t1)]

  • η ∂ L o s s ∂ w \eta \frac{\partial Loss}{\partial w} ηwLoss:调整量;
  • α [ W ( t ) − W ( t − 1 ) ] \alpha [W_{(t)}-W_{(t-1)}] α[W(t)W(t1)] 平滑项。

这样每一次迭代就会产生一次权重更新,之后将更新的权重与训练样本进行正向传播,如果得到的结果不满意,则进行反向传播,继续迭代。如此往复,直到得到满意的结果为止。

梯度下降学习法,有些像高山滑雪运动员总是在寻找坡度最大的地段向下滑行。当他处于A点位置时,沿最大坡度路线下降,达到局部极小点,则停止滑行;如果他是从B点开始向下滑行,则他最终将达到全局最小点。
在这里插入图片描述

▲ 误差函数梯度下降示意图

BP神经网络反向传播为什么选择梯度下降法?

梯度下降法是训练神经网络和线性分类器的一种普遍方法。斜率是函数的导数。

在实际上, x x x 可能不是一个标量,而是一个矢量。参考多元函数的知识,梯度就是偏导数组成的矢量。梯度上的每个元素都会指明函数在该点处各个方向的斜率,因此梯度指向函数变化最快的方向。即指向变大最快的方向和变小最快的方向,对应正梯度和负梯度。
d y d x = lim ⁡ Δ x → 0 Δ y Δ x \frac{dy}{dx}=\lim_{\Delta x\to0}\frac{\Delta y}{\Delta x} dxdy=Δx0limΔxΔy

很多深度学习其实都是在计算梯度,然后通过梯度进行迭代,更新参数向量。

在这里插入图片描述

▲ 导数几何意义

2.4 学习算法的改进

  • 引入动量项
    W ( t + 1 ) = W ( t ) − η [ ( 1 − α ) ∂ L o s s ∂ w ( t ) + α ∂ L o s s ∂ w ( t − 1 ) ] W_{(t+1)}=W_{(t)}-\eta[(1-\alpha ) \frac{\partial Loss}{\partial w_{(t)}}+\alpha \frac{\partial Loss}{\partial w_{(t-1)}}] W(t+1)=W(t)η[(1α)w(t)Loss+αw(t1)Loss]
    η > 0 \eta>0 η>0,为学习率; α \alpha α 为动量因子, 0 ≤ α < 1 0\leq \alpha <1 0α<1
  • 变步长法
    学习率 η \eta η 不好选择,若选得太小,则收敛太慢;若选得太大,则有可能修正过头,导致振荡甚至发散。因此,可以采用变步长法进行改进。
    W ( t + 1 ) = W ( t ) − η ( t ) ∂ L o s s ∂ w η ( t ) = 2 λ η ( t − 1 ) λ = s g n [ ∂ L o s s ∂ w ( t ) ⋅ ∂ L o s s ∂ w ( t − 1 ) ] W_{(t+1)}=W_{(t)}-\eta (t) \frac{\partial Loss}{\partial w}\\[2ex] \eta (t)=2^{\lambda} \eta (t-1)\\[2ex] \lambda =sgn[ \frac{\partial Loss}{\partial w_{(t)}}\cdot \frac{\partial Loss}{\partial w_{(t-1)}}] W(t+1)=W(t)η(t)wLossη(t)=2λη(t1)λ=sgn[w(t)Lossw(t1)Loss]

当连续两次迭代其梯度方向相同时,表明下降太慢,这时可使步长加倍;当连续两次迭代其梯度方向相反时,表明下降过头,这时可使步长减半。

  • 引入动量项与变步长法结合
    W ( t + 1 ) = W ( t ) − η [ ( 1 − α ) ∂ L o s s ∂ w ( t ) + α ∂ L o s s ∂ w ( t − 1 ) ] η ( t ) = 2 λ η ( t − 1 ) λ = s g n [ ∂ L o s s ∂ w ( t ) ⋅ ∂ L o s s ∂ w ( t − 1 ) ] W_{(t+1)}=W_{(t)}-\eta[(1-\alpha ) \frac{\partial Loss}{\partial w_{(t)}}+\alpha \frac{\partial Loss}{\partial w_{(t-1)}}]\\[2ex] \eta (t)=2^{\lambda} \eta (t-1)\\[2ex] \lambda =sgn[ \frac{\partial Loss}{\partial w_{(t)}}\cdot \frac{\partial Loss}{\partial w_{(t-1)}}] W(t+1)=W(t)η[(1α)w(t)Loss+αw(t1)Loss]η(t)=2λη(t1)λ=sgn[w(t)Lossw(t1)Loss]

2.5 BP神经网络的应用

  • BP神经网络应用的领域
    BP神经网络被广泛应用于多个研究领域领,如环境、生物、医学、气象、天文、地理、经济学、管理学、工业、统计学、计算机、移动通信、航天、信息技术、自动化、能源、新材料、海洋等领域。
  • BP神经网络应用的主要方面
    预测:电力运行负荷、血红蛋白浓度、房价、股市、水资源需求、风速、地质灾害等。
    评价:城市安全、河流健康、教学质量、网络安全、水环境、生态风险、灾害损失等。
    图像处理:图像降噪、图像分类、图像复原、图像压缩、图像校正、图像分割、图像加密等。
    仿真:移动机器人避障仿真、物流交通仿真、无人机姿态自适应仿真、工业控制仿真等。

3. 9行代码实现BP神经网络

代码来源于github:https://github.com/miloharper/simple-neural-network

from numpy import exp, array, random, dot 
#从numpy库中调用exp(指数函数)、array(数组〉、random(随机函数)、dot(矩阵相乘函数)。
training_set_inputs = array([[0, 0, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]])
#bp神经网络训练部分的输入。
training_set_outputs = array([[0, 1, 1, 0]]).T
#bp神经网络训练部分的输出,.T表示矩阵转置。
random.seed(1)
#使用随机函数生成随机数,使用seed函数能够确保每次生成的随机数一致。
synaptic_weights = 2 * random.random((3, 1)) - 1
#生成一个随机数组,数组格式为3行1列,用来存储初始权重。
for iteration in range(10000):
    output = 1 / (1 + exp(-(dot(training_set_inputs, synaptic_weights))))
    #使用for语句循环10000次,将训练集的输入和权重采用dot进行矩阵相乘,将相乘得到的结果输入到sigmoid函数,然后将得到的结果赋值给output。
    synaptic_weights += dot(training_set_inputs.T, (training_set_outputs - output) * output * (1 - output))
    #权重的i调整采用“误差加权导数""公式。
print (1 / (1 + exp(-(dot(array([1, 0, 0]), synaptic_weights)))))
#synaptic_weights是调整之后的最终权重,数组(矩阵〉[1,0,0]与这个权重矩阵通过dot函数进行相乘,将相乘的结果作为输入引入到sigmoid函数,得到最终的结果。

运行结果:
在这里插入图片描述

4. 总结

  • BP神经网络传播过程包括正向传播和反向传播,其中反向传播本质上是 “负反馈” 。这一点就类似于控制里面的闭环系统,通过反馈,利用偏差纠正偏差,从而达到满意的输出效果;
  • 对于误差的处理,利用了 梯度下降法+多次迭代 的方式,寻找最小的误差。在此过程中,每进行一次迭代,不同层节点之间的权重就会发生一次更新。正因为权重的动态更新,每一次正向传播所得到的误差也在动态更新,直至得到期望的输出效果;
  • 原理的掌握是基础,代码的实现是关键。文末9行代码实现的BP神经网络,用简洁的代码反映了BP神经网络的原理,是一种单神经网络(simple-neural-network),如果要实现多神经网络,可能就很复杂了。

参考文献

[1] 姜学军等. 计算机控制技术[M]. 3版. 北京:清华大学出版社,2020
[2] https://www.bilibili.com/video/BV11K4y1h7MD


  本次的分享就到这里


11

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “收藏” “关注” 一键三连哦!
更多精彩内容请前往 AXYZdong的博客


如果以上内容有任何错误或者不准确的地方,欢迎在下面 👇 留个言。或者你有更好的想法,欢迎一起交流学习~~~

  • 50
    点赞
  • 61
    收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:鲸 设计师:meimeiellie 返回首页
评论 5

打赏作者

AXYZdong

你的鼓励是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值