999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于深度學習的代碼分析研究綜述

2018-07-05 02:42:24張峰逸趙文耘復旦大學軟件學院上海201203上海市數據科學重點實驗室復旦大學上海201203
計算機應用與軟件 2018年6期
關鍵詞:語義深度方法

張峰逸 彭 鑫 陳 馳 趙文耘(復旦大學軟件學院 上海 201203)(上海市數據科學重點實驗室(復旦大學) 上海 201203)

0 引 言

計算機軟件是現代社會最具代表性的產物,它幾乎被應用在人類生活的方方面面,無數優秀的開發者參與貢獻了大量高水平的軟件代碼。然而由于代碼本身的抽象性、復雜性與可變性[1],大型軟件的開發始終是一個艱巨的任務。隨著軟件代碼規模的日益增長,開發者所面臨的壓力越來越大。如何通過分析代碼本身的規律來幫助開發者理解、編寫或維護代碼成為了現代軟件工程所關注的主要任務。

學界對于代碼分析的研究由來已久,早期的代碼分析研究以形式化的邏輯演繹方法為主[2-4]。隨著開源代碼的興起,大量高質量的開源項目提供了諸如源代碼、代碼注釋、故障報告以及測試用例等各方面的程序信息。這激發了研究者們的新的思路:通過代碼的統計學特性來獲得人類可以理解的知識。1984年,Don Knuth提出了“文字編程”的概念,他認為編程實際上是人類交流的結果[5]。受到該思想的啟發,Hindle等[6]提出了代碼的“自然性”假說,他們認為代碼具有和自然語言相似的性質,相似的功能的代碼實現往往會有不同程度的相似性,因此代碼是可以預測的。代碼“自然性”理論的提出像是打開了一扇大門,人們意識到運用統計規律來分析代碼信息是可行的。大量的機器學習算法被運用到代碼中來,代碼的性質從各個方面得到了挖掘,這極大地豐富了人類對于代碼的認識。但是,現有的機器學習算法在很大程度上依賴于特征工程,這是一項勞動密集型的工作,并且只針對于特定的任務有效[7]。近期的機器學習文獻指出,由人類所設計的特征很有可能無法很好地反應數據的真實情況,因為人類觀察的準度與廣度都是非常有限的[8]。因此如何選取合適的特征成為了應用機器學習算法的一大挑戰。

深度學習是機器學習中一種基于對數據進行表征學習的算法[9],其概念源于人工神經網絡的研究,通過組合低層特征形成更加抽象的高層特征表示,從而發現數據的分布特征。與傳統的機器學習方法相比,深度學習的最大特點是采用了非監督或者半監督式的特征學習與提取方法,因此觀察對象的特征并不需要人為地指定,而是通過大量的訓練數據學習歸納而來[10]。這種“黑盒”式的特征提取與歸納方法在分析代碼數據上有著巨大的優勢:避免了人類觀察可能的誤判,數據量越大,神經網絡模型對于代碼特征的挖掘就越接近數據原本的特征分布。這在無形中把代碼中人類難以理解的抽象性轉移給了海量的訓練數據。深度學習用海量的訓練數據來代替人對于代碼的觀察,使算法自己總結出代碼的性質與規律,其在諸如圖像識別、機器翻譯等領域中顯示了遠超傳統機器學習算法的性能,甚至在某些任務中表現出了超越人類的智能[11-12]。在軟件工程領域,深度學習同樣在諸如代碼生成和代碼理解等任務上展現了超越傳統工作的潛力。

1 研究概述

代碼分析指的是通過分析挖掘代碼本身性質,幫助開發者產生、維護并理解代碼的一類方法。隨著深度學習的快速發展,軟件工程領域也開始接納這一新興的技術,基于深度學習的代碼分析更是成為了當前研究的熱點。在近期的研究工作中,這種分析方法有很多的用途,其典型的應用場景包括根據已有的代碼信息來推斷下一步的代碼(代碼的推薦與生成)、將一種程序語言的語句“翻譯”成另一種程序語言(代碼遷移)或為代碼片段生成摘要信息(代碼摘要生成)等。這些工作的成功應用展示了將深度學習技術與代碼分析任務相結合的廣闊應用前景。

不管是用于什么用途,深度學習模型的訓練都具有相似的技術流程。如圖1所示,在代碼分析任務中,神經網絡有一個初始的網絡參數(多由0值或隨機值表示),在每次讀入輸入代碼之后,神經網絡根據任務目標計算損失函數,并設立閾值來判定是否用反向傳播算法(BP算法)進行參數更新。當損失函數的值小于特定閾值之后,整個網絡訓練完畢,開始執行特定的代碼分析任務。

圖1 基于深度學習代碼理解的一般技術流程

本文按照上述的技術流程對現有研究進行了總結。如表1所示,表中的每一行代表一個具有代表性的研究工作。第一列代表將代碼表征成向量形式的方法,包括one-hot編碼、詞袋編碼以及詞嵌入模型;第二列代表代碼表征的粒度,包括字符級別、詞條級別以及AST數節點級別;第三列表示不同研究工作所選用的神經網絡模型,共包括循環RNN、CNN以及Seq2seq模型三種;最后一列表示不同研究工作的實際應用場景,包括代碼推薦、代碼生成、代碼搜索、代碼遷移、代碼摘要以及故障定位六種。本文通過以上的三個標準對現有工作進行了分類與總結,歸納出了現有研究工作的優勢與局限,并提出了對該方法未來發展趨勢的若干建議。

表1 現有研究工作小結

2 代碼的表示

