BP神经网络基础知识及简单拟合实例

  • BP神经网络结构
  • 前向计算
  • 误差反向传播
    • 梯度下降法
    • 输出层参数调节
    • 隐含层参数调节
  • BP神经网络拟合实例

BP神经网络结构

BP神经网络(Back Propagation)是一种多层神经网络,其误差是反向传播的,因此称为BP神经网络。
BP神经网络包括输入层、隐含层和输出层三层,通常来说,隐含层的激活函数为
f 1 ( x ) = 1 1 + e − x f_1(x) = \frac {1}{1+e^{-x}} f1​(x)=1+e−x1​
输出层的激活函数为
f 2 ( x ) = x f_2(x)=x f2​(x)=x

前向计算

我们记BP神经网络具有n个输入层神经元,隐含层有 s 1 s_1 s1​个神经元,输出层有 s 2 s_2 s2​个神经元。其隐含层权值矩阵为 W 1 ∈ R s 1 × u W_1\in R^{s_1\times u} W1​∈Rs1​×u,偏置向量为 b 1 ∈ R s 1 b_1\in R^{s_1} b1​∈Rs1​,输出层权值矩阵为 W 2 ∈ R s 2 × s 1 W_2 \in R^{s_2\times s_1} W2​∈Rs2​×s1​,偏置向量为 b 1 ∈ R s 2 b_1\in R^{s_2} b1​∈Rs2​。
BP神经网络的前向计算过程可以分为:隐含层的输出计算和输出层的输出计算。
我们记隐含层的输出为 a ∈ R s 1 a\in R^{s_1} a∈Rs1​,输出层的输出为 y ∈ R s 2 y\in R^{s_2} y∈Rs2​。
一个神经元的计算过程包括两部分:

  1. 输入的线性组合
  2. 激活函数的计算

隐含层的输入为神经网络的输入 u ∈ R n u\in R^{n} u∈Rn,其输出为
a = f 1 ( W 1 u + b 1 ) a=f_1(W_1u+b_1) a=f1​(W1​u+b1​)
在matlab中,我们可以运用其矩阵运算来很方便的计算上式。
输出层的输入为隐含层的输出 a a a,其输出为
y = f 2 ( W 2 a + b 2 ) y=f_2(W_2a+b_2) y=f2​(W2​a+b2​)

误差反向传播

梯度下降法

通过有效的训练,BP神经网络可以具有逼近任何非线性函数的能力。定义神经网络的估计误差均方差
E = 1 2 ∑ i = 1 s 2 e i 2 = 1 2 ∑ i = 1 s 2 ( y d − y ) 2 E =\frac{1}{2}\sum_{i=1}^{s_2}e_i^2= \frac{1}{2} \sum_{i=1}^{s_2}(y_d-y)^2 E=21​i=1∑s2​​ei2​=21​i=1∑s2​​(yd​−y)2
其中, y d y_d yd​为期望的输出, y y y为神经网络对输出的预测(或者说估计)。
神经网络的训练过程为,通过误差不断调整神经网络的参数(权值和偏移量),使得网络的估计误差均方差最小。
梯度下降法便是一种最为常用的寻找目标函数(即误差均方差函数 E E E)的方法。其基本原理为,沿着目标函数的梯度方向,目标函数是下降最快的。

输出层参数调节

