“不愤不启,不悱不发。举一隅不以三隅反,则不复也”。
-- 《论语·述而》
再次将论语中的这句“不愤不启,不悱不发”引用在这里,说明学生的学习的获得部分来自老师,部分来自于自己主动的“愤”“悱”,否则老师无法进行“启发”。
下面是今年参赛同学就 AI 应用与电磁车模的学习心得,无论他说的对与错,都会在交流和实践中得到提高。在这里转载供大家讨论。
AI 机器学习实战の电磁导航智能车中神经网络应用的问题与思考 - 交流向 - 本科生竞赛——本文略长,可能需要十分钟到半小时的阅读时间。
前言
在机器学习与人工智能高速发展的大背景下,本科生竞赛也在逐渐朝这方面靠拢。全国大学生智能车竞赛也在今年(2020 年)的比赛类别中加入了一组需要用到神经网络模型来控制车模运行的组别——AI 电磁组,因为大一到大三年级走过来之后,也算对这个比赛有些感情,恰好新组别的内容也与笔者现在研究的内容有些交集,于是想与各位同学和前辈探讨一下关于这个新组别的一些问题和思路。
当然笔者现在也只是刚刚入门,并非巨腕大鳄,文章难免有错误和纰漏,正因如此,希望能跟大家交流,以弥补自己学习中的不足。如有需要,可以在评论区留言或通过以下途径与我联系:E-mail:zhouhaonan@mail.sdu.edu.cn QQ: 2733979004 WeChat: muyexiaoxiao_
首先申明,笔者博客写作完全处于兴趣和交流需要,若有引用也会尽可能的标注,不会从事任何商业商业活动,若有侵权或者引用不全不当之处,烦请指出,但不一定改(手动滑稽)。
赛题背景简介
本组别的比赛任务为:在由直道、弯道、十字和环岛等元素组成的赛道上,中央铺设有一根通有 20kHz 交流电的电磁引导线,比赛赛车需要通过电磁传感器——如工字电感——感知电磁信号沿赛道行驶一周,用时最少者获胜。
由于我们的控制系统在时域上都存在一定的滞后,因此我们在确定控制器输出的时候往往需要一些超前的信息来抵消这一段滞后的信息,也就是我们通俗所说的“前瞻”。但由于新的组别中限制了前瞻的长度——不能超过车轮五厘米——限制了我们通过加长前瞻来获取超前信息的途径,人们的思路就自然而然的想到了时下正火的“人工智能算法”来解决这个问题。
当然,按照笔者的理解,此处的“人工智能算法”还是要加个引号。
带有大前瞻的实验 AI 电磁车模
来自卓晴老师公众号的解决方案
前几天,一位学弟给我发送了这篇介绍在该竞赛组别中可以使用的神经网络策略(以下简称本策略)的文章。原文链接: AI 机器学习实战电磁智能车篇[1]
这篇文章给出的思路大致可以描述为,通过长前瞻的经典控制方法采集数据并将经典的控制算法中的控制器输出作为数据集的标签,并且通过这些训练数据将该问题转换为一个从车模近处的电感值映射到舵机控制输出的回归问题。或许是为了保持比赛的竞争性,这篇文章中只是给出了简单的模型和做法,对可能存在的一些问题以及其中存在的原理并没有多做说明。
当然本文也只是处于共同交流和学习的目的,并没有破坏竞赛公平性的想法,也不打算敝帚自珍,只是根据其中存在的一些问题发表一下自己的看法。为防止气氛过于沉重,下面给出一张自己阳光的笑容。
作者自己的肖像
为什么这个问题可以使用神经网络回归来解决
实际上我们所有的控制问题,都可以采用抽象成数学函数或者说映射的方法来思考。就本文中所提到的竞赛问题来说,若设向量 V 为所有电磁传感器的采样值,其维数为电磁传感器的数量;向量 P 为我们控制器输出的值,此处可以理解为输出的 PWM 值,其维数可能为 1,即舵机转向角度,再更高级的策略中其维数也可能为 3,即舵机转向角度与左右轮的速度。此时我们将这个函数表示为:
或许已经有同学已经感觉简单到惊讶了,实际上本来这也并不是一个复杂的问题。但是此时 函数 f 的形式对我们来说仍然是未知,这可能根据系统前瞻的不同,电感感值放大倍数,机械摩擦与采取的控制器(如 PID)策略有所不同。如果已知函数的具体形式,我们可以通过最小二乘法或牛顿法等方法完成函数的回归与拟合,但是目前来说,该函数的形式是未知的。
然而,幸运的是,神经网络有一个很重要的特点就是:一个足够复杂的神经网络,拥有逼近任何函数形式的能力。因此我们所要做的就是确定好输入和输出,其他的东西交给数据和神经网络来完成,这就是机器学习的魅力所在。
搞清楚这一点之后,我们再来讨论为什么这个方法可以解决前瞻不足的问题。回到我们刚刚说的函数映射,现在我们要面对的问题就是,我们的前瞻长度受到了限制,我们再也无法取得具有超前信息内容的电磁传感器输入向量 V ,但是仍然可以取得车模近处的传感器信息,此处我们设为 V’ 。
根据往常的思路,这时候我们首先想到的是什么呢?当然是,如果我有一个方法可以找到 V’ 和 V 之间的关系的话不就万事大吉了么。于是,就有了函数映射:
当然,这时候我认为绝大部分比较聪明的同学就已经想到了,如果按照这个思路的话,我需要完成两次映射的过程,既然神经网络号称自己可以逼近任何函数,那我将两次函数映射合并为一次之后的映射,那也必然是任何函数中的一种了。于是就有了:
到了此时,我要做的也就是通过神经网络来逼近函数 这也就变成了经典的函数回归问题,也就为这种解决方案提供了合理性和可实现性。此时神经网络的输入 input 即为我们当前采集到的电磁传感器信息 V’ ,输出则为我们之前所提到的 P 。可以参考公众号原文中的神经网络结构示意图:
神经网络结构示意图
但是,该实现方法虽然从理论上是可行可实现的,但是经验和理论分析都告诉我们,这种方法实现的控制器在实际应用中鲁棒性较差且存在一些不足,下面本文会一一列举,若有未提及或者错误,欢迎联系我进行补充或指出。
神经网络回归方法的策略可能遇到的一些问题
遇到未曾训练过的值的问题 - 实践角度分析
首先我们的神经网络在训练的时候,只能根据训练集中的数据进行回归学习,就像一个人在学习初期,也只能通过自己见过的事物来学习。就比如,你在池塘里见到一条鱼(训练数据 - 输入),这个时候有人过来告诉你这个东西他是一条鱼(训练数据 - 标签)。当你经过这次训练之后,下次如果你再见到水里的一条鱼(验证数据 - 输入),你就可以告诉别人这是一条鱼(验证数据 - 输出)。
但是这个时候问题就来了,你只知道水里的那一条鱼的名字是鱼,下次见到一条鱼你还是认得的,但是你并没有学习过,也就是没有被训练过,一个乌龟应该长什么样子,那当你见到一直乌龟的时候,你不认识他,可能就只能胡言乱语了。
问题类比到我们比赛题目的内容中就是,如果你在采集训练数据的时候,车模一直根据之前已经调试好的控制器运行,可能由始至终都运行在一个比较“良好”的状态,也就是我们说到的鱼。但却很少处于偏离中心的位置,也就是之前我们提到的“乌龟”。
因为神经网络模型对我们来说实际上是一个黑盒子,所以我们并不能寄希望于神经网络会将原控制器在训练数据之外的特性也学到,更不能指望车模永远运行在一个良好的状态。原策略中对该问题的解释如下:
AI 模型运行时会有误差,迟早导致出轨,那么有哪些误差呢:
模型计算的误差,逻辑回归引入的误差,无论训练多少遍一定会存在一定的误差;
训练数据采集时的误差,前置电感和车身电感距离上的误差;
累积误差,前两种误差会导致小车偏离轨道以至误差越来越大。积累到在训练数据里没有出现过的程度时,模型就不知该怎么办了,这是出轨的根源(说起来简单,小编其实被虐了很久才悟出来)。
之所以要特意引用一下这一段,一方面为了说明误差的来源,另一方面笔者认为这里有一处错误需要指出。
如何来解决模型推广性问题
引用文本的第二行中提到了“逻辑回归引入的误差”,笔者个人认为在此处用逻辑回归这个词是不恰当的:因为逻辑回归(Logistics Regression)虽然带有回归二字,但逻辑回归处理的并不是回归问题(连续值问题),而是分类问题(离散值问题),而且逻辑回归又名逻辑分类器(Logistic Classifier)特指分类问题中的二分类问题。(因为笔者曾经有一篇论文中用到了 Logistic Classifier,因此对此印象极为深刻,也由此可见经常写一些东西确实是对学习有帮助的。(瞎扯))
测试车模在学习过程
当然,原文中也给出了一种解决方案,即在程序中故意引入误差以及手动移动车模(manually),但笔者认为这样的方式仍然存在缺陷,首先数据量可能不足,其次误差涵盖的数据范围不够广泛。
实际上在传统控制器中故意引入误差,虽然说是误差,但是这个误差是我们通过编程主动引入的,很可能存在很强的规律性和特征性,并不能让模型拥有足够的泛化性能;同时,手动操纵车模与车模自动运行的情况存在极大的差异,这个差异可能大到我们可以将这两种误差看成两类误差,并不相互具有代表性。
模型车在运行过程中采集数据
实践是硬道理
究其根本,出现这个问题的原因就在于,我们通过以上方法训练出的神经网络,一直都是在看别人怎么做(off-policy),却从未尝试从自己的动作中去吸取教训总结经验(on-policy)。这种行为就像是一个学生,平时在学习的时候一遍遍的只看别人做的答案,却从不自己动手解题总结经验,这样的状态上了考场,虽然考零分可能不至于,但很难拿到一个理想的分数;又可以总结成战国时期的赵括,自幼熟读兵书与各个大将指点江山激扬文字,却因从未亲自带兵打仗而只能纸上谈兵,所以真正到了战场上指挥战斗的时候才会被秦将白起坑杀十万大军。
遇到未曾训练过的值的问题 - 理论角度分析
上一个节比较偏向实际问题的分析,而这一节可能会略微有点偏向理论。考虑到智能车参赛选手向来都有“实践能力强,理论能力弱”的传统特征,这一段会在依旧通俗易懂的情况下简单带过,但是不得不讲,目的当然是突出一下俺本人理论能力也还可以的特征。
之前我们已经了解到,该问题是通过回归的方式解决的,那么既然是回归问题,无论是通过何种方式实现,它一定还是会遵照回归问题本有的数学法则和特征。由于该问题中的输入和输出都是多维的向量,在讲到相关概念进行点的表示或者范围切割的话就必然要涉及到超平面的概念,这不但对笔者画图产生了很大的困难(主要困难),也会给各位看官在理解的时候增加难度(次要困难)。因此我们将采用类比的方式,将该问题映射到二维的平面空间(y-x)中去理解。
回归问题,也可以说是拟合,就是通过一些数据点找到一个函数来尽可能的靠近这些数据,以最简单的一次函数回归问题来说,情景如下所示:
一次函数回归
其中红色的叉代表我们数据集中的数据点,而蓝色的则代表我们通过训练数据得出的函数模型,从现在的情况来看我们用这个一次函数——确切点说是正比例函数——来拟合相关的数据是没有问题的,该模型基本可以体现出数据相关的规律。但是当情况变成下面这样的时候,可能效果就不那么理想了:
非线性函数回归
其中蓝色的是我们训练出的模型及其预测输出,绿色和橙色则是实际上我们的目标函数的形式与实际应该得到的数据。可以看出,虽然在我们训练数据(红叉)所涵盖的范围内,训练模型和实际模型贴合的很好,但是一旦出了这个范围就很难再保证有这么好的效果了,甚至天差地别。因为今天实在是太晚了,就只能暂时拿 iPad 手动画的图来将就了。
模型训练欠拟合与过拟合的问题
首先,让我们来了解一下欠拟合和过拟合的概念,首先用一张图来说明:
模型训练过拟合
用通俗易懂的概念来讲,就是我们可以把神经网络的训练过程类比到人的学习过程。还拿鱼和乌龟的例子来讲,有一天你在水里看到一个正在游的东西,这时候有人告诉你这个东西是鱼,然后这个时候你记住的东西不多,就记住了——在水里游的东西就是鱼,于是等你下次见到乌龟也在水里游的时候你就会得出一个结论:这是一条鱼!。而这就是欠拟合的特征。
过拟合又是一种什么情况呢?还是相同的情况,你看到水里有一条红色的鲤鱼正在游动,有人告诉你这是一条鱼,这一次你记住的东西就有点太多了:在水里正在游动的,是红色的,有很好看的尾巴的鲤鱼是鱼,于是下次的时候,你不光觉得乌龟不是鱼,甚至停在水里的红鲤鱼,在水里游动的绿鲤鱼还有在水里游动但是没那么好看的红鲤鱼,你都觉得它不是鱼!这怎么能是鱼呢!而这种情况就是过拟合。
欠拟合与过拟合是在进行机器学习训练的过程中经常遇到的问题,原文中对这个问题并没有引入描述,但我们却不得不考虑,我们如何判断自己训练的模型有没有过拟合,以及判断出结果之后我们应该怎样纠正这个问题。
如何判断特殊赛道元素以及何时加速减速
因为我们无法再取得超前的赛道元素信息,因此无法提前做出提前对赛道特殊元素——如十字,直道、弯道和环岛——也就无法及时做出加减速指令以及特殊的转向控制指令。而车模近处的多个电感的信息特征可能不是太明显,直接用显示的 if…else…语句可能并不能很好地达到判断的效果,即使我们可以通过人为设定复杂的判断条件,但这是否又令使用机器学习的意义……那啥了……大家都懂,但我一时想不到何时的词语了。当然,关于加速减速问题,我们可以直接在上述神经网络模型中直接输出车模运行速度的信息,但这是否需要增加网络的复杂程度,以 CPU 贫瘠的算力是否还能承担相关的任务,都有待考量。当然笔者目前也被困在家中,无法进行试验测试,这里只是引出思考而已。
强者恒强,模型缺少进一步发展的潜能
因为该神经网络模型在训练的时候,需要有一个传统控制器来设置数据的标签,以为先导。而这就不得不提到智能车竞赛领域一个很著名的词语:祖传代码。以往应用祖传代码的时候还需要看懂并加以修改,这次只是用来采集数据的话,甚至直接把原车拿过来跑一圈,可能就可以了。
以传统控制器为先导标签训练出的神经网络模型,几乎原有传统控制器的性能就是该神经网络模型性能的上限,神经网络模型本身缺少进一步继续发展的潜力。
当然,既然咱已经在这里写出来了,当然也就意味着有相应的解决方法了 hhhh
相关问题的解决与笔者的个人思路
一句话,那就是:让车模自力更生、真正的自己去学习!
这一段会有对上述问题的解决方案以及笔者本人对该项目的思考和思路。但因为这一段要展开讲的话恐怕又要几千上万字的篇幅,现在已经是凌晨,恐怕很难以充足的精力写好这一段,因此占下坑位,留作日后更新!同时希望这段空出来的时间可以集思广益,欢迎各位同学相互交流,提出新的问题或已有问题的解决方案。
不知道俺的博客能不能有机会被竞赛组委会看到……也不知道被看到之后会不会给俺发点稿费改善一下伙食……现在的时间是 2020 年 3 月 31 日 02:19:09,也是时候该做个梦了~
最后留下一句话,机器学习算法性能的提升,计算量增加绝对不是一定要承受的东西!
最后的最后,笔者基本会以每周一篇的频率发表一些博客。内容主要是有:控制,机器学习,强化学习和 ROS 系统等,目的主要是记录自己学习的成长历程,以及与各位朋友各位同行分析交流,希望大家可以关注一下我的博客。
https://blog.csdn.net/qq_38427871/article/details/105210885
最后的最后的最后,如果再写一句我就是狗。汪!
参考资料
[1]
AI 机器学习实战电磁智能车篇: https://mp.weixin.qq.com/s/JRv0e_oru3clC-xHJIubTw
- 大功率串联型稳压电源
- LTC3615MPUF-1 双路 3A 同步降压型 DC/DC 转换器用于 DDR 存储器终端的典型应用
- 408最小系统
- MC78M20CTG 20V 电流升压稳压器的典型应用
- NB4N441MNGEVB,用于 NB4N441 的评估板,用于 SONET 的 12.5 至 425 MHz PLL 时钟发生器
- AM2LS-0515SH30-NZ 15V 2 瓦 DC-DC 转换器的典型应用
- NCN5192GEVB,用于 NCN5192NG 单芯片 CMOS 调制解调器的全 VER Hart 调制解调器评估板
- 6418电子管式耳放
- MC34071ADR2G 高阻抗差分放大器的典型应用
- LF25CDT-TR 2.5V 延迟开启低压降稳压器的典型应用