计算智能——BP神经网络

1.BP神经网络概述

      BP(Back Propagation)神经网络是1986年由Rumelhart和McCelland为首的科研小组提出,参见他们发表在Nature上的论文 Learning representations by back-propagating errors
      BP神经网络是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一。BP网络能学习和存贮大量的 输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。它的学习规则是使用最速下降法,通过反向传播来不断 调整网络的权值和阈值,使网络的误差平方和最小。
      引用一位博主的话:在我看来BP神经网络就是一个”万能的模型+误差修正函数“,每次根据训练得到的结果与预想结果进行误差分析,进而修改权值和阈值,一步一步得到能输出和预想结果一致的模型。举一个例子:比如某厂商生产一种产品,投放到市场之后得到了消费者的反馈,根据消费者的反馈,厂商对产品进一步升级,优化,从而生产出让消费者更满意的产品。这就是BP神经网络的核心。

2.BP神经网络模型

      BP神经网络是一种多层的前馈神经网络,其主要的特点是:信号是前向传播的,而误差是反向传播的。具体来说,对于如下的只含一个隐层的神经网络模型:
BP神经网络的过程主要分为两个阶段
第一阶段是信号的前向传播,从输入层经过隐含层,最后到达输出层;
第二阶段是误差的反向传播,从输出层到隐含层,最后到输入层,依次调节隐含层到输出层的权重和偏置,输入层到隐含层的权重和偏置。
在这里插入图片描述
BP网络输入和输出的关系
BP网络采用的传递函数是非线性变换函数——Sigmoid函数(又称S函数)。其特点是函数本身及其导数都是连续的,因而在处理上十分方便。为什么要选择这个函数,等下在介绍BP网络的学习算法的时候会进行进一步的介绍。S函数有单极性S型函数和双极性S型函数两种,单极性S型函数定义如下:f(x)=1/1+e−x
其函数曲线如图所示:
在这里插入图片描述
双极性S型函数:f(x)=1−e−x/1+e−x
在这里插入图片描述
使用S型激活函数时,输入:
在这里插入图片描述
输出:
在这里插入图片描述
输出的导数:
在这里插入图片描述

根据S激活函数的图形:
net在 -5~0 的时候导数的值为正,且导数的值逐渐增大,说明此时f(x)在逐渐变大 且 变大的速度越来越快
net在 0~5 的时候导数的值为正,且导数的值逐渐减小,说明此时f(x)在逐渐变大 但是 变大的速度越来越慢
对神经网络进行训练,我们应该尽量将net的值尽量控制在收敛比较快的范围内。
关于模型的详细公式推导,推荐这一篇:BP模型公式推导

3.BP神经网络策略

在这里插入图片描述
上图描绘了神经元jj被它左边的一层神经元产生的一组函数信号所馈给。mm是作用于神经元jj的所有输入不包括偏置的个数。突触权值wj0(n)wj0(n)等于神经元jj的偏置bjbj。

1.前向传播过程推导
图一中,在神经元jj的激活函数输入处产生的诱导局部域vj(n)vj(n)(即神经元jj 的输入)是:
在这里插入图片描述
ϕjϕj是激活函数,则出现在神经元jj输出处的函数信号(即神经元jj的输出)yj(n)yj(n)是:
在这里插入图片描述
2.误差反向传播过程推导
在图一中,yj(n)yj(n)与dj(n)dj(n)分别是神经元jj的实际输出和期望输出,则神经元jj的输出所产生的误差信号定义为:
在这里插入图片描述
其中,dj(n)dj(n)是期望响应向量d(n)d(n)的第jj个元素。
为了使函数连续可导,这里最小化均方根差,定义神经元jj的瞬时误差能量为:
在这里插入图片描述
将所有输出层神经元的误差能量相加,得到整个网络的全部瞬时误差能量:

