大模型后训练指南

31 阅读17分钟

最近看了MIT 6.S191 2025这个讲座感觉讲的挺好的,然后写了一篇总结,大家感兴趣的话可以直接看视频,链接我放到文章最后。

讲座核心:  这个讲座主要讲的是,当我们有了一个基础的大语言模型(就像刚出厂的毛坯引擎)之后,如何通过“后期训练”把它调教成一个真正有用、能听懂指令、能好好回答问题的智能助手(就像把引擎装到车里,并进行各种调试,让车能开、好开)。

讲师介绍 (0:00 - 1:06)

  • 讲师叫 Maximilien (Max),在 Liquid AI 做博士后研究。
  • 他还写了一本叫《LM 工程师手册》的书。
  • 他对开源社区有不少贡献,比如写博客、微调模型、开发模型合并/评估工具等。
  • 这次讲座会覆盖后期训练的 数据准备、训练算法、效果评估,还会聊聊 未来趋势 和 测试时计算扩展

第一步:什么是后期训练 (Post-training)?(1:06 - 2:51)

  1. 前期训练 (Pre-training) 是什么?
    • 想象一下,我们给模型看海量的网上文本(几万亿个词)。
    • 训练目标很简单:根据前面的词,预测下一个词是什么。
    • 这样训练出来的是一个 基础模型 (Base Model)
    • 缺点:  这个基础模型只会“接话”,但你问它问题,或者让它按指令做事,它可能做得不好,因为它没学过怎么“对话”或“听指令”。
  2. 后期训练 (Post-training) 的目标是什么?
    • 把只会“接话”的基础模型,变成一个有用的 智能助手 (Assistant)
    • 让它能理解并遵循指令,能回答问题。
  3. 后期训练主要分两步:
    • 为什么需要:  SFT 后的模型虽然能回答问题,但答案可能不够好,比如不够安全、不够有用,或者语气不对。
    • 怎么做:  我们不只给一个好答案,而是针对一个问题,给模型看两个答案:一个是  “我们喜欢的答案 (Chosen)” ,另一个是  “我们不喜欢的答案 (Rejected)” 。就像告诉小孩:“这样说很好,那样说不好”。
    • 学到什么:  模型学会了区分好坏答案,更倾向于生成我们喜欢的、符合人类偏好的回答。
    • 怎么做:  我们给模型看很多“指令”和对应的“好答案”的例子。就像教小孩看图说话,告诉他“看到这个图片(指令),要这样说(答案)”。
    • 学到什么:  模型学会了按特定格式(后面会讲的“聊天模板”)回答问题,知道该怎么回应指令了。
    • 效果:  模型现在能听懂指令,也能回答问题了。
    • 第一阶段:监督微调 (Supervised Fine-Tuning, SFT)
    • 第二阶段:偏好对齐 (Preference Alignment)

第二步:后期训练需要什么样的数据?(2:51 - 5:24, 8:32 - 11:55)

  1. 数据量 vs 质量:
    • 跟前期训练需要海量(万亿级)数据不同,后期训练的数据量 少得多
    • 但后期训练更看重数据的 质量。一点点高质量数据,效果可能比大量低质量数据好。
  2. 不同目标的微调,数据需求不同:
    • 目标:让模型精通某一项特定任务(如总结摘要、拼写检查)。
    • 数据需求:需要的样本量 更少,更容易做。
    • 目标:让模型在某个专业领域(如医疗、法律、金融)或特定语言上表现更好。
    • 数据需求:数据量 相对较少,但需要包含该领域的 专业知识
    • 目标:打造像 ChatGPT 那样什么都能聊的通用助手。
    • 数据需求:需要 大量 (可能上百万条)多样化 的高质量指令和答案数据。
    • 通用型微调 (General Purpose):
    • 领域特定型微调 (Domain-Specific):
    • 任务特定型微调 (Task-Specific):
    • 注意:  这些数据量只是粗略估计,具体需要多少还跟模型大小(大模型通常需要更少微调数据)、任务难度、基础模型本身的能力有关。比如,基础模型完全不懂某种语言,光靠微调很难教会它。
  3. 什么是“好”的后期训练数据?(8:32 - 11:55) - 非常重要!
    • 准确性 (Accuracy):  答案是不是对的?是不是切题?(简单问题好判断,复杂问题如代码、数学可能需要自动化测试或解题器来验证)。
    • 多样性 (Diversity):  数据要五花八门,覆盖用户可能问的各种问题和场景。(真实用户对话通常很多样。注意:用太多机器生成的“合成数据”可能导致多样性下降)。
    • 复杂性 (Complexity):  问题要有挑战性,答案要详细、有深度,最好包含推理步骤(比如“一步一步思考”)。(讲师举例:简单问埃菲尔铁塔多高 vs 复杂地问多个相关细节)。

