APP下载

基于强化学习算法的神经网络模糊测试技术优化研究

2024-04-01张宇豪

计算机测量与控制 2024年3期
关键词:覆盖率变异神经元

张宇豪,关 昕

(华北计算技术研究所,北京 100083)

0 引言

深度神经网络在图像处理[1]、语音识别[2]、自然语言处理[3]、医疗诊断[4]等领域取得了巨大成功。但其也存在一些安全隐患,在安全性要求高的系统中,神经网络的微小错误可能造成严重后果,因此对其进行测试显得尤为重要。

神经网络是由数据驱动,大多数传统的软件测试方法不适用于神经网络测试,需要根据神经网络特性研究新的测试方法。目前针对神经网络测试的研究已经取得一定进展,相关学者提出了面向神经网络的覆盖准则以及对应的测试方法。这些方法通过最大化神经元覆盖率,找到最佳测试样本,进而发现神经网络的错误行为。文献[5]提出了一个面向深度学习系统的白盒测试框架DeepXplore。文献[6]提出了第一个差异模糊测试框架DLFuzz,通过最大化神经元覆盖率,并生成对抗性样本,发现神经网络中的异常行为。文献[7]提出了第一个用于神经网络的模糊测试框架TensorFuzz,可以发现模型中的数值型错误。文献[8]提出了基于覆盖的模糊测试框架DeepHunter,用于检测神经网络的缺陷。覆盖度量指标是用于衡量测试充分性的准则。传统软件测试在代码级别[9]和模型级别[10]分别定义了许多覆盖度量指标。而神经网络的特殊结构导致传统覆盖指标无法应用于神经网络测试中[11],如语句覆盖在测试中可以很容易达到100%。根据神经网络的内部逻辑,文献[5]首次提出了神经元覆盖作为覆盖指标,它指的是神经网络中激活神经元的比例。文献[12]借鉴 MC/DC标准的思想提出了基于符号变化、值变化的覆盖指标。文献[13]在神经元覆盖的基础上提出了一组多粒度覆盖指标。文献[7]使用神经元的激活值构成的激活向量作为覆盖指标。这些指标从不同角度反应了神经网络的内部状态。

由于模糊测试具有自动化程度高,不依赖程序源码等特点,模糊测试是目前测试神经网络的重要方法之一。但是在现有神经网络模糊测试方法中,对测试样本进行变异往往采用随机变异策略,导致生成的测试样本质量不高,很难实现高覆盖率。针对这一问题,本文使用强化学习指导变异策略选择过程,通过设计合理的奖励规则,使得模糊器在进行样本变异时,向神经元覆盖率最大化的方向进行,找到覆盖率更高的变异策略。并以此设计了一种面向神经网络系统的模糊测试方法。

1 理论基础

1.1 基于覆盖的模糊测试

模糊测试是软件测试中最常用的方法之一。其核心思想是通过生成随机、不合法的测试用例,在有限的时间内尽可能多地覆盖目标程序的代码路径或执行路径,发现程序中的潜在漏洞。典型的模糊测试过程如图1所示,从种子库中根据优先级选择一个种子输入,通过变异选择器选择变异策略,由变异器执行变异生成变异样本。在此之后,使用变异样本运行待测试程序。如果变异样本产生新覆盖则将变异样本保存在最佳测试样本池中。同时,它还可以跟踪执行的细节,例如执行路径和异常报告。

图1 基于覆盖的模糊测试过程

目前,模糊测试技术在人工智能领域得到了广泛研究。通过对模糊测试[15]进行适应性改造,可以将其应用于神经网络测试中,将目标传统程序映射为神经网络、模糊测试的种子映射神经网络的输入、覆盖反馈映射为神经元覆盖。但目前面向神经网络的模糊测试方法仍然不够完善,制定合适的覆盖标准和有效的变异策略仍是当前研究重点。

1.2 强化学习

