1 算法介绍

1.1 BP神经网络

1、 反向传播算法应用领域

反向传播算法应用较为广泛,从字面意思理解,与前向传播相互对应。在简单的神经网络中,反向传播算法,可以理解为最优化损失函数过程,求解每个参与运算的参数的梯度的方法。在前馈神经网络中,反向传播从求解损失函数偏导过程中,步步向前求解每一层的参数梯度。在卷积神经网络中,反向传播可以求解全连接层的参数梯度。在循环神经网络中,反向传播算法可以求解每一个时刻t或者状态t的参数梯度(在RNN\LSTM\GRU中,反向传播更多是BPTT)。笔者如今对于BP的理解,认为是在优化损失函数或者目标函数过程中,求解参与运算的参数的梯度方法,是一种比较普遍的说法。

2、准备知识--反向传播(BP)算法应用于神经网络

反向传播(BP)算法在深度学习中,应用广泛。这里仅以前馈神经网络中的BP算法作为介绍。神经网络是一个由输入层、隐藏层、输出层三部分组成的网络,如图(1):数据从输入层,经过权重值和偏置项的线性变换处理,再通过激活层,得到隐藏层的输出,也即下一层的输入;隐藏层到输出层之间是,经过权重值和偏置项的线性变换,之后通过激活层,得到输出层。

图2表示一个网络层为2的前馈神经网络:一个隐藏层,一个输出层;隐藏单元为5,记输入层到隐藏层的权重值为W,偏置项为b1,激活函数为g1,隐藏层到输出层的权重值为V,偏置项为b2,激活函数为g2,则图2的模型即为:

图2是一个比较简单的神经网络,通常,我们见到的神经网络,是具有多个隐藏层的网络,如图3:这是一个隐藏层个数为N个,每层隐藏单元数为5的神经网络。(PS:隐藏层设计,可以考虑层数设计和隐藏单元设计,可根据自己的需要自行设计。)

从输入层到隐藏层再到输出层,这一向前传递的过程,我们称之为前向传播。前向传播过程,往往是我们设定模型的过程,也可以理解为设定数学表达式或者列方程的过程。

3、BP算法原理及其实施步骤

BP算法的核心思想:使用梯度下降来搜索可能的权向量的假设空间,以找到最佳的拟合样例的权向量。具体而言,即利用损失函数,每次向损失函数负梯度方向移动,直到损失函数取得最小值。

或者说,反向传播算法,是根据损失函数,求出损失函数关于每一层的权值及偏置项的偏导数,也称为梯度,用该值更新初始的权值和偏置项,一直更新到损失函数取得最小值或是设置的迭代次数完成为止。以此来计算神经网络中的最佳的参数。

由此,正式介绍BP算法前,我们需要知道前向传播过程,确定网络的设计。为此先设定一个只有一层的神经网络,作为讲解,如图4.

设定:从输入层数据为X,输入层到隐藏层参数为w,b1,隐藏层到输出层参数为v,b2,激活函数用为g1,g2。于是模型设定为:

输入层到隐藏层:

                                            (3-1)

隐藏层到输出层:

                                               (3-2)

模型:

                 (3-3)

损失函数:

                                                   (3-4)

其中:

以上述的模型设定为例,下面介绍BP算法步骤,通过BP算法的步骤,了解反向传播,是如何实现模型的参数更新。

实施步骤:

    1)初始化网络中的权值和偏置项,分别记为

                                                                                                                            (3-5)

    2)激活前向传播,得到各层输出和损失函数的期望值

                                                                                                                   (3-6)

其中,表示参数集合,表示真实值表示预测值,表示对总的误差值取平均,所以一般情况下,输出单元多少维,误差值求平均就除以多少;本模型设定中,输出值为2维列数据,故用误差值除以2。一般情况下,损失函数的期望值表示为:

                                                                                                                (3-6-1)

       这是一组n维数据的输出,若是有m组这样的数据,损失函数的期望值为:

                                     (3-6-2)

若真实值与输出值表示为,上式可表示为:

                                        (3-6-3)

