BP网络的产生主要是误差的反向传播,根据输出函数和目标函数的误差来修正权值和阈值。现在就给大家讲讲标准梯度下降法修正权值和阈值具体算法实现。以三层结构(输入层-隐含层-输出层)的模型为案例进行讲解:    

一:BP神经网络

 

bp神经网络权值 清零 bp神经网络的权值修正_梯度下降法

输入层-隐含层-输出层

现在给出模型构建所需的参数

bp神经网络权值 清零 bp神经网络的权值修正_梯度下降法_02

   ~

bp神经网络权值 清零 bp神经网络的权值修正_bp神经网络权值 清零_03

~

bp神经网络权值 清零 bp神经网络的权值修正_公众号_04

~

bp神经网络权值 清零 bp神经网络的权值修正_梯度下降法_05

根据模型,隐含层中神经元的输出为:

bp神经网络权值 清零 bp神经网络的权值修正_梯度下降法_06

输出层中神经的输出为:

bp神经网络权值 清零 bp神经网络的权值修正_权值_07

定义误差函数为:

bp神经网络权值 清零 bp神经网络的权值修正_神经网络_08

二:权值阈值的更新

  权值和阈值的变化率涉及到矩阵的求导,关于矩阵运算的基本规则、会在后期单独介绍,在此就不介绍矩阵求导规则。

输出层的权值、阈值梯度变化:

bp神经网络权值 清零 bp神经网络的权值修正_梯度下降法_09

 

 

 

 

隐含层的权值、阈值梯度变化:

bp神经网络权值 清零 bp神经网络的权值修正_bp神经网络权值 清零_10

 

 

  将权值和阈值的变化值加到权值阈值上即可得到权值阈值的更新值,经过不断训练即可得到使得误差最小的权值、阈值。

                                                   

bp神经网络权值 清零 bp神经网络的权值修正_神经网络_11

 

此方法是BP网络训练权值、阈值的最初的方法,随着对人工网络的深入研究,基于标准梯度下降法又提出了附加动量的bp算法、可变学习速率的bp算法、拟牛顿法等。请持续关注MATLAB爱好者公众号,作者会持续更新关于权值阈值的学习算法。

 

bp神经网络权值 清零 bp神经网络的权值修正_神经网络_12

误差变化图

三:标准梯度下降法MATLAB代码

现给出单隐含层和双隐含层的权值阈值学习代码案例:

clear all
P=[0.1 0.3 0.14 0.5 ;0.2 0.5 0.2 0.1; 0.3 0.6 0.6 0.2;0.4 0.7 0.1 0.3; 0.1 0.4 0.6 0.6];
T=[0.5;0.6;0.3;0.4;0.2];
W1=rand(3,4) ; B1=rand(3,1)*ones(1,5);
W2=rand(1,3) ; B2=ones(1,5)*rand(1,1);x=W1*P'+B1;
fx='tansig(x)';
A1=eval(fx);
y=W2*A1+B2;
fy='purelin(y)';
A2=eval(fy);
E=T'-A2;
SSE=sumsqr(E);
fyd=ones(1,5);
Lp.lr= 0.0028;
M=cell(4,25);
for epoch=1:100;
    dW2=0.0028*((E.*fyd).*ones(1,5))*pinv(A1);%0.0028:为设置的一个常数系数,表示下降速率;fyd为purelin的导数
    dB2=0.0028*((E.*fyd).*ones(1,5));%0.0028*((E.*fyd):为系数所以点成的形式乘以矩阵
    dW1=0.0028*(((((ones(3,1)*(E.*fyd))).*((4*exp(-2*A1))./(exp(-2*A1) + 1).^2))*ones(5,1)).*pinv(W2))*ones(1,5)*pinv(P');%((4*exp(-2*A1))./(exp(-2*A1) + 1).^2)为tansig函数的导数
    dB1=0.0028*(((((ones(3,1)*(E.*fyd))).*((4*exp(-2*A1))./(exp(-2*A1) + 1).^2))*ones(5,1)).*pinv(W2))*ones(1,5);
    W1=W1+dW1;
    B1=B1+dB1;
    W2=W2+dW2;
    B2=B2+dB2;
    x=W1*P'+B1;
    fx='tansig(x)';
    A1=eval(fx);
    y=W2*A1+B2
    fy='purelin(y)'
    A2=eval(fy);
    E=T'-A2;
    SSE=sumsqr(E);
    M{epoch}=SSE
end