第三步:什么时候应该考虑微调模型?(5:24 - 8:32)

  • 前提:  先试试更简单的方法,比如 上下文学习 (In-context Learning)  或 检索增强生成 (RAG) (就是给模型提供相关资料让它参考着回答)。因为这些方法更容易测试。
  • 什么时候微调?  如果简单方法效果不够好(比如答案质量、速度、成本不满意),可以考虑微调。以下情况适合微调:
    1. 改变语气或格式:  不喜欢模型默认的写作风格(比如写邮件的语气),可以通过微调改变。
    2. 注入(少量)知识:  教模型一些特定领域的知识,比如关于你公司的事实。(注意:微调能增加的知识有限,不能从零开始学一个庞大领域)。
    3. 模型蒸馏 (Distill):  把一个大模型(如 GPT-4)的能力“压缩”到一个小模型里,以降低成本、提高速度。
    4. 提升特定任务的输出质量:  对于非常窄的任务(比如画流程图),微调可以让你自己的模型在这个任务上超过通用大模型。
  • 其他原因:
    • 控制权 (Control):  不想把敏感数据通过 API 发给第三方。
    • 定制化 (Customizability):  想要完全符合自己需求的模型风格和行为。

第四步:数据的格式与生成方法 (11:55 - 17:45)

  1. 数据格式:

    • 指令数据 (SFT):  通常包含 指令 (instruction)输入 (input, 可选)输出 (output)。有时还有 系统提示 (system prompt) 来设定角色(如“你是一个来自MIT的数学家”)。
    • 偏好数据 (Preference Alignment):  包含 提示 (prompt)选择的答案 (chosen answer)拒绝的答案 (rejected answer)
  2. 数据生成流程 (Data Generation Pipeline):

    • 去重 (Deduplication)。
    • 数据净化 (Decontamination):确保训练数据里没有混入测试集的内容。
    • 关键词过滤 (Filtering):移除不想要的词语。
    • 用规则(启发式方法)或用另一个 LLM 作为“裁判”来给生成的答案打分,筛掉差的。
    • 只有答案文本?让 LLM 生成对应的问题(反向翻译 Back-translation)。
    • 只有问题?让 LLM 生成答案。
    • 甚至让 LLM 生成指令和答案。
    • 种子数据 (Seed Data):  可以是任何东西,比如原始文本、已有的问答对、用户问题等。
    • 生成 (Generation):  用 LLM 补全数据。比如:
    • 评分与过滤 (Scoring & Filtering):
    • 清理 (Cleaning):
  3. 具体例子:

    • 生成“指令遵循 (Instruction Following)”数据:
    • 生成“偏好”数据 (类似 UltraFeedback):
    1. 准备一些提示 (prompt)。
    2. 让 多个不同的 LLM 对同一个提示生成答案。
    3. 用一个  “裁判 LLM”  给这些答案打分。
    4. 选得分最高的作为“Chosen”,得分最低的作为“Rejected”。
    5. 清理数据(去重、移除太短的答案等)。
    1. 准备一些基础指令和“约束条件”(如“回答必须全小写英文”)。
    2. 让 LLM 根据“指令+约束”生成答案。
    3. 写程序自动检查 答案是否真的遵循了约束(比如检查是不是全小写、是不是英文)。
    4. 净化(比如确保不含 IFEval 测试集的内容)、过滤。
  1. 案例学习 (OpenHermes/Perfect Blend):
    • 这是一个开源的数据集混合方案,用于通用型微调。
    • 它混合了多种类型的数据:大量数学、代码,加上一些聊天、指令遵循数据。
    • 这给出了一个通用模型微调时,数据类型配比的参考。

