传送门

  • BP神经网络
  • 简述
  • 流程
  • BP神经网络PID控制算法(BPNN-PID)
  • 与单神经元PID控制算法的对比
  • 前向激励
  • 反向传播
  • matlab仿真
  • 总结



BP神经网络

简述

老规矩不废话,直接上链接 BP神经网络维基百科 BP神经网络是人工神经网络中的一种常用结构,其由输入层(input)-隐含层(hidding)-输出层三层构成(output)。

可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_神经网络

上图中,可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_神经网络_02是输入层,可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_可以固定BPNN神经网络的误差吗_03是隐含层,可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_matlab_04是输出层,可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_权重_05是输入-隐含层之间的权重系数矩阵,可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_权重_06是隐含-输出层的权重系数矩阵,可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_神经网络_07是隐含层神经元函数的激励函数,可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_神经网络_08是隐含层神经元的偏置阈值,可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_权重_09是输出层神经元的激励函数,可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_算法_10是输出层神经元的偏置阈值。
假设输入向量为可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_权重_11,输入-隐含层系数矩阵为可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_算法_12,则隐含层的中每个神经元的输出为:
可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_可以固定BPNN神经网络的误差吗_13
对于偏置阈值来说,同样也会影响到损失函数可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_matlab_14的大小,因此也要将其和权重系数一样作为可变参数,应用梯度下降求解最优值。
利用矩阵运算的技巧,假设输入层的输入为1x3的向量可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_权重_15,对应的权重系数为可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_可以固定BPNN神经网络的误差吗_16,则为了方便计算,可以将输入向量变为可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_可以固定BPNN神经网络的误差吗_17,相应的权重系数会多出一行变为可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_神经网络_18,最后这一行就对应每一个隐含层神经元的偏置阈值。

流程

BP神经网络的运作机理主要包含两个流程

  1. 前向激励传播:将输入送入网络进行运算获得结果。
  2. 反向传播更新权重:将运算结果得到的反馈信息计算损失函数,以最优化目标更新各神经元连接权重值。

BP神经网络PID控制算法(BPNN-PID)

与单神经元PID控制算法的对比

从输入输出关系上来看,单神经元PID控制算法输入三项误差项输出控制律。而BP神经网络输入的是系统输入可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_matlab_19,系统输出可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_算法_20系统误差可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_matlab_21,输出的是PID参数
可以理解成BP神经网络根据系统输入输出和误差项的信息和损失函数的反馈来不断迭代优化各位置的权重系数,以实现损失函数达到最小的目的。

为什么输入的三项分别是可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_matlab_22而不是其他的变量。

  • 首先排除妈妈生的(狗头)
  • 个人认为,在进行权值更新的损失函数就是以系统误差作为基础进行计算的——可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_神经网络_23,因此对于整个BP神经网络部分来说,输出的PID系数值的优劣(以损失函数大小评判)是直接和输入可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_可以固定BPNN神经网络的误差吗_24以及二者的差可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_可以固定BPNN神经网络的误差吗_25决定的。因此才将这三个作为BP神经网络的输入变量。
  • 从神经网络的角度来说,输入的数据是服务于损失函数的训练样本,样本中就需要包含训练结果(可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_权重_26)及参考答案(可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_算法_27)以及他们的差距。当然输入的信息不是一成不变的,根据不同的代价函数和系统结构,可以提供更多数据类型来达到最终的收敛目的。

前向激励

在BPNN-PID控制算法中,前向激励是指从输入层信号输入通过隐含层最终从输出层输出的通道,也是算法中的主要流程之一。

  • 假设隐含层中的神经元个数为可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_matlab_28,隐含层和输出层的激励函数分别为可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_算法_29
    可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_神经网络_30
  • 假设从输入层-隐含层的权重系数为可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_算法_31,隐含层-输出层的权重系数为可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_matlab_32。对应的系数矩阵分别为
    可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_算法_33

假设三个输入分别为可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_matlab_34,则隐含层第一个神经元的输入为
可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_可以固定BPNN神经网络的误差吗_35

假设隐含层N个输出为可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_matlab_36,则输出层第一个神经元的输入为

可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_权重_37
此处内容用于辅助理解权重系数下标数字的含义,为后续公式推导提供帮助

  • 为了简化公式,采用矩阵形式来描述前向激励过程。输入向量为可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_可以固定BPNN神经网络的误差吗_381x3的行向量,则隐含层的输入向量为
    可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_神经网络_39
    显然可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_权重_401xN的行向量
    隐含层的激励函数为可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_算法_41,则隐含层的激励输出为
    可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_神经网络_42
    显然,对向量可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_权重_40的每一个元素进行函数映射转换后,不改变其向量的维度,可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_matlab_44仍然为1xN的行向量
    输出层的神经元输入向量为可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_matlab_451x3的行向量
    可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_权重_46
    输出层的神经元激励输出向量为可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_神经网络_471x3的行向量
    可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_matlab_48

