Author:AXYZdong 自动化专业 工科男 有一点思考,有一点想法,有一点理性!
定个小小目标,努力成为习惯!在最美的年华遇见更好的自己!
CSDN@AXYZdong,CSDN首发,AXYZdong原创 唯一博客更新的地址为: 👉 AXYZdong的博客 👈 B站主页为:AXYZdong的个人主页
神经网络控制是20世纪80年代以来,在人工神经网络(Artificial Neural Networks,ANN)研究取得的突破性进展基础上发展起来的自动控制领域的前沿学科之一。它是智能控制的一个新的分支,为解决复杂的 非线性、不确定、不确知 系统的控制问题开辟了一条新的途径。
神经网络包括 生物神经网络 和 人工神经网络。
BP (Back Propagation) 神经网络是1986年由 Rumelhart 和 McClelland 为首的科学家提出的概念,是一种按照误差逆向传播算法训练的多层前馈神经网络,是应用最广泛的神经网络。
感知器(Perceptron)网络是早期仿生学研究的成果,在1950s由 Frank Rosenblatt 第一次引入,是一种神经网络模型。
人眼睛的视网膜由排成矩阵的光传感元件组成,这些传感元件的输出连接到一些神经元。当输入达到一定水平或者有一定类型的输入产生时,神经元就给出输出。
感知器的基本思想就在于此,即当输入的活动超过一定的内部阈值时,神经元被激活,当输入具有一定的特点时,出发速率也增加。
感知器——BP神经网络中的单个节点
▲ 感知器组成
BP神经网络是一种典型的非线性算法。
BP神经网络由 输入层、隐含层(也称中间层)和 输出层 构成 ,其中隐含层有一层或者多层。每一层可以有若干个节点。层与层之间节点的连接状态通过 权重 来体现。
只有一个隐含层:传统的浅层神经网络;有多个隐含层:深度学习的神经网络。
▲ 典型BP神经网络的结构
BP神经网络的核心步骤如下。其中,实线代表正向传播,虚线代表反向传播。
▲ BP神经网络的核心步骤
▲ 感知器
▲ sigmoid 函数图像
为了简单起见,本文涉及的激活函数均为 sigmoid函数。
从机器学习的角度来看,我们的任务就是:给定了一组数据集,其中包含了输入数据 x 和输出的真实结果 y,如何寻找一组最佳的神经网络参数,使得网络计算得到的推测值 y^ 能够与真实值 y 吻合程度最高?
在正向传播的过程中,有一个 与期望的结果比较是否满意
的环节,在这个环节中实际的输出结果与期望的输出结果之间就会产生一个误差,为了减小这个误差,这也就转换为了一个优化过程,对于任何优化问题,总是会有一个目标函数 (objective function),这个目标函数就是 损失函数(Loss function)。Loss=21i=1∑n(yi−y^i)2=21i=1∑[yi−(wxi+b)]2
为了让实际的输出结果与期望的输出结果之间的误差最小,就要寻找这个函数的最小值。
▲ BP神经网络的核心步骤
解析解:通过严格的公示推倒计算,给出的方程的精确解,任意精度下满足方程。 数值解:在一定条件下,通过某种近似计算得到的解,能够在给定的精度下满足方程。 迭代的方法寻找函数最小值 就是通过 梯度下降 + 迭代 的方式寻找数值解。
▲ 迭代示意图
迭代的方法一般都要经过多次,因为函数最小值的寻找可能要经过多次迭代,而在每一次的迭代中,各层节点之间的权重也将不断地迭代更新。W(t+1)=W(t)−η∂w∂Loss+α[W(t)−W(t−1)]
这样每一次迭代就会产生一次权重更新,之后将更新的权重与训练样本进行正向传播,如果得到的结果不满意,则进行反向传播,继续迭代。如此往复,直到得到满意的结果为止。
梯度下降学习法,有些像高山滑雪运动员总是在寻找坡度最大的地段向下滑行。当他处于A点位置时,沿最大坡度路线下降,达到局部极小点,则停止滑行;如果他是从B点开始向下滑行,则他最终将达到全局最小点。
▲ 误差函数梯度下降示意图
BP神经网络反向传播为什么选择梯度下降法?
梯度下降法是训练神经网络和线性分类器的一种普遍方法。斜率是函数的导数。
在实际上,x 可能不是一个标量,而是一个矢量。参考多元函数的知识,梯度就是偏导数组成的矢量。梯度上的每个元素都会指明函数在该点处各个方向的斜率,因此梯度指向函数变化最快的方向。即指向变大最快的方向和变小最快的方向,对应正梯度和负梯度。 dxdy=Δx→0limΔxΔy
很多深度学习其实都是在计算梯度,然后通过梯度进行迭代,更新参数向量。
▲ 导数几何意义
当连续两次迭代其梯度方向相同时,表明下降太慢,这时可使步长加倍;当连续两次迭代其梯度方向相反时,表明下降过头,这时可使步长减半。
代码来源于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函数,得到最终的结果。
运行结果:
“负反馈”
。这一点就类似于控制里面的闭环系统,通过反馈,利用偏差纠正偏差,从而达到满意的输出效果;[1] 姜学军等. 计算机控制技术[M]. 3版. 北京:清华大学出版社,2020 [2] https://www.bilibili.com/video/BV11K4y1h7MD
本次的分享就到这里
如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “收藏” “关注”
一键三连哦!
更多精彩内容请前往 AXYZdong的博客
如果以上内容有任何错误或者不准确的地方,欢迎在下面 👇 留个言。或者你有更好的想法,欢迎一起交流学习~~~