BP神经网络原理与如何实现BP神经网络

本文部分图文来自《老饼讲解-BP神经网络》bp.bbbdata.com

目录

一、BP神经网络的背景生物学原理

二、BP神经网络模型

2.1 BP神经网络的结构

2.2 BP神经网络的激活函数

三、BP神经网络的误差函数

四、BP神经网络的训练

4.1 BP神经网络的训练流程

4.2 BP神经网络的训练流程图

五、自行实现BP神经网络

六、借助matlab工具箱实现BP神经网络

七、关于BP神经网络的正向传播与反向传播


BP(back propagation)神经网络是一种按照误差逆向传播算法训练的多层前馈神经网络,由Rumelhart和McClelland为首的科学家于1986年提出。它是应用最广泛的神经网络模型之一,能学习和存贮大量的输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。

一、BP神经网络的背景生物学原理

BP神经网络的设计思路是什么呢?它借鉴于人脑的工作原理
在眼睛看到符号“5”的后,大脑将判别出它是5。
BP正是要模仿这个行为,把这个行为过程简单拆分为: 
  (1)  眼睛接受了输入                    
  (2)  把输入信号传给其它脑神经元        
  (3)  脑神经元综合处理后,输出结果为5   
我们都知道, 神经元与神经元之间是以神经冲动的模式进行传值,信号到了神经元,都是以电信号的形式存在,
当电信号在神经元积累到超过阈值时,就会触发神经冲动,将电信号传给其它神经元。                                 
正是根据这个思路,就构造出了以上的神经网络结构         

二、BP神经网络模型

2.1 BP神经网络的结构

BP神经网络模型拓扑结构包括输入层(input)、隐层(hidden layer)和输出层(output layer)。

BP神经网络的结构包括输入层、输出层和若干层隐含层,每层都有若干个节点,层与层之间节点的链接状态通过权重来体现。其中,输入层的节点个数等于输入的维度,输出层的节点个数等于输出的维度,而隐含层的节点个数可以根据实际情况自行设定。在BP神经网络中,每个节点都包含一个感知器(即一个单独的神经元),其包含输入项、权重、偏置、激活函数和输出。在正向传播过程中,输入数据经过感知器节点的计算后,通过激活函数的处理得到输出结果;而在反向传播过程中,将结果与期望结果进行比较,通过多次迭代不断调整网络上各个节点的权重。

一个三层的BP神经网络模型如下:

一个多层的BP神经网络模型如下:

  它每层的计算公式为

\text{y}=T(WX+b) 

其中,T代表的是激活函数,b代表的是激活阈值,W代表的是连接权重 

对于多层网络,采用的是前馈传播的方式进行计算,即每一层都按以上的公式进行计算,直到最后一个输出层。

2.2 BP神经网络的激活函数

BP神经网络的激活函数最常用的为以下两种:

tansig函数为S型函数:  \text{y} = \dfrac{2}{1+e^{-2x}} -1
purelin 为恒等线性映射函数: \text{y}=x

三、BP神经网络的误差函数

 BP神经网络的误差函数为均方差函数:

\displaystyle \displaystyle \textbf{E}(W,b)=\dfrac{1}{m}\sum \limits _{i=1}^{m} \dfrac{1}{k}\sum \limits _{j=1}^{k} (\hat{\text{y}}_{ij}-\text{y}_{ij})^2 

其中,m为训练样本个数,k为输出个数,

\hat{\text{y}}_{ij}为第i个样本第j个输出的预测值,\text{y}_{ij}为对应的真实值。

四、BP神经网络的训练

BP神经网络的学习也就是就是求解一组W、b,使得BP神经网络的误差函数最小。

4.1 BP神经网络的训练流程

BP神经网络的训练采用反向传播算法(Back Propagation),反向传播是一种优化算法,通过不断调整网络中各个神经元之间的连接权值,使得神经网络能够对输入和输出之间的映射关系进行学习。具体来说,反向传播算法通过计算每一层的状态和激活值,从最后一层向前推进计算误差,并更新参数以最小化网络的预测输出与实际输出之间的误差。这个过程会不断迭代,直到满足停止准则(比如相邻两次迭代的误差差别很小)。

