首頁>技術>

0、引用

Zhao, Gang & Huang, Jeff. (2018). DeepSim: deep learning code functional similarity. 141-151. 10.1145/3236024.3236068.

1、摘要

對於許多軟體工程任務,例如程式碼搜尋、重構和重用,測 量程式碼相似性是至關重要的。然而,大多數現有的技術只關注程式碼語法相似性,而度量程式碼功能相似性仍然是一個具有挑戰性的問題。在本文中,我們提出了一種新的方法,將程式碼控制流和資料流編碼成一個語義矩陣,其中每個元素都是高維稀疏二進位制特徵向量,並設計了一種基於這種表示的度量程式碼功能相似性的新的深度學習模型。透過連線從程式碼對中學習到的隱藏表示,這種新模型將檢測功能相似程式碼的問題轉換為二進位制分類,從而能夠有效地學習具有非常不同語法的功能相似程式碼之間的模式。

我們已經為 Java 程式實現了我們的方法 DeepSim,並在功能相似程式碼的兩個大型資料集上評估了它的召回、精度和時間效能。實驗結果表明,DeepSim 顯著優於現有的最先進技術,如 DECKARD、RtvN、CDLH 和兩個基線深度神經網路模型。

關鍵字:程式碼功能相似性,控制/資料流,深度學習,分類

2、介紹

測量程式碼片段之間的相似性對於許多軟體工程任務是至關重要的,例如程式碼克隆檢測、程式碼搜尋和重用,重構,Bug 檢測。軟體工程界對程式碼句法相似性進行了深入的研究,但在程式碼功能相似性的測量方面卻鮮有成功。大多數現有技術遵循相同的管道:首先從程式碼中提取語法特徵(以原始文字、令牌或 AST 的形式),然後應用某些距離度量檢測類似程式碼。然而,這些技術使用的句法表示顯著地限制了它們在建模程式碼功能相似性方面的能力。此外,這種簡單的距離度量對於某些特徵空間(例如分類)可能是無效的。此外,單獨處理每個程式碼片段使得很難學習具有不同語法的功能相似程式碼之間的相似性。

在本文中,我們提出了一種新的方法,DeepSim,用於測量程式碼功能相似度,這大大提高了技術水平。DeepSim 基於兩個關鍵的觀點。首先,如果特性表示具有更高的抽象,那麼它在度量程式碼語義方面就會更加強大,因為更高的抽象要求捕獲程式碼的更多語義資訊。控制流和資料流代表了比程式碼語法特徵(如令牌和 AST 節點)更高的抽象。因此,DeepSim 使用控制流和資料流作為相似性度量的基礎。更重要的是,我們提出了一種新的編碼方法,將編碼控制流和資料流都編碼成一個緊湊的語義特徵矩陣,其中每個元素都是高維稀疏二值特徵向量。透過這種編碼,我們將程式碼相似性度量問題簡化為識別矩陣中的相似模式,這比尋找同構子圖更具可伸縮性。

其次,利用深度神經網路(DNN)的能力來學習基於編碼語義矩陣的相似性度量,而不是手動從語義矩陣中提取特徵向量並計算不同程式碼之間的距離。在過去的十年裡,DNN 在計算機視覺、語音識別和自然語言處理等各個領域都取得了突破。我們設計一種新的 DNN 模型,進一步從語義矩陣中學習高階特徵,並將程式碼功能相似性度量問題轉化為二值分類問題。該模型透過對程式碼片段的特徵向量進行連線,可以有效地學習語法非常不同但功能相似的程式碼之間的模式。

如圖 1 所示,DeepSim 由兩個主要元件組成:(1)透過將控制流和資料流編碼成特徵矩陣的程式碼語義表示;(2)深度學習程式碼相似度測量。第一個元件可以以任何語言的程式碼片段作為輸入,以原始碼、位元組碼或二進位制程式碼的形式,只要可以構造資料流圖和控制流圖。第二個部分是一個新穎的深度學習模型,它包含兩個緊密整合的模組:一個神經網路模組,它從一個程式碼對的矩陣中提取高階特徵,一個二進位制分類模組,它確定程式碼對是否在功能上相似。這兩個模組一起工作,充分利用學習的力量:神經網路模組提取分類器的潛在表示,並從分類器反向傳播的訊號,反過來,幫助神經網路從輸入學習更好的表示。最後,訓練後的模型可以用來衡量程式碼的功能相似度。