其中,集合C 包括输出层的所有神经元。
BP 算法通过反复修正权值使式(2-5)EnEn最小化,采用梯度下降法对突触权值wji(n)wji(n)应用一个修正值Δwji(n)∆wji(n)它正比于偏导数δδE(n)/E(n)/δδwji(n)wji(n)。根据微分链式规则,把这个梯度表示为:

偏导数δδE(n)/E(n)/δδwji(n)wji(n)代表一个敏感因子,决定突触权值wjiwji在权值空间的搜索方向。
在式(2-5)两边对ej(n)ej(n)取微分,得到:

在式(2-3)两边对yj(n)yj(n)取微分,得到:

在式(2-2)两边对vj(n)vj(n)取微分,得到:

最后在式(2-1)两边对wji(n)wji(n)取微分,得到:

将式(2-7)——(2-10)带入式(2-6)得:

应用于wji(n)wji(n)的修正Δwji(n)∆wji(n)定义为:

其中,ηη是误差反向传播的学习率, 负号表示在权空间中梯度下降。
将式(2-11)带入式(2-12)得:

其中,δj(n)δj(n)是根据delta法则定义的局部梯度:

局部梯度指明了突触权值所需要的变化。

现在来考虑神经元jj所处的层。

1) 神经元jj是输出层节点
当神经元jj位于输出层时,给它提供了一个期望响应。根据式(2-3)误差信号ej(n)=dj(n)−yj(n)ej(n)=dj(n)−yj(n)确定,通过式(2-14)得到神经元jj的局部梯度δj(n)δj(n)为:

在这里插入图片描述

2) 神经元jj是隐层节点
当神经元jj位于隐层时,没有对该输入神经元的指定期望响应。隐层的误差信号要根据所有与隐层神经元直接相连的神经元的误差信号向后递归决定。
考虑神经元jj为隐层节点,隐层神经元的局部梯度δj(n)δj(n)根据式(2-14)重新定义为:
在这里插入图片描述
来看图二:它表示输出层神经元kk连接到隐层神经元jj的信号流图。

在这里下标jj表示隐层神经元,下标kk表示输出层神经元。

图二中,网络的全部瞬时误差能量为:
在这里插入图片描述
在式(2-17)两边对函数信号yj(n)yj(n)求偏导,得到:

在图二中:
在这里插入图片描述

因此,
在这里插入图片描述

图二中,对于输出层神经元kk ,其诱导局部域是:
在这里插入图片描述

求式(2-21)对yj(n)yj(n)的微分得到:
在这里插入图片描述
将式(2-20)和(2-22)带入到式(2-18)得到:
在这里插入图片描述

将式(2-23)带入式(2-16)得隐层神经元jj的局部梯度δj(n)δj(n)为:

在这里插入图片描述
反向传播过程推导总结
因此,结合式(2-13)、(2-15)和(2-24),由神经元ii连接到神经元jj的突触权值的修正值Δwji(n)∆wji(n)按照delta法则定义如下:

在这里插入图片描述

其中:
神经元jj是输出层节点时,局部梯度δj(n)δj(n)等于倒数ϕ′j(vj(n))ϕj′(vj(n))和误差信号ej(n)=dj(n)−yj(n)ej(n)=dj(n)−yj(n)的乘积,见式(2-15);
神经元jj是隐层节点时,局部梯度δj(n)δj(n)等于倒数ϕ′j(vj(n))ϕj′(vj(n))和下一层(隐层或输出层)的δkδk与权值加权和的乘积,见式(2-24)
此处参考博客

4.BP神经网络算法

在这里插入图片描述

5.BP神经网络MATLAB实现

神经网络运用到的函数
newff函数
该函数用于创建一个前馈BP神经网络
net=newff(P,T,S,TF,BTF,BLF,PF,IPF,OPF,DDF)
在这里插入图片描述

sign函数:
该函数为符号函数 (Signum function)。
当x<0时,sign(x)=-1;
当x=0时,sign(x)=0;
当x>0时,sign(x)=1。

purelin函数是线性函数,y=a*x+b;
tansig函数是反正切函数y=1/(arctan(x)+1);
logsig函数是y=1/(1+e^(-x));