基于上文,我们可以知道,调节权值矩阵 W 2 W_2 W2​的最快方法为
Δ W 2 i j = − η ∂ E ∂ W 2 i j \Delta W_{2ij} = -\eta \frac{\partial E}{\partial W_{2ij}} ΔW2ij​=−η∂W2ij​∂E​
可以将上式表示为矢量形式,对权值矩阵的一整行进行操作,记权值矩阵 W 2 W_2 W2​的第 i ( i = 1 , 2 , . . . s 2 ) i(i=1,2,...s_2) i(i=1,2,...s2​)行为 W 2 i 0 W_{2i0} W2i0​,可知,此行元素通过影响第 i i i个输出,进而影响到最后的误差。权值矩阵 W 2 W_2 W2​第 i i i行的更新值为
Δ W 2 i 0 = − η ∂ E ∂ W 2 i 0 \Delta W_{2i0} = -\eta \frac{\partial E}{\partial W_{2i0}} ΔW2i0​=−η∂W2i0​∂E​
可以通过链式法则来计算,即偏微分如下形式
∂ E ∂ W 2 i 0 = ∂ E ∂ e i ∂ e i ∂ f 2 ∂ f 2 ∂ W 2 i 0 = − e i f 2 ′ a T \frac{\partial E}{\partial W_{2i0}}=\frac{\partial E}{\partial e_i} \frac{\partial e_i}{\partial f_2} \frac{\partial f_2}{\partial W_{2i0}}=-e_if_2'a^T ∂W2i0​∂E​=∂ei​∂E​∂f2​∂ei​​∂W2i0​∂f2​​=−ei​f2′​aT
那么,可以得到,输出层权值矩阵 W 2 W_2 W2​第 i i i行的更新律为
Δ W 2 i 0 = η e i f 2 ′ a T \Delta W_{2i0} = \eta e_if_2'a^T ΔW2i0​=ηei​f2′​aT
类似的,可以得到偏移量 b 2 b_2 b2​的更新律为
Δ b 2 i = η e i f 2 ′ \Delta b_{2i} = \eta e_if_2' Δb2i​=ηei​f2′​

隐含层参数调节

隐含层参数矩阵和偏移量的更新方法是一样的,同样是对误差平方差进行求偏导得到,但是要复杂很多。权值矩阵 W 1 W_1 W1​的第 i i i行是通过隐含层所有神经元来影响最终的网络输出的,因此,其更新律为
Δ W 1 j 0 = − η ∑ k = 1 s 2 ( ∂ E ∂ e k ∂ e k ∂ f 2 ∂ f 2 ∂ a j ∂ a j ∂ W 1 j 0 ) = η f 2 ′ u ∑ k = 1 s 2 ( e k W 2 k j ) f 1 ′ \Delta W_{1j0} = -\eta \sum_{k=1}^{s_2}(\frac{\partial E}{\partial e_k} \frac{\partial e_k}{\partial f_2} \frac{\partial f_2}{\partial a_j} \frac{\partial a_j}{\partial W_{1j0}}) = \eta f_2'u \sum_{k=1}^{s_2}(e_kW_{2kj})f_1' ΔW1j0​=−ηk=1∑s2​​(∂ek​∂E​∂f2​∂ek​​∂aj​∂f2​​∂W1j0​∂aj​​)=ηf2′​uk=1∑s2​​(ek​W2kj​)f1′​
表示为矩阵运算形式为
Δ W 1 = η A ′ W 2 T Y ′ e u T \Delta W_1 = \eta \bm{A}'\bm{W}_2^T\bm{Y}'\bm{e} \bm{u}^T ΔW1​=ηA′W2T​Y′euT
其中, A ′ = d i a g [ f 1 j ′ ] s 1 × s 1 \bm{A}'=diag[f_{1j}']_{s_1\times s_1} A′=diag[f1j′​]s1​×s1​​, Y ′ = d i a g [ f 2 j ′ ] s 2 × s 2 \bm{Y}'=diag[f_{2j}']_{s_2 \times s_2} Y′=diag[f2j′​]s2​×s2​​为对角阵。
类似的,偏移量 b 1 b_1 b1​的更新律只与权值 W 1 W_1 W1​相差一个因子 u u u
Δ b 1 j = η f 2 ′ f 1 ′ ∑ k = 1 s 2 ( e k W 2 k j ) \Delta b_{1j} = \eta f_2'f_1' \sum_{k=1}^{s_2}(e_kW_{2kj}) Δb1j​=ηf2′​f1′​k=1∑s2​​(ek​W2kj​)
化为矩阵运算形式为
Δ b 1 = η A ′ W 2 T Y ′ e \Delta \bm{b}_1 = \eta \bm{A}'\bm{W}_2^T\bm{Y}'\bm{e} Δb1​=ηA′W2T​Y′e

