大模型训练完整指南:数据、阶段与优化策略详解
基于行业交流分享了大模型预训练的实战经验,涵盖样本构成与清洗策略、训练阶段划分(快速收敛、平稳、退火)、超参数调整(Batch Size、LR Scheduler)及 Scaling Law 的实际应用。重点讨论了 MiniCPM 等模型的数据混合方案、高质量样本对收敛的影响,以及优化器与学习率调度器的协同机制,为构建高效的大模型训练流程提供参考。

基于行业交流分享了大模型预训练的实战经验,涵盖样本构成与清洗策略、训练阶段划分(快速收敛、平稳、退火)、超参数调整(Batch Size、LR Scheduler)及 Scaling Law 的实际应用。重点讨论了 MiniCPM 等模型的数据混合方案、高质量样本对收敛的影响,以及优化器与学习率调度器的协同机制,为构建高效的大模型训练流程提供参考。

根据 Scaling Law,模型越大,高质量数据越多,效果越好。但还有一个很直观的情况,随着预训练样本的质量不断提升,训练手段的优化,新的模型往往能轻松反超参数量两倍于它的模型。
例如,最新出的 MiniCPM,在微信内部评测中效果非常出色。跟规模相对接近的 2B、7B 模型相比,得分比 Qwen2B 高,和 Qwen7B 比有的高有的低。这说明,在现有参数量情况下,哪怕是 2B 尺度,也并没有得到充分训练。
近期基于公开信息进行了关于大模型预训练的讨论,参与人员包括国内多个大模型团队的成员,基本上都是预训练为主。虽然部分细节涉及保密协议,但基于公开信息的沟通结论值得分享。
大家已经达成一些基础的共识。如中英混合比例大家都大差不差。逻辑推理比较强的样本,像代码、数学,这种就是模型越大,混合的比例反而可以越高。
跟 SFT(Supervised Fine-Tuning)是类似的,越大的模型,越聪明的模型,需要的 SFT 数据就越少。同理,越大的模型,越聪明,复杂样本混合比例就可以越高。
导致 PPL(Perplexity)崩掉的都要清洗掉,政治敏感数据清洗、去重等,肯定是一个很长的 Pipeline。大家比较一致的结论是,天工开源的那份预训练数据,是一个比较好的满足基础清洗要求的数据。
跟 SFT 一样,产出各种各样的 Label 来刻画数据,有的公司实习生就优化几个 Label。不过随着优化的往后拓展,这些 Label 的投入产出比越来越难以评估。
预训练清洗的 Pipeline 搭建,对于开源团队、小公司来讲,成本其实还是蛮高的。所以,基于开源数据,做一些聚类的 Topic,然后基于这些 Topic,丢到更大的模型,来构建一批高质量的数据,是一个反而比较低成本的方案。
这次大模型除了李一舟卖课,卖数据的公司也是真的赚到钱了。
经过讨论,发现有三种方案。
快速收敛阶段和平稳阶段,都采用普通样本。退火阶段,混入高质量样本来做教科书式的学习。
快速收敛阶段,以高质量样本为主,让模型快速收敛。平稳阶段,逐步调整比例,增加更多的普通样本。退火阶段,跟平稳阶段一致。
全程都是高质量样本。
这里大家讨论得蛮激烈的,有这么几点:
到底喂了多少 Tokens,小模型参数才算是充分得到训练?当天讨论,并没有一个很好的结论。
最近 YI-9B 的公开技术文档,做了一个有趣的尝试。把每层的输入和输出算 Cosine Similarity,来评估模型是否训练的非常充分。但内部讨论后,发现这种尝试有一个巨大的遗漏点。
前段时间,我们做 Long Context 调研,也是把每层也都单独做了一个分析。结论是,如果模型深度足够的话,有些层其实区分度是在降低的,相当于几层做了一层做的事情。以及,另外一个可能,小模型每一层 Cos 都小,有可能每一层在干不同的事,或者每一层都会注意到新的东西。大模型某些层 Cos 大,有可能是因为句子太简单,大模型对结果更加肯定,靠后的层的功能没有被激活。
感觉这种评估方式,仍旧有一定的优化空间,也期待业内能公开更多好用的评估方式。
小模型过大的 Tokenizer 的确是一种浪费。很多小模型有大 Tokenizer,一个潜在的可能性,作者人力不足,直接是把大模型的 Tokenizer 拿来复用了。
现在大家预训练分成三个阶段:快速收敛阶段、稳定阶段、退火阶段(MiniCPM 比较显式的提出这个阶段)。
这个阶段来自于大家对 Loss 曲线的观察,发现 Loss 曲线的收敛就是这么一个特点。然后,大家发现不同的 Loss 曲线阶段,做一些针对性样本和参数的调整,能带来更好的效果,于是就这么分了。
首先,我们现在的评估手段还是比较粗糙的,假如有了更细的评估手段,可能能观测到更多有趣的东西。例如之前俊林做过关于涌现的分享,涌现从指标观测来看,就是突然出现的。但当把指标细化后,可以发现这个涌现好像也没那么突然。
但反方这里又有不同的观点,我们用物理学的一个理论来解释涌现。我们可以把涌现替换成相变来聊一聊它和指标突变的辩证关系:当我们谈论相变时,我们指的是物质从一种状态转变为另一种状态的过程,比如水从液态变成固态的过程(冰冻)或者从液态变成气态的过程(蒸发)。而指标突变通常指的是某种性质或者物理量在某个条件下突然发生明显的变化。
相变与指标突变之间存在着密切的关系,因为相变往往伴随着物质性质的突变。当物质经历相变时,它的一些性质会突然改变,这些性质就是我们所说的指标。尽管可以使用一些技巧方法来构造一些看起来特别平滑的指标来反对大模型涌现这个词汇,但是不可否认的事实是,在不同的尺寸变化或者数据量、计算量变化之后,人们可以非常明显地感知到大模型表现的巨大差异,这就是一个相变的结果。
老调重弹的问题。2020 年,Transformer 出来后,当时大家就碰到这么一个问题。模型太大了,用尽可能能塞进内存的 Batch Size 去 Train 模型,来提升速度。
很快,大家发现 Batch Size 有个 Trade Off。
2020 年其实有人就研究,如何用大 Batch Size,更快的训练的同时,也能收敛的更好。一个解决思路是优化了优化器,例如谷歌当年出的 LAMB,就把 Batch Size 从 512 扩充到了 6w,收敛效果也不错。
机器学习的目标,都是为了收敛 Loss,让学习的 Target 和我们预测的 Target 的 Loss 尽可能低。学习的过程,就是基于样本,分批(Batch Size)丢进去。根据过去,现在学习的效果,来决定参数更新的方向和大小。
Batch Size 这里是很清晰的。比较纠结的点是,优化器和 LR Scheduler 这俩好像边界不是很清晰。
假如我们要下山,山脚就是我们的目标,Learning Rate 就是我们每一步要走多远。如果速度太快,可能开到山脚后,发现刹不住车,还会往山上多开一会,于是这样反复在目标处来回震荡。如果太小的话,到山脚的速度又太慢了。
现在主流的就是 Cosine,初期 Warmup Learning Rate 线性增长,然后 Learning Rate 就是以余弦函数的周期方式周期性变换。
优化器核心要解决的问题,初期怎么更好的学,那些地方要加速学,那些地方容易陷入局部最优,要如何跳出来。
现在的主流做法都是基于历史的反馈。类似于爬山,某个地方你发现爬的很慢,那么就加下油门。有的地方你发现是下坡路,跑的贼快,那就就要松下油门,免得油门太快,直接从主路跑出去了。
从 Momentum,到 AdaGrad,再到 Adam,这两年还有人在各种折腾。
问题就来了,LR Scheduler 决定了 Learning Rate 的大小。优化器也会根据历史情况来自动调整。这俩会不会冲突?
优化器的优点刚刚说了,但它的缺点就是无论优化器怎么说的高大上,它本质上还规则,是大家基于调参经验,或者一些假设,定的规则。规则就很难完美适配所有任务,事实上 2020 年左右,大家就发现不同的任务上不同的优化器效果是不同的。
除此之外,还有一个 Learning Rate Decay 的问题,但这个偏经验,并不一定完全 Solid!用 CIFAR 或者 ImageNet 跑一跑常见的模型,就会发现,最后如果不把 Learning Rate 降低下去,Loss 很难收敛到一个很小的数字。
SGD 和 Adam 的收敛性证明也都是要求 Learning Rate 最后会降到足够低的。但自适应优化器的学习率不会在训练中自动降到很低。现在大模型预训练,大家其实最关注的就是这个 Loss 的收敛效果。这个时候,LR Schedule 的出现就是一个比较好的补充,能够补足优化器的一些问题。
所以,你可以理解为,现在我们没有一个完美的油门,所以搞了俩油门,互相辅助。优化器是个老司机的油门,好用,但人类的经验是有局限性的,很容易陷入局部最优跑不出来。LR Schedule 像是一个全局的油门,定期更新,帮助老司机跳出局部最优。
MiniCPM 提出了 W-S-D LR Scheduler,但 Stable 阶段高 Learning Rate,相当于把调节油门的压力全给到优化器了。但 S-D 的确也有很多好处,例如我想 Train 到什么时候就 Train 到什么时候。
这里提出了一个解决思路,W-S-D 是不是可以改成,Warm-Cosine-Stable-Decay,Cosine 占据训练阶段大头,甚至多个余弦波段,余弦波段多了,如上文所说,是不是能更好的跳出局部最优?快要结束训练的时候,把 Cosine 的 Learning Rate 给升上去,走一段 Stable+Decay。
前段时间,业界流行一个说法,你发现某块效果差,在预训练最后阶段补充一些类似的数据,效果就会蹭蹭的往上涨。简称,和面——水多了加面,面多了加水。
刚开始,大家都很鄙视这种行为,觉得这种行为不就是刷榜么?但现在我们来探讨这块的合理性,MiniCPM 可以算是更进一步的'作弊'了,如果按照之前的观点,他都直接把 SFT 数据混入了预训练数据里面,更加明目张胆的'刷榜'。
我个人觉得这里可以用两个角度去理解:
之前预训练完毕后,直接上 SFT 数据,语料分布差距很大,其实天然是不太好的。这种作弊的行为,只要控制样本比例得当,反而能保证后面通用对其的一致性。
随着一些 Common Sense 的建立,Scaling Law 的指导意义的确是在不断下降的。
举个例子,假如我有 300 张卡,我要 Train 多大的模型?计算方式,往往就变成,我大致知道训练 1T-2T Tokens 效果往往就不错了,这个模型两个月后我想赶一个发布会。那么就来反推,1T 的 Tokens 训练 2 个月,300 张卡能 Train 多大的。
但我们回到 2020 年,当大部分人都在基于 BERT 做各种魔改的时候,OpenAI 发现了这么一个规律。数据,训练,参数一直增长下去,好像 Loss 的确是在不断的下降哎?于是,他们拿着这个 Paper 去问微软的 CTO,你想不想看看这个 Loss 下降到一定程度会发生什么?会发生什么?ChatGPT 就出来了。
大模型训练是一个系统工程,涉及数据质量、训练策略、超参数调整等多个维度。通过本文的梳理,我们可以看到:
未来的大模型训练将更加依赖精细化的数据工程和智能化的训练策略,希望这些经验分享能为从业者提供有价值的参考。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online