11月14日,螞蟻集團(tuán)聯(lián)合上海交通大學(xué)發(fā)布55頁代碼大模型綜述,覆蓋超過50個(gè)模型、30個(gè)下游任務(wù)、500篇參考文獻(xiàn),全方位總結(jié)大語言模型在代碼相關(guān)應(yīng)用中的最新進(jìn)展與挑戰(zhàn)。
引言 隨著大語言模型遍地開花式的涌現(xiàn),如何將他們與實(shí)際應(yīng)用,尤其是軟件工程相關(guān)應(yīng)用進(jìn)行有效結(jié)合成為了學(xué)界與工業(yè)界都日益關(guān)注的問題。然而,目前這些應(yīng)用仍非常有限:以 HumanEval、MBPP 為代表的代碼生成任務(wù)在 NLP 與大模型社區(qū)中一枝獨(dú)秀,但這些經(jīng)典數(shù)據(jù)集上的性能已接近飽和,而其他諸如代碼翻譯、代碼注釋、單元測試生成等任務(wù)則鮮有人問津。另一方面,在軟件工程社區(qū)中,語言模型的應(yīng)用則仍以CodeBERT為代表的 encoder-only 模型和 CodeT5 為代表的 encoder-decoder 模型為主,而 GPT 系列大模型的工業(yè)級應(yīng)用方興未艾。
與此前已有的多篇綜述不同,本文從跨學(xué)科視角出發(fā),全面調(diào)研 NLP 與軟件工程(SE)兩個(gè)學(xué)科社區(qū)的工作,既覆蓋以 OpenAI GPT 系列與 Meta LLaMA 系列為代表的生成式大模型與代碼生成任務(wù),也覆蓋 CodeBERT 等專業(yè)代碼小模型及代碼翻譯等其他下游任務(wù),并重點(diǎn)關(guān)注 NLP 與 SE 的融合發(fā)展趨勢。
本文分為技術(shù)背景、代碼模型、下游任務(wù)、機(jī)遇挑戰(zhàn)四部分。第一部分介紹語言模型的基本原理與常見訓(xùn)練目標(biāo),以及對 Transformer 基本架構(gòu)的最新改進(jìn)。第二部分介紹 Codex、PaLM 等通用大模型及 CodeGen、StarCoder 等專業(yè)代碼模型,并包括指令微調(diào)、強(qiáng)化學(xué)習(xí)等 NLP 技術(shù)以及 AST、DFG、IR 等程序特征在代碼模型中的應(yīng)用。第三部分簡單介紹 30+ 個(gè)代碼下游任務(wù),并列出常見數(shù)據(jù)集。第四部分給出當(dāng)下代碼大模型的機(jī)遇與挑戰(zhàn)。
技術(shù)背景 雖然如今的生成式大模型大都基于 Transformer decoder,但其架構(gòu)并不是自從2017年提出以來就一塵不變。本節(jié)簡單介紹前置層正則化(pre-norm),并行注意力(parallel attention),旋轉(zhuǎn)位置編碼(RoPE),多檢索注意力和群檢索注意力(MQA、GQA),以及針對注意力的硬件IO優(yōu)化(FlashAttention),熟悉的朋友可以略過~ 01經(jīng)典多頭自注意力
在2017年的論文 Attention Is All You Need 中,Transformer 的每一層定義如下:
其中LN為層正則化(Layer Normalization),Attention為多頭自注意力(MHA)子層,F(xiàn)FN為全連接(Feed-Forward Network)子層。
02前置層正則化
2019年,GPT-2將層正則化移到了每一子層的輸入:
后續(xù) decoder-only 工作基本效仿了這一架構(gòu)讓訓(xùn)練更加穩(wěn)定,在encoder-decoder模型方面,T5系列也采用了這一架構(gòu)。
03并行注意力
2021年,GPT-J 將自注意力與全連接層的順序計(jì)算改為了并行以提高訓(xùn)練效率:
PaLM論文實(shí)驗(yàn)中發(fā)現(xiàn)使用此架構(gòu)可以提高15%訓(xùn)練速度,在8B模型上對性能稍有損害,在62B模型上則基本沒有影響。 04位置編碼
由于自注意力無法區(qū)分輸入詞元間的位置關(guān)系,位置編碼是 Transformer 架構(gòu)的重要組成部分,其外推能力也決定了模型能處理的序列長度。
經(jīng)典 Transformer 使用不可學(xué)習(xí)的余弦編碼,加在模型底層的詞向量輸入上。GPT、BERT將其改為可學(xué)習(xí)的絕對位置編碼,并沿用到了RoBERTa、BART、GPT-2、GPT-3等經(jīng)典模型。Transformer-XL 與 XLNet 使用相對位置編碼,根據(jù)自注意力中 k 與 q 的相對位置關(guān)系將對應(yīng)可學(xué)習(xí)的向量加在 k 上,而 T5 則對此做了簡化,將每個(gè)相對位置的編碼作為可學(xué)習(xí)的標(biāo)量加在 k 與 q 的點(diǎn)積結(jié)果上。
RoPE(Rotary Position Embedding)與 ALiBi(Attention with Linear Biases)是兩種最新的位置編碼技術(shù)。RoPE 將 q 與 k 乘以分塊對角旋轉(zhuǎn)矩陣來注入位置信息:
圖源 RoPE 論文,圖中 m 為位置下標(biāo)。PaLM、LLaMA 等主流大模型都采用了 RoPE。
而 ALiBi 直接對注意力矩陣進(jìn)行先行衰減:
圖源 ALiBi 論文。BLOOM 使用 ALiBi 作為位置編碼。
05MQA、GQA、FlashAttention
Transformer 架構(gòu)的一大挑戰(zhàn)是自注意力關(guān)于輸入序列長度的平方復(fù)雜度。許多工作通過近似方法來模擬自注意力并同時(shí)降低復(fù)雜度,如 Sparse Transformer, Reformer, Longformer, Linformer, Performer, Sinkformer, cosFormer, Sliceformer 等,但這些方法都沒有在大模型上得到測試。另外,這些方法有很多的出發(fā)點(diǎn)是序列長度與隱藏層緯度的關(guān)系 n<
因此,大模型中針對自注意力的加速優(yōu)化通常出發(fā)點(diǎn)并不是注意力的計(jì)算過程,而是硬件的讀寫。MQA 就是基于此思想,在多頭自注意力中讓不同頭之間共享 K 與 V,而每個(gè)頭保留自己的 Q。此優(yōu)化對訓(xùn)練速度幾乎無影響,而對推理速度則直接提升 h 倍(h為注意力頭數(shù),如 BERT-large 為 16,GPT-3 175B為96)。此加速的來源是推理階段所有詞元需要自回歸生成,而在生成過程中每一步的計(jì)算都涉及此前所有詞元的 q 與 k。將這些 q 與 k從顯存加載到GPU計(jì)算核心的過程構(gòu)成了性能瓶頸。
至于GQA則顧名思義,是MHA與MQA的中間產(chǎn)品:
圖源GQA論文。
在主流大模型中,PaLM 使用 MQA,而 LLaMA 2 及其變體 Code LLaMA 使用 GQA。
另一相關(guān)技術(shù)是FlashAttention。該技術(shù)通過分布式計(jì)算中的 tiling 技術(shù)對注意力矩陣的計(jì)算進(jìn)行優(yōu)化。值得注意的是,與其他優(yōu)化技術(shù)不同,F(xiàn)lashAttention 并不是近似方法,不會(huì)改變計(jì)算結(jié)果。
代碼模型 我們將代碼模型按預(yù)訓(xùn)練領(lǐng)域分為通用大模型、代碼加訓(xùn)大模型及在代碼上從零開始預(yù)訓(xùn)練的專業(yè)模型,并將最后一類按模型架構(gòu)分為 Transformer encoder、decoder、encoder-decoder以及 UniLM,同時(shí)也特別關(guān)注了今年出現(xiàn)的在代碼上進(jìn)行指令微調(diào)、利用編譯器反饋進(jìn)行強(qiáng)化學(xué)習(xí)的工作,以及將語法樹、數(shù)據(jù)流等程序特有特征融入模型中的工作:
01通用大模型與加訓(xùn)大模型
提起代碼大模型,大部分人最熟悉的就當(dāng)數(shù) Codex 了。Codex 是基于 GPT-3 在 Python 數(shù)據(jù)上進(jìn)行了 100B 詞元自監(jiān)督加訓(xùn)獲得的模型。與 Codex 類似的還有對 PaLM 做了 39B 詞元加訓(xùn)的 PaLM Coder,以及對 LLaMA 2做了超過 500B 詞元加訓(xùn)的 Code LLaMA。
當(dāng)然,大模型并不一定需要加訓(xùn)才能處理代碼。如今的大模型預(yù)訓(xùn)練數(shù)據(jù)量動(dòng)輒數(shù)萬億詞元,其中就經(jīng)常包括代碼。例如,最常用的公開預(yù)訓(xùn)練數(shù)據(jù)集之一Pile就包括了95GB的代碼,而BLOOM的預(yù)訓(xùn)練數(shù)據(jù)集ROOTS也包括了163GB、13種編程語言的代碼。
通用大模型在HumanEval與MBPP上的性能:
02代碼專用模型
自從GPT、BERT掀起預(yù)訓(xùn)練模型熱潮后,軟件工程領(lǐng)域就已有不少工作在代碼上復(fù)現(xiàn)了這些模型。
與此前綜述不同,我們不僅關(guān)注各模型的訓(xùn)練目標(biāo)與數(shù)據(jù)等高層設(shè)計(jì),也詳細(xì)討論了包括位置編碼、注意力實(shí)現(xiàn)在內(nèi)的技術(shù)細(xì)節(jié),并總結(jié)進(jìn)一圖概覽供大家查閱:
Encoder
CodeBERT 是軟工領(lǐng)域最有影響力的模型之一。它從 RoBERTa 初始化,用 MLM+RTD(RTD 是 ELECTRA 的預(yù)訓(xùn)練目標(biāo) Replaced Token Detection)的目標(biāo)在代碼上進(jìn)行了訓(xùn)練。從上表可以看出,此后的多個(gè) encoder 代碼模型,包括 GraphCodeBERT, SynCoBERT, Code-MVP,都是基于 CodeBERT 開發(fā)。
在 NLP 中,BERT 預(yù)訓(xùn)練時(shí)還使用了 NSP(Next-Sentence Prediction)任務(wù)。雖然以 RoBERTa 為代表的后期工作大都認(rèn)為該任務(wù)并沒有幫助,但該任務(wù)的格式也為 encoder 預(yù)訓(xùn)練開拓了思路,在代碼模型中催生出了很多變種。由于代碼不同于自然語言,可以通過自動(dòng)化方法抽取抽象語法樹(AST)及注釋等伴隨特征,以 NSP 的格式進(jìn)行對比學(xué)習(xí)成了一種常見方法。SynCoBERT 在代碼-AST,注釋-代碼-AST等不同特征之間進(jìn)行對比學(xué)習(xí),DISCO則分別使用bug注入和保持語義的變換來構(gòu)建正負(fù)樣本,而Code-MVP則還額外加入了控制流(CFG)信息。
Decoder
說起 decoder,大家第一個(gè)想到的當(dāng)然就是 GPT 模式的自回歸預(yù)訓(xùn)練了。確實(shí),自從2020年以來已經(jīng)出現(xiàn)了包括 GPT-C, CodeGPT, PolyCoder, CodeGen, PyCodeGPT, PanGu-Coder, CodeGeeX, Phi-1, CodeFuse, CodeShell, DeepSeek Coder 在內(nèi)的眾多自回歸 decoder,大小從 100M 到 16B 不等。
但是,以 InCoder、FIM、SantaCoder、StarCoder 為代表的部分工作也探索了使用非傳統(tǒng)自回歸目標(biāo)來訓(xùn)練 decoder 的可能。這些工作首先將輸入數(shù)據(jù)轉(zhuǎn)換為填空的形式:將整段輸入隨機(jī)切分為前綴-中部-后綴三段,并將其重新排序?yàn)榍熬Y-后綴-中部(PSM 格式)或后綴-前綴-中部(SPM 格式),然后再將數(shù)據(jù)送進(jìn)模型進(jìn)行自回歸訓(xùn)練。需要注意的是,在數(shù)據(jù)轉(zhuǎn)換之后三段都參與自回歸預(yù)訓(xùn)練。
Encoder-Decoder
在 NLP 中,以 BART 與 T5 為代表的 encoder-decoder 模型即使在如今的大模型時(shí)代也仍占據(jù)著一席之地,代碼處理自然也少不了它們的身影。
由于編碼器-解碼器架構(gòu)能夠天然處理序列到序列建模問題,因此在代碼模型的訓(xùn)練過程中除了 BART 的 DAE(Denoising Auto-Encoding)與 T5 的 Span Corruption 這兩個(gè)標(biāo)準(zhǔn)任務(wù),許多代碼特有的特征也被用來進(jìn)行序列到序列的預(yù)訓(xùn)練學(xué)習(xí)。例如 DOBF 就是用反混淆任務(wù),來訓(xùn)練模型將混淆后的代碼轉(zhuǎn)換為原始代碼。類似的,NatGen 提出了“自然化”任務(wù),從人工轉(zhuǎn)換產(chǎn)生的非自然代碼來復(fù)原原始代碼。
標(biāo)識符預(yù)測也是代碼預(yù)訓(xùn)練中的另一常見的任務(wù)。CodeT5 以序列標(biāo)注的形式來在預(yù)訓(xùn)練過程中學(xué)習(xí)每個(gè)詞元是否為標(biāo)識符,而 SPT-Code 則直接以序列到序列生成的形式來預(yù)測方法名。
此外,隨著 NLP 中 UL2 將自回歸預(yù)訓(xùn)練與去噪預(yù)訓(xùn)練統(tǒng)一到了 encoder-decoder 架構(gòu)下,最新的 encoder-decoder 代碼模型 CodeT5+ 也采用了類似的預(yù)訓(xùn)練方式。
03指令微調(diào)與強(qiáng)化學(xué)習(xí)
在 NLP 中,指令微調(diào)(instruction finetuning)與人類反饋強(qiáng)化學(xué)習(xí)(RLHF)在 ChatGPT 等對話模型的人類對齊過程中起到了必不可少的作用。指令微調(diào)通過在多樣的指令數(shù)據(jù)集上訓(xùn)練模型來解鎖跨任務(wù)泛化的能力,而強(qiáng)化學(xué)習(xí)則通過獎(jiǎng)勵(lì)模型的自動(dòng)化反饋來訓(xùn)練模型向人類的偏好(如幫助性 Helpfulness,以及安全性 Safety 等)對齊。
這兩項(xiàng)技術(shù)也在代碼處理中得到了應(yīng)用。WizardCoder 與 PanGu-Coder 2 都使用 NLP 中 WizardLM 模型提出的 Evol-Instruct 方法,用 ChatGPT 等模型來從現(xiàn)有的指令數(shù)據(jù)中進(jìn)化出更多樣的指令集,并用生成的指令來微調(diào) StarCoder。OctoCoder 與 OctoGeeX 則沒有使用大模型生成的指令,而是使用了 GitHub 上的 commit 記錄及前后代碼來作為指令微調(diào) StarCoder 與 CodeGeeX。最近,螞蟻集團(tuán)開源的 MFTCoder 框架還在指令數(shù)據(jù)中顯式加入了多種下游任務(wù),來定點(diǎn)提升微調(diào)模型在這些任務(wù)上的性能。
而在強(qiáng)化學(xué)習(xí)方面,代碼處理相較自然語言處理存在著天然優(yōu)勢 - 編譯器可以代替人類來自動(dòng)化地生成精準(zhǔn)的反饋。CompCoder、CodeRL、PPOCoder、RLTF 等工作就利用了這一特性來微調(diào) CodeGPT 或 CodeT5,PanGu-Coder 2 也將強(qiáng)化學(xué)習(xí)應(yīng)用在了更大的 StarCoder 中。
下游任務(wù) 隨著以 Codex 為代表的代碼大模型的興起,根據(jù)自然語言描述生成相應(yīng)代碼的代碼生成任務(wù)成了大模型關(guān)注的重點(diǎn),HumanEval 也成為了最新大模型必測的基準(zhǔn):
但除了代碼生成,我們也整理了其他30個(gè) SE 下游任務(wù):
SQL 生成:從自然語言查詢生成 SQL 語句
數(shù)學(xué)編程:通過生成代碼來解決 GSM8K 等數(shù)學(xué)任務(wù)
代碼檢索:從現(xiàn)有代碼池中匹配與自然語言查詢最匹配的代碼
代碼搜索:從現(xiàn)有代碼池中匹配與輸入代碼具有相同或相似功能的代碼
代碼補(bǔ)全:根據(jù)代碼片段補(bǔ)全其余部分,常用于 IDE 插件
代碼翻譯:將代碼從一種編程語言翻譯到另一種編程語言
代碼修復(fù):修復(fù)代碼中的bug
代碼填充:類似代碼補(bǔ)全,但可以參考兩邊而不僅是單邊的上下文
代碼去混淆:從混淆(即改變了標(biāo)識符名稱)的代碼中復(fù)原出原始代碼
軟件測試相關(guān)任務(wù):單元測試生成,斷言生成,變種生成,測試輸入生成,代碼評估
類預(yù)測:預(yù)測動(dòng)態(tài)編程語言(如Python)代碼中變量類型或函數(shù)參數(shù)、返回值的類型
代碼摘要:為代碼生成相應(yīng)的自然語言解釋或文檔
標(biāo)識符預(yù)測:預(yù)測代碼中有意義的標(biāo)識符(變量、函數(shù)、類等)名字
缺陷檢測:檢測輸入代碼是否存在缺陷或漏洞
克隆檢測:檢測兩段輸入代碼是否語義相等
代碼推理:以問答的形式評估大模型對代碼相關(guān)知識(如代碼功能、概念、算法等)的掌握
代碼分類:在事先定義好的類別中判斷代碼的功能,也可以是判斷代碼的作者
文檔翻譯:將代碼相關(guān)文檔從一種自然語言翻譯到另一種自然語言
記錄分析:對軟件系統(tǒng)運(yùn)行過程中產(chǎn)生的記錄進(jìn)行分析,輸出形式化的表格或自動(dòng)檢測問題所在
在論文中,我們也羅列了部分任務(wù)的現(xiàn)有標(biāo)準(zhǔn)數(shù)據(jù)集:
這些數(shù)據(jù)集的網(wǎng)址鏈接都在 GitHub repo 中給出,而其他任務(wù),尤其是單元測試生成、斷言生成、代碼反混淆等軟件測試相關(guān)任務(wù),目前還沒有大規(guī)模的標(biāo)準(zhǔn)數(shù)據(jù)集,大語言模型在其中的應(yīng)用也較少,是 NLP 與 SE 未來工作可以重點(diǎn)考慮的方向。
機(jī)遇挑戰(zhàn) 不久之前,Github Universe 2023上,微軟發(fā)布了一些 GitHub Copilot 的更新,包括 Copilot Workspace 這種引領(lǐng)業(yè)界前沿的工作:從一個(gè) Issue 開始,在軟件研發(fā)的整個(gè)生命周期做到倉庫級別的需求實(shí)現(xiàn)、測試、構(gòu)建等迭代。這也給了我們很大的啟發(fā)?;谇懊娴姆治龊拖嚓P(guān)先驅(qū)探索的啟發(fā),本文的最后也總結(jié)了在軟件工程中應(yīng)用語言模型的當(dāng)下挑戰(zhàn):
構(gòu)建更真實(shí)的評估基準(zhǔn),來替代以幾乎被刷爆的 HumanEval
獲取更高質(zhì)量的數(shù)據(jù),以及對 Phi-1 等模型“用 AI 數(shù)據(jù)訓(xùn)練 AI”的理解與反思
將抽象語法樹、數(shù)據(jù)流、控制流等代碼獨(dú)有且可以自動(dòng)獲取的特征無縫銜接進(jìn)大語言模型
在更多 SE 下游任務(wù),尤其是軟件測試相關(guān)任務(wù)中應(yīng)用大語言模型
非傳統(tǒng)的模型架構(gòu)及訓(xùn)練目標(biāo),如在以微軟 CodeFusion 為代表的 Diffusion 模型等
圍繞大語言模型為軟件開發(fā)全過程構(gòu)建生態(tài)系統(tǒng),打破當(dāng)下大模型大都作為 IDE 插件的局限
對大模型生成代碼進(jìn)行更好的監(jiān)控與管理,規(guī)避相關(guān)風(fēng)險(xiǎn) ?
-
編碼
+關(guān)注
關(guān)注
6文章
932瀏覽量
54731 -
語言模型
+關(guān)注
關(guān)注
0文章
501瀏覽量
10236 -
大模型
+關(guān)注
關(guān)注
2文章
2276瀏覽量
2359
原文標(biāo)題:500篇論文!最全代碼大模型綜述
文章出處:【微信號:zenRRan,微信公眾號:深度學(xué)習(xí)自然語言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論