一般情况下,输出数据为1维或是2维,输出的数据有多组。

    3)根据损失函数,计算输出单元的误差项和隐藏单元的误差项

       输出单元的误差项,即计算损失函数关于输出单元的梯度值或偏导数,根据链式法则有:

                                                          

                                      (3-7)

      隐藏单元的误差项,即计算损失函数关于隐藏单元的梯度值或偏导数,根据链式法则有:

                                                    

                       (3-8)

     PS: 对于复合函数中的向量或矩阵求偏导,复合函数内部函数的偏导总是左乘;对于复合函数中的标量求偏导,复合函数内部函数的偏导左乘或者右乘都可以。

   4) 更新神经网路中的权值和偏置项

       输出单元参数更新:                                      (3-9)

       隐藏单元参数更新:                                    (3-10)     

其中,表示学习率k=1,2,...,n表示更新次数或迭代次数,k=1表示第一次更新,以此类推。此处可能和别处博客不太一样,但实质是一样的,此处的'+'或者'-'主要取决于损失函数.

如何定义损失函数或者定义参数更新均可,但参数的更新一定是向参数的负梯度方向。

   5) 重复步骤2-4,直到损失函数小于事先给定的阈值或迭代次数用完为止,输出此时的参数即为目前最佳参数。

这便是BP算法的一个具体步骤,下面我们详细介绍BP算法步骤中的每一步

步骤1)初始化参数值(输出单元权值、偏置项和隐藏单元权值、偏置项均为模型的参数),是为激活前向传播,得到每一层元素的输出值,进而得到损失函数的值。参数初始化,可以自己设定,也可以选择随机生成;一般情况下,自己写代码或者调用tensorflow或keras时,都是随机生成参数。因为初始参数对最终的参数影响不大,只会影响迭代的次数。

步骤2)在步骤1的基础上,激活前向传播,得到的值,进而得到的值;其中的计算,根据前面模型设定中的公式计算。计算这些值是为计算步骤3中的误差项。

步骤3)计算各项误差,即计算参数关于损失函数的梯度或偏导数,之所以称之为误差,是因为损失函数本身为真实值与预测值之间的差异。计算参数的偏导数,根据的是微积分中的链式法则。具体推导如下:

输出单元的误差项:输出单元v与损失函数E,不是直接相关,而是通过复合函数的形式关联,以设定的模型为例:

          (3-11)

其中表示损失函数化为与参数v,b2相关的表达式。

根据链式法则,输出单元v与损失函数E的误差项为:

                                         (3-12)

求出上式中每一个偏导:

                                                          (3-13)

                                                     (3-14)

                                                (3-15)

                                              (3-16)

其中,关于激活函数求偏导,需要根据具体的激活函数而定,每一层的激活函数可以选择不同的函数,一般情况下,为简单化模型设计和求导方便,会设定为同一个函数。此处假设选择激活函数为sigmoid函数,那么有:

     (3-17)

PS:因为sigmoid(z)中z是标量,对z求偏导,有:

本文定义了z为向量,对于向量就有了式(3-17)的逐元素相乘的式子。

于是,为简化后面的计算,记

                               (3-18)

其中,表示第k次求损失函数关于的偏导;表示逐元素相乘,即两个向量或两个矩阵对应的元素相乘,例如:

于是,输出单元的误差项为:

                                            (3-19)

                               (3-20)

此处说明:若遇式(3-15)的偏导(对权值求偏导),链式法则处理方式均如式(3-19);若遇式(3-16)的偏导(对偏置项求偏导),链式法则处理方式均如式(3-20)。

隐藏单元的误差项:隐藏单元w与损失函数E,通过复合函数的形式关联,以设定的模型整理为:

         

                          (3-21)

根据链式法则,隐藏单元w与损失函数E的误差项为:

                        (3-22)

同样的求导法则,得到隐藏单元的误差项为:

                      (3-23)

(3-24)

其中:

                                 (3-25)

                    (3-26)

                                      (3-27)

                              (3-28)

说明:若遇式(3-25)(对隐藏单元求偏导),链式法则处理如式(3-23);式(3-15)和(3-26)同,故有相同的处理方式;式(3-16)和(3-27)同,故有相同的处理方式。

       补充:若有多个隐藏层时,逐步计算隐藏层的权值和偏置项误差,推导的规则同上。例如:一个隐藏层为2,隐藏单元为5的神经网络:

输出层到隐藏层2的误差项同式(3-19)

隐藏层2到隐藏层1的误差项为:

                           (3-29)

记:

                                        (3-30)

隐藏层1到输入层的误差项为:

                        (3-31)

从上述中,容易看出,无论多少层隐藏层,其误差项都是同样的结构。

步骤4) 更新神经网路中的权值和偏置项。学习率自己设定,学习率太大,容易跳过最佳的参数;学习率太小,容易陷入局部极小值。

步骤5) 设定阈值e或者设定迭代次数,当损失函数值小于阈值e时,或当迭代次数用完时,输出最终参数。

4、实例运用

为能更好理解BP算法和知道如何运用BP算法,下面以一个实际的例子来说明运用BP算法的具体操作。

有一组数据,目的是训练这两组数据,找到输入X计算得到Y的预测值尽可能接近于真实值的参数。设定模型:设计一个隐藏层为1,隐藏单元数为2,激活函数为sigmod函数的模型,运用反向传播算法,得到参数。网络如图5:

于是有:

                                       (4-1)

式(4-1)中,x表示net1后的h。

根据BP算法步骤:

1)初始化网络中的所有参数并给出学习率

2)激活前向传播,将参数带入式(4-1),并计算损失函数:

输入层-->隐藏层:

                       (4-2)

                        (4-3)

隐藏层-->输出层:

               (4-4)

(上式中x表示4-3中的h)

                    (4-5)

损失函数:

                            (4-6)

3)计算输出单元的误差项和隐藏单元的误差项

输出单元的误差项:根据公式(3-19),将带入其中,得到需更新的梯度误差:

如果对v中每一个元素求偏导,有:

用公式(3-19)和对v中每一个元素求偏导,得到的结果一致。

    隐藏单元的误差项:根据公式(3-23),将带入其中,得到需更新的梯度误差

若对w中每一个元素求偏导,有:

用公式(3-23)和对v中每一个元素求偏导,得到的结果一致。

  注意:一般情况下,不会对偏置项更新

4)更新神经网络中的权值

于是,得到第一次更新的参数值w,v。

5)重复步骤2-4,直到损失值达到了预先设定的阈值或迭代次数用完,得到最终的权值。

以上即为BP算法的更新权值的过程,下面将上述实例的推导过程用代码实现:

1.2 帝企鹅算法

2 部分代码