深度學習作為一種表征學習方法,需要接受向量形式的輸入。因此要討論深度學習對代碼的應用,首先應了解代碼是如何被編碼為向量形式的。目前比較流行的向量表示方法分為以下三種。

2.1 one-hot編碼

one-hot編碼又稱一位有效編碼,是數據表征中最簡單直接的方法。它的主要思路是采用N位的狀態寄存向量對N個狀態進行編碼,每個狀態都對應一個獨立的寄存位,并且在任意情況下都只有一位有效。one-hot編碼用最小的技術成本保證了編碼之間的相互正交,使得每一個被表示的單位都有一個唯一的向量表示。這種方法的弊端是編碼后的向量不表示任何具體含義,僅僅是一個獨立的狀態標記,而且隨著狀態維度的增大,其空間分布會變得極為稀疏,因此該方法比較適合低維編碼任務。在代碼分析任務中,這種編碼多被運用于字符級別的表征方法中,比如Alexandru等[13]在代碼生成任務中,將上下文中給的代碼和注釋等信息用字符序列來表示,就采用了one-hot編碼方式。Mou等[14]運用seq2seq語言模型實現了由自然語言到代碼片段的映射,在處理輸入自然語言數據時同樣適用了字符級別的one-hot編碼。

2.2 詞袋模型

詞袋模型是一種經典的統計學表征方法[15],它的特點是以每個詞為單位,不考慮詞與詞之間的相對順序,僅僅統計詞與詞之間的共現次數。這種思路有點像把詞不加區別對待地裝進一個袋子里,因此得名“詞袋”模型。

向量空間模型是信息檢索領域的經典模型,也是一個典型的“詞袋”模型。其核心思想是把對文本內容的處理簡化為向量空間中的向量運算,并且以空間上的相似度表達語義的相似度。向量空間模型在軟件工程領域有著廣泛的應用,并被證明了在許多任務上具有良好的效果。Zhou等[16]提出的BugLocator工具采用了改進版的向量空間模型rVSM。它計算bug報告文件與源代碼文件在空間上的相似度以定位可能存在bug的源文件,并考慮到了代碼文件的長度以及歷史上相似的bug對預測的影響,取得了很好的效果。Nguyen等[17]在其設計的人工深度神經網絡(DNN)中也采用了rVSM方法來處理輸入的代碼元素。該工作在代碼分類任務上取得了超越傳統方法的準確性。

在統計學中也有一些經典方法是基于詞袋模型思想的,在代碼表征方面應用最廣的要數隱語義索引LSI(Latent Semantic Indexing)模型以及LDA(Latent Dirichlet Allocation)文檔主題生成模型。這兩種方法都旨在通過統計共現的方法捕捉隱含在文本的潛在信息并將之表示為向量,即所謂的隱語義向量,一些經典工作通過這兩種方法為代碼尋找合適的語義向量表示[18-19]。

2.3 分布式假說與詞嵌入

詞嵌入技術是一種新興的向量表征方法,它起源于一個關鍵的設想——分布式假說。分布式假說是由Harris于1954年提出的[20],他認為在自然語言中,如果兩個詞的上下文很相近,即使這兩個詞本身并不相似,它們也很可能代表了相同的語義信息,即自然語言單詞的語義是由其上下文決定的。這種假說解決了向量空間模型不能歸納近義詞的弊端,并且考慮到了文本分布的順序信息,因而在近期的研究中被廣泛推廣。詞嵌入技術也被稱為分布式語義模型。在這種分布式模型中,單個的單詞不再被處理為獨立的標識符,而是用一個d維的上下文語義向量來表示。這樣具有相似上下文的單詞就會具有相近的向量表示。Mikolov等[21]提出的word2vec模型是目前最有影響力的詞嵌入模型。它用過神經網絡來直接預測每個單詞的分布式向量表示,因而也被稱為可預測的分布式模型。word2vec在自然語言的眾多任務中都展示了超過傳統分布式向量模型的性能。

word2vec同樣是在代碼分析中應用最廣泛的詞嵌入模型。Ye等[22]從API文檔以及API教程網站上抽取了代碼片段和自然語言描述,通過word2vec模型在一個公共的低維向量空間中訓練出各自的向量表示,用空間的相對距離來代表文檔之間的相似度,很好地解決了軟件搜索以及故障定位任務中代碼與自然語言之間的語義鴻溝問題。Nguyen等[23]通過word2vec模型分別對Java和C#代碼中的API調用進行訓練,并把兩者的詞向量表示映射到二維空間中,揭示了在不同的語言中,具有相似功能的API往往具有相似的二維空間分布,從而可以解決諸如代碼遷移一類的語義映射問題。Chen等[24]則通過該模型來處理近義詞問題。他們從stack overflow等編程問答社區中抽取了大量的代碼語料,通過詞向量的空間分布來判定近義詞,其性能超過了傳統的基于語法的同義詞判定方法。除了word2vec模型,研究者也設計出了一些特定于代碼結構的詞嵌入方法。Peng等[25]提出適用于自然語言的詞嵌入模型并不一定適用于分析代碼,因為代碼語義相比于自然語言具有更強的結構依賴性。他們通過抽象語法樹獲得代碼的結構信息,并參考了自然語言處理中的“平滑性”概念[15],提出了適用于代碼結構的“編碼標準”,使相似的代碼標識符具有相似的向量表示。Nguyen等[26]則通過加權和的模式將word2vec模型與傳統向量空間模型結合起來,并證明這種結合后的方法在代碼樣例搜索任務中具有更好的表現。

2.4 代碼表征的粒度

