浅谈BP神经网络PID控制算法及matlab仿真


本文是对BP神经网络PID控制算法的数学描述及仿真实验,若有错误之处,欢迎指正!



BP神经网络

简述

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

上图中, B 1 B1 B1是输入层, B 2 B2 B2是隐含层, B 3 B3 B3是输出层, W 12 W12 W12是输入-隐含层之间的权重系数矩阵, W 23 W23 W23是隐含-输出层的权重系数矩阵, H H H是隐含层神经元函数的激励函数, b 2 b2 b2是隐含层神经元的偏置阈值, O O O是输出层神经元的激励函数, b 3 b3 b3是输出层神经元的偏置阈值。
假设输入向量为 X = [ 1 × 3 ] X=[1 \times3] X=[1×3],输入-隐含层系数矩阵为 W 12 = [ 3 × N ] W_{12}=[3\times N] W12=[3×N],则隐含层的中每个神经元的输出为:
H i d d i n g O u t p u t = H ( ( X ⋅ W 12 ) i − b 2 ) , i = 1 , 2 , 3 , . . . N Hidding_Output = H( (X \cdot W_{12})_{i}-b_2),i=1,2,3,...N HiddingOutput=H((XW12)ib2),i=1,2,3,...N
对于偏置阈值来说,同样也会影响到损失函数 J J J的大小,因此也要将其和权重系数一样作为可变参数,应用梯度下降求解最优值。
利用矩阵运算的技巧,假设输入层的输入为1x3的向量 X = [ x 1 , x 2 , x 3 ] X=[x_1,x_2,x_3] X=[x1,x2,x3],对应的权重系数为 W = [ 3 × N ] W=[3\times N] W=[3×N],则为了方便计算,可以将输入向量变为 X ′ = [ x 1 , x 2 , x 3 , 1 ] X'=[x_1,x_2,x_3,1] X=[x1,x2,x3,1],相应的权重系数会多出一行变为 W ′ = [ 4 × N ] W'=[4 \times N] W=[4×N],最后这一行就对应每一个隐含层神经元的偏置阈值。

流程

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

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

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

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

从输入输出关系上来看,单神经元PID控制算法输入三项误差项输出控制律。而BP神经网络输入的是系统输入 r ( k ) r(k) r(k),系统输出 y ( k ) y(k) y(k)系统误差 e ( k ) e(k) e(k),输出的是PID参数
可以理解成BP神经网络根据系统输入输出和误差项的信息和损失函数的反馈来不断迭代优化各位置的权重系数,以实现损失函数达到最小的目的。

为什么输入的三项分别是 r ( k ) , y ( k ) , e ( k ) r(k),y(k),e(k) r(k),y(k),e(k)而不是其他的变量。

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

前向激励

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

  • 假设隐含层中的神经元个数为 N N N,隐含层和输出层的激励函数分别为 f ( x ) , g ( x ) f(x),g(x) f(x)g(x)
    f ( x ) = e x − e − x e x + e − x g ( x ) = e x e x + e − x f(x) = \frac{e^{x}-e^{-x}}{e^{x} + e^{-x}}\\ g(x)= \frac{e^{x}}{e^{x} + e^{-x}} f(x)=ex+exexexg(x)=ex+exex
  • 假设从输入层-隐含层的权重系数为 w i j ( i = 1 , 2 , 3 ; j = 1 , 2 , 3 , . . . , N ) w_{ij}(i=1,2,3;j=1,2,3,...,N) wij(i=1,2,3;j=1,2,3,...,N),隐含层-输出层的权重系数为 v i j ( i = 1 , 2 , 3 , . . . , N ; j = 1 , 2 , 3 ) v_{ij}(i=1,2,3,...,N;j=1,2,3) vij(i=1,2,3,...,N;j=1,2,3)。对应的系数矩阵分别为
    W = [ w 11 w 12 . . . w 1 N w 21 w 22 . . . w 2 N w 31 w 32 . . . w 3 N ] V = [ v 11 v 12 v 13 v 21 v 22 v 23 . . . . . . . . . v N 1 v N 2 v N 3 ] W = \begin{bmatrix} w_{11}& w_{12}& ...&w_{1N} \\ w_{21}& w_{22}& ...&w_{2N}\\ w_{31}& w_{32}& ...&w_{3N} \end{bmatrix}\\ V = \begin{bmatrix} v_{11}& v_{12}& v_{13} \\ v_{21}& v_{22}& v_{23}\\ ...& ...& ...&\\ v_{N1}& v_{N2}& v_{N3} \end{bmatrix}\\ W= w11w21w31w12w22w32.........w1Nw2Nw3N V= v11v21...vN1v12v22...vN2v13v23...vN3