%% 2021.9.2  AFO 算法优化神经网络
% 2021.9.2 AFO algorithm optimizes neural network weights and thresholds
%% 这是使用原始算法的直接求解结果,添加专用于本问题的更新方式可以进一步提高精度
% This is the direct result of using the original algorithm,
% adding some specific update methods to this problem can further improve the accuracy
clc;
clear;
close all;
warning off
%% 固定随机数种子
noRNG=1;
rng('default')
rng(noRNG)
%% 载入数据
%% 数据预处理
load input
load output
%%
data.x=[input'];
data.y=[output];
num_Train=120; %训练集数量
data.len_train=num_Train;
num_Test=48; %测试集数量
index=randperm(num_Train+num_Test); %随机乱序
data.train_x=data.x(:,index(1:num_Train))';
data.train_y=data.y(:,index(1:num_Train))';
data.test_x=data.x(:,index(num_Train+1:end))';
data.test_y=data.y(:,index(num_Train+1:end))';
% 归一化
[data.train_x0,option.ps_x]=mapminmax(data.train_x');
data.train_x0=data.train_x0';
[data.train_y0,option.ps_y]=mapminmax(data.train_y');
data.train_y0=data.train_y0';
data.test_x0 = mapminmax('apply',data.test_x',option.ps_x);
data.test_x0=data.test_x0';
data.test_y0 = mapminmax('apply',data.test_y',option.ps_y);
data.test_y0=data.test_y0';
%%
data.weight=1;
data=data;
data.hiddenumber= [5];%隐含神经元数%% 未优化神经网络
clear result
[x(1,:),result(1)]=creat_x_1(option,data);
%draw(result(1),'未优化')
data.m=result(1).m;
data.n=result(1).n;
data.m_lw=result(1).m_lw;
data.n_lw=result(1).n_lw;
data.m_iw=result(1).m_iw;
data.n_iw=result(1).n_iw;
data.m_b=result(1).m_b;
data.n_b=result(1).n_b;
data.len=result(1).len;
[y(1),result(1)]=aimFcn_1(x(1,:),option,data,result(1).net);
%% 参数设置
lb=-5;
ub=5;
option.lb=lb;
option.ub=ub;
dim=length(x(1,:));
%%
option.dim=dim; %八个决策变量
lb=0;
ub=1;
option.lb=lb;
option.ub=ub;
if length(option.lb)==1option.lb=ones(1,option.dim)*option.lb;option.ub=ones(1,option.dim)*option.ub;
end
option.fobj=@aimFcn_1;
%option.fobj0=option.fobj;
option.showIter=0;
%% 算法参数设置 Parameters
% 基本参数
option.numAgent=10;        %种群个体数 size of population
option.maxIteration=100;    %最大迭代次数 maximum number of interation
% 帝企鹅算法
option.v_lb=-(option.ub-option.lb)/4;
option.v_ub=(option.ub-option.lb)/4;
option.w2=0.5; %weight of Moving strategy III
option.w4=1;%weight of Moving strategy III
option.w5=1;%weight of Moving strategy III
option.pe=0.01; % rate to judge Premature convergence
option.gap0=ceil(sqrt(option.maxIteration*2))+1;
option.gapMin=5; % min gap
option.dec=2;    % dec of gap
option.L=10;     % Catastrophe
str_legend=[{'AFO1'},{'AFO2'}];
%% Initialize population individuals (common to control experiment algorithm)
%% 初始种群生成
x=ones(option.numAgent,option.dim);
y=ones(option.numAgent,1);
for i=1:option.numAgent[x(i,:),result(i,1)]=creat_x_1(option,data);[y(i,1),result(i,1)]=aimFcn_1(x(i,:),option,data,result(i).net);
end
%% 使用算法求解
% Based on the same population, solve the selected  functions by using different algorithms
bestX=x;
rng(noRNG)
tic
[bestY(1,:),bestX(1,:),best_result1,recording(1)]=AFO1(x,y,result,option,data);
tt(1,1)=toc;
%%
figure
hold on
for i=1:length(recording)plot((recording(i).bestFit),'LineWidth',2)
end
legend(str_legend)
title('fitness curve')
%% 未优化神经网络
rng(7)
[x(1,:),result(1)]=creat_x_1(option,data);
[y(1),result(1)]=aimFcn_1(x(1,:),option,data,result(1).net);%%
figure
hold on
plot(result(1).ygabptest(i,:));
plot(best_result1.ygabptest(i,:));
plot(data.test_y(:,i));
legend(['未优化神经网络(mse=',num2str(result(1).mse(i)),')'],['AFO优化神经网络(mse=',num2str(best_result1.mse(i)),')'],['真实数据'])

3 仿真结果

4 参考文献

[1]李旭飞,王贞.求解约束优化问题的改进帝企鹅优化算法[J].计算机工程与设计,2021,42(03):703-710.

5 代码下载

基于帝企鹅算法优化BP神经网络实现数据预测matlab代码相关推荐

  1. 【预测模型】基于灰狼算法优化BP神经网络实现数据预测matlab代码

    1 简介 信息化时代的快速发展,给人们的生活带来了很大的便捷.越来越多的人习惯在网上办事.网络购物.在线支付,俨然成为了一种常态.通过网络来获取各类信息也更加方便,这就给网络钓鱼带来了肥沃的生存土壤. ...

  2. 【预测模型】基于布谷鸟算法优化BP神经网络实现数据预测matlab代码

    1 简介 针对当前智能算法对股票市场预测精度不高的问题,提出使用布谷鸟算法优化神经网络(CS-BP)的方法,对股票市场进行预测.并与粒子群算法优化神经网络模型(PSO-BP)和遗传算法优化神经网络模型 ...

  3. 【预测模型】基于人工鱼群算法优化BP神经网络实现数据预测matlab源码

    1 算法介绍 1.1 BP神经网络 1. 反向传播算法应用领域 反向传播算法应用较为广泛,从字面意思理解,与前向传播相互对应.在简单的神经网络中,反向传播算法,可以理解为最优化损失函数过程,求解每个参 ...

  4. 【BP预测】基于鸟群算法优化BP神经网络实现数据预测附Matlab代码

    1 简介 热舒适度是室内环境舒适性的评价指标,由于热舒适度的计算是一个复杂的非线性迭代过程,不便应用于空调实时控制系统中,为解决这一问题,可利用BP神经网络算法对热舒适度进行预测.但为了改善传统BP神 ...

  5. 【BP分类】基于鸟群算法优化BP神经网络实现数据分类附matlab代码

    1 简介 ​BSA 算法优化 BP 神经网络的基本思想是: 利 用 BSA 算法的全局搜索能力, 优化 BP 神经网络初始的权值和阈值, 也就是决策变量, 其中每一组决策变量均包含在鸟群个体所处的空间 ...

  6. 【预测模型】基于差分进化算法优化BP神经网络实现数据预测matlab源码

    1 算法介绍 2 部分代码 %% 差分进化算法应用于优化BP神经网络的初始权值和阈值%% 清空环境变量 clear all; clc; warning off load v357; load y357 ...

  7. 【ELAMN预测】基于灰狼算法优化ELMAN神经网络实现数据回归预测matlab代码

    1 简介 风能,作为一种重要,有潜力,无污染,可再生.可持续的能源,已经成为全球发电最为迅速的能源之一,越来越受到世界各国的青睐.近年来,为缓解能源短缺问题,改善环境,实现经济乃至人类的可持续发展,世 ...

  8. 【预测模型-BP分类】基于蝙蝠算法优化BP神经网络实现数据分类附matlab代码

    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信.

  9. 【回归预测-BP预测】基于灰狼算法优化BP神经网络实现数据回归预测附matlab代码

    1 内容介绍 Mirjalili 等在 2014 年 提 出 了 灰 狼 优 化 ( Grey Wolf Optimizer,GWO) 算法,是一种新型群智能优化算法,通过模拟自然界中灰狼寻找.包围和 ...

最新文章

  1. 爬虫之selenium开启无界面模式
  2. mui后端开发php,PHP解决mui中ajax的跨域问题
  3. ubuntu 18.04 64bit下如何安装安卓虚拟机anbox?
  4. PHP sprintf() 函数
  5. rust(29)-元组结构体
  6. [xsy3343]程序锁
  7. ubuntu16.04 Linux+xfce4的文件夹出现两种背景颜色+文件夹中右键打开终端失灵了.
  8. Docker04-镜像
  9. 米家扫地机器人重置网络_谁家扫地机器人悄声打扫更干净,科沃斯DEEBOT N3对比米家1S...
  10. 游戏设计亦或课件设计
  11. 普林斯顿微积分读本02第一章--函数的复合、奇偶函数、函数图像
  12. [Asp.Net WebApi]WebApi入门
  13. SOLIDWORKS软件转Dwg格式教程
  14. OSChina 周日乱弹 —— 你今天又穿女装上班了
  15. Java入门数据类型转换(羊驼)
  16. Project(1)——创建数据库、实体类、用户注册的持久层
  17. Windows自带压缩文件工具makecab命令详解
  18. 简要分析用MD5加密算法加密信息(如有疑问,敬请留言)
  19. 【编程不良人】快速入门Spring学习笔记08---事务属性、Spring整合Structs2框架(SM)、Spring整合Mybatis+Struts2(SSM)、Spring注解、SSM注解式开发
  20. 10款手机网页模板_手机wap网站模板_html5手机网站模板源码下载(三)

热门文章

  1. 计算机网络三级考试题型,计算机三级网络技术考试题型分析
  2. 计算机数学英语考本的分数线,专接本考试数学英语的成绩没有过公共线还有没有被..._公共英语考试_帮考网...
  3. SqlConnection,SqlDataAdapter,SqlCommand,SqlParameter
  4. BUUCTF笔记之Real部分WP(一)
  5. MongoDB未授权访问漏洞
  6. MySQL的外网访问配置
  7. 学习一个 Linux 命令:realpath 命令
  8. url action editor 快速修改swf链接
  9. 用最生动的语言重现经典!听我细细道来冯·诺依曼体系结构
  10. wireshark使用及过滤器介绍