NEUZZ: Efficient Fuzzing with Neural Program Smoothing
2019 IEEE Symposium on Security and Privacy
摘要
即使當前先進的fuzzer非常擅長尋找難以觸發(fā)的軟件漏洞。大多數fuzzer基于遺傳算法來生成觸發(fā)不同漏洞的輸入。遺傳算法雖然快并且易于部署,但是經常被無效的隨機變異序列所限制。梯度引導的優(yōu)化有希望成為遺傳算法的替代。
梯度引導技術已經被證明了在域中解決高維結構優(yōu)化問題時(例如機器學習通過有效利用梯度或基礎函數的高階導數),顯著優(yōu)于遺傳算法。
然而,梯度引導方法并不能直接應用于模糊測試,因為現實世界的程序存在大量的不連續(xù),在基于梯度引導的方法經常遇到的高原和山脊。
該問題可以通過創(chuàng)建一個平滑的代理函數來逼近目標程序的離散分支行為來解決。在本文中,我們提出了一種使用替代神經網絡模型的新的程序平滑技術,可以增量地學習一個復雜的、真實世界程序地分支行為的平滑近似。我們進一步證明,這種神經網絡模型可以與梯度引導的輸入生成方法一起使用,以顯著提高模糊過程的效率。
引言
由于安全漏洞往往是稀疏并且不規(guī)則地分布在一個程序中,大多數fuzzer的目標是通過提高代碼覆蓋率來提高發(fā)現漏洞的機會。隨著語料庫的增大,遺傳算法在觸發(fā)新的程序位置變得低效。
遺傳算法的一個主要限制是他們無法利用潛在的優(yōu)化問題的結構(例如,梯度或其他高階導數)。
梯度引導優(yōu)化(例如梯度下降)是一種很有前途的替代方法,已被證明在解決包括空氣動力學計算和機器學習在內的不同領域的高維優(yōu)化問題時,其性能顯著優(yōu)于進化算法。
然而,梯度引導優(yōu)化算法不能直接用于fuzzing真實世界程序,因為他們通常包含大量的不連續(xù)行為(梯度不能精確計算的情況下),這是因為不同的程序分支有著不同的行為。該問題可以通過創(chuàng)建一個平滑處理函數來估計程序輸入和目標程序分支的關系。不幸的是,現存的程序平滑技術,由于他們嚴重依賴于符號執(zhí)行,因此存在一些基本限制。
在本文中,我們介紹了一種程序平滑技術,使用前饋神經網絡,可以增量地學習復雜的、真實的程序分支行為的平滑近似,即由特定的給定輸入來預測目標程序的控制流邊緣。我們進一步提出了梯度引導搜索策略來計算,并且利用梯度平滑的近似來識別應該變異的位置,以此檢測出目標程序的漏洞。
我們演示了如何通過在錯誤預測的程序行為上對模型進行增量再訓練來改進神經網絡模型。我們發(fā)現,前饋神經網絡很自然地適合我們的任務,因為
(1)它們被證明具有近似復雜非線性函數的能力,就像普遍逼近定理所暗示的那樣。
(2)它們支持高效和精確的計算梯度/高階導數。
本文的主要貢獻:
(1)我們是首次確定程序平滑對于采用有效的梯度引導技術進行模糊測試的重要性。
(2)我們引入了第一個使用代理神經網絡的高效且可擴展的程序平滑技術,以有效地模擬目標程序的分支行為。我們進一步提出了一種增量學習技術,隨著更多的訓練數據可用,迭代地改進代理模型。
(3)我們證明代理神經網絡模型的梯度可用于有效地生成程序輸入,從而最大限度地增加目標程序中發(fā)現的錯誤數量。
(4)作為 NEUZZ 的一部分,我們設計、實施和評估我們的技術,并證明它在廣泛的現實世界程序以及策劃的錯誤數據集上顯著優(yōu)于 10 個最先進的模糊器。
本文其余內容
第二章總結了優(yōu)化和梯度引導技術的必要背景知識。
第三章使用motivating example提供了一個我們技術的展望。
第四章和第五章介紹了我們的方法論以及實現過程中的細節(jié)。
第六章中進行了實驗,后續(xù)是相關工作和總結。
第二章 背景知識
一個優(yōu)化問題通常由三個部分組成:一個向量參數x,一個可以被最小化或者最大化的目標函數F(x),一個約束函數的集合Ci(x),既可以是等式約束也可以是不等式約束。優(yōu)化過程的目標是找到參數向量x的具體的值,能夠最大化/最小化F(x)并且滿足所有約束Ci(x)如下所示:

這里,R、N和Q分別表示實數集、不等式約束指數和等式約束指數。
函數平滑度&優(yōu)化
優(yōu)化算法通常在一個循環(huán)中運行,從參數向量x的初始猜測開始,然后逐漸迭代以找到更好的解決方案。任何優(yōu)化算法的關鍵組成部分是它用來從一個 x 值移動到下一個值的策略。 大多數策略利用目標函數 F、約束函數 Ci的值,以及梯度/高階導數(如果可用)的值。
不同的優(yōu)化方法收斂到最優(yōu)解的能力和效率在很大程度上取決于目標函數F和約束函數Ci的性質。通常,較平滑的函數(即具有明確定義和可計算導數的函數)可以比具有許多不連續(xù)性(例如脊或高原)的函數更有效地優(yōu)化。直觀地說,目標/約束函數越平滑,優(yōu)化算法就越容易精確計算梯度或高階導數,并使用它們系統(tǒng)地搜索整個參數空間。
本文的剩余部分,我們特別關注無約束優(yōu)化問題,因為它們很接近fuzzing,我們的目標域。對于無約束平滑優(yōu)化問題,梯度引導方法在解決高維結構化優(yōu)化問題上的性能明顯優(yōu)于進化策略。這是因為梯度引導技術有效地利用梯度/高階導數來高效地收斂到最優(yōu)解,如圖1所示。

凸&梯度引導優(yōu)化
對于一類稱為凸函數的常見函數,梯度引導技術是高效的,并且可以始終收斂到全局最優(yōu)解。
直觀地說,如果連接函數圖上任意兩點的直線完全位于圖的上方或上方,則函數是凸的。
更正式的,一個函數f被稱為凸的,如果所有x和y的點對在域中滿足以下性質

然而,在非凸函數中,梯度引導方法可能會局部最優(yōu)解(假設目標是最大化)當客觀函數比所有附近的可行點都大,但在整個可行參數值范圍內的其他地方存在其他較大的值。然而,即使在這種情況下,簡單的啟發(fā)式方法,如從新的隨機選擇的起點重新啟動梯度引導方法,在實踐中也被證明是非常有效的
Fuzzing as unconstrained optimization
模糊測試可以看作一個無約束優(yōu)化問題,目標通過固定數量的測試輸入從而最大化在目標程序中發(fā)現的漏洞數量。因此,目標函數可以被看做Fp(x),當使用輸入x執(zhí)行目標程序p時,輸入x觸發(fā)了漏洞返回1。然而,這樣的函數表現太差(即大部分包含平原和一些非常尖銳的過渡),無法有效地進行優(yōu)化。
因此,大多數灰盒模糊測試工具會嘗試將測試代碼地數量最大化(例如,最大化邊覆蓋率)作為代理度量。這樣的一個目標函數可以看作F'p(x),F'返回被輸入x覆蓋的目標程序P的信息控制流邊。注意F'比原始函數F更容易優(yōu)化,因為執(zhí)行新控制流邊緣的所有可能程序輸入的數量往往明顯高于觸發(fā)錯誤/安全漏洞的輸入。
大多數的現存灰盒模糊測試工具使用進化技術以及其他特定領域的啟發(fā)式算法作為其主要優(yōu)化策略。在梯度引導優(yōu)化中選擇此類算法的關鍵原因是,由于不同程序路徑上的行為顯著不同,大多數實際程序包含許多不連續(xù)性。
這種不連續(xù)性可能會導致梯度引導優(yōu)化陷入非最優(yōu)解。在本文中,我們提出了一種使用神經網絡對目標程序進行平滑處理的新技術,使其適用于梯度引導優(yōu)化,并演示了模糊器如何利用這些策略顯著提高其效率。
第三章 本文方法概述
圖2給出了一個我們方法的概括展望。

