首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

基于自搭建BP神经网络的运动轨迹跟踪控制(二)

1 前言

朋友们~好久没见~。在上一篇基于自搭建BP神经网络的运动轨迹跟踪控制(一)中,首次给大家介绍了如何将BP神经网络模型用于运动控制,并基于matlab做了仿真实验。最终实现了对期望轨迹的智能跟踪的功能。

但是,在那篇文章的最后,也提出了一个有趣的问题,该问题是:“该实验进行参数辨识需要先采集好数据到工作区间进行离线训练,然后再把参数一个个填到BP网络的控制系统中。如果隐含层神经元数量过多的话,那么这个工作无疑是繁琐的。那么有什么办法可以解决呢?”不知道大家有没有认真思考过这个问题,并自己尝试去解答(因为我没有收到任何相关的留言和后台记录)。其实这个问题的答案就在我之前写过的一篇里面。那么这个答案究竟具体是之前的哪个呢?它又是如何用来解决的呢?接下来由本篇文章给大家介绍~

2 问题分析

首先我们回顾一下上一篇文章里面的BP前馈控制器的内部结构:

从上面结构中,我们可以发现,整个控制器的每个参数模块的值都是固定的。例如输入层与隐含层之间的连接权值模块,隐含层阈值模块,隐含层与输出层之间的连接权值模块。这些模块的值在matlab的工作空间中计算后,将其输入到BP控制器对应的模块,从此就不在发生变化了。假如因为工作需要,把该控制器结合到另一个不同的运动系统里面去应用时,或者添加新的模块时,而恰恰由于这些模块里面的参数是固定的,不能自我更新,所以才导致前言所述的繁琐工作的发生。

所以,一个可以考虑的解决方法就是,这些参数不需要通过人工一个个填进去,而是能够自我确定的,也就是我们常说的“在线自适应”。那么问题来了,这些参数模块该如何自适应才能确保得到的控制器是可以使用的呢?

在这里,我们回想一下对BP算法的若干迭代方式的实验探究(一)中所介绍的算法1对BP神经网络的每个参数的求解过程。就会发现,如果我们把这个参数求解过程的机制用控制器的一个模块来实现,那么不就解决了问题了吗?

那么该如何设计这种能具有自动求解BP控制器参数的模块呢?接下来,先再次回顾一下,以算法1来求解模型参数的过程。

3 BP控制器参数求解的数学原理回顾

模型的输入输出依然跟上一节一样,输入为期望位移y,输出为对应的驱动电压值u。

设模型隐含层激活函数为:

(1)

输出层激活函数为:

(2)

则与期望位移y对应的模型的实际输出为:

(3)

以模型输o与样本值u的均方误差作为模型逼近的损失函数:

(4)

其中T为采用周期,i为第i个采用周期下的观察值。

那么根据对BP算法的若干迭代方式的实验探究(一)中所介绍的算法1,可以得到模型每个参数的迭代求解方式如下:

(5)

上面的是隐含层在第iT时刻,第s个隐含层神经元的输出;h为学习率。如果到现在,有朋友还是不知道上面式子怎么来的,建议一定要自己亲自动手推导一下。加深印象。从上面方程组(5)可以看出,该方法可以看成是系统一边运行,然后一边采样,参数一边更新的过程。那么就可以根据这个数学原理,对模型的参数实现在线。接下来将介绍如何通过这个一个数学原理构造对应的参数自适应模块。

4 基于参数求解的数学原理的参数自适应求解模块

通过上面方程组(5)可以清楚的发现,每个参数更新到下一次采用时间的值时,都需要用到当前采用时间的某些值。为了方便分析,我这里以下式为例子:

(6)

通过上面式子可以发现,输入神经元与第s个隐含层神经元之间的连接权值ws的更新值,除了和学习率h有关外,还和该时刻的βs值,fs值,ws值,e值以及y值有关。对此,模块的输入输出端可以设计成如下结构:

同理,其它几个参数的自适应求解模块如下:

大家有没有注意到,我在设计β模块的输出时,多了一个,其实道理很简单,隐含层第s个神经元的值fs输出后,就是与β值相乘了,而β自适应模块里面,本身就有了fs值输入,所以为了简单方便,也就顺便把fs与β相乘的值一起输出了。

那么现在每个参数的模块的输入输出都知道了,内部又是怎么运行的呢?在matlab里面有什么基本模块可以给我们做这种多输入多输出的模块自定义呢?

