上一章中,我们主要介绍了数据在AI算法整个生命期中的重要性,以及如何对其质量进行评估,以及一些常见的数据生成技术,本章我们将介绍AI应用的核心,即AI模型,如何对其进行测试及质量评估。
AI模型的全生命期主要包括问题定义与理解、数据准备、评估指标和标准、模型选择与搭建、模型训练、参数调优与优化、模型测试、模型部署与监控等环节。在这些环节中,模型测试是评估模型性能、准确性的关键过程,也是确定模型能否满足实际应用需求的决定性环节。
模型测试的主要目的在于判断模型是否在实际场景中表现良好,并在一系列预设条件下是否满足性能要求。在测试环节,需要根据不同问题类型和场景需求,选择合适的测试方法和标准。以下是针对模型测试的详细内容:
常见的AI模型评估指标在本书第五章中均有陈述,这里就不在展开讲了。下面我们重点看下在选择AI模型评估指标时,需要关注的一些注意点。
分类问题:
假设你正在开发一个垃圾邮件检测器,它需要对电子邮件进行分类,将其标记为“垃圾邮件”或“非垃圾邮件”。在这种情况下,可以使用以下评估指标:
回归问题:
在机器学习中,回归问题是一种预测问题,目标是预测一个连续的输出值,而不是离散的类别标签。
假设你正在开发一个房价预测模型,它需要根据房屋特征(如面积、卧室数量等)预测房价。在这种情况下,可以使用以下评估指标:
选择合适的评估指标取决于具体问题和应用场景。在某些情况下,可能需要权衡不同指标之间的关系,以找到最适合需求的评估方法。
下面我们看一个具体的例子。
假设你正在开发一个信用卡欺诈检测系统。在这个场景中,你的数据集包含了两类交易:正常交易和欺诈交易。然而,欺诈交易在整个数据集中所占比例非常小,例如只有1%。这就是一个典型的数据不平衡问题。
在这种情况下,如果你使用简单的准确率作为评估指标,可能会产生误导。假设你的模型预测所有交易都是正常交易,那么它的准确率将会达到99%,看起来非常高。但实际上,这个模型对于检测欺诈交易毫无作用。
为了更好地评估这个模型,你可以使用其他指标,如精确度、召回率、F1分数或AUC-ROC曲线。这些指标可以帮助你更准确地衡量模型在检测欺诈交易方面的表现。例如,精确度可以告诉你在所有被识别为欺诈交易的样本中,有多少是真正的欺诈交易;召回率则表示在所有真正的欺诈交易中,有多少被模型成功识别出来。F1分数是精确度和召回率的调和平均值,可以综合衡量这两个指标。而AUC-ROC曲线则可以展示模型在不同阈值下的分类性能。
通过使用这些更合适的指标,你可以更准确地评估模型在信用卡欺诈检测任务上的表现,并据此优化模型。
假设你正在开发一个医疗诊断系统,用于检测患者是否患有某种罕见病。在这种情况下,我们的业务需求是尽可能识别出所有患有该病的患者,以便及时给予治疗。因此,我们更关心召回率(查全率),即正确识别出的患者占实际患者总数的比例。这是因为一个较低的召回率可能意味着有些患者没有被识别出,从而错过了治疗机会。
相反,如果我们的业务需求是开发一个垃圾邮件过滤器,我们可能更关心精确度(查准率),即被正确识别为垃圾邮件的邮件占所有被识别为垃圾邮件的比例。这是因为我们希望尽量避免误将重要邮件识别为垃圾邮件。在这种情况下,我们可以容忍一些垃圾邮件漏过过滤器,但我们不希望误删重要邮件。因此,精确度成为了一个更重要的评估指标。
假设我们正在开发一个用于识别猫和狗的图像分类模型。在这种情况下,我们可能会关注以下几个指标:
a. 准确率(Accuracy):这是一个常用的指标,表示模型正确分类的图像所占的比例。但是,如果数据集中猫和狗的数量不平衡,准确率可能会产生误导。例如,如果数据集中有90%的猫和10%的狗,那么一个将所有图像都分类为猫的简单模型也可以达到90%的准确率。
b. 精确度(Precision):表示被模型预测为狗的图像中,实际上是狗的比例。这个指标可以帮助我们了解模型在识别狗时的可靠性。
c. 召回率(Recall):表示实际上是狗的图像中,被模型正确识别为狗的比例。这个指标可以帮助我们了解模型在找到所有狗的图像方面的能力。
d. F1分数(F1-score):这是一个综合指标,结合了精确度和召回率。F1分数可以帮助我们在精确度和召回率之间找到一个平衡,从而更全面地评估模型的性能。
通过同时关注这些指标,我们可以更全面地了解模型的优缺点,从而在实际应用中做出更明智的决策。
以上提到的AI模型评估指标是基于黑盒/端到端的方式收集到的指标,下面我们看看基于白盒/灰盒测试有哪些指标。
我们为什么需要AI模型覆盖率指标?在第六章AI工程质量中,我们提到代码覆盖率,包括如:语句覆盖率、分支覆盖率,是一种客观的衡量手段,可以客观的评估我们的测试用例覆盖到了业务代码的情况。同样的,AI模型的覆盖率指标在测试中起到了重要的作用。以下是一些原因:
1. 发现潜在缺陷:覆盖率指标可以帮助测试人员发现潜在的缺陷和错误。通过测试输入数据对神经元的覆盖程度,可以揭示神经网络中可能存在的未被激活或不正确激活的神经元,从而发现潜在的缺陷。
2. 评估测试质量:覆盖率指标可以用来评估测试的质量和完整性。通过衡量测试输入对神经元的覆盖程度,可以确定测试集合是否足够多样化和全面,是否能够覆盖神经网络的各个功能区域和边界情况。
3. 指导测试生成:覆盖率指标可以指导测试生成过程,帮助测试人员选择合适的测试输入和测试用例。通过关注覆盖率指标,测试人员可以有针对性地生成测试输入,以提高测试的效果和发现潜在的缺陷。
4. 解释差异和行为:覆盖率指标可以帮助解释深度神经网络的差异和行为。通过分析不同层次和神经元的覆盖情况,可以更好地理解神经网络的行为和决策过程,从而提高对其工作原理的理解。
但是传统的代码覆盖率并不适合基于深度神经网络(DNN)的AI模型。原因有以下几点:
1. 设计差异:传统软件和DNN在设计上存在显著差异。传统软件的逻辑是由人工编写的控制流程表示的,而DNN的行为是由神经元之间的权重和非线性激活函数决定的。这种设计差异导致了测试DNN的方法和需求与传统软件不同。
2. 数据驱动:DNN的行为是通过训练数据中的权重和激活函数确定的,而不是通过人工编写的逻辑。这意味着DNN的行为可能会受到训练数据的影响,而不仅仅是代码的控制流程。因此,传统软件的覆盖率指标无法直接应用于DNN,因为它们无法捕捉到DNN中的权重和激活函数的影响。
3. 复杂性和维度:DNN通常具有大量的神经元和连接,以及高维的输入空间。这使得传统软件的覆盖率指标难以应用于DNN。传统软件的覆盖率指标通常基于代码的结构和逻辑,而DNN的复杂性和高维性使得无法直接将这些指标应用于DNN的神经元和连接。
为了测试和评估DNN的质量,需要开发适用于DNN的特定覆盖率指标和测试方法。下面我们介绍几种面向DNN的覆盖率指标。
在深度学习中,基于神经元的覆盖率指标(Neuron Coverage)是一种衡量模型测试质量的方法,如DeepTest[1]。它的工作原理是通过分析激活的神经元数量来评估模型的测试输入是否充分覆盖了模型的内部表示。这有助于了解模型在不同输入下的行为,从而评估模型的泛化能力和鲁棒性。
神经元覆盖率的计算方法如下:
代码段1是在pytorch下如何统计的神经元覆盖率的简单示例,这个示例中,我们定义了一个简单的卷积神经网络,并实现了一个计算神经元覆盖率的函数。我们使用钩子函数(hook)来获取每个ReLU层的激活神经元数量。然后,我们计算每个层的神经元覆盖率,并将结果返回。
代码段1:神经元覆盖率统计代码
import torchimport torch.nn as nn
# 定义一个简单的神经网络class SimpleNet(nn.Module): def __init__(self): super(SimpleNet, self).__init__() self.conv1 = nn.Conv2d(1, 6, 3) self.relu1 = nn.ReLU() self.conv2 = nn.Conv2d(6, 16, 3) self.relu2 = nn.ReLU()
def forward(self, x): x = self.relu1(self.conv1(x)) x = self.relu2(self.conv2(x)) return x
# 计算神经元覆盖率def neuron_coverage(model, inputs): activation_counters = {}
def activation_hook(layer_name, input, output): active_neurons = (output > 0).sum().item() total_neurons = output.numel() activation_counters[layer_name] = (active_neurons, total_neurons)
# 注册钩子函数 relu1_handle = model.relu1.register_forward_hook(lambda input, output: activation_hook("relu1", input, output)) relu2_handle = model.relu2.register_forward_hook(lambda input, output: activation_hook("relu2", input, output))
# 运行模型 model(inputs)
# 移除钩子函数 relu1_handle.remove() relu2_handle.remove()
# 计算覆盖率 coverage = {} for layer_name, (active_neurons, total_neurons) in activation_counters.items(): coverage[layer_name] = active_neurons / total_neurons
return coverage
# 示例model = SimpleNet()inputs = torch.randn(1, 1, 28, 28)coverage = neuron_coverage(model, inputs)print("Neuron Coverage:", coverage)
下面我们看下这种基于神经元覆盖率指标有哪些优缺点。
我们首先看下其优点,主要包括:
过拟合:如果我们发现在训练数据上的神经元覆盖率非常高,但在验证数据上的覆盖率却相对较低,这可能意味着模型过于复杂,过度拟合了训练数据。在这种情况下,我们可能需要采取一些策略,如增加正则化,或者获取更多的训练数据。
激活不均衡:如果我们发现某些神经元总是被激活,而其他神经元则从未被激活,这可能意味着模型的某些部分没有被充分利用。这可能是由于初始化问题,或者学习率设置不当等原因造成的。在这种情况下,我们可能需要调整模型的初始化策略或优化器的参数。
我们再看下神经元覆盖率有哪些缺点:
下面我们重点看下收敛过快的这个问题。如图1所示,在我们的一个证件鉴伪的项目中,只需要几十个图片样本就可以将AI模型的神经元的覆盖率达到100%,从而无法指导我们增加更多的样本进行测试。
图1 某证件鉴伪AI模型的神经元覆盖率指标趋势图
为了解决收敛过快的问题,DeepGauge[2]提出了K-multisection神经元覆盖率指标。其基本的原理是:通过训练集得到每个神经元的取值范围[low, high], 将[low,high]划分为K个子区间,然后统计每个区间被测试集覆盖的比例。图2是证件鉴伪AI模型采用K-multisection神经元覆盖率指标的实际效果,我们可以看到K-multisection神经元覆盖率指标的收敛速度明显放慢。
K-multisection神经元覆盖率指标的缺点是K值是一个经验值,需要根据实际的项目进行设定。
图2 某证件鉴伪AI模型的K-multisection神经元覆盖率指标趋势图
除了上文提到的基于独立的单个神经元的度量指标外,还有一些基于神经网络层的度量指标,下面我们介绍几种这类的覆盖率指标。
TKNC是DeepGauge[2]论文中提及的一种覆盖率指标。TKNC神经元覆盖是一种用于确定每个层中最重要的神经元的测试准则。在训练阶段,它通过分析每个层中的神经元对输入数据的重要性,选择最能区分输入数据的前k个神经元。在测试阶段,它被定义为每层中前k个神经元的总数与深度神经网络(DNN)中神经元总数的比值,测试样本应该尽量覆盖每层的Top-k神经元。
TKNP是DeepGauge[2]论文中提及的另一种覆盖率指标。给定一个输入,将DNN中每一层的Top-k神经元排成一个序列,不同的序列就构成了不同的模式。TKNP表示来自每层顶部高活跃神经元的不同的激活场景。
例如,图3是一个三层的全连接DNN网络,绿色的神经网络代表是比较活跃的神经元。对于Top-2 Neron Coverage,Layer1的Top-2的神经元是{n1, n3},Layer2的是{n5,n6}, Layer3的是{n8, n9}。TNKP可以表示为一个序列:({n1,n3},{n5,n6},{n8,n9})。
图3 一个三层的全连接DNN网络
Neuron Activation Vector Clusters是Google的TensorFuzz[3]论文中提到的一种覆盖率指标。简单说,对每个输入,将DNN中的所有层的神经元的激活函数的输出组成一个向量组,然后通过最近邻算法进行聚类,得到不同的Neuron Activation Vector Clusters。
最后,DeepCover[4]论文中提到多种覆盖率指标,如:Sign-Sign Coverage, Value-Sign coverage, Sign-value coverage和Value-Value Coverage。感兴趣的读者可以阅读查看,这里不再展开陈述。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有