亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        404 Not Found


        nginx
        404 Not Found

        404 Not Found


        nginx
        404 Not Found

        404 Not Found


        nginx
        404 Not Found

        404 Not Found


        nginx
        404 Not Found

        404 Not Found


        nginx
        404 Not Found

        404 Not Found


        nginx

        以CodeBERT為基礎(chǔ)的代碼分類研究

        2023-12-27 14:53:38成思強劉建勛彭珍連
        計算機工程與應(yīng)用 2023年24期
        關(guān)鍵詞:特征提取分類實驗

        成思強,劉建勛,彭珍連,曹 奔

        1.湖南科技大學(xué) 計算機科學(xué)與工程學(xué)院,湖南 湘潭 411201

        2.湖南科技大學(xué) 服務(wù)計算與軟件服務(wù)新技術(shù)湖南重點實驗室,湖南 湘潭 411201

        近些年來,隨著軟件工程的不斷發(fā)展,大部分軟件開發(fā)人員為了代碼的進一步完善或二次開發(fā),都愿意將源代碼分享于開源社區(qū)。因此,開源社區(qū)上源代碼數(shù)據(jù)逐步增長,進一步地促進了軟件工程的持續(xù)發(fā)展。據(jù)相關(guān)文獻研究,開源社區(qū)上已經(jīng)存有大量的源代碼片段,如Google 的代碼庫在2015 年時就已儲存超過20 億行代碼,而2017年時Windows代碼庫大約有350萬個代碼文件。然而,源代碼片段數(shù)量的激增也使得代碼庫的管理愈加困難[1],進而無法形成高效的大型代碼庫。如果不能對源代碼進行有效的管理,不僅加重開源社區(qū)的管理任務(wù),同時導(dǎo)致代碼庫體積臃腫、運行效率低、代碼質(zhì)量低等一系列問題。因此,如何快速地標(biāo)注出代碼所對應(yīng)的功能,減少程序員開發(fā)和維護所需的時間,對軟件工程的發(fā)展具有十分重要的意義。

        為了提高源代碼分類的效率,越來越多的研究人員將機器學(xué)習(xí)技術(shù)應(yīng)用于代碼任務(wù)的處理中,尤其是預(yù)訓(xùn)練模型的研究及應(yīng)用[2-10]。在歷史研究中,大型預(yù)訓(xùn)練模型,如BERT[2]、RoBERTa[3]、GPT[4]等,在多項NLP任務(wù)上的效果都取得了很大的提高。其中,BERT[2]的應(yīng)用最為廣泛,如QA問答系統(tǒng)[5]、信息檢索[6]、文本分類[7]、數(shù)據(jù)增強[8]、序列標(biāo)注[9]等研究。這些預(yù)訓(xùn)練模型通過自監(jiān)督學(xué)習(xí)的方式,從大量無標(biāo)簽文本中學(xué)習(xí)源代碼上下文中的特征信息。隨著預(yù)訓(xùn)練模型在NLP 領(lǐng)域中的應(yīng)用研究,研究者逐步將預(yù)訓(xùn)練模型引入到軟件工程研究中。Feng 等人[10]提出CodeBERT 預(yù)訓(xùn)練模型,首次將BERT預(yù)訓(xùn)練模型引入到源代碼處理中。同時使用Husain 等人[11]在2019 年提供的數(shù)據(jù)集進行預(yù)訓(xùn)練實驗。實驗結(jié)果表明,預(yù)訓(xùn)練模型在源代碼預(yù)處理研究中的有效性。然而,據(jù)相關(guān)文獻的研究和分析,目前沒有研究者將預(yù)訓(xùn)練模型引入到代碼分類任務(wù)中。

        Hindle 等人[12]已經(jīng)論證了程序語言和自然語言類似,例如,兩者都是由單詞構(gòu)成且都存在上下文語義邏輯關(guān)系。然而,源代碼具有其自身獨有的特性。一方面,源代碼相比自然語言更具有更強的邏輯結(jié)構(gòu)。另一方面,源代碼具有自定義的標(biāo)志符,例如程序語言中包含的標(biāo)點符號,這是自然語言所沒有的。在傳統(tǒng)的研究中,將源代碼當(dāng)作自然語言進行處理必然會造成特征信息的丟失,導(dǎo)致源代碼表征準(zhǔn)確率低。為了提高源代碼特征信息的表征準(zhǔn)確度,抽象語法樹(abstract syntax tree,AST)被應(yīng)用于源代碼的預(yù)處理研究。例如,Mou等人[13]將源代碼段轉(zhuǎn)換為AST,通過提取AST內(nèi)部節(jié)點之間的依賴關(guān)系,進而獲得源代碼的結(jié)構(gòu)信息,而不是簡單地根據(jù)代碼的標(biāo)志符序列進行語義信息提取,進而對源代碼進行分類研究。謝文凱等人[14]將機器學(xué)習(xí)中的樸素貝葉斯應(yīng)用于代碼分類研究,利用代碼片段的用途特征信息對Stack Overflow 網(wǎng)站中大量存在的代碼片段進行分類研究。然而,這些使用文本卷積神經(jīng)網(wǎng)絡(luò)、基于抽象語法樹的深度學(xué)習(xí)模型或傳統(tǒng)的機器學(xué)習(xí)模型仍然存在三點局限性。

        (1)使用文本卷積神經(jīng)網(wǎng)絡(luò)不能充分地提取源代碼中的語義信息。

        (2)將代碼轉(zhuǎn)換為抽象語法樹的形式破壞了代碼的整體性,導(dǎo)致特征提取時的準(zhǔn)確度不高。

        (3)使用樸素貝葉斯模型的代碼分類效果差,且規(guī)則的制定往往是面向特定任務(wù)的,可遷移性差。

        為了提高源代碼特征信息的表征準(zhǔn)確度,進而提高代碼分類的有效性,本文第一次將CodeBERT預(yù)訓(xùn)練模型應(yīng)用到代碼分類研究中。同時,為了驗證模型的分類效果,實驗分析對比了另外兩種BERT預(yù)訓(xùn)練模型。實驗表明,預(yù)訓(xùn)練模型的使用能有效地提升代碼分類任務(wù)的準(zhǔn)確性。但僅采用預(yù)訓(xùn)練模型來進行代碼分類任務(wù)時,實驗結(jié)果較差。因此,對源代碼需要結(jié)合預(yù)處理和微調(diào),在預(yù)訓(xùn)練出來了后仍需要通過微調(diào)來適應(yīng)代碼分類任務(wù)。本文基于CodeBERT預(yù)訓(xùn)練模型構(gòu)建了一個新的代碼分類模型。為了進一步研究各個預(yù)訓(xùn)練模型能給代碼分類帶來什么影響,本文使用了BERT[2]、RoBERTa[3]、CodeBERT[10]三種預(yù)訓(xùn)練模型在代碼分類任務(wù)上進行測試。

        本文的主要以下兩點貢獻:

        (1)首次將BERT預(yù)訓(xùn)練模型引入到代碼分類任務(wù)中,在代碼預(yù)處理上保留了代碼的整體性,模型對源代碼的特征提取相比于卷積神經(jīng)網(wǎng)絡(luò)要更充分,同時相比傳統(tǒng)模型可遷移性更好。

        (2)本文測試了對代碼去常用詞和標(biāo)點符號對代碼分類任務(wù)的影響,這是第一個進行此類實驗的研究。

        1 背景

        在本章中將介紹本文中使用的技術(shù)的基本知識,包括代碼分類、代碼表征和本文使用的預(yù)訓(xùn)練模型。

        1.1 代碼分類

        文本分類的目的是將文本分配到預(yù)定義的類別之中,這些分類工具逐步被研究者引入到軟件工程的研究中。由于不同模型的代碼處理的方式不同,因此可以按照代碼的功能(或者其他特征屬性)來對代碼庫進行分類管理。代碼的分類管理能使代碼庫中的代碼片段語義信息更加清晰、直觀,更能夠有效地提高軟件開發(fā)人員對于源代碼的利用效率,進而更好地對代碼庫進行維護和更新。例如,按功能類型對程序進行分類有利于管理大型項目,因為新產(chǎn)生的組件會自動標(biāo)記到合適的數(shù)據(jù)庫中。根據(jù)程序功能和編程語言對GitHub等網(wǎng)站上的源代碼進行分類管理,促進軟件代碼復(fù)用。文章討論了一些用C++語言編寫的源代碼進行分類的方法。其中,具有相同標(biāo)簽的程序代碼表明其具有相類似的功能。然后,在對源代碼進行代碼分類、代碼搜索[6,15]、代碼克隆[16-17]等任務(wù)前,都需要先對源代碼進行特征表征,再將特征信息表征結(jié)果送入相應(yīng)的模型中進行訓(xùn)練學(xué)習(xí)。代碼表征的準(zhǔn)確性直接影響后續(xù)任務(wù)的效果,本文在1.2節(jié)對代碼表征的研究進行討論。

        1.2 代碼表征

        由于模型不能直接處理源代碼,因此在模型學(xué)習(xí)之前需要對其進行特征信息的表征,表征成中間特征形式,例如向量。代碼表征是通過相應(yīng)的模型對源代碼的語義語法信息進行表征,得到源代碼特征向量,通過表征后的源代碼向量將送入相應(yīng)的模型進行特征學(xué)習(xí)。Hindle等人[12]已經(jīng)論證了程序語言和自然語言類似,兩者之間具備眾多可供分析的統(tǒng)計屬性,同時程序語言具有自然語言特定的特征和關(guān)鍵字[18],因此可以使用文本分類技術(shù)作為解決方案。然而,程序語言與自然語言又存在很大的語義鴻溝。例如,源代碼的可執(zhí)行性、形式和結(jié)構(gòu)上與自然語言截然不同,因此對程序語言進行分析處理的挑戰(zhàn)比自然語言更大。

        現(xiàn)有的代碼分析工作通常是從以下兩個角度對代碼進行分析[19]:(1)代碼的靜態(tài)分析;(2)代碼的動態(tài)分析。其中代碼的靜態(tài)分析指基于代碼的靜態(tài)屬性對代碼進行特征提取,如代碼的符號序列信息、API 調(diào)用序列信息、代碼對應(yīng)的抽象語法樹以及控制流圖中存在的結(jié)構(gòu)信息。而代碼的動態(tài)分析關(guān)注于代碼運行過程中產(chǎn)生的中間結(jié)果,基于中間結(jié)果對代碼任務(wù)進行分析。本文所研究的內(nèi)容是靜態(tài)情況下代碼信息的抽取與表征,因此本節(jié)內(nèi)容僅介紹代碼靜態(tài)分析。

        傳統(tǒng)的代碼表征方法簡單地使用自然語言處理領(lǐng)域中成熟的算法將代碼轉(zhuǎn)換為表征向量,并在其上應(yīng)用機器學(xué)習(xí)算法完成代碼分析。如使用TF-IDF算法將代碼轉(zhuǎn)換為與詞頻相關(guān)的代碼向量表征,此類方法僅僅使用簡單的詞頻統(tǒng)計信息,沒有將代碼中豐富的語義信息以及結(jié)構(gòu)信息融入到代碼向量中,因此所生成的代碼向量質(zhì)量較低?,F(xiàn)如今,由于計算機計算能力的提升,代碼分析領(lǐng)域已從傳統(tǒng)的人工制定特征提取方法轉(zhuǎn)向?qū)Υa使用深度學(xué)習(xí)技術(shù)進行特征提取[13,15,20]。與傳統(tǒng)的使用人工制定的特征提取方法不同,后者對代碼分析的效率要遠高于人工分析。首先,基于深度學(xué)習(xí)的代碼分析方法可以減少人工制定特征的時間,降低了對代碼分析的成本。其次,基于深度學(xué)習(xí)的代碼分析方法能夠發(fā)現(xiàn)更多人工難以發(fā)現(xiàn)的高維特征,也能夠從不同的視角獲取代碼之間聯(lián)系。而預(yù)訓(xùn)練的提出更是打破了使用RNN 等神經(jīng)網(wǎng)絡(luò)的局限性,預(yù)訓(xùn)練模型通過一個或者多個任務(wù)來預(yù)先學(xué)習(xí)相對泛化的知識,再通過微調(diào)階段利用學(xué)到具體的知識表示,來進行下游任務(wù),這樣在下游任務(wù)中,可以緩解數(shù)據(jù)饑餓的問題,提高了對小規(guī)模樣本的特征提取的效果。

        1.3 預(yù)訓(xùn)練模型

        預(yù)訓(xùn)練首先在計算機視覺領(lǐng)域ImageNet[21]上取得了突破性的進展[22],人們發(fā)現(xiàn)底層的網(wǎng)絡(luò)可以捕捉到邊角弧線等基礎(chǔ)特征,而高層網(wǎng)絡(luò)捕捉到的特征更為復(fù)雜,與下游任務(wù)更相關(guān)。所以底層網(wǎng)絡(luò)其實是可以在不同的任務(wù)間通用的,而高層網(wǎng)絡(luò)則可以根據(jù)任務(wù)進行調(diào)整,這種方法后來也被用到了NLP領(lǐng)域。本文選擇基于CodeBERT[10]預(yù)訓(xùn)練模型來進行代碼的分類工作。而CodeBERT 又由BERT[2]和RoBERTa[3]模型演變而來,本文將依次介紹其中的原理。

        1.3.1 BERT框架

        如今,隨著深度學(xué)習(xí)在自然語言中的應(yīng)用不斷擴大,各種神經(jīng)網(wǎng)絡(luò)模型被提出。其中,BERT[2](bidirectional encoder representations from transformers)成為其中最受歡迎的一種。在BERT 發(fā)布之前,RNN 或CNN 是大多NLP 任務(wù)的首選,代碼分類任務(wù)同樣也是使用基于RNN 或CNN 的框架,但RNN 或CNN 在訓(xùn)練中是按文本序列處理,這種方式對于模型并行化訓(xùn)練是一個障礙,這在BERT 框架中的多頭自注意力機制中得到解決,得益于多頭自注意機制可以提取序列中每個元素與其他元素之間的關(guān)系特征,BERT僅使用了自注意力來構(gòu)建神經(jīng)網(wǎng)絡(luò),雖然其他大規(guī)模的預(yù)訓(xùn)練模型例如ELMo[23]、GPT[4]等已經(jīng)能夠在各種NLP 任務(wù)中提升SOTA,但BERT[2]對預(yù)訓(xùn)練方法的創(chuàng)新仍然提高了在各領(lǐng)域上的成績。BERT 整體是一個自編碼語言模型(autoencoder LM),并且包含MLM(masked language modeling)和NSP(next sentence prediction)兩種任務(wù)預(yù)訓(xùn)練方式。

        BERT 模型的輸入結(jié)構(gòu)如圖1 所示,模型的輸入由令牌嵌入、句嵌入和位置嵌入三者結(jié)合構(gòu)成,下面對三者進行詳細的介紹。

        圖1 BERT輸入Fig.1 BERT input

        (1)令牌嵌入:在輸入文本傳遞到token 嵌入層之前,首先對其進行token 化。另外,在序列的首端[CLS]和末端[SEP]處增加額外的tokens,作為分類任務(wù)的輸入表示,并分割一對輸入文本。

        (2)段嵌入:BERT 能夠解決包含文本分類的NLP任務(wù)。例如對兩個文本在語義上是否相似進行分類。這對輸入文本被簡單地連接并輸入到模型中,BERT 是通過段嵌入來對輸入進行區(qū)分。

        (3)位置嵌入:BERT將位置嵌入添加到編碼層最底部的輸入嵌入中。位置嵌入維度與段嵌入相同,因此可以對兩者進行拼接。

        BERT[2]是第一個使用無監(jiān)督學(xué)習(xí)的方式來預(yù)訓(xùn)練NLP 模型的工作,但它只能使用純文本語料庫進行訓(xùn)練。BERT 模型和ELMo[23]有大不同,在之前的預(yù)訓(xùn)練模型(如word2vec[24]等)都會生成每個詞的向量,這種類別的預(yù)訓(xùn)練模型屬于基于特征的遷移學(xué)習(xí)。而近一兩年提出的GPT[4]、BERT等都屬于模型遷移。

        BERT模型是將預(yù)訓(xùn)練模型和下游任務(wù)結(jié)合在一起的,也就是說在做下游任務(wù)時仍然是用BERT 模型,而且天然支持文本分類任務(wù),在做文本分類任務(wù)時不需要對模型做修改。但BERT 也存在如預(yù)訓(xùn)練方式的提取效率不高、預(yù)訓(xùn)練的資源要求較高等問題。

        隨著BERT 預(yù)訓(xùn)練模型的提出,涌現(xiàn)出許多基于BERT框架的預(yù)訓(xùn)練模型來對不同的語言環(huán)境或任務(wù)進行特征提取。同時這些基于BERT 的模型通過改進預(yù)訓(xùn)練方式來對BERT的缺陷進行彌補。而CodeBERT的提出,則是將基于BERT預(yù)訓(xùn)練的方式引入到對代碼分析的領(lǐng)域當(dāng)中。

        1.3.2 CodeBERT

        由于BERT 框架具有相當(dāng)?shù)目蛇w移性,BERT 預(yù)訓(xùn)練模型在NLP領(lǐng)域取得了顯著的成功,目前被廣泛應(yīng)用于諸多領(lǐng)域。因此,研究人員開始對BERT預(yù)訓(xùn)練模型在程序語言上的適用性進行研究。其中Feng 等人[10]提出CodeBERT預(yù)訓(xùn)練模型并取得非常好的效果,這也是首次將BERT預(yù)訓(xùn)練方式引入到代碼表征的領(lǐng)域當(dāng)中,CodeBERT 使用Husain 等人[11]在2019 年提供的數(shù)據(jù)集進行預(yù)訓(xùn)練,與NLP 中的預(yù)訓(xùn)練模型不同,CodeBERT使用多模態(tài)的代碼數(shù)據(jù)進行訓(xùn)練,即代碼和代碼相對應(yīng)的由自然語言組成的注釋兩者構(gòu)成的雙模態(tài)數(shù)據(jù)和僅代碼的單模態(tài)數(shù)據(jù),使用MLM 和RTD 兩種方式對CodeBERT預(yù)訓(xùn)練模型進行訓(xùn)練,這兩項預(yù)訓(xùn)練任務(wù)賦予了CodeBERT很強的泛化能力。由于卓越的性能,研究人員還將CodeBERT應(yīng)用于跨語言代碼搜索,他們用Python、Java、PHP、Javascript和Go等多種語言進行了預(yù)訓(xùn)練,然后在Ruby 等看不見的語言上對代碼搜索模型進行了微調(diào)。結(jié)果表明,跨語言代碼搜索比從頭開始用單一語言進行訓(xùn)練取得了更好的效果。這進一步驗證了代碼搜索中遷移學(xué)習(xí)的有效性[25]。

        CodeBERT 模型的整體訓(xùn)練流程如圖2 所示,在模型的整體架構(gòu)上,CodeBERT并未脫離BERT和RoBERTa的思想。和大多數(shù)基于BERT框架的工作類似,CodeBERT也使用了多層Ecoder 來構(gòu)建模型。CodeBERT 使用的模型架構(gòu)與BERT 和RoBERTa 基本一致,即都有12 層Ecoder編碼層,每個編碼層有12個自注意頭,每個頭的大小是64,隱藏尺寸為768,前饋層的內(nèi)部隱藏尺寸為3 072,模型參數(shù)的總數(shù)為1.25 億。而使用大型語料庫來對預(yù)訓(xùn)練模型進行訓(xùn)練以提高預(yù)訓(xùn)練模型的表征效果也是參考RoBERTa 的方法。這也使得CodeBERT 能在代碼表征領(lǐng)域取得突破性成果的原因。

        圖2 CodeBERT模型Fig.2 CodeBERT model

        其中訓(xùn)練使用的MLM(maskd language modeling)任務(wù)具體為:給定一個代碼片段的數(shù)據(jù)點x作為輸入,為x選一組隨機位置進行掩碼Mx,然后用一個特殊的[mask]令牌替換所選位置。

        RTD關(guān)于判別器θ的損失函數(shù)如下所示,其中δ是一個指示函數(shù),是預(yù)測第i個單詞為原始詞概率的判別器。

        最終訓(xùn)練的損失函數(shù)由MLM 和RTD 的損失函數(shù)構(gòu)成。

        2 CBBCC模型

        本章將詳細介紹CBBCC(CodeBERT-based code classification)模型。

        2.1 總體模型

        整體模型如圖3 所示。CBBCC 使用基于BERT 框架的CodeBERT 預(yù)訓(xùn)練模型來進行代碼分類任務(wù)。第一個部分為代碼預(yù)處理操作,其中包括將源代碼去掉部分標(biāo)點符號和常用詞,預(yù)處理的目的是將源代碼轉(zhuǎn)換為Transformer輸入的格式,代碼段在清洗后變?yōu)橐恍芯喌拇a文本。模型的第二部分主要作用是對文本加入位置信息進行重構(gòu)和詞嵌入,從而得到一個初始向量。第三個部分由CodeBERT預(yù)訓(xùn)練模型構(gòu)成,其中12層編碼層在初始狀態(tài)下為CodeBERT的訓(xùn)練參數(shù),將經(jīng)過詞嵌入后形成的向量輸入預(yù)訓(xùn)練模型當(dāng)中進行微調(diào),通過微調(diào)訓(xùn)練調(diào)整預(yù)訓(xùn)練模型中的參數(shù),從而更充分地對代碼的語義信息進行提取。代碼經(jīng)過特征提取后形成的向量送入Softmax分類模塊來獲得代碼段對每個類別的概率,從而完成對代碼進行分類的任務(wù)。

        圖3 CBBCC模型圖Fig.3 CBBCC model

        模型流程如圖4 所示,CBBCC 模型在設(shè)置模型的訓(xùn)練類別k、微調(diào)輪數(shù)epoch 和每批輸入的大小batch size 后開始運行,模型需要使用訓(xùn)練集進行微調(diào)實驗,在進行k輪微調(diào)后,模型參數(shù)對代碼分類任務(wù)的適應(yīng)性得到進一步提高。微調(diào)完成后使用驗證集對模型的性能進行檢驗,得出模型在代碼分類任務(wù)上的準(zhǔn)確率等參數(shù)后結(jié)束。

        圖4 模型流程圖Fig.4 Model flow chart

        CBBCC模型的算法如算法1所示,由于CBBCC是基于BERT 框架上,偽代碼也與BERT 類似,其中4~11行為編碼層中的多頭自注意力機制和歸一化方程,通過12行的softmax分類函數(shù)得到每個代碼段在所有類別上的概率,再選取概率最高的類別為預(yù)測類別從而完成整個代碼分類任務(wù)。

        算法1Code Classification Learning

        2.2 數(shù)據(jù)預(yù)處理

        數(shù)據(jù)預(yù)處理是特征學(xué)習(xí)中的重要過程,將代碼處理成更適合詞嵌入和特征提取的形式,有效的數(shù)據(jù)預(yù)處理方式可以去除噪聲,降低模型運行的復(fù)雜度等。由于神經(jīng)網(wǎng)絡(luò)模型訓(xùn)練需要數(shù)據(jù)規(guī)范化,需要把這兩個特征的數(shù)據(jù)設(shè)定到一定維度內(nèi)。

        本文從代碼數(shù)據(jù)集開始,將代碼轉(zhuǎn)換為Transformer能接受的輸入方式。預(yù)處理主要分為兩步,第一步如圖5所示,使用WordPiece對代碼分詞,第二步對模型訓(xùn)練的清洗階段如圖6所示。

        圖5 WordPieceFig.5 WordPiece

        圖6 數(shù)據(jù)清洗Fig.6 Data washing

        將代碼拆分成各個單詞后去掉部分標(biāo)點符號等,用于每一個代碼段,并執(zhí)行以下操作:

        (1)刪除空行并將換行符替換為空格。

        (2)將部分常用詞刪除。

        (3)用占位符替換向量、數(shù)組和浮點常量,保留類型并刪除所賦的值。

        (4)替換圖7出現(xiàn)的標(biāo)點符號以外的標(biāo)點符號并替換為空格,并在剩余標(biāo)點符號前加入空格。

        圖7 保留的標(biāo)點符號Fig.7 Reserved punctuation

        2.3 模型結(jié)構(gòu)

        本文使用以多層雙向Transformer 為基礎(chǔ)的BERT作為CBBCC 的模型架構(gòu)。首先將代碼進行預(yù)處理操作,將代碼按照BERT 的輸入方式進行重構(gòu),同時盡量減小重構(gòu)導(dǎo)致的語義信息丟失。第二步進行詞嵌入,將處理好的代碼轉(zhuǎn)換為包含位置信息的向量矩陣。第三步將由代碼轉(zhuǎn)換成的向量矩陣輸入到由多層Transformer的編碼層構(gòu)成的預(yù)訓(xùn)練模型中,由預(yù)訓(xùn)練模型對代碼特征進行提取。由于不同的預(yù)訓(xùn)練模型對代碼特征提取的準(zhǔn)確率不同,本文嘗試了多種基于BERT的預(yù)訓(xùn)練模型來對代碼進行特征提取。經(jīng)過多次實驗證明CodeBERT預(yù)訓(xùn)練模型在代碼分類的任務(wù)中準(zhǔn)確率最佳,進而本文使用CodeBERT 來作為模型的預(yù)訓(xùn)練模型。隨后本文對CodeBERT 預(yù)訓(xùn)練模型進行針對代碼分類任務(wù)的微調(diào)訓(xùn)練,以適應(yīng)代碼分類任務(wù)。

        2.3.1 模型輸入

        CBBCC模型的輸入結(jié)構(gòu)由圖8所示,模型與Code-BERT[10]和RoBERTa[2]模型的輸入類似,CBBCC 的輸入由詞嵌入、位置嵌入兩者結(jié)合構(gòu)成,下面對輸入方式進行詳細的介紹。

        圖8 CBBCC模型輸入Fig.8 CBBCC input

        模型的輸入分為兩步,第一步對已經(jīng)處理好的代碼進行詞嵌入,將詞按照預(yù)訓(xùn)練模型提供的字典進行轉(zhuǎn)換,將代碼序列轉(zhuǎn)換為標(biāo)識符序列,如圖9 所示。第二步將嵌入后的代碼序列與對應(yīng)的位置信息疊加,位置信息的疊加能使得模型更好地學(xué)習(xí)文本中的語義信息,從而提高表征的準(zhǔn)確率。與傳統(tǒng)的BERT模型相比,本文借鑒了ALBERT[5]的思路,同時考慮到代碼段中并不含代碼的注釋信息,而代碼文本中并沒有特定的上下段關(guān)系,因此去掉了句嵌入的格式。在將輸入文本傳遞到token嵌入層之前,首先對其進行token化。如圖8所示,在tokens 的首端([CLS])和末端([SEP])處添加額外的tokens。例如,本文將void main char a int len 這段經(jīng)過預(yù)處理的代碼轉(zhuǎn)化為[CLS],void,main,char,a,int,len,[SEP]來作為模型的輸入。[CLS]是作為輸入首端的特殊token,其最終隱藏表示可以用做分類或排序的聚合序列表示。在轉(zhuǎn)換為tokens后,輸入還需將tokens的位置信息一同嵌入。輸入分兩部分:

        圖9 詞嵌入Fig.9 Word embedding

        (1)令牌嵌入:在將輸入文本傳遞到token嵌入層之前,首先對其進行token化。與BERT不同的是,由于取消了段嵌入,在令牌嵌入時也不使用[SEP]插入語句中,而僅作為結(jié)束符使用。這些tokens 的目的是作為分類任務(wù)的輸入表示,并分別分隔一對輸入文本。

        (2)位置嵌入:與BERT將位置嵌入相同,本文將位置信息添加到編碼層最底部的嵌入過程中。位置嵌入與令牌嵌入具有相同的維度,因此可以對兩者進行疊加。具體公式如下:

        2.3.2 特征提取

        CBBCC 是由12 個相同的Transformer 編碼層堆疊而成的,由這12 個編碼層對輸入的文本進行特征提取。本文將介紹Transformer編碼層里的結(jié)構(gòu)。每一層主要由多頭自注意力塊模塊和全連接前饋神經(jīng)網(wǎng)絡(luò)組成,兩個模塊的輸出都被送到殘差網(wǎng)絡(luò),最后進行歸一化處理。自注意力機制旨在捕捉序列中任何兩個元素之間的邏輯語義和語法信息,通過計算注意力得分,可以測量兩個任意元素之間的重要性。自注意力機制在計算的過程中衍生三個新的向量Q、K、V這三個向量都是由輸入的x演化而來。并且,Q、K、V是用embedding向量與一個矩陣相乘獲得的結(jié)果,并在訓(xùn)練中不斷更新參數(shù),如下方程所示:

        多頭注意力的輸出由前饋網(wǎng)絡(luò)進一步處理,表示為:

        其中,x表示由多頭注意力層處理的輸入矩陣,W1和W2是兩個可學(xué)習(xí)的參數(shù),b1、b2是相應(yīng)的偏差。使用自注意力、前饋神經(jīng)網(wǎng)絡(luò)和殘差的網(wǎng)絡(luò)具有更大的能力來捕獲全局和局部信息,可以最大限度地避免梯度消失問題。基于BERT 的預(yù)訓(xùn)練模型采用已訓(xùn)練好的參數(shù)進行特征提取,并根據(jù)微調(diào)任務(wù)再對整個模型進行微調(diào),從而更好地適應(yīng)下游任務(wù)。

        2.3.3 模型輸出

        CBBCC 模型輸出有兩種方式,第一種為自然語言的每個詞的向量表示,第二種為輸出[CLS]作為整個句子的表示,這種方法主要用與分類任務(wù)當(dāng)中。本文使用第二種方式,用Softmax 函數(shù)對輸出句子的向量計算每個類別的概率,選取概率最大的作為代碼段預(yù)測的類別。

        CBBCC 模型輸出為代碼段的整體特征向量,并將表征出的向量經(jīng)Softmax 函數(shù)歸一化后進行類別的劃分,選擇預(yù)測值最高的類別作為分類的結(jié)果,從而完成代碼分類的任務(wù)。同時,在微調(diào)訓(xùn)練中通過代碼分類任務(wù)也可以實現(xiàn)對編碼層中的參數(shù)進行調(diào)整,使得模型能更適合代碼分類的任務(wù)。

        在代碼類別預(yù)測的任務(wù)上,由于有多個類別,預(yù)測的類別可以通過以下方式獲得:

        2.4 模型微調(diào)

        如圖10 所示,CBBCC 的損失函數(shù)主要是對代碼段的分類任務(wù)進行微調(diào),通過分類的效果來評估誤差來優(yōu)化預(yù)訓(xùn)練模型中已有的參數(shù),使特征提取更準(zhǔn)確。CBBCC 通過預(yù)訓(xùn)練模型和針對下游任務(wù)微調(diào)的方法,使得編碼層學(xué)習(xí)到的表征既有token 級別信息,同時也可學(xué)習(xí)到整條語句的語義信息,使得模型能更充分、更準(zhǔn)確地學(xué)習(xí)到有利于對代碼進行分類的語義信息。

        圖10 模型微調(diào)Fig.10 Model fine-tuning

        本文使用多分類交叉熵函數(shù)來當(dāng)本文代碼分類任務(wù)的損失函數(shù)。在實際使用中,常用邏輯回歸模型去解決分類問題,當(dāng)邏輯回歸撞上平方損失,損失函數(shù)關(guān)于參數(shù)非凸。

        所以,不是分類問題中不使用平方損失,而是邏輯回歸不使用平方損失。而代碼中的log_probs使用了對數(shù),故而不使用平方損失,而使用多分類交叉熵損失函數(shù)。公式如下所示:

        其中,n表示模型一次輸入的batch中有n個樣本,k表示任務(wù)分類數(shù),以本文所做的代碼分類任務(wù)中有104類來舉例,本文實際使用的k值為104。式中,yij是真實標(biāo)簽,表示神經(jīng)網(wǎng)絡(luò)預(yù)測后歸一化的結(jié)果,是一個屬于0 到1 的k維數(shù)1 組,數(shù)組內(nèi)k個數(shù)值相加得1,本文希望這個數(shù)組在正確類別位置的值能更接近1。

        本文多次實驗調(diào)整代碼分類的設(shè)置參數(shù),最終決定微調(diào)訓(xùn)練采用batch size 為128、epoch 為8、learn rate為2E-5來作為本文的模型微調(diào)參數(shù)。

        3 實驗

        3.1 實驗準(zhǔn)備

        為了驗證模型在代碼分類上的有效性,本文基于有監(jiān)督的學(xué)習(xí)任務(wù)對BERT預(yù)訓(xùn)練模型進行微調(diào),并以此對模型分析和評估。實驗數(shù)據(jù)來自TBCNN[13]的POJ104代碼分類數(shù)據(jù)集。如表1所示,POJ104代碼分類數(shù)據(jù)集是根據(jù)教學(xué)編程開放判斷(online judge,OJ)系統(tǒng)中的問題和答案組成的。OJ 系統(tǒng)上有大量編程問題,學(xué)生提交他們的源代碼作為某個問題的解決方案,同時OJ系統(tǒng)將自動判斷提交的源代碼的正確性和有效性。數(shù)據(jù)集的標(biāo)簽是104個編程問題中的一個,具有相同標(biāo)簽的源代碼意味著具有相同的功能。POJ104數(shù)據(jù)集共有52 000 個樣本,為了使模型進行有效地學(xué)習(xí)和驗證,按40 000 訓(xùn)練集、2 000 的驗證集和10 000 的測試集的比例對數(shù)據(jù)集進行隨機分割。

        表1 POJ104代碼分類數(shù)據(jù)集Table 1 POJ104Code classification dataset

        3.2 分類指標(biāo)

        為了對實驗結(jié)果進行評價和分析,本文將用ACC、Recall、F1-measure 和MCC 四個指標(biāo)來評估實驗結(jié)果。其中使用了混淆矩陣中的TP、FN、FP、TN(如表2)。

        表2 混淆矩陣Table 2 Confusion matrix

        ACC:準(zhǔn)確率是針對代碼分類的預(yù)測結(jié)果而言,是分類任務(wù)最常見的評價指標(biāo)。通常來說,準(zhǔn)確率越高,分類器越好;

        Recall:召回率表示的是樣本中的正例中被預(yù)測正確的概率。主要由兩部分組成,一部分是是把正類預(yù)測成正類(TP),另一部分就是把正類預(yù)測為負類(FN)。

        F1:F1 值是統(tǒng)計學(xué)中用來衡量二分類模型準(zhǔn)確率的一種指標(biāo),是準(zhǔn)確率和召回率兩者的綜合,同時兼顧了分類模型的準(zhǔn)確率和召回率。F1分?jǐn)?shù)可以看作是模型準(zhǔn)確率和召回率的一種加權(quán)平均,它的最大值是1,最小值是0。

        MCC(Matthews correlation coefficient):MCC是測量分類性能的指標(biāo),該指標(biāo)考慮了真陽性、真陰性、假陽性和假陰性,通常認為該指標(biāo)是一個比較均衡的指標(biāo)。MCC 是一個描述實際分類與預(yù)測分類之間的相關(guān)系數(shù),它的取值范圍為[-1,1],取值為1 時表示對受試對象的正確預(yù)測,取值為0時表示預(yù)測的結(jié)果比隨機預(yù)測的結(jié)果差,-1 是指預(yù)測分類和實際分類完全不一致。

        本文使用BERT、RoBERTa 和CodeBERT 這三種預(yù)訓(xùn)練模型作為訓(xùn)練代碼片段的嵌入模型。微調(diào)任務(wù)的訓(xùn)練batch size大小設(shè)置為128,學(xué)習(xí)率為2E-2。所有的實驗都是在一臺擁有12 個2.4 GHz CPU 核心和GeForce RTX 2080 Ti GPU的服務(wù)器上進行的。

        3.3 對比模型

        本文在OJ 數(shù)據(jù)集上進行了多次的實驗,為了對比分析所提模型的有效性,文章采用TBCNN、ASTNN、CVRNN、TBCC四種模型進行對比分析。

        TBCNN[13]:TBCNN 是第一個用于處理104 代碼分類任務(wù)的深度學(xué)習(xí)模型。TBCNN設(shè)計了一組子樹特征探測器,稱為基于樹的卷積核。通過抽象語法樹(AST)來提取代碼的結(jié)構(gòu)信息,并采用動態(tài)池來收集樹的不同部分的信息。在模型最后添加一個隱藏層和一個輸出層,用于代碼分類任務(wù)。

        ASTNN[26]:對源代碼片段構(gòu)建AST 樹,并將整個AST分割為小的語句樹后輸入進神經(jīng)網(wǎng)絡(luò)中。ASTNN設(shè)計了一個遞歸編碼器的多路語句樹來捕獲語句級的詞法和語法信息,并采用語句向量進行表征。ASTNN使用基于語句的序列使用雙向門通循環(huán)單元(GRU[20]),利用語句的順序自然性,最終獲得整個代碼片段的向量表示。

        CVRNN[27]:CVRNN是一種基于卷積和循環(huán)神經(jīng)網(wǎng)絡(luò)的自動代碼特征提取模型,借助AST提取源代碼特征信息。為了緩解長序列代碼段轉(zhuǎn)為AST 后帶來的梯度消失問題,CVRNN 對AST 進行切割,將一個AST 轉(zhuǎn)換為多個子AST序列再輸入進模型當(dāng)中。該模型采用CNN提取代碼中的結(jié)構(gòu)信息,采用LSTM提取代碼中的序列信息。

        TBCC[28]:一種基于Transformer 的神經(jīng)網(wǎng)絡(luò)的新型模型。TBCC 借鑒了ASTNN 中的AST 切割的方法,將AST切成更小的子樹。通過Transformer網(wǎng)絡(luò)對AST子樹進行特征提取,并將其應(yīng)用于源代碼分類研究。目前,TBCC 是在POJ104 數(shù)據(jù)集[13]上進行代碼分類任務(wù)中表現(xiàn)最好的模型。

        3.4 研究問題

        研究問題1預(yù)處理對代碼分類的效果影響?

        本文在RoBERTa 和BERT 兩種預(yù)訓(xùn)練模型的基礎(chǔ)上,對刪減常用詞和標(biāo)點符號對代碼分類的影響來進行測試,從而選取更適合代碼分類的預(yù)處理方式。微調(diào)采用Batch Size=32、Epoch=5 和Learning Rate=2E-5,采用準(zhǔn)確率作為評估指標(biāo)。

        研究問題2CBBCC在代碼分類任務(wù)上是否具有最優(yōu)效果?

        基于POJ104 數(shù)據(jù)集[13]進行代碼分類實驗,并采用10次隨機劃分?jǐn)?shù)據(jù)集進行交叉驗證。在與其他模型比較的同時,也將BERT、RoBERTa、CodeBERT 預(yù)訓(xùn)練模型等基準(zhǔn)模型與本文提出的CBBCC模型進行對比分析。為了評價實驗結(jié)果,采用準(zhǔn)確率、召回率、F1 值和MCC這四種評價指標(biāo)進行分析。

        研究問題3CBBCC中各模塊對于分類任務(wù)的影響?

        為了對CBBCC 模型中各模塊對于分類任務(wù)的影響,本文將進行消融實驗來評估代碼分類任務(wù)中微調(diào)和預(yù)處理對模型的影響。

        4 實驗分析

        4.1 數(shù)據(jù)預(yù)處理實驗分析

        其中am為去掉所有標(biāo)點符號,acw為去掉常用詞,pm 為去掉部分標(biāo)點符號,pcw 為去掉部分常用詞,n 為不做任何改動。

        實驗結(jié)果如表3 所示,使用準(zhǔn)確率來作為實驗指標(biāo)。本文發(fā)現(xiàn),去除所有的標(biāo)點符號會對分類結(jié)果產(chǎn)生負面影響,這也驗證了上文的推斷,標(biāo)點符號在程序語言中也含有部分語義。而去除所有的重用詞也會對代碼分類產(chǎn)生負面影響,而代碼中也含有部分產(chǎn)生噪聲的無意義詞影響模型對代碼表征的準(zhǔn)確率,進而本文選擇去除部分常用詞和部分標(biāo)點符號來作為本文的模型輸入。

        表3 預(yù)處理實驗結(jié)果Table 3 Results of pre-processing experiments 單位:%

        4.2 分類任務(wù)實驗分析

        在實驗過程中,TBCNN、CVRNN、ASTNN和TBCC四種基準(zhǔn)模型采用參考文獻中的最優(yōu)參數(shù)來進行實驗,BERT、RoBERTa、CodeBERT 和CBBCC 四種預(yù)訓(xùn)練模型使用相同的參數(shù)進行訓(xùn)練。

        從表4 的實驗結(jié)果可以看出,最初始的BERT 預(yù)訓(xùn)練模型并沒有達到一個最優(yōu)的分類效果,但也達到90%以上。這可能是因為在BERT 預(yù)訓(xùn)練過程中的語料庫較小、缺少與源代碼之間的聯(lián)系導(dǎo)致的。使用RoBERTa預(yù)訓(xùn)練模型在進行代碼分類任務(wù)上獲得了95%以上的準(zhǔn)確率和召回率,在分類的準(zhǔn)確率上比TBCNN 提高了1.3個百分點,同時也超過BERT預(yù)訓(xùn)練模型2.7個百分點。結(jié)果低于ASTNN 和TBCC,主要原因可能是RoBERTa預(yù)訓(xùn)練使用的數(shù)據(jù)集由自然語言構(gòu)成,在預(yù)訓(xùn)練時并未消除自然語言與代碼之間的語義鴻溝。

        表4 代碼分類任務(wù)實驗結(jié)果Table 4 Results of code classification tasks 單位:%

        CBBCC采用CodeBERT預(yù)訓(xùn)練模型進行微調(diào)的方式取得了最好的實驗結(jié)果,在微調(diào)后代碼分類在準(zhǔn)確率上相比TBCC 超出1.1 個百分點,與ASTNN 相比在準(zhǔn)確率上超出1.4 個百分點。證明CBBCC 模型在代碼的特征提取上要比傳統(tǒng)的卷積神經(jīng)網(wǎng)絡(luò)更充分。得益于CodeBERT 預(yù)訓(xùn)練模型使用了大型的代碼語料庫來進行預(yù)訓(xùn)練,語料庫中包含有代碼和代碼對應(yīng)的注釋,從而達到在預(yù)訓(xùn)練過程中學(xué)習(xí)到兩者之間的相關(guān)性,彌補了自然語言和代碼之間的語義鴻溝,同時使用了針對代碼分類的預(yù)處理方式進一步提高了代碼分類的準(zhǔn)確率。實驗證明本文提出的CBBCC 模型在POJ104 數(shù)據(jù)集[13]上進行的代碼分類任務(wù)各項指標(biāo)均達到SOTA值。

        4.3 參數(shù)調(diào)整

        CBBCC使用CodeBERT作為預(yù)訓(xùn)練模型并進行微調(diào)參數(shù)的調(diào)整實驗,調(diào)整的參數(shù)為Epoch、Batch Size和Learning Rate,實驗結(jié)果如圖11所示。本文嘗試了多種訓(xùn)練批次和多種Batch Size 來進行針對代碼分類任務(wù)的微調(diào)訓(xùn)練。實驗結(jié)果發(fā)現(xiàn),當(dāng)訓(xùn)練批次數(shù)在8次時分類效果最好,超過8次時由于模型過擬合導(dǎo)致分類效果下降。Batch Size更大時對分類結(jié)果產(chǎn)生正面的影響,但Batch Size過大會導(dǎo)致訓(xùn)練時占用顯卡資源過多,綜合考慮下本文采用Batch Size 為128。最終本文采用Batch Size=128和Epoch=8作為模型的參數(shù)。

        圖11 模型參數(shù)調(diào)整Fig.11 Model parameter adjustment

        災(zāi)難性遺忘是遷移學(xué)習(xí)中的常見問題,由于本文使用了基于BERT框架的預(yù)訓(xùn)練模型來完成任務(wù),因此減小災(zāi)難性遺忘也是值得進行的研究。CBBCC 對使用CodeBERT 預(yù)訓(xùn)練模型在代碼分類任務(wù)中使用不同的學(xué)習(xí)率進行測試,同時使用Batch Size=128 和Epoch=8為實驗參數(shù)。實驗結(jié)果表明在較大的學(xué)習(xí)率下模型無法收斂,而過小的學(xué)習(xí)率導(dǎo)致微調(diào)效果不明顯,最終選取2E-5來作為CBBCC的學(xué)習(xí)率。

        4.4 各模塊效果分析

        在表5 中,nf 表示不進行微調(diào),np 表示不進行預(yù)處理操作,f 和p 則表示進行微調(diào)和預(yù)處理操作。通過實驗發(fā)現(xiàn)預(yù)處理對代碼分類作用沒有微調(diào)的作用明顯,但也對結(jié)果產(chǎn)生正面影響。實驗結(jié)果證明微調(diào)對實驗結(jié)果影響相比預(yù)處理更大,且同時使用微調(diào)和預(yù)處理的方法效果最好。

        表5 消融實驗結(jié)果Table 5 Results of CBBCC ablation experiments

        5 相關(guān)工作

        5.1 代碼表征在代碼分類任務(wù)的應(yīng)用研究

        近年來代碼表征領(lǐng)域不斷發(fā)展[29],許多研究者在代碼表征的領(lǐng)域中應(yīng)用了神經(jīng)網(wǎng)絡(luò)模型。同時代碼分類的領(lǐng)域當(dāng)中開始使用神經(jīng)網(wǎng)絡(luò)模型來對代碼進行特征提取后分類,例如根據(jù)源代碼的功能對源代碼進行分類[13],根據(jù)代碼片段的用途進行分類[14],惡意代碼分類[30],代碼缺陷檢測[31],惡意代碼家族分類[32],代碼語言分類[1],以及代碼片段總結(jié)[33]。盡管所有這些研究都使用神經(jīng)網(wǎng)絡(luò)模型作為各種代碼分類任務(wù)的方法,但他們并沒有很好地對代碼進行充分的特征提取。

        代碼表征在代碼分類任務(wù)上的研究主要通過抽象語法樹(abstract syntax tree,AST)進行表征。Mou等人[13]提出了一種基于樹的卷積神經(jīng)網(wǎng)絡(luò)模型(TBCNN),該模型考慮到不同代碼對應(yīng)的AST之間并不相似,采用了“連續(xù)二叉樹”的概念,直接在代碼所對應(yīng)的抽象語法樹上進行卷積操作模型將代碼段轉(zhuǎn)換為AST,通過使用CNN 對AST 內(nèi)部節(jié)點之間的依賴關(guān)系進行提取,從而獲得代碼的結(jié)構(gòu)信息后分類,而不是簡單地根據(jù)代碼的標(biāo)志符序列提取語義信息后對代碼進行分類操作,且POJ104數(shù)據(jù)集(由C語言編寫的104個任務(wù)的代碼數(shù)據(jù)集)也是由Mou等人[13]創(chuàng)建,并且TBCNN在此數(shù)據(jù)集上進行的分類任務(wù)準(zhǔn)確率能夠達到94%。Lu 等人[34]從代碼中提取數(shù)據(jù)流與函數(shù)調(diào)用信息,將其融合到抽象語法樹中,從而將代碼構(gòu)建為一個包含豐富信息的圖結(jié)構(gòu)表示,在傳統(tǒng)的GGNN 模型上引入了注意力機制,用于獲得圖中每個節(jié)點的重要程度,進而獲得更具有區(qū)分度的代碼表征向量,所生成的代碼表征向量用于代碼功能分類任務(wù)中。Phan 等人[35]提出了兩種基于樹的卷積神經(jīng)網(wǎng)絡(luò)TBCNN+SVM 和TBCNN+kNN,SVM 可以利用結(jié)構(gòu)和語義AST 的信息,而kNN 算法可以提高分類的效果,Phan 等人還提出了修剪樹的技術(shù)來細化AST 的數(shù)據(jù)。實驗結(jié)果表明,修剪多余的AST 分支,不僅大大減少了執(zhí)行時間,而且分類器的性能在準(zhǔn)確性和執(zhí)行時間方面都有明顯的改善。Zhang 等人[26]通過借鑒TBCNN的工作,提出了ASTNN模型,ASTNN在TBCNN的基礎(chǔ)上對AST 進行切割操作,得到代碼的語句樹。ASTNN 通過GRU 模型[20]在切割后的AST 上進行語義提取,獲得了代碼表征向量,這也表明ASTNN任然是一個以RNN為基礎(chǔ)的神經(jīng)網(wǎng)絡(luò)模型。該表征向量被用于代碼克隆檢測和代碼分類,代碼克隆檢測和代碼分類的結(jié)果遠超于TBCNN,在POJ104數(shù)據(jù)集[13]上的代碼分類準(zhǔn)確率達到了97.3%。但基于樹的方法通常需要按照特定順序?qū)淙勘闅v,其計算開銷相較于基于代碼序列的代碼方法會有所上升。史志成等人[27]提出的CVRNN對代碼分類任務(wù)上效果的提升并不大,分類準(zhǔn)確率為94%,僅在同等參數(shù)的條件下高于ASTNN。Hua等人[28]提出了TBCC模型,一種用于代碼表征的新型模型,TBCC模型基于Transformer的神經(jīng)網(wǎng)絡(luò),借鑒了ASTNN中的AST切割的方法將AST切成更小的子樹,通過Transformer網(wǎng)絡(luò)將子樹進行特征提取,以此來進行代碼表征的任務(wù),并對其進行代碼分類。TBCC在POJ104數(shù)據(jù)集[13]上進行的代碼分類任務(wù)上效果超過ASTNN。

        5.2 代碼分類領(lǐng)域的發(fā)展

        Ugurel等人[1]應(yīng)用機器學(xué)習(xí)方法將開源代碼自動分類為11 個應(yīng)用主題和10 種編程語言,利用特征提取器為每個程序的源代碼文件進行向量表示。然后在這些特征向量上訓(xùn)練SVM 分類器,然后使用訓(xùn)練好的分類器來對代碼進行分類。Alvares等人[36]使用詞法分析、評分策略和遺傳算法(GA)對代碼進行分類,Alvares 等人將關(guān)鍵字提取并作為標(biāo)記,通過計算給定代碼文件的概率來確定屬于哪種編程語言。Alreshedy 等人[37]提出了一種識別用21 種不同語言編寫的代碼片段的分類模型,首先他們將代碼片段轉(zhuǎn)換為數(shù)字特征向量,然后應(yīng)用多項式樸素貝葉斯方法進行代碼分類。謝文凱等人[14]使用了樸素貝葉斯的方法對Stack Overflow 等軟件開發(fā)網(wǎng)站的問題及代碼片段進行分類,將問題和代碼總共分為4 種問題類型和8 種代碼片段,計算每個詞在不同類型下的出現(xiàn)概率,作為訓(xùn)練好的貝葉斯模型,以此實現(xiàn)對代碼進行分類。盧喜東等人[30]惡意代碼映射為無壓縮的灰度圖像,然后根據(jù)圖像變換方法將圖像變換為恒定大小的圖像,使用方向梯度直方圖提取圖像的特征,最后提出一種基于深度森林的惡意代碼分類方法,實驗中選擇不同家族的多個惡意代碼樣本進行分類。王曉萌等人[31]使用基于卷積神經(jīng)網(wǎng)絡(luò)在圖像領(lǐng)域的多通道學(xué)習(xí)策略,融合word2vec[24]、fasttext[38]等詞嵌套技術(shù)提出基于文本卷積神經(jīng)網(wǎng)絡(luò)(textCNN)的多類源代碼缺陷檢測方法,創(chuàng)建源代碼的綜合向量表征,旨在利用textCNN學(xué)習(xí)源代碼流中蘊含的深層次語義特征,訓(xùn)練形成源代碼缺陷檢測卷積網(wǎng)絡(luò),以實現(xiàn)對跨函數(shù)的多類源代碼缺陷檢測。

        6 結(jié)論

        本文在代碼分類領(lǐng)域提出CBBCC模型,使用Code-BERT預(yù)訓(xùn)練模型來進行代碼分類任務(wù),通過對POJ104數(shù)據(jù)集[13]的分類實驗來驗證模型的有效性。CBBCC是第一個將BERT預(yù)訓(xùn)練模型用于代碼分類當(dāng)中的模型。通過使用CodeBERT 預(yù)訓(xùn)練模型來對代碼分類任務(wù)微調(diào)和特征提取,這種方式完善了使用AST+卷積神經(jīng)網(wǎng)絡(luò)對代碼特征提取后分類存在精度不高的問題,在保留了代碼完整性的同時模型對代碼特征提取更充分,使得在POJ104 數(shù)據(jù)集上進行的代碼分類任務(wù)達到SOTA值。在開源社區(qū)或代碼庫的代碼管理中,CBBCC 能對新增的代碼進行準(zhǔn)確分類。代碼分類可以為代碼搜索、代碼克隆等任務(wù)的研究提供基礎(chǔ),從而促進代碼大數(shù)據(jù)的發(fā)展,為軟件工程的發(fā)展提供有利保障。

        然而,CBBCC仍有較大的改進空間,目前仍然缺少較大的代碼功能分類的數(shù)據(jù)集,同時在預(yù)訓(xùn)練模型上仍然存在可以改進的空間,本文計劃下一步將創(chuàng)建更大的代碼分類數(shù)據(jù)集并將CBBCC 進一步改進和應(yīng)用,同時探索訓(xùn)練一個更適用于代碼分類的預(yù)訓(xùn)練模型。

        猜你喜歡
        特征提取分類實驗
        記一次有趣的實驗
        分類算一算
        做個怪怪長實驗
        基于Gazebo仿真環(huán)境的ORB特征提取與比對的研究
        電子制作(2019年15期)2019-08-27 01:12:00
        分類討論求坐標(biāo)
        數(shù)據(jù)分析中的分類討論
        教你一招:數(shù)的分類
        一種基于LBP 特征提取和稀疏表示的肝病識別算法
        NO與NO2相互轉(zhuǎn)化實驗的改進
        實踐十號上的19項實驗
        太空探索(2016年5期)2016-07-12 15:17:55
        404 Not Found

        404 Not Found


        nginx
        404 Not Found

        404 Not Found


        nginx
        404 Not Found

        404 Not Found


        nginx
        404 Not Found

        404 Not Found


        nginx
        404 Not Found

        404 Not Found


        nginx
        中文字幕高清不卡视频二区| 亚洲色成人网一二三区| 99免费视频精品| 看一区二区日本视频免费 | 伊人久久大香线蕉av不变影院| 国产激情视频在线观看首页| 国产亚洲婷婷香蕉久久精品| 探花国产精品三级在线播放| 亚洲中文字幕一二区精品自拍| 青青草成人免费在线观看视频| 国产午夜免费高清久久影院| 中文字幕人妻互换激情| 亚洲国产av午夜福利精品一区| 一个人午夜观看在线中文字幕| 中文字幕隔壁人妻欲求不满| 日本大片免费观看视频| 亚洲在AV极品无码天堂手机版| 亚洲国产成人AV人片久久网站| 国产女人18一级毛片视频| 免费人成黄页网站在线观看国产| 亚洲国产最新免费av| 人妻丰满熟av无码区hd| www插插插无码免费视频网站| 国产黑色丝袜一区在线| 亚洲av永久综合网站美女| 精品一区二区三区国产av| 欧美国产激情二区三区| 欧美国产日本高清不卡| 亚洲AV无码一区二区三区少妇av| 国产一区二区三区再现| 综合亚洲伊人午夜网| 男女肉粗暴进来动态图| 99精品热这里只有精品| 蜜桃一区二区三区在线看| 精品麻豆一区二区三区乱码| 欧美村妇激情内射| 亚洲中文字幕无码中字| 亚洲精品一区二区三区国产| 国产欧美va欧美va香蕉在线| 丰满人妻无套内射视频| 亚洲国产精品国自产拍久久蜜av|