总的来说,就是每迭代一步,就使误差下降一小步,最终求得一个局部最优的权重和阈值,

BP的训练算法流程:

1.初始化权重、阈值

2.计算权重、阈值的梯度

3.将权重、阈值往负梯度方向迭代

4.检查是否终止条件,否则重复2.3

4.2 BP神经网络的训练流程图

BP神经网络训练流程图如下:

五、自行实现BP神经网络

自行编写代码求解BP神经网络

现有如下数据: 
 

y实际是由 \color{blue}\text{y}=\text{sin}(x_1)+0.2*x_2^2生成
现在需要利用数据训练一个BP神经网络,对其进行拟合,
并测试网络的预测结果与真实结果 \color{blue}\text{y}=\text{sin}(x_1)+0.2*x_2^2的差异

下面是 梯度下降法 求解 BP神经网络 的代码实现
  matla2018 a 已新测跑通

close all;clear all;
%-----------数据----------------------
x1 = [-3,-2.7,-2.4,-2.1,-1.8,-1.5,-1.2,-0.9,-0.6,-0.3,0,0.3,0.6,0.9,1.2,1.5,1.8];% x1:x1 = -3:0.3:2;
x2 = [-2,-1.8,-1.6,-1.4,-1.2,-1,-0.8,-0.6,-0.4,-0.2,-2.2204,0.2,0.4,0.6,0.8,1,1.2]; % x2:x2 = -2:0.2:1.2;
X  = [x1;x2];      % 将x1,x2作为输入数据
y  = [0.6589,0.2206,-0.1635,-0.4712,-0.6858,-0.7975,-0.8040,...-0.7113,-0.5326,-0.2875 ,0.9860,0.3035,0.5966,0.8553,1.0600,1.1975,1.2618];    % y: y = sin(x1)+0.2*x2.*x2;%--------参数设置与常量计算-------------
setdemorandstream(88);
hide_num = 3;
lr = 0.05;
[in_num,sample_num] = size(X);
[out_num,~] =  size(y);%--------初始化w,b和预测结果-----------
w_ho = rand(out_num,hide_num);   % 隐层到输出层的权重 
b_o  = rand(out_num,1);          % 输出层阈值
w_ih = rand(hide_num,in_num);    % 输入层到隐层权重
b_h  = rand(hide_num,1);         % 隐层阈值
simy = w_ho*tansig(w_ih*X+repmat(b_h,1,size(X,2)))+repmat(b_o,1,size(X,2)); % 预测结果
mse_record = [sum(sum((simy - y ).^2))/(sample_num*out_num)];  % 预测误差记录% ---------用梯度下降训练------------------
for i = 1:5000%计算梯度hide_Ac = tansig(w_ih*X+repmat(b_h,1,sample_num)); % 隐节点激活值dNo     = 2*(simy - y )/(sample_num*out_num);      % 输出层节点梯度dw_ho   = dNo*hide_Ac';                            % 隐层-输出层权重梯度db_o    = sum(dNo,2);                              % 输出层阈值梯度dNh     = (w_ho'*dNo).*(1-hide_Ac.^2);             % 隐层节点梯度dw_ih   = dNh*X';                                  % 输入层-隐层权重梯度db_h    = sum(dNh,2);                              % 隐层阈值梯度%往负梯度更新w,bw_ho = w_ho - lr*dw_ho;                            % 更新隐层-输出层权重 b_o  = b_o  - lr*db_o;                             % 更新输出层阈值w_ih = w_ih - lr*dw_ih;                            % 更新输入层-隐层权重 b_h  = b_h  - lr*db_h;                             % 更新隐层阈值% 计算网络预测结果与记录误差simy = w_ho*tansig(w_ih*X+repmat(b_h,1,size(X,2)))+repmat(b_o,1,size(X,2));mse_record =[mse_record, sum(sum((simy - y ).^2))/(sample_num*out_num)];
end% -------------绘制训练结果与打印模型参数-----------------------------
h = figure;
subplot(1,2,1)
plot(mse_record)
subplot(1,2,2)
plot(1:sample_num,y);
hold on
plot(1:sample_num,simy,'-r');
set(h,'units','normalized','position',[0.1 0.1 0.8 0.5]);
%--模型参数--
w_ho   % 隐层到输出层的权重 
b_o    % 输出层阈值
w_ih   % 输入层到隐层权重
b_h    % 隐层阈值

