天天看點

重新整理20項代碼任務SOTA,新型基礎LLM系列編碼器-解碼器Code T5+

作者:機器之心Pro

機器之心報道

機器之心編輯部

大型語言模型 (LLMs) 最近在代碼層面的一系列下遊任務中表現十分出彩。通過對大量基于代碼的資料 (如 GitHub 公共資料) 進行預訓練,LLM 可以學習豐富的上下文表征,這些表征可以遷移到各種與代碼相關的下遊任務。但是,許多現有的模型隻能在一部分任務中表現良好,這可能是架構和預訓練任務限制造成的。

從架構的角度來看,現有的 LLMs 通常采用純編碼器或純解碼器的模型,這些模型通常隻在一些了解或生成任務上執行的效果出色。純編碼模型通常适用于了解文本、代碼檢索之類的任務,而生成代碼類的生成任務用純解碼器模型能有更出色的性能表現。并且,最近的一些模型用編碼器 - 解碼器這種更統一的架構來應對不同的任務。雖然這些模型可以同時支援了解型、生成型任務,但在特定任務中沒法達到最佳性能。在檢索和代碼完成任務上,編碼器 - 解碼器模型還是不如最先進 (SOTA) 的純編碼器和純解碼器基線。單子產品架構雖然通常可以适用于所有任務,但它的局限性也會導緻編碼器 - 解碼器模型的不足。總之,先前的方法在設計時并沒有考慮如何讓單個元件可以被激活以更好地适應不同類型的下遊任務。

從學習對象的角度來看,目前的模型通常采用一組有限的預訓練任務。由于預訓練和微調階段的差異,這些預訓練任務會使一些下遊任務性能下降。例如,基于 T5 的模型通常以跨度去噪目标進行訓練。然而,在代碼生成等下遊任務中,大多數最先進的模型都是用下一個 token 預測目标進行預訓練的,該目标可以逐 token 自回歸地預測處理。學習對比代碼表征對于了解文本、代碼檢索等任務至關重要,但許多模型沒有接受過這一方面訓練。盡管近期一些研究嘗試引入對比學習任務來緩解這個問題,但這些方法忽略了文本和代碼表征之間的細粒度跨模态對齊。

為解決上述限制,來自 Salesforce 的研究者提出了「CodeT5+」—— 一個新的基礎 LLM 系列編碼器 - 解碼器,可用于廣泛的代碼了解和生成任務。

重新整理20項代碼任務SOTA,新型基礎LLM系列編碼器-解碼器Code T5+

論文位址:https://arxiv.org/pdf/2305.07922.pdf

項目位址:https://github.com/salesforce/CodeT5/tree/main/CodeT5%2B

CodeT5 + 是基于編碼器 - 解碼器的模型,但可以靈活地在純編碼器、純解碼器以及編碼器 - 解碼器模式下操作,來适應不同的下遊應用。總體架構如下圖 1:

重新整理20項代碼任務SOTA,新型基礎LLM系列編碼器-解碼器Code T5+

這種靈活性是基于預訓練任務實作的,包括代碼資料上的跨度去噪和因果語言模組化 (CLM) 任務,以及文本 - 代碼對比學習、比對和文本 - 代碼資料上的 CLM 任務。如此廣泛的預訓練任務可以幫助在代碼和文本資料中學習豐富的表征,并彌合各種應用中的預訓練 - 微調差距。研究者發現,将比對任務與對比學習相結合,對于捕捉細粒度的文本 - 代碼對齊和提高檢索性能至關重要。

通過利用現成的 LLM 代碼來初始化 CodeT5 + 的元件,用高效計算的預訓練政策來擴充 CodeT5 + 的模型大小。CodeT5 + 采用了「淺編碼器和深解碼器」架構,其中編碼器和解碼器都從預訓練的 checkpoints 中進行初始化,并由交叉注意力層連接配接。此外,該研究還當機了深度解碼器 LLM,隻訓練淺層編碼器和交叉注意力層,進而大大減少了有效調優的可訓練參數數量。最後,受 NLP 領域的啟發,研究者開始探索 CodeT5 + 在指令調優上的效果,以更好地使模型與自然語言指令保持一緻。

該研究在 20 多個與代碼相關的基準測試中對 CodeT5 + 進行了廣泛的評估,包括零樣本、微調和指令調優。結果表明,與 SOTA 基線相比,CodeT5 + 在許多下遊任務上有着實質性的性能提升,例如,8 個文本到代碼檢索任務 (+3.2 avg. MRR), 2 個行級代碼補全任務 (+2.1 avg. Exact Match) 和 2 個檢索增強代碼生成任務 (+5.8 avg. BLEU-4)。