第五步:应用聊天模板 (Chat Template) (17:45 - 19:17)

  • 是什么?  在把数据喂给模型训练(尤其是 SFT 阶段)之前,要给数据套上一个固定的 格式/结构
  • 怎么做?  用特殊的标记(比如 [INST]用户:助手: 等)来区分谁在说话(系统、用户、助手)以及对话的开始和结束。
  • 为什么重要?
    • 让模型学会对话的轮转结构。
    • 这是区分只会“接话”的基础模型和能进行多轮对话的微调模型的关键之一。模型需要学习并遵循这个模板。

第六步:后期训练的算法 (19:17 - 30:00)

  1. 推荐的微调库:

    • TRL (Hugging Face):  功能强大,算法更新快,紧跟研究前沿。
    • Axolotl:  用户友好,用 YAML 文件配置训练,方便分享和参考他人设置。可以帮你预处理数据。
    • Unsloth: 非常 适合单 GPU 微调,效率极高,能方便地处理模型量化。
  1. SFT 的技术:

    • 先把基础模型 量化 (Quantize) 成低精度(比如 4-bit),减少模型占用的显存。
    • 然后在量化后的模型上做 LoRA 微调。
    • 显存需求最低,适合硬件资源非常有限的情况。
    • 缺点是训练速度比 LoRA 慢,效果可能比 LoRA 差一点点。
    • 冻结大部分原模型参数,只训练一小部分新增的“适配器”参数(比如只占总参数的 0.5%)。
    • 大大减少 了计算和显存需求,训练更快。
    • 但仍然需要加载 完整 的基础模型到显存。
    • 像预训练一样,训练模型的所有参数。
    • 效果最好,但需要 非常多 的显存 (VRAM) 和计算资源。
    • 全参数微调 (Full Fine-tuning):
    • 参数高效微调 (Parameter-Efficient Fine-Tuning, PEFT) - LoRA 是最常用的:
    • QLoRA (Quantized LoRA):
    • 选择建议:  如果资源够,优先 LoRA;如果显存实在不够,用 QLoRA;除非你是大公司追求极致性能,否则一般不需要全参数微调。
  1. 偏好对齐的技术:

    • 更新、更简单的方法。
    • 只需要加载 2 个模型(或者用 LoRA 的话,可能只需要 1 个基础模型 + 2 套适配器)。
    • 训练更快、更便宜、更容易调参。
    • 理论上效果可能略低于 PPO,但实践中往往足够好,甚至因为更容易调优而效果更佳。
    • “经典”方法,效果好。
    • 缺点:  非常复杂,训练时需要同时加载 3 个模型(原始模型、训练中的模型、打分模型 Reward Model),还需要计算 KL 散度防止模型跑偏太远。计算成本 非常高
    • 有很多种(超过 100 种!),但主要了解两种:
    • PPO (Proximal Policy Optimization):
    • DPO (Direct Preference Optimization):
    • 选择建议: 强烈推荐 DPO,除非你有 OpenAI 级别的资源和需求。
  1. 重要的训练参数:

    • 学习率 (Learning Rate):  控制每次更新参数的幅度,非常重要。讲师给了一些常用值范围。
    • 批次大小 (Batch Size) / 最大长度 (Max Length):  决定一次喂给模型多少数据、每条数据多长。直接影响显存占用。可以通过“梯度累积”技巧使用较小的物理 Batch Size 达到等效的大 Batch Size。
    • 训练轮数 (Epochs):  数据集完整过几遍,通常 3-5 轮。
    • 优化器 (Optimizer):  更新参数的算法,推荐 AdamW
    • 注意力机制 (Attention Mechanism):  推荐使用 Flash Attention,对处理长序列效率很高。
  1. 监控训练过程:

    • 损失曲线 (Loss Curve):  理想是平稳下降。如果出现尖峰(loss spike),可能是学习率太高了。
    • 验证集损失 (Validation Loss):  用一小部分(比如 1-2%)没参与训练的数据来验证。如果训练损失下降,但验证损失上升,说明可能 过拟合 (Overfitting)  了。
    • 梯度范数 (Gradient Norm):  参数更新的幅度。不希望看到太多尖峰或持续升高,可能表示训练不稳定或数据有问题。

