英文名稱: Code Llama: Open Foundation Models for Code
中文名稱: Code Llama:開放基礎代碼模型
鏈接: https://arxiv.org/abs/2308.12950
代碼: https://github.com/facebookresearch/codellama
作者: Baptiste Rozière, Jonas Gehring, Fabian Gloeckle, Sten Sootla, Itai Gat, Xiaoqing Ellen Tan, Yossi Adi, Jingyu Liu, Romain Sauvestre, Tal Remez, Jérémy Rapin, Artyom Kozhevnikov, Ivan Evtimov, Joanna Bitton, Manish Bhatt, Cristian Canton Ferrer, Aaron Grattafiori, Wenhan Xiong, Alexandre Défossez, Jade Copet, Faisal Azhar, Hugo Touvron, Louis Martin, Nicolas Usunier, Thomas Scialom, Gabriel Synnaeve
機構: Meta AI
日期: 2023-08-24
引用次數: 319
1 讀后感
Code Llama 是一個基于 llama2 模型進行訓練得到的代碼生成大模型。又針對代碼填充、長上下文等特殊條件以及人類通常用法進行了優化,因此它集成了 llama2 對自然語言的理解,并針對代碼生成場景進行了優化。
除了調用推理,我們一般主要利用微調模型來進行改進模型效果,因此選擇一個好的基礎模型作為工作基礎非常重要,Code Llama 是當前代碼生成模型中比較推薦的基礎模型。
論文結構針對幾項主要貢獻進行了層層深入的討論。在整理時,我把實現部分歸納了一下,把同一主題的內容放在一起了。
2 摘要
目標:發布 Code Llama 代碼模型系列,基于 Llama 2 開發,提供了在開放模型中最先進的性能、填充能力、支持大型輸入上下文,并具有 zero-shot 指令跟隨能力,用于編程任務。
方法:提供多個版本以覆蓋各種應用場景:基礎模型(Code Llama)、Python 專業化模型(Code Llama-Python)和指令引導模型(Code Llama-Instruct),分別具有 7B、13B 和 34B 參數。
結論:這些模型在性能、填充能力、支持大型輸入上下文以及 zero-shot 指令跟隨能力方面表現出色。
3 引言
主要貢獻
- 基于 llama2 訓練:所有 Code Llama 模型都使用 Llama2 模型權重進行初始化,實驗證明它優于僅在代碼上訓練的相同架構。
- 代碼填充:生成代碼時,需要考慮整個周圍上下文的同時填充代碼的缺失部分,因此通過多任務目標訓練模型,包括自回歸和因果填充預測。
- 長上下文:將最大上下文長度從 4,096 token 擴展到 100,000 個 token。
- 指令微調:在專有 Instruct 數據的混合上進行了進一步微調,以提高安全性和實用性。
4 Code Llama 實現
4.1 發布了三個版本
- Code Llama:基礎模型。
- Code Llama - Python:用于 Python 版本。
- Code Llama - Instruct:引導微調版本。
4.2 訓練數據
從 Llama 2 的 7B、13B 和 34B 版本開始,在初始階段使用 500B token 訓練 Code Llama。
4.3 代碼填充
代碼填充的目標是在給定周圍上下文情況下預測程序缺失部分。
使用因果掩蔽的概念來訓練填充模型。將字符級別的訓練文檔拆分為前綴、中間部分和后綴,拆分位置獨立于文檔長度上的均勻分布進行采樣。
4.4 長上下文微調
提出了一個專用的長上下文微調(LCFT)階段,模型支持 16,384 個 token 的序列,高于 Llama 2 和初始代碼訓練階段使用的 4,096 個 token。對旋轉位置嵌入進行優化,將基周期從 10,000 增加到 1,000,000 以進行微調。使模型支持處理更大的序列,并減少短距離注意力的傾向。
4.5 指令微調
使用三種不同類型的數據訓練:
4.5.1 專有數據集
使用 Llama 2 論文中的指令調整數據集 “RLHF V5” 微調模型,通過人類反饋和人類反饋注釋的強化學習的幾個階段收集,它結合了數以千計的監督微調示例,每個示例都包含用戶和工具之間的多輪對話。
4.5.2 自我指導
專有數據集包含幾個與代碼相關的任務示例。
使用執行反饋來選擇數據來訓練我們的指令模型,而不是人工反饋。我們按照以下方法構建自學數據集,得到約 14,000 個問題 - 測試 - 解決方案三元組。
- 通過提示生成 62,000 個訪談式編程問題 Llama 2 70B。詳見附錄中圖 -9。
- 通過刪除完全重復的問題來消除重復問題集,從而產生約 52,000 個問題。
- 對于每個問題:
- 通過提示 Code Llama 7B 生成單元測試(圖 10 中包含提示)。
- 通過提示 Code Llama 7B 生成 10 個 Python 解決方案(圖 11)。
- 對十個解決方案運行單元測試。將通過測試的第一個解決方案(及其相應的問題和測試)添加到自指導數據集。
我們使用 Code Llama 7B 來生成測試和 Python 解決方案,因為作者發現,在相同的計算預算下,它比使用 34B 模型為每個問題生成更少的解決方案更有效。
4.5.3 排演
為了防止模型在一般編碼和語言理解能力上倒退,Code Llama - Instruct 還使用來自代碼數據集(6%)和自然語言數據集(2%)的一小部分數據進行訓練。
4.6 訓練方法
具體參數請見論文原文:Training details 部分。
4.7 結果
主實驗結果如下,后面還有一些消融實驗,用于展示文中幾種優化的具體效果。
5 相關工作
相關工作中列出了其它主流的代碼生成工具,也可以看一下。