寫在最前面
隨著大規(guī)模代碼的崛起,
無監(jiān)督學(xué)習(xí)
成為了提高代碼預(yù)訓(xùn)練模型性能的有效手段。這些預(yù)訓(xùn)練模型在廣泛的下游任務(wù)中表現(xiàn)出色,如自然語言處理和程序語言處理。例如,像CodeBERT和GraphCodeBERT這樣的模型在預(yù)訓(xùn)練階段通過大規(guī)模代碼數(shù)據(jù)學(xué)到通用的表示,并在下游任務(wù)上進行微調(diào),取得了優(yōu)于傳統(tǒng)監(jiān)督學(xué)習(xí)方法的成績。然而,這些模型在面對代碼變異等挑戰(zhàn)時,魯棒性仍然有待提高
。該論文關(guān)注的問題是:
現(xiàn)有的代碼預(yù)訓(xùn)練模型是否能夠?qū)W到魯棒的代碼表示?
研究表明,這些模型在處理程序變異,如變量重命名等情況時表現(xiàn)不佳。為了提高模型的魯棒性,作者提出了一種新的方法,稱為ContraBERT。
本文為鄒德清教授的《網(wǎng)絡(luò)安全專題》課堂筆記系列的文章,本次專題主題為大模型。
李仕昕同學(xué)分享了ContraBERT: Enhancing Code Pre-trained Models via Contrastive Learning
《ContraBERT:通過對比學(xué)習(xí)增強代碼預(yù)訓(xùn)練模型》
關(guān)于提升代碼預(yù)訓(xùn)練模型魯棒性的文章,發(fā)表在ICSE2023,作者單位是南洋理工大學(xué)Nanyang Technological University, Singapore
分享時的PPT簡潔大方,重點突出
論文:https://dl.acm.org/doi/10.5555/3618408.3620098
ICSE(International Conference on Software Engineering)是軟件工程領(lǐng)域的頂級國際會議之一。ICSE會議每年都吸引來自世界各地的頂尖研究人員和學(xué)者,以展示和討論最新的軟件工程研究成果。
對nlp領(lǐng)域其他方向研究的啟發(fā)
《ContraBERT: Enhancing Code Pre-trained Models via Contrastive Learning》側(cè)重于增強代碼預(yù)訓(xùn)練模型的魯棒性,提供了一些有益的啟發(fā)可以應(yīng)用到自然語言處理(NLP)領(lǐng)域的其他方向研究中:
采用對比學(xué)習(xí)、數(shù)據(jù)增強和多任務(wù)學(xué)習(xí)等方法以提高模型性能和魯棒性的示例
-
對比學(xué)習(xí)的應(yīng)用:這篇論文通過對比學(xué)習(xí)方法增強了代碼預(yù)訓(xùn)練模型的性能。
可以嘗試將對比學(xué)習(xí)引入到各種任務(wù)中,以提高模型的性能和魯棒性。 -
數(shù)據(jù)增強的重要性:數(shù)據(jù)增強是提高模型性能和魯棒性的關(guān)鍵因素之一。
通過設(shè)計合適的數(shù)據(jù)增強方法,可以生成語義等價的樣本,以提高模型的泛化能力
。
這種方法可以應(yīng)用于各種NLP任務(wù),如文本分類、命名實體識別和機器翻譯等。 -
多任務(wù)學(xué)習(xí):ContraBERT采用了多任務(wù)學(xué)習(xí)的策略,將掩碼語言模型(MLM)和對比學(xué)習(xí)結(jié)合在一起。
這種方法可以用來訓(xùn)練更通用的NLP模型,以適應(yīng)多種下游任務(wù)??梢試L試將多任務(wù)學(xué)習(xí)
引入到NLP任務(wù)中,以提高模型的效率和性能。 -
預(yù)訓(xùn)練任務(wù)的設(shè)計:這篇論文的成功經(jīng)驗表明,通過設(shè)計具有挑戰(zhàn)性的預(yù)訓(xùn)練任務(wù),可以幫助模型更好地捕捉語言的特征。
可以探索不同的預(yù)訓(xùn)練任務(wù),以進一步改進NLP模型的性能。
介紹
大代碼時代的到來使得目前有很多工作開始利用無監(jiān)督學(xué)習(xí),來通過大量的代碼數(shù)據(jù)學(xué)習(xí)到通用的預(yù)訓(xùn)練模型,然后再針對不同的下游任務(wù)對預(yù)訓(xùn)練模型進行微調(diào)。這些預(yù)訓(xùn)練模型對不同的下游任務(wù)有比較強的泛化性,并且得到了廣泛的使用。
比如預(yù)訓(xùn)練模型CodeBert和GraphCodeBert都是在數(shù)據(jù)集codesearchnet上進行預(yù)訓(xùn)練的模型,然后在下游任務(wù)上進行微調(diào),達到了優(yōu)于監(jiān)督學(xué)習(xí)的方法。
(CodeBert在自然語言NL和程序語言PL對上進行學(xué)習(xí),(結(jié)構(gòu):多層雙向transformer),GraphCodeBert利用代碼的語義結(jié)構(gòu)來學(xué)習(xí)代碼表征,利用了代碼的數(shù)據(jù)流來進行編碼。)
文章針對這兩個預(yù)訓(xùn)練模型做了一個魯棒性的初步研究,結(jié)論是發(fā)現(xiàn)這些預(yù)訓(xùn)練模型對于變量重名名這種程序變異都不夠魯棒。
具體實驗是使用了克隆檢測的數(shù)據(jù)集,將程序中的多個變量隨機重命名,然后計算程序在變量重命名前后預(yù)訓(xùn)練模型輸出的embedded vectors的余弦相似度,從這個圖中可以看出,在重命名的變量數(shù)從1增加到8時,紅線和藍線代表的兩個預(yù)訓(xùn)練模型對于程序變異前后的輸出相似度由1降到了0.4,說明他們對這種對抗樣本是十分敏感的。
為了提高預(yù)訓(xùn)練模型魯棒性,文章提出的方法ContraBert
如上圖所示,上面兩條線就是文章提出的方法應(yīng)用在codebert和grapgcodebert上的結(jié)果,方法的魯棒性是優(yōu)于原始模型的。
Contrabert
ContraBERT采用了一種基于對比學(xué)習(xí)的無監(jiān)督學(xué)習(xí)框架,旨在增強現(xiàn)有代碼預(yù)訓(xùn)練模型的魯棒性。該方法結(jié)合了兩個預(yù)訓(xùn)練任務(wù):掩碼語言模型(MLM)和對比學(xué)習(xí)。
-
MLM任務(wù)
旨在通過將一部分句子中的標(biāo)記進行掩碼,然后嘗試從剩余部分還原這些標(biāo)記,從而學(xué)習(xí)更好的標(biāo)記表示。 -
對比學(xué)習(xí)
通過最小化相似樣本之間的距離,同時最大化不同樣本之間的距離來學(xué)習(xí)表示,以提高模型的魯棒性。
對比學(xué)習(xí)來提高模型魯棒性背后的直覺就是:程序變異前后作為相似樣本進行拉進,使得模型對程序變異這種對抗攻擊更加魯棒
。
方法Method
ContraBERT
- MLM is utilized to help the model learn better token representations
- Contrastive is utilized to help the model group the similar vector representations to enhance model robustness.
ContraBERT的訓(xùn)練過程包括兩個關(guān)鍵任務(wù):MLM和對比學(xué)習(xí)contrastive learning。
- 首先,原始輸入樣本對以及由數(shù)據(jù)增強算法生成的增強樣本對被送入模型。
- 然后,模型執(zhí)行MLM任務(wù),其中一組標(biāo)記被隨機掩碼,模型需要預(yù)測被掩碼的標(biāo)記。
- 接下來,模型執(zhí)行對比學(xué)習(xí)任務(wù),通過最小化相似樣本之間的距離,同時最大化不同樣本之間的距離,以增強模型的魯棒性。
- 最后,MLM和對比學(xué)習(xí)兩個任務(wù)的損失被加權(quán)相加以進行訓(xùn)練。
對比學(xué)習(xí)是需要拉進相似樣本的,所以使用對比學(xué)習(xí)的時候需要用數(shù)據(jù)增強在原始樣本的基礎(chǔ)上構(gòu)造一系列的相似樣本。
可以從這個流程圖看到:
- 原始的輸入C,W這種函數(shù)和注釋樣本對在進行訓(xùn)練前,會使用文章定義的一系列程序語言和自然語言的數(shù)據(jù)增強算法f和g來構(gòu)造c和w的增強樣本,
- 然后使用原始樣本對和增強樣本對這個四元組作為輸入,
- 之后使用兩個預(yù)訓(xùn)練任務(wù)MLM和contrastive對給定的模型進行訓(xùn)練。
所以整個方法具體分為兩個部分,
- 首先,是如何設(shè)計的這個程序語言和自然語言的數(shù)據(jù)增強操作f和g,
- 第二步,是如何設(shè)計Contrabert模型的訓(xùn)練。
數(shù)據(jù)增強和訓(xùn)練細節(jié)
數(shù)據(jù)增強在ContraBERT中發(fā)揮關(guān)鍵作用,以提高模型魯棒性。
對于程序語言(PL)和自然語言(NL)的數(shù)據(jù)增強,作者提出了一系列操作,包括函數(shù)重命名、變量重命名、插入未使用的語句、隨機交換函數(shù)中的語句和隨機刪除函數(shù)中的語句
。
這些增強方法旨在構(gòu)造語義等價的變種樣本
,以供對比學(xué)習(xí)使用。
首先介紹數(shù)據(jù)增強操作f和g,數(shù)據(jù)增強主要是為了在原始樣本的基礎(chǔ)上構(gòu)造語義等價的變體來提供給對比學(xué)習(xí)這個任務(wù)
給定一個函數(shù)和注釋的樣本對
首先針對程序語言PL的數(shù)據(jù)增強,文章提出了五種增強操作,
第一個是函數(shù)重命名,將函數(shù)名稱進行替換(有額外詞匯集,從預(yù)訓(xùn)練數(shù)據(jù)集中提?。?,
第二個是變量重命名,將每個函數(shù)里的變量進行隨機重命名,
第三個是在函數(shù)中插入未使用的語句,構(gòu)造一個沒有在函數(shù)中出現(xiàn)的變量的賦值語句插入函數(shù)中
第四個是隨機交換函數(shù)中沒有相互依賴關(guān)系的語句(遍歷 AST 并分析數(shù)據(jù)依賴性以進行提取。)
第五個是隨機抽取函數(shù)里的一行語句進行刪除,這個主要是作為正則化來避免訓(xùn)練的過擬合(?)
這些增強方法都可以構(gòu)造出語意等價的相似樣本,被視為原始樣本的正樣本。
針對自然語言的數(shù)據(jù)增強主要是
- 一個是反向翻譯,就是將源語句翻譯成另一種語言,然后將翻譯后的語言再轉(zhuǎn)換為原語言,比如文章就是講英語轉(zhuǎn)換成德語在翻譯回英語。
- 除此之外還有一些簡單的如隨機刪除注釋里的一個單詞,隨機交換注釋里的兩個單詞,或者是復(fù)制一個單詞插入注釋里面。
文章會使用這些增強方法講PL-NL對進行增強形成一個增強集合,然后在每個訓(xùn)練step中隨機選擇一對出來進行訓(xùn)練。
(和之前的工作比增加了自然語言的數(shù)據(jù)增強)
模型的訓(xùn)練需要兩個編碼器M和M’,它們具有相同的模型結(jié)構(gòu)和初始參數(shù)。在訓(xùn)練過程中,原始輸入樣本對和增強樣本對
被用于執(zhí)行MLM和對比學(xué)習(xí)任務(wù)。MLM任務(wù)
通過隨機掩碼標(biāo)記來訓(xùn)練模型,而對比學(xué)習(xí)任務(wù)
則使用對比學(xué)習(xí)損失函數(shù)(infonce loss)來最小化相似樣本之間的距離,同時最大化不同樣本之間的距離。
將樣本進行數(shù)據(jù)增強后,就是正式進行模型訓(xùn)練了。
具體設(shè)計細節(jié)如圖,contrabert需要兩個encoder
M和M’,他們的模型結(jié)構(gòu)一樣,并且初始參數(shù)相同,文章具體會使用codebert或者是graphcodebert
每一個樣本對c,w通過數(shù)據(jù)增強得到四元組(c,w,c’,w’)后,構(gòu)建兩個輸入序列,一個是原始樣本對序列x和增強樣本對序列x’,其中用CLS標(biāo)識符來標(biāo)記序列開始,SEP來標(biāo)記鏈接自然語言和程序語言兩種序列的符號。
構(gòu)造了輸入之后,整個訓(xùn)練過程有兩個訓(xùn)練任務(wù),首先是MLM,在圖中的左半部分,訓(xùn)練時將原始輸入序列X中一組隨機位置的token mask掉然后訓(xùn)練模型能夠?qū)W到被mask掉的標(biāo)記,這個訓(xùn)練任務(wù)為了讓模型學(xué)到更好的特征表示,MLM是被廣泛使用的訓(xùn)練任務(wù),我就不過多介紹了。
第二個訓(xùn)練任務(wù)就是對比學(xué)習(xí),對比學(xué)習(xí)的損失函數(shù)使用的事infonce,可以看到這個函數(shù)表示,q指的是圖中的query,是原始樣本序列X的encoder的[cls]位置的向量表示,k+指的是增強樣本序列X’encode的向量表示,被視為原始樣本的正樣本,i=1到n的ki值得是其他樣本的增強樣本,被視為原始樣本的負樣本,通過infoloss這個公式可以將分子上原始樣本和正樣本拉進,分母上原始樣本和其他負樣本拉遠,使模型能夠?qū)⒃紭颖舅械淖儺悩颖径紝W(xué)到相似的語義特征。
該文章參考了對比學(xué)習(xí)的一個有代表性的方法moco,設(shè)置了一個隊列來儲存之前batch的負樣本來動態(tài)更新進行學(xué)習(xí)。最后MLM和對比學(xué)習(xí)兩個loss進行加權(quán)相加來進行訓(xùn)練。在訓(xùn)練過程中M使用梯度下降進行參數(shù)更新,M’使用動量來更新weight
模型訓(xùn)練好后,就可以根據(jù)不同的下游任務(wù)進行微調(diào)了,文章關(guān)注了三類下游任務(wù)
第一類是檢索任務(wù),包含克隆檢測和代碼搜索(根據(jù)自然語言query所需程序),第二類是分類任務(wù),如缺陷檢測,第三類是生成任務(wù),比如代碼到代碼的翻譯。
可以根據(jù)不同任務(wù)添加特定模塊進行微調(diào)
實驗Experiment
作者從四個方面來評估了他們的方法,
RQ1 :Robustness Enhancement魯棒性提升
Performance of different augmentation operators in enhancing the robustness of the pre-trained model
在第一個實驗中,作者評估了不同增強操作對模型魯棒性的影響。實驗結(jié)果表明,通過使用設(shè)計的PL-NL數(shù)據(jù)增強方法,模型的魯棒性得到了顯著提升。將這些增強方法組合使用可以獲得最佳效果。
第一個方面是提出的不同的數(shù)據(jù)增強算法對提高模型魯棒性的表現(xiàn)。
實驗通過檢測contrabert對克隆檢測的對抗攻擊的魯棒性來評估(因為克隆檢測也是從其他干擾項中識別出語義等效的樣本)
如表所示,contrabert在訓(xùn)練模型時使用了提出的所有增強方法,所以這個表每一行分別去掉一個提出增強方法來觀察不同增強方法帶來的魯棒性提升,具體做法是將模型能夠正確預(yù)測的樣本(num)進行隨機次數(shù)的變異來觀察模型的預(yù)測準(zhǔn)確性。
可以看到設(shè)計的 PL-NL 數(shù)據(jù)增強每一個方法都對模型魯棒性有幫助(縱向?qū)Ρ?,每一個和最后一行對比),當(dāng)這些增強合并時,預(yù)訓(xùn)練模型的魯棒性能獲得最佳效果。
存在問題:沒有給對比實驗,就是提供直接用codebert和graphcodebert在對抗攻擊下的魯棒性進行參考。
RQ2: Visualization for Code Embeddings代碼嵌入可視化
第二個實驗通過可視化ContraBERT的向量空間來觀察模型是否學(xué)到了更好的向量表示。結(jié)果顯示,ContraBERT學(xué)習(xí)到的向量空間更加緊湊,能夠更好地區(qū)分不同問題的程序表示,從而提高了模型的性能。
第二個實驗室可視化contrabert的向量空間來觀察此方法是否學(xué)到了更好的向量表示
從圖中我們可以看出,contrabert比單純的codebert和graphcodebert學(xué)習(xí)到的向量空間更加緊湊,代表同一個問題的程序表示更想死,不同問題之間也隔的更開。所以ContraBERT 能夠?qū)φZ義等效的樣本進行分組并排除不相似的樣本,從而學(xué)習(xí)更好的向量表示。
(也是使用了克隆檢測,可以觀察樣本表示的相似度,該數(shù)據(jù)集由 104 個編程問題組成,其中每個問題都有 500 個語義等效的程序,但具有不同的實現(xiàn)。隨機選擇 5 個不同的問題和 100 個樣本)
RQ3: Performance of ContraBERT on Downstream Tasks下游任務(wù)性能
第三個實驗評估了ContraBERT在四個下游任務(wù)上的性能,包括克隆檢測、缺陷檢測、代碼翻譯和代碼搜索。實驗結(jié)果表明,ContraBERT在這些任務(wù)上取得了顯著的性能提升,特別是在克隆檢測和缺陷檢測任務(wù)中表現(xiàn)出色。
表2是在克隆檢測和缺陷檢測上的結(jié)果,表3是代碼翻譯,表4是代碼搜索
可以觀察到ContraBERT 全面提升了原始 CodeBERT 和 GraphCodeBERT 在四個下游任務(wù)上的性能,我們將這些改進歸因于模型魯棒性的增強,在這些任務(wù)上具有更好的性能。
同時也可以看到這些結(jié)果都展示了模型分別使用兩個預(yù)訓(xùn)練任務(wù)MLM和contrastive對下游任務(wù)的影響,可以看出兩個任務(wù)結(jié)合能獲得最好的效果。
(代碼搜索提升不高是任務(wù)本身難度,程序和自然語言中的映射是很難提升的)
(MAP@R:評估在給定查詢的情況下檢索集合中R個最相似樣本的結(jié)果。 MAP@R 用于克隆檢測,其中 R 設(shè)置為 499 進行評估。)
(BLEU-4:生成的序列與真實值之間的文本相似性。)
(MRR:平均倒數(shù)排名,評估檢索系統(tǒng)性能,第一個結(jié)果匹配,分數(shù)為1,第二個匹配分數(shù)為0.5,第n個匹配分數(shù)為1/n)
RQ4: Ablation Study for Pre-training Tasks預(yù)訓(xùn)練任務(wù)的消融研究
作者還進行了預(yù)訓(xùn)練任務(wù)的消融研究,驗證了MLM和對比學(xué)習(xí)任務(wù)的重要性,結(jié)果表明兩者的結(jié)合能夠獲得最佳效果。
討論
盡管ContraBERT在提高代碼預(yù)訓(xùn)練模型的魯棒性方面取得了顯著的成果,但仍存在一些潛在限制。例如,作者采用了與計算機視覺任務(wù)中的對比學(xué)習(xí)框架相似的參數(shù)設(shè)置,這可能不是最適用于代碼模型的參數(shù)。此外,作者在評估模型魯棒性時只使用了克隆檢測任務(wù),未提供與傳統(tǒng)模型的對比實驗。
然而,這項工作為提高代碼預(yù)訓(xùn)練模型的性能和魯棒性提供了有價值的思路。未來的研究可以進一步探索更復(fù)雜的數(shù)據(jù)增強方法,以進一步提高模型的魯棒性,并改進對代碼搜索任務(wù)的性能提升方法。
通過對比學(xué)習(xí)和數(shù)據(jù)增強,ContraBERT為提高代碼預(yù)訓(xùn)練模型的性能和魯棒性提供了一種新的方法,為代碼領(lǐng)域的研究和應(yīng)用提供了有力支持。
這篇文章主要就是提倡在訓(xùn)練代碼模型的時候除了考慮模型在下游任務(wù)上的表現(xiàn)還要考慮模型的魯棒性。
這篇文章在實現(xiàn)上還是存在一些limitation
這篇論文參考的對比學(xué)習(xí)框架MOCO,MOCO是為計算機視覺中的圖像分類任務(wù)設(shè)計的,而這篇文章的參數(shù)照搬了moco的原始設(shè)置,可能這些參數(shù)對于代碼模型來說不是最佳的。
第二點是在實驗時評估模型魯棒性的時候只使用克隆檢測任務(wù)來說明問題(POJ-104),并且沒有設(shè)置baseline對比實驗。
關(guān)于工作的思考,可以發(fā)現(xiàn)在對下游任務(wù)的提升中,contrabert對代碼搜索的下游任務(wù)的提升相對于其他下游任務(wù)的性能提升來說是比較微小。
文章關(guān)于這個現(xiàn)象的解釋是,對于代碼搜索任務(wù),由于模型需要學(xué)習(xí)查詢與其相應(yīng)代碼之間的語義映射,是比較難的,然而設(shè)計的增強算法都僅僅修改代碼或查詢語言本身,無法捕獲它們的相關(guān)性,這導(dǎo)致提升受到限制。
所以對于代碼搜索任務(wù),進一步提高性能的一個可能的解決方案是為增強變體建立 PL 和 NL 之間的標(biāo)記關(guān)系,然而,這需要大量工作來分析程序和自然語言注釋之間的關(guān)系。
除此之外,文章證明了提出的數(shù)據(jù)增強能夠提高預(yù)訓(xùn)練模型的魯棒性,后續(xù)還可以探究更多復(fù)雜的數(shù)據(jù)增強,使得模型魯棒性有更大的提升的空間文章來源:http://www.zghlxwxcb.cn/news/detail-755454.html
希望這篇博客對您理解《ContraBERT: Enhancing Code Pre-trained Models via Contrastive Learning》論文提供了有益的信息。如果您對該論文或相關(guān)領(lǐng)域有更多疑問,歡迎隨時交流。文章來源地址http://www.zghlxwxcb.cn/news/detail-755454.html
到了這里,關(guān)于19ContraBERT:頂會ICSE23 數(shù)據(jù)增強+對比學(xué)習(xí)+代碼預(yù)訓(xùn)練模型,提升NLP模型性能與魯棒性:處理程序變異(變量重命名)【網(wǎng)安AIGC專題11.15】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!