高級軟件工程之Code Search


一、重現基線模型


 

1.基線模型原理

       所謂的代碼搜索,就是根據輸入的自然語言去尋找與之匹配的代碼片段,並作為結果返回。但由於自然語言順序與代碼的語言格式之前存在差異,因此如果直接去尋找,那么必然會出現誤匹配。一種方法是將代碼片段與相應的自然語言描述嵌入到一個高維空間,那么代碼片段和與之匹配的自然語言描述就會有相似的向量。在統一的向量表示下,語義上與自然語言查詢相關的代碼片段可以根據它們的向量進行檢索。此外,還可以識別語義相關的詞,並處理查詢中不相關或者含噪的關鍵字。

  本文提出了一種叫CODEnn的深度神經網絡。它采用了Embedding的方法來將代碼片段與自然語言描述映射為高維向量。所謂Embedding,就是一種學習諸如單詞、句子和圖像等實體的矢量表示的技術,其方式是相似的實體具有彼此接近的向量。

  下圖展示了一個示例,展示了代碼和查詢聯合嵌入的思想。黃色點表示查詢向量,藍色點表示代碼向量。由於代碼和自然語言描述是兩種不同的東西,因此要采用了兩個不同的網絡來分別進行embedding,使得語義對應的代碼和描述在向量空間足夠接近,而語義不同的代碼和描述在向量空間則沒有那么近。

 

 

   此外我們采用的主要架構是RNN,即遞歸神經網絡。它是一類遞歸使用隱層的神經網絡,它會創建網絡的內部狀態,以記錄動態時態行為。 下圖顯示了RNN的基本結構。神經網絡包括三個層,一個輸入層,將每個輸入映射到一個向量;一個遞歸隱藏層,遞歸計算和更新;一個輸出層,讀取每個輸入后的隱藏狀態,以及將隱藏狀態用於特定任務。與傳統的前饋神經網絡不同,RNN可以嵌入順序輸入。

 

 

   整個CODEnn的網絡架構如下圖所示。它由代碼嵌入網絡(CoNN),描述嵌入網絡(DeNN)以及相似度模塊三部分組成。

   在代碼嵌入網絡中,又可分為方法名、API序列以及令牌(token)三部分組成。對於方法名和API序列,首先使得他們經過一個RNN序列,將文本序列轉化為一個高維向量作為嵌入,然后進行最大池化操作來降低分辨率、節約計算資源。對於令牌部分,考慮到其無序性,直接用多層感知機進行處理,然后依然是經過一個最大池化層。之后采用全連接層將方法名、API序列以及令牌三部分融合起來,得到一個代碼向量c。

   在描述嵌入網絡中,對輸入的描述同樣經過一個RNN網絡將其映射到高維向量空間,然后經過一個最大池化層得到描述向量d

         對於相似性度量模塊,我們采用余弦相似度來衡量代碼向量c與描述向量d之間的相似性,最后得到一個標量值來衡量對於輸入的自然語言描述找到的代碼片段的相似度。

 

 

        在訓練過程中,對於每個代碼向量c,都存在正描述d+以及負描述d-,我們據此構造損失函數L(θ),使得cd+盡可能相似,而cd-盡可能不同。損失函數L(θ)如下式所示:

 

 

        訓練好的模型其搜索過程如下圖所示。

   給定用戶的自由文本查詢,DeepCS通過經過訓練的CODEnn模型返回相關的代碼片段。它首先計算搜索中每個代碼段的代碼向量。然后,它選擇並返回具有最高k個最近向量的代碼片段到查詢向量。具體地說,在搜索開始之前,DeepCS使用已經離線訓練好的CODEnn模型,將代碼庫中的代碼片段映射到高維空間中。在在線搜索期間,當開發人員輸入自然語言查詢時,DeepCS首先使用CODEnn的經過訓練的Denn模塊將查詢嵌入到向量中。然后,使用余弦相似度估計查詢向量和所有代碼向量之間的余弦相似性。最后,將最類似於查詢向量的的K個代碼片段作為搜索結果返回。

 

 

 

2.模型的優缺點

優點:

1)異構數據源和自然語言查詢的統一表示是異構的。通過將源代碼和自然語言查詢聯合嵌入到同一個向量表示中 它們的相似性可以更精確地測量。

2)通過深度學習更好地理解查詢,與傳統技術不同,DeepCS通過深度學習學習查詢和源代碼表示。查詢的特征,如語義相關詞和語序,在我們的模型中都有有考慮。因此,它能夠更好地識別查詢和代碼的語義。

3)根據自然語言語義對代碼片段進行聚類,我們的方法的一個優點是,它將語義上相似的代碼片段嵌入到彼此相近的向量中。語義相似代碼片段按語義分組。因此,除了精確匹配的片段之外,DeepCS還推薦語義相關的片段。

缺點:

(1)它有時排序部分相關的結果高於精確匹配的結果。這是因為Deeps通過考慮它們的語義向量來排名結果。

 

3.模型重現結果

 我們將模型訓練了200個epochs,在第200個epochs處在測試集上對模型進行了測試。測試結果如下,其中k表示選擇的搜索結果數量:

k Success Rate MAP nDCG
1 0.28 0.28 0.28
5 0.55 0.39 0.42
10 0.68 0.40 0.46

 可以看出,隨k增大,模型各項性能都更好。

可視化

我們通過PCA將code embedding與text embedding投影到二維;下圖為所有測試數據的embedding的散點圖。

 

可以看出,code embedding與text embedding尺度上不完全一致,這進一步印證選擇cosine similarity衡量相似度是正確的。

我們繪制了測試集中部分代碼embedding與其描述的embedding在embedding space中的分布。下面兩幅圖表示code 0、desc 0、code 1、desc 1的embedding分別在原始embedding space中與L2歸一化后的embedding space中分布,其中desc 0為"manage pende entry",code 0為其對應代碼;desc 1為"Read mesh datum file",code 1為其對應代碼。

 

 

 

 

 

 

 

 

可以看出,語義上相關的代碼與文本embedding相似度高、無關的代碼或文本embedding相似度低,說明我們的模型是有效的。

 

 

二、提出改進方法


 

1.在我們的實驗中,返回結果的相關性是手動分級的,可能會受到主觀性偏倚的影響。為此,我們可以用更多的developers來對其進行分級以提高其准確率。

2.CODEnn方法是將代碼與自然語言描述嵌入到高維空間向量,他們是離散的。而code2vec能為離散代碼段在連續空間做Embedding,一次可以考慮加入code2vec方法來提高結果的精確度

3.質量高的(code, description)對較少,即可以用於將代碼embedding與文本embedding投影到同一個embedding space的數據較少;然而無監督的數據,無論是代碼還是文本有很多。我們可以用已有的大量無監督代碼訓練encoder,使之已經能表達一定的語義,然后在(code, description) 對數據上進行finetuning。

4.用語言模型對language encoder進行預訓練是NLP中的常用方法。網絡上,LSTM和更新的Transformer都有相應的預訓練模型發布;也可以自己用與代碼有關的文本語料(如爬取stackoverflow的文本)預訓練一個模型。

三、評價合作伙伴


 

這次我們組的另兩個同伴黃志鵬和吳雪晴都很厲害。我們合理的分工了任務,每個人都對論文閱讀、模型理解、代碼修改有所涉獵,同時都能提出對於模型修改的一些想法與建議,最后整個實驗完成的也非常好。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM