如何测试一个AI系统?

最近AI大火,chatgpt、GPT-4、文心一言不断的在轰炸着我们的生活、工作,很多时候我们都在感叹这智能化来的太快了。对于一个测试工程师,如何开始测试一个AI系统呢,今天我们就一起来聊聊相关的内容。

智能系统对测试工程师提出的新问题

目前智能系统主要是对AI应用最为广泛的四个领域是自然语言处理、图像识别、推荐系统、机器学习这四个方面。每个智能系统都包含了一个及其以上的AI模型,那么支撑AI模型对外提供服务还需要很多传统组件,例如数据库、Web容器、交互界面等等。所以非智能系统可能出现的缺陷,在智能系统中都有可能存在,因此我们常规的测试方法、技术、实践还都是适用的。除此之外智能系统与非智能系统相比还有一些其特殊性,所以专门针对智能系统的测试策略、方法和实践也是需要深入研究和探讨的。

测试彻底变成了黑盒

我们都知道非智能系统的测试过程中,每一个测试用例都有一个明确的测试预期,但在智能系统的测试过程中,对于每一个测试用例往往难给定一个确定的测试预期,这就使得预期变成了不确定性的。那么测试工程师如果不能完全从业务角度理解智能系统的目标,也就很难确定在执行测试过程中的实际结果是否满足业务目标,这么说了智能系统的测试工程师一上来就要是一个业务专家,实现最终态的测试左移。

智能系统中的AI部分是以完成目标的驱动方式建设的,这就和我们非智能系统的功能实现为目的的建设方式不一样,很多智能系统是如何实现目标的往往没有办法完全展示给测试工程师(例如用了神经网络的某种算法实现了一个目标,测试工程师却无法搞清楚这个算法是如何运行并得到目标结果的),还有一些自主规划、自主决策设备(例如机器人、无人机等)在测试过程中也是很难理清楚是什么逻辑导致了这个自主结果。

数据划分困难

智能系统测试过程中需要的数据不仅包含我们非智能系统常说的测试用例的输入数据,更重要的一部分是AI算法训练模型需要的“原始数据”。常规将这部分原始数据设计为训练集、验证集、测试集。

  • 训练集是用来训练模型使用的。
  • 验证集是模型在新数据(验证集和测试集是不同的数据)上的表现如何。(验证集不是必须存在的,如果不需要调整超参数,就可以不使用验证集,直接用测试集来评估效果就可以了,同时验证集评估出来的效果并非模型的最终效果,它主要是用来调整超参数,最终效果还是需要测试集评估的)。
  • 测试集是独立于训练集和验证集之外,通过测试集来做最终的评估。

在智能系统的研发生命周期中,数据集的设计如果有一定的偏差,会导致最后的结果会相差甚远,但是这也并不能确定智能系统没有实现原始业务目标。那么如何选择原始数据,又如何划分数据集对测试工程师就提出了新的挑战。

从学习到智能让测试预期变得模糊

智能系统在实现目标的过程中都是黑盒的,而且目标实现效果有可能会随着系统的自主学习发生改变,通过学习系统自身过去的经验来进步目标实现效果。在这样的情况下一些原来有效的测试预期就有可能不再有效。那么测试工程师应该在什么时间节点给出原测试预期已经不再有效,新的系统实际反馈是正确的结果的判断。
除此之外,如何测试一个智能系统是否有自主性是更进一步需要解决的问题。测试自主性就是要想办法让其脱离自主行为,并让其在一种未能确定的情况下进行人工主动的干预测试。说白了就是想办法去“愚弄”智能系统,让智能系统以为自己在自主行为下进行目标的达成。这种情况说出来容易,如何诱导智能系统脱离自主行为却并没有一个通用的方式方法,对应的测试预期也难以确定。面对这些难以回答的问题,只能通过与业务专家的讨论将模糊的测试预期变得明确。

