如何进行AI测试-入门篇

一、人工智能(AI)是什么

人工智能,英文 Artificial Intelligence,简称 AI,是利用机器学习技术模拟、延伸和扩展人的智能的理论、方法、技术及应用的一门新的技术科学。
人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器,该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。 人工智能可以对人的意识、思维的信息过程的模拟。人工智能不是人的智能,但能像人那样思考、也可能超过人的智能。
通俗的说,就是让机器可以像人类一样有智能,让机器看得懂、听得懂、会思考、能决策、能行动,实现原来只有人类才能完成的任务。

二、人工智能(AI)的本质

AI 的本质是通过软件来实现特定的算法。
一个优秀的人工智能系统,应该具有三个方面的特征:知识运用的能力、从数据或经验中学习的能力、处理不确定性的能力。

知识运用能力

知识是智能体现的一个最重要的维度。听说看能力如果不考虑内容的深度,则仅仅是停留在感知智能的层面,只能与环境交互和获取环境的信息,其智能表现的空间非常有限。一个智能系统应该能够很好的存储与表示、运用知识,并基于知识进行归纳推理。

学习能力

从数据中或过去的经验中学习的能力,这通常需要运用机器学习算法。具备一个不断进化和进步的学习能力,那么就可能具备更高的智能水平。同时,学习过程应该能够融入尽可能多的知识类信息,才能够达到支持智能系统的要求。

不确定性处理能力

能够很好地处理数据中不确定性,像噪声、数据属性缺失,模型决策的不确定性,甚至模型内部参数的不确定性。无人驾驶系统就需要处理各种各样的不确定性如环境的不确定性、决策的不确定性。

三、人工智能和机器学习的关系

机器学习所研究的主要内容,是关于在计算机上从数据中产生 “模型” 的算法。即学习算法,有了学习算法,我们把数据提供给它,它就能基于这些数据产生模型;在面对新的数据时,模型会给我们提供相应的预测结果。
机器学习的按学习方式来可以划分四类: 监督学习、无监督学习、半监督学习和强化学习。
监督学习指的就是我们给学习算法一个数据集。这个数据集由 “正确答案” 组成。关注的是对事物未知表现的预测,一般包括分类问题和回归问题。
无监督学习,指在数据集中没有 “正确答案”,期望从数据本身发现一些潜在的规律,无监督学习倾向于事物本身特性的分析,常用的技术包括数据降维和聚类问题。
半监督学习,训练数据集中有一部分答案,一部分没答案的称为半监督学习。
强化学习相对来说比较复杂,是指一个系统和外界环境不断地交互,获得外界反馈,然后决定自身的行为,达到长期目标的最优化。也就是从一开始什么都不懂, 通过不断地尝试, 从错误中学习, 最后找到规律, 学会了达到目的的方法。比如 AlphaGo 用的深度强化学习。

1. 机器学习三要素

机器学习三要素包括数据、模型、算法。简单来说,这三要素之间的关系,总结成一句话:算法通过在数据上进行运算产生模型。

2. 数据标注

不同的动物,给它们分别打上正确的标记。通过算法训练后,达到正确分类的目的。要进行机器学习,首先要有数据。有了数据之后,再对数据进行标注,利用人工标注的数据给到机器进行学习,使机器智能化。

3. 什么是模型

大家来做下这个猜数字游戏,1, 4, 16…()… 256… 括号里的是什么。为什么是 64,不是其他数字,又为什么是数字,不是一个汉字或者一个字母。我们找到了数字之间的规律,逻辑关系,并且抽象成了模型,我们才能知道括号里是什么。
举个生活中的例子,小米硬件中手机外壳,在大批量生产前需要先设计手机外壳的模具,然后所有同型号的手机外壳都按这个模具样版生产出来。这个模具也是个硬件上的模型。
算法的模型又是什么?模型是从数据里抽象出来的,用来描述客观世界的数学模型。通过对数据的分析,找到其中的规律,找到的规律就是模型。
机器学习的根本目的,是找一个模型去描述我们已经观测到的数据。

4. 机器学习算法