强化学习[16]是一种机器学习方法,旨在让智能体与环境进行交互,从中学习如何采取动作来最大化奖励。强化学习的基本架构如图2所示,由智能体、环境、动作、奖励组成,其基本思想是,智能体从环境中感知状态,然后采取动作来影响环境,并从环境中获得奖励或惩罚。在不断与环境交互的过程中,智能体通过学习来改善自己的决策策略,从而使它能够更好地完成任务。强化学习技术在很多领域被广泛应用,如自动驾驶[17]、多智能体系统[18]、医疗保健[19]、游戏[20]等。

图2 强化学习基本架构

马尔可夫决策过程是描述强化学习问题的数学框架,其为将模糊测试形式化为强化学习问题提供了基础。马尔可夫性质是指在一个随机过程中,未来的状态只依赖于当前状态,而不受过去状态的影响。在该过程中,智能体能够基于此刻的状态来选择一个动作执行,并接收来自环境的反馈,如奖励和执行动作后的下一个时刻的状态。智能体的主要目标是寻找一种最优策略,以最大化未来的期望回报,即智能体希望通过选择最佳的动作序列来实现长期的最大累积奖励。

2 基于强化学习的神经网络模糊测试技术建模

2.1 问题建模

在模糊测试中,每一次生成新样本的过程就相当于一次与环境的交互,这个过程可以看做是一个在有限状态和动作空间中的序列决策问题。通过将该过程形式化为强化学习问题,使得智能体能够不断学习并优化它的变异选择策略。经过不断地试错和更新,智能体可以逐步学习到一个最优变异策略,指导生成更高质量的新样本。

将强化学习过程形式化为一个有限马尔可夫决策过程,如公式(1):

MDP=(S,A,P,R)

(1)

其中:S表示一个有限状态集、A表示一个有限动作集、P表示智能体在状态st下执行动作at后转移到st+1的转移概率函数、R表示在状态st下采取行动at的奖励。策略π是一个当前状态st要选择的动作at的映射函数。在执行动作后,状态变为st+1,并反馈相应的奖励rt+1。强化学习的目标就是最大化累积奖励R。

在强化学习问题中,状态、动作和奖励是3个关键的元素。将强化学习算法应用于神经网络模糊测试中,需要将传统的模糊测试过程抽象建模为强化学习算法可解的问题,即从中抽取动作、状态和奖励3个元素[21]。以下主要介绍如何定于动作、状态和奖励3个元素。

2.1.1 环境状态

在强化学习中,状态表示智能体可以获得的当前环境的有效特征,智能体依据当前环境状态来智能地选择下一步的动作,以达到特定的目标。而在模糊测试中,变异器以一种策略对不同的测试样本进行变异,从而生成具有高质量的新样本。所以在模糊测试中,环境状态应该定义为测试样本,初始测试样本做为初始环境状态st,在选择一个变异动作a后,生成的变异样本为新的环境状态st+1。具体以测试样本图像的矩阵形式来表示对应状态s。

2.1.2 变异动作

模糊测试的一个核心步骤就是对样本进行变异,生成能覆盖更多路径的新样本。对应到强化学习中,智能体选择的动作为变异操作,强化学习模型根据当前环境和策略选择合适的动作。因此动作空间由变异操作组成。通过对常用图像变异方法进行总结,选择如表1所示的8种方法作为变异动作空间A,这些变异方法在计算机视觉领域应用广泛,与此同时也可以使图像语义损失最小化[22]。

表1 变异动作空间

需要强调的是,每次变异需要确保生成的变异样本语义不发生改变,一旦变异样本语义发生改变,即使产生了新覆盖,也没有任何意义。为了确保变异生成的样本不会偏离初始样本的语义,每个样本的变异动作只选取一次仿射变换,同时使用公式(2)约束像素变换。这种方法起到限制修改像素的数量和修改像素的绝对值的作用。如果修改的像素数量非常少,则变化程度可以很高;如果修改的像素数量非常多,则对应的变化程度应该更低[8]。

(2)

该式由L0距离和L∞距离组成,L0表示被修改的像素数量,L∞表示像素修改的最大值。其中s和s′分别表示原始输入和变异输入,α和β分别表示修改像素数量的比例和限制像素修改值比例,size(s)表示图像i的像素数。如果被修改像素的数量非常少,则假设它语义不发生改变,L∞的值不受限制。如果被修改的像素数量非常大,则限制最大改变值为β×255。