在matlab中,对一个向量或者矩阵进行函数运算会得到维度相同的新向量或新矩阵,其元素是原先向量或矩阵中每个元素经过函数之后的结果。

  • 可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_算法_49控制算法输出的是可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_算法_50三个参数,即可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_算法_51
    设误差向量可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_权重_523x1列向量
    可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_算法_53
    根据增量PID公式计算控制器增量可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_可以固定BPNN神经网络的误差吗_54
    可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_神经网络_55
    则控制律公式为
    可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_可以固定BPNN神经网络的误差吗_56
    假设系统函数满足以下关系
    可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_权重_57
    其中可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_可以固定BPNN神经网络的误差吗_58为状态量,可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_算法_59为系统输出,可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_matlab_60可以为任意形式的函数形式,包括各类非线性函数。

反向传播

反向传播的目的是根据系统响应结果,来判断当前系统参数的优化方向,使得系统响应按照期望的方向演变。

  • 如何评价响应结果
    对于机器来说,它判断当前系统响应状态好坏的方式只能是通过数值,因此需要定义能够描述系统响应标准的数学表达式,以表达式的计算结果衡量响应结果。这种数学表达式就是损失函数cost function,也可以称作代价函数。常见的表达式为:
    可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_matlab_61
    其中,可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_算法_62分别系统期望和系统状态。显然,可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_神经网络_63越小,系统的响应性能越好。
  • 如何判断系统参数的优化方向
    从数值上很容易看出,我们优化的目的就是让损失函数尽可能的变小甚至达到并保持在0。也就是说,损失函数可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_神经网络_63下降的方向就是优化的方向,在工程上一般用梯度下降法来实现。而能够影响到损失函数可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_神经网络_63数值大小的系统参数只有各层之间的权重系数(若神经元中的偏置阈值不恒为0的话同样会作为系统参数影响损失函数数值大小,此文中不讨论)。
    以下为梯度下降法的基本公式基本公式(式1)和动量梯度下降法(式2)可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_权重_66
    其中,可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_权重_67为学习速率或者叫下降步长,可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_神经网络_68为惯性因子。
    在整个神经网络中,存在着总共可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_matlab_69个权重系数,为了找到最优的方向,则令可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_神经网络_63对每个权重系数求偏导,根据梯度下降法得到变化值,最终完成整个网络参数的优化迭代。以输入层-隐含层权重系数 可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_算法_71为例,它是第一个输入连接隐含层第一个神经元的权重系数,则它的梯度下降过程为:
    可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_算法_72

这里面设计到对向量求偏导,对矩阵求偏导,其本质是复合函数的求偏导,因为将矩阵运算拆开来就是线性方程组,其本质依然是链式求偏导法则。
例如,可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_神经网络_73 = [可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_权重_74,可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_神经网络_75,可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_算法_76],可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_可以固定BPNN神经网络的误差吗_77=[可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_可以固定BPNN神经网络的误差吗_78,可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_神经网络_79,可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_matlab_80]可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_权重_81。并且满足可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_matlab_82,则可以将可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_权重_83等效成:
可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_可以固定BPNN神经网络的误差吗_84
则当我们令可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_权重_83可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_神经网络_73求导时,得到:
可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_神经网络_87
其中,可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_权重_88分别为:
可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_matlab_89
可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_算法_90。同理可得可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_算法_91
可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_权重_83变成一个向量或者是矩阵时,情况稍微复杂一些,但本质是一样的。
假设可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_可以固定BPNN神经网络的误差吗_93,令可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_可以固定BPNN神经网络的误差吗_94,可以等效成一个方程组:
可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_权重_95
则当令可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_算法_96对向量可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_matlab_97求导时,得到:
可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_算法_98
同理可得
可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_可以固定BPNN神经网络的误差吗_99
但事实上这个梯度下降过程的本质是损失函数对每个权值参数的直接求偏导,再将每个结果放回权值矩阵中。

可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_权重_100
整理可以得到对于输入-隐含层的权重系数的梯度下降公式为:
可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_可以固定BPNN神经网络的误差吗_101

同理可得,损失函数对隐含-输出层权重系数的梯度下降过程为:
可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_算法_102
每一项的公式为:
可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_神经网络_103
整理可以得到对于隐含-输出层的权重系数的梯度下降公式为:
可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_matlab_104

这里面的矩阵向量直接相乘是不对的,会出现维度不满足矩阵相乘条件的情况。但其实也只需要做一些转置或者元素直接相乘就可以完成。具体的原理用下面的两个图来描述。

可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_权重_105


这里就是求偏导链式法则的体现,只不过以矩阵形式展示可以简化表达式,这里就不再赘述了,自行推导!

matlab仿真

废话不多说,直接上代码

close,clear all;
warning off
xita = 1; %学习因子
alfa = 0.05; %惯量因子
hl_number = 5; %隐藏层神经元个数

hidding_wi = 0.5*rands(4,hl_number); %4xN
output_wi = 0.5*rands(hl_number+1,3);  %Nx3
%抽奖

%初始化隐含层和输出层的两组权重系数
hidding_wi_1 = hidding_wi;
hidding_wi_2 = hidding_wi;
output_wi_1 = output_wi;
output_wi_2 = output_wi;
%权重系数记录