假设三个输入分别为 x 1 , x 2 , x 3 x_{1},x_{2},x_{3} x1x2x3,则隐含层第一个神经元的输入为
h i 1 = x 1 ∗ w 11 + x 2 ∗ w 21 + x 3 ∗ w 31 hi_{1}=x_{1}*w_{11}+x_{2}*w_{21}+x_{3}*w_{31} hi1=x1w11+x2w21+x3w31

假设隐含层N个输出为 h o 1 , h o 2 , h o 3 , . . . , h o N ho_{1},ho_{2},ho_{3},...,ho_{N} ho1,ho2,ho3,...,hoN,则输出层第一个神经元的输入为

o i 1 = h o 1 ∗ v 11 + h o 2 ∗ v 21 + . . . + h o N ∗ v N 1 oi_{1}=ho_{1}*v_{11} + ho_{2} *v_{21}+...+ho_{N}*v_{N1} oi1=ho1v11+ho2v21+...+hoNvN1
此处内容用于辅助理解权重系数下标数字的含义,为后续公式推导提供帮助

  • 为了简化公式,采用矩阵形式来描述前向激励过程。输入向量为 X ⃗ = [ x 1 , x 2 , x 3 ] \vec{X}=[x_{1},x_{2},x_{3}] X =[x1,x2,x3]1x3的行向量,则隐含层的输入向量为
    H i ⃗ = X ⃗ ⋅ W \vec{Hi}=\vec{X} \cdot W Hi =X W
    显然 H i ⃗ \vec{Hi} Hi 1xN的行向量
    隐含层的激励函数为 f ( x ) = e x − e − x e x + e − x f(x) = \frac{e^{x}-e^{-x}}{e^{x} + e^{-x}} f(x)=ex+exexex,则隐含层的激励输出为
    H o ⃗ = f ( H i ⃗ ) = e H i ⃗ − e − H i ⃗ e H i ⃗ + e − H i ⃗ \vec{Ho}=f(\vec{Hi})= \frac{e^{\vec{Hi}}-e^{-\vec{Hi}}}{e^{\vec{Hi}} + e^{-\vec{Hi}}} Ho =f(Hi )=eHi +eHi eHi eHi
    显然,对向量 H i ⃗ \vec{Hi} Hi 的每一个元素进行函数映射转换后,不改变其向量的维度, H o ⃗ \vec{Ho} Ho 仍然为1xN的行向量

    输出层的神经元输入向量为 O i ⃗ \vec{Oi} Oi 1x3的行向量
    O i ⃗ = H o ⃗ ⋅ V \vec{Oi}=\vec{Ho}\cdot V Oi =Ho V
    输出层的神经元激励输出向量为 O o ⃗ \vec{Oo} Oo 1x3的行向量
    O o ⃗ = g ( O i ⃗ ) = g ( x ) = e O i ⃗ e O i ⃗ + e − O i ⃗ \vec{Oo} = g(\vec{Oi})=g(x)= \frac{e^{\vec{Oi}}}{e^{\vec{Oi}} + e^{-\vec{Oi}}} Oo =g(Oi )=g(x)=eOi +eOi eOi

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

  • B P N N − P I D BPNN-PID BPNNPID控制算法输出的是 K p , K i , K d Kp,Ki,Kd Kp,Ki,Kd三个参数,即 O o ⃗ = [ K p , K i , K d ] \vec{Oo}=[Kp,Ki,Kd] Oo =[Kp,Ki,Kd]
    设误差向量 E ⃗ \vec{E} E 3x1列向量
    E ⃗ = [ e r r o r k − e r r o r k − 1 e r r o r k e r r o r k − 2 e r r o r k − 1 + e r r o r k − 2 ] \vec{E}=\begin{bmatrix} error_{k}-error_{k-1} \\ error_{k}\\ error_{k}-2error_{k-1}+error_{k-2} \end{bmatrix} E = errorkerrork1errorkerrork2errork1+errork2
    根据增量PID公式计算控制器增量 Δ U \Delta U ΔU
    Δ U = O o ⃗ ⋅ E ⃗ \Delta U = \vec{Oo}\cdot\vec{E} ΔU=Oo E
    则控制律公式为
    U k = U k − 1 + Δ U U_{k}=U_{k-1}+\Delta U Uk=Uk1+ΔU
    假设系统函数满足以下关系
    x ′ = h ( x , U ) y = x \mathbf{x^{'}} =\mathbf{h}(\mathbf{x},\mathbf{U})\\ \mathbf{y}=\mathbf{x} x=h(x,U)y=x
    其中 x \mathbf{x} x为状态量, y \mathbf{y} y为系统输出, h \mathbf{h} h可以为任意形式的函数形式,包括各类非线性函数。

反向传播

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

  • 如何评价响应结果
    对于机器来说,它判断当前系统响应状态好坏的方式只能是通过数值,因此需要定义能够描述系统响应标准的数学表达式,以表达式的计算结果衡量响应结果。这种数学表达式就是损失函数cost function,也可以称作代价函数。常见的表达式为:
    J = 1 2 ( y d − y ) 2 \mathbf{J}=\frac{\mathbf{1}}{\mathbf{2}}(\mathbf{y_{d}}-\mathbf{y})^{\mathbf{2}} J=21(ydy)2
    其中, y d , y \mathbf{y_{d}},\mathbf{y} yd,y分别系统期望和系统状态。显然, J \mathbf{J} J越小,系统的响应性能越好。

  • 如何判断系统参数的优化方向
    从数值上很容易看出,我们优化的目的就是让损失函数尽可能的变小甚至达到并保持在0。也就是说,损失函数 J \mathbf{J} J下降的方向就是优化的方向,在工程上一般用梯度下降法来实现。而能够影响到损失函数 J \mathbf{J} J数值大小的系统参数只有各层之间的权重系数(若神经元中的偏置阈值不恒为0的话同样会作为系统参数影响损失函数数值大小,此文中不讨论)。

    以下为梯度下降法的基本公式基本公式(式1)和动量梯度下降法(式2)
    Δ X k = − η ∂ J ∂ X Δ X k = − η ∂ J ∂ X + α Δ X k − 1 \Delta X_{k} = -\eta \frac{\partial{\mathbf{J}}}{\partial{X}}\\ \Delta X_{k} = -\eta \frac{\partial{\mathbf{J}}}{\partial{X}} + \alpha \Delta X_{k-1} ΔXk=ηXJΔXk=ηXJ+αΔXk1
    其中, η \eta η为学习速率或者叫下降步长, α \alpha α为惯性因子。
    在整个神经网络中,存在着总共 6 N 6N 6N个权重系数,为了找到最优的方向,则令 J \mathbf{J} J对每个权重系数求偏导,根据梯度下降法得到变化值,最终完成整个网络参数的优化迭代。以输入层-隐含层权重系数 W W W为例,它是第一个输入连接隐含层第一个神经元的权重系数,则它的梯度下降过程为:
    Δ W = − η ∂ J ∂ W ∂ J ∂ W = ∂ J ∂ y ∂ y ∂ u ∂ u ∂ O o ⃗ ∂ O o ⃗ ∂ O i ⃗ ∂ O i ⃗ ∂ H o ⃗ ∂ H o ⃗ ∂ H i ⃗ ∂ H i ⃗ ∂ W \Delta W = -\eta \frac{\partial{\mathbf{J}}}{\partial{W}}\\ \frac{\partial{\mathbf{J}}}{\partial{W}}= \frac{\partial{\mathbf{J}}}{\partial{\mathbf{y}}} \frac{\partial{\mathbf{y}}}{\partial{\mathbf{u}}} \frac{\partial{\mathbf{u}}}{\partial{\mathbf{\vec{Oo}}}} \frac{\partial{\mathbf{\vec{Oo}}}}{\partial{\mathbf{\vec{Oi}}}} \frac{\partial{\mathbf{\vec{Oi}}}}{\partial{\mathbf{\vec{Ho}}}} \frac{\partial{\mathbf{\vec{Ho}}}}{\partial{\mathbf{\vec{Hi}}}} \frac{\partial{\mathbf{\vec{Hi}}}}{\partial{\mathbf{W}}} ΔW=ηWJWJ=yJuyOo uOi Oo Ho Oi Hi Ho WHi

这里面设计到对向量求偏导,对矩阵求偏导,其本质是复合函数的求偏导,因为将矩阵运算拆开来就是线性方程组,其本质依然是链式求偏导法则。
例如, u ⃗ \vec{u} u = [ u 1 u_1 u1, u 2 u_2 u2, u 3 u_3 u3], v ⃗ \vec{v} v =[ v 1 v_1 v1, v 2 v_2 v2, v 3 v_3 v3] T ^{T} T。并且满足 K = u ⃗ ⋅ v ⃗ K=\vec{u}\cdot \vec{v} K=u v ,则可以将 K K K等效成:
K = u 1 v 1 + u 2 v 2 + u 3 v 3 = f ( u 1 , u 2 , u 3 , v 1 , v 2 , v 3 ) K = u_1v_1+u_2v_2+u_3v_3=f(u_1,u_2,u_3,v_1,v_2,v_3) K=u1v1+u2v2+u3v3=f(u1,u2,u3,v1,v2,v3)
则当我们令 K K K u ⃗ \vec{u} u 求导时,得到:
∂ K ∂ u ⃗ = [ ∂ K ∂ u 1 ∂ K ∂ u 2 ∂ K ∂ u 3 ] \frac{\partial{K}}{\partial{\vec{u}}}=\begin{bmatrix} \frac{\partial{K}}{\partial{u_1}} \frac{\partial{K}}{\partial{u_2}} \frac{\partial{K}}{\partial{u_3}} \end{bmatrix} u K=[u1Ku2Ku3K]
其中, ∂ K ∂ u 1 , ∂ K ∂ u 2 , ∂ K ∂ u 3 \frac{\partial{K}}{\partial{u_1}},\frac{\partial{K}}{\partial{u_2}},\frac{\partial{K}}{\partial{u_3}} u1K,u2K,u3K分别为:
∂ K ∂ u 1 = ∂ f ∂ u 1 = v 1 ∂ K ∂ u 2 = ∂ f ∂ u 2 = v 2 ∂ K ∂ u 3 = ∂ f ∂ u 3 = v 3 \frac{\partial{K}}{\partial{u_1}}=\frac{\partial{f}}{\partial{u_1}}=v_1 \\ \frac{\partial{K}}{\partial{u_2}}=\frac{\partial{f}}{\partial{u_2}}=v_2 \\ \frac{\partial{K}}{\partial{u_3}}=\frac{\partial{f}}{\partial{u_3}}=v_3 u1K=u1f=v1u2K=u2f=v2u3K=u3f=v3
∂ K ∂ u ⃗ = v ⃗ T \frac{\partial{K}}{\partial{\vec{u}}}=\vec{v}^{T} u K=v T。同理可得 ∂ K ∂ v ⃗ = u ⃗ T \frac{\partial{K}}{\partial{\vec{v}}}=\vec{u}^{T} v K=u T
K K K变成一个向量或者是矩阵时,情况稍微复杂一些,但本质是一样的。
假设 l ⃗ = [ l 1 , l 2 , l 3 ] , M = [ m 11 m 12 m 21 m 22 m 31 m 32 ] \vec{l}=[l_1,l_2,l_3],\mathbf{M}=\begin{bmatrix} m_{11}& m_{12}\\ m_{21}& m_{22}\\ m_{31}&m_{32}\end{bmatrix} l =[l1,l2,l3],M= m11m21m31m12m22m32 ,令 n ⃗ = l ⃗ ⋅ M = [ l 1 m 11 + l 2 m 21 + l 3 m 31 , l 1 m 12 + l 1 m 22 + l 1 m 32 ] \vec{n}=\vec{l}\cdot\mathbf{M}=[l_1m_{11}+l_2m_{21}+l_3m_{31},l_1m_{12}+l_1m_{22}+l_1m_{32}] n =l M=[l1m11+l2m21+l3m31,l1m12+l1m22+l1m32],可以等效成一个方程组:
{ n 1 = l 1 m 11 + l 2 m 21 + l 3 m 31 = f 1 ( l 1 , l 2 , l 3 , m 11 , m 21 , m 31 ) n 2 = l 1 m 12 + l 1 m 22 + l 1 m 32 = f 2 ( l 1 , l 2 , l 3 , m 12 , m 22 , m 32 ) \left \{ \begin{matrix} n_1 = l_1m_{11}+l_2m_{21}+l_3m_{31} =f_1(l_1,l_2,l_3,m_{11},m_{21},m_{31})\\ n_2 = l_1m_{12}+l_1m_{22}+l_1m_{32} = f_2(l_1,l_2,l_3,m_{12},m_{22},m_{32}) \end{matrix}\right. {n1=l1m11+l2m21+l3m31=f1(l1,l2,l3,m11,m21,m31)n2=l1m12+l1m22+l1m32=f2(l1,l2,l3,m12,m22,m32)
则当令 n ⃗ \vec{n} n 对向量 l ⃗ \vec{l} l 求导时,得到:
∂ n ⃗ ∂ l ⃗ = [ ∂ n 1 ∂ l ⃗ ; ∂ n 2 ∂ l ⃗ ] = [ ∂ n 1 ∂ l 1 ∂ n 1 ∂ l 2 ∂ n 1 ∂ l 3 ∂ n 2 ∂ l 1 ∂ n 2 ∂ l 2 ∂ n 2 ∂ l 3 ] = M T \frac{\partial{\vec{n}}}{\partial{\vec{l}}}=[\frac{\partial{n_1}}{\partial{\vec{l}}};\frac{\partial{n_2}}{\partial{\vec{l}}}]= \begin{bmatrix} \frac{\partial{n_1}}{\partial{l_1}}&\frac{\partial{n_1}}{\partial{l_2}} & \frac{\partial{n_1}}{\partial{l_3}}\\ \frac{\partial{n_2}}{\partial{l_1}} & \frac{\partial{n_2}}{\partial{l_2}}& \frac{\partial{n_2}}{\partial{l_3}}\end{bmatrix} =M^{T} l n =[l n1;l n2]=[l1n1l1n2l2n1l2n2l3n1l3n2]=MT
同理可得
∂ n ⃗ ∂ M = l ⃗ ′ \frac{\partial{\vec{n}}}{\partial{\mathbf{M}}} = \vec{l}^{'} Mn =l
但事实上这个梯度下降过程的本质是损失函数对每个权值参数的直接求偏导,再将每个结果放回权值矩阵中。

∂ J ∂ y = ∂ 1 2 ( r − y ) 2 ∂ y = − e r r o r ∂ y ∂ u = s i g n ( Δ y Δ u ) ∂ u ∂ O o ⃗ = ∂ Δ u ∂ O o ⃗ = ∂ O o ⃗ ⋅ E ⃗ ∂ O o ⃗ = E ⃗ ∂ O o ⃗ ∂ O i ⃗ = ∂ g ( O i ⃗ ) ∂ O i ⃗ = g ′ ( O i ⃗ ) ∂ O i ⃗ ∂ H o ⃗ = ∂ H o ⃗ V ∂ H o ⃗ = V ∂ H o ⃗ ∂ H i ⃗ = ∂ f ( H i ⃗ ) ∂ H i ⃗ = f ′ ( H i ⃗ ) ∂ H i ⃗ ∂ W = ∂ X ⃗ ⋅ W ∂ W = X ⃗ \frac{\partial{\mathbf{J}}}{\partial{\mathbf{y}}}=\frac{\partial{\mathbf{\frac{1}{2}}(r-y)^2}}{\partial{\mathbf{y}}}=\mathbf{-error}\\ \frac{\partial{\mathbf{y}}}{\partial{\mathbf{u}}}=\mathbf{sign(\frac{\mathbf{\Delta y}}{\mathbf{\Delta u}})}\\ \frac{\partial{\mathbf{u}}}{\partial{\mathbf{\vec{Oo}}}}=\frac{\partial{\mathbf{\Delta u}}}{\partial{\mathbf{\vec{Oo}}}} = \frac{\partial{\mathbf{\vec{Oo} \cdot \vec{E}}}}{\partial{\mathbf{\vec{Oo}}}}=\mathbf{\vec{E}}\\ \frac{\partial{\mathbf{\vec{Oo}}}}{\partial{\mathbf{\vec{Oi}}}}=\frac{\partial{\mathbf{g(\vec{Oi})}}}{\partial{\mathbf{\vec{Oi}}}}=\mathbf{g'(\vec{Oi})}\\ \frac{\partial{\mathbf{\vec{Oi}}}}{\partial{\mathbf{\vec{Ho}}}}=\frac{\partial{\mathbf{\vec{Ho}V}}}{\partial{\mathbf{\vec{Ho}}}}=\mathbf{V}\\ \frac{\partial{\mathbf{\vec{Ho}}}}{\partial{\mathbf{\vec{Hi}}}}=\frac{\partial{\mathbf{f(\vec{Hi})}}}{\partial{\mathbf{\vec{Hi}}}}=\mathbf{f'(\vec{Hi})}\\ \frac{\partial{\mathbf{\vec{Hi}}}}{\partial{\mathbf{W}}}=\frac{\partial{\mathbf{\vec{X}\cdot W}}}{\partial{\mathbf{W}}}=\mathbf{\vec{X}} yJ=y21(ry)2=erroruy=sign(ΔuΔy)Oo u=Oo Δu=Oo Oo E =E Oi Oo =Oi g(Oi )=g(Oi )Ho Oi =Ho Ho V=VHi Ho =Hi f(Hi )=f(Hi )WHi =WX W=X
整理可以得到对于输入-隐含层的权重系数的梯度下降公式为:
Δ W = − η ∂ J ∂ W = η ⋅ e r r o r ⋅ s i g n ( Δ y Δ u ) ⋅ E ⃗ ⋅ g ′ ( O i ⃗ ) ⋅ V ⋅ f ′ ( H i ⃗ ) ⋅ X ⃗ \Delta W = -\eta \frac{\partial{\mathbf{J}}}{\partial{W}} = \mathbf{\eta \cdot error\cdot sign(\frac{\Delta y}{\Delta u})\cdot \vec{E} \cdot g'(\vec{Oi}) \cdot V \cdot f'(\vec{Hi}) \cdot \vec{X}} ΔW=ηWJ=ηerrorsign(ΔuΔy)E g(Oi )Vf(Hi )X

同理可得,损失函数对隐含-输出层权重系数的梯度下降过程为:
Δ V = − η ∂ J ∂ V ∂ J ∂ V = ∂ J ∂ y ∂ y ∂ u ∂ u ∂ O o ⃗ ∂ O o ⃗ ∂ O i ⃗ ∂ O i ⃗ ∂ V ⃗ \Delta V = -\eta \frac{\partial{\mathbf{J}}}{\partial{V}}\\ \frac{\partial{\mathbf{J}}}{\partial{V}}= \frac{\partial{\mathbf{J}}}{\partial{\mathbf{y}}} \frac{\partial{\mathbf{y}}}{\partial{\mathbf{u}}} \frac{\partial{\mathbf{u}}}{\partial{\mathbf{\vec{Oo}}}} \frac{\partial{\mathbf{\vec{Oo}}}}{\partial{\mathbf{\vec{Oi}}}} \frac{\partial{\mathbf{\vec{Oi}}}}{\partial{\mathbf{\vec{V}}}} ΔV=ηVJVJ=yJuyOo uOi Oo V Oi
每一项的公式为:
∂ J ∂ y = ∂ 1 2 ( r − y ) 2 ∂ y = − e r r o r ∂ y ∂ u = s i g n ( Δ y Δ u ) ∂ u ∂ O o ⃗ = ∂ Δ u ∂ O o ⃗ = ∂ O o ⃗ ⋅ E ⃗ ∂ O o ⃗ = E ⃗ ∂ O o ⃗ ∂ O i ⃗ = ∂ g ( O i ⃗ ) ∂ O i ⃗ = g ′ ( O i ⃗ ) ∂ O i ⃗ ∂ V = ∂ H o ⃗ V ∂ V = H o ⃗ \frac{\partial{\mathbf{J}}}{\partial{\mathbf{y}}}=\frac{\partial{\mathbf{\frac{1}{2}}(r-y)^2}}{\partial{\mathbf{y}}}=\mathbf{-error}\\ \frac{\partial{\mathbf{y}}}{\partial{\mathbf{u}}}=sign(\frac{\mathbf{\Delta y}}{\mathbf{\Delta u}})\\ \frac{\partial{\mathbf{u}}}{\partial{\mathbf{\vec{Oo}}}}=\frac{\partial{\mathbf{\Delta u}}}{\partial{\mathbf{\vec{Oo}}}} = \frac{\partial{\mathbf{\vec{Oo} \cdot \vec{E}}}}{\partial{\mathbf{\vec{Oo}}}}=\mathbf{\vec{E}}\\ \frac{\partial{\mathbf{\vec{Oo}}}}{\partial{\mathbf{\vec{Oi}}}}=\frac{\partial{\mathbf{g(\vec{Oi})}}}{\partial{\mathbf{\vec{Oi}}}}=\mathbf{g'(\vec{Oi})}\\ \frac{\partial{\mathbf{\vec{Oi}}}}{\partial{\mathbf{V}}}=\frac{\partial{\mathbf{\vec{Ho}V}}}{\partial{\mathbf{V}}}=\mathbf{\vec{Ho}} yJ=y21(ry)2=erroruy=sign(ΔuΔy)Oo u=Oo Δu=Oo Oo E =E Oi Oo =Oi g(Oi )=g(Oi )VOi =VHo V=Ho
整理可以得到对于隐含-输出层的权重系数的梯度下降公式为:
Δ V = − η ∂ J ∂ V = η ⋅ e r r o r ⋅ s i g n ( Δ y Δ u ) ⋅ E ⃗ ⋅ g ′ ( O i ⃗ ) ⋅ H o ⃗ \Delta V = -\eta \frac{\partial{\mathbf{J}}}{\partial{V}} = \mathbf{\eta \cdot error\cdot sign(\frac{\Delta y}{\Delta u})\cdot \vec{E} \cdot g'(\vec{Oi}) \cdot \vec{Ho}} ΔV=ηVJ=ηerrorsign(ΔuΔy)E g(Oi )Ho

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

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

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');   % 输入和输出

运行结果如下图
在这里插入图片描述

总结

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

  • 40
    点赞
  • 115
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
### 回答1: 基于s函数的bp神经网络pid控制器是一种控制器,它使用了bp神经网络pid控制算法来实现对系统的控制。在Simulink中,可以使用s函数来实现这种控制器,并进行仿真。通过仿真可以验证控制器的性能和稳定性,以及优化控制参数。 ### 回答2: BP神经网络是一种常用的人工神经网络,广泛应用于控制、分类、映射等领域。PID控制器是一种常用的控制器,具有简单、稳定、易实现等优点。将BP神经网络PID控制器结合起来,可得到BP神经网络PID控制器,该控制器不仅具有PID控制器的优点,还能通过神经网络学习调整自身的权重和偏置,实现更加精准的控制。 在实现BP神经网络PID控制器之前,需先建立神经网络模型。以单输入单输出为例,设控制目标为y,控制器输出为u,则输入为e=y-d,其中d为设定值。神经网络的每一层包括若干个神经元,每个神经元都有一个输入、一个输出和一组权重。假设BP神经网络包括输入层、隐层和输出层,则神经元的输入可以表示为: $net_j=\sum_{i=1}^nx_iw_{ij}+b_j$ 其中,$x_i$为输入数据,$w_{ij}$为连接第$i$个输入与第$j$个神经元的权重,$b_j$为第$j$个神经元的偏置。 由此,神经元的输出可以表示为: $y_j=f(net_j)$ 其中,f()为激活函数,常用的激活函数包括Sigmoid函数、ReLU函数等,本例中采用Sigmoid函数。 以PID控制器为例,可将该控制器的输出表示为: $u(t)=K_pe(t)+K_i\int_0^te(\tau)d\tau+K_d\frac{de(t)}{dt}$ 将上式的$e(t)$替换为上述的输入形式,可得到神经网络PID控制器的输出表示式: $u(t)=K_p\cdot net_o+K_i\cdot\sum_{i=1}^t net_o+K_d\cdot\frac{dnet_o}{dt}$ 其中,$net_o$为输出神经元的加权总和。 通过神经网络的训练,可以得到网络中各层的权重和偏置。一般采用误差反向传播算法(Backpropagation,BP算法)进行训练,具体步骤为:给定输入数据,计算网络输出;计算误差,并将误差反向传递到网络中;利用误差修正神经元的权重和偏置;重复以上步骤,直至达到预期的训练效果。 为验证BP神经网络PID控制器的性能,可以使用Simulink进行仿真。在Simulink中,可用PID Controller模块搭建PID控制器模型,并使用S Function模块集成BP神经网络模型。具体步骤为:将S Function模块与PID Controller模块连接,将模型的输入和输出分别指向S Function模块的输入端口和输出端口;在S Function模块中编写BP神经网络模型的代码,并在其中调用MATLAB Neural Network Toolbox提供的函数进行训练和预测。 通过Simulink仿真,可以得到BP神经网络PID控制器的控制效果,包括控制精度、响应速度和稳定性等指标。通过调整神经网络模型的结构和训练参数,可以进一步优化控制效果。 ### 回答3: 基于s函数的bp神经网络pid控制器是一种高级的控制器,它结合了神经网络pid控制的优点,能够在复杂的控制系统中实现更加精准的控制效果。 首先,我们需要了解什么是bp神经网络pid控制BP神经网络是一种前馈神经网络,它可以用来处理非线性的输入输出关系。PID控制器是一种比例、积分、微分控制的算法,用于调节系统的输出与设定值的差异。 对于基于s函数的bp神经网络pid控制器,它通过使用神经网络的非线性特性来计算控制输入,而PID控制器则对方程中的误差进行修正和控制。此外,通过使用自适应学习算法bp神经网络pid控制器可以实现自动调节参数,从而适应系统变化和噪声干扰。 在Simulink中进行仿真实验时,我们需要首先搭建一个基于s函数的bp神经网络pid控制器模型。该模型包括输入、输出、神经网络PID控制和反馈环节。然后,我们可以使用不同的仿真场景来测试控制器的性能。 总之,基于s函数的bp神经网络pid控制器是一种可行的高级控制器,它融合了神经网络PID控制的优点,可以大大提高控制系统的性能和稳定性。在Simulink中进行仿真实验时,我们可以通过不同的参数设置和仿真场景来探究其性能和特点,为实际控制系统的应用提供更加精准的控制策略。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

争取35岁退休

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值