最近看了MIT 6.S191 2025这个讲座感觉讲的挺好的,然后写了一篇总结,大家感兴趣的话可以直接看视频,链接我放到文章最后。
讲座核心: 这个讲座主要讲的是,当我们有了一个基础的大语言模型(就像刚出厂的毛坯引擎)之后,如何通过“后期训练”把它调教成一个真正有用、能听懂指令、能好好回答问题的智能助手(就像把引擎装到车里,并进行各种调试,让车能开、好开)。
讲师介绍 (0:00 - 1:06)
- 讲师叫 Maximilien (Max),在 Liquid AI 做博士后研究。
- 他还写了一本叫《LM 工程师手册》的书。
- 他对开源社区有不少贡献,比如写博客、微调模型、开发模型合并/评估工具等。
- 这次讲座会覆盖后期训练的 数据准备、训练算法、效果评估,还会聊聊 未来趋势 和 测试时计算扩展。
第一步:什么是后期训练 (Post-training)?(1:06 - 2:51)
- 前期训练 (Pre-training) 是什么?
-
- 想象一下,我们给模型看海量的网上文本(几万亿个词)。
- 训练目标很简单:根据前面的词,预测下一个词是什么。
- 这样训练出来的是一个 基础模型 (Base Model) 。
- 缺点: 这个基础模型只会“接话”,但你问它问题,或者让它按指令做事,它可能做得不好,因为它没学过怎么“对话”或“听指令”。
- 后期训练 (Post-training) 的目标是什么?
-
- 把只会“接话”的基础模型,变成一个有用的 智能助手 (Assistant) 。
- 让它能理解并遵循指令,能回答问题。
- 后期训练主要分两步:
-
- 为什么需要: SFT 后的模型虽然能回答问题,但答案可能不够好,比如不够安全、不够有用,或者语气不对。
- 怎么做: 我们不只给一个好答案,而是针对一个问题,给模型看两个答案:一个是 “我们喜欢的答案 (Chosen)” ,另一个是 “我们不喜欢的答案 (Rejected)” 。就像告诉小孩:“这样说很好,那样说不好”。
- 学到什么: 模型学会了区分好坏答案,更倾向于生成我们喜欢的、符合人类偏好的回答。
-
- 怎么做: 我们给模型看很多“指令”和对应的“好答案”的例子。就像教小孩看图说话,告诉他“看到这个图片(指令),要这样说(答案)”。
- 学到什么: 模型学会了按特定格式(后面会讲的“聊天模板”)回答问题,知道该怎么回应指令了。
- 效果: 模型现在能听懂指令,也能回答问题了。
-
- 第一阶段:监督微调 (Supervised Fine-Tuning, SFT)
- 第二阶段:偏好对齐 (Preference Alignment)
第二步:后期训练需要什么样的数据?(2:51 - 5:24, 8:32 - 11:55)
- 数据量 vs 质量:
-
- 跟前期训练需要海量(万亿级)数据不同,后期训练的数据量 少得多。
- 但后期训练更看重数据的 质量。一点点高质量数据,效果可能比大量低质量数据好。
- 不同目标的微调,数据需求不同:
-
- 目标:让模型精通某一项特定任务(如总结摘要、拼写检查)。
- 数据需求:需要的样本量 更少,更容易做。
-
- 目标:让模型在某个专业领域(如医疗、法律、金融)或特定语言上表现更好。
- 数据需求:数据量 相对较少,但需要包含该领域的 专业知识。
-
- 目标:打造像 ChatGPT 那样什么都能聊的通用助手。
- 数据需求:需要 大量 (可能上百万条) 、多样化 的高质量指令和答案数据。
-
- 通用型微调 (General Purpose):
- 领域特定型微调 (Domain-Specific):
- 任务特定型微调 (Task-Specific):
- 注意: 这些数据量只是粗略估计,具体需要多少还跟模型大小(大模型通常需要更少微调数据)、任务难度、基础模型本身的能力有关。比如,基础模型完全不懂某种语言,光靠微调很难教会它。
- 什么是“好”的后期训练数据?(8:32 - 11:55) - 非常重要!
-
- 准确性 (Accuracy): 答案是不是对的?是不是切题?(简单问题好判断,复杂问题如代码、数学可能需要自动化测试或解题器来验证)。
- 多样性 (Diversity): 数据要五花八门,覆盖用户可能问的各种问题和场景。(真实用户对话通常很多样。注意:用太多机器生成的“合成数据”可能导致多样性下降)。
- 复杂性 (Complexity): 问题要有挑战性,答案要详细、有深度,最好包含推理步骤(比如“一步一步思考”)。(讲师举例:简单问埃菲尔铁塔多高 vs 复杂地问多个相关细节)。
第三步:什么时候应该考虑微调模型?(5:24 - 8:32)
- 前提: 先试试更简单的方法,比如 上下文学习 (In-context Learning) 或 检索增强生成 (RAG) (就是给模型提供相关资料让它参考着回答)。因为这些方法更容易测试。
- 什么时候微调? 如果简单方法效果不够好(比如答案质量、速度、成本不满意),可以考虑微调。以下情况适合微调:
-
- 改变语气或格式: 不喜欢模型默认的写作风格(比如写邮件的语气),可以通过微调改变。
- 注入(少量)知识: 教模型一些特定领域的知识,比如关于你公司的事实。(注意:微调能增加的知识有限,不能从零开始学一个庞大领域)。
- 模型蒸馏 (Distill): 把一个大模型(如 GPT-4)的能力“压缩”到一个小模型里,以降低成本、提高速度。
- 提升特定任务的输出质量: 对于非常窄的任务(比如画流程图),微调可以让你自己的模型在这个任务上超过通用大模型。
- 其他原因:
-
- 控制权 (Control): 不想把敏感数据通过 API 发给第三方。
- 定制化 (Customizability): 想要完全符合自己需求的模型风格和行为。
第四步:数据的格式与生成方法 (11:55 - 17:45)
-
数据格式:
-
- 指令数据 (SFT): 通常包含
指令 (instruction)
、输入 (input, 可选)
、输出 (output)
。有时还有系统提示 (system prompt)
来设定角色(如“你是一个来自MIT的数学家”)。 - 偏好数据 (Preference Alignment): 包含
提示 (prompt)
、选择的答案 (chosen answer)
、拒绝的答案 (rejected answer)
。
- 指令数据 (SFT): 通常包含
-
数据生成流程 (Data Generation Pipeline):
-
- 去重 (Deduplication)。
- 数据净化 (Decontamination):确保训练数据里没有混入测试集的内容。
- 关键词过滤 (Filtering):移除不想要的词语。
-
- 用规则(启发式方法)或用另一个 LLM 作为“裁判”来给生成的答案打分,筛掉差的。
-
- 只有答案文本?让 LLM 生成对应的问题(反向翻译 Back-translation)。
- 只有问题?让 LLM 生成答案。
- 甚至让 LLM 生成指令和答案。
-
- 种子数据 (Seed Data): 可以是任何东西,比如原始文本、已有的问答对、用户问题等。
- 生成 (Generation): 用 LLM 补全数据。比如:
- 评分与过滤 (Scoring & Filtering):
- 清理 (Cleaning):
-
具体例子:
-
- 生成“指令遵循 (Instruction Following)”数据:
- 生成“偏好”数据 (类似 UltraFeedback):
-
- 准备一些提示 (prompt)。
- 让 多个不同的 LLM 对同一个提示生成答案。
- 用一个 “裁判 LLM” 给这些答案打分。
- 选得分最高的作为“Chosen”,得分最低的作为“Rejected”。
- 清理数据(去重、移除太短的答案等)。
-
- 准备一些基础指令和“约束条件”(如“回答必须全小写英文”)。
- 让 LLM 根据“指令+约束”生成答案。
- 写程序自动检查 答案是否真的遵循了约束(比如检查是不是全小写、是不是英文)。
- 净化(比如确保不含 IFEval 测试集的内容)、过滤。
- 案例学习 (OpenHermes/Perfect Blend):
-
- 这是一个开源的数据集混合方案,用于通用型微调。
- 它混合了多种类型的数据:大量数学、代码,加上一些聊天、指令遵循数据。
- 这给出了一个通用模型微调时,数据类型配比的参考。
第五步:应用聊天模板 (Chat Template) (17:45 - 19:17)
- 是什么? 在把数据喂给模型训练(尤其是 SFT 阶段)之前,要给数据套上一个固定的 格式/结构。
- 怎么做? 用特殊的标记(比如
[INST]
,用户:
,助手:
等)来区分谁在说话(系统、用户、助手)以及对话的开始和结束。 - 为什么重要?
-
- 让模型学会对话的轮转结构。
- 这是区分只会“接话”的基础模型和能进行多轮对话的微调模型的关键之一。模型需要学习并遵循这个模板。
第六步:后期训练的算法 (19:17 - 30:00)
-
推荐的微调库:
-
- TRL (Hugging Face): 功能强大,算法更新快,紧跟研究前沿。
- Axolotl: 用户友好,用 YAML 文件配置训练,方便分享和参考他人设置。可以帮你预处理数据。
- Unsloth: 非常 适合单 GPU 微调,效率极高,能方便地处理模型量化。
-
SFT 的技术:
-
- 先把基础模型 量化 (Quantize) 成低精度(比如 4-bit),减少模型占用的显存。
- 然后在量化后的模型上做 LoRA 微调。
- 显存需求最低,适合硬件资源非常有限的情况。
- 缺点是训练速度比 LoRA 慢,效果可能比 LoRA 差一点点。
-
- 冻结大部分原模型参数,只训练一小部分新增的“适配器”参数(比如只占总参数的 0.5%)。
- 大大减少 了计算和显存需求,训练更快。
- 但仍然需要加载 完整 的基础模型到显存。
-
- 像预训练一样,训练模型的所有参数。
- 效果最好,但需要 非常多 的显存 (VRAM) 和计算资源。
-
- 全参数微调 (Full Fine-tuning):
- 参数高效微调 (Parameter-Efficient Fine-Tuning, PEFT) - LoRA 是最常用的:
- QLoRA (Quantized LoRA):
- 选择建议: 如果资源够,优先 LoRA;如果显存实在不够,用 QLoRA;除非你是大公司追求极致性能,否则一般不需要全参数微调。
-
偏好对齐的技术:
-
- 更新、更简单的方法。
- 只需要加载 2 个模型(或者用 LoRA 的话,可能只需要 1 个基础模型 + 2 套适配器)。
- 训练更快、更便宜、更容易调参。
- 理论上效果可能略低于 PPO,但实践中往往足够好,甚至因为更容易调优而效果更佳。
-
- “经典”方法,效果好。
- 缺点: 非常复杂,训练时需要同时加载 3 个模型(原始模型、训练中的模型、打分模型 Reward Model),还需要计算 KL 散度防止模型跑偏太远。计算成本 非常高。
-
- 有很多种(超过 100 种!),但主要了解两种:
- PPO (Proximal Policy Optimization):
- DPO (Direct Preference Optimization):
- 选择建议: 强烈推荐 DPO,除非你有 OpenAI 级别的资源和需求。
-
重要的训练参数:
-
- 学习率 (Learning Rate): 控制每次更新参数的幅度,非常重要。讲师给了一些常用值范围。
- 批次大小 (Batch Size) / 最大长度 (Max Length): 决定一次喂给模型多少数据、每条数据多长。直接影响显存占用。可以通过“梯度累积”技巧使用较小的物理 Batch Size 达到等效的大 Batch Size。
- 训练轮数 (Epochs): 数据集完整过几遍,通常 3-5 轮。
- 优化器 (Optimizer): 更新参数的算法,推荐 AdamW。
- 注意力机制 (Attention Mechanism): 推荐使用 Flash Attention,对处理长序列效率很高。
-
监控训练过程:
-
- 损失曲线 (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 在一些评测基准上 超过了 所有原始模型。
- 应用场景:特定语言模型增强
-
- 假设你训练了一个芬兰语模型,它芬兰语很好,但其他语言(如英语)或通用能力下降了(灾难性遗忘)。
- 你可以把它和通用的 Llama 3 Instruct 模型 合并。
- 结果:得到一个既懂芬兰语,又保持了通用能力的新模型。模型合并有助于 “叠加” 不同技能。
第八步:模型评估 (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)
**
**
- 后期训练是一个 循环迭代 的过程:
-
- 精心准备数据 (Data Creation) (大约占 1/3 时间)
- 训练模型 (Training) (SFT, 偏好对齐, 可能还有模型合并)
- 评估效果 (Evaluation) (大约占 1/3 时间)
- 评估结果会反过来指导你 如何改进数据(哪个方面弱就补充哪方面的数据,提升数据质量、多样性、复杂性、准确性)。
- 通过不断循环,模型会越来越好。
Q&A 中的补充信息 (相关部分)
- 微调 vs RAG: 它们不是互斥的,往往是 结合使用。微调可以教模型特定技能或风格,RAG 提供实时信息。用微调过的模型再配合 RAG,效果通常更好。
- 多轮对话数据: SFT 和偏好对齐都可以,并且 应该 使用多轮对话数据,因为模型在单轮对话中表现好,不代表在多轮中也好。
- 模型合并与 Tokenizer: 模型合并要求使用 相同 的 Tokenizer(分词器)。在后期训练阶段更换 Tokenizer 会导致性能急剧下降,因为模型需要重新学习词语和内部表示的映射。Tokenizer 的设计通常在预训练之前完成。
- 测试时计算扩展与不确定性: 生成多个答案时的得分分布,或者答案的一致性,可以 用来衡量模型对答案的“确信度”,这对于安全或关键应用可能有用。