2.1.3 奖励反馈

奖励反馈是指智能体在环境中采取特定行动后所获得的反馈信号。正面奖励信号通常表示智能体采取的行动是增益行为,而负面奖励信号表示行为有害。这些奖励反馈可以直接指导智能体选择行动,以此最大化未来奖励,进而帮助智能体采取最佳的行动策略。在传统的模糊测试中,通常将是否触发异常的程序状态来衡量测试的好坏。但触发异常状态往往需要大量时间,难以及时调整变异策略。为了解决该问题,可以用覆盖率指标衡量测试的好坏。通常具备高覆盖率的样本可以充分探索神经网络的网络空间,进而有更高的概率触发神经网络的异常行为。在神经网络模糊测试中,将测试样本输入目标网络并获取神经元覆盖率反馈,若覆盖率增加,则认为当前样本质量较高,强化学习算法根据覆盖率增益来更新变异策略。神经元覆盖率的增益作为强化学习的奖励反馈R计算方法,如公式(3)所示:

(3)

其中:C_current表示当前样本的覆盖率,C_previous表示先前样本的覆盖率,C_target表示目标覆盖率,通常设为1。如果当前样本覆盖率相比之前有所增加,则认为该变异策略是有效的。

2.2 D3QN深度强化学习模型

本文使用D3QN(Dueling Double Deep Q Network)强化学习算法来求解问题。它通过借鉴Double DQN[23]和Dueling DQN[25]两种算法的优点,在DQN(Deep Q-Network)算法的基础上进行改进。它使用Double DQN算法的损失函数,减少过高估计的风险,提高学习的稳定性;使用Dueling DQN 算法的网络结构,加速收敛。其余流程和DQN算法一致。D3QN算法在解决本文定义的连续状态、离散动作的问题时,可以发挥更好的作用。

D3QN算法是一种将深度学习和Q学习算法相结合的强化学习方法。它使用深度神经网络拟合动作价值函数Q(s,α;θ),从而输出当前状态下每个动作对应的Q值。随后使用ε-greed策略,在动作选择时,可以以概率ε选择一个随机动作,或者以1-ε的概率选择当前价值网络计算的最大Q值对应的动作,如公式(4)所示。在训练初期,往往将ε设置为较大的值,使智能体尽可能多的进行探索,避免陷入局部最优解。随着训练的进行,该算法会逐渐降低ε的值,如从1逐渐减小至0,这表示当前预测结果的可靠性大大提升。随着这个过程不断进行,预测结果会逐渐收敛,形成一个最优策略。

(4)

同时在智能体与环境的交互过程中会产生一系列经验序列(s,α,r,s′),将其保存在经验回放池中作为训练样本,每次训练时从经验回放池中随机抽取小批量的数据进行计算。经验回放机制通过随机抽样历史经验数据,避免使用关联数据直接进行训练,降低了训练样本的相关性,提高了结果的可靠性。

D3QN对损失函数进行了改进。在DQN算法中对经验回放池进行随机采样,通过损失函数L(θ)的最小化来更新参数θ,从而逐步逼近最优的动作价值函数。L(θ)如式(6)所示,而DQN算法往往选取最大动作价值来近似,这会导致过高估计问题。

(5)

L(θ)=E[(y-Q(s,α,θ))2]

(6)

为了解决DQN算法的过高估计问题。D3QN使用两个独立的Q网络:一个价值网络和一个目标网络。目标网络用于输出能够获得最大Q值的动作,而价值网络用于评估这个动作的Q值,生成目标值y′,其公式见式(7)。这种分离使得更新过程更加稳定,降低了过高估计的风险。

(7)

D3QN算法还对网络结构进行优化,提高了动作价值函数Q(s,α;θ)的准确性。其网络结构如图3所示。相比于传统结构,在该网络结构中,隐藏层后多了一个新的结构。即状态经隐藏层处理后分解为两个分支。一个用于学习状态值函数V(s),另一个用于学习优势函数Ads(s,α),如式(8)所示。最后将状态值函数V(s)和优势函数A(s,α)使用式(9)进行组合以计算Q值。其中V(s)用来估计在状态s下采取任意行动的期望回报。A(s,α) 用来估计采取动作α相对于其他可能动作的优势。正优势函数的动作通常对应更可靠和稳定的决策,选择这样的动作有望在大多数情况下获得正奖励反馈。提高决策的稳定性,并加速训练收敛过程。