圖 1. DeepSim 系統架構

基於 WALA 框架和 TensorFlow,我們在 Java 方法級實現了 DeepSim。對 DeepSim 的兩個資料集進行了評估:一個包含 1669 個谷歌程式碼 Jam 專案的資料集和流行的 BigCloneBench 資料集,其中包含超過 600 萬對帶標籤的克隆對和 26 萬對假克隆對。我們的結果表明,DeepSim 顯著優於先進技術,如 DECKARD,RtvNN,CDLH,以及兩個堆疊去噪自編碼(SdA)基準深度學習模型。與此同時,DeepSim 獲得了非常好的效率(甚至比 DECKARD 更快)。

本文的貢獻如下:

提出了一種度量程式碼功能相似度的新方法,將程式碼控制和資料流編碼為一個單一的語義特徵矩陣。

我們設計了一種新的深度學習模型,從語義矩陣中學習高階表示,並學習不同語法程式碼之間的功能相似性度量。

我們實現了一個原型工具 DeepSim2,並使用兩個大型資料集對其進行了廣泛評估,結果顯示,與最先進的技術相比,效能有了顯著的改進。

3、背景知識3.1 前饋神經網路

前饋神經網路,又稱多層感知器(MLP),是一種通用而強大的近似器,得到了廣泛的應用。它本質上是一個從輸入到輸出的對映:F: Rm0—>Rmk,其中 m0 是輸入的維數,mk 是最後一層 Lk 生成的輸出的維數。每一層的對映功能是由它的單位(稱為神經元)組成的。

幾個神經元組成一層,幾層組成整合神經網路的結構已被證明在學習從輸入到輸出的複雜非線性對映方面是有效的。此外,隨著現代 GPUs 的計算能力不斷增強,神經網路的深度(層數)可以透過一個巨大的訓練資料集,也就是所謂的深度學習變得非常大。一個代表性的前饋 DNN 模型是深度自動編碼器,它的目標是從輸入學習一個緊湊的隱藏表示。與標準編碼方法(例如,影象/音訊壓縮)不同,它使用神經網路來學習目標編碼函式,而不是明確地定義它。目標是最小化從其隱藏的表示重構輸入的誤差(例如,平方誤差),如圖 2 中的公式:

圖 2. DNN 計算公式

最小化重構誤差迫使這個模型保留儘可能多的原始輸入資訊。然而,原始輸入中存在的一些身份屬性可能會使模型簡單地學習一個查詢函式。因此,通常在自編碼器的輸入端加入鹽噪聲或破壞過程,稱為堆疊去噪自編碼器(SdA)。破壞過程的工作方式是將輸入的某些元件隨機設定為 0,這實際上增加了自動編碼器的稀疏性。然後,重構過程嘗試使用這個損壞的輸入來重構原始輸入。

其中 θ= (W,b),S(i)為樣本 i 的地真標號,S(i)為預測標號。為了最佳化 J(θ),我們可以應用梯度下降來更新 W 和 b。由於 DNN 深度較大,對每個引數分別計算損失函式的導數是無效的。因此,通常採用反向傳播。它包括三個階段:1)前饋階段,使用當前權重生成輸出;2)利用地真值輸出和前饋輸出計算每個神經元的響應誤差的前向階段;3)權值更新階段,利用響應誤差計算梯度,並以學習率更新權值。

4、編碼語義特徵4.1 控制流和資料流

控制流分析和資料流分析是兩種基本的靜態程式分析技術。控制流捕獲程式碼基本塊和過程之間的依賴性,資料流捕獲沿著程式路徑和操作的資料值流。從這些分析中得到的資訊是表示程式碼行為的基礎。我們的基本思想是將程式碼控制流和資料流編碼為變數和基本塊之間的關係(例如,操作、控制跳轉)。為了獲得控制流和資料流,我們可以對原始碼、二進位制程式碼或任何中間表示(如 Java 位元組碼、LLVM 位碼)進行分析。在本文中,我們關注的是使用 WALA 框架的 Java 位元組碼。

圖 3. 控制流和資料流示例

圖 3 演示了一個程式碼示例及其控制流圖(CFG)。在 CFG 中,每個矩形代表一個基本塊,每個基本塊中可能存在幾個中間指令。對於每個基本塊,可以生成一個數據流圖(DFG)。注意,每個變數和每個基本塊都包含其型別資訊。例如,x 是一個靜態整型變數,BB1 是一個包含條件分支的基本塊。我們將在下一小節中詳細描述如何對它們進行編碼。