运行结果:

在训练过程中,还需要注意以下几点:

  1. 激活函数的选择:常用的激活函数包括Sigmoid函数、Purelin函数等(对于深度学习,一般还会选择Relu等函数),需要根据具体问题选择合适的激活函数。
  2. 初始权重的选择:权重的初始值对网络的训练结果有很大的影响,需要进行适当的选择。
  3. 学习率的选择:学习率决定了每次更新权重的幅度,太大的学习率可能导致训练不稳定,太小的学习率则会导致训练速度变慢。
  4. 迭代次数和停止条件的选择:需要根据问题的复杂程度和数据集的大小来确定迭代次数和停止条件。
  5. 正则化方法的选择:正则化方法可以防止过拟合现象的发生,常用的正则化方法包括L1正则化、L2正则化等。

 

六、借助matlab工具箱实现BP神经网络

借助matlab工具箱实现BP神经网络却较为简单,只需调用newff函数构建网络,并设置相应的参数进行训练就可以,代码如下:

x1 = [-3,-2.7,-2.4,-2.1,-1.8,-1.5,-1.2,-0.9,-0.6,-0.3,0,0.3,0.6,0.9,1.2,1.5,1.8];   % x1:x1 = -3:0.3:2;
x2 = [-2,-1.8,-1.6,-1.4,-1.2,-1,-0.8,-0.6,-0.4,-0.2,-2.2204,0.2,0.4,0.6,0.8,1,1.2]; % x2:x2 = -2:0.2:1.2;
y  = [0.6589,0.2206,-0.1635,-0.4712,-0.6858,-0.7975,-0.8040,...-0.7113,-0.5326,-0.2875 ,0,0.3035,0.5966,0.8553,1.0600,1.1975,1.2618];    % y: y = sin(x1)+0.2*x2.*x2;inputData  = [x1;x2];      % 将x1,x2作为输入数据
outputData = y;            % 将y作为输出数据
setdemorandstream(88888);%指定随机种子,这样每次训练出来的网络都一样。%使用用输入输出数据(inputData、outputData)建立网络,
%隐节点个数设为3.其中隐层、输出层的传递函数分别为tansig和purelin,使用trainlm方法训练。net = newff(inputData,outputData,3,{'tansig','purelin'},'trainlm');%设置一些常用参数
net.trainparam.goal = 0.0001;               % 训练目标:均方误差低于0.0001
net.trainparam.show = 400;                  % 每训练400次展示一次结果
net.trainparam.epochs = 15000;              % 最大训练次数:15000.
[net,tr] = train(net,inputData,outputData); % 调用matlab神经网络工具箱自带的train函数训练网络simout = sim(net,inputData);                % 调用matlab神经网络工具箱自带的sim函数得到网络的预测值
figure;                                     % 新建画图窗口窗口
t=1:length(simout);
plot(t,y,t,simout,'r')                      % 画图,对比原来的y和网络预测的y

运行结果:

第一个图是matlab训练过程的示图,第二个图是BP神经网络的拟合结果(红色)与原始数据(蓝色)的曲线

七、关于BP神经网络的正向传播与反向传播

BP神经网络的计算过程包括正向传播和反向传播两个阶段。

在正向传播阶段,输入数据通过输入层进入网络,经过隐含层和输出层的计算后得到输出结果。每一层的神经元之间存在连接关系,连接的权重和偏置都可以通过训练进行学习和调整。在正向传播过程中,输入数据经过感知器节点的计算后,通过激活函数的处理得到输出结果。

在反向传播阶段,将输出结果与期望结果进行比较,计算误差,然后从输出层向隐层逐层反向传播误差,并更新网络中各神经元的权重和偏置,以减小误差。这个过程会不断迭代,直到满足停止准则。在反向传播过程中,根据梯度下降法,利用梯度搜索技术来更新权重和偏置。

