116 lines
15 KiB
Markdown
116 lines
15 KiB
Markdown
# DeepSeek-Coder-V2:打破代码智能领域闭源模型的壁垒
|
||
|
||
> **原文标题**:DeepSeek-Coder-V2: Breaking the Barrier of Closed-Source Models in Code Intelligence
|
||
> **arXiv**:[2406.11931](https://arxiv.org/abs/2406.11931) | **发布**:17 Jun 2024
|
||
> **作者/机构**:Qihao Zhu、Daya Guo、Zhihong Shao、Dejian Yang 等(共同一作)+ DeepSeek(深度求索)
|
||
> **原文 PDF**:[02-DeepSeek-Coder-V2-2406.11931.pdf](./02-DeepSeek-Coder-V2-2406.11931.pdf)
|
||
|
||
## 一、摘要(全文翻译)
|
||
|
||
我们提出 DeepSeek-Coder-V2,一个开源的专家混合(Mixture-of-Experts, MoE)代码语言模型,在代码特定任务上取得了与 GPT4-Turbo 相当的性能。具体而言,DeepSeek-Coder-V2 是从 DeepSeek-V2 的一个中间检查点出发、使用额外 6 万亿 token 进一步预训练得到的。通过这一持续预训练,DeepSeek-Coder-V2 大幅增强了 DeepSeek-V2 的编码与数学推理能力,同时在通用语言任务上保持了相当的性能。与 DeepSeek-Coder-33B 相比,DeepSeek-Coder-V2 在代码相关任务的各个方面、以及推理与通用能力上都展现出显著进步。此外,DeepSeek-Coder-V2 将其支持的编程语言从 86 种扩展到 338 种,同时把上下文长度从 16K 扩展到 128K。在标准基准评测中,DeepSeek-Coder-V2 在编码与数学基准上取得了优于 GPT4-Turbo、Claude 3 Opus 和 Gemini 1.5 Pro 等闭源模型的性能。
|
||
|
||
## 二、核心贡献
|
||
|
||
1. **两个规模的 MoE 代码模型**:基于 DeepSeekMoE 框架发布 16B 与 236B 两个版本,激活参数分别只有 2.4B 和 21B,二者均支持 338 种编程语言与最长 128K token 上下文。
|
||
2. **首个开源百亿级参数以上的代码模型**:作者称这是首次尝试研发开源的千亿参数级代码模型;实验结果显示 236B 版本在编码与数学任务上均超过 GPT4-Turbo、Claude 3 Opus、Gemini 1.5 Pro 等当时最强的闭源模型。
|
||
3. **面向代码与数学的持续预训练配方**:在 DeepSeek-V2 中间检查点(已训 4.2T token)之上追加 6T token(60% 代码 + 10% 数学 + 30% 自然语言),总训练量 10.2T token,兼顾代码/数学强化与通用语言能力不退化。
|
||
4. **多语言与长上下文大幅扩展**:支持语言从 86 种增至 338 种,上下文从 16K 扩到 128K;语言扩展经 1B 模型消融验证有效(HumanEval 30.5%→37.2%,MBPP 44.6%→54.0%)。
|
||
5. **代码场景的 RL 对齐**:用编译器反馈与测试用例构造偏好数据训练奖励模型,再以 GRPO 做强化学习;在内部 LeetCode 测试集上奖励模型信号明显优于原始编译信号。
|
||
6. **全面刷新开源模型成绩**:HumanEval 90.2%、MBPP+ 76.2%(EvalPlus 流程下新的 SOTA)、LiveCodeBench 43.4%,并成为首个在 SWEBench 上超过 10% 的开源模型。
|
||
7. **宽松许可开源**:模型按宽松协议公开发布,允许研究与无限制的商业使用。
|
||
|
||
## 三、方法与技术要点
|
||
|
||
### 3.1 数据收集与语料构建
|
||
|
||
预训练语料由 60% 源代码、10% 数学语料与 30% 自然语言语料组成;自然语言部分直接采样自 DeepSeek-V2 的训练数据,因此论文重点说明代码与数学数据的采集、清洗与过滤流程。
|
||
|
||
GitHub 部分只收集 2023 年 11 月之前创建的公开仓库,沿用 DeepSeek-Coder 的过滤规则与近似去重:剔除平均行长超过 100 字符或最长行超过 1000 字符、以及字母字符占比低于 25% 的文件;除 XSLT 外,剔除前 100 字符中出现 `<?xml version=` 的文件;HTML 要求可见文本占比至少 20% 且不少于 100 字符;JSON/YAML 只保留 50–5000 字符的文件。过滤后得到 821B 代码 token(覆盖 338 种语言)与 185B 代码相关文本(如 markdown、issue)。
|
||
|
||
Common Crawl 部分沿用 DeepSeekMath 的迭代召回流程:以 StackOverflow、PyTorch 文档、math.stackexchange 等站点为初始种子语料训练 fastText 模型,用它召回更多代码/数学相关网页;由于中文等语言无法靠空格分词,改用 DeepSeek-V2 的 BPE 分词器,显著提升召回准确率;把首轮召回网页占比超过 10% 的域名判定为代码或数学相关域,再把这些域内相关的未采集网页补充进种子语料。迭代三次后从网页共获得 70B 代码相关 token 与 221B 数学相关 token(约为 DeepSeekMath 的 120B 数学语料的两倍)。同样的流程在 GitHub 上迭代两次,种子为人工挑选的、含详细描述的高质量代码,另收集 94B 源代码。最终新代码语料共 1,170B token,来自 GitHub 与 CommonCrawl。分词器与 DeepSeek-V2 相同。
|
||
|
||
为验证新语料质量,作者用 1B 参数模型做消融(表 1):用新语料训练 1T token,HumanEval 从 30.5% 升至 36.0%、MBPP 从 44.6% 升至 49.0%;继续训练到 2T token 后进一步提升到 37.2% 与 54.0%,说明新语料优于 DeepSeek-Coder 所用的代码语料。
|
||
|
||
### 3.2 训练策略:下一词预测与中间填充
|
||
|
||
DeepSeek-Coder-V2 16B 同时使用两个训练目标——下一词预测(Next-Token-Prediction, NTP)与中间填充(Fill-In-the-Middle, FIM);236B 版本只使用 NTP。FIM 采用 PSM(Prefix, Suffix, Middle)模式,在文档级别的预打包阶段把内容重排为「前缀—后缀—中间」的重建序列:
|
||
|
||
$$\texttt{<|fim\_begin|>}f_{pre}\texttt{<|fim\_hole|>}f_{suf}\texttt{<|fim\_end|>}f_{middle}\texttt{<|eos\_token|>}$$
|
||
|
||
FIM 的使用率为 0.5。这样设计的动因是:IDE 里的代码补全场景往往是「已知前后文、要补中间的空洞」,纯因果语言建模无法直接建模这种结构,而 FIM 让模型学会利用前后文双向线索完成缺省片段。
|
||
|
||
### 3.3 模型架构与训练超参数
|
||
|
||
架构与 DeepSeek-V2 保持一致,16B 与 236B 分别对应 DeepSeek-V2-Lite 与 DeepSeek-V2 的超参设置,激活参数为 2.4B 与 21B。作者提到训练过程中出现过不稳定与梯度尖峰,将其归因于指数归一化(exponential normalization)技巧,于是回退到常规归一化方法。
|
||
|
||
优化器为 AdamW,$\beta_1=0.9$、$\beta_2=0.95$、权重衰减 0.1;批大小与学习率按 DeepSeek-V2 的设定调整;学习率采用余弦衰减,2000 步预热后逐步降到初始值的 10%。为保持稳健的自然语言理解能力,两个模型都不是从头训练,而是从 DeepSeek-V2 的中间检查点(已训练 4.2T token)继续预训练,因此预训练阶段总曝光量达 10.2T 高质量 token(4.2T + 6T)。
|
||
|
||
### 3.4 长上下文扩展
|
||
|
||
沿用 DeepSeek-V2 的做法,用 YaRN 把上下文长度扩展到 128K,超参与 DeepSeek-V2 相同:缩放系数 $s=40$、$\alpha=1$、$\beta=32$。随后分两个阶段继续训练以增强长上下文能力:第一阶段序列长度 32K、批大小 1152、训练 1000 步;第二阶段序列长度 128K、批大小 288 个序列、再训练 1000 步,并在扩展阶段对长上下文数据比例做上采样。「大海捞针」(Needle In A Haystack, NIAH)测试结果(图 2)显示,DeepSeek-Coder-V2 在直到 128K 的所有上下文窗口长度上都表现良好。
|
||
|
||
### 3.5 对齐:有监督微调与强化学习
|
||
|
||
**有监督微调(SFT)**:为构建 DeepSeek-Coder-V2 Chat,从 DeepSeek-Coder 收集 2 万条代码相关指令数据、从 DeepSeek-Math 收集 3 万条数学数据,并从 DeepSeek-V2 的指令数据中采样若干以维持通用能力,最终形成 300M token 的指令集;训练采用余弦调度、100 步预热、初始学习率 $5\times10^{-6}$、批大小 1M token、总计 1B token。为让模型在微调后仍支持代码补全,16B 版本在基座微调时继续使用 FIM 方法。
|
||
|
||
**强化学习(RL)**:作者收集了约 4 万条代码与数学提示,每条代码提示都配有测试用例。数学偏好数据直接用 ground-truth 标签获得;代码方面,虽然编译器能给出 0/1 反馈,但部分提示的测试用例覆盖不完全,直接使用这种信号噪声较大且次优,因此论文在编译器数据上训练一个奖励模型,用它在 RL 中提供信号,比原始编译信号更鲁棒、泛化性更好。在内部测试集(Leetcode 与 Leetcode-zh)上奖励模型信号明显优于原始编译器信号(图 3),故后续实验统一使用奖励模型。算法采用与 DeepSeek-V2 相同的组相对策略优化(Group Relative Policy Optimization, GRPO);相比 PPO,GRPO 无需额外维护 critic 模型,成本更低且被证明相当有效。
|
||
|
||
### 3.6 评测设置
|
||
|
||
论文将任务分为编码、数学、通用自然语言三类。HumanEval(164 个 Python 题目,零样本)与 MBPP-Plus 均用贪心搜索并复现基线以保证公平,另把 HumanEval 扩展到 C++、Java、PHP、TypeScript、C#、Bash、JavaScript、Swift、R、Julia、D、Rust、Racket 等语言以测多语言能力。竞赛编程用 LiveCodeBench(训练数据截止 2023 年 11 月前,取 1201-0601 子集)与 USACO(307 题)。仓库级补全用 RepoBench v1.1,只用 2023 年 12 月的数据以避免泄漏。缺陷修复用 Defects4J(挑出 238 个仅需改单个方法的缺陷)、SWE-bench 与 Aider。
|
||
|
||
## 四、主要实验结果
|
||
|
||
| 基准 / 任务 | 本模型 | 对比对象 | 说明 |
|
||
|---|---|---|---|
|
||
| HumanEval(Python) | 90.2%(V2-Instruct 236B/21B) | GPT-4-Turbo-0409 88.2%;GPT-4o-0513 91.0% | 显著高于 GPT-4-Turbo,仅次于 GPT-4o |
|
||
| HumanEval 多语言平均(19 语言) | 75.3% | GPT-4o-0513 76.4%;Claude-3-Opus 70.8%;GPT-4-Turbo-0409 72.3% | 平均分第二,Java、PHP 单项最高 |
|
||
| MBPP+ | 76.2% | GPT-4o-0513 73.5%;GPT-4-Turbo-0409 72.2% | 在 EvalPlus 流程下创下新 SOTA |
|
||
| HumanEval(16B Lite 版) | 81.1%(2.4B 激活) | DS-Coder-instruct 33B 79.3% | Lite 版多语言平均 65.6%,高于 33B 模型的 61.9% |
|
||
| LiveCodeBench(1201-0601,226 题) | 43.4% | GPT-4-Turbo-0409 45.7%;GPT-4o-0513 43.4%;Claude-3-Opus 34.6% | 与 GPT-4o 并列大模型最高,总排名第二 |
|
||
| USACO | 12.1% | GPT-4o-0513 18.8%;GPT-4-Turbo-0409 12.3% | 接近 GPT-4-Turbo,仍落后 GPT-4o |
|
||
| SWE-bench | 12.7% | GPT-4o-0513 26.7%;GPT-4-Turbo-0409 18.3%;Codestral 2.7% | 首个超过 10% 的开源模型 |
|
||
| Defects4J(238 个单方法缺陷) | 21.0% | GPT-4o-0513 26.1%;Claude-3-Opus 25.5%;Codestral 17.8% | 开源模型中最佳,接近头部闭源模型 |
|
||
| Aider(133 个 Python 编辑任务) | 73.7% | GPT-4o-0513 72.9%;Claude-3-Opus 68.4% | 表中最高分,超过所有闭源模型 |
|
||
| RepoBench v1.1(Lite-Base 16B) | Python 平均 38.9%,Java 平均 43.3% | DS-Coder-Base 33B:Python 39.1%、Java 44.8%;Codestral 22B:46.1%、45.7% | 2.4B 激活参数即可比肩 33B 模型 |
|
||
| FIM 单行填充(平均) | 86.4%(Lite-Base 2.4B 激活) | DS-Coder-Base 33B 86.4%;Codestral 22B 83.0% | Python 80.0%、Java 89.1%、JavaScript 87.2% |
|
||
| CRUXEval-I-COT / -O-COT | 70.0% / 75.1% | GPT-4o-0513 77.4% / 88.7%;Claude-3-Opus 73.4% / 82.0% | 开源模型中最强,但与头部闭源仍有差距 |
|
||
| MATH | 75.7% | GPT-4o-0513 76.6%;GPT-4-Turbo-0409 73.4% | 几乎追平 GPT-4o 的 SOTA |
|
||
| GSM8K | 94.9% | GPT-4o-0513 95.8%;Claude-3-Opus 95.0% | 与闭源最强水平接近 |
|
||
| AIME 2024 | 4/30(maj@64 时 5/30) | GPT-4-Turbo-0409 3/30;GPT-4o/Claude/Gemini 均 2/30 | 解出题数多于所有对比模型 |
|
||
| Math Odyssey | 53.7% | GPT-4o-0513 53.2%;GPT-4-1106 49.1% | 略超 GPT-4o |
|
||
| MMLU(5-shot) | 79.2(236B Instruct) | DeepSeek-V2 Chat 78.1;Lite 版 60.1(V2-Lite 55.7) | 通用语言能力与 DeepSeek-V2 相当甚至更好 |
|
||
| Arena-Hard | 65.00(236B Instruct) | DeepSeek-V2 Chat 41.60;Lite 版 38.10(V2-Lite 11.40) | 推理/代码/数学占比高的主观评测提升明显 |
|
||
| MT-Bench / Alignbench | 8.77 / 7.84 | DeepSeek-V2 Chat 8.97 / 7.91 | 通用对齐类基准略低于 DeepSeek-V2 Chat |
|
||
|
||
在代码生成上,236B 版本多语言平均分 75.3% 位居第二,仅低于 GPT-4o 的 76.4%,并在 Java 与 PHP 上取得最高分;MBPP+ 的 76.2% 刷新了当时的 SOTA。竞赛编程 LiveCodeBench 43.4% 与 GPT-4o 持平,USACO 12.1% 接近 GPT-4-Turbo 但仍明显落后 GPT-4o 的 18.8%。缺陷修复上 Aider 的 73.7% 超过所有对比模型(含闭源),SWE-bench 的 12.7% 虽为首个破 10% 的开源模型,却与 GPT-4o 的 26.7% 差距显著,作者归因于指令遵循能力不足。数学上 MATH 75.7% 几乎追平 GPT-4o,AIME 2024 解出题数(4/30)多于所有对比模型;CRUXEval 是开源最强但仍落后 GPT-4o,作者认为与 21B 激活参数的限制有关。通用语言方面,236B Instruct 在推理类基准上超过 DeepSeek-V2 Chat,但在 MT-Bench、AlpacaEval 2.0、AlignBench 上略低,归因于后者经过通用目的对齐阶段;16B Lite 版在知识密集型的 TriviaQA 上偏弱,因预训练网页数据量较少。
|
||
|
||
## 五、结论、局限与影响
|
||
|
||
- **结论**:DeepSeek-Coder-V2 从 DeepSeek-V2 出发,用 6 万亿 token 的高质量多源语料继续预训练,在显著提升编码与数学推理能力的同时保持了与 DeepSeek-V2 相当的通用语言性能;相比 DeepSeek-Coder,支持语言由 86 种增至 338 种,上下文由 16K 扩至 128K。实验表明其在代码与数学特定任务上达到与 GPT-4 Turbo、Claude 3 Opus、Gemini 1.5 Pro 等最强闭源模型相当的性能。
|
||
- **局限性**:作者自述的主要局限是指令遵循(instruction-following)能力与 GPT-4 Turbo 等当时最强模型仍有明显差距,导致在 SWE-bench 这类复杂场景与任务上表现不佳;此外 CRUXEval 上与闭源大模型的差距被归因于仅 21B 的激活参数限制了学习与求解能力。作者认为代码模型不仅需要强编码能力,还需要出色的指令遵循能力才能应对真实复杂编程场景,未来将重点改进这一点。
|
||
- **影响**:论文给出了「通用基座 + 领域持续预训练 + 领域偏好 RL」这一可复制的配方,证明开源 MoE 代码模型可以在代码与数学基准上追平乃至超过闭源旗舰;同时以宽松许可开源(含 16B 轻量版),使 2.4B 激活参数即可比肩 33B 稠密模型的补全与生成性能,对代码补全工具与低成本部署有直接实用价值。
|
||
|
||
## 六、关键术语对照表
|
||
|
||
| English | 中文 |
|
||
|---|---|
|
||
| Mixture-of-Experts (MoE) | 专家混合 |
|
||
| DeepSeekMoE | DeepSeek 专家混合框架 |
|
||
| Total Parameters (#TP) | 总参数量 |
|
||
| Active Parameters (#AP) | 激活参数量 |
|
||
| Next-Token-Prediction (NTP) | 下一词预测 |
|
||
| Fill-In-the-Middle (FIM) | 中间填充 |
|
||
| PSM (Prefix, Suffix, Middle) | 前缀—后缀—中间模式 |
|
||
| Continual Pre-Training | 持续预训练 |
|
||
| Near-Deduplication | 近似去重 |
|
||
| fastText | fastText(文本分类召回模型) |
|
||
| Byte Pair Encoding (BPE) | 字节对编码 |
|
||
| YaRN | YaRN 上下文扩展方法 |
|
||
| Needle In A Haystack (NIAH) | 大海捞针长上下文测试 |
|
||
| Supervised Fine-Tuning (SFT) | 有监督微调 |
|
||
| Group Relative Policy Optimization (GRPO) | 组相对策略优化 |
|
||
| Reward Model (RM) | 奖励模型 |
|
||
| Repository-Level Code Completion | 仓库级代码补全 |
|
||
| Instruction-Following | 指令遵循 |
|