第七步:模型合并 (Model Merging) (30:00 - 40:18)

  • 是什么?  一个有点“黑科技”但非常有效的技术:把多个 已经训练好的、同结构、同大小 的模型(比如多个 Llama 3 8B 的微调版)的参数,通过某种方式(如加权平均)“融合”起来,得到一个 可能更强 的新模型。
  • 为什么用?  可以结合不同模型的优点。现在很多公司和开源社区都在用。
  • 要求:
    • 模型架构必须 相同 (比如都是 Llama 3)。
    • 模型大小必须 相同 (比如都是 8B)。
    • 最好用全精度模型合并,量化模型合并效果会打折扣。
  • 常用技术:
    • TIES:  保留那些在所有源模型中最重要的参数。
    • DARE:  在合并前随机丢弃一些参数,增加稀疏性。
    • 符号处理 (Sign Consensus):  解决一个模型的参数是正、另一个是负,直接加起来会抵消的问题。
    • 可以合并 多个 模型,可以设置不同的权重 (weight) 和密度 (density)。选参数有点像“炼金术”,需要实验。
    • 简单平均 (Simple Average):  直接加权平均参数。
    • SLERP (Spherical Linear Interpolation):  在“球面上”插值,通常比线性平均效果好,但一次只能合并 两个 模型。
    • TIES-Merging (包括 DARE, TIES 等变体):  更高级的方法。
  • 案例学习 (Daredevil 模型):
    • 讲师展示了他合并多个模型(包括其他合并过的模型,形成“家族树”)得到 Daredevil 的过程。
    • 使用了 TIES 类的合并方法,通过配置文件 (YAML) 指定了不同的模型、权重和密度。
    • 结果:合并后的 Daredevil 在一些评测基准上 超过了 所有原始模型。
  • 应用场景:特定语言模型增强
    1. 假设你训练了一个芬兰语模型,它芬兰语很好,但其他语言(如英语)或通用能力下降了(灾难性遗忘)。
    2. 你可以把它和通用的 Llama 3 Instruct 模型 合并
    3. 结果:得到一个既懂芬兰语,又保持了通用能力的新模型。模型合并有助于  “叠加”  不同技能。

第八步:模型评估 (Evaluation) - 非常重要但困难 (40:18 - 49:26)

**
**

  • 为什么重要?  后期训练的目标是让模型更好,评估就是衡量“好坏”的尺子。没有好的评估,就可能在优化错误的方向。
  • 为什么困难?  评估 LLM 没有完美的方法,现有方法各有优劣。
  • 主要评估方法:
    • 方法:用一个强大的 LLM (或多个 LLM 组成的“评审团”) 来代替人类,给模型输出打分或比较优劣。
    • 优点:比人工评估可扩展性强,成本更低,速度更快,与人类偏好相关性较好,能处理复杂任务。
    • 缺点:裁判 LLM 自身也有偏见(类似人类偏见),需要验证裁判的质量(可能还是需要少量人工抽查)。
    • 例子:Chatbot Arena (聊天机器人竞技场)。
    • 方法:让人类用户与两个匿名的模型聊天,然后投票选出哪个更好。
    • 优点:直接反映人类偏好,灵活(可以评估特定方面如毒性、创意),不易污染。
    • 缺点:成本高、速度慢、难扩展,人类也有偏见(比如偏爱更长、更自信的回答,即使是错的)。
    • 例子:MMLU (综合知识选择题), GSM8K (数学应用题), HumanEval (代码生成)。
    • 方法:用固定的数据集提问,用固定的指标(如准确率)打分。
    • 优点:可扩展、成本低、可复现、能评估特定技能。
    • 缺点:与真实用户体验脱节 (用户是聊天,不是做选择题),可能无法评估开放式回答,容易被“污染”(模型可能见过测试题)。
    • 自动化基准测试 (Automated Benchmarks):
    • 人工评估 (Human Evaluation):
    • LLM 作为裁判 (LLM-as-Judge):
  • 核心问题:  自动化基准测试的得分 经常与 人类偏好(人工评估或 LLM 裁判结果)不一致!  (讲师展示了相关性图表)。
  • 结论:  不能只依赖一种评估方法。需要 结合使用 多种方法(比如自动化基准 + LLM 裁判 + 少量人工抽查)来更全面地了解模型表现。
  • 创建自己的评估:
    • 尽早开始(甚至在微调前就设计好评估方案)。
    • 根据模型在评估中的表现,不断迭代改进评估数据集。
    • 结合不同类型的评估。
    • 不仅和自己之前的模型比,也要和其他公开模型比。

