第一步不是造模型,是算该花多少钱
先给结论: DeepSeek 的第一篇论文没去抢"最大模型"的名头,而是先用小实验把"参数、数据、算力怎么分配最划算"量成一条规律,再按规律训练出 7B 和 67B 两个模型。先算账,再造模型——这个顺序本身就是方法。
一、第一篇论文的标题里就写着"先算账"
2024 年 1 月 5 日,DeepSeek 公开了第一篇技术报告(arXiv 编号 2401.02954,v1 版本)。副标题里有个词"长期主义"——要的不是某一次考试的第一,而是一套越扩越稳、不会越扩越亏的训练体系。
这篇论文研究的"缩放规律"(Scaling Law)是一条经验关系:模型多大、数据多少、算力多少,这三者怎么配比,效果最好。
拿零花钱打个比方:一学期有固定的一笔钱,买参考书(相当于数据)还是报补习班(相当于把模型做大)?两边都想要,但不可能都给。缩放规律回答的就是:这笔钱怎么分,期末成绩最好。
为了回答这个问题,论文先做了三件准备工作:
- 先摸清"超参"——超参是训练前人为设定、模型自己不会学的数(如学习率、每步喂多少数据),免得拿不合适的设置去比较不同规模的模型;
- 换一把尺子量模型大小:用"每处理一个词元(模型处理的最小文字单位)要花多少计算",而不是单纯的参数量;
- 研究不同数据下配比关系会不会变。
目标只有一个:保证比较是公平的。 论文也说明,它没有证明这是一条跨数据、跨架构的普遍定律。
二、模型越大、数据越多确实越好,但它们抢的是同一笔钱
第五篇讲过三个容易混的"大小":参数量(模型里可调的数字有多少)、数据量(训练读了多少词元)、计算量(一共做多少次运算)。它们的关系是一个朴素等式:计算量 ≈ 每个词元的开销 × 数据量。论文给"每个词元的开销"取名叫 M。
这里有个坑: M 不是参数量,单位是"每个词元多少次运算"。它算了注意力开销(和序列长度有关),但故意排除词表输出——它是做规模拟合的口径,不是显卡账单。
固定计算量时,把 M 翻倍,数据量就得减半——所以问题不是"越大越好",而是怎么分最划算。
论文的做法叫 IsoFLOP 实验:固定预算,只改两边比例,看哪种分法错误率最低。他们设了 8 个预算档(1e17 到 3e20 FLOPs,“1e17"就是 1 后面 17 个 0),每档试约 10 种分配,用 1 亿词元的独立验证集评判(指标 BPB 在第六节讲)。
结论是两条指数:
- 最优的模型每词元开销,随预算的 0.5243 次方增长;
- 最优的数据量,随预算的 0.4757 次方增长。
两个指数加起来正好是 1,两个系数乘起来约为 1——两边乘在一起刚好等于预算。更直观地说:预算扩大 10 倍时,模型每词元开销大约变成 3.344 倍,数据量大约变成 2.990 倍。 不是"两边一样多”,也不是"谁的指数大就全给谁"。
前提: 这两条是论文在自己的数据和架构上做的拟合,不是通用常数。换个数据集、换个切词方式,指数就会变——这正是下一节要讲的。
三、两个著名结论互相矛盾时,DeepSeek 选择自己再测一遍
论文回顾历史时提到一个尴尬事实:当时最有名的两类最优分配结论对不上——Kaplan 与 Chinchilla 对"预算该更多给模型还是给数据"给出的答案不同。
论文表 4 把被引结论和自己的实验结果并排列出(“模型指数"越大,说明增加预算时越值得把钱花在扩大模型上):
| 数据 / 研究 | 模型指数 | 数据指数 |
|---|---|---|
| OpenAI / OpenWebText2(论文转引) | 0.73 | 0.27 |
| Chinchilla / MassiveText(论文转引) | 0.49 | 0.51 |
| 本文早期数据 | 0.450 | 0.550 |
| 本文当前数据 | 0.524 | 0.476 |
| 本文 OpenWebText2 | 0.578 | 0.422 |
诚实说明: 前两行是论文转引的其他研究结果,来源页没有复核这两篇原论文;它们在这里只用来"说明当时的争论”,不是定论。
最值得看的是后三行。同一个团队、同一套方法,数据从"早期"换成"当前",指数就从 0.450 / 0.550 变成 0.524 / 0.476(注意这组和第二节那两条不是同一套拟合)。 而在同样写着 OpenWebText2 的语料上,论文拟合出的 0.578 / 0.422 与 OpenAI 报告的 0.73 / 0.27 也不一样——两个研究即便用同一个数据集名字,指数也可以不同。
结论很硬:缩放规律不是天上掉下来的常数,而是在"你的数据"上量出来的关系。 所以第一步必须是测量,不能是抄公式。论文也提醒:这是相关观察,不是单变量因果证明——来源比例、分布和质量是同时在变的。
数据质量有多关键,看去重数字就明白:只在 1 个 Common Crawl 数据包内部去重,重复文档比例是 22.2%;扩大到 91 个数据包跨包去重,比例变成 89.8%。
前提: 22.2% 和 89.8% 都是"重复文档占比",只支持"必须跨数据包去重";不能推出"性能提升了几倍",也不代表不同规模语料保留的文档数相同。
四、先花小钱把规律摸清,再按规律花大钱
IsoFLOP 流程:小预算扫规律 → 外推 → 只在预测的最优点花大钱
要花大钱,就得先证明"小钱的实验能预测大钱的结果"。 论文图 5 显示:小预算实验的预测,能贴合到约 1000 倍预算之后的模型表现。用很小的成本摸清规律,再照着规律花那笔大钱——这是整个系列最该带走的方法论。
超参也要先校准。论文在 1e17 到 2e19 FLOPs 范围内实验,拟合出两条规律:最优学习率随预算的 −0.1250 次方变化,最优的每步数据量随预算的 0.3271 次方变化。方向很好记:预算越大,越适合更大的批次、更小的学习率。
两个细节更能说明严谨:
- “最优"是一条宽带,不是一个点。 验证误差相对最小值不超过 0.25% 的设置都算"近最优”,另外还在 1e20 预算上单独验证——规律给方向,不承诺唯一答案。
- 不校准超参的比较是假比较。 两档预算各用了不合适的设置,测出的差异可能只是超参没调好,而不是规模带来的。
工程上也有配套:训练系统每 5 分钟异步保存一次模型和优化器状态,换并行配置也能恢复。小实验也不许白跑。
边界: 外推成立的前提是"验证集分布和训练数据相近"。它能预测验证损失,不能保证在新领域或每一项榜单上都准。
五、摸清规律之后,他们才动手训练 7B 和 67B
准备工作做完,两个模型登场:7B 和 67B 的稠密中英双语基座(“基座"就是还没教它按指令回答的原始模型;论文另有一版对话训练的 Chat 模型)。两个规模都读了 2T 词元(2 万亿个)。
关键配置是这样:
| 配置 | 7B | 67B |
|---|---|---|
| 层数 | 30 | 95 |
| 隐藏宽度 | 4096 | 8192 |
| 查询头数 | 32 | 64 |
| KV 头数 | 32(每个查询头配一组) | 8(每 8 个查询头共享一组) |
| 上下文长度 | 4096 | 4096 |
| 每步序列数 | 2304 | 4608 |
| 峰值学习率 | 0.00042 | 0.00032 |
| 训练词元 | 2.0T | 2.0T |
第一,67B 不是把 7B 简单放大。 它的 KV 头只有 8 个,即每 8 个查询头共享一组 K/V 数据;层数和每头维度固定时,KV 缓存的原始存储量降到原来的 1/8。注意这只指"缓存里原始元素的个数”,不是整个模型显存降到 1/8,也不保证速度变成 8 倍。它还选了"加深到 95 层"而非加宽前馈网络,论文没有给出"95 层严格优于其他深度"的独立消融,所以这是合理设计,不是已被证明的最优。
第二,学习率分阶段降:前 2000 步预热,训练到总量的 80% 时降到峰值的 31.6%、90% 时再降到 10%;按 2T 预算算,断点在 1.6T 和 1.8T 词元处。这种"多步降"在 1.6B 参数、100B 词元的对照实验里与"平滑降"效果基本一致,好处是早期结果可复用,换预算不用从头再来。
数据这边:2T 词元以中英文为主,流程是去重、按语言和语义质量清洗、再重混合补齐薄弱领域。训练完再教它"按指令回答":约 150 万条中英指令(含 30 万条安全数据),7B 训 4 轮、67B 训 2 轮,因为大模型更容易过拟合。
成绩怎么讲才诚实? 论文表 5 拿 LLaMA2 做对照:
| 任务(看题次数) | LLaMA2 7B | DeepSeek 7B | LLaMA2 70B | DeepSeek 67B |
|---|---|---|---|---|
| MMLU(5 次) | 45.8 | 48.2 | 69.0 | 71.3 |
| GSM8K(8 次) | 15.5 | 17.4 | 58.4 | 63.4 |
| HumanEval(0 次) | 14.6 | 26.2 | 28.7 | 42.7 |
| RACE-High(5 次) | 45.8 | 46.5 | 54.3 | 50.7 |
DeepSeek 67B 在代码、数学、中文等项目上领先明显,但不是每一项都赢:RACE-High 就明显落后于 LLaMA2 70B。
前提: 两家都用了 2T 词元,但不等于数据构成和实际计算量相同;表中"几次"是最大看题次数,可能因上下文限制减少。这张表能说明"同等规模下有竞争力",不能说明"全面超越"。
六、评估别用困惑度跨模型比,要用按字节归一的 BPB
这一节讲一个看起来专业、但读论文的人都得懂的点:为什么不能用"困惑度"横向比较模型?
困惑度(PPL)衡量"模型看到这段文字时有多意外",越低越好。问题在于:它按词元计算,而不同模型切词方式不同。 同一句话,不同模型切出的词元个数不同(比如 10 个和 14 个),算出的"平均意外程度"自然不可比——看起来是模型水平的差距,其实有一部分是切词造成的。
论文的做法是用 BPB(每字节多少比特):把"意外程度"换算成原文本每个字节要花多少比特。分母换成"字节"这个所有模型都一样的单位,数字才可比(两边仍要用相同的文本、编码和处理方式)。
用同一把尺子才能量出(Pile-test 上的 BPB,越低越好):LLaMA2 7B 是 0.741,DeepSeek 7B 是 0.725;LLaMA2 70B 是 0.649,DeepSeek 67B 是 0.642。
同样的口径意识,用来看"进步"也很重要:要区分知识技能真的变了、只是回答格式变了、还是考试条件变了。例如 67B 从基座变成对话版,GSM8K 从 63.4 涨到 84.1,但 HellaSwag 从 84.0 掉到 75.7;而且对话版用"零次提示"、基座版用"多次提示"——考试条件本来就不同。作者认为部分收益来自"学会了正确的推理格式",这是作者解释,实验无法把因果关系完全分开。
更直白的例子:给 7B 加 2000 万条选择题数据后,MMLU 从 49.4 涨到 60.9,但 TriviaQA 的 57.9 纹丝不动——涨的是答题格式,不是真本事。
最后交代"论文没说的":可复现的数据比例、来源清单与过滤阈值、混合权重都没披露,没有总 GPU 小时或总成本;对齐阶段的偏好数据规模和 β 值也未公开。遇到空位,正确做法是说"论文没有披露",而不是替它编一个数字。
规律摸清之后,下一步换了个方向:在同样的算力下,让模型更强。 论文在结论里就把代码模型和"专家混合"(MoE)列为后续方向——那正是下一篇的主题。
一句话总结: DeepSeek 第一篇论文的方法论是"先用小钱量规律,再按规律花大钱"——模型该多大、数据该多少,是算出来的,不是猜出来的。
记住这个数字: 约 1000 倍——小预算实验的预测,能贴合到约 1000 倍预算之后的模型表现。
下一篇: 省钱第一招:把一个大厨换成专家团