除了合適的向量表示方法,選取合適的分析粒度也是非常有必要的。在軟件工程領域中,代碼表征的粒度一般可以分為以下幾個級別。

2.4.1 字符級別

程序代碼中的字符由英文字母、數字和運算符號構成,是軟件分析中最細粒度的表征級別。該表征方法把源代碼中的每一個單個的字符當成獨立的符號并進行編碼。由于字符的種類相當有限且不包含語義信息,一般采用獨熱編碼方法對其進行編碼。這種方法的優點在于表示起來相當方便,不會出現向量維度爆炸的問題,但是由于單個字符并不包含任何語義信息,程序的語義僅僅能夠通過字符的排列順序來表達,而這樣通常是遠遠不夠的。比如在C語言中,string是一個數據類型名,而strings是一個方法名,他們擁有不同的程序語義,但是其字符序列卻非常接近。在代碼分析中,字符粒度的分析常常與one-hot編碼一起使用[13-14]。

2.4.2 詞條級別

代碼中的詞條類似于自然語言中的單詞,由于它們都是由空格符來區分的,因此往往是最為直觀的表示方法。詞條級別的表征方法為每一個詞條賦予一個詞向量,詞向量的表示方法多使用詞嵌入或者向量空間模型。詞條是代碼中最小的語義單元,對詞條建模得到的向量表示蘊含了高層的語義關系,因而可以較好的處理同近義詞等問題。由于程序設計中的命名規則是非常自由的,比如變量名string、string1、string123、s、str可能是不同用戶對于同一個變量的命名,因此對詞條的建模很難控制詞表的大小。針對這個問題研究者也提出了一系列處理同近義詞的方法,在一定程度上提高了詞條建模的實用性。詞條級別是代碼分析中最為常見的分析粒度,這可能與詞條代表了代碼最基本的語義單位有關。

2.4.3 AST樹節點級別

這類表征方法通過代碼的抽象語法樹獲得代碼的結構信息,并以語法樹的節點為單位進行編碼。與前幾種方法相比,這種方法考慮到了代碼的結構信息,因此其向量表示能夠更好地反映程序的實際語義。并且由于抽象語法樹在構建階段對代碼元素進行了大量的抽象處理,詞表的大小也得到了很好的控制。但是這種表示方法也有其局限性:這種向量表示需要被輸入到樹結構的神經網絡中。這就造成了神經網絡訓練中的批處理問題:由于語法樹的大小是不定的,所以在訓練過程中無法使用批處理技術對其進行加速,這會為訓練過程帶來巨大的計算復雜度。目前對這種粒度的實踐有Mou[7]以及Gu等的工作[27]。

3 深度學習模型

深度學習在近幾年獲得了長足的發展,幾乎社會的各行各業都在嘗試使用神經網絡模型來解決領域內任務,各式新穎、富有創造性的網絡結構不斷涌現。然而截止到目前,神經網絡模型最成功、最成熟的應用還是在圖像識別與自然語言處理的任務上。這兩大研究領域分別對應了目前最為經典、成熟的兩個神經網絡模型——卷積神經網絡(CNN)與循環神經網絡(RNN)。目前軟件工程領域對于深度學習的實踐也是主要基于這兩大經典模型來展開的。

3.1 卷積神經網絡

卷積神經網絡是一種前饋神經網絡,但是采用卷積層來代替傳統的全連接層。卷積層極大地減小了網絡中權重矩陣的密度,提高了神經網絡的計算效率。不僅如此,卷積層還具有提取數據特征的功能,比如在圖像處理中,圖像被表示為二維的矩陣,卷積層可以從二維矩陣中抽取出特征映射。一般來說,最底層的特征對應圖像的邊、角部分的特性。隨著不斷地卷積映射,這部分底層的特征被映射成人類可以理解的高層特征,比如識別出圖像中的物體的顏色、大小等。卷積神經網絡有三個結構上的特性:局部連接、權重共享、以及空間或時間上的次采樣。這些特性使得卷積神經網絡有一定程度上的平移,縮放和扭曲不變性[28]。

軟件工程對CNN網絡的應用在很大程度上借鑒了圖像處理領域的看圖說話:代碼片段被看成是一幅圖畫,每個代碼元素則對應畫面中的一個物體。這樣CNN就可以像捕捉圖片中的邊角信息一樣捕捉源代碼中的底層特征,再通過不斷地卷積映射得到人類可以理解的高層語義特征。在代碼分析任務中,由于CNN網絡強大的抽取高層語義的能力,它常常被用在代碼的摘要、標注,自動化注釋生成等任務上。Mou等[29]提出代碼相比于自然語言具有嚴格的結構限制,因而從代碼的AST樹來代表這種結構信息,并設計了一套“編碼標準”來計算代碼向量表示。最后通過CNN網絡捕捉源代碼中的高層語義,實現了代碼分類與搜索的功能。Nguyen等[17]則設計了一種4層的人工神經網絡,將輸入的源代碼逐層進行抽象與特征映射,最終得到了人類可以理解的項目級代碼描述。

3.2 循環神經網絡

由于前饋神經網絡的輸入和輸出維度都是固定的,所以不能有效地處理可變長的序列化數據,循環神經網絡就是為了解決這個問題而誕生的。在前饋神經網絡中,連接只存在于層與層之間,層內的節點是無連接的,而循環神經網絡則通過帶自反饋的神經元,將同層的節點通過時序連接起來,不定長的序列信息長度被表示為時序序列的長度,因此能夠處理任意長度的序列[30]。循環神經網絡被廣泛的應用在語音識別、機器翻譯以及自然語言生成等任務上。