第九步:未来趋势 - 测试时计算扩展 (Test-Time Compute Scaling) (49:26 - 57:12)

**
**

  • 核心思想:  除了通过训练提升模型能力,我们还可以在 用户提问时 (测试时/推理时)  投入更多的计算,来换取更好的答案质量。
  • 主要技术:
    • 更进一步,打分模型不只给最终答案打分,而是给答案生成的 每一步推理过程 打分。
    • 模型可以探索多个推理路径,如果一步走错了,可以回溯,选择评分更高的路径继续。
    • 就像在“思维树”中搜索最佳路径。
    • 更复杂,但潜力更大。
    • 生成 N 个答案。
    • 用一个 打分模型 (Reward Model)  或 裁判 LLM 给每个答案打分。
    • 选择得分最高的那个答案。
    • 通常比多数投票效果更好,但需要一个评分机制。
    • 对同一个问题,让模型生成 多个 不同的答案(通过调整采样参数,增加随机性)。
    • 选择出现次数最多的那个答案。
    • 简单有效,能减少因随机采样导致的错误。
    • 多数投票 (Majority Voting):
    • 最佳选择 (Best-of-N):
    • 过程监督奖励模型 (Process-Supervised Reward Models, PRM) / 思维链搜索:
  • 打分模型 (Reward Model) 来源:  可以在偏好对齐阶段训练得到(PPO 中就有),也可以直接用通用 LLM 做裁判,或者专门训练一个用于特定任务(如安全性)的打分模型。
  • 效果:  实验表明,小模型(如 Llama 3.1 3B)通过在测试时生成更多候选答案(增加计算量),可以在某些任务(如数学)上 超过 比它大得多的模型(如 Llama 3.1 70B)。
  • 本质:  用 推理时的计算成本/延迟 来换取 输出质量的提升

第十步:总结 (57:12 - 58:31)

**
**

  • 后期训练是一个 循环迭代 的过程:
    1. 精心准备数据 (Data Creation)  (大约占 1/3 时间)
    2. 训练模型 (Training)  (SFT, 偏好对齐, 可能还有模型合并)
    3. 评估效果 (Evaluation)  (大约占 1/3 时间)
  • 评估结果会反过来指导你 如何改进数据(哪个方面弱就补充哪方面的数据,提升数据质量、多样性、复杂性、准确性)。
  • 通过不断循环,模型会越来越好。

Q&A 中的补充信息 (相关部分)

  • 微调 vs RAG:  它们不是互斥的,往往是 结合使用。微调可以教模型特定技能或风格,RAG 提供实时信息。用微调过的模型再配合 RAG,效果通常更好。
  • 多轮对话数据:  SFT 和偏好对齐都可以,并且 应该 使用多轮对话数据,因为模型在单轮对话中表现好,不代表在多轮中也好。
  • 模型合并与 Tokenizer:  模型合并要求使用 相同 的 Tokenizer(分词器)。在后期训练阶段更换 Tokenizer 会导致性能急剧下降,因为模型需要重新学习词语和内部表示的映射。Tokenizer 的设计通常在预训练之前完成。
  • 测试时计算扩展与不确定性:  生成多个答案时的得分分布,或者答案的一致性,可以 用来衡量模型对答案的“确信度”,这对于安全或关键应用可能有用。