《通过神经元和变异体聚类加速深度神经网络变异分析》论文精读

0 阅读16分钟

On Accelerating Deep Neural Network Mutation Analysis by Neuron and Mutant Clustering》论文精读

论文来源

论文内容

研究背景(问题提出原因)

深度神经网络(DNNs)的变异分析是有效评估测试数据质量和模型鲁棒性的一种很有前景的方法,但它的计算成本可能很高,尤其是对于大型模型。变异分析是评估测试数据质量和模型鲁棒性的有效方法,已广泛应用于对抗样本检测、鲁棒性分析、故障定位、测试数据生成等多个领域。但无论是源码级还是模型级的DNN变异分析,都需要生成大量变异体并逐一测试,这个过程极其耗时,尤其是在大型DNN模型中。

现有研究一些研究尝试加速DNN变异分析(如选择变异算子、随机选择变异体、选择测试数据等),但基于聚类的方法在DNN变异分析中的表现尚未被系统研究

但是在加速DNN变异分析目标是在不显著损失变异得分准确性的前提下减少时间

问题提出

  • 问题一:变异分析重要但成本高,变异分析需要大量生成变异体来用于评估深度学习模型测试集质量和模型鲁棒性的方法,这些变异体还需要逐一测试,从而减少等价变异体的出现,成本极高。
  • 问题二:现有加速方法未充分探索聚类技术。现有研究现状,通常使用选择变异算子、随机选择变异体、选择测试数据。
  • 问题三:缺乏对加速与准确性权衡的系统评估。

解决问题方法提出

  • 针对问题一变异分析成本高,提出两种基于聚类的加速方法
  1. 神经元聚类(Neuron Clustering)

    • 做法:在变异生成之前,将每个可变异层中具有相似权重和偏置的神经元聚为一类。
    • 如何降低成本:变异算子不再作用于单个神经元,而是作用于整个神经元簇。这样,原本需要生成3×n个变异体(n为神经元数量),现在只需生成3×k个变异体(k为簇的数量)。由于k<n,生成的变异体数量大幅减少,从而降低了后续测试的时间。
  2. 变异体聚类(Mutant Clustering)

    • 做法:在生成变异体之后,根据变异位置和权重变化的相似性对变异体进行聚类。
    • 如何降低成本:从每个簇中随机选择一个代表性变异体进行实际测试,该簇中其他变异体的测试结果(杀死或存活)直接继承自这个代表。这样,实际需要测试的变异体数量从N减少到簇的数量(m<N)。
  • 针对问题二现有加速方法未充分探索聚类技术,首次将聚类技术系统应用于DNN变异分析加速
  1. 将神经元聚类引入加速场景:此前,神经元聚类曾被用于DNN的模块分解,但论文首次评估了其在加速变异分析中的效果。
  2. 将变异体聚类引入DNN领域:变异体聚类在传统程序变异分析中已有应用,但在DNN变异分析中尚属首次。
  • 针对问题三,通过实验量化加速比和变异得分误差,揭示权衡关系,我们设计3个研究问题来揭示。
  1. 加速效果(RQ1)

    • 评价指标:加速比(Speedup)
    • Speedup=1TspeedTvanilla1-\frac{T_{speed}}{T_{vanilla}}
      • TspeedT_{speed}:采用神经元聚类或变异体聚类后完成变异测试的总时间。
      • TvanillaT_{vanilla}:传统方法(不加速)测试所有变异体所需的总时间。
      • 加速比取值范围为[0,1],值越大表示加速效果越显著(例如 0.7 表示节省了 70% 的时间)。
    • 实验设计:在不同参数下(神经元数量/簇、聚类阈值)测量变异测试时间,与传统方法对比。
  2. 准确性影响(RQ2)

    • 评价指标:变异得分误差(Mutation Score Error)
    • Mutation Score(变异得分) = 被杀死的变异体数量非等价的变异体总数\frac{被杀死的变异体数量}{非等价的变异体总数}
      • 被杀死的变异体:在测试集上运行变异模型时,若其输出与原始模型不一致,则该变异体被“杀死”。
      • 非等价变异体:需排除那些虽然存活但与原始模型行为完全等价的变异体(在实际中难以完全排除,通常直接使用总数近似)。
    • Error(变异得分误差)= MSpeedMvanillaM_{Speed}-M_{vanilla}
    • 实验设计:计算加速方法与传统方法之间的变异得分差值。
  3. 非确定性影响(RQ3)

    • 评价指标: 多次实验的分布 + Mann-Whitney U检验
    • 实验设计: 对每个参数进行多次重复实验,分析加速比和误差的波动范围。