这里,我将介绍matlab simulink里面的fun模块,该模块其实就是个简单的函数模块,主要是把传统控制模块难以实现的功能,用脚本语言运行,但是又能够嵌套到运动仿真中运行。具体如下图:

上面两个图的第一个图是外部结构,第二个图是根据式子(6)写的程序。到此,我们只要把这些模块替代原来的固定常数的模块,就可以啦~,局部结构如下:

在上图中,大家应该发现了两个问题:

第一个问题:为何使用了延时环节(Z-1)?这是因为,根据式子(6),实际中,我们一般是想得到当前时刻的参数更新值,因此要利用之前时刻的某些相关值进行输入,而为了得到之前的相关值,就可以利用延时环节了,这里延时时间与采用时间一致(默认值)。

第二个问题:为何隐含层的阈值依然是常数C,而不使用自适应模块呢?这是因为为了使得BP控制器内部结构不过与复杂,因此只给隐含层阈值一个常数,而不进行迭代求解。因为,在整个神经网络力量,某些少量的参数不被训练并不会影响整个网络的功能的(这个以后有机会再给大家介绍)。

就这样每个参数的自适应模块的介绍到此为止了。接下来就是总体框架和实验仿真环节了。

5 基于自适应BP控制器的在线参数辨识实验

这里,设计隐含层神经元数目与上一篇一样,也就是3个,整个自适应BP控制器内部结构如下:

上图中的红色部分即是自适应BP控制器的外部输入(y,e,h),也是多个参数自适应模块的共享输入值,黄色的自适应BP控制器的输出值o。将上述结构集成为子系统后,即可搭建出下面的仿真框架:

示波器1是用于观察自适应BP控制器对系统的辨识(训练)效果,示波器2是观察在线辨识(在线训练)的动态误差。

实验1:

如下图,输入为正弦信号,系统为一阶系统。

实验1结果如下:

上图为跟踪效果图,幅值大小为2V,下图为动态误差,通过动态误差可以发现,开始阶段,误差比较大,到了后面基本稳定了,这是因为开始阶段,参数迭代次数比较少,参数自适应过程还没达到很好逼近系统的效果。到了后期,当迭代次数足够的时候,参数就收敛的一个极小点处,因此误差也就稳定了。总的来说,这种情况下,起始误差为0.67V,最大误差为0.67V,自适应辨识的稳定误差小于0.01V,即稳态相对误差小于0.5%。从开始过渡到稳定耗时为0.05s。

实验2:

如下图,输入为正弦信号,系统为二阶系统。

实验2结果如下:

从图中可以发现,其结果与一阶系统基本一致,因此不再做分析。

实验3:

如下图,输入为阶跃信号,系统为二阶系统。

实验3结果如下:

通过上面结果可以发现,在阶跃信号突变后,自适应BP控制器的辨识误差就突然变大,整个过程中,最大误差约为0.67V,过渡用时为0.17s,稳态误差为0。

6 总结与讨论

通过本篇推文,大家已经认识到了,只要自适应BP控制器的框架搭建好,利用本文方法所构建的自适应BP控制器,可以在不同系统不同输入信号下进行自适应的挑调整参数。避免了传统静态辨识(离线训练)方法所导致的了耗时繁琐的问题。另外还可以看出,这种在线自适应参数调整方式,其稳定速度和稳定误差都是比较理想的。与基于自搭建BP神经网络的运动轨迹跟踪控制(一)介绍的方法的精度是一个级别的。

另外,大家也发现了,不论是《一》文中的静态辨识,还是《二》文的动态辨识,所用的原理基本是一套的。只不过是从不同的角度利用而已。所以如何用好一个知识,也是非常值得思考的。而且,对于前言部分提到的这个问题,不同的人,不同的角度除非,肯定另有别的方法。希望有想到的朋友可以多多交流~

最后,大家不要忽略了,这篇仅仅只是介绍了系统辨识,也就是说,只是学习了系统的特性,还没有进行运动控制。那么当该如何把在线辨识好后的模型过渡到在线控制呢?这点留给大家可以思考一下。有想法欢迎留言~。

以上内容即为本次介绍的内容,谢谢浏览~。

如有朋友喜欢我的文章,欢迎你们和你们的道友们一起分享,更加欢迎你们与我交流讨论~

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171220G086NU00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券