在循環神經網絡的應用過程中,人們發現在處理具有長距離數據依賴的序列信息時,由于神經網絡的反向傳播特性,損失函數關于權重矩陣的梯度往往會爆炸性的增長或消失。這給神經網絡的訓練帶來了很大的困難,這個問題被人們稱為“長時依賴問題”。長時記憶神經網絡(LSTM)[31]是循環神經網絡的一個重要變體,它可以簡單有效地解決長時依賴問題。LSTM的關鍵是引入了一組記憶單元,允許神經網絡可以學習得出哪些歷史信息應該被記住,什么時候應該用新的數據更新記憶單元。這種有選擇的計算方法顯著地減輕了計算長距離依賴信息的計算負擔,有效地了解決長時依賴問題。

由于代碼具有與自然語言相似的性質與結構,對RNN網絡的應用在軟件工程研究中更加的普遍,也出現了很多特定于分析代碼性質的網絡結構。White等[32]通過對比試驗證明了RNN模型在代碼推薦任務中有著遠遠超過傳統n-gram方法的性能。Dam等[33]提出了DeepSoft模型,通過運用代碼的自然性,本地性等特性構建了一個基于LSTM神經網絡的語言模型,從而實現了較好的代碼生成效果。Alexandru[13]同樣運用了LSTM結構來實現代碼生成任務,不過他除了考慮前文代碼之外,還考慮了代碼的注釋、標簽等自然語言信息,并采用了逐字生成的策略。

3.3 Seq2seq模型

該模型用于解決seq2seq問題。所謂的seq2seq問題指的是根據一個輸入序列i,來生成一個輸出序列o。該問題被廣泛的應用在諸如機器翻譯,文檔摘要和問答系統等場景中。seq2seq模型是一種編碼-解碼模型,所謂的編碼指的是通過一個編碼器將輸入序列轉化為一個固定長度的特征向量,而解碼指的是通過一個解碼器將這個特征向量再轉化成輸出序列。編碼-解碼模型最大的特點在于其高度的自由性:在實際應用中,編碼器和解碼器都不是固定的,使用者可以根據需求自由地選擇編碼和解碼模型。這種模型的局限性在于編碼和解碼之間唯一的聯系就是一個固定長度的特征向量。因此如何合理設計編碼與解碼算法,使得特征向量可以有效的傳遞輸入信息的特征,避免編解碼之間的信息丟失成為了應用這種網絡時需要首要考慮的問題。

許多代碼分析任務也是一種seq2seq的問題,比如說代碼遷移可以理解為從一種編程語言到另一種編程語言的翻譯;代碼摘要和注釋生成都可以理解為師編程語言到自然語言的映射等。Murali等[34]的研究工作是這種模型的典型應用,他們提出了代碼推薦工具Bayou。這種工具融合了貝葉斯模型與深度學習的優點,整個模型通過隱語義向量鏈接,通過反向傳播算法進行訓練。用戶可以輸入諸如前文代碼,需求描述或者包信息等作為輸入,這些信息通過基于貝葉斯的統計模型被轉化成隱語義向量,再通過RNN網絡實現代碼信息的推薦。Gu等[27]借鑒了機器翻譯的思路,使用Seq2seq模型在同一向量坐標系下共同訓練了自然語言與代碼的向量表示,實現了代碼遷移的功能。

4 代碼分析應用

代碼分析任務的核心問題是填補自然語言與程序代碼之間的語義鴻溝,因此在本質上可以看作是代碼和自然語言之間的映射問題。本文根據這種映射關系將代碼分析常見的應用場景歸納為以下三類。

4.1 自然語言到代碼

在這種映射關系下,比較常見的應用有代碼搜索和故障定位。代碼搜索,即用戶輸入自然語言的查詢,通過各種檢索算法在代碼庫中匹配到滿足查詢條件的代碼片段。而故障定位則是指用戶根據故障報告中對故障的自然語言描述,計算文本相似度找到相似的源碼文件,從而確定故障最可能出現的地方。

4.1.1 代碼搜索

軟件工程領域解決代碼搜索問題的經典方法主要來源于信息檢索技術,通過建立源碼與查詢之間的索引來實現搜索功能。然而正如前文所述的那樣,這種簡單的關鍵詞匹配方法并不能很好地解決代碼和自然語言之間的語義鴻溝問題,因此始終不能很好地支持實際編程的需要。為了解決這個問題,Gu等[35]提出了DeepAPI方法,這種方法把代碼檢索看成是一個機器翻譯問題,采用深度語言模型把自然語言的查詢翻譯成對應的API序列。與傳統的想法相比,該模型具有兩大優點:一是通過詞嵌入技術學習了詞語的語義信息,實現了基于語義的代碼搜索;二是用seq2seq(序列到序列)的形式替代傳統方法所采用的詞袋模型,因而可以考慮到查詢的順序。

4.1.2 故障定位

現代大型軟件庫采用多分支的開發模式,并且面臨這頻繁的版本更迭,會不可避免地收到大量的故障報告。如何根據這些故障報告定位到故障實際發生的源碼文件,從而方便開發人員進行針對性的勘誤是一個非常具有挑戰性的工作。Zhou等[16]提出了一種改進的向量空間模型rVSM,這種模型考慮到了歷史上的故障修改信息,計算故障報告與源文件之間的文本相似度,從而判定最可能出現bug的源碼文件。在上一篇的基礎上,Lam等[36]提出了HyLoc模型。該模型將rVSM模型與深度學習結合起來,一方面借助向量空間模型來計算故障報告與源碼文件之間的文本相似度,另一方面用人工神經網絡來學習得到兩者之間的相關性,最終的相似度又文本相似度與相關性的加權和表示。該模型在開源代碼庫上運行的性能超過了傳統基于信息檢索模型的方法,證明了深度學習可以強有力的處理故障定位問題。