实验效果

RQ1:加速效果如何?
  • 神经元聚类:加速效果随“每簇神经元数量”增加而提升。

    • 当每簇包含10个神经元时,加速效果最明显。
    • FCNN模型平均加速 69.95% ,LeNet-5模型平均加速 69.59%
  • 变异体聚类:加速效果随“聚类阈值”降低而提升(阈值越低,簇越大,测试的变异体越少)。

    • 在阈值为0.1时加速最明显,随着阈值趋近0.99,加速效果归零(即退化为传统方法)。
    • FCNN模型平均加速 35.19% ,LeNet-5模型平均加速 35.43%
RQ2:变异得分误差有多大?
  • 神经元聚类:误差为负值(-26.84%),意味着计算出的变异得分比实际偏高。也就是说,这种方法会让你误以为测试集质量比实际上更好。(误差为负值说明神经元变异模型在杀死方面能力下降)

    • 随着簇变大,误差幅度通常也会增大(在LeNet-5-MNIST模型上误差甚至超过-80%)。
  • 变异体聚类:误差仅为  +1.96% ,非常接近真实值。

    • 在低阈值(大簇)时误差波动较大(由于随机选择代表),但当阈值超过0.5后,误差迅速稳定在零附近。
RQ3:结果稳定吗(非确定性影响)?
  • 统计显著性:通过Mann-Whitney U检验证实,两种方法的加速效果存在显著差异(p值多小于0.05),说明聚类确实带来了不同的加速模式,而非随机波动。

  • 稳定性分析

    • 神经元聚类:加速效果非常稳定,多次实验的箱线图显示波动极小。
    • 变异体聚类:在低阈值(如0.1)时稳定性较差(因为大簇中随机选的代表可能无法代表全体),但随着阈值提高,稳定性和准确性都显著改善。

论文方法详解

image.png

神经元聚类

神经元聚类这种变异加速方法的完整流程和核心逻辑。这是一种"从源头做减法"的策略,核心思想是:**与其生成一大堆再想办法少测,不如一开始就少生成一些。

在传统的(Vanilla)变异分析中,变异算子作用于单个神经元。如果模型有 1000 个神经元,每种变异算子就要生成 1000 个变异体。而神经元聚类的逻辑是:既然有些神经元看起来很像、功能也差不多,那不如把它们看成一个整体(一个"面")。变异的时候,不再单独动某一个点,而是把这个整体一起动一下。

具体操作

这个方法在论文中主要包含以下几个关键环节:

第一步:准备与分层

首先,锁定模型中那些"可以被变异"的层(比如全连接层、卷积层)。在这些层里,每个节点(神经元)都有一组参数,主要是权重向量偏置

第二步:聚类

针对每个可变异层,算法会执行一个聚类操作:

  1. 特征提取:把每个神经元看作一个数据点,用来描述这个点的特征就是它的权重向量

    • 例如,一个全连接层的某个神经元连接着上一层的 128 个输入,那这个神经元就有 128 个权重值,这 128 个值就是描述这个神经元的坐标。
  2. 相似度计算:使用欧几里得距离来计算不同神经元之间的距离。如果两个神经元的权重向量在空间里离得很近,就认为它们功能相似。

  3. 层次聚类:使用层次凝聚聚类算法,从下往上合并。决定合并到什么程度,由一个用户指定的参数 s(Neurons per Cluster)  来控制。

    • s 的作用:它不是直接指定簇的数量,而是指定平均每个簇里想要放多少个神经元
    • 结果:对于一个有 nn 个神经元的层,聚类后会产生大约 ⌈ns⌉⌈sn​⌉ 个簇。每个簇里的神经元权重都差不多。
