一、大致介绍
BP算法的学习过程是由正向传播和反向传播组成的。在正向传播的过程中,输入的信息从输入层到隐含层处理 最后传向输出层,而且每一个神经元能影响到下一层神经元的状态。当在输出层得不到期望的输出时,则转向反向传播,将误差信号按照连接通路反向计算,使用梯度下降法来调整每一层神经元的权值w,以此来减小误差。
二、逼近网络的结构

matlab 含bp神经网络机器学习代码 matlab bp神经网络函数_梯度下降法


神经元结构:

matlab 含bp神经网络机器学习代码 matlab bp神经网络函数_BP逼近函数_02


三、计算开始(核心运算就是求导)

第一部分:前向传播

隐含层神经元的输入即为所有输入信号的加权和

matlab 含bp神经网络机器学习代码 matlab bp神经网络函数_梯度下降法_03

而隐含层的输出matlab 含bp神经网络机器学习代码 matlab bp神经网络函数_梯度下降法_04采用函数来激发matlab 含bp神经网络机器学习代码 matlab bp神经网络函数_权值_05

matlab 含bp神经网络机器学习代码 matlab bp神经网络函数_梯度下降法_06

求导:

matlab 含bp神经网络机器学习代码 matlab bp神经网络函数_反向传播_07

则很容易就得到输出层神经元的输出为隐含层输出加权和:

matlab 含bp神经网络机器学习代码 matlab bp神经网络函数_梯度下降法_08

误差为:

matlab 含bp神经网络机器学习代码 matlab bp神经网络函数_权值_09

准则函数设为误差平方和的一半:

matlab 含bp神经网络机器学习代码 matlab bp神经网络函数_反向传播_10

只有正向传播还不可以,我们还需要反向传播来调整他们之间权值w

第二部分:反向传播

反向传播使用matlab 含bp神经网络机器学习代码 matlab bp神经网络函数_权值_11学习算法

输出层和隐含层之间的连接权值matlab 含bp神经网络机器学习代码 matlab bp神经网络函数_BP逼近函数_12学习过程(其他同理):

matlab 含bp神经网络机器学习代码 matlab bp神经网络函数_BP逼近函数_13

因此修正后的k+1时刻的matlab 含bp神经网络机器学习代码 matlab bp神经网络函数_梯度下降法_14可以表示为:

matlab 含bp神经网络机器学习代码 matlab bp神经网络函数_反向传播_15

隐含层与输入层之间连接权值matlab 含bp神经网络机器学习代码 matlab bp神经网络函数_梯度下降法_16的学习过程为:

matlab 含bp神经网络机器学习代码 matlab bp神经网络函数_BP逼近函数_17

因此修正后的k+1时刻的matlab 含bp神经网络机器学习代码 matlab bp神经网络函数_梯度下降法_16可以表示为:

matlab 含bp神经网络机器学习代码 matlab bp神经网络函数_反向传播_19

为了避免在学习过程中发生振荡现象,导致收敛速度变慢,我们需要引入动量因子matlab 含bp神经网络机器学习代码 matlab bp神经网络函数_反向传播_20,把上次权值对本次权值变化的影响考虑进去,即:

matlab 含bp神经网络机器学习代码 matlab bp神经网络函数_BP逼近函数_21

matlab 含bp神经网络机器学习代码 matlab bp神经网络函数_BP逼近函数_22

jacobian信息:对象输出对输入的敏感度matlab 含bp神经网络机器学习代码 matlab bp神经网络函数_梯度下降法_23,其值可以被神经网络辨识:

将BP网络的第一个输入称为u(k),可得:

matlab 含bp神经网络机器学习代码 matlab bp神经网络函数_反向传播_24

至此,原理部分讲完了。

三、实例

对象 matlab 含bp神经网络机器学习代码 matlab bp神经网络函数_BP逼近函数_25,权值w1,w2分别取,matlab 含bp神经网络机器学习代码 matlab bp神经网络函数_梯度下降法_26 取1000个点。

逼近曲线:

matlab 含bp神经网络机器学习代码 matlab bp神经网络函数_权值_27


error:

matlab 含bp神经网络机器学习代码 matlab bp神经网络函数_BP逼近函数_28


code:

%%本脚本用于系统辨识  BP网络逼近函数
%2019-4-17  王萌
close all
clear all
clc
xite=0.9; %学习速率
alfa=0.5; %动量因子
%初始化权重 %%三个神经元 神经元个数提高,准确度也会提高
w2=rands(3,1);
w2_1=w2;
w2_2=w2_1;
w1=rands(2,3);
w1_1=w1;
w1_2=w1;
%初始化输入
dw1=0*w1;
x=[0 0]';
%初始化输出
I=[0,0,0]';
Iout=[0,0,0]';
FI=[0,0,0];
ts=0.01;%间隔
for k=1:1000  %
time(k)=k*ts;
    u(k)=sin(pi*k*ts)^2;   %%被逼近的函数 输入
    y(k)=u(k);             %输入
    for j=1:size(w1,2)
        I(j)=x'*w1(:,j);   %激活函数
        Iout(j)=1/(1+exp(-I(j)));
    end
        yn(k)=w2'*Iout; %神经网络的输出 6 维 
        e(k)=y(k)-yn(k); %误差计算
        w2=w2_1+(xite*e(k)*Iout)+alfa*(w2_1-w2_2);%学习算法 隐含层与输出层
        %%
        for j=1:size(w1,2)
            FI(j)=exp(-I(j))/(1+exp(-I(j)))^2; %激活函数的导数
        end
        %%增量计算
        for i=1:size(w1,1)
            for j=1:size(w1,2)
                dw1(i,j)=e(k)*xite*FI(j)*w2(j)*x(i);  %隐含层与输入层
            end
        end
       w1=w1_1+dw1+alfa*(w1_1-w1_2);  %学习算法 隐含层与输入层
        %%下面计算jacobian信息
        yu=0;
        for j=1:size(w1,2)
            yu=yu+w2(j)*w1(1,j)*FI(j);  
        end
        dyu(k)=yu;
        x(1)=u(k);
        x(2)=y(k);
        w1_2=w1_1;w1_1=w1;
        w2_2=w2_1;w2_1=w2;
end
figure(1)
plot(time,y,'r',time,yn,'b');
xlabel('times');ylabel('y and yn');
figure(2)
plot(time,y-yn,'r');
xlabel('times');ylabel('error');
figure(3)
plot(time,dyu);
xlabel('times');ylabel('dyu');