最近AI大火,chatgpt、GPT-4、文心一言不断的在轰炸着我们的生活、工作,很多时候我们都在感叹这智能化来的太快了。对于一个测试工程师,如何开始测试一个AI系统呢,今天我们就一起来聊聊相关的内容。
智能系统对测试工程师提出的新问题
目前智能系统主要是对AI应用最为广泛的四个领域是自然语言处理、图像识别、推荐系统、机器学习这四个方面。每个智能系统都包含了一个及其以上的AI模型,那么支撑AI模型对外提供服务还需要很多传统组件,例如数据库、Web容器、交互界面等等。所以非智能系统可能出现的缺陷,在智能系统中都有可能存在,因此我们常规的测试方法、技术、实践还都是适用的。除此之外智能系统与非智能系统相比还有一些其特殊性,所以专门针对智能系统的测试策略、方法和实践也是需要深入研究和探讨的。
测试彻底变成了黑盒
我们都知道非智能系统的测试过程中,每一个测试用例都有一个明确的测试预期,但在智能系统的测试过程中,对于每一个测试用例往往难给定一个确定的测试预期,这就使得预期变成了不确定性的。那么测试工程师如果不能完全从业务角度理解智能系统的目标,也就很难确定在执行测试过程中的实际结果是否满足业务目标,这么说了智能系统的测试工程师一上来就要是一个业务专家,实现最终态的测试左移。
智能系统中的AI部分是以完成目标的驱动方式建设的,这就和我们非智能系统的功能实现为目的的建设方式不一样,很多智能系统是如何实现目标的往往没有办法完全展示给测试工程师(例如用了神经网络的某种算法实现了一个目标,测试工程师却无法搞清楚这个算法是如何运行并得到目标结果的),还有一些自主规划、自主决策设备(例如机器人、无人机等)在测试过程中也是很难理清楚是什么逻辑导致了这个自主结果。
数据划分困难
智能系统测试过程中需要的数据不仅包含我们非智能系统常说的测试用例的输入数据,更重要的一部分是AI算法训练模型需要的“原始数据”。常规将这部分原始数据设计为训练集、验证集、测试集。
- 训练集是用来训练模型使用的。
- 验证集是模型在新数据(验证集和测试集是不同的数据)上的表现如何。(验证集不是必须存在的,如果不需要调整超参数,就可以不使用验证集,直接用测试集来评估效果就可以了,同时验证集评估出来的效果并非模型的最终效果,它主要是用来调整超参数,最终效果还是需要测试集评估的)。
- 测试集是独立于训练集和验证集之外,通过测试集来做最终的评估。
在智能系统的研发生命周期中,数据集的设计如果有一定的偏差,会导致最后的结果会相差甚远,但是这也并不能确定智能系统没有实现原始业务目标。那么如何选择原始数据,又如何划分数据集对测试工程师就提出了新的挑战。
从学习到智能让测试预期变得模糊
智能系统在实现目标的过程中都是黑盒的,而且目标实现效果有可能会随着系统的自主学习发生改变,通过学习系统自身过去的经验来进步目标实现效果。在这样的情况下一些原来有效的测试预期就有可能不再有效。那么测试工程师应该在什么时间节点给出原测试预期已经不再有效,新的系统实际反馈是正确的结果的判断。
除此之外,如何测试一个智能系统是否有自主性是更进一步需要解决的问题。测试自主性就是要想办法让其脱离自主行为,并让其在一种未能确定的情况下进行人工主动的干预测试。说白了就是想办法去“愚弄”智能系统,让智能系统以为自己在自主行为下进行目标的达成。这种情况说出来容易,如何诱导智能系统脱离自主行为却并没有一个通用的方式方法,对应的测试预期也难以确定。面对这些难以回答的问题,只能通过与业务专家的讨论将模糊的测试预期变得明确。
自主学习、硬件环境变化、数据集的变更都会导致系统的进化,因此对于智能系统的测试并不能和非智能系统的测试一样,在系统交付上线后就不再关注了(除非又发生变更)。测试工程师需要长期的、有固定周期的进行的测试,不断的获取监控指标,持续的评价系统原始目标的达成情况,在评价过程中这种进化的准确性、精确性、敏感性都是需要被考察的。无论智能系统的进化是如何发展的,最后都是受众可理解的,最好要求目标受众(或一组有代表性的测试者)参与进行测试,以确定他们对目标的实现是理解的。
偏见要识别原因
智能系统的偏见是很常见的问题,最为常见的就是训练集中有偏见,这种其实需要数据专家帮忙审核,将导致偏见的数据识别并删除。测试过程中要使用无偏见的测试集进行独立的测试,这样才能发现训练集中是否有偏见的。
当我们发现有偏见数据的时候,我们可以通过去掉一些偏见数据来避免这种情况出现,有时候偏见数据还会触及一些法律风险,例如数据中有隐私数据,就有可能通过模型得到某些个人隐私的反馈,这样的反馈是不合法的,因此我们需要在数据中就去除这一类数据。
可能性导致了需要重定判断标准
很多智能系统的实现都是基于概率的,因此每次的返回预期都不是完全一致的。例如自动驾驶的路线规划,由于红绿灯、拥堵情况等的影响,每次会基于时间优先的策略规划路线,这有可能不是一个距离上的最优解,但是肯定是一个距离和时间上的有效解。这种方式我们就应该设计一种置信区间,通过区间内外来确定结果的可信程度。其次,测试过程还需要多次的运行,从而评价正常的结果概率。
对智能系统的测试
面对智能化系统的各种不确定性,测试智能系统除了非智能系统的测试技术、方法外,也要有针对智能系统的独特的质量保证手段,具体来说包括以下几个方面:
- 数据收集和准备:为了测试智能系统,需要收集和准备足够的数据。数据应该涵盖各种情况和场景,以确保系统在各种情况下都能准确地运行。
- 模型训练和评估:在测试之前,需要对AI模型进行训练和评估。这可以通过使用已准备好的数据集来完成。
- 功能测试:在这一步骤中,需要测试系统是否按照预期执行任务。例如,如果系统被设计用于图像分类,应该测试它是否能够正确地分类图像。
- 其他的测试:智能系统的性能测试、安全测试、兼容性测试等等和非智能系统的测试一样,本文就不再累述了
数据收集和准备
为了测试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写的,你能发现是哪一段落吗?