第三步:生成变异体

这是最关键的区别所在。现在,变异算子应用的对象不再是"单个神经元",而是"一个簇"。

假设模型有一个层被分成了 10 个簇,那么:

  • 传统方法:对这个层的每个神经元生成 3 种变异体,假设有 100 个神经元,那就是 300 个变异体。
  • 神经元聚类方法:对这个层的每个簇生成 3 种变异体,因为有 10 个簇,所以只生成 30 个变异体。

生成变异体的具体操作(以"改变权重"算子为例):

  • 传统单神经元变异:选中第 5 个神经元,把它自己的权重从 [0.1,0.2,0.3][0.1,0.2,0.3] 变成 [0.11,0.22,0.33][0.11,0.22,0.33](乘以 1.1 倍)。
  • 神经元聚类变异:选中第 2 个簇(里面包含第 5、6、7 三个神经元),把这三个神经元的权重同时从原来的值变成 [0.11,0.22,0.33][0.11,0.22,0.33]、[0.21,0.32,0.43][0.21,0.32,0.43] 等(同时乘以 1.1 倍)。
第四步:测试

生成这些变异体之后,后续的测试流程就和传统方法一样了,只是总量大大减少。

神经元聚类是基于一个基本假设:权重相似的神经元,在模型中承担着相似的功能

变异体聚类

变异体聚类是一种“事后筛选”的策略。它的核心思想可以概括为:先把所有变异体都生成出来,然后把那些看起来“差不多”的归为一类,只测其中一个,剩下的结果直接复制。

在传统方法中,之所以要测遍所有变异体,是因为我们担心每个变异体都会导致模型有不同的行为。但直觉上,有些变异虽然位置不同,但它们对模型造成的影响可能是非常类似的。

  • 如果两个变异体的“死法”是一样的,即它们在所有测试数据上的表现都相同(要么都被杀死,要么都存活),那测试两个就是浪费。
  • 变异体聚类正是基于这个假设变异位置相近、修改方式相似的变异体,往往会导致相似的模型行为。 因此,可以只测一个代表,然后把结果推广到整个簇。

下面我们来详细拆解一下变异体聚类这种方法。与神经元聚类那种“从源头做减法”的思路不同,变异体聚类是一种“事后筛选”的策略。它的核心思想可以概括为:先把所有变异体都生成出来,然后把那些看起来“差不多”的归为一类,只测其中一个,剩下的结果直接复制。

以下是详细的技术原理解析:

1. 核心逻辑:寻找“行为相似”的变异体

在传统方法中,之所以要测遍所有变异体,是因为我们担心每个变异体都会导致模型有不同的行为。但直觉上,有些变异虽然位置不同,但它们对模型造成的影响可能是非常类似的。

  • 如果两个变异体的“死法”是一样的,即它们在所有测试数据上的表现都相同(要么都被杀死,要么都存活),那测试两个就是浪费。
  • 变异体聚类正是基于这个假设变异位置相近、修改方式相似的变异体,往往会导致相似的模型行为。 因此,可以只测一个代表,然后把结果推广到整个簇。

2. 具体操作步骤

这个方法在论文中的实现流程可以分为以下几个关键环节:

第一步:生成原始的变异体

这一步和传统的(Vanilla)方法完全一样。首先,对模型中的每一个可变异神经元,分别应用三种变异算子(改变权重、神经元阻断、激活反转),生成 3×N3×N 个变异体(其中 NN 是神经元数量)。此时,所有的变异体都已经生成完毕,但还没开始测试。

第二步:定义变异体的特征

为了对变异体进行聚类,需要先把每个变异体转换成一个“特征向量”,以便计算它们之间的相似度。论文中为每个变异体定义了一个四维元组:

(l,n,w,b)(l,n,w,b)

  • ll:该变异体修改的是第几层(Layer)。
  • nn:在该层中,被修改的是第几个神经元(Neuron)。
  • ww:被修改后的权重值(Weights)。
  • bb:被修改后的偏置值(Bias)。

