FineInstructions:将合成指令数据扩展到预训练规模 FineInstructions: Scaling Synthetic Instructions to Pre-Training Scale
用1800万模板将预训练文档转为指令-答案对,提升LLM预训练效率
前置知识
自监督预训练(Self-Supervised Pre-Training)
大语言模型的初始训练阶段,通过在海量无结构文本上执行「预测下一个词」的语言建模目标来学习。模型在这一阶段吸收了绝大部分知识,消耗了大部分计算资源和时间。典型的预训练语料包括网页、书籍等自然来源的文本,规模可达数万亿 token。预训练完成后,模型才能进一步通过指令微调来学习遵循用户指令的能力。
本文的核心创新在于重新定义预训练阶段的数据格式,将传统的无结构文本替换为合成的指令-答案对,因此理解传统预训练的工作机制是理解本文贡献的前提。
指令微调(Instruction Tuning)
在预训练之后,使用由指令和对应响应组成的监督数据对模型进行进一步训练的过程。指令微调使模型学会遵循用户指令、以对话方式回答问题,是从「语言模型」变为「助手」的关键步骤。典型的数据格式为(指令,答案)对,规模通常为几千到几万个样本,远小于预训练数据。
本文的核心思想是将指令微调的数据格式引入预训练阶段,用指令-答案对替代传统的无结构文本进行「从头预训练」,因此理解指令微调的概念和局限性是理解本文动机的关键。
指令模板(Instruction Templates)
将用户的具体查询泛化后得到的可复用模板,通过在查询中特定实体或场景的位置插入标签(如 )来实现。例如,用户查询「梅西和C罗谁更有影响力?」可以泛化为模板「在 实体A 和 实体B 中,谁更 特征?」。模板可以在后续阶段与不同的文档匹配并实例化为具体的指令。
本文创建了约 1800 万个指令模板,这是实现数据多样性和规模化的关键创新,使合成数据能够覆盖真实用户的多样化查询场景。
语义嵌入与检索(Semantic Embedding and Retrieval)
使用嵌入模型将文本转换为高维向量表示,通过计算向量间的余弦相似度来衡量语义相关性。本文使用 BGE-M3 嵌入模型,并在此基础上构建 FAISS 检索索引,实现高效的文档-模板匹配。通过两次微调嵌入模型并引入自定义的 Gaussian 池化层,模型能够为长文档的不同部分生成多个局部嵌入,从而检索到与文档各节内容相关的不同模板。
高效准确的文档-模板匹配是整个流水线的核心环节,决定了生成的指令-答案对的质量和相关性,理解嵌入检索机制有助于理解流水线的技术细节。
蒸馏模型(Distilled Models)
通过在大型教师模型生成的标注数据上微调小型模型得到的高效模型。本文训练了三个任务特定的蒸馏模型:查询泛化模型(基于 Llama-3.2 1B Instruct)、实例化模型(基于 Llama-3.2 3B Instruct)和判断模型(Flow Judge 3.8B)。这些小型模型能够高效地执行流水线中的各个步骤,使得在预训练规模(数十亿 token)上生成合成数据成为可能。
蒸馏策略是本文实现大规模数据生成的关键工程创新,使得整个流水线在计算上可行,而不必依赖昂贵的大模型进行每一步操作。
高斯池化(Gaussian Pooling)
本文提出的自定义池化层,在标准的全局均值池化基础上,额外生成 K 个「局部」嵌入。每个局部嵌入使用以文本序列不同位置为中心的高斯核进行加权计算,使不同嵌入关注文档的不同区段。具体地,给定 token 嵌入序列 $H = [h_1, \ldots, h_T]$,高斯核中心位置 $c_k = \rho_k T$(其中 $\rho_k = \frac{k}{K+1}$),宽度参数 $\sigma = 0.05$,混合权重 $\alpha = 1.0$。本文选择 $K = 5$ 个块,产生 6 个检索嵌入(包括全局嵌入)。
高斯池化使模型能够为长文档的不同部分检索不同的指令模板,确保生成的指令-答案对能够覆盖文档的全部内容,而非仅与文档整体主题相关。
研究动机
当前大语言模型的训练分为两个阶段:大规模自监督预训练和小规模指令微调。预训练阶段使用海量无结构文本,通过「预测下一个词」的目标学习,这一阶段承担了模型绝大部分知识的编码。然而,指令微调阶段面临严重的数据瓶颈问题。现有的指令微调数据集存在多重缺陷:许多数据集规模很小,仅包含几千个样本(如 Conover et al., 2023; Rajani et al., 2023);另一些则过于狭隘和不现实,主要由学术 NLP 任务转换而来,使用相对少量的任务模板(如 Sanh et al., 2021; Wei et al., 2021; Mishra et al., 2022)。虽然前沿语言模型被用于生成大量更多样的指令-答案示例,但这已被证明最终只能通过蒸馏来肤浅地模仿这些模型(Taori et al., 2023; Mukherjee et al., 2023; Gudibande et al., 2023)。这些问题严重限制了指令微调阶段的效果,使其主要仅用于帮助模型学习遵循指令和学习响应风格,而预训练阶段仍然是模型知识的主要来源。
本文的目标是本文的具体目标是提出一种称为 FineInstructions 的流水线,将预训练语料库中的无结构文档大规模转换为多样且真实的指令-响应对。通过这种方式,研究者希望实现两个关键目标:第一,在预训练规模上有效地执行监督式指令微调,使模型在整个预训练过程中就学习遵循指令的能力;第二,将预训练数据进一步推向与下游用户实际使用场景(回答用户提示)更加一致的分布,从而提高知识吸收效率和模型性能。最终目标是证明仅使用 FineInstructions 生成的指令-答案对进行预训练,能够超越标准预训练和其他已提出的合成预训练技术。
与已有工作不同的是,本文的独特切入角度在于,与之前仅在预训练后进行小规模指令微调或简单地用 LLM 重写文档的方法不同,FineInstructions 将指令微调的范式直接引入预训练阶段。关键创新在于使用真实用户编写的约 1800 万个查询来创建指令模板,而非手工设计或众包少量模板。这些模板通过泛化真实用户查询得到,然后与预训练文档进行语义匹配和实例化。这种方法本质上是一种弱监督程序,将大规模无标签语料转换为大规模监督数据集,类似于程序化标注(Ratner et al., 2017)。与其他合成转换流水线相比,FineInstructions 生成的数据在多样性、复杂性和质量上都有显著差异,能够生成更符合真实用户任务的长尾查询(如推荐、建议等),而非局限于学术基准任务。
核心方法
FineInstructions 流水线的整体思路是将预训练文档转换为独立的指令-答案对,而非传统的无结构文本或阅读理解式问答。直觉上,如果模型在预训练阶段就能接触到大量「用户提出指令、模型给出回答」的训练样本,那么模型将更早地学会遵循指令的能力,且知识吸收更加高效。技术路线分为四个主要阶段:首先,从真实用户查询中提取并泛化出约 1800 万个指令模板;其次,使用微调的嵌入模型将预训练文档与兼容的指令模板进行匹配;然后,使用蒸馏的实例化模型将模板填充为具体指令,并从文档中提取摘录作为答案;最后,使用判断模型对生成的指令-答案对进行质量评分和过滤。整个流水线使用三个高效的蒸馏模型(1B-3B 参数)来执行各步骤,使得在预训练规模(数十亿 token)上生成合成数据在计算上可行。
本文的核心创新点在于使用真实用户查询来创建大规模指令模板库,这与已有方法有本质区别。之前使用指令模板的方法通常采用手工设计或众包的方式,导致模板数量仅为几百到几千个,多样性和覆盖范围有限。FineInstructions 则从 16 个不同的数据源收集了约 1800 万条真实用户查询,包括 WildChat(657K)、LMSys Chat(559K)、Reddit QA(7.47M)、GooAQ(3.01M)等,这些查询代表了真实用户与 LLM 交互时的多样化需求。通过训练一个查询泛化模型(Llama-3.2 1B Instruct),将这些具体查询转换为带有 标签的通用模板。例如,「梅西和C罗谁更有影响力?」被泛化为「在 实体A 和 实体B 中,谁更 特征?」。另一个关键创新是自定义的 Gaussian 池化层,使嵌入模型能够为长文档的不同部分生成多个局部嵌入,从而检索到覆盖文档各节内容的不同模板,而不是只检索与文档整体主题相关的模板。
方法步骤详情
FineInstructions 流水线包含以下具体步骤:第一步,生成指令模板。从 16 个数据源收集约 1800 万条真实用户查询,使用 OpenAI Moderation API 过滤有害查询,并使用 Tulu 3 的方法进行去污染。选择约 5 万条查询子集,通过提示 LLM 将其转换为「银标准」合成模板,同时为每个模板生成「兼容文档描述」。在这些数据上微调 Llama-3.2 1B Instruct 模型作为查询泛化模型,然后用它将全部约 1800 万条查询转换为模板和兼容文档描述。第二步,匹配文档与模板。使用 BGE-M3 嵌入模型嵌入约 1800 万个模板的兼容文档描述,构建 FAISS 检索索引。对于预训练文档语料,提示 LLM 将约 20 万个文档转换为描述文档知识类型的文本,用相同嵌入模型嵌入后查询索引,检索 5 个潜在兼容模板。使用 LLM 判断文档和模板的兼容性,生成硬正例(1)和硬负例(0),用余弦相似度损失微调 BGE-M3。第二次微调引入 Gaussian 池化层,训练模型为文档的不同部分生成独立的局部嵌入。检索时,余弦相似度超过阈值(0.865)的模板被视为匹配候选,通过加权随机采样鼓励多样性。第三步,生成指令和答案。使用约 10 万个预训练文档,每个文档有 6 个兼容模板,提示 LLM 实例化模板并从文档中提取相关摘录作为答案。确保摘录文本在生成答案中的比例大于等于 0.80。使用 标签和省略号表示法减少需要生成的 token 数。在约 10 万个银标准示例上微调 Llama-3.2 3B Instruct 作为实例化模型,再用 LLM 生成约 10 万个新示例进行第二轮微调,包括模板不兼容时输出 null 的示例。第四步,判断和过滤。使用 Flow Judge 3.8B 模型对生成的指令-答案对进行 5 分制评分(1-5 分),保留评分大于等于 4 的高质量对。
技术新颖性
FineInstructions 的技术新颖性体现在多个层面。首先,在数据来源上,这是首次系统性地将大规模真实用户查询(约 1800 万条)转化为指令模板,而非依赖手工设计或学术任务转换。这些查询来自 16 个不同的数据源,涵盖了从日常对话到专业领域的多样化场景。其次,在匹配机制上,本文提出了 Gaussian 池化层,这是一种创新的嵌入方法,能够在嵌入长文档时同时生成全局嵌入和多个局部嵌入。通过在输入注意力掩码上应用高斯权重,模型能够为文档的不同部分生成独立的语义表示,实现更精细的文档-模板匹配。实验显示,用于检索模板的块索引与检索到的答案摘录在源文档中的位置之间的皮尔逊相关系数达到 0.99。第三,在生成效率上,本文引入了 标签机制,允许模型通过生成标签和省略号来引用文档中的长文本,而非逐 token 生成,大幅减少了合成数据生成的计算成本。第四,整个流水线采用「银标准」蒸馏策略,用大型 LLM(Llama-3.3 70B Instruct)生成少量高质量标注,然后训练小型高效模型(1B-3B 参数)来执行各步骤,使得在预训练规模上生成数据成为可能。
实验结果
本文的核心发现在于,使用 FineInstructions 数据进行预训练在多个评估基准上显著优于标准预训练和其他合成预训练方法。在 IPT 语料(约 23B token)上的实验中,FineInstructions 在 MixEval Standard 上达到 31.7%,相比标准预训练的 17.8% 提升了约 69%(相对改进);在 MixEval Hard 上达到 19.2%,相比标准预训练的 14.0% 提升了约 37%;在 MT-Bench-101 上达到 2.8 分,相比标准预训练的 1.9 分提升了约 47%;在 AlpacaEval 上,FineInstructions 的胜率为 73.6%,胜出边际为 47.2%。在 Nemotron-CC 语料(约 300B token)上的实验中,FineInstructions 在 MixEval Standard 上达到 33.0%,相比标准预训练的 24.0% 提升了约 38%;在 MixEval Hard 上达到 21.8%,相比标准预训练的 17.1% 提升了约 28%;在 MT-Bench-101 上达到 3.9 分,相比标准预训练的 3.5 分提升了约 11%;在 AlpacaEval 上,FineInstructions 的胜率为 63.6%,胜出边际为 27.2%。值得注意的是,这些改进在知识密集型(MixEval)和开放式评估(MT-Bench-101、AlpacaEval)基准上都保持一致,表明 FineInstructions 能够在多种任务类型上实现更好的泛化。相比之下,IPT 和 Nemotron-CC 方法在 MixEval 上的改进仅为 0-2%,尽管它们生成了针对评估基准格式的高度相似的指令数据。在更多样化的现实任务评估中,这些技术的表现明显不如 FineInstructions。消融实验表明,判断和过滤阶段进一步提升了性能,特别是在 AlpacaEval 基准上。
查看结构化数据
| 任务 | 指标 | 本文 | 基线 | 提升 |
|---|---|---|---|---|
| MixEval Standard(学术知识问答) | 准确率 (%) | 31.7%(IPT 语料)、33.0%(Nemotron-CC 语料) | 17.8%(标准预训练 IPT)、24.0%(标准预训练 Nemotron-CC) | IPT 语料相对提升约 69%,Nemotron-CC 语料相对提升约 38% |
| MixEval Hard(困难知识问答) | 准确率 (%) | 19.2%(IPT 语料)、21.8%(Nemotron-CC 语料) | 14.0%(标准预训练 IPT)、17.1%(标准预训练 Nemotron-CC) | IPT 语料相对提升约 37%,Nemotron-CC 语料相对提升约 28% |
| MT-Bench-101(多轮对话质量) | Likert 评分(满分 10 分) | 2.8(IPT 语料)、3.9(Nemotron-CC 语料) | 1.9(标准预训练 IPT)、3.5(标准预训练 Nemotron-CC) | IPT 语料提升约 47%,Nemotron-CC 语料提升约 11% |
| AlpacaEval(开放式任务偏好) | 胜率 (%) 和胜出边际 (%) | 73.6% 胜率(IPT 语料,边际 47.2%)、63.6% 胜率(Nemotron-CC 语料,边际 27.2%) | 对比标准预训练、WRAP、Q&A、Nemotron-CC 等基线 | 所有基线方法中胜率最高,IPT 语料相比 IPT 基线提升 5.4 个百分点,Nemotron-CC 语料相比 Nemotron-CC 基线提升 -2.3 个百分点但相比其他基线仍有优势 |
局限与改进
本文作者承认了若干局限性。首先,FineInstructions 流水线的多个环节可以进一步优化,例如源查询的分布校准、匹配嵌入的校准以及采样权重的设定都会影响生成指令的组成和复杂度,最优的混合比例可能带来进一步的性能提升。其次,复杂模板的匹配和实例化仍然具有挑战性,这是生成指令中的一个常见失败模式。将流水线扩展到比本文考虑的 1B 和 3B 参数更大的模型,可能在复杂模板和长文档上产生更强的性能。第三,虽然所选基准提供了语言模型在多种场景下性能的可靠图景,但作者发现缺乏针对长尾现实知识任务(如推荐、建议等)的基准,这类任务与用户实际使用 LLM 的场景更相关。第四,预训练指令-答案对会导致模型持续生成长篇答案,并为选择题或短答案分配低概率,这使得基于对数概率的分类评估基准不适合本文的设置。从我的观察来看,本文的实验仅在 1.8B 参数模型上进行主要评估,虽然在附录中测试了 300M、1.8B 和 7B 模型,但未在更大规模(如 13B、70B)模型上验证效果。此外,流水线的计算成本虽然通过蒸馏模型得到了控制,但仍涉及多个复杂步骤,实际部署的工程复杂度较高。
独立分析的弱点
本文存在若干可以改进的弱点。首先,指令模板的来源分布不均衡:约 50% 的指令来自 GooAQ 数据集,约 27% 来自 Reddit QA,约 9% 来自 LMSys Chat,约 6% 来自 WildChat,其他 12 个数据源各占不超过 1%。这种高度不均衡的分布可能导致生成的指令在某些任务类型上过度代表,而在其他类型上代表性不足。改进方向包括对低频数据源进行上采样,或根据下游任务需求调整数据源的混合比例。其次,匹配阈值(0.865 余弦相似度)是手动选择的,可能不是全局最优。可以考虑使用验证集自动调优阈值,或为不同类型的文档和模板设置自适应阈值。第三,实例化模型在判断模板不兼容时输出 null 的能力仅通过约 5% 的负例样本训练,这可能导致模型在边界情况下的判断不够准确。可以增加更多样化的负例样本,包括语义相近但不完全匹配的文档-模板对。第四,评估基准的选择虽然涵盖了学术任务和开放式任务,但缺乏对长尾现实任务(如推荐、建议、创意写作等)的专门评估,而这些正是用户实际使用 LLM 的主要场景。
未来方向
作者和基于本文成果可以探索多个未来研究方向。首先,优化源查询的分布和混合比例,通过分析下游任务的需求来调整数据源的权重,可能进一步提升性能。其次,将流水线扩展到更大的模型规模(如 13B、70B 参数),可能在复杂模板和长文档上产生更强的实例化效果。第三,开发针对长尾现实知识任务(推荐、建议、创意写作等)的专门评估基准,以更准确地衡量模型在真实使用场景中的表现。第四,探索不同预训练目标的组合,例如将标准语言建模目标与 FineInstructions 的指令-答案目标进行混合训练。第五,研究指令模板复杂度与模型规模之间的最优匹配关系,为不同规模的模型选择合适的模板复杂度分布。第六,将 FineInstructions 的思想扩展到多语言场景,为非英语语言创建类似的指令模板库和匹配流水线。第七,探索更高效的嵌入模型和检索方法,进一步降低流水线的计算成本,使其能够应用于更大规模的预训练语料。
复现评估
本文在可复现性方面做出了积极贡献。作者明确表示将发布代码、训练模型和 FineInstructions 数据集(包含超过 10 亿条合成指令-答案对)。代码已在论文的补充材料中提供,包含流水线的完整实现、提示模板、训练细节和超参数。数据方面,本文使用了多个公开可用的数据源(如 WildChat、LMSys Chat、Reddit QA、GooAQ 等)来创建指令模板,并使用了公开的预训练语料(IPT 的 RefinedWeb 约 23B token 和 Nemotron-CC 约 300B token)。嵌入模型基于公开的 BGE-M3,实例化和判断模型基于公开的 Llama-3.2 和 Flow Judge。算力方面,实验使用 8 块 H100 GPU 进行,这是一般研究团队可以获取的硬件资源。然而,完整的流水线涉及多个步骤(模板生成、嵌入微调、实例化、判断过滤),每个步骤都需要显著的计算资源和时间,完整复现整个流水线可能需要数天到数周的时间。此外,部分数据源(如 LMSys Chat、WildChat)的访问可能受到限制,需要申请数据使用权限。
论文图表