?對于NL2Code任務(wù)相信大家都不陌生。它主要目的就是將自然語言轉(zhuǎn)換成可執(zhí)行代碼來提高開發(fā)人員的工作效率,終極目標就是干翻所有程序員,最近,隨著大模型的出現(xiàn),距離這一天又稍稍進了一步?;谠摫尘?,分享中科院在ACL2023國際頂會上一篇文章:他們調(diào)研了NL2Code領(lǐng)域中的「27個大型語言模型以及相關(guān)評價指標」,分析了「LLMs的成功在于模型參數(shù)、數(shù)據(jù)質(zhì)量和專家調(diào)優(yōu)」,并指出了「NL2Code領(lǐng)域研究的5個機遇挑戰(zhàn)」,最后作者建立了一個分享網(wǎng)站來跟蹤LLMs在NL2Code任務(wù)上的最新進展。https://nl2code.github.io
?新手程序員,甚至是那些沒有任何編程經(jīng)驗的程序員,是否有可能僅僅通過用自然語言描述他們的需求來創(chuàng)建軟件?實現(xiàn)這一設(shè)想將對我們的生活、教育、經(jīng)濟和勞動力市場產(chǎn)生前所未有的影響。自然語言-代碼(NL2Code)因其廣闊的應(yīng)用場景,是一項重要的研究任務(wù),在學(xué)術(shù)界和工業(yè)界都引起了廣泛的興趣。
?關(guān)于NL2Code的發(fā)展,其實和自然語言理解的發(fā)展類似,一開始,基本都是基于專家規(guī)則進行算法設(shè)計,但是此類方法需要對不同編程語言進行設(shè)計,泛化性差;隨著技術(shù)發(fā)展,人們逐步開始使用靜態(tài)語言模型,并使用向量空間來描述文字,此類方法在初期一般向量空間比較稀疏,不能建立長期的依賴關(guān)系;再后來,就用到了我們比較熟悉的神經(jīng)網(wǎng)絡(luò),例如CNN、RNN、LSTM,此類方法通過標記數(shù)據(jù)進行訓(xùn)練來構(gòu)建自然語言(NL)和代碼(Code)之間的關(guān)系,但實際效果對NL2Code任務(wù)的能力有限;現(xiàn)在,在ChatGPT風(fēng)靡全球的背景下,越來越多的大型語言模型(LLMs)如雨后春筍一樣出現(xiàn),通過語言指令,它們可以在零樣本狀況下生成代碼,并在NL2Code任務(wù)上中取到了驚人的成績。具有標志性的一個LLM模型就是Codex,它擁有120億個參數(shù),在Python編程任務(wù)上測試,可解決72.31%的問題,并且該模型已經(jīng)商用可在實踐中提高開發(fā)人員的工作效率。
?對于NL2Code任務(wù),其主要目的是基于給定自然語言問題描述生成所需要的代碼。以下是一個關(guān)于Python編程問題的示例。其中灰色塊部分表示問題描述,綠色塊部分表示模型生成代碼,黃色塊部分表示測試樣例。
?上面總結(jié)了NL2Code現(xiàn)有的大型語言模型(LLMs),但是這些模型在架構(gòu)、模型規(guī)模等方面各不相同,無法進行統(tǒng)一的評估。為此,作者在HumanEval基準上進行了Zero-shot統(tǒng)一評估,其中HumanEval基準由164個手寫的Python編程問題組成,對于每個編程問題都提供了測試用例,以評估生成代碼正確性。使用pass@k作為評估指標,即通過k次嘗試可以正確回答的問題的比例。下表顯示根據(jù)模型大小進行分組,在該測試集上的測試結(jié)果。
?根據(jù)前面的整理用于NL2Code的LLMs時間發(fā)展圖可以發(fā)現(xiàn),只要模型參數(shù)越多性能就越好。為了進一步說明模型參數(shù)大小和模型效果之間的關(guān)系,作者整理了10個比較有代表性的模型,在HumanEval基準上的pass@1結(jié)果,如下圖所示:
?隨著LLMs模型參數(shù)的增加,其訓(xùn)練數(shù)據(jù)規(guī)模也在不斷的增加。這在數(shù)據(jù)選擇和預(yù)處理方面也有更高的要求。早期的模型,例如CodeSearchNet、CoST、XLCoST等都是基于人工標注數(shù)據(jù)對進行訓(xùn)練(耗時耗力);GPT系列模型(GPT-3 、GPT-Neo、GPT-J )開始在大規(guī)模無監(jiān)督數(shù)據(jù)集上進行訓(xùn)練,但是由于代碼數(shù)據(jù)限制,并沒有顯示出很強的代碼生成能力。由于LLMs模型的出現(xiàn),它們可以在更大規(guī)模的未標記代碼數(shù)據(jù)集上進行訓(xùn)練,最終模型效果驚人。
?在驚嘆于LLMs效果的同時,也要知道LLMs在訓(xùn)練之前通常會對數(shù)據(jù)進行預(yù)處理。為此作者調(diào)研了Codex、AlphaCode、CodeGen、InCoder和PyCodeGPT等5個強大模型的數(shù)據(jù)預(yù)處理方法。發(fā)現(xiàn)它們具有幾個共同的特點:一是刪除可能自動生成或未完成的代碼文件,二是使用特定的規(guī)則來過濾不常見的代碼文件。「總之,這些預(yù)處理策略的目標是實現(xiàn)一個不重復(fù)的、完整的、正確的、干凈的和通用的代碼語料庫」。
?訓(xùn)練一個優(yōu)秀的模型需要認真考慮模型訓(xùn)練階段的各個參數(shù)。通過對27個LLMs模型的研究發(fā)現(xiàn),它們都有一些共同的設(shè)置,比如都應(yīng)用了Adam相關(guān)優(yōu)化器并在初始化階段相差不大。除此之外,還有需要調(diào)節(jié)的超參數(shù),如lr、batch、窗口大小、預(yù)熱、梯度累積和temperature。對于學(xué)習(xí)率來說,隨著模型的增大,學(xué)習(xí)率會逐步變小。如下圖所示:
?「對NL2Code任務(wù)的評估,高質(zhì)量的基準和可靠的度量是基礎(chǔ)和必要的」。作者總結(jié)了17個NL2Code基準測試,每個基準測試在大小、語言、復(fù)雜性和場景方面都有自己的特點,如下表所示。
?大預(yù)言模型在NL2Code的應(yīng)用對學(xué)術(shù)界和工業(yè)界都有相當(dāng)大的影響。雖然取得了驚人的進展,但仍然有很多挑戰(zhàn)需求解決,這也為研究人員提供了充足的機會。下面作者總結(jié)了 NL2Code任務(wù)的五個挑戰(zhàn)和機會。
「1、理解能力」:人類能夠理解不同抽象層次的各種描述, 相比之下,當(dāng)前的 LLM 往往對給定的上下文敏感,這可能會導(dǎo)致性能下降。作者認為探索LLM的理解能力是一個重要的研究方向。
「2、判斷能力」:人類能夠判定一個編程問題是否被解決。當(dāng)前模型不論輸入什么都會給出答案,而且該答案正確與否都不能確定,這在實際應(yīng)用中會存在一定的問題。目前為了提高LLM的判斷能力,需要根據(jù)用戶反饋采用強化學(xué)習(xí)的方式進行調(diào)優(yōu)。作者認為探索LLM自我判斷能力,也是一個比較重要的研究方向。
「3、解釋能力」:人類開發(fā)人員能夠解釋他們編寫的代碼,這對教育的和軟件維護至關(guān)重要。最近的研究表明,LLM 具有自動生成代碼解釋的潛力。作者認為針對該能力也需要進一步的研究和探索,以充分發(fā)揮LLM在這方面的潛力。
「4、自適應(yīng)能力」:當(dāng)前的大型語言模型與人類之間的一個根本區(qū)別是它們適應(yīng)新知識和更新知識的能力。人類開發(fā)人員能夠根據(jù)文檔資料實現(xiàn)API的快速開發(fā),而LLM需要大量的知識和訓(xùn)練。作者認為如何提高LLM快速自學(xué)習(xí)能力也是一個比較大挑戰(zhàn)。
「5、多任務(wù)處理能力」:LLM在多任務(wù)處理方面與人類存在較大差異。人類可以在任務(wù)之間無縫切換,而LLM可能需要復(fù)雜的提示工程。為此作者任務(wù)提升LLM多任務(wù)能力同樣是一個重要的研究方向。
[3]一文了解大型語言模型的上下文學(xué)習(xí)能力(ICL)
[4]大型語言模型落地對話系統(tǒng),該從哪些方面入手?
[5]中文通用開源指令數(shù)據(jù)集(COIG):數(shù)據(jù)多樣,質(zhì)量高
[6]MPT-7B:可商用的開源模型,效果堪比LLaMA-7B