自主学习、硬件环境变化、数据集的变更都会导致系统的进化,因此对于智能系统的测试并不能和非智能系统的测试一样,在系统交付上线后就不再关注了(除非又发生变更)。测试工程师需要长期的、有固定周期的进行的测试,不断的获取监控指标,持续的评价系统原始目标的达成情况,在评价过程中这种进化的准确性、精确性、敏感性都是需要被考察的。无论智能系统的进化是如何发展的,最后都是受众可理解的,最好要求目标受众(或一组有代表性的测试者)参与进行测试,以确定他们对目标的实现是理解的。

偏见要识别原因

智能系统的偏见是很常见的问题,最为常见的就是训练集中有偏见,这种其实需要数据专家帮忙审核,将导致偏见的数据识别并删除。测试过程中要使用无偏见的测试集进行独立的测试,这样才能发现训练集中是否有偏见的。
当我们发现有偏见数据的时候,我们可以通过去掉一些偏见数据来避免这种情况出现,有时候偏见数据还会触及一些法律风险,例如数据中有隐私数据,就有可能通过模型得到某些个人隐私的反馈,这样的反馈是不合法的,因此我们需要在数据中就去除这一类数据。

可能性导致了需要重定判断标准

很多智能系统的实现都是基于概率的,因此每次的返回预期都不是完全一致的。例如自动驾驶的路线规划,由于红绿灯、拥堵情况等的影响,每次会基于时间优先的策略规划路线,这有可能不是一个距离上的最优解,但是肯定是一个距离和时间上的有效解。这种方式我们就应该设计一种置信区间,通过区间内外来确定结果的可信程度。其次,测试过程还需要多次的运行,从而评价正常的结果概率。

对智能系统的测试

面对智能化系统的各种不确定性,测试智能系统除了非智能系统的测试技术、方法外,也要有针对智能系统的独特的质量保证手段,具体来说包括以下几个方面:

  1. 数据收集和准备:为了测试智能系统,需要收集和准备足够的数据。数据应该涵盖各种情况和场景,以确保系统在各种情况下都能准确地运行。
  2. 模型训练和评估:在测试之前,需要对AI模型进行训练和评估。这可以通过使用已准备好的数据集来完成。
  3. 功能测试:在这一步骤中,需要测试系统是否按照预期执行任务。例如,如果系统被设计用于图像分类,应该测试它是否能够正确地分类图像。
  4. 其他的测试:智能系统的性能测试、安全测试、兼容性测试等等和非智能系统的测试一样,本文就不再累述了

数据收集和准备

为了测试AI系统,需要收集和准备足够的数据。数据应该涵盖各种情况和场景,以确保系统在各种情况下都能准确地运行。数据原始来源应该是真实的,并且应该涵盖系统预计的使用情况。数据应该根据特定的测试需求进行采样和处理。数据可以来自各种来源,例如公共数据集、第三方数据提供商、内部数据集和模拟数据集。在准备数据时,还应该注意数据的质量,例如数据的准确性、完整性和一致性。另外,还应该考虑隐私和安全问题,如果数据包含敏感信息,例如用户的个人身份信息,应该采取脱敏措施确保数据的安全性和隐私性。数据收集和准备是测试AI系统的重要步骤之一,需要充分的计划和准备,以确保测试的准确性和全面性。

在数据收集和准备阶段,还需要注意数据的数量。数据的数量应该足够大,以确保模型的训练和测试的充分性。此外,数据的数量也会影响模型的效果。如果数据量太少,模型的效果可能会不尽如人意,而如果数据量太多,模型的训练时间和计算资源的消耗也会增加。

在测试AI系统之前,还需要将数据集划分为训练集、验证集和测试集。数据集的划分非常重要,它直接影响到模型的训练和测试效果,数据集的划分通常遵循以下原则:

  • 训练集:用于模型的训练,通常占总数据集的70%~80%。
  • 验证集:用于模型的调优和选择,通常占总数据集的10%~15%。
  • 测试集:用于模型的测试和评估,通常占总数据集的10%~15%。

