近三百篇工作调研做完,最大的感受是:现在做模型训练,拼的早就不是单点技巧,而是整套数据+预训练+后训练的工程体系。WAM 这类模型(我这里泛指以 Web/Agent/多模态交互为代表的一类通用基础模型)更是如此,它不像纯文本模型那样只要“读得多”就行,还要求模型能理解页面结构、操作意图、反馈信号,甚至要在多轮交互中保持稳定。为了弄清楚当前业内到底怎么做训练策略,我系统性扫了近 300 篇相关论文、技术报告和开源仓库,把数据、预训练、后训练三块的方案捋了一遍。这篇就把调研里最有价值的结论、可复现的细节和踩过的坑一起整理出来,给正在做类似工作的朋友一个参考。
1. 为什么做这次近 300 篇的调研——背景与总体脉络
1.1 调研的起点与目标
起因是我自己在跑 WAM 类模型的训练实验时,发现一个很尴尬的问题:单看某一篇论文,方案看起来都很合理,但真正组合到一起就各种翻车。比如数据清洗用了一套规则,预训练又换了另一种 tokenization,后训练阶段再做指令微调,结果模型能力不升反降。后来跟几个做类似方向的朋友聊,发现大家遇到的坑高度相似,于是决定做一次系统调研,核心目标有三个:第一,搞清楚当前 WAM 模型训练的主流数据来源和配比方式;第二,梳理预训练阶段不同策略的优劣和适用条件;第三,总结后训练阶段从指令微调到对齐方法的演进路径。调研范围覆盖了 2020 年到 2024 年间的近 300 篇工作,包括顶会论文、arxiv 预印本、开源模型的技术报告,以及一些大厂公开的 training recipe。
1.2 筛选与分类方法
近 300 篇听起来多,但真正值得精读的大概三分之一。我的筛选标准很简单:优先看有完整训练细节的,比如数据配比表、超参数设置、消融实验;只有结论没有过程的直接放到次要位置。分类上按三个维度切分——数据策略、预训练策略、后训练策略。数据策略里又细分为采集、清洗、配比、评估;预训练策略重点关注目标函数、数据规模、架构选择;后训练策略则包含指令微调、偏好对齐、持续学习。每一篇都记录下它的核心方案、关键数据点、实验结果和可复用的经验教训。这样整理完之后,规律就变得非常清晰了。
1.3 三个核心维度的总体判断
先给结论:数据层面,质量比数量重要得多,去重和清洗的收益甚至超过增加数据量;预训练层面,训练目标的多样性比单纯堆模型尺寸更有效,多任务联合训练是主流趋势;后训练层面,指令微调已经非常成熟,真正的挑战在于偏好对齐和持续学习带来的灾难性遗忘。这三部分不是孤立的,数据策略会直接影响预训练效果,预训练的效果又决定了后训练的上限。我见过太多团队把精力全押在某一个环节上,比如疯狂加数据但清洗做得稀烂,或者模型做得很大但训练目标单一,最后效果都不理想。下面按这三个维度逐一展开。
2. 数据策略:模型的地基工程
2.1 数据从哪里来——语料构成与来源分布
调研里数据来源基本可以分为五类:网页爬取、结构化知识库、用户行为日志、公开数据集和合成数据。网页数据是主力,占比普遍在 60% 以上,但问题也最多——噪声大、重复率高、质量参差。这里有个容易被忽视的细节:网页数据的抓取策略本身就会影响模型能力。比如用同一套爬虫但不同的 URL 去重规则,最终得到的语料多样性差异非常大。调研中有几篇工作专门做了对比实验,发现对 URL 做归一化处理而不是简单地对文本做 minhash 去重,能保留更多有价值的重复信息,尤其是那些在不同页面以不同表述出现但语义相同的知识。结构化知识库虽然占比小,但对提升模型的事实性非常关键,典型的如代码库、知识图谱、表格数据。用户行为日志则是 WAM 模型独有的优势——记录了真实用户在网页上的点击、输入、滚动等操作,这对训练模型的交互能力几乎是不可替代的。合成数据在近两年的工作里越来越多,主要用来补充长尾场景和特定任务数据。
2.2 数据清洗与去重:细节决定上限
这个部分我想重点说,因为大量实验证明清洗比采集更能决定模型性能。业内一个比较公认的流程是:格式清洗 -> 语言过滤 -> 质量筛选 -> 去重 -> 毒性过滤。格式清洗解决乱码、HTML 标签残留、异常字符;语言过滤通过 langdetect 或 fasttext 做语言识别,筛掉非目标语言和混合语言文本;质量筛选会用一系列启发式规则,比如文本长度、标点符号密度、重复 n-gram 比例、包含敏感词等;去重目前主流是用 MinHash 配合 LSH 做近似去重,文档级和段落级都要做,只做文档级去重会漏掉大量段级别的重复内容。一个值得注意的细节是,去重的阈值不是越高越好。我见过一个团队为了追求极致的去重率,把相似度阈值压到 0.8,结果模型的领域知识广度明显下降。那些“看似重复”的文本往往带有不同的上下文信息,过度去重会把这种多样性也一并删掉。
2.3 数据配比与课程学习
数据配比是一个经常被低估的环节。调研中发现,几乎所有效果好的 WAM 模型都会对不同类型的语料设置明确的采样权重,而不是简单地把所有数据混在一起。代码数据通常会被赋予较高的权重,因为代码的结构化特性和逻辑严密性对提升模型的推理能力有明显帮助;对话数据比例一般控制在 5%-15%,超过这个范围后边际收益递减;长文本数据需要单独考虑,因为这类数据在按 token 随机采样时会被系统性低估——一个 10 万 token 的文档,按 token 概率采样时它被完整选中的概率远低于 100 个 1000 token 的短文档。解决方式是在采样时按文档长度做过采样,或者用基于 token 预算的配比策略。课程学习也就是 curriculum learning,在近 300 篇调研中真正用的不多,但有一些工作做了尝试:先用高质量数据预训练一小段,再加入通用数据进行完整训练。效果上,课程学习在同样计算预算下能提升约 2%-3% 的下游任务平均分,但实现复杂度也相应增加,增量不算大,是否采用需要看团队的人力情况。如果你决定做课程学习,建议先在小规模实验上验证收益,再放到正式训练中。
2.4 数据质量评估:人工评分与自动筛选
怎么判断一个数据是好是坏?最可靠但最贵的是人工评估。调研中头部团队的做法比较统一:定义一套 3-5 级评分标准(比如 5-无错误且信息密度高、4-基本无误、3-有少量事实错误或者冗余、2-大量错误、1-不可用),先让标注员在几百条样本上对齐标准,再抽检 2%-5% 的数据做评分。但这套方案对大多数团队来说太奢侈了。更现实的做法是用小模型做自动筛选——用一个已经训练好的中等规模模型(比如 7B)对数据打分,把得分低的尾巴切掉。这里有个经验:打分模型和训练模型不要用同一个架构,否则会引入系统性偏差。另外数据质量的自学习过滤在好几个工作里都出现了,核心思路是用模型自己的困惑度来做筛选,先训练一个短期的临时模型,再根据这个模型在某个验证集上的表现对训练数据进行加权或筛选。这个方法成本低,效果也不错,特别适合在数据规模达到万亿 token 级别、人工审查完全不现实的时候用。
3. 预训练策略:成本与能力的平衡艺术
3.1 预训练目标与损失设计
WAM 模型预训练最核心的变化,是从单一的 next-token prediction 走向多任务联合训练。纯文本模型可以做 causal LM,但对 WAM 类模型,我们需要它同时理解文本、页面结构、用户操作,甚至视觉信息。调研中看到的主流做法是把多个训练目标组合起来,比如主目标仍然是 decoder 架构的因果语言建模,但额外添加了 masked token prediction、多模态对齐损失、以及针对特定行为预测的辅助 loss。多任务联合训练这里,损失的权重配置直接决定模型最终的能力偏向。一个值得参考的做法是,在训练初期将辅助 loss 权重调低(比如 0.1),让模型充分学习基础语言能力,然后在训练中后期逐步提高到 0.3-0.5,让模型开始学习结构化信息和交互行为。直接从一开始就给辅助任务高权重的实验效果普遍不好,表现为模型语言流畅度下降、下游任务反而变弱。
3.2 数据规模、模型规模与计算量的关系
我先给一个实用结论:训练一个 7B 的 WAM 模型,在 2 万亿 token 数据上训练的收益,明显大于训练一个 13B 模型但只使用 1 万亿 token。规模和数据的比例不是一个固定值,但大多数模型在训练数据量级达到参数量的 50-100 倍时能保持良好的性能增长。我用 7B 模型举例:参数量 70 亿,训练数据 1.4 万亿 token 是基本门槛,做到 3.5 万亿到 7 万亿 token 时模型能力还会有明显提升。但需要注意的是,这个比例规律在数据质量不一致时会被打破——如果高质量数据只有 5000 亿 token,那再继续灌低质量数据只会稀释模型的注意力机制,典型的收益为零甚至为负。计算量方面可以用 Chinchilla 公式做参考设定 token 预算,但我个人建议把它当基线而不是硬性约束,因为 WAM 模型的多任务训练目标会使最优 token 量略高于 Chinchilla 的估计。在实际操作中,团队通常受限于 GPU 资源和时间成本,我建议做一组小规模预测实验:分别用 5B、10B、20B token 训练同一个 1B 小模型,画出一条 scaling 曲线,然后按这个曲线外推正式训练需要的资源,这种方法比直接套公式可靠得多。
3.3 长上下文与结构化数据的处理
WAM 模型一个很重要的特性是需要处理超长输入,比如整张网页的 DOM 结构或一段很长的用户会话记录。近 300 篇工作里,长上下文的处理方案大致分三个流派:位置编码外推、窗口式注意力、以及层级化编码。位置编码外推的代表是 RoPE 的多种改造版本,比如 YaRN、NTK-aware scaling,这属于改动最小、成本最低的方案,但外推超过训练长度 4 倍以上时性能下降明显。窗口式注意力比如滑窗注意力加全局 token 的稀疏注意力组合,能在固定算力下处理更长的输入,但实现复杂度高,而且训练不稳定。层级化编码是我个人比较看好的方向——把文档结构先编码为块级表示,再在块级表示上做注意力,这更符合人类阅读长文档的方式,但工程难度不小。如果你只是做实验验证而不是冲极限,我建议先用位置编码外推方案训练,等模型稳定跑通后再考虑稀疏注意力优化。
3.4 不同架构对预训练的影响
架构选择对预训练效果的影响,很多团队容易忽略。Dense 架构如 LLaMA 结构的模型,行为可预期、训练稳定性好,绝大多数团队应该优先考虑。MoE 架构如 Mixtral 这种,优势是同样的激活参数下可以用更多的总参数,推理速度也快,但训练稳定性是最大的坑——不需要仔细控制每个 expert 的负载均衡 loss,如果设置不当,会出现部分 expert 完全不被激活的“死路由”现象。对 WAM 类任务,还有一个常见的选择是采用 encoder-decoder 或纯 decoder。调研结论比较清晰:如果是生成式任务为主,纯 decoder 更自然、效果也更好;如果任务是理解为主,以及信息抽取、问答,encoder-decoder 在同参数规模下通常效果更好。不过现在越来越多的工作将 WAM 定义为生成式 agent,所以纯 decoder 是主流。另外我建议关注一下 GQA(分组查询注意力)的使用,在长上下文场景下它比 MHA(多头注意力)更省显存,但推理速度提升并不显著,是否使用要看你的部署约束。
4. 后训练策略:从“会答题”到“会干活”
4.1 指令微调:数据配比与模板多样性
预训练做完,模型大概率还是“知识丰富但不会干活”的状态。指令微调就是解决这个问题。调研中关于指令微调的共识有几个:第一,数据量并不是关键,5 万到 10 万条高质量指令数据通常就足够了,堆到 50 万条以上反而可能引入噪声;第二,指令数据的多样性比数量重要得多。这里的多样性有几个维度——任务类型多样性(问答、摘要、代码生成、信息抽取等)、输入格式多样性(短文本、长文档、HTML 页面)、指令表述多样性。一个很实用的经验是,用一套 seed 指令模板,再利用大模型改写生成更多变体,能把数据多样性提升 2-3 倍。第三,指令数据里的负样本很重要。我调研中发现,效果好的模型普遍在训练数据里加入了 3%-10% 的错误示范或拒绝回答样本,这样才能让模型学会说“我不知道”而不是胡编乱造。在微调过程中,一个问题容易被忽视的是数据混入顺序。建议先训练通用指令数据,再混入领域特定数据,最后加入少量对话数据做收尾,这样模型既保留了通用能力,又强化了领域专长,最后的对话数据能让交互风格更自然。训练时建议用学习率调度,前 10% 的步数用 warmup,后面线性衰减,最大学习率设置在 2e-5 到 5e-5 之间。
4.2 偏好对齐:DPO vs RLHF
指令微调只是让模型学会“照着做”,偏好对齐则是让模型学会“做得更好”。目前主流方案是 RLHF 和 DPO。RLHF 是传统方案,需要训练一个奖励模型,再用强化学习(通常是 PPO)来优化策略。效果很好,但工程复杂度很高——需要同时维护四个模型(策略模型、参考模型、奖励模型、价值模型),训练稳定性差,超参数敏感,动不动就崩。DPO 是近两年非常流行的替代方案,思路是直接利用偏好数据构造一个隐式奖励,并用简单的分类式损失来优化策略,不需要单独训练奖励模型,也不需要强化学习循环。调研结论是:在数据量不大(几万条偏好对)的场景下,DPO 的效果和 RLHF 基本相当,但工程复杂度低了不止一个量级;在数据量非常大且质量很高时,RLHF 在天花板上仍然略胜一筹。我的建议是,除非你有专门的红队和大量的标准数据,否则从 DPO 开始。这里有一个实操细节:DPO 训练时 beta 参数非常关键。beta 越大,模型跟参考模型的偏差越小,训练越保守;beta 越小,模型越容易被偏好数据带着走。经验上 beta 从 0.1 起步,如果发现模型表达能力下降(输出开始变得千篇一律),就把 beta 调大;如果发现模型不听从偏好数据,就把 beta 调小。另外,偏好数据的质量直接影响 DPO 效果,负样本一定要是真的差,如果偏好对里正负样本差异不明显,DPO 几乎学不到东西。
4.3 持续学习与灾难性遗忘的平衡
后训练阶段一个很容易遇到的问题是:模型在指令微调后,预训练阶段学到的某些能力会退化。比如你训练模型学会操作浏览器,但它的通用知识问答能力可能下降了。这在持续学习领域叫做灾难性遗忘。调研中比较有效的缓解方法有四种:第一种是数据回放最朴实的做法,在微调数据里混入 5%-20% 的预训练数据或通用指令数据,相当于让模型“复习”旧知识。我强烈建议每个团队都做这个,成本极低、收益明显。第二种是 L2 正则化对参数更新的约束,通过在损失函数里加入对大模型参数变化的惩罚项,限制微调偏离预训练权重太远。这个方案实现简单,但约束过强会影响新任务的学习效果。第三种是 LoRA 微调,虽然 LoRA 更常被当作参数高效微调手段,但它在缓解遗忘上也有一定效果,因为它更新的参数量很少,原始预训练权重基本保持不变。第四种是模型合并,把预训练模型和微调模型的权重按一定比例做加权平均,或者用 task arithmetic 做向量加减,实验效果还不错。真到了需要做持续学习的时候,我建议优先级从方案一到方案四都试一遍,数据回放通常收益最大,LoRA 可以作为并行方案使用。注意,千万不要把多个学科的微调数据一次性混合完就训练,除非你配了足够的数据回放,否则很容易出现只记得最后一个任务、忘掉前面任务的情况。
5. 从调研中提炼的实操建议与避坑记录
5.1 资源有限时怎么选型
不可能每个人都有几千张卡跑大规模预训练。我测试过一条资源有限但效果不错的路径:先用公开的基座模型(如 LLaMA、Qwen、Mistral),然后用低成本的方法做领域适配和指令微调。我自己复盘过多次项目,发现指令微调阶段投入产出比是最高的——如果基座模型本身已经很强,你用 2-4 万条高质量指令数据做 LoRA 微调,就能在特定任务上获得和全参数微调几乎一样的性能。但这里有个前提:你要对基座模型的弱项有清晰的认知,评估它缺什么、数据集要补什么,而不是盲目混合数据微调。在这条思路上,数据质量又被放大了一个量级。我建议把预算的 30% 花在数据清洗上,因为小数据量下,一条坏数据对模型的影响是巨大的——比例上比大数据训练时更敏感。
5.2 评估体系怎么搭
训练过程如果只有一个 loss 曲线,基本等于盲人摸象。我见过不少团队的评估方式是训练完在下游几个公开 benchmark(比如 GLUE、SuperGLUE、MMLU)上跑一遍,但等到训练结束才发现问题,已经很难定位到具体原因了。更高效的做法是搭一套“三明治”评估体系。第一层是训练中高频监控指标,比如 loss、token 级别的准确率、梯度范数、参数更新幅度,每 500 步记录一次。第二层是轻量级测试集,一批固定的小任务(100-500 条样本),每次 checkpoint 落盘时自动跑一遍,可以快速发现能力退化。第三层是重量级测试集,也就是公开 benchmark 和领域定制任务,训练结束时和关键节点才跑。三层组合起来,既能快速发现问题,又不至于因为评估太频繁浪费计算资源。评估任务里一定要设计“越界”测试——给模型一些训练中从未见过的格式和任务,才能真实反映模型的泛化能力。
5.3 复现踩坑记录
把这次调研中我们团队实测的坑记录一下。第一个坑是 loss 震荡问题,特别是加了多任务后,不同任务的 loss 量级差异大,表现为总体 loss 不降、单个任务 loss 乱跳。解决方案是给辅助 loss 设一个相对较低的最大值上限,再配合梯度裁剪,一般能压住。第二个坑是数据采样分布不均衡,代码数据权重设置过高,导致模型在通用文本上的表现明显下降,调整之后回归正常。第三个坑是位置编码外推后长文本任务困惑度升高,后来用混合长度训练解决了——训练数据里混入 10%-20% 的长文档样本,模型很快适应了超过预训练长度的输入。第四个坑是 DPO 训练中模型很快“过拟合”到偏好数据的表达模板,输出多样性下降,排查后确认是 beta 设得偏低,调整后恢复正常。这些坑单独看都不大,但加在一起足以让整个项目延期一个多月,值得提前预防。
6. 常见误区与经验速查
6.1 常见误区盘点
我挑几个调研中出现频率最高的误区。误区一:数据越多越好。实际上在数据质量不上台阶的前提下一味增加数量,边际收益急剧递减,对大模型来说算力浪费非常严重。误区二:预训练只要把 loss 降到最低就完事。这个是完全错误的理解,loss 低不等于模型强,很多情况下模型过拟合了训练集,loss 表现亮眼,但下游任务结果一塌糊涂。误区三:后训练是万能解药。我再强调一遍,基座模型的缺陷靠后训练是无法真正弥补的。有些能力必须靠预训练阶段解决,比如长程推理、知识广度、跨语言能力。如果预训练阶段做得不好,后训练阶段投入再大效果也有限。误区四:只重视正向样本,忽略负样本。这个在 DPO 和指令微调里特别常见,没有足够数量和质量负样本的偏好数据,模型根本学不会“拒绝做错事”。相反,在偏好数据里加一定比例的明显错误负样本,模型的安全性、可控性提升非常明显。
6.2 经验速查表
我整理了一张简表,方便日常训练时快速对照参考。
| 环节 | 核心要点 | 常见做法 | 易踩的坑 |
|---|---|---|---|
| 数据采集 | 来源多元化,网页+代码+行为日志+合成数据 | 网页数据占 60% 以上 | 忽略结构化数据,多样性不足 |
| 数据清洗 | 格式清洗、去重、毒性过滤四步走 | MinHash+LSH 文档级+段落级去重 | 过度去重损失知识多样性 |
| 数据配比 | 按 token 预算设置采样权重 | 代码权重高于文本、对话 5%-15% | 长文本被系统性低估,权重失衡 |
| 预训练目标 | 主目标+辅助损失多任务联合 | causal LM + masked token + 行为预测 | 辅助任务权重过高影响语言能力 |
| 规模计算 | 用 scaling 曲线外推资源 | 5B/10B/20B token 在小模型上预测 | 直接套公式,忽视数据质量影响 |
| 长上下文 | 位置编码外推或层级化编码 | RoPE 改造、YA RN、NTK-aware | 超长输入下外推性能骤降 |
| 架构选择 | dense 优先、MoE 谨慎 | 7B-13B dense 最稳 | MoE 路由失衡,训练崩溃 |
| 指令微调 | 数据多样性第一,负样本占比 3%-10% | 模板改写+人工筛选 | 数量堆砌,覆盖不足 |
| 偏好对齐 | 小数据用 DPO,大数据用 RLHF | beta 从 0.1 起步调 | beta 过低导致表达多样性下降 |
| 防遗忘 | 数据回放+L2+LoRA | 混入 5%-20% 预训练数据 | 微调数据与预训练分布差异过大 |
6.3 一个值得单独说的经验
最后说一个我在调研中发现但不太被提及的细节。很多效果拔尖的 WAM 模型,在训练过程中会专门设计“数据温度”这个参数——随着训练步数推进,逐步提高数据集中高难度样本的采样概率。这个思路类似 curriculum learning 但更平滑,它不改变数据本身,只影响采样的概率分布。团队的实验结果是:采用数据温度调度后,同样的数据量,模型在复杂推理任务上的表现提升了大约 4%。原理也很好理解——模型早期能力弱,喂太难的样本容易让训练发散;后期能力增强,如果仍然大量采样简单数据,则模型无法继续突破。实现方式不复杂,就是在正常的 dataloader 里给每个样本加一个权重,权重随训练步数变化。但要注意,这个“温度”需要用验证集监控,防止出现过拟合特定分布的情况。
我个人在这些项目里最大的体会是,训练一个 WAM 模型,本质上是在管理一个复杂的依赖系统。数据清洗的质量决定上限,预训练目标的设计决定能力边界,后训练阶段的细节决定最终产品体验。三个核心维度各自都有成熟的方法论,但真正拉开差距的,是把它们正确组合起来的系统能力。如果你正在准备启动类似的项目,我建议不要急着堆算力,先花两周把数据策略和评估体系搭扎实,后面会省下大量的返工时间。