4.2 語義編碼矩陣

我們考慮了控制流和資料流資訊的三種編碼特徵:變數特徵、基本塊特徵和變數與基本塊之間的關係特徵。

變數特徵:對於每個變數,它的型別特性包含它的資料型別 V (t) (bool, byte, char, double, float, int, long, short, void,其他基本型別,JDK 類,使用者定義的型別),它的修飾符 V (m) (final, static, none)和其他資訊 V (o) (basic,陣列,指標,引用)。我們將其編碼為一個 19d 的二元特徵向量 V = {V (m),V (o),V (t)}。考慮圖 3a 中的變數 x。它是一個靜態的 int 變數,所以我們有 V ={0,0,1,1,0,0,0,0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}。

基本塊特徵:對於每個基本塊,我們考慮以下七種型別:普通、迴圈、迴圈體、if、if 體、開關、開關體。其他型別的基本塊(例如 try catch 基本塊)被視為普通的基本塊。同樣,我們將這種型別資訊編碼為一個 7d 的單熱特徵向量 B。例如,在圖 3b 中,BB1 是一個 if 基本塊,它的表示 B={0,0,0,1, 0,0,0}。

變數和基本塊之間的關係特徵:我們將資料流和控制流編碼為變數之間的操作和基本塊之間的控制跳轉。我們總共識別了 43 種不同的操作型別,並使用一個 43d 的單熱點特徵向量 I 來表示 it3。為了保持 DFG 中各變數之間的操作資訊,我們推匯出一個 81d 特徵向量 T={Vop1,Vop2,I},其中 Vop1 和 Vop2 分別表示運算元 op1 和 op2 的變數特徵向量。為了保持控制流,我們將 T 擴充套件為大小為 E=88 的{Vop1,Vop2, I, B}。

現在我們正式定義了三個規則來為變數和基本塊之間的每個關係編碼資訊:

T (op1, op2) = {Vop1,Vop2, I, Bbbop1}對兩個變數 op1 和 op2 之間的操作,以及兩個變數的型別資訊和對應的基本塊進行編碼。這裡 bbop1 表示 op1 所屬的基本塊。

T (op,bb) = {Vop,V0, I0, Bbb}編碼變數與其對應塊之間的關係。這裡 V0, I0 表示零特徵向量。

T (bb1,bb2) = {V0,V0, I0, Bbb2}對相鄰兩個基 b 之間的關係進行編碼。

例子:再次考慮圖 3 中的示例。它的 CFG 有 11 個變數(9 個本地變數和 2 個靜態欄位)和 6 個基本塊(包括輸入、返回、退出塊)。根據上面的編碼規則,我們可以推匯出如圖 4 所示的稀疏矩陣。與原始的 CFG 和 DFG 相比,我們的語義特徵矩陣表示有兩個優點。首先,它將尋找同構子圖的問題簡化為檢測矩陣中的相似模式。第二,這種結構(即單個矩陣)使其易於用於後續處理,如我們方法中的聚類或神經網路。

圖 4. 圖 2 中方法 m1 生成的語義特徵矩陣(17×17)。沿 z 軸為 88d 二值特徵向量。值 1 由藍點表示,0 由空表示

5、基於學習的程式碼相似性度量

從上一節描述的語義矩陣編碼中,我們可以看到,由兩種功能相似但語法不同的方法生成的語義矩陣可能並不相同。我們不能直接使用簡單的距離度量(如歐氏距離)來度量它們的相似性,因為我們不知道語義矩陣中的某些元素(如特徵向量 T)是否比其他元素更重要。此外,不同的元素可能在功能上是相似的(例如,兩個 int 和 long 變數之間的二進位制相加操作),但很難在語義特徵矩陣上直接檢測這種相似性。

為了解決這個問題,我們開發了一個可以有效識別語義矩陣之間相似模式的深度學習模型。特別地,我們訓練了一個專門設計的前饋神經網路,它從每個程式碼對的語義矩陣中生成高階特徵,並使用神經網路末端的分類層對它們進行功能相似或不相似的分類。這種設計不需要在學習的特徵上定義一個單獨的距離度量。更重要的是,該模型可以透過監督方式進行精細訓練,透過反向傳播分類層的標籤訊號從輸入中學習更好的表示。這有助於我們的模型有效地從語法非常不同的相似程式碼中學習模式。

5.1 特徵學習