例如,你可能会在研究论文和教科书中看到用伪代码或 线性代数 描述的机器学习算法。你可以看到一个特定的机器学习算法与另一个特性算法相比的计算效率。
学术界可以设计出很多机器学习算法,而机器学习实践者可以在他们的项目中使用标准的机器学习算法。这就像计算机科学的其他领域一样,学者可以设计出全新的排序算法,程序员可以在应用程序中使用标准的排序算法。

四、AI 算法模型测试

以测试人员视角,AI应用测试过程与传统软件测试过程对比,增加了算法模型测试任务内容,如何进行算法模型测试,AI应用软件测试。

1. 衡量标准

首先有关 TP、TN、FP、FN 的概念。大体来看,TP 与 TN 都是分对了情况,TP 是正类,TN 是负类。则推断出,FP 是把错的分成了对的,而 FN 则是把对的分成了错的。

a. 准确率、召回率、F1

人工智能领域两个最基本指标是召回率 (Recall Rate) 和准确率 (Precision Rate),召回率也叫查全率,准确率也叫查准率,概念公式:

  • 精确率 : 精确率(Precision),准确率、查准率,表示正确预测为正的占全部预测为正的比例。
  • 召回率 : 召回率(Recall),查全率,表示正确预测为正的占全部实际为正的比例。
  • F1值 : F1值为精确率和召回率的调和平均数,值越大越好。
    [图片]

2. 模型评估测试

模型评估主要是测试 模型对未知新数据的预测能力,即泛化能力。
泛化能力越强,模型的预测能力表现越好。而衡量模型泛化能力的评价指标,就是性能度量(performance measure)。性能度量一般有错误率、准确率、精确率、召回率等。

3. 稳定性/鲁棒性测试

鲁棒性 (robustness),也就是所说健壮性,简单来说就是在模型在一些异常数据情况下是否也可以比较好的效果。也就是我们在最开始讲人工智能三个特征中的 处理不确定性的能力。
稳定性/鲁棒性主要是测试算法多次运行的稳定性;以及算法在输入值发现较小变化时的输出变化。
如果算法在输入值发生微小变化时就产生了巨大的输出变化,就可以说这个算法是不稳定的。

4. 业务测试

重要指标测试:响应速度 是指从数据输入到模型预测输出结果的所需的时间。对算法运行时间的评价
包括业务逻辑测试,业务 & 数据正确性测试。主要关注业务代码是否符合需求,逻辑是否正确,业务异常处理等情况。可以让产品经理提供业务的流程图,对整体业务流程有清晰的了解。
系统测试主要为以下三个方面:

  • 项目的整体业务流程
  • 真实用户的使用场景
  • 数据的流动与正确

5. 接口测试

接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。

6. 文档测试

文档测试是检验用户文档的完整性、正确性、一致性、易理解性、易浏览性。
在项目的整个生命周期中,会得到很多文档,在各个阶段中都以文档作为前段工作成果的体现和后阶段工作的依据。为避免在测试的过程中发现的缺陷是由于对文档的理解不准确,理解差异或是文档变更等原因引起的,文档测试也需要有足够的重视。

7. 白盒测试–代码静态检查

先让算法工程师将代码的逻辑给测试人员讲解,通过讲解理清思路。然后测试做代码静态检查,看是否会有基本的 bug。可以使用 pylint 工具来做代码分析。

8. 安全测试

  • 发布上线后,线上模型监控
    项目发布到线上后,模型在线上持续运行,需要以固定间隔检测项目模型的实时表现,可以是每隔半个月或者一个月,通过性能指标对模型进行评估。对各指标设置对应阀值,当低于阀值触发报警。如果模型随着数据的演化而性能下降,说明模型已经无法拟合当前的数据了,就需要用新数据训练得到新的模型。
  • 攻击方法有:试探性攻击、对抗性攻击两种
    在试探性攻击中,攻击者的目的通常是通过一定的方法窃取模型,或是通过某种手段恢复一部分训练机器学习模型所用的数据来推断用户的某些敏感信息。主要分为模型窃取和训练数据窃取
    对抗性攻击对数据源进行细微修改,让人感知不到,但机器学习模型接受该数据后做出错误的判断。比如图中的雪山,原本的预测准确率为 94%,加上噪声图片后,就有 99.99% 的概率识别为了狗。