error_1 = 0;error_2 = 0;
u_1 = 0;u_2 = 0;u_3 = 0;
y_1 = 0;y_2 = 0;y_3 = 0;
%控制律及系统状态序列
last_error_ventor = [0;0;0];
ts = 0.001;
for t = 1:1:5000
    time(t) = t*ts; 
    rin(t) = 1*sin(5*2*pi*t*ts);
    %输入信号
    a(t) = 1.2*(1-0.8*exp(-0.1*t));
    y(t) = a(t)*y_1/(1+y_1^2)+u_1; 
    %系统模型输出
    J(t) = 0.5*(rin(t)-y(t))^2;
    
    error(t) = rin(t) - y(t);
    %计算误差
    x_input = [rin(t),y(t),error(t),1];
    %神经网络输入向量  1x4
    error_ventor = [error(t)-error_1;error(t);error(t)-2*error_1+error_2];
    %计算误差向量  3x1

    hiddingLayer_input = x_input * hidding_wi;
    %计算隐含层输入  1xN
    
    hiddingLayer_output = (exp(hiddingLayer_input) - exp(-hiddingLayer_input))./(exp(hiddingLayer_input) + exp(-hiddingLayer_input));
    %计算隐含层输出 激励函数为 (exp(x) - exp(-x))/(exp(x) + exp(-x) ) 
    %1xN
   
    outputLayer_input_offset = [hiddingLayer_output(:);1]';
    %加入输出层神经元的偏置  1x(N+1)
    outputLayer_input = outputLayer_input_offset * output_wi;
    %计算输出层输入 1x3

    outputLayer_output = exp(outputLayer_input) ./ (exp(outputLayer_input) + exp(-outputLayer_input));
    %计算输出层输出 1x3 
    %激励函数为 exp(x) / (exp(x) + exp(-x))
    
    delta_u = outputLayer_output * error_ventor;
    %计算控制律增量
  
    u(t) = u_1 + delta_u;
    %计算控制律

    dJdy = error_1;
    dydu = sign((y_1-y_2)/(u_1-u_2+0.0000001));
    dudoutput3 = last_error_ventor;
    %3x1
    doutput3dnet3 = 2 ./((exp(outputLayer_input)+exp(-outputLayer_input)).^2);
    %1x3  g'(x)
    dnet3dv = outputLayer_input_offset;
    %1x(N+1)
    delta_output_wi = (xita * dJdy * dydu) .* dudoutput3 .* doutput3dnet3' * dnet3dv + alfa*(output_wi_1-output_wi_2)';
    %计算输出层权重增量
    output_wi_2 = output_wi_1;
    output_wi_1 = output_wi;
    output_wi = output_wi_1 + delta_output_wi';
    %更新输出层权重系数
    
    dJdy = error_1;
    dydu = sign((y_1-y_2)/(u_1-u_2+0.0000001));
    dudoutput3 = last_error_ventor;
    %3x1
    doutput3dnet3 = 2 ./((exp(outputLayer_input)+exp(-outputLayer_input)).^2);
    %1x3
    dnet3dv = hiddingLayer_output;
    %1xN
    dnet3doutput2 = output_wi_1(1:hl_number,:);
    % Nx3
    doutput2dnet2 =  4 ./(exp(hiddingLayer_input)+exp(-hiddingLayer_input)).^2;
    % 1x(N)  针对的是N个隐含层神经元
    dnet2dw = x_input;
    % 1x4  针对三个输入和一个偏置   
    delta_hidding_wi = ( ( dnet3doutput2 * ( (xita * dJdy *dydu ) .* dudoutput3 .* doutput3dnet3' ) ) .* doutput2dnet2' ) * dnet2dw + alfa * (hidding_wi_1 - hidding_wi_2)';
    %计算隐含层权重增量
    hidding_wi_2 = hidding_wi_1;
    hidding_wi_1 = hidding_wi;
    hidding_wi = hidding_wi_1 + delta_hidding_wi';
    %更新隐含层权重系数

    error_2 = error_1;
    error_1 = error(t);
    y_3 = y_2;y_2 = y_1;y_1 = y(t);    
    u_3 = u_2;u_2 = u_1;u_1 = u(t);
    last_error_ventor = error_ventor;
    %更新序列
end

%绘图
figure(1);
plot(time,rin,'r',time,y,'b','linewidth',2);
xlabel('time(s)');ylabel('rin,yout');   % 输入和输出

运行结果如下图

可以固定BPNN神经网络的误差吗 bp神经网络整定pid参数_可以固定BPNN神经网络的误差吗_106

总结

从测试的规律来看,学习因子对于整个神经网络的影响较大。过大的学习因子会让系统出现振荡,过小的学习因子则会使系统在初始阶段发散,无法收敛(系统参数的初始值是随机产生的)。当然也可以考虑训练出一组较为理想的参数作为系统初始值,再以较小的学习因子来提高控制器的精度,使系统的动态性能提高。
另外,神经网络的迭代周期对于控制器性能的影响也较大,理想上周期越小,系统状态拟合的更好,收敛的越快。