这样一来,每个变异体就变成了高维空间中的一个点。

第三步:计算距离并构建图
  • 距离计算:使用欧几里得距离来衡量两个变异体之间的相似度。距离越小,说明两个变异体不仅在同一个层、相邻的神经元上动手脚,而且修改后的参数数值也很接近。

  • 构建全连接图:将所有变异体看作图中的节点。每两个节点之间都有一条边,边的权重定义为欧几里得距离的倒数

    • 距离越近(越相似),边的权重越大。
    • 距离越远(越不相似),边的权重越小。
第四步:ParHAC 聚类

将构建好的图输入到 ParHAC 聚类算法中。这里需要引入一个关键参数,也就是你之前问到的 链接阈值 pp

  • 算法逻辑:ParHAC 会从每个变异体作为一个独立的簇开始,然后迭代地合并距离最近(最相似)的两个簇。

  • 参数 pp 的作用:这个阈值 pp 就是合并的停止条件。它代表了算法要求的最小相似度。

    • 低阈值(如 0.1) :要求很低,只要稍微有点相似(距离不是特别远),就可以合并。这会导致形成数量少但规模巨大的簇。
    • 高阈值(如 0.99) :要求极高,必须几乎完全一致(距离无限接近0)才能合并。这会导致形成数量多但规模很小的簇(甚至每个变异体自成一类)。
第五步:测试与结果复用

聚类完成后,进入变异测试环节,这是节省时间的关键一步:

  1. 选择代表:从每一个簇中,随机选择一个变异体作为该簇的代表。
  2. 执行测试:只把这些代表变异体拿去做实际的测试(用测试集运行,看是被杀死还是存活)。
  3. 结果复制:对于一个簇,如果代表变异体被杀死,那么这个簇里的所有变异体都被标记为杀死。同样,如果代表存活,簇里所有变异体都标记为存活。
  4. 计算得分:根据这些标记结果,计算出最终的变异得分。

3. 为什么这样可以加速?

通过这种方式,实际执行的测试次数从“变异体总数”减少到了“簇的总数”。簇的数量由参数 pp 控制。

  • 当 p=0.1p=0.1 时,可能只形成了 10 个簇,那就只需要测 10 次,而不是测几万次。
  • 这就是论文中能够实现平均 35.31%  加速的原因。

4. 参数 pp 如何影响结果?(结合你之前的问题)

这个参数 pp 直接决定了效率与准确性的权衡:

  • 低阈值(如 0.1)

    • 聚类结果:大簇。
    • 效率:极高(测试次数极少)。
    • 风险(即论文中提到的误差波动) :大簇内部可能混杂了行为并不相同的变异体。如果随机选出的代表恰好是个“特例”,那么整个簇的标记都会出错,导致变异得分误差波动很大
  • 高阈值(如 0.99)

    • 聚类结果:小簇(甚至一对一)。
    • 效率:极低(几乎退化回传统方法)。
    • 准确性:极高(因为只有极其相似的变异体才会共享结果,误判风险小)。

5. 类比理解

可以把变异体聚类理解为 “抽样检测”

  • 你有一大批产品(变异体),需要检测它们是否合格(是否被杀死)。

  • 传统方法:一个个拆开检查,费时费力。

  • 变异体聚类:你先把产品按照生产批次、零件型号(变异位置和参数)大致分堆(聚类)。然后从每一堆里随机挑一个出来做破坏性测试。

    • 如果抽检的这个坏了(被杀死),你就有理由推断整批货都不行(整个簇标记为杀死)。
    • 这种方法的可靠性,完全取决于你分堆的标准。如果标准很松(低阈值),把不同批次的东西混在一起,抽检结果就容易出错。如果标准很严(高阈值),虽然结果可靠,但堆数太多,检测工作量又上去了。

总结

DNN测试中变异测试方法是现阶段主要测试方法之一,但是变异测试要大量有效突变体。所以不管是生成突变体模型还是测试突变体模型,成本极高。本文提出利用聚类方法从两个角度(神经元,变异体)对突变体进行加速变异分析,降低生成变异体和测试变异体成本。