(8)

图3 强化学习算法的网络结构

Q(s,α)=V(s)+Adv(s,α)

(9)

3 基于强化学习的神经网络模糊测试框架

3.1 总体框架

本文提出的面向神经网络的模糊测试方法的总体框架如图4所示,分为模糊测试模块和强化学习模块。其中模糊测试模块由初始测试样本种子库,种子优先级选择,变异选择器,覆盖分析器组成。在测试过程中,根据种子优先级选择从初始测试样本种子库选择合适的样本,其次变异选择器根据强化学习的训练策略对种子进行变异,生成变异样本。将变异样本输入神经网络,统计每一层神经元的输出值来计算覆盖率,若覆盖率提高,则将该样本扩充到最佳测试用例集中。该样本可以再次被选中进行变异,不断重复该过程直到满足结束条件。在过程中最关键的组件是变异选择器,通过强化学习算法训练的最佳变异策略,变异选择器可以生成高质量的变异样本,为整个测试提供支撑。

图4 整体框架

3.2 模糊测试模块

3.2.1 种子优先级选择

模糊测试需要从初始样本种子库中迭代地选择种子,用于生成后续的测试样本。如何选择种子直接影响了后续样本变异的效率。本文根据种子被选择的次数设置种子的选择概率,被选择的次数越少对应概率越高,同时当种子被选择的次数达到一定数量后,该种子的选择概率将被设置成一个较小值。

该策略的基本思想是优先选择较少被选择的种子。新生成的变异种子由于获得了更高的覆盖率,被视为高质量种子,因此具有更高的选择概率。同时,当某个种子被选择的次数达到一定数量后,该种子的选择概率会变为一个固定的小概率值,防止某些种子在测试过程中反复被选中,从而浪费资源。

3.2.2 变异选择器

变异选择器根据强化学习的最优策略对样本进行变异。本文采用的变异方法分别是像素变换和仿射变换。其中像素变换包括对比度变换、亮度变换、噪声变换、模糊变换。仿射变换包括平移变换、缩放变换、旋转变换、反射变换。变异选择器根据最优变异策略可以组合这些变异方法,实现不同级别的变异,以产生更多样化的测试样本。

相较于传统的变异选择器的随机变异策略,该变异选择器加入了强化学习方法,利用神经元覆盖率的增加作为反馈信息,得到最佳变异策略。不同于传统模糊器的盲目性和随机性。通过强化学习算法指导变异选择器可以更好地选择种子变异方法,使变异后的种子能最大程度地增加覆盖率或引发更多的行为错误。

3.2.3 覆盖分析器

在模糊测试中,覆盖分析器是用来分析程序执行过程中的覆盖情况。通过分析覆盖信息,可以评估测试用例的有效性和发现潜在问题的能力,有助于确定测试是否足够全面和有效。覆盖分析器的结果可以用于指导进一步的测试样本变异策略,以增加覆盖率。一种没有任何覆盖引导的模糊器会盲目地对种子进行变异操作,不知道生成的测试输入是否可用。这样的模糊器经常会保留那些不带来新的有用信息的种子,显著降低了模糊测试的有效性。本文选择了4种不同的准则作为不同的反馈。这些准则可以有效表示神经网络的内部状态。

1)神经元覆盖(NC):

神经元覆盖[5]度量神经网络中激活神经元的比例。神经元覆盖将神经元的状态分成激活和非激活两部分。给定一个输入,如果它的输出值高于预设的阈值,神经元就会被激活。如公式(10)所示:

(10)

2)K多段神经元覆盖(KMNC):

K多段神经元覆盖[13]度量神经网络中一组神经元覆盖其上下界范围的程度。给定一个神经元n和输出的上下界,将上下界划分为k个部分。如果神经元输出在某一段,则认为该段被覆盖。如公式(11)所示:

(11)