我們模型的架構如圖 5 所示。作為靜態神經圖,該模型需要一個固定大小的輸入語義特徵矩陣。與遞迴神經網路類似,我們將所有輸入矩陣處理為一個固定大小的 k×k(在本工作中 k = 128)。對於較小的方法,我們用零值填充它們的特徵矩陣。對於較大的方法,我們截斷矩陣透過保持 CFG 所有資訊和丟棄的一部分脫硫資訊超過矩陣大小(原始特徵矩陣大小 n = nv + nb,截斷後,k = nv + nb = 128, nb = nb, nv = 128 nb)。

圖 5. 測量程式碼功能相似性的前饋模型的示意圖

處理程式碼語句的重新排序。我們將 A 的每一行平展為一個長度為 c·k 的向量。以平面化的行特徵向量作為輸入,加入兩個完全連通的層,以提取每一行所代表的變數或基本塊的所有資訊。最後加入池化層,對所有行特徵向量進行彙總。為了減輕程式碼語句重新排序的影響,我們使用平均池,而不是扁平化整個矩陣。為了使我們的模型在處理語句重新排序時更加穩健,我們忽略自變數或基本塊的順序,只保留變數或基本塊之間有依賴性的順序。然而,這將導致不同方法的平面向量長度不同,這是靜態神經網路模型難以處理的。相反,我們透過直接對所有行執行平均池,並將剩下的任務留給我們的深度學習模型來進行近似。

與 vanilla 多層自動編碼器類似,該模型可以透過最小化重構誤差進行無監督的訓練。訓練分為兩個階段。首先對每一層進行預訓練,使重構誤差最小化,然後透過使整體重構誤差最小化來訓練整個模型。透過這種方式,模型可以學習從輸入 a 到壓縮潛在表示的非線性對映。然而,透過這種方法訓練的模型可以區分兩個相似但不相同的輸入,例如,分別處理 int 和 float 陣列的兩種陣列搜尋方法。為了加強模型在不同樣本間學習相似模式,我們利用監督訓練,這是由二分類層實現的,將兩種方法的最終潛在表示連線作為輸入。我們在下一小節中更詳細地描述它。

5.2 功能相似發現

給出了兩種具有學習潛表示的方法,一種測量它們函式相似性的直接方法是在隱藏狀態空間中計算它們的距離。許多現有技術都應用了這個指標。然而,這種簡單的距離度量在兩個方面是不能滿足的。首先,使用者必須執行啟發式分析,為每個資料集找到合適的距離閾值。歐幾里得距離度量程式碼相似度在隱藏空間中可能不適用。例如,在異或問題中,如果我們使用歐氏距離,則輸入(0,0)會比(1,1)更接近(0,1)和(1,0),這是一個錯誤的分類。其次,確定性距離度量不能利用現有的訓練資料集對模型進行精細訓練。雖然利用訓練資料集獲得最優距離閾值是可行的,但在此過程中神經網路模型本身的引數並不會更新。

我們提出了一種替代的方法,將識別功能相似的程式碼的問題表述為二進位制分類。具體來說,如圖 5 所示,我們將方法 m1 和 m2 中的潛在表示向量 h13 和 h23 按不同順序連線起來:[h13,h23],[h23,h13]。然後我們在兩個連線的向量上應用一個完全連線的層,共享權 Wfc。在輸出狀態上執行另一個平均池化,最後新增分類層。我們現在可以使用交叉熵作為代價函式,並將其最小化以最佳化整個模型。透過這種方式,我們的模型能夠學習不同語法的程式碼對之間的相似性。

具有不同順序的兩個連線和平均池操作對於最佳化我們的模型的效率非常重要。注意,作為一個相似性度量任務,我們有一個對稱屬性:S(mi,mj) = S(mj,mi)。如果我們只使用一個連線[hi3,hj3]或[hj3,hi3],我們必須在我們的訓練資料集中同時新增(mi,mj)和(mj,mi),以滿足對稱特性,這將導致訓練和預測時間接近 2 倍。

圖 6. SdA 基線模型