4.2 代碼到代碼

滿足這種映射關系的應用主要是代碼推薦與代碼生成。代碼的推薦與生成像是一對孿生的概念,目前學界中彼此之間并沒有明顯的界限可以劃分。為了保證敘述的清晰,我們在這里定義,代碼推薦所推薦的是部分的代碼元素,比如用‘.’符號推薦某個對象最可能會調用的方法,或者根據一段需求描述生成代碼模板;而代碼生成特指生成可以直接運行的源代碼的方法,比如根據前10行代碼生成接下來的5行代碼。代碼遷移指的將某種語言的代碼遷移到另一種語言中,由于不同語言有著不同的API使用方法,代碼遷移一直是一個極具挑戰性的任務。

4.2.1 代碼推薦與生成

在過去的十年內,軟件工程研究者普遍的做法是通過形式化公理或者統計學知識來完成代碼補全任務,無論是在任務完成的準確率或是泛化能力上都只是差強人意,而深度學習在自然語言處理領域的出色表現給了解決代碼補全問題的新的希望。Alexandru等[13]認為在處理代碼生成任務時,應該被考慮到的上下文不止是開發者已經編寫的代碼,還包括注釋和需求描述信息等。基于這種思想,他們從代碼的抽象語法樹中抽取豐富的上下文信息,并設計了雙向RNN網絡來進行訓練。實驗數據說明這種考慮復合上下文信息的方法在代碼生成任務上比以往的方法有著更加優越的性能。White等[32]認為提高軟件工程任務的關鍵在于提高代碼表示過程中的表征能力,而深度學習恰恰擅長賦予代碼表征以豐富的語義信息。因此他們結合了RNN網絡與統計語言模型,并用來處理代碼推薦問題。與之相似的, Raychev等[37]也認為深度學習模型可以和統計語言模型結合起來,這種結合被描述為一種RNN網絡和傳統n-gram算法所預測結果的加權和。

4.2.2 代碼遷移

在代碼遷移方面, Nguyen等[23]借助了詞嵌入技術,用空間分布的相似性來衡量API之間的相似度。Gu等[27]通過模仿機器翻譯的方式,通過將一種編程語言“翻譯”成另一種語言,在代碼遷移任務重取得了很好的效果。

4.3 代碼到自然語言

滿足這種映射關系的應用主要屬于代碼摘要的范疇。這一類的任務可以歸結為給代碼生成簡短的自然語言描述,而代碼分類知識在這種描述的基礎上增加了分類的工作。這一類工作的本質是從代碼到自然語言的映射。如上文所述,在實現代碼與自然語言之間的映射時,常常會面臨“語義鴻溝”問題,因此這類工作一般會先采用詞嵌入的方法來填補“語義鴻溝”,然后再借助深度學習模型進行得到相應的自然語言描述。Nguyen等[17]通過經驗研究來驗證人工神經網絡是否有完成代碼摘要任務的能力。他們設計了一個四層的神經網絡,每一層分別代表了從源碼級別到自然語言摘要級別的特征表述。該研究向人們證明了人工神經網絡有能力從底層源碼中捕捉高層概念,使用深度學習技術來實現代碼摘要任務是切實可行的。Jiang等[38]則運用了深度機器翻譯(NMT)的技術來自動生成commit信息。作者從github的項目中抽取diff信息以及相應的commit信息作為訓練集,通過NMT模型進行有監督地訓練,最終實現了對commit信息的預測。

5 分析與討論

深度學習技術在代碼領域的應用總體上還處在初步發展的階段:研究者們在各個任務上嘗試了深度學習技術,其中的一些工具取得了超越傳統方法的性能;一些經驗研究論證了RNN、CNN等網絡結構在代碼領域的可行性,并證明了深度學習技術具有填補代碼與自然語言間語義鴻溝的能力[16]。與此同時,也有一些研究者認為與傳統統計學方法相比,深度學習對訓練數據的需求成量級地增加,其性能卻沒產生明顯的優勢[39-40]。由于深度學習缺乏像人類智能那樣“舉一反三”的能力,只適合處理單一的任務目標,因此在實際應用中如何將現實生活中的需求抽象成適用于深度學習的任務也是一大難題。因此這些研究者對于深度學習在軟件領域的應用持保留態度。通過對目前學界研究的總結,我們將代碼領域的深度學習的優點與現有問題歸納如下。

5.1 優越性

5.1.1 表征能力

詞嵌入技術和分布式假說賦予了深度學習工具強大的表征能力,代碼的高層語義和結構信息以向量形式被編碼進入神經網絡中,這種強表征能力帶給了深度學習至少在三個方面的優越性。首先,這種表征能力有利于填補代碼與自然語言間的語義鴻溝,這使得深度學習尤其適合于代碼分析任務。其次,表征能力使得深度學習可以以一種無監督的“黑盒”模式進行特征提取,從而省去了繁瑣的人工特征工程,排除了人為觀察帶來的誤差[10]。最后,強大的表征能力使得深度學習不像傳統統計學方法那樣受限于“詞表越界”問題(OOV),很多研究工作都記錄了深度學習生成或合成了訓練集中不存在的模式[11,14]。

5.1.2 訓練性能