在BP神经网络的计算过程中,需要选择合适的激活函数、初始权重、学习率、迭代次数和停止条件等参数,以保证网络的训练效果和泛化能力。

好了,这就是BP神经网络


更多文章

相关文章
1-LVQ的学习目录:老饼|BP神经网络-竞争神经网络
2-径向基神经网络学习目录:老饼|BP神经网络-感知机与SVM
3-BP的学习目录:老饼|BP神经网络-BP入门

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/151241.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【运维篇】5.6 Redis server 主从复制配置

文章目录 0. 前言1. 配置方式步骤1: 准备硬件和网络步骤2: 安装Redis步骤3: 配置主服务器的Redis步骤4: 配置从服务器的Redis步骤5: 测试复制功能步骤6: 监控复制状态 2. 参考文档 0. 前言 在Redis运维篇的第5.6章节中,将讨论Redis服务器的主从复制配置。在开始之前…

如何实现MATLAB与Simulink的数据交互

参考链接:如何实现MATLAB与Simulink的数据交互 MATLAB是一款强大的数学计算软件,Simulink则是一种基于模型的多域仿真平台,常用于工程和科学领域中的系统设计、控制设计和信号处理等方面。MATLAB和Simulink都是MathWorks公司的产品&#xff0…

数据结构【DS】图的应用