神經網絡平滑
平滑地逼近程序的不連續(xù)分支行為是精確計算梯度或梯度引導優(yōu)化所需的高階導數的必要條件。如果沒有這樣的平滑,梯度引導的優(yōu)化過程可能會在不同的不連續(xù)/平臺上卡住。平滑過程的目標是創(chuàng)建一個平滑的函數,它可以模仿程序的分支行為,而不會引入大錯誤(即,它與原始程序行為的偏差最?。?br> 我們使用一個前饋神經網絡來完成這一目的。正如普遍逼近定理所暗示的那樣,一個神經網絡非常適合近似任意復雜的程序行為(非線性并且非凸)。并且,根據NNs的設計,其支持對我們的目的至關重要的高效梯度計算。我們通過使用現有測試輸入或使用現有進化模糊測試生成的測試輸入語料庫來訓練神經網絡,如圖2所示。
梯度引導優(yōu)化
光滑神經網絡模型經過訓練后,可以有效地計算梯度和高階導數,然后利用這些梯度和高階導數更快地收斂到最優(yōu)解。梯度引導算法地不同變體,如梯度下降法、牛頓法或擬牛頓法,如L-BFGS算法,使用梯度或高階導數來加快收斂速度。平滑NNs使模糊輸入生成過程能夠潛在地使用所有這些技術。在本文中,我們設計、實現并評估了一種簡單地梯度引導輸入生成方案,該方法專門針對CGF。
增量學習
任何類型的現有測試輸入(只要它們在目標程序中暴露不同的行為)都可以潛在地用于訓練神經網絡模型和引導模糊輸入生成過程。在本文中,我們通過運行進化模糊器(如AFL)收集一組測試輸入和相應的邊緣覆蓋信息來訓練神經網絡。
然而,由于用于訓練神經網絡模型的初始訓練數據可能只覆蓋程序空間的一小部分,我們通過增量訓練進一步細化模型,因為在模糊化過程中觀察到新的程序行為。增量訓練中的關鍵挑戰(zhàn)是,如果神經網絡只在新數據上訓練,它可能會完全忘記從舊數據中學習到的規(guī)則。
我們通過設計一種新的基于覆蓋率的過濾方案來避免這個問題,該方案可以創(chuàng)建新數據的簡要摘要,從而使神經網絡能夠有效地進行訓練。
A motivating Example

如圖3所示的一個例子??紤]這種情況,像AFL這樣的進化fuzzer能夠完成覆蓋第二行和第九行的分支,而不能覆蓋第五行的分支。這里的關鍵挑戰(zhàn)是去找到a和b的值能夠觸發(fā)第5行的分支。進化模糊測試工具經常與這樣的代碼斗爭,因為通過隨機變異找到解決方案的概率非常低。
例如,圖3(a)里顯示表示代碼段的原始函數。這里在a+b=0到a+b-c=0(c->+0)之間有一個sharp jump。
為了在模糊化過程中最大化邊緣覆蓋,進化模糊測試工具只能對輸入進行隨機突變,因為這種技術不考慮函數曲面的形狀。相比值下,我們的神經網絡平滑和梯度引導突變旨在利用梯度測量的函數曲面形狀。
我們根據其他兩個分支的程序行為訓練神經網絡模型。NN模型平滑地逼近程序行為,如圖3(b)(c)所示。然后,我們使用神經網絡模型執(zhí)行更有效的梯度引導優(yōu)化,以找到所需的a和b值,并逐步優(yōu)化模型,直到找到所需的分支來執(zhí)行目標錯誤。
第四章 主要方法
A.程序平滑
程序平滑是使得梯度優(yōu)化技術適用于fuzzing真實世界程序不連續(xù)行為時的關鍵步驟。
除平滑函數之外,梯度引導優(yōu)化技術在優(yōu)化非平滑的函數時并不是非常有效,因為會被不同的不連續(xù)行為限制。平滑過程最小化不規(guī)則,從而使得梯度引導優(yōu)化在不連續(xù)函數優(yōu)化上更加顯著有效。
一般來說,對于一個不連續(xù)函數f的平滑科研認為是和一個平滑的掩模函數g的卷積運算,從而產生一個新的平滑輸出函數。一些流行的平滑掩模函數包括不同的高斯函數和sigmoid函數。

然而,對于很多實際的問題,不連續(xù)的函數f可能沒有封閉形式的表示,因此不可能用解析法計算上述積分。在一些例子中,當使用離散形式