在进行数据集划分时,需要注意以下几点:

  • 数据集的大小:数据集的大小需要足够大,以确保模型有足够的数据来学习和泛化。
  • 数据集的质量:数据集的质量需要好,以确保模型学习到的是正确的知识和规律。
  • 数据集的均衡性:数据集的各个类别需要均衡,以避免模型对某些类别过于依赖。
  • 随机性:数据集的划分需要具有随机性,以避免模型对某些特定样本的过度训练。

对于数据集的划分有很多实践方法,但是每一种都有其优缺点,那么下面我们就针对每一种方法做详细的介绍。

留出验证法

就是将一部分数据留给验证集、测试集,剩下的都是训练集。数据划分的方法并没有明确的规定,针对不同规模的数据集可以参考一些经验,例如在小规模数据集中,可以按照前面对三个集合的分配比例完成;对于大规模数据集,主要留足验证集和测试集的数据,其他都归入训练集合。这种方法的优点就是简单直接,容易掌握,这样就导致了这种方法对于不平衡的数据集并不适用,由于我们划分了一部分数据为验证集和测试集,那么这有可能是一部分有特殊特征的数据没有被训练。

留p验证法

这种方法中p的含义就是p个样本作为测试集,其余的总样本集减去p个样本剩下的n个样本作为训练集。在每次迭代中,循环抽取p个样本作为测试集,剩下的作为训练集,最终知道全部可能组合都被训练到以后就结束了,这种方式最大的优越性就是所有的数据样本都被用到过训练机和测试集中,但是这样就导致了计算时间长,不平衡数据会造成很大的偏差。

留一法

每次的测试集都只有一个样本,要进行m次训练和预测。 这个方法用于训练的数据只比整体数据集少了一个样本,因此最接近原始样本的分布。但是训练复杂度增加了,因为模型的数量与原始数据样本数量相同,这种方法简单易用,偏差小,但是计算时间长。

K次交叉验证法

K次交叉验证是一种动态验证的方式,这种方式可以降低数据划分带来的影响。将数据集划分成K份,每份我们称为一个Fold,那么在使用过程中我们将一个Fold作为测试集,其他的K-1份Fold是训练集。如此反复直到全部的Fold都作为一次测试集使用就结束了。模型的最终准确度是通过取k个模型验证数据的平均准确度来计算的。
在这里插入图片描述

K次交叉验证因为每一个Fold都作为测试集使用过,因此最终的模型会有最小的偏见,训练过程的时间复杂的较低。这种方法不适合不平衡的数据,也不适合时间序列数据。

分层K次交叉验证法

分层K次交叉验证法其实是K次交叉验证法的一个加强版,是为了适用于不平衡数据集而设计的。从名字上它还是K次交叉验证方法,但是这个方法中,每一个Fold都具有相同比例的不同类的数据,换句话说也就是每一个Fold中的数据都是不平衡的而且和数据集一致。
在这里插入图片描述

因此可以完美的处理不平很数据,但是仍旧不适合时间序列数据。

时序交叉验证

时间序列数据是在不同时间点上收集的数据。由于数据点是在相邻的时间段收集的,因此观察结果之间有可能存在关联性。对于时间序列数据集,将数据分成训练和验证是根据时间进行的,也被称为前向链法或滚动交叉验证法。对于一个特定的迭代,训练数据的下一个实例可以被视为验证数据。
在这里插入图片描述

蒙特卡罗交叉验证

在这个方法中,数据集被随机的划分出训练集和测试集,这种随机的划分并一部分是训练集剩下的是测试集的思路,而是数据集的n%是训练集,m%是测试集,但是n和m的和是小于等于100的。这样的优点就是我们可以随意设计训练集和测试集的大小,但是有可能因为这样的划分而丢失了一部分永远没有被划分的数据,因此不平衡数据就不适合这个方法。

