如何獲取高質量數據進行代碼指令調優?
之前很多研究都是生成、發現、過濾高質量的通用指令微調數據,而大家對代碼任務的越發關注,如何構建更好的代碼指令調整數據也越發重要。
下面給大家帶來一篇篩選高質量代碼指令微調數據的文章,主要基于指令的復雜性、回復質量和指令的多樣性三個維度來進行樣本的篩選,同時也指出了當前部分代碼指令數據在HumanEval上存在嚴重的數據泄露。
Paper: https://arxiv.org/abs/2409.03810
Github: https://github.com/banksy23/XCoder
Data-HF: https://huggingface.co/datasets/banksy235/XCoder-80K
數據篩選
數據篩選過程主要從三個維度(指令復雜性、響應質量和指令多樣性)從數據池中選擇樣本。
對于一個數據池 ,首先使用復雜性評分器 和單元測試模型 來計算每個數據的復雜性評分 和質量評分 。然后,對復雜性評分和質量評分進行歸一化得到 和 ,經過線性組合后,得到整體評分 ,最后將數據池 進行排序,并根據多樣性進行迭代采樣,直到篩選數據集 達到預計大小為止,算法流程如下圖所示。
- 復雜性評分器:利用self-instruct方法獲取一個小規模的種子數據 ,然后根據WizardCoder方法進行提示詞 次深度進化,產生 輪次數據,將輪次是為復雜性的度量值,訓練復雜性評分器。
- 單元測試模型:代碼通過測試用例數量可以作為響應質量的度量,利用6k數據訓練LLaMA3-70B-Base模型來作為單元測試模型。在測試過程中,單元測試模型為每個訓練樣本生成12個測試用例,并執行單元測試程序,將通過的測試用例數量作為質量評分。
- 多樣性采樣:迭代式從數據池中選擇樣本 ,當該樣本對數據集 多樣性做成貢獻時,填入數據集 。樣本 的多樣性的貢獻采用 表示,當 為真時,值等于1,被填入數據集 。 為樣本 與 中最近樣本之間的嵌入距離,τ
效果分析
為了構建最佳的代碼指令微調數據集,收集了各種可用的開源數據集,共2.5M樣本。優于數據池過大,經過以下步驟過濾、去重,最終獲得336K樣本。
- 選取學術工作數據集:Magicoder-OSS-Instruct、Magicoder-Evol-Instruct和Code-Feedback
- 選擇了長度最長的200K個樣本
- 選擇復雜性評分最高的200K個樣本
- 去重
LLaMA3-8B-Base上采用Xcoder數據進行了實驗,如下表所示,在僅使用40K數據在LiveCodeBench和BigCodeBench上就取得了優于基線的性能;增加到80K數據時,指標持續提高。
基于LLaMA3-70B-Base在Xcoder數據上訓練了XCoder-70B模型,成為效果最佳的開源的代碼大模型。
HumanEval上不是最優,是因為Magicoder-Evol-Instruct和Codefuse-Evol-Instruct數據在HumanEval存在數據泄露情況。
并提出了TLI(測試泄露指標)來量化訓練集對測試集泄露數據程度。主要對兩個數據集生成n-gram片段,并測量每個測試樣本的n-gram片段與所有訓練樣本的n-gram片段之間的重疊情況,其中,測試樣本中的公共n-gram片段個數與測試樣本中的總n-gram片段個數的比率作為測試樣本 與訓練樣本 之間的相似度分數。所有測試集中的相似度分數的平均值作為TLI值,其中,TLI值越高,泄露風險越大。
消融實驗,三個維度的指標對于最終數據的選擇均有益。
針對復雜性評估,可以發現雜性評分器 > 指令長度 > 困惑度 > 隨機。
針對單元測試模型,可以發現訓練的Llama3-70模型由于GPT4模型。
并且Xcoder選擇10K數據的訓練效果,就堪比隨機選擇160K數據效果。
同時,分析了XCoder的數據組成,重新評估了不同數據源的優勢和劣勢。
寫在最后
大模型發展到現在,合成數據的重要性不言而喻,但需要我們注意的一點是,如果一味的增加低質量數據或模式固定的單一數據,除了增加模型訓練時間外,毫無用處,甚至會帶來模型過擬合等負面影響。
因此,大模型在微調過程中,無論是通用任務、還是代碼任務,對數據進行多樣性、質量的選擇是有必要的,也許提分就在這毫厘之間。
本文轉載自 ??NLP工作站??,作者: 劉聰NLP