程序平滑技術可以分為兩個類別:黑盒和白盒平滑。黑盒方法從f的輸入空間中選取離散樣本,利用這些樣本數值計算卷積。與之相反的,白盒方法分析程序的語句/指令并且嘗試使用符號分析和抽象解釋來總結它們的效果。黑盒方法可能會引入較大的近似誤差,而白盒方法會產生令人望而卻步的性能開銷,這使得它們在真實的程序中不可行。
為了避免這樣的問題,我們使用神經網絡以灰盒方法(例如,收集邊緣覆蓋率數據)學習程序行為的平滑近似。
B.神經的程序平滑
在本文中,我們提出了一種新的程序平滑方法,即使用替代神經網絡模型學習和迭代改進目標程序的平滑逼近,基于觀察到的程序行為。該代理神經網絡可以平滑地推廣到觀察到的程序行為,同時還可以準確地建模潛在的非線性和非凸行為。神經網絡一旦經過訓練,就可以用于有效地計算梯度以及更高維度的導數來引導模糊測試輸入生成過程。
為什么使用NNs?
正如普遍逼近定理[33]所暗示的那樣,神經網絡非常適合逼近復雜(可能是非線性和非凸的)程序行為。使用神經網絡進行平滑程序逼近學習的優(yōu)點如下:(1)神經網絡能夠準確地模擬復雜的非線性程序行為,并能夠有效地訓練。之前基于模型的優(yōu)化工作使用了簡單的線性和二次模型[24],[23],[71],[52]。然而,這樣的模型并不適合對具有高度非線性和非凸行為的真實軟件建模;(2)神經網絡支持其梯度和高階導數的高效計算。因此,梯度引導算法可以在不增加額外開銷的情況下計算和使用這些信息;(3)網絡神經網絡可以基于程序在類似輸入上的行為,推廣并學習預測程序在看不見的輸入上的行為。因此,對于少量的輸入樣本,神經網絡可以根據其行為學習整個程序的平滑近似。
NN訓練
雖然神經網絡可以用來模擬程序行為的不同方面,但在本文中,我們專門使用它們來模擬目標程序的分支行為(即,預測給定程序輸入的控制流邊緣)。使用神經網絡建模分支行為的挑戰(zhàn)之一是需要接受可變大小的輸入。前饋神經網絡與現實世界的程序不同,通常接受固定大小的輸入。因此,我們設置了一個最大輸入大小閾值,并在訓練期間用空字節(jié)填充任何較小的輸入。請主義,支持更大的輸入并不是一個主要問題,因為現代NN可以輕松地擴展到數百萬個參數。因此,對于較大的程序,如果需要,我們可以簡單地增加閾值大熊啊。然而,我們的經驗發(fā)現,相對適中的閾值產生最好的結果,較大的輸入并不能顯著提高建模的準確性。

在本文中,采用前饋全連接神經網絡對目標程序的分支行為進行建模。前饋結構可以高效計算梯度和快速訓練。
我們的平滑技術與訓練數據的來源無關,因此NN可以在現有輸入語料庫中收集的任何邊緣覆蓋數據上訓練。對于我們的原型實現,我們使用由現有的進化模糊器(如AFL)生成的輸入語料庫來訓練我們的初始模型。
訓練數據預處理
由訓練數據進行的邊緣覆蓋通常傾向于有偏差,因為它只包含程序中所有邊緣的一小部分標簽。例如,一些邊可能總是由訓練數據的所有輸入一起聯(lián)系。在機器學習中,一組變遷之間的這種類型的相關性被稱為多重共線性,它經常阻止模型收斂到一個小的損失值。為了避免這種情況,我們遵循常見的機器學習的降維實踐,將訓練數據中總是同時出現的邊合并稱一條邊。此外,我們只考慮訓練數據中至少被激活過一次的邊緣。這些步驟將標簽的數量從平均65536個顯著減少到4000個左右。注意,我們在增量學習的每一次迭代中都重新運行數據預處理步驟,因此,隨著模糊過程中發(fā)現新的邊緣數據,一些合并的標簽可能會被分割,因為它們的相關性可能會降低。
C.梯度引導的優(yōu)化
不同的梯度引導優(yōu)化技術,如梯度下降法、牛頓法活準牛頓法,如L-BFGS,可以使用梯度或高階導數,以更快的收斂。平滑的神經網絡使模糊輸入生成過程可以通過支持梯度和高階導數的高效計算來潛在地使用任何這些技術。在本文中,我們專門設計了一個簡單地梯度引導搜索方案,該方案對較小地預測誤差具有魯棒性,以證明我們的方法的有效性。我們把對更復雜技術的探索留作以后的工作。
梯度的正式定義,表明每個輸入字節(jié)應該改變多少,以影響神經網絡中最后一層神經元的輸出(表示程序中邊緣覆蓋的變化)f。在這里,每個輸出神經元對應于一個特定的邊,并計算一個0到1之間的值,總結給定的輸入字節(jié)對特定邊的影響。神經網絡f輸出神經元的梯度,輸入被廣泛用于對抗輸入生成,和可視化理解DNNs。直觀地說,在我們的設置中,基于梯度的引導的目標是找到將最終層神經元的輸出從0改變到1的不同邊緣的輸入。