在 MathQA 和 GSM8K 基準上的兩個數學程式設計任務中,低于十億參數大小的 CodeT5 + 模型明顯優于許多多達 137B 參數的 LLM。特别是,在 HumanEval 基準上的零樣本文本到代碼生成任務中,指令調優後的 CodeT5+ 16B 與其他開源代碼 LLM 相比,達到了新的 SOTA 結果,為 35.0% pass@1 和 54.5% pass@10,甚至超過了閉源 OpenAI code- cusherman -001 模型。最後,該研究發現 CodeT5 + 可以無縫的看作半參數檢索增強生成系統,在代碼生成方面明顯優于其他類似方法。所有的 CodeT5 + 模型都将開源,以支援研究和開發者社群。

CodeT5+:開源大型語言模型

本文開發了 CodeT5+,一個新的開源代碼大型語言模型家族,用于代碼了解和生成任務。基于編碼器 - 解碼器架構,CodeT5 + 通過本文提出的在單模态和雙模态資料上混合預訓練目标的方式,增強了在不同下遊任務中以不同模式運作的靈活性。

重新整理20項代碼任務SOTA,新型基礎LLM系列編碼器-解碼器Code T5+

架構細節

重新整理20項代碼任務SOTA,新型基礎LLM系列編碼器-解碼器Code T5+

預訓練細節

在單模态預訓練階段,研究者使用大量的代碼資料,用計算高效的目标預訓練模型。在雙模态預訓練階段,繼續用較小的具有跨模态學習目标的代碼 - 文本資料集預訓練模型。對于每個階段,使用相同的權重聯合優化多個預訓練目标。

研究者發現這種分階段訓練方法可以有效地讓模型接觸更多樣化的資料,以學習豐富的上下文表征。此外,他們探索了用現成的代碼 LLM 初始化 CodeT5+,以有效地擴充模型。最後,CodeT5 + 中的模型元件可以動态組合以适應不同的下遊應用任務。

實驗

研究者實作了一系列 CodeT5 + 模型,模型大小從 220M 到 16B 不等。

CodeT5+ 220M 和 770M 采用與 T5 相同的架構,并從頭開始進行預訓練,而 CodeT5+ 2B、6B、16B 采用「淺層編碼器和深層解碼器」架構,編碼器分别從 CodeGen-mono 350M 初始化,解碼器從 CodeGen-mono 2B、6B、16B 初始化。研究者将 CodeT5 + 與 SOTA 代碼模型進行了比較,這些 LLM 可以分為 3 種類型:純編碼器、純解碼器和編碼器 - 解碼器模型。

文本到代碼生成任務的零樣本評估

在給定自然語言規範的情況下,研究者評估了模型在零樣本設定下生成 Python 代碼的能力,通過在單元測試中測試生成的代碼來評估模型性能。表 2 中展示了合格率 pass@k。

重新整理20項代碼任務SOTA,新型基礎LLM系列編碼器-解碼器Code T5+

評估數學程式設計任務

研究者同時考察了其他代碼生成任務,特别是兩個數學程式設計基準 MathQAPython 和 GSM8K 。如表 3 所示,CodeT5 + 取得了顯著的性能提升,超過了許多更大規模的代碼 LLM。

重新整理20項代碼任務SOTA,新型基礎LLM系列編碼器-解碼器Code T5+

圖 6 展示了通過 MathQA-Python 上數學程式設計問題的複雜性來分析模型性能。對于每個問題,提取解決問題所需的推理步驟數。與 CodeT5 相比,CodeT5 + 對問題的複雜性 (即所需的推理步驟數量) 更魯棒。

重新整理20項代碼任務SOTA,新型基礎LLM系列編碼器-解碼器Code T5+

評估代碼摘要任務

代碼摘要任務旨在将代碼片段總結為自然語言文檔字元串。研究者使用了六種程式設計語言的 Clean 版本的 CodeSearchNet 資料集來評估這項任務的模型。

從表 4 中可以發現,編碼器 - 解碼器模型 (CodeT5 和 CodeT5+) 的性能通常優于純編碼器模型、純解碼器模型以及 UniLM-style 的模型 UniXcoder 。

重新整理20項代碼任務SOTA,新型基礎LLM系列編碼器-解碼器Code T5+

評估代碼補全任務

研究者通過 line-level 補全任務評估了 CodeT5 + 僅解碼器的生成能力,旨在根據上下文完成下一行代碼。

如表 5 所示,CodeT5+(在純解碼器的模式下) 和純解碼器模型 (top block) 的性能都明顯優于編碼器 - 解碼器模型(the middle block),驗證了純解碼器的模型可以更好地适應代碼補全任務。

重新整理20項代碼任務SOTA,新型基礎LLM系列編碼器-解碼器Code T5+

評估文本到代碼的檢索任務

研究者還通過跨多個 PL 的文本到代碼檢索任務評估 CodeT5 + 的代碼了解能力。

從表 6 中可以看出,CodeT5+ 220M 明顯優于所有現有的純編碼器 / 純解碼器模型 (頂部塊) 和編碼器 - 解碼器模型 (中間塊)。

重新整理20項代碼任務SOTA,新型基礎LLM系列編碼器-解碼器Code T5+

更多研究細節,可參考原論文。