数据集划分完成后,需要对数据集进行标注和分类,以便系统能够正确地学习和处理数据。同时,还需要对数据集进行清洗和预处理,以去除异常值和噪声,并将数据转换为适合模型的格式。

为了确保数据的充分性和质量,可以采用以下方法:

  • 采用多样化的数据来源和场景,以覆盖不同的使用情况和场景。
  • 采用专业的数据采集和处理工具,以提高数据的质量和准确性。
  • 对数据进行清洗和预处理,以去除异常值和噪声,并将数据转换为适合模型的格式。
  • 对数据进行标注和分类,以便系统能够正确地学习和处理数据。

最后,对于一些特定的AI系统,例如自然语言处理系统,还需要对数据进行语言处理和分析,以确保数据的质量和可用性。

模型训练和评估

在测试AI系统中的模型训练和评估阶段,需要使用准备好的数据集对AI模型进行训练和评估。在训练过程中,应该对模型进行监控和调整,以确保模型的准确性和效果。在评估过程中,需要使用测试数据集对模型进行测试,以验证模型的准确性和效果。在评估过程中,需要使用各种度量方法来评估模型的准确性和效果,例如精度、召回率、F1分数等等。

  • 精度是指模型正确预测的样本数占总样本数的比例,即:

在这里插入图片描述

其中,Precision是指精度,True Positive指分类器正确判断为正例的样本数,False Positive指分类器错误判断为正例的样本数。精度越高,说明模型的分类效果越好。

  • 召回率是指模型正确预测的正样本数占所有正样本数的比例,即:
    在这里插入图片描述

其中,Recall是指召回率,False Negative指分类器错误判断为负例的样本数。召回率越高,说明模型对正样本的覆盖率越高。

  • F1分数是精度和召回率的调和平均值,即:
    在这里插入图片描述

F1分数综合了精度和召回率的指标,是一个综合性的评价指标。F1分数越高,说明模型的效果越好。

综上所述,精度、召回率和F1分数都是用来评估模型效果的指标。在实际应用中,选择合适的指标来评估模型效果非常重要。

功能测试

在智能系统测试的功能测试阶段,需要测试系统是否按照预期执行任务。具体来说,需要根据系统的设计和功能要求,对系统的各种功能进行测试,以验证系统是否能够按照预期执行任务。例如,如果系统被设计用于图像分类,应该测试它是否能够正确地分类图像。在功能测试中,需要制定详细的测试计划和测试用例,以确保测试的全面性和准确性。测试用例应该覆盖各种情况和场景,以确保系统在各种情况下都能准确地运行。测试结果应该记录和分析,以便在后续的测试中进行参考和改进。
此外,在功能测试中,还应该对系统的异常处理能力进行测试。例如,如果系统面对无法处理的数据或输入,应该能够正确地处理和响应。在测试计划中应该涵盖各种异常情况和错误场景,以确保系统能够正确地处理这些情况。除此之外,在测试中还应该注意测试的环境和条件。测试环境应该与实际使用环境尽可能相似,以确保测试结果的准确性和可靠性。在功能测试中需要制定详细的测试计划和测试用例,覆盖各种情况和场景,以确保系统能够按照预期执行任务。同时,还需要注意异常处理能力的测试,以及测试环境和条件的控制。

总结

如上是智能系统和非智能系统测试中的最显著不同的部分以及对应的方法和实践,但是针对文章开头的四个主要领域的智能系统还是有一些显著差异的,这些显著差异是应用领域的场景不同所导致的,我们会在后续继续学习和研究。

参考

  • https://towardsdatascience.com/understanding-8-types-of-cross-validation-80c935a4976d
  • https://www.cnblogs.com/ljhdo/p/10609106.html

