一、了解人工智能
1.1、对人工智能的理解:
人工智能(AI)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学(定义)。人工智能利用机器学习技术,通过对现有的经过处理(筛选、消噪、过滤等)的数据,不断进行矫正(设置阀值等方法)机器模型的输出,此过程称为训练,期望通过训练可以得到在未来新数据上有良好表现的模型,从而投入生产。
1.2、人工智能目前应用的一些领域:
语音识别:人工智能在语音识别方面的应用相对较好,如siri、多邻国读音识别等
图像识别:如高速车牌识别、人脸识别等
个性化推荐:如亚马逊、今日头条根据用户阅读历史做的推荐系统,利用人工智能进行调参数等
二、AI相关测试
一般这些项目都要测试什么,要进行什么类型的测试。
模型评估测试
模型评估主要是测试 模型对未知新数据的预测能力,即泛化能力。
泛化能力越强,模型的预测能力表现越好。而衡量模型泛化能力的评价指标,就是性能度量(performance measure)。性能度量一般有错误率、准确率、精确率、召回率等。稳定性/鲁棒性测试
稳定性/鲁棒性主要是测试算法多次运行的稳定性;以及算法在输入值发现较小变化时的输出变化。
如果算法在输入值发生微小变化时就产生了巨大的输出变化,就可以说这个算法是不稳定的。系统测试
将整个基于算法模型的代码作为一个整体,通过与系统的需求定义作比较,发现软件与系统定义不符合或与之矛盾的地方。
系统测试主要包括以下三个方面:
1、项目的整体业务流程
2、真实用户的使用场景
3、数据的流动与正确接口测试
接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。文档测试
文档测试是检验用户文档的完整性、正确性、一致性、易理解性、易浏览性。
在项目的整个生命周期中,会得到很多文档,在各个阶段中都以文档作为前段工作成果的体现和后阶段工作的依据。为避免在测试的过程中发现的缺陷是由于对文档的理解不准确,理解差异或是文档变更等原因引起的,文档测试也需要有足够的重视。性能测试
白盒测试–代码静态检查
竞品对比测试
如果有涉及时,可针对做竞品对比测试,清楚优势和劣势。比如AI智能音箱产品。安全测试
发布上线后,线上模型监控
测试数据
不管是机器学习,推荐系统,图像识别还是自然语言处理,都需要有一定量的测试数据来进行运行测试。
算法测试的核心是对学习器的泛化误差进行评估。为此是使用测试集来测试学习器对新样本的差别能力。然后以测试集上的测试误差作为泛化误差的近似。测试人员使用的测试集,只能尽可能的覆盖正式环境用户产生的数据情况。正式环境复杂多样的数据情况,需要根据上线后,持续跟进外网数据。算法模型的适用性一定程度上取决于用户数据量,当用户量出现大幅增长,可能模型会随着数据的演化而性能下降,这时模型需要用新数据来做重新训练。
上线只是完成了一半测试,并不像APP或者WEB网站测试一样,测试通过后,发布到正式环境,测试工作就完成了。
测试集如何选取很关键,一般遵循两个原则:
测试集独立同分布
测试数据的数量和训练数据的比例合理
测试集独立同分布
不能使用训练数据来做为测试数据,此为独立。
测试数据需要和训练数据是同一个分布下的数据,此为分布。
举个例子,训练数据中正样本和负样本的分布为7:3,测试数据的分布也需要为7:3,或者接近这个分布,比较合理
测试数据的数量和训练数据的比例合理
当数据量比较小时,可以使用 7 :3 训练数据和测试数据
(西瓜书中描述 常见的做法是将大约 2/3 ~ 4/5 的样本数据用于训练,剩余样本用于测试)
或者 6:2 : 2 训练数据,验证数据和测试数据。
如果只有100条,1000条或者1万条数据,那么上述比例划分是非常合理的。
如果数据量是百万级别,那么验证集和测试集占数据总量的比例会趋向于变得更小。如果拥有百万数据,我们只需要1000条数据,便足以评估单个分类器,并且准确评估该分类器的性能。假设我们有100万条数据,其中1万条作为验证集,1万条作为测试集,100万里取1万,比例是1%,即:训练集占98%,验证集和测试集各占1%。对于数据量过百万的应用,训练集可以占到99.5%,验证和测试集各占0.25%,或者验证集占0.4%,测试集占0.1%。
一般算法工程师会将整个数据集,自己划分为训练集、验证集、测试集。或者训练集、验证集 等等。(这里的测试集是算法工程师的测试数据)
算法工程师提测时,写明自测时的准确率或其他指标。测试人员另外收集自己的测试集。
测试数据可以测试人员自己收集。或者公司的数据标注人员整理提供。或者爬虫。外部购买。
测试人员可以先用算法工程师的测试集进行运行测试查看结果。再通过自己的测试集测试进行指标对比。
2.1、测试分析
人工智能归根结底也是利用对历史数据的处理训练出可以在将来数据上有良好输出的模型。
对于测试而言,应该关心数据模型在对待正常数据、边界数据、异常数据作为输入时,模型的输出是否能够符合期望。
2.2、测试方法
改变测试集:如输入与训练时一样的数据、与训练时完全不同的数据、训练时的边界值等,看是否达到期望输出
如在安卓平台运行的代码:通过不断点击运行、以及快速退出和快速进入、处理大量数据、空数据、等观察性能指标的上升等
模型是否有良好的用户交互
人工智能发展目前有一定的技术限制,但是无论如何都不能造成应用crash、卡死、内存溢出等现象
具体使用时,应有良好的告知用户的提示,不能一直loading等
模型是否能够根据处理数据的量从少到多而自动不断优化、调整输出
观察模型输出是否是一直不变化的
经过多次改变输入(百次计算),再进行回归测试,观察输出是否有一定程度调优(或者更差了)
模型在处理数据时的效率(学习过程,cpu占用率、内存消耗等)
模型有没有人性化的参数调整入口,供运营人员以及测试人员对上线后、上线前进行调整
模型上线后应具有一定的参数调整能力(例如某些权重的调整等。业界今日头条的某些推荐方案一旦效果好,据说会立刻将所有的模型进行模拟升级(切换到相同的模式))。
风险控制,当发现严重问题时如何良好的控制线上的模型,对其进行开关以及升级操作,如上线后若发现难以控制的风险,如需要紧急下线(政策等影响)等问题时,需要有立刻关闭的功能以及关闭前对用户的良好的提示功能。
若此模型并不是单独使用,有没有良好的兼容性(兼容其他模型),遇到错误的使用时如何变现(以及提示方式)
如模型需要与其他模型进行合作才能工作,那应当分开单独进行测试,此模型应该具有良好的接口,和期望输出。测试方法参照上面。然后再测试与其他模型共同工作时的效果
三、AI测试举例:
3.1、语音识别部分
输入正常的语音
输入有杂音的语音
输入空白语音
输入不同语言的语音
输入长时间语音
输入重复语音
结论:训练好的模型应在使用上满足一定程度的场景,不能答非所问的太离谱
3.2、自优化测试:
- 将测试集分成2部分(或多部分),第一次输入第一部分然后观察结果,然后再输入第二部分,然后再次输入第一部分,观察输出是否有优化的体现
3.3、性能部分:
[在进行语音识别时,观察cpu、内存等占用情况
在语音识别结束观察cup、内存有没有释放等情况
观察识别的时间长短
3.4、友好度测试:
观察在使用时弱网络情况下的提示
观察识别出错时的提示
观察正常时的提示
3.5、风险测试:
- 功能入口测试(展示和关闭),是否能通过远程直接关闭或开启语音识别功能,升级等