Files
note_sync/大模型/deepseek/02-代码模型/02-DeepSeek-Coder-V2-2406.11931_abstract.md
T

118 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 | 指令遵循 |