errsurf函数:单输入神经元的误差曲面。
plotes函数绘制单输入神经元的误差曲面。
epochs函数:定义神经网络net的循环次数

5.1构建BP神经网络

% BP网络
% BP神经网络的构建
net=newff([-1 2;0 5],[3,1],{
   'tansig','purelin'},'traingd')
net.IW{
   1}
net.b{
   1}

p=[1;2];
a=sim(net,p)
net=init(net);
net.IW{
   1}
net.b{
   1}
a=sim(net,p)
%net.IW{
   1}*p+net.b{
   1}
p2=net.IW{
   1}*p+net.b{
   1}
a2=sign(p2)
a3=tansig(a2)
a4=purelin(a3)
net.b{
   2}
net.b{
   1}

net.IW{
   1}
net.IW{
   2}
0.
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BP神经⽹络的Matlab实现——⼈⼯智能算法 这⼏天在各⼤媒体上接触到了⼈⼯智能机器学习,觉得很有意思,于是开始⼊门最简单的机器算法——神经⽹络训练算法(Neural Network Training);以前⼀直觉得机器学习很⾼深,到处是超⾼等数学、线性代数、数理统计。⼊坑发现确实是这样!但是呢由项⽬实例 驱动的学习⽐起为考试不挂科为⽬的的学习更为⾼效、实⽤!在遗传算法、神经⽹络算法的学习⼊门之后觉得数学只要⽤⼼看没问题的(即 使是蒙特卡洛和马尔科夫问题),但是呢需要把数学统计应⽤到程序中,来解决实际的问题这是两码事。主要呢还是需要动⼿打代码。下⾯ 呢是今天的机器学习之神经⽹络学习⼊门记录篇,希望帮助到同样⼊门采坑的哥们,⼀起进步! ⼀、主题闲扯 神经⽹络学习-顾名思义,就是类似我们⼈类的学习⽅式,通过模拟神经元的活动,在神经系统中进⾏信息处理、存储记忆和反馈的⽣物机 理功能。其实这样是机器学习算法的共性吧,所有的智能算法都是善于发现⽣活中的常见情节推⼴到计算仿真的范畴,例如:遗传算法、烟 花算法、蚁群算法、模拟退⽕算法等等。 神经⽹络学习是⼈⼯智能领域的基本算法之⼀,它是在1943年被⼼理学家McCulloch和数学家Pitts合作提出的数学模型。并在之后不断完 善发展到今天的。它的主要应⽤领域涉及到模式识别、智能机器⼈、⾮线性系统识别、知识处理等。 ⼆、算法理论 2.1、⼈⼯神经元模型 这⾥我们先解释⼀下机器学习的⼀些特性,总体来说呢,机器学习的核⼼就是学习。这个学习过程呢就是通过已知来训练机器。⽐如:我们 通过⼤量的青蛙图像数据样本来进⾏输⼊训练算法,使得我们给这个程序算法⼀张新的青蛙图像,它能利⽤训练数据的学习来判断我们新给 它的图像数据是青蛙。所以呢,机器学习算法来说就是通过输⼊变量到算法,算法通过分析反馈进⾏判断,最后做出结果。 在上图中是简化的神经元模型,我们的Xi是⼀系列的输⼊变量,对应在其箭头⽅向上的是⼀个权重系数。权重系数呢是为了消除样本数据的 偏差,通常是⼀个rand函数在0-1之间的取值。通过输⼊变量Xi和其⾃⼰的权重系数Wi的乘积的求和输⼊到神经元上。此时神经元得到了输 ⼊变量和其权重的乘积累加和。通过**映射函数F(x)**来进⾏映射得到结果。以上就是⼀个简单的神经元模型和信息传递过程。 也可以简化成下⾯的数学推导公式:我们可以把输⼊变量和对应权重变换成矩阵相乘,这在Matlab中的运算时是⼗分有利的。 对于以上的输⼊变量和对应权重值我们很容易处理,但是这个模型的核⼼是基于激活函数F(x)的,下⾯是我们常见的⼀些激活函数: 2.2、神经⽹络模型 我们的神经⽹络是由若⼲的神经元连接⽽成的,我们常见的模型分类为: 1、连接⽅式:前向神经⽹络和递归神经⽹络*(反馈神经⽹络) 2、训练⽅式:监督式学习和⾮监督式学习 3、按照实现功能:拟合(回归)神经⽹络 vs. 分类神经⽹络 2.3、BP(反向传递)神经⽹络概述: 概述、 1、Backpropagation is a common method of teaching artificial neural networks how to perform a given task. 2、It is a supervised learning method, and is a generalization of the delta rule. It requires a teacher that knows, or can calculate, the desired output for any input in the training set. 3、 Backpropagation requires that the activation function used by the artificial neurons (or "nodes") be differentiable 算法学习过程 Phase 1:神经传递 1. 通过神经⽹络进⾏训练模式输⼊的向前传播以产⽣传播的输出激活。 2. 训练模式中通过神经⽹络对传播的输出激活进⾏反向传播,⽬标是⽣成所有输出和隐藏神经元的增量以便进⾏反馈调整。 Phase 2: 权值更新 3. ⽤它的输出增量和输⼊激活变量来得到权重的梯度。 4. 通过从权重中减去它的⽐例来使权重朝着相反的梯度⽅向移动(最⼩梯度法)。 算法递进过程图解:(Source:) 该项⽬描述了利⽤反向传播算法实现多层神经⽹络的教学过程。为了说明这⼀过程,有两个输⼊和⼀个输出的三层神经⽹络,如下图所⽰: 1、每个神经元由两个单位组成。第⼀个单元添加权重系数和输⼊信号,第⼆个单元实现⾮线性功能,称为神经元激活功能。信号e是加法器 输出信号,y=f(
智能算法优化BP神经网络的流程如下: 1. 收集数据并进行预处理,包括数据清洗、特征选择和数据归一化等。 2. 设计BP神经网络的结构,包括输入层、隐藏层和输出层的节点数、激活函数的选择等。 3. 初始化BP神经网络的权重和偏置。 4. 利用智能算法(如遗传算法、粒子群算法、蚁群算法等)对BP神经网络的权重和偏置进行优化。 5. 利用优化后的BP神经网络对训练数据进行训练,不断调整权重和偏置,直到误差达到预设的阈值或训练次数达到预设的上限。 6. 利用测试数据对训练好的BP神经网络进行测试,评估其性能。 7. 如果性能不满足要求,可以重新调整BP神经网络的结构和参数,再次进行训练和测试。 ```python # 以下是使用遗传算法优化BP神经网络的Python代码示例 import numpy as np from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.neural_network import MLPClassifier from genetic_algorithm import GeneticAlgorithm # 加载数据集并进行预处理 iris = load_iris() X, y = iris.data, iris.target X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) # 定义BP神经网络的结构和参数 mlp = MLPClassifier(hidden_layer_sizes=(10,), activation='logistic', solver='sgd', max_iter=1000, random_state=42) # 定义遗传算法的适应度函数 def fitness_function(chromosome): mlp.coefs_ = [chromosome[:40].reshape(4, 10), chromosome[40:50].reshape(10, 1)] mlp.intercepts_ = [chromosome[50:60], chromosome[60:61]] return mlp.score(X_train, y_train) # 定义遗传算法的参数 ga = GeneticAlgorithm(population_size=100, chromosome_length=61, fitness_function=fitness_function, elitism=True, mutation_rate=0.01) # 进行遗传算法优化 best_chromosome, best_fitness = ga.evolve(100) # 使用优化后的BP神经网络进行测试 mlp.coefs_ = [best_chromosome[:40].reshape(4, 10), best_chromosome[40:50].reshape(10, 1)] mlp.intercepts_ = [best_chromosome[50:60], best_chromosome[60:61]] print('Test accuracy:', mlp.score(X_test, y_test)) ```

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值