3)神经元边界覆盖(NBC):

神经元边界覆盖[13]度量神经元主功能范围之外的边缘区域被覆盖的程度。给定一个输入x,若φ(x,n)值超过上下边界,则表明边缘区域被覆盖。其上下边界公式为:

UpperCornerNeuron=

{n∈N|∃x∈T:φ(x,n)∈(highn,+∞)}

(12)

LowerCornerNeuron=

{n∈N|∃X∈T:φ(x,n)∈(-∞,lown)}

(13)

神经元边界覆盖公式为:

NBCov(T)=

(14)

4)强神经元覆盖(SNAC):

强神经元覆盖[13]度量神经元的上界边角区域的覆盖程度。

(15)

3.3 强化学习模块

强化学习模块基于D3QN算法进行训练学习最佳变异策略,指导变异测试样本生成。该模块根据输入样本选择变异操作,生成新样本传入神经网络,利用奖励反馈更新变异策略,该过程如图5所示。

图5 强化学习算法训练流程

首先把神经网络、初始样本池作为输入,随机初始化价值网络的参数θ和目标网络的参数θ=θ′,并根据参数初始化两个网络。在一个新回合中,从初始样本池中随机选取一个样本作为初始环境状态s,根据价值网络选择变异动作α,基于变异动作α对样本进行变异生成新样本并将其输入到神经网络中执行。在执行完毕后,返回覆盖率奖励r并得到新的环境状态s′,同时将该四元组(s,α,r,s′)存储到经验重放池D中。在进行训练时,从经验重放池中随机采样得到N个四元组数据(s,α,r,s′),使用目标网络计算损失函数L(θ′),通过最小化L(θ′)更新参数θ′。通过梯度下降更新价值网络参数,每隔一定步数将目标网络的参数更新为目前价值网络的参数值。一个回合的终止条件是,当生成样本出现识别错误或不满足式(2)函数关系时,则停止学习,通过不断学习最终得到一种最优策略,它能够智能地选择变异动作以最大化奖励。

4 实验与结果

4.1 数据集和模型

本文选择了两个流行的公开数据集MINST[26]和CIFAR-10[27]作为实验数据集。MNIST是一个用于手写数字图像识别的数据集,其中6万张图像作为训练集,1万张图像作为测试集,分为10类(即从0到9的手写数字)。每个MNIST图像是一个尺寸为28×28×1的单通道图像。

CIFAR-10是一个用于图像分类的图像集合,其中5万张图像作为训练集,1万张图像作为测试集,分为10个不同类别。每个CIFAR-10图像是一个尺寸为32×32×3的三通道彩色RGB图像。由于CIFAR-10数据集更大、复杂性更高,CIFAR-10的分类任务通常比MNIST的分类任务更难。

本文将分别采用LeNet1、LeNet4、LeNet5在MNIST数据集上进行手写数字分类任务,采用VGG16在CIFAR-10上进行图像分类任务。神经网络模型的具体参数如表2所示。

表2 神经网络模型

4.2 评价指标

本实验从等价类原则出发,选取如表3所示的4种不同粒度的神经元覆盖度量指标。分别是神经元覆盖(NC)、k-多段神经元覆盖(KMNC)、神经元边界覆盖(NBC)、强神经元激活覆盖(SNAC)。这些指标的粒度不同,反应神经网络内部状态也不同,选取这4个指标,可以有效检验本文方法的效果。具体描述见3.2.3节。

表3 评价指标

4.3 对比方法

DeepHunter是一个自动模糊测试框架,用于寻找神经网络模型的潜在缺陷。DeepHunter提出了蜕变变异的概念,即图像语义在种子变异过程中保持不变的性质。该技术通过8种图像变异策略变异种子,并利用多个覆盖度量指标作为反馈,从不同角度指导测试用例生成。同时该技术提出了随机选择和概率选择两个种子选择策略,提高了模糊测试揭示故障和探索模型内部状态的有效性与效率。DeepHunter的有效性和效率在3个流行的数据集和7个具有不同复杂性的模型上得到了验证。