BP神经网络拟合实例

采用BP神经网络对正弦函数 y = s i n ( t ) y=sin(t) y=sin(t)进行拟合。网络结构设置为1-20-1,代码如下

% 训练简单的BP神经网络来拟合,自己写训练算法
clear,clc
%% 生成训练数据
ts = 0.01;
u1 = 0;
y1 = 0;for k=1:1000u(k) = k*ts;y(k) = sin(u(k));
end
n = length(u);

训练算法主体部分

%% 训练算法
% 采用的BP神经网络为1-20-1的结构
yita = 0.1;     %训练速度
num_h = 20;
w1 = rand(num_h,1);
% w1 = ones(num_h,1);
w2 = rand(num_h,1);
% w2 = ones(num_h,1);
b1 = zeros(num_h,1);
b2 = 0;
e_tol = 1e-3;
e = e_tol;
cnt = 1;
while cnt<10000 && e>=e_tol% 打乱数据idx_rand = randperm(n);x_train = y(idx_rand);    %网络输出u_train = u(idx_rand);    %网络输入e = 0;for i=1:400%神经网络前向计算for j = 1:num_hH_input(j) = u_train(i)*w1(j)+b1(j);H_output(j) = logsig(H_input(j));endOutput(i) = dot(H_output,w2)+b2;%误差反向传播Error(i) = x_train(i) - Output(i);for j=1:num_hDelta_w2(j) = yita*Error(i)*H_output(j);Dlogsig(j) = H_output(j)*(1-H_output(j));Delta_w1(j) = yita*Error(i)*w2(j)*Dlogsig(j)*u_train(j);w1(j) = w1(j)+Delta_w1(j);w2(j) = w2(j)+Delta_w2(j);b1(j) = b1(j) + yita*Error(i)*w2(j)*Dlogsig(j);endb2 = b2 + yita*Error(i);e = e + Error(i)^2/2;ende = e/400;e_store(cnt) = e;cnt = cnt+1;
end

检测训练结果,并进行可视化

%% 检验训练结果
for i = 1:n
%     k = randi(1000);u_test = u(i);x_test = y(i);for j=1:num_hH_input_test(j) = u_test*w1(j)+b1(j);H_output_test(j) = logsig(H_input_test(j));endOutput_test(i) = dot(H_output_test,w2)+b2;
%     Output_test(i) = net_BP(u_test(i),w1,w2,b1,b2);Error_test(i) = x_test-Output_test(i);end
time = u;
figure(2)
plot(time(1:n),y(1:n),'r');
hold on
plot(time(1:n),Output_test,'b--');
hold on
plot(time(1:n),Error_test,'g-.');
legend('train','test','error');

神经网络拟合结果如下