五、测试数据

不管是机器学习,推荐系统,图像识别还是自然语言处理,都需要有一定量的测试数据来进行运行测试。
算法测试的核心是对学习器的泛化误差进行评估。为此是使用测试集来测试学习器对新样本的差别能力。然后以测试集上的测试误差作为泛化误差的近似。测试人员使用的测试集,只能尽可能的覆盖正式环境用户产生的数据情况。正式环境复杂多样的数据情况,需要根据上线后,持续跟进外网数据。算法模型的适用性一定程度上取决于用户数据量,当用户量出现大幅增长,可能模型会随着数据的演化而性能下降,这时模型需要用新数据来做重新训练。
上线只是完成了一半测试,并不像APP或者WEB网站测试一样,测试通过后,发布到正式环境,测试工作就完了。
测试集如何选取很关键,一般遵循两个原则:

  • 测试集独立同分布
  • 测试数据的数量和训练数据的比例合理

1. 测试集独立同分布

  • 不能使用训练数据来做为测试数据,此为独立。
  • 测试数据需要和训练数据是同一个分布下的数据,此为分布。
    举个例子,训练数据中正样本和负样本的分布为7:3,测试数据的分布也需要为7:3,或者接近这个分布,比较合理

2. 测试数据的数量和训练数据的比例合理

留出法是比较常用的方法,是指直接将数据集D划分为两个互斥的集合,其中一个集合作为训练集S,另外一个作为测试集T,即D=S∪T,S∩T=空集。在S上训练出模型后,用T来评估其测试误差,作为对泛化误差的估计。
另外,对于留出法,除了划分为测试集,验证集还有两种划分方式。

  • 当数据量比较小时,可以使用 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%。

一般算法工程师会将整个数据集,自己划分为训练集、验证集、测试集。或者训练集、验证集 等等。(这里的测试集是算法工程师的测试数据)

  • 算法工程师提测时,写明自测时的准确率或其他指标。测试人员另外收集自己的测试集。
  • 测试数据可以测试人员自己收集。或者公司的数据标注人员整理提供。或者爬虫。外部购买。
  • 测试人员可以先用算法工程师的测试集进行运行测试查看结果。再通过自己的测试集测试进行指标对比。
    需要注意的问题:
    训练/测试集的划分要尽可能的保持数据分布的一致性,避免因数据划分过程引入额外的偏差而对最终结果产生影响。

六、测试输出

人工智能 (AI) 测试 或者说是 算法测试,主要做的有三件事。

  • 收集测试数据
    思考需要什么样的测试数据,测试数据的标注
  • 跑测试数据
    编写测试脚本批量运行
  • 查看数据结果
    统计正确和错误的个数,查看错误的数据中是否有共同特征等

1. 测试用例的思考点

  • 项目落地实际使用场景,根据场景思考真实的数据情况,倒推进行测试数据收集
  • 模型的训练数据有多少,训练数据的分布情况,训练数据的标注是否准确
  • 算法的实现方式
  • 选择模型评价指标
  • 评价指标的上线要求
  • 项目的流程,数据流
  • 模型的输入和输出
  • 算法外的业务逻辑

2. 测试用例的执行

运行测试脚本,跑测试数据。
对于一些机器学习的项目的数据,可以通过测试脚本对算法运行的结果和测试数据的标注结果进行对比。
对于图像识别类项目的数据,有些标注无法通过数值来量化,还是需要人工来对比。
对于推荐系统类项目,如 多样性测试,可能也无法通过测试脚本来对比,需要人工来查看。

3. 测试结果

通常是统计正确的和错误的数据数,使用评价指标的公式计算得出各指标数值。
同时,需要关注错误的数据,查看是否有共同的特征,再找些这样的数据单独来进行验证,是否带有此特征的数据都会识别数据。

4. 测试报告

测试结果最终通过测试报告展现,一份详见的测试报告,可以让别人清晰的了解测试什么,怎么测试的,测试结果是怎么样。

猜你喜欢

转载自blog.csdn.net/Jomei_Z/article/details/130105488