图的连通性问题 最少边数 最多边数 无向图非连通 𝒎𝟎 𝒎𝒏−𝟐∗(𝒏−𝟏)/𝟐 无向图连通 𝒎𝒏−𝟏 𝒎𝒏∗(&#…

在Sprinng Boot中使用Redis充当缓存

关于我们使用EhCache可以适应很多的应用场景了,但是因为EhCache是进程内的缓存框架,在集群模式下,我们在我们的应用服务器或者云服务器之间的缓存都是独立的。故而在不同的服务器之间的进程会存在缓存不一致的情况,就算我们的EhCa…

word批量图片导出wps office word 图片批量导出

word批量导出图片教程 背景 今天遇到了一个场景,因为word里的图片打开看太模糊了,如果一个一个导出来太麻烦。想批量将word中的图片全部导出 但是,wps导出的时候需要会员 教程开始: 将word保存为 .docx 格式,可以按F1…

Golang 协程、主线程

Go协程、Go主线程 原先的程序没有并发和并行的概念,没有多核的概念,就是一个进程打天下。后面发现这个效率太低了,就搞出了线程,这样极大的发挥CPU的效率,因为硬件总是比软件发展的快。 现在go考虑的是能不能让多核cp…

【数据结构】C语言实现队列

目录 前言 1. 队列 1.1 队列的概念 1.2 队列的结构 2. 队列的实现 2.1 队列的定义 2.2 队列的初始化 2.3 入队 2.4 出队 2.5 获取队头元素 2.6 获取队尾元素 2.7 判断空队列 2.8 队列的销毁 3. 队列完整源码 Queue.h Queue.c 🎈个人主页&#xff1a…

【数据结构】树与二叉树(廿一):树和森林的遍历——先根遍历(递归算法PreOrder、非递归算法NPO)

文章目录 5.1 树的基本概念5.1.1 树的定义5.1.2 森林的定义5.1.3 树的术语 5.2 二叉树5.3 树5.3.1 树的存储结构1. 理论基础2. 典型实例3. Father链接结构4. 儿子链表链接结构5. 左儿子右兄弟链接结构 5.3.2 获取结点的算法5.3.3 树和森林的遍历1. 先根遍历(递归&am…

<b><strong>,<i><em>标签的区别

1. b标签和strong标签 b标签:仅仅是UI层面的加粗样式,并不具备HTML语义 strong标签:不仅是在UI层面的加粗样式,具备HTML语义,表示强调 2. i标签和em标签 i 标签:仅仅是UI层面的斜体样式,并不…

HTML5学习系列之实用性标记

HTML5学习系列之实用性标记 前言实用性标记高亮显示进度刻度时间联系信息显示方向换行断点标注 总结 前言 学习记录 实用性标记 高亮显示 mark元素可以进行高亮显示。 <p><mark>我感冒了</mark></p>进度 progress指示某项任务的完成进度。 <p…

(c语言进阶)内存函数

一.memcpy(void* dest,void* src,int num) &#xff0c;操作单位为字节&#xff0c;完成复制且粘贴字符串 1.应用 #include <stdio.h> #include<string.h> int main() {int arr1[] { 1,2,3,4,5,6,7,8,9,10 };int arr2[20] { 0 };memcpy(arr2, arr1, 20);//从…

Linux - 用户级缓冲区和系统缓冲区 - 初步理解Linux当中文件系统

前言 文件系统 我们先来看两个例子&#xff1a; 这个程序输出&#xff1a; 此时的输出也满足的我们预期。 我们也可以把 程序执行结果&#xff0c;输出重定向到 一个文件当中: 当我们在代码的结尾处&#xff0c;创建了子进程&#xff0c;那么输出应该还是和上述是一样的&…

Day35力扣打卡

打卡记录 相邻字符不同的最长路径&#xff08;树状DP&#xff09; 链接 若节点也存在父节点的情况下&#xff0c;传入父节点参数&#xff0c;若是遍历到父节点&#xff0c;直接循环里 continue。 class Solution:def longestPath(self, parent: List[int], s: str) -> in…

基于Vue+SpringBoot的医院门诊预约挂号系统 开源项目

项目编号&#xff1a; S 033 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S033&#xff0c;文末获取源码。} 项目编号&#xff1a;S033&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 功能性需求2.1.1 数据中心模块2.1.2…

数电实验-----实现74LS153芯片扩展为8选1时间选择器以及应用(Quartus II )

目录 一、74LS153芯片介绍 管脚图 功能表 二、4选1选择器扩展为8选1选择器 1.扩展原理 2.电路图连接&#xff08;Quartus II &#xff09; 3.仿真结果 三、8选1选择器的应用 1.三变量表决器 2.奇偶校验电路 一、74LS153芯片介绍 74ls153芯片是属于四选一选择器的芯片。…

【运维篇】Redis 性能测试工具实践

文章目录 1. 前言2. Redis性能测试工具2.1 Redis-benchmark2.1.1 何为Redis-benchmark2.1.2 Redis-benchmark的特点2.1.3 如何使用Redis-benchmark可选的参数 2.2 Memtier_benchmark2.2.1 何为Memtier_benchmark2.2.2 Memtier_benchmark的特点2.2.3 如何使用Memtier_benchmark …

【AI视野·今日Robot 机器人论文速览 第六十五期】Mon, 30 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Mon, 30 Oct 2023 Totally 18 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers Gen2Sim: Scaling up Robot Learning in Simulation with Generative Models Authors Pushkal Katara, Zhou Xian, Katerina F…

网工内推 | 国企、港企网工,年底双薪,NA以上认证即可

01 中航期货有限公司 招聘岗位&#xff1a;信息技术部-网络工程师 职责描述&#xff1a; 1、负责总部、分支机构、外联单位网络的日常运维、故障和应急处置&#xff0c;特别是定期监测设备的运行状态&#xff0c;对存在隐患的地方及时发现改正&#xff0c;保持网络稳定通畅&am…

React 中 react-i18next 切换语言( 项目国际化 )

背景 平时中会遇到需求&#xff0c;就是切换语言&#xff0c;语种等。其实总的来说都是用i18n来实现的 思路 首先在项目中安装i18n插件&#xff0c;然后将插件引入到项目&#xff0c;然后配置语言包&#xff08;语言包需要你自己来进行配置&#xff0c;自己编写语言包&#xff…

接口自动化项目落地之HTTPBin网站

原文&#xff1a;https://www.cnblogs.com/df888/p/16011061.html 接口自动化项目落地系列 找个开源网站或开源项目&#xff0c;用tep实现整套pytest接口自动化项目落地&#xff0c;归档到电子书&#xff0c;作为tep完整教程的项目篇一部分。自从tep完整教程发布以后&#…