BP神经网络及拟合实例相关推荐

  1. 基于遗传算法的BP神经网络齿轮箱故障诊断实例

    一.BP神经网络概述 BP网络是一类多层的前馈神经网络.它的名字源于在网络训练的过程中,调整网络的权值的算法是误差的反向传播的学习算法,即为BP学习算法.BP算法是 Rumelhart等人在1986年 ...

  2. bp神经网络数据预测实例,bp神经网络实例分析

    BP人工神经网络方法 (一)方法原理人工神经网络是由大量的类似人脑神经元的简单处理单元广泛地相互连接而成的复杂的网络系统.理论和实践表明,在信息处理方面,神经网络方法比传统模式识别方法更具有优势. 人 ...

  3. matlab神经网络过拟合,BP神经网络过拟合问题

    如果样本比较多的话可以用 [trainV,valV,testV] = dividevec(p,t,valPercent,testPercent),然后运用 net = train(net,trainV ...

  4. BP神经网络简单应用实例,bp神经网络的设计方法

    需要把MATLAB中的BP神经网络工具箱与自己的一个软件项目结合 这个就是C++与matlab混合编程.但是神经网络工具箱比较特别,它反盗用比较严厉.采用传统的混编方式,可以调用matlab自己的函数 ...

  5. bp神经网络matlab设计实例,bp神经网络matlab实例(bp神经网络matlab实例).doc

    bp神经网络matlab实例(bp神经网络matlab实例).doc bp神经网络matlab实例(bp神经网络matlab实例)Case 1 training BP network by momen ...

  6. BP神经网络原理与异或实例分析

    文章目录 BP神经网络原理介绍 一.BP神经网络算法原理是什么? 二.激活函数 1.激活函数作用 三.BP神经网络异或实例分析 1.问题: 2.分析: 3.代码 总结 BP神经网络原理介绍 BP神经网 ...

  7. 神经网络怎么解决过拟合,解决神经网络过拟合

    如何防止神经网络过拟合,用什么方法可以防止? 你这个问题本来就问的很模糊,你是想问神经网络的过拟合变现什么样还是为什么出现过拟合呢. 为此针对于第一个问题,神经网络的过拟合与支持向量机.高斯混合模型等 ...

  8. BP神经网络实现汽油辛烷值预测,《MATLAB源码+数据集》

    发展背景 在人工神经网络的发展历史上,感知机(Multilayer Perceptron,MLP)网络曾对人工神经网络的发展发挥了极大的作用,也被认为是一种真正能够使用的人工神经网络模型,它的出现曾掀 ...

  9. [机器学习算法]BP神经网络原理简介

    M-P神经元模型 神经元接收到来自个其他神经元传递过来的输入信号,这些输入信号通过带权重的连接进行传递,神经元接收的总输入值将于神经元的阈值进行比较,然后通过"激活函数"处理以产生 ...

最新文章

  1. python输入input的用法
  2. 2016总结 - 我的转型之路
  3. 成功解决ValueError: DataFrame.dtypes for label must be int, float or bool
  4. git pull 是到工作区还是暂存区_每天一Git之简单理解工作区和暂存区
  5. Python,yyds!
  6. php 进行http请求,PHP模拟http请求的方法详解
  7. 【MySQL】MySQL 查询优化器的提示(hint)
  8. Python脚本覆盖率分析方法介绍
  9. 关于man命令后面加数字
  10. 把计算机从桌面删除了怎么办,我把“我的电脑”在桌面上的快捷方式删除了 怎么还原...
  11. Visio 下载,及密钥
  12. 我是一个粉刷匠用计算机弹,《我是一个粉刷匠》,钢琴双手弹的谱子,,,急用,,,谢谢...
  13. 带你了解什么叫大数据分析
  14. ncbi查找目的基因序列_如何获得基因序列——在NCBI中查找目的基因实例.PDF
  15. Java——匿名内部类
  16. 架构师到底要做什么?
  17. 华为天才少年稚晖君自制硬萌机器人,开源 5 天,GitHub 收获 2900 星!
  18. 2019智能手表推荐_2020年买什么智能手表合适?
  19. 东南大学计算机专硕录取分数线,东南大学研究生录取分数线
  20. java查看附近门店_微信公众号获取用户地理位置并列出附近的门店的示例代码...

热门文章

  1. linux参数tw_re,linux 系统调优参数
  2. 1.7 controller
  3. Linux 2.6 调度系统分析
  4. 工程流体力学笔记暂记38 (微弱扰动的传播速度)
  5. 快手给好友发消息显示服务器繁忙,发语音对方忙线中是什么意思
  6. java的implements_java中implements是什么意思?在什么时候使用?
  7. 计算机主机清洁方法,实验室设备维护之电脑主机的清洁
  8. Django缓存清理和缓存设置
  9. js求两圆交点_谈谈求线段交点的几种算法(js实现,完整版)
  10. 用Javascript实现下拉菜单