深度學習在圖像識別和自然語言處理中的蓬勃發展向我們展示了其巨大的應用潛力:在大量優質訓練數據的前提下,深度學習在某些任務中可以達到甚至超過人類智能的表現。因此我們也有理由相信這種技術在代碼領域的潛力,更何況在已有的研究中,深度學習已經在一些特定任務或數據集上取得了超越傳統方法的性能。隨著軟件工程的發展,人們越來越重視代碼數據的收集與表征,一些新穎的代碼特定的神經網絡機構也被提出,我們有理由期待深度學習方法在未來代碼分析任務中的表現。

5.2 問題與討論

雖然深度學習具有巨大的優越性與應用潛力,在目前的代碼分析研究中,該技術仍然一些方面具有相當的局限性。下面列舉了深度學習技術現存的一些問題,并嘗試對未來的解決方案進行了討論。

5.2.1 抽象的任務描述

深度學習需要人工定義損失函數來描述任務執行的邊界和目標,并指導隱層參數的更新。這就要求所執行任務是相對單一,可用數學語言描述的。然而正如前文所分析的,代碼具有高度的抽象性和復雜性,其大部分性質是很難用簡明的數學語言來定義的。比如在代碼摘要任務中,我們很難用數學公式來定義摘要好壞的判斷標準。一個合理、具有廣泛適用性的代碼體系衡量標準成為了應用深度學習技術的迫切需求。

Scalabrino等[41]通過一個經驗研究指出,軟件工程中現有的評判標準,無論是代碼的可讀性還是復雜度,都無法勝任衡量人對于代碼信息的理解程度。一些研究工作借鑒了機器翻譯的評判標準,采用諸如BLEU和Perplexity等體系[42]來進行判斷,但是也有研究指出這些評判標準只是對人理解文本方式的模擬,并不能真正的衡量人實際的理解程度。由于神經網絡需要一個評判標準來設計損失函數,因此評判標準的合理與否直接決定了模型訓練的性能,如何設計有效的代碼分析評價體系成為了代碼理解的關鍵問題。

5.2.2 標注數據集的匱乏

標注數據集是解決有監督學習問題的根本。在圖像識別和自然語言領域,正是有了大量高質量的人工標注數據集,才迎來了深度學習應用的井噴式發展[11]。由于理解代碼并進行標注需要大量的專業知識,因此代碼標注的成本和難度遠遠高于圖片和自然語言。如何得到高質量的標注數據集成為了深度學習應用發展的一大難題。

要更好地實現代碼分析任務,研究者應致力于建設一個服務于該任務的基準數據集。這個數據集需要有關于具體任務的標注信息,比如人工地標注出某個類的摘要信息。這樣的數據集可以是研究者不必再煩惱如何為任務提供先驗知識,更加專注于算法設計,并且為不同的方法提供了通用的測試平臺。關于特定任務的競賽也可以在基準數據集上展開,充分動用大眾的力量來解決現有問題。

除了采用人工標注的數據集之外,嘗試使用新的算法也是可行的思路。人工智能領域近期的一些研究指出,通過采用無監督、半監督和增強學習等方法[43],可以大大地減少深度學習算法對于標注數據的依賴。在代碼標注“寸土寸金”的軟件工程領域,嘗試使用這些新的深度學習訓練思路不失為一條可行之道。

5.2.3 缺少領域知識的理解

要理解一段代碼,除了代碼本身的性質之外,學習這段代碼所實現的業務邏輯也是必不可少的。現有的代碼理解方法大多從代碼本身的性質入手,通過分析API或詞條的分布或者注釋等自然語言信息來實現對代碼的理解,因而很難獲得源代碼背后所蘊含的業務邏輯。要真正實現深度的代碼理解,了解必要的業務邏輯是必不可少的。

與深度學習不同,知識圖譜是一種自底向上、從細節到整體的人工智能方法,它通過一階謂詞邏輯來表述現實世界的知識,通過“實體”的鏈接來把不同領域的知識鏈接到一起[44]。正如上文所述的,深度學習的一大缺陷是難以考慮到代碼背后的業務邏輯關系,而這種顯示存在的知識恰恰是知識圖譜技術最善于描述的。因此將深度學習技術與知識圖譜技術的優點相結合可能是一個很好的代碼分析的思路。

6 結 語

通過對現有工作的總結,可以看到深度學習已經在代碼生成及理解領域取得了可喜的進步,展示了極具競爭力的性能與廣闊的發展前景。與此同時,現有的工作也表現出了一定的局限性,比如可標注數據集的缺乏以及對抽象任務的處理等。

在未來的代碼分析研究中,深度學習將會扮演越來越重要的角色。軟件工程領域的深度學習技術將會朝著標準化的方向發展,比如建立基準數據集以及設計出若干標準化的代碼評判體系。與此同時,無監督學習、增強學習以及知識圖譜等新興人工智能技術將會得到廣泛的實踐,這些技術將會與現有深度學習技術進行有效互補。在可預見的未來,代碼分析與理解一定會取得更加令人振奮的進展。

[1] Brooks Jr F P. No Silver Bullet Essence and Accidents of Software Engineering[J]. Computer, 1987, 20(4):10- 19.

[2] Bessey Al, Block Ken, Chelf Ben, et al. A few billion lines of code later: using static analysis to find bugs in the real world[J]. Communications of the Acm, 2010, 53(2):66- 75.

[3] Clarke E, Kroening D, Yorav K. Behavioral Consistency of C and Verilog Programs Using Bounded Model Checking[C]//Design Automation Conference. ACM, 2003:368- 371.

[4] Cousot P, Cousot R, Feret J, et al. The ASTREé Analyzer[J]. Lecture Notes in Computer Science, 2005, 3444:140- 140.