基線模型。作為比較,我們還訓練一個 SdA 作為基線模型,如圖 6 所示。在基線中,我們試圖將每個矩陣壓平為一個大小為 k k E 的長輸入向量(即,如果 k = 128 和 E =88,則為 1,441,792)。然而,即使我們設定了較小的第一個隱含層(例如 100),也有超過 1.44 108 個引數,這使得訓練困難(與 SdA 不同,我們的模型對每一行進行學習,然後是行平均池,因此層大小是有限的)。因此,我們稍微改變特徵向量 T T = {Vop1 Vop2,我,B}, Vop = {V (m), V (o), V (T)},我們使用一個 8 位整數來表示每個元件,因此我們駕駛 T(8 號(這可以理解為一個手工製作的特徵向量,特徵向量的[26])。其他部分採用標準的 SdA 模型。

我們為 SdA 基線模型開發了兩種設定:SdA-base 和 SdA-unsup。SdA-base 還在其之上添加了分類層(圖 6 中合併了兩個模型),將兩個潛在表示向量的連線作為輸入(只有一個連線順序)。因此,精細訓練步驟也將最佳化模型的前饋編碼部分。SdA-unsup 使用一個包含一個隱藏層的單獨分類模型,如圖 6b 所示。它的工作原理是在隱藏空間中估計一個最佳的相似性度量。在這兩種情況下,我們在式 3 中應用相同的損失函式。這兩種設定的目的是比較我們的模型和 vanilla SdA,並瞭解我們的二元分類公式的有效性。

6、實驗以及評估

我們在兩個資料集上評估 DeepSim:Google Code Jam (GCJ) 和 BigCloneBench。在第一個實驗中,我們遵循最近的文獻,使用來自谷歌 Jam 競賽的程式作為我們的資料集。我們從 12 個競爭問題中收集了 1669 個專案,如表 1 所示。針對同一問題的每個專案都是由不同的程式設計師實現的,其正確性已經透過谷歌驗證。我們手動驗證了這 12 個問題是完全不同的。因此,專案同樣的問題應該是功能類似的(例如,標籤 1),和這些不同的問題應該是不同的(例如,標籤 0)。為了更好地理解這個基準測試,我們手動檢查 15 專案對於每個問題,發現很少有專案可分為語法相似。此外,我們發現超過 20%的專案包含至少一個明顯的語句重新排序。它們大多是由迴圈中使用的變數定義或函式引數的順序不同造成的。

表 1. Google Code Jam 資料集

對於 DeepSim 和 SdA 基線模型,我們使用 WALA 從每種方法的位元組碼生成 CFG/DFG,構造第三節所述的語義特徵矩陣。為了提高效率,我們以稀疏格式儲存所有的矩陣。我們使用 TensorFlow 來實現神經網路模型。對於 GCJ 資料集,我們在 Eclipse IDE 中開發了一個外掛,以自動將每個專案的原始碼檔案內聯到單個方法。對於 BigCloneBench,因為它不提供原始碼檔案的依賴庫,所以我們修改了 WALA 和 polyglotcompiler 框架,直接為這些原始碼檔案生成 CFG/DFG。對於任何外部類型別,我們都將其替換為惟一的型別 Java.lang.Object。在某些情況下,這將導致無法獲得所有欄位。然而,我們的工具能夠處理 BigCloneBench 中 95%以上的克隆對。

我們在兩個資料集上應用 10 倍交叉驗證來訓練和評估 DeepSim 和兩個基線模型。即將資料集劃分為 10 個子集,每次選取 1 個子集作為測試集,其餘 9 個子集作為訓練集。重複 10 次,每次選取的測試集都不相同。報告的結果是 10 次的平均值。

表 2. GCJ 資料集上的結果

表 2 報告了 DeepSim 在 GCJ 上的查全率和查準率與其他方法的比較。召回是指一種方法檢索到的相似方法對的比例。精度是指一種方法報告的結果中檢索到的真正相似的方法對的比例。總體而言,DeepSim 召回率為 81.6%,DECKARD 為 44.0%,RtvNN 為 90.2%,SdA-base 為 51.3%,SdA-unsup 為 55.6%,DeepSim 的準確率(71.3%)明顯高於 DECKARD(44.8%)和 RtvNN (19.8%), SdA-base 為 49.6%,SdA-unsup 為 25.6%。DeepSim 的召回率遠遠高於 DECKARD 和兩個基線模型。這表明 DeepSim 比其他方法更有效地從語義矩陣中學習更高層次的特徵,編碼後的語義矩陣也比 DECKARD 使用的語法表示更好。

DeepSim 的精度為 71.3%,仍有很大的改進空間。在檢查了 DeepSim 的誤報和誤報後,我們發現這主要是由於工具在處理方法呼叫方面的侷限性。例如,對於 Problem Senate evacuate,一些解決方案專案使用標準迴圈和賦值語句,而其他解決方案專案使用實用方法,如 Map 和 Replace。因為我們沒有將 callee 方法內部的資訊顯式編碼到語義特徵矩陣中,DeepSim 無法區分這些實用方法及其對應的語句。考慮到 DeepSim 在訓練後可以為每種方法生成最終的隱藏表示,將這些資訊用於對方法呼叫指令進行編碼是可行的(可能需要重新訓練)。此外,利用基於約束解決的方法對報告的結果進行後過濾也可以進一步提高精度。

表 3. GCJ 的時間效能

我們還評估了這些方法在整個資料集上的時間效能(總共 1.4M 方法對)。表 4 報告了結果。DECKARD 不需要訓練,所以它沒有訓練時間。SdA-unsup 將潛在表示學習和分類階段分離開來,因此在三種模型中,獲得穩定所需的訓練次數較少,訓練時間最少。DeepSim 的神經元數量比 SdA-base 少(SdA-base 在第一層有大量的神經元),但由於 DeepSim 的前三層應用於語義特徵矩陣的每一個元素或每一行,因此需要更多的計算。因此,DeepSim 的訓練時間最長。雖然 DeepSim 的訓練階段比其他方法慢,但這是一個一次性的離線過程。一旦模型得到訓練,就可以重用它來度量程式碼相似度。

表 4. BigCloneBench 結果

表 5. 每個克隆型別的 F1 得分

表 4-5 報告了 BigCloneBench 的測試結果。由於來自 BigCloneBench 的真/假克隆對來自不同的功能,我們執行另一個實驗,使用所有具有功能 id 4 的真/假克隆對作為訓練資料集(因為它包含整個資料集約 80%的真/假克隆對),而其餘資料作為測試資料集。結果如表 6 所示,與表 4-5 報告的結果一致。

表 7. DeepSim 使用單一功能資料訓練的結果

7、討論與總結

為什麼 DeepSim 優於其他 DNN 方法。原因有三。首先,DeepSim 基於編碼 DFG/CFG 的語義特徵矩陣,它比 RtvNN 和 CDLH 等其他 DNN 方法使用的詞法/語法表示(如原始碼標記或 AST)具有更高的抽象級別。與兩個 SdA 基線相比,DeepSim 將語義特徵矩陣作為輸入,而對於 SdA 基線,每個 88d 特徵向量 T 都被人工重新編碼為 8d,整個矩陣平展為一個向量。此外,整個矩陣的扁平化加劇了語句重新排序的影響,因為扁平化向量是嚴格有序的,這會導致報告更多的誤報。

其次,DeepSim 和兩個 SdA 基線都包含分類層,支援一個方法對的分類,而 RtvNN 只計算兩種方法的隱藏表示之間的距離。值得注意的是,DeepSim、SdA-base 和 SdA-unsup 的 F1 評分均高於 RtvNN,這在一定程度上要歸功於我們的二值分類制定的有效性和精細訓練階段。

第三,DeepSim 模型使用了兩個平均池層,這是 SdA-base 和 SdA-unsup 所不具備的。第一個函式沿著矩陣的所有行計算平均狀態,這減少了語句重新排序造成的副作用。第二種是從一個方法對中計算兩種不同的最終潛伏表示連線的平均狀態,這保證了程式碼相似性的對稱屬性。

編碼方法的有效性。在 DeepSim 的第一層,我們將每個大小為 88 的特徵向量 T 對映到隱藏空間中的 6d 向量。為了分析我們訓練的模型,我們構造了 8 個不同的特徵向量,每一個都是對變數之間的特定操作進行編碼。我們將其對映到嵌入空間中,透過 PCA 降維對其進行視覺化,如圖 7 所示。

圖 7. 第一層 DeepSim 生成的 8 個不同輸入特徵向量的隱表示

DeepSim,我們提出了一種新的方法,為測量程式碼功能相似,包括小說,語義表示編碼程式碼控制流和資料流資訊作為一個緊湊的矩陣,和一個新的款模型,從語義學習潛在的特徵矩陣和執行二進位制分類。我們利用兩個功能相似的大型資料集對 DeepSim 進行了評估,並將其與幾種最先進的方法進行了比較。結果表明,DeepSim 在查全率和查準率方面明顯優於現有方法,同時取得了很好的效率。

9
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 案例|你買年貨了嗎?利用資料分析看看別人買什麼