PS:文章有一小段使用AI写的,你能发现是哪一段落吗?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/1232.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023年网络安全比赛--网络安全事件响应中职组(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 1.找出黑客植入到系统中的二进制木马程序,并将木马程序的名称作为Flag值(若存在多个提交时使用英文逗号隔开,例如bin,sbin,…)提交; 2.找出被黑客修改的系统默认指令,并将被修改的指令里最后一个单词作为Flag值提交; 3.找出…

React 用一个简单案例体验一遍 React-dom React-router React-redux 全家桶

一、准备工作 本文略长,建议耐心读完,每一节的内容与上一节的内容存在关联,最好跟着案例过一遍,加深记忆。 1.1 创建项目 第一步,执行下面的命令来创建一个 React 项目。 npx create-react-app react-example cd rea…

Springboot集成Swagger

一、Swagger简介注意点! 在正式发布的时候要关闭swagger(出于安全考虑,而且节省内存空间)之前开发的时候,前端只用管理静态页面, http请求到后端, 模板引擎JSP,故后端是主力如今是前…

【宝塔面板部署nodeJs项目】网易云nodeJs部署在云服务器上,保姆级教程,写网易云接口用自己的接口不受制于人

看了很多部署的,要么少步骤,要么就是写的太简洁,对新手不友好 文章目录前言一、下载网易云nodejs项目1. git clone下载,两种方式2. 运行项目二、使用步骤1. 先在本地运行2.测试接口三、部署服务器1. 在宝塔面板安装pm2管理器2. 压…

字符函数和字符串函数【上篇】

文章目录🎖️1.函数介绍📬1.1. strlen📬1.2. strcpy📬1.3. strcat📬1.4. strcmp📬1.5. strncpy📬1.6. strncat📬1.7. strncmp🎖️1.函数介绍 📬1.1. strlen …

入行 5年,跳槽 3次,我终于摸透了软件测试这行(来自过来人的忠告)

目录 前言 第一年 第二年 第三年 第四年 作为过来人的一些忠告 前言 最近几年行业在如火如荼的发展壮大,以及其他传统公司都需要大批量的软件测试人员,但是20年的疫情导致大规模裁员,让人觉得行业寒冬已来,软件测试人员的职…

【YOLOv8/YOLOv7/YOLOv5/YOLOv4/Faster-rcnn系列算法改进NO.60】损失函数改进为wiou

前言作为当前先进的深度学习目标检测算法YOLOv8,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法。此后的系列文章,将重点对YOLOv8的如何改进进行详细的介绍&…

css属性学习

css属性 就是我们选择器里面 { } 中的内容 字体样式 font-size 控制字体大小&#xff1a;单位px&#xff08;像素&#xff09; 默认字体占16个像素 <p style"font-size:30px;">font-size&#xff1a;字体大小&#xff0c;单位的话可以用px表示占的像素个数&…

Mini-Xml 经典实例Demo

欢迎小伙伴的点评✨✨&#xff0c;相互学习、博主将自己研发xml微型服务器的经验与之分享&#x1f30f;&#x1f30f;&#x1f642; 文章目录前言一、使用mxml库编写Xml文件1.1 经典实例Demo_11.2、经典实例Demo_21.3、经典实例Demo_3二、总结前言 本章将会给大家带来mini-xml…

在我的MacBook上捣鼓ESP8266

周三是我们的篮球日&#xff0c;打篮球后总是会有些兴奋&#xff0c;然后就容易睡不着&#xff0c;额&#xff0c;睡不着就拿我的ESP8266开发板出来捣鼓一下。先下载编译工具链https://github.com/espressif/ESP8266_RTOS_SDK下载sdkgit clone https://github.com/espressif/ES…

C++程序在内存中的模型

进程&#xff08;Process&#xff09;是计算机中的程序&#xff0c;数据集合在其上运行的一次活动&#xff0c;是系统进行资源分配的基本单位。每个进程都有自己独立的虚拟内存地址空间&#xff0c;这个虚拟的内存地址空间一般是线性连续的&#xff0c;这个内存地址空间是虚拟的…

面试官想看我写一篇关于“原型链”和“构造函数”深入理解的文章

前言&#xff1a; 在参加工作的面试过程中&#xff0c;我搬出了我的个人掘金账号写在了简历里&#xff0c;面试官很感兴趣&#xff0c;他不仅关注了我的账号&#xff0c;还想让我写一篇《原型链》的见解&#xff0c;由于老早就想总结一篇关于原型的文章&#xff0c;奈何自己刚开…

07平衡负载:gRPC是如何进行负载均衡的?

负载均衡(Load Balance),其含义就是指将请求负载进行平衡、分摊到多个负载单元上进行运行,从而协同完成工作任务。 负载均衡的主要作用: 提升并发性能:负载均衡通过算法尽可能均匀的分配集群中各节点的工作量,以此提高集群的整体的吞吐量。 提供可伸缩性:可添加或减少服…

Springboot新手开发 Cloud篇

前言&#xff1a; &#x1f44f;作者简介&#xff1a;我是笑霸final&#xff0c;一名热爱技术的在校学生。 &#x1f4dd;个人主页&#xff1a;个人主页1 || 笑霸final的主页2 &#x1f4d5;系列专栏&#xff1a;后端专栏 &#x1f4e7;如果文章知识点有错误的地方&#xff0c;…

汇编语言与微机原理(1)基础知识

前言&#xff08;1&#xff09;本人使用的是王爽老师的汇编语言第四版和学校发的微机原理教材配合学习。&#xff08;2&#xff09;推荐视频教程通俗易懂的汇编语言&#xff08;王爽老师的书&#xff09;&#xff1b;贺老师C站账号网址&#xff1b;&#xff08;3&#xff09;文…

在visual studio 2022 C++中配置最新版OpenCV和可能错误解决方案

前面我们写了一篇博文有关在C#中配置OpenCV&#xff0c;但C#版本的OpenCV的学习资源相对较少&#xff0c;C版的和Python版的比较多。这里先说说C版的如何配置吧&#xff01;总共完成四步即可使用起来。 文章目录一、下载并安装OpenCV1、下载OpenCV2、安装OpenCV二、配置环境1、…

【python】喜欢XJJ?这不得来一波大采集?

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 俗话说的好&#xff1a;技能学了~就要用在自己喜欢得东西上&#xff01;&#xff01; 这我不得听个话~我喜欢小姐姐&#xff0c;跳舞的小姐姐 这不得用python把小姐姐舞采集下来~嘿嘿嘿 完整源码、素材皆可点击文章下方名片…

条款20:当std::shared_ptr可能悬空时使用std::weak_ptr

自相矛盾的是&#xff0c;如果有一个像std::shared_ptr&#xff08;见条款19&#xff09;的但是不参与资源所有权共享的指针是很方便的。换句话说&#xff0c;是一个类似std::shared_ptr但不影响对象引用计数的指针。这种类型的智能指针必须要解决一个std::shared_ptr不存在的问…

Mysql 竟然还有这么多不为人知的查询优化技巧,还不看看?

前言 Mysql 我随手造200W条数据&#xff0c;给你们讲讲分页优化 MySql 索引失效、回表解析 今天再聊聊一些我想分享的查询优化相关点。 正文 准备模拟数据。 首先是一张 test_orde 表&#xff1a; CREATE TABLE test_order (id INT(11) NOT NULL AUTO_INCREMENT,p_sn VARCHA…

Spring事务和事务传播机制

目录 Spring中事务的实现 1、通过代码的方式手动实现事务 2、通过注解的方式实现声明式事务 2.1、Transactional作用范围 2.2、Transactional参数说明 2.3、注意事项 2.4、Transactional工作原理 事务隔离级别 1、事务特性 2、Spring中设置事务隔离级别 2.1、MySQL事…