BP神经网络算法原理-bp神经网络模型-bp神经网络代码matlab-学习笔记

在学习一段时间后,开始有些知识有些遗忘,所以整理一下,作为自己的学习笔记,以及帮助其他人学习。其中,大部分参考自《老饼讲解-BP神经网络》,

目录

一、什么是BP神经网络

1.1.BP神经网络原理

1.2.BP神经网络结构

二、BP神经网络如何训练

2.1.BP神经网络的误差函数

2.2.梯度下降算法训练BP神经网络

三、如何用Matlab来实现BP神经网络

四、如何自己写代码实现一个BP神经网络


一、什么是BP神经网络

1.1.BP神经网络原理

bp神经网络全称为Back Propagation Neural Network,简称为BPNN

BP神经网络的原理就像下面的图一样,模仿人的大脑的原理,把看到的东西作为输入,然后经过大脑,最后作为输出。

1.2.BP神经网络结构

BP神经网络在这个思想下,构造了下面的数学模型:

它的数学表达式如下:

这是一个只有一个隐层的BP神经网络(加上输入层、输出层,称为三层BP神经网络),

BP神经网络也可以有多个隐层,多层的BP神经网络结构图如下:

多个隐层的BP神经网络的数学表达式进行套娃就可以了,

学习时先用三层的进行理解,因为三层的使用得较多。

二、BP神经网络如何训练

2.1.BP神经网络的误差函数

BP使用均方差函数来评估网络的误差,它的公式如下:

m,k分别是样本个数与输出变量个数。误差越小,说明模型越好。

2.2.梯度下降算法训练BP神经网络

BP神经网络可以使用梯度下降算法进行训练,梯度下降算法就是先初始化BP神经网络的参数w,b,然后不断地往负梯度方向调整,使得模型的误差越来越小,最后求得最优解:

梯度下降算法需要使用参数在误差函数中的梯度,BP神经网络梯度公式如下:

MARK一下,后面我们会用到这条公式来实现代码。如果公式不太明白,可以看原文《BP神经网络的梯度公式推导(三层结构)》中的推导,了解了推导过程就比较清楚了。

三、如何用Matlab来实现BP神经网络

matlab提供了一个工具箱来实现BP神经网络,bp神经网络模型matlab工具箱还提供了非常多的训练算法,不过默认一般使用trainlm算法。BP神经网络matlab代码示例如下:

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,0,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

运行后得到的结果如下:

在代码中我们用到newff函数,train函数,sim函数,具体的意义可以参考matlab-BP神经网络工具箱-newff、train、sim详解icon-default.png?t=N7T8https://www.bbbdata.com/text/385

四、如何自己写代码实现一个BP神经网络

如果不想借助matlab工具箱,还可以自己写代码实现BP神经网络,这就需要用到梯度下降法与上面的梯度公式,具体代码如下:

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,b
    w_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    % 隐层阈值

代码运行后的结果如下:

可以看到结果拟合得非常好。


理解完上面的代码,基本也就学会BP神经网络了。

  • 13
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用[2]中提到的误差逆向传播算法BP神经网络公式推导可以分为两个部分:前向传播和反向传播。 1. 前向传播 首先,我们需要将输入数据通过神经网络进行前向传播,得到输出结果。具体的计算过程如下: (1)输入层到隐层的计算 对于第 $j$ 个隐层节点,其输入为: $$ net_j = \sum_{i=1}^{n} w_{ij}x_i + b_j $$ 其中,$w_{ij}$ 表示输入层第 $i$ 个节点到隐层第 $j$ 个节点的连接权重,$x_i$ 表示输入层第 $i$ 个节点的输出,$b_j$ 表示隐层第 $j$ 个节点的偏置。 隐层第 $j$ 个节点的输出为: $$ y_j = f(net_j) $$ 其中,$f(\cdot)$ 表示激活函数。 (2)隐层到输出层的计算 对于第 $k$ 个输出层节点,其输入为: $$ net_k = \sum_{j=1}^{m} w_{jk}y_j + b_k $$ 其中,$w_{jk}$ 表示隐层第 $j$ 个节点到输出层第 $k$ 个节点的连接权重,$y_j$ 表示隐层第 $j$ 个节点的输出,$b_k$ 表示输出层第 $k$ 个节点的偏置。 输出层第 $k$ 个节点的输出为: $$ y_k = f(net_k) $$ 2. 反向传播 接下来,我们需要计算输出误差,并将误差通过神经网络进行反向传播,更新连接权重和偏置。具体的计算过程如下: (1)输出误差的计算 对于第 $k$ 个输出层节点,其输出误差为: $$ \delta_k = (d_k - y_k)f'(net_k) $$ 其中,$d_k$ 表示期望输出,$f'(\cdot)$ 表示激活函数的导数。 (2)隐层误差的计算 对于第 $j$ 个隐层节点,其误差为: $$ \delta_j = f'(net_j)\sum_{k=1}^{q}w_{jk}\delta_k $$ 其中,$q$ 表示输出层节点数。 (3)连接权重和偏置的更新 根据误差反向传播的原理,我们可以得到连接权重和偏置的更新公式: $$ \Delta w_{ij} = \eta \delta_j x_i \\ \Delta b_j = \eta \delta_j $$ 其中,$\eta$ 表示学习率。 以上就是BP神经网络公式推导过程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值