Select Language

AI社区

数据要素产业

人工智能项目的开发流程概述

人工智能作为当下最热门的行业之一,不管是高考的专业选择中,还是各行各业的工作中,基本都会听到人工智能这个词,主要原因就是社会上各行各业对人工智能的需求越来越大了。在国内,从2015年开始,人工智能技术就已经逐渐渗透到了各行各业了。那么实现人工智能的过程是怎么样的呢?我们所看到的人工智能产品到底是怎么一步步走到我们眼前的呢?接下来我们就以人工智能领域最为火热的深度学习为例,详细分析一下人工智能项目的研发流程。

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等其他框架的模型。

后记:目前人工智能项目的开发流程相对来说还没有形成标准,各种方法都有,以上流程只是根据当前大部分人工智能项目的开发经验而总结,难免有遗漏之处,欢迎各位大牛们前来指正,做为一名炼丹学徒,这条路才刚刚开始,希望各位行业同仁共勉!

作者:智谷炼药协会学徒