[5] Knuth D E. Literate Programming[J]. Computer Journal, 1984, 27(2):97- 111.

[6] Hindle A, Barr E T, Su Z, et al. On the naturalness of software[C]// International Conference on Software Engineering. IEEE, 2012:837- 847.

[7] Mou L, Li G, Zhang L, et al. Convolutional neural networks over tree structures for programming language processing[C]// Thirtieth AAAI Conference on Artificial Intelligence. AAAI Press, 2016:1287- 1293.

[8] Scott S, Matwin S. Feature Engineering for Text Classification[C]// Proceedings of the Sixteenth International Conference on Machine Learning,ICML’99. 1999:379- 388.

[9] Shwartz-Ziv R, Tishby N. Opening the Black Box of Deep Neural Networks via Information[DB]. eprint arXiv:1703.00810, 2017.

[10] Tishby N, Zaslavsky N. Deep learning and the information bottleneck principle[C]// Information Theory Workshop. IEEE, 2015:1- 5.

[11] Krizhevsky A, Sutskever I, Hinton G E. ImageNet classification with deep convolutional neural networks[C]// International Conference on Neural Information Processing Systems. Curran Associates Inc. 2012:1097- 1105.

[12] Wu Y, Schuster M, Chen Z, et al. Google’s Neural Machine Translation System: Bridging the Gap between Human and Machine Translation[DB]. arXiv:1609.08144,2016.

[13] Alexandru C V. Guided code synthesis using deep neural networks[C]// ACM Sigsoft International Symposium on Foundations of Software Engineering. ACM, 2016:1068- 1070.

[14] Mou L, Men R, Li G, et al. On End-to-End Program Generation from User Intention by Deep Neural Networks[DB]. arXiv:1510.07211, 2015.

[15] Zhang Y, Jin R, Zhou Z H. Understanding bag-of-words model: a statistical framework[J]. International Journal of Machine Learning & Cybernetics, 2010, 1(1- 4):43- 52.

[16] Zhou J, Zhang H, Lo D. Where should the bugs be fixed? More accurate information retrieval-based bug localization based on bug reports[C]// International Conference on Software Engineering. IEEE, 2012:14- 24.

[17] Nguyen A T, Nguyen T N. Automatic Categorization with Deep Neural Network for Open-Source Java Projects[C]// International Conference on Software Engineering Companion. IEEE Press, 2017:164- 166.

[18] Panichella A, Dit B, Oliveto R, et al. How to effectively use topic models for software engineering tasks? An approach based on Genetic Algorithms[C]// International Conference on Software Engineering. IEEE Computer Society, 2013:522- 531.

[19] Poshyvanyk D, Marcus A, Rajlich V, et al. Combining Probabilistic Ranking and Latent Semantic Indexing for Feature Identification[C]// IEEE International Conference on Program Comprehension. IEEE, 2006:137- 148.

[20] Harris Z S. Distributional Structure[M]// Papers on Syntax. Springer Netherlands, 1981:146- 162.

[21] Mikolov T, Sutskever I, Chen K, et al. Distributed representations of words and phrases and their compositionality[C]// International Conference on Neural Information Processing Systems. Curran Associates Inc. 2013:3111- 3119.

[22] Ye X, Shen H, Ma X, et al. From word embeddings to document similarities for improved information retrieval in software engineering[C]// Ieee/acm, International Conference on Software Engineering. IEEE, 2016:404- 415.

[23] Nguyen T D, Nguyen A T, Phan H D, et al. Exploring API Embedding for API Usages and Applications[C]// International Conference on Software Engineering. IEEE Press, 2017:438- 449.

[24] Chen C, Xing Z, Wang X. Unsupervised Software-Specific Morphological Forms Inference from Informal Discussions[C]// Ieee/acm, International Conference on Software Engineering. IEEE, 2017:450- 461.

[25] Peng H, Mou L, Li G, et al. Building Program Vector Representations for Deep Learning[C]// International Conference on Knowledge Science, Engineering and Management. Springer, Cham, 2015:547- 553.

[26] Nguyen T V, Nguyen A T, Phan H D, et al. Combining Word2Vec with Revised Vector Space Model for Better Code Retrieval[C]// Ieee/acm, International Conference on Software Engineering Companion. IEEE, 2017:183- 185.

[27] Gu X, Zhang H, Zhang D, et al. DeepAM: Migrate APIs with Multi-modal Sequence to Sequence Learning[C]// Twenty-Sixth International Joint Conference on Artificial Intelligence. 2017:3675- 3681.

[28] Simard P Y, Haffner P, Lecun Y. Boxlets: a fast convolution algorithm for signal processing and neural networks[C]// Conference on Advances in Neural Information Processing Systems II. MIT Press, 1999:571- 577.

[29] Mou L, Li G, Jin Z, et al. TBCNN: A Tree-Based Convolutional Neural Network for Programming Language Processing[DB]. arXiv:1409.5718, 2014.

[30] Graves A. Supervised Sequence Labelling with Recurrent Neural Networks[M]. Springer Berlin Heidelberg, 2012.

[31] Sepp Hochreiter, Jürgen Schmidhuber. Long Short-Term Memory[J].Neural Computation,1997,9(8):1735- 1780.

[32] White M, Vendome C, Linares-Vasquez M, et al. Toward Deep Learning Software Repositories[C]// Mining Software Repositories. IEEE, 2015:334- 345.

[33] Dam H K, Tran T, Grundy J, et al. DeepSoft: a vision for a deep model of software[C]// ACM Sigsoft International Symposium on Foundations of Software Engineering. ACM, 2016:944- 947.