梯度引導的優(yōu)化:算法1展示了梯度引導輸入生成過程的概括。關鍵思想是識別具有最高梯度值的輸入字節(jié)并改變它們,因為它們對NN表示更高的重要性,從而有更高的機會引起程序行為的重大變化。
從種子開始,我們迭代地生成新的測試輸入。如算法1所示,在每次迭代中,我們首先利用梯度的絕對值來識別將導致未取邊對應的輸出神經元發(fā)生最大變化的輸入字節(jié)。接下來,我們檢查每個字節(jié)的梯度符號,以決定突變的方向(例如,增加或減少它們的值),以最大化/最小化目標函數。從概念上講,我們對梯度符號的使用類似于[39]中引入的對抗性輸入生成方法。我們還將每個字節(jié)的突變限制在其合法范圍內(0-255)。第6行和第10行表示使用clip函數實現這種邊界。
我們以一個小的突變目標(算法1中的k)開始輸入生成過程,并以指數增長目標字節(jié)數來進行突變,以有效地覆蓋大的輸入空間。
D.通過增量學習進行改進
梯度引導輸入生成過程的效率很大程度上取決于代理神經網絡對目標程序分支行為建模的準確性。為了獲得更高的精度,我們在模糊過程中觀察到發(fā)散的程序行為時,逐步細化神經網絡模型。(也就是說,當目標程序的行為與預測的行為不匹配時)。我們使用增量學習技術來保持神經網絡模型的更新,通過學習新的數據,當新的邊緣被觸發(fā)。
神經網絡優(yōu)化背后的主要挑戰(zhàn)是防止神經網絡模型在訓練新數據時突然忘記它從舊數據中學習的信息。這種以往在深度學習文獻中是一個眾所周知的現象,一直被認為時穩(wěn)定-可塑性困境的結構。為了避免這種遺忘問題,神經網絡必須改變足夠的權值來學習新的任務,但不能太大以致于導致它忘記之前學習的表示。
優(yōu)化NN最簡單的方法是將新的訓練數據(即程序分支行為)與舊數據相加,重新從頭開始訓練模型。然而,隨著數據點數量的增加,這種再培訓變得越來越難以規(guī)?;V暗难芯吭噲D解決這個問題,主要使用兩種廣泛的方法[44],[51],[31],[75],[29],[40],[76]。第一種方法試圖保持新模型和舊模型的分離表示,以最小化使用分布式模型、正則化或創(chuàng)建多個模型的集合的遺忘。第二種方法維護舊數據的摘要,并根據新數據和匯總的舊數據對模型進行再訓練,因此比完全再訓練更有效。我們建議有興趣的讀者參考Kemker et al.[48]的調查以了解更多細節(jié)。
在本文中,我們使用基于邊緣覆蓋的過濾來只保留觸發(fā)新分支的舊數據進行再訓練。隨著新的訓練數據變得可用,我們識別實現新的邊緣覆蓋的那些,將它們與過濾后的舊訓練數據放在一起,并重新訓練NN。這種方法有效地防止了訓練數據樣本的數量隨著再訓練迭代次數的增加而急劇增加。我們發(fā)現我們的過濾方案可以很容易地支持多達50次迭代的再訓練,同時仍然保持訓練時間在幾分鐘以內。
第五章 實現
NN架構
我們的NN模型在Keras2.1.3[5]中實現,后端是Tensorflow-1.4.1[6]。該神經網絡模型由三個全連接層組成。隱層使用ReLU作為激活函數。我們使用sigmoid作為輸出層的激活函數來預測控制流邊緣是否被覆蓋。訓練神經網絡模型50個epoch(即整個數據集的50次完整通過),以獲得較高的測試精度(平均約95%)。由于我們使用的是一個簡單的前饋網絡,所以10個項目的訓練時間都不到2分鐘。即使使用Intel i7-7700運行在3.6GHz的純CPU計算,訓練時間也不到20分鐘。
訓練數據收集
對于每個測試的程序,我們在單核機器上運行AFL-2.5.2[88] 1小時,為NN模型收集訓練數據。為10個項目收集的平均訓練輸入數量約為2K。得到的語料庫以5:1的比例進一步分裂為訓練數據和測試數據,其中使用測試數據來確保模型沒有過擬合。我們使用10KB作為閾值文件大小從AFL輸入語料中選擇我們的訓練數據(平均90% AFL生成的文件都在閾值以下)。
變異和重訓練
NEUZZ通過迭代運行來生成1M突變,并對NN模型進行增量再訓練。我們首先使用算法1中描述的突變算法產生1M的突變。我們將參數i設置為10,這將為種子輸入生成5120個突變輸入。接下來,我們在目標程序中隨機選擇100個輸出神經元,代表100個未探索的邊緣,從兩個種子中產生10240個突變輸入。最后,我們使用AFL的分叉服務器技術[54]執(zhí)行帶有1M突變輸入的目標程序,并使用覆蓋新邊緣的所有輸入進行增量再訓練。
模型參數選擇
NEUZZ的成功取決于訓練模型和生成突變時不同參數的選擇。在這里,我們通過經驗探索了在四個程序中確保最大邊緣覆蓋的最優(yōu)參數:readelf,libjpeg,libxml以及Mupdf.

