人工智能项目的开拓流程概述_模子_数据
1、数据处理-AI的粮食加工
人工智能项目研发的紧张阶段便是数据处理,既然是数据处理,那么须要有数据才能处理。数据作为人工智能项目的紧张材料之一,是不可或缺的,怎么得到良好的数据,是处理好数据的第一步,没有质量担保的数据,无论如何处理,也很难达到数据处理结果的哀求。
数据的哀求一样平常是根据项目终极的哀求而定的,比如拿图像视觉方向的项目来说,模型所须要确当然便是图像数据了,那么什么样的图像数据才算是比较好的数据,有利于模型的学习呢?一样平常来说图像数据对付现实物体的还原度越高越好,一样平常可以从图像的色彩三要素和图像像素的值来判断。
数据的还原度从根本上影响了模型终极输出的效果,但是如果拿到的原始数据质量就不是很好的时候,就只能想办法对原始数据做一些处理,以期望数据的质量更好一些。但是话说回来,数据处理只是治标不治本,也便是说如果数据的质量真的不怎么好,那么无论如何处理也是很难达到利用的效果的。
以是最好的办法便是采集和利用场景匹配度最高的数据,比如让事情职员到现场实地采集数据。这个做法是非常有必要的,不要光看现在顶会论文上的哪些指标,人家是在做学术研究的,大家利用的数据集都是一样的,比如coco,voc等等,只有利用同样的数据集才能分出大家谁的模型比较好,比如最近比较火热的YOLOX也是在COCO数据集做的测试,和以前各版本的YOLO做的比较。
比如说最近的某某模型增加了Attention后,创造accuracy、flops、mAp都提升了不少,又一次SOTA了,等过了一段韶光作者针对不同的任务对模型又做了一些Fine tune,结果比以前还更好。但实际上这些学术界看似超越之前的研究成果在实际工程运用中却没有想象中的那么美好,由于韶光工程中,不可能涌现两个不同的项目利用同样的数据集的情形。
在实际工程中,在采集数据的过程中,轻微不把稳的一些细节就将模型的上风抵消了。比如采集数据的时候,是从互联网上爬下来的数据,那么数据的质量可能就不会太好,如果实际事情环境是室内或室外固定的场景,那么最好是到实地去采集不同韶光、日期、景象情形下的数据,如果采集到好的数据资源,那么就算利用一个一样平常的模型,也能得到较好的结果。反之,如果演习数据和实际运用处景的数据差异过大,那么就算利用当前的SOTA模型,也很难达到预期的效果。
当然,再好的数据,采集回来后还是要做处理的,最直接的便是打标签,标签的设置确定了模型终极要学习的目标是什么。如果采集的数据数量不足,那么还须要做一些相应的数据增强来扩充数据量。
2、模型设计-AI的灵魂熔炉
如果数据是材料,那么模型便是容器,好的材料配上好的丹炉,才有产出好的丹药的可能。模型的发展是深度学习技能发展中较为主要的一环,无论是早期的卷积神经网络模型LeNet,还是后来的AlexNet,以及后面陆续涌现的VggNet、GoogLeNet、SqueezeNet、ResNet、DenseNet、DarkNet、MobileNet、ShuffleNet、EfficientNet,又或者是这两年异军突起的Transformer模型,以及CNN和Transformer的结合体,都有一个共同特点,那便是这些模型的发展都朝着一个共同的目标提高,这个目标便是更高的mAp值、更高的演习效率、更快的推理速率、更大的平台适应性。
可以从模型的发展进程中看出,深度学习的知识体系更新迭代非常之快,想要保持在技能知识上的前沿性,就须要不断的学习新知识。如果在企业事情,那么还须要将这些新的知识融入到工程运用当中,产生一定的实际代价。
如果单从神经网络模型的发展来看,彷佛想要在行业中出头,只能依赖不断的学习新知识,但是很明显,这样的本钱太高,一样平常的企业从业职员不可能每天都有很充裕的韶光来学习的,以是工程界和学术界对付新技能的关注度还是有些差异的,毕竟一个纯粹的学术研究,一个是落地的实际运用。
在学术界,模型的轻微提升,就可以揭橥一篇论文,乃至可以揭橥在顶会期刊上面,由于学术研究的便是在固定条件下的模型性能和效率。而工程界的条件不可能像学术界那样固定,每个详细的项目哀求都不一样的,而且不同项目的数据也是大相径庭,这样就会造成同样的模型,在不同条件下会涌现不同的结果,由于工程界实际项目的变量太多,将学术界影响结果的不愿定性条件扩大了,须要办理的问题自然也就增加了。
在学术界做研究的时候,有部分条件是人为固定的,只须要在模型的设计演习长进步效果即可,而到了工程界就变成了所有的条件都具有了不愿定性,比如设备、数据、平台、外部环境等这些变量对付终极结果的影响,一点都不亚于模型对付结果的影响。以是在工程界,当影响结果的这些变量在发生变革的时候,会涌现利用较弱的模型效果却超出较好模型效果的情形,其缘故原由便是模型上提升不敷以抵消其他变量带来的负面影响。
好的丹炉虽具有炼出好丹药的可能,但是如果丹炉放置的位置不好,常常刮风下雨、伴随地震海啸,那么这个丹炉的上风就不如放在一个稳定地面上的丹炉的效果了,更不用说所利用的材料出了问题了。当然学术界和工程界是相互促进发展的,学术界的技能研究为工程界实际运用做技能方向辅导,而工程界反过来监督验证学术界的研究成果是否有效。
3、演习优化-AI的学习发展
模型演习是最磨练算法工程师的实战履历的,比如选择什么样的主干模型,进行怎么样的微调,以及选择什么样的丢失函数和优化方法,是否进行多阶段演习,或者对图像数据进行多尺度演习等。此外还包括进行多大batch的采样,如何提高演习的速率,而这些都和详细的设备类型干系。
一样平常来说,有履历的演习职员,在演习模型的时候,不会一开始就输入大量的数据,而是做小批量的数据的演习,目的是先通过小批量数据来考验模型的好坏,然后再根据考验情形进行下一步的操作。很少会涌现直接一上来就利用大批量的数据演习模型的情形,由于这样的做法有点像豪赌,一旦模型涌现了问题,那么前面辛辛劳苦花费的大量韶光将会毫无成果,统统都要重新再来,这种大量的试错韶光本钱在真实项目开拓当中是有可能造成项目延期的。
一样平常模型演习开始之前先利用少量的数据快速的演习出一个过拟合的结果,用来验证模型是否得当。在实际事情中过拟合每每是不好的表现,但是我们可以利用它来做一些故意义的事情,比如用过拟合来验证模型是否合理,过拟合每每意味着参数过大,或者数据过少,导致模型测试的时候泛化能力太差,但是却能够见告我们,模型本身是没有问题的,问题就在于演习过度,或者数据集过少。既然都过拟合了,解释模型的参数是足够多的,而且也得到了精确的结果,这正是我们想要的,至于过拟合,可以通过增加更多的数据来办理。
如果模型有问题,那么想要得到一个过拟合的结果都是不可能的。如果在前期先演习一个过拟合模型,那么将能够大大的加强我们工程当中的容错率,哪怕演习出了问题,再调度模型也不会摧残浪费蹂躏太多的韶光,乃至可以再来一次,演习一个新的模型,由于过拟合模型的演习本来就花不了太永劫光。
如果太过自傲,模型演习一开始就把全部数据加载进去,那么模型的演习有可能会是几个星期乃至更长的韶光,然而一旦涌现缺点,那么摧残浪费蹂躏的韶光就太长了,有可能会导致项目的工期耽误。最好的办法便是利用少量数据演习过拟合的结果来不断测测试模型的精确性,当确定模型没有问题了,再加载大批量的数据演习。
4、评估验证-AI的监理辅导
模型评估是和模型演习伴随而行的,可以说演习一开始,评估也随之开始。演习和评估犹如部队上的司令员和政委,一个卖力攻城掠地,一个卖力监督辅导。可以比拟一下电视剧《亮剑》里的李云龙和赵刚,李云龙的职务是团长,卖力指挥前哨士兵冲锋陷阵,赵刚的职务是政委,卖力后勤和监督政策的实行。在剧里李云龙和赵刚常常吵架,由于李云龙的目标是如何打胜仗,而赵刚的目标不只要打胜仗,还要卖力部队整体的思想事情,监督政策的实行,防止一些冒险的做法。
比拟模型演习和模型评估,两者的关系也是如此。模型演习只卖力如何把模型演习好,至于要演习到什么程度才算得当,须要模型评估说了算。以是在开始一项任务的时候,模型演习和模型评估是同时进行的,正常情形下,模型演习一次,则评估一次,但是我们认为模型演习的前几次是不须要评估的,由于模型演习的前期,参数还没有学习到精确的数值。
根据履历,一样平常模型在演习到一定的次数之后,再启动模型验证部分,比较模型演习一开始就启动模型评估,这样的操作可以在担保模型有效评估的条件下加快模型演习速率,由于模型在演习到后期的时候,只凭履历是很难确定模型是否已经演习到得当的程度的。有了评估验证的过程,就可以根据验证的结果来判断模型是否须要连续演习了。
如果没有模型评估,那么模型演习就只能凭运气了,有时候模型演习结束后,可能模型并没有演习到位,这种情形还比较随意马虎处理,可以接着连续演习。但是如果模型演习过度了,就不太好处理了,一样平常来说模型演习过度之后的副浸染便是过拟合,过拟合情形相信大家都比较清楚,模型过拟合之后会导致泛化能力大大的降落,这肯定不是我们想要看到的。
模型评估一样平常可以通过验证集和演习集的丢失或精度的差距来做判断,看模型演习是否已经到位,须要停滞演习。模型演习只管演习是否有效,是否是否能够持续快速的降落模型输出与目标直接的差距。模型评估要监督模型演习何时该当停滞,不须要连续演习。
5、测试调度-AI的战前试炼
模型测试是项目交付前的末了一次试验,测试的目的便是和项目方给出的指标做比拟,比如精度、速率等指标。以是作为项目交付前的末了一次测尝尝验,一定要按照项目方提出的指标哀求做测试,测试的数据最好是从项目方实际的事情场景中采集,如果条件不许可,那么测试数据一定要最大可能的靠近项目方实际事情场景的数据,只有这样才有可能在项目交付后不会涌现算法指标上的问题。
测试数据不仅从质量上要靠近真实场景的数据,而且在数量上也要达到一定的量级,测试的结果才会更加靠近真实场景下的结果。根据大数定律,在试验不变的条件下,重复试验多次,随机事宜的频率近似于它的概率。有时中包含着某种一定。以是当数据的数量达到一定的量级,也就意味着测试的结果也会越多,终极所有测试结果的期望也就越靠近真实结果。
在实际场景下的大规模数据测试中,如果涌现测试结果和项目方给出的指标相差太远,当然这里所说的是模型测试出来的指标比项目方给出的指标要低。那么就须要对模型或者样本数据做调度之后再演习,或者重新演习模型。
如果模型在演习和验证的时候各项指标都没有问题,但是在测试的时候,却涌现了指标连忙低落的情形,一样平常涌现这种情形,大部分缘故原由都是由于测试数据与演习数据、验证数据差距太大造成的,也便是说演习集和验证集的数据差距不大,属于相似的数据场景分布,很有可能是从互联网得到的数据,而测试集的数据很有可能来自真实场景下采集到的数据,因此测测试集与演习集、验证集之间就会有很大的差距,而数据差距则是造成测试集的结果连忙低落的紧张缘故原由,办理方案便是更换演习集和验证集的数据,最好也是从真实场景中采集。
当演习集、验证集、测试集都来自于统一场景下的数据的时候,不仅测试结果能够达到满意的效果,而且每每在支配之后,也不会涌现算法指标上的问题。
6、支配履行-AI的落地成型
模型支配是模型在实际项目中的落地运用,模型支配包括了各种不同的编程措辞的支配,比如常见的C/C++、JAVA、Python,以及其他措辞,各种措辞由于其自身的特性,在支配的时候支配方法也不大一样,比如按照某些定义而言,C/C++属于编译型措辞,Python属于阐明型措辞,总之两者的程序实行过程的差异导致它们在支配的时候要考虑跨平台性的问题。
粗略的来说,由于C/C++的编译特性,它会将原生的程序代码天生一个可实行的二进制文件,这个过程称为编译过程,这个二进制文件相称于一个中间文件,实行这个中间文件的效率要比实行原生代码的速率快的多,这也是为什么很多算法程序利用python来开拓,但是在推理支配的时候却要换成C++,其紧张缘故原由之一便是C++天生的中间程序能够加快推理速率,其余在安全性上也是比python要超出不少的,由于C++的打包程序是很难被反编译的,而python在这点上就要逊色不少。
其余,C/C++在不同的系统平台下天生的中间程序,在实行的时候只能在当前的系统平台上运行,一旦放到其他系统平台上就运行不明晰,比如在Windows平台上天生的中间程序,只能在Windows平台上运行,在Linux平台或者其他平台上是运行不了,如果须要在其他平台上运行,则须要在对应的平台上重新编译才行。
而python就不一样了,阐明型措辞的特性使它具有跨平台的方便性,在一个平台上编写的措辞可以放在其他任何平台上运行。但是由于阐明型措辞的特点,python程序的运行速率是没有C/C++的速率快的,以是如果是实现自己的算法想法,那么python无疑是最好的选择,但是如果要支配在工程运用上C/C++则更具有上风一些。
从支配的设备上来说,大概可以分为PC端(个人电脑)、Server端(做事器)、Mobil端(移动设置:iOS,Android)、IOT端(传感器、板卡:Android),各种支配的方法也是大同小异,拿英伟达的JetSon nano系列来说,支配方法非常大略,只要你买回来按照上面的解释支配,基本都能够成功的支配上的。
这里大略说一下在pytorch框架下的支配,在pytorch框架下支配基本可以分为三种方法,第一种是利用指定的编程措辞(C/C++/JAVA)调用Libtorch在对应的平台(Windows/Linux)编写程序,然后直接支配。
第二种方法是先利用python在任意平台编写模型(跨平台),然后利用torch.jit.trace()将python文件转成c++文件,末了利用save()方法打包成.pt文件,然后利用C/C ++/JAVA或其他措辞在其他平台上调用。
第三种将python模型转换成onnx,再转成caffe,tensorflow等其他框架的模型。
后记:目前人工智能项目的开拓流程相对来说还没有形成标准,各种方法都有,以上流程只是根据当前大部分人工智能项目的开拓履历而总结,难免有遗漏之处,欢迎各位大牛们前来示正,做为一名炼丹学徒,这条路才刚刚开始,希望各位行业同仁共勉!
作者:智谷炼药协会学徒
本文系作者个人观点,不代表本站立场,转载请注明出处!