Tensorfuzz是一个基于覆盖引导的模糊测试方法。该技术提出了一种激活向量的覆盖准则,并使用最近邻算法计算测试过程中的覆盖率。在Tensorfuzz中,由覆盖信息指导神经网络的初始样本进行变异,进而完成神经网络测试。

4.4 参数设计

在本实验中,将神经元覆盖中神经元激活阈值设置为0.5。对于K多段神经元覆盖,设k=1 000,这表示每个神经元的激活值对应主函数区间分为1 000段。对于神经元边界覆盖和强神经元激活覆盖,将训练中遇到的最小激活值l设置为下限,最大激活值u设为上限,δ是神经元输出值的标准差。具体如表4所示,这些是原始研究[13]中推荐的设置。

表4 参数设计

4.5 实验结果分析

实验的目标是证明本文所提出的方法能够生成优秀的测试样本,提高不同粒度下的神经元覆盖率。在实验中,采用了本文提出的方法以及两个对比方法,在两个不同数据集上,分别针对四种不同的神经网络进行了测试。在LeNet模型中将执行1 000个测试样本作为终止条件,在VGG模型中将执行500个测试样本作为终止条件,得到在神经元覆盖(NC)、K-多段神经元覆盖(KMNC)、神经元边界覆盖(NBC)、强神经元激活覆盖(SNBC)这 4种覆盖度量准则下的覆盖率。具体的测试结果如表5所示。

表5 不同方法达到的覆盖率峰值

表5总结了初始样本对应的覆盖率以及DeepHunter、Tensorfuzz和本文方法在不同模型下达到的覆盖率。相比于初始样本的覆盖率,本文方法在不同模型下的所有覆盖率指标均得到了提升。相比于Tensorfuzz,本文方法在LeNet和VGG16模型下覆盖率均取得了较大提升。相比于DeepHunter,本文方法在使用LeNet模型的KMNC、SNAC和NBC指标中都获得了更高的覆盖率,在VGG16模型上同样可以获得更高的覆盖率,在LeNet1模型中本文方法实现的NC指标提升不高。

在LeNet 1的NC实验中,本文方法提升覆盖率效果不佳。这是因为神经元覆盖的阈值设计使得在小尺度模型上很难覆盖深度状态,覆盖率提升阈值出现的时间更早,从而很难找到覆盖率增加的样本,使得奖励反馈机制失效,最终变异策略变成了随机变异。

在KMNC上,本文方法可以稳定提高覆盖率。这是因为KMNC这种小粒度测试指标可以为系统提供更多的反馈,从而更好地指导学习变异策略。

在SBNC和NBC上初始覆盖率就比较低是因为SBNC和NBC主要关注边界区域的神经元,即激活值超过主边界区域的神经元。而神经元激活值超过主边界区域的情况相对较少,因此覆盖率不高,但是经过变异,也可以提升覆盖率。

综上所述,本文方法根据强化学习算法生成最优变异策略,使其指导生成的样本可以获得更高的神经元覆盖率,验证了本文方法是一种有效的变异策略优化方法。

5 结束语

本文的主要研究内容是基于强化学习算法对神经网络模糊测试中的测试样本变异环节进行优化,将神经网络模糊测试建模为一个马尔可夫决策过程,定义了适用于神经网络模糊测试的环境状态、奖励反馈、变异动作,并通过强化学习算法学习一个最佳变异策略,指导样本变异过程,生成最佳变异样本。与随机变异相比,本文提出的方法可以更快地推动样本向覆盖率更高的方向变异。通过实验表明,本文的方法可以生成高质量测试样本,提高测试覆盖率。在未来的研究中,将利用现有的变异策略,提高测试前期生成样本的质量;设计更加有效的强化学习模型和参数,提高其性能。

猜你喜欢

覆盖率变异神经元
民政部等16部门:到2025年村级综合服务设施覆盖率超80%
《从光子到神经元》书评
我国全面实施种业振兴行动 农作物良种覆盖率超过96%
变异危机
变异
跃动的神经元——波兰Brain Embassy联合办公
基于喷丸随机模型的表面覆盖率计算方法
变异的蚊子
基于二次型单神经元PID的MPPT控制
毫米波导引头预定回路改进单神经元控制