第六章 實驗
實驗主要回答以下問題:
(1)NEUZZ是否可以較之現存的fuzzer發(fā)現更多的漏洞。
(2)NEUZZ是否覆蓋率更嘎
(3)NEUZZ是否比其他RNN-based fuzzer效果更好。
(4)不同的模型選擇如何影響NEUZZ的性能。
我們的實驗設置包括以下兩個步驟:首先,我們運行AFL一個小時,生成初始種子語料庫。然后,我們使用相同的初始種子語料庫,在固定的時間預算下運行每個模糊算子,比較它們的邊緣覆蓋率和發(fā)現的bug數量。具體來說,10個真實世界程序、LAVA-M數據集和CGC數據集的時間預算分別為24小時、5小時和6小時。
問題(1)的回答



問題(2)的回答


問題(3)的回答
現有的基于遞歸神經網絡(RNN)的模糊控制器從過去的模糊測試經驗中學習突變模式,以指導未來的突變[72]。這些模型首先從AFL產生的大量突變輸入中學習突變模式(由關鍵字節(jié)組成)。接下來,他們使用突變模式構建AFL過濾器,該過濾器只允許關鍵字節(jié)上的突變通過,否決所有其他非關鍵字節(jié)的突變。我們選擇了之前研究過的4個程序來評估NEUZZ與基于RNN的模糊器對100萬個突變的性能。我們用相同的訓練數據訓練兩個NN模型,然后讓兩個基于NN的模糊器運行,生成100萬個突變,并比較兩種方法獲得的新代碼覆蓋率。

問題(4)的回答
NEUZZ的模糊化性能在很大程度上取決于訓練后神經網絡的準確性。正如在第五節(jié)中所描述的,我們通過經驗發(fā)現,具有1個隱藏層的NN模型足以模擬真實世界程序的復雜分支行為。在本節(jié)中,我們通過探索1隱層架構的不同模型設置來進行消融研究,即線性模型、不加細化的神經網絡模型和增量細化的神經網絡模型。我們評估了這些模型對NEUZZ性能的影響。
我們通過去除隱藏層中使用的非線性激活函數來實現線性模型,從而使整個前饋網絡完全線性化。該神經網絡模型從AFL中訓練相同的種子語料庫。接下來,我們從被動學習模型中生成1M突變,并測量這些1M突變實現的邊緣覆蓋。最后,我們從100萬個突變中過濾出鍛煉未見邊緣的突變輸入,并將這些選擇的輸入添加到原始種子語料庫中,以增量方式重新訓練另一個NN模型,并使用它生成進一步的突變。結果匯總于表VIII。
我們可以看到,對于所有4個測試程序,兩種NN模型(有或沒有增量學習)都優(yōu)于線性模型。這表明非線性神經網絡模型比簡單的線性模型更能近似程序的行為。我們還觀察到,增量學習幫助神經網絡實現顯著更高的準確性,因此更高的邊緣覆蓋率。