[34] Murali V, Qi L, Chaudhuri S, et al. Bayesian Sketch Learning for Program Synthesis[DB]. arXiv:1703.05698, 2017.

[35] Gu X, Zhang H, Zhang D, et al. Deep API learning[C]// ACM Sigsoft International Symposium on Foundations of Software Engineering. ACM, 2016:631- 642.

[36] An N L, Nguyen A T, Nguyen H A, et al. Combining Deep Learning with Information Retrieval to Localize Buggy Files for Bug Reports (N)[C]// Ieee/acm International Conference on Automated Software Engineering. IEEE, 2016:476- 481.

[37] Raychev V, Vechev M, Yahav E. Code completion with statistical language models[C]// Acm Sigplan Symposium on Programming Language Design & Implementation. ACM, 2014:419- 428.

[38] Jiang S, Armaly A, Mcmillan C. Automatically generating commit messages from diffs using neural machine translation[C]// Ieee/acm International Conference on Automated Software Engineering. ACM, 2017:135- 146.

[39] Fu W, Menzies T. Easy over hard: a case study on deep learning[C]// Joint Meeting on Foundations of Software Engineering. ACM, 2017:49- 60.

[40] Hellendoorn V J, Devanbu P. Are deep neural networks the best choice for modeling source code?[C]// Joint Meeting on Foundations of Software Engineering.ACM,2017:763- 773.

[41] Scalabrino S, Bavota G, Vendome C, et al. Automatically assessing code understandability: How far are we?[C]// Ieee/acm International Conference on Automated Software Engineering. IEEE Computer Society, 2017:417- 427.

[42] Papineni K, Roukos S, Ward T, et al. BLEU: a method for automatic evaluation of machine translation[C]// Meeting on Association for Computational Linguistics. Association for Computational Linguistics, 2002:311- 318.

[43] Li Y. Deep Reinforcement Learning: An Overview[DB]. arXiv:1701.07274, 2017.

[44] Wang Z, Zhang J, Feng J, et al. Knowledge Graph and Text Jointly Embedding[C]// Conference on Empirical Methods in Natural Language Processing. 2014:1591- 1601.

[45] Shu C, Zhang H. Neural Programming by Example[C]// AAAI Conference on Artificial Intelligence. 2017.

猜你喜歡
語義深度方法
深度理解一元一次方程
語言與語義
深度觀察
深度觀察
深度觀察
“上”與“下”語義的不對稱性及其認知闡釋
現代語文(2016年21期)2016-05-25 13:13:44
用對方法才能瘦
Coco薇(2016年2期)2016-03-22 02:42:52
四大方法 教你不再“坐以待病”!
Coco薇(2015年1期)2015-08-13 02:47:34
捕魚
認知范疇模糊與語義模糊
主站蜘蛛池模板: 久久午夜夜伦鲁鲁片无码免费| 日韩美毛片| 丝袜亚洲综合| 国内精品一区二区在线观看| 欧美a在线看| 成年网址网站在线观看| 久草网视频在线| 一级福利视频| 亚洲av日韩av制服丝袜| 婷婷久久综合九色综合88| 91国内在线观看| 免费毛片全部不收费的| 无码有码中文字幕| 小说区 亚洲 自拍 另类| 久久人人爽人人爽人人片aV东京热 | 国产男人的天堂| 国产成+人+综合+亚洲欧美| a级高清毛片| 亚洲男人天堂网址| 波多野结衣一区二区三区AV| 日韩在线视频网站| 精品成人免费自拍视频| 国产专区综合另类日韩一区| h视频在线播放| 久久无码免费束人妻| 欧美激情第一区| 欧美成a人片在线观看| 直接黄91麻豆网站| 国产国模一区二区三区四区| 少妇精品网站| 精品一区二区三区水蜜桃| 四虎影视国产精品| 2021天堂在线亚洲精品专区| 亚洲天堂久久新| 另类欧美日韩| 中文字幕亚洲精品2页| 六月婷婷精品视频在线观看| 亚洲另类国产欧美一区二区| 欧美日韩资源| 亚洲成av人无码综合在线观看| 免费在线国产一区二区三区精品| 色妞www精品视频一级下载| 欧美精品导航| 又粗又硬又大又爽免费视频播放| 91小视频版在线观看www| 久久久精品国产SM调教网站| 国产91精品久久| 日韩区欧美国产区在线观看| 狠狠亚洲婷婷综合色香| 国产精品一区在线麻豆| 曰韩人妻一区二区三区| 刘亦菲一区二区在线观看| 丁香婷婷激情网| 久久国产毛片| 中国一级特黄大片在线观看| 亚洲—日韩aV在线| 国产精品开放后亚洲| 日韩第一页在线| 五月婷婷精品| 国产毛片不卡| 日a本亚洲中文在线观看| 久久人搡人人玩人妻精品 | 欧美精品二区| 波多野结衣无码中文字幕在线观看一区二区 | 日韩毛片免费观看| 国产在线98福利播放视频免费| 国产国产人免费视频成18| 91亚洲免费| 亚洲an第二区国产精品| 秋霞午夜国产精品成人片| 亚洲一级色| 一级成人欧美一区在线观看| 欧洲日本亚洲中文字幕| 久久国产高潮流白浆免费观看| 深爱婷婷激情网| 亚洲精品片911| 久久午夜夜伦鲁鲁片不卡| 亚洲精品无码专区在线观看| 伊人久综合| 91美女视频在线| 欧美国产菊爆免费观看| 国产h视频免费观看|