大语言模型能力来源解析:模仿学习是基石,强化学习是精调
最近在跟进大语言模型LLM的技术演进时一个反复被讨论的话题是驱动当前主流大模型如 GPT-4、Claude、LLaMA 等的核心学习范式究竟是什么是强化学习RL还是模仿学习Imitative Learning尽管 RLHF基于人类反馈的强化学习在 ChatGPT 的发布中被推至台前但深入其技术栈和训练流程后我们会发现一个关键事实当前 LLMs 的能力基石绝大部分仍建立在模仿学习之上而非强化学习。对于开发者、算法工程师以及对大模型原理感兴趣的学习者而言理解这一区别至关重要。它不仅能帮助我们更清晰地认识模型的“能力来源”避免对 RL 产生不切实际的幻想也能在实际进行模型微调、数据构建时采取更务实、更高效的策略。本文将深入拆解模仿学习与强化学习在 LLM 训练中的角色、边界与实际应用并通过概念解析、流程对比和代码示例为你呈现一幅完整的技术图景。1. 核心概念辨析模仿学习 vs. 强化学习在深入 LLM 训练细节之前我们必须先厘清这两个核心学习范式的本质区别。混淆它们会导致对模型能力来源的误判。1.1 模仿学习从示范中学习“是什么”模仿学习有时也称为行为克隆或监督式策略学习其核心思想非常直观通过观察专家或高质量数据的示范行为学习并复制这些行为。目标最小化模型预测与专家示范之间的差异。信号明确的“正确答案”或“示范轨迹”。在 NLP 中这就是高质量的文本序列。数据形式输入-输出对(prompt, response)。例如(“法国的首都是哪里”, “法国的首都是巴黎。”)。损失函数通常是交叉熵损失用于衡量模型生成的词元分布与真实词元分布之间的差距。类比就像学生通过临摹字帖来学习书法目标是写得和字帖一模一样。在 LLM 的预训练和大部分指令微调阶段采用的都是模仿学习。模型通过海量互联网文本预训练学习语言的统计规律和世界知识再通过高质量的指令-回答对指令微调学习遵循指令和对话的格式。1.2 强化学习从奖励中学习“怎么样”强化学习的核心是智能体通过与环境的交互来学习策略以最大化累积奖励。目标学习一个策略使得长期获得的奖励总和最大。信号稀疏的、延迟的标量奖励信号。这个信号告诉智能体“做得好不好”但不直接告诉它“应该怎么做”。数据形式状态、动作、奖励序列(state, action, reward)。在 LLM 中state可以理解为当前的对话历史和 promptaction是模型生成的下一个词元reward是人工或模型对该生成的整体评价。优化目标策略梯度直接优化策略参数以期望获得更高奖励。挑战奖励稀疏、探索-利用权衡、训练不稳定、样本效率低。类比就像训练一只小狗它做出一个动作如坐下你给它一块零食奖励。它通过反复试错学习到哪些动作能带来零食。RLHF 中的 RL 部分正是试图用强化学习来优化模型使其输出更符合人类偏好获得更高奖励。1.3 关键区别总结特性模仿学习强化学习学习信号密集的、明确的示范正确答案稀疏的、标量的奖励好/坏程度数据需求大量高质量的示范数据大量模拟交互数据或奖励模型标注优化目标最小化与示范的差异最大化累积奖励稳定性相对稳定收敛可预测不稳定容易陷入局部最优或策略崩溃主要作用获取能力学习语言、知识、技能。调整偏好在已有能力基础上对齐价值观、风格、安全性。一个常见的误解是“RLHF 让模型变得更聪明/知识更丰富”。实际上RLHF 的主要作用是对齐和微调它依赖于一个已经通过模仿学习具备了强大基础能力的模型通常称为 SFT 模型。RL 很难从零开始教会模型新的、复杂的事实性知识。2. LLM 训练全流程拆解模仿学习的主导地位让我们以一个典型的、从零开始训练 ChatGPT 类模型的简化流程为例看看模仿学习和强化学习各自在何时登场。2.1 第一阶段预训练 - 纯粹的模仿学习这是模型构建知识底座和语言能力的核心阶段。目标学习语言的通用表示、语法、事实知识和基础推理能力。数据数万亿词元的无监督文本如网页、书籍、代码。这里没有人工标注的(prompt, response)对但模型的学习目标本质上是模仿给定上文预测下一个词元。它是在模仿整个互联网文本的分布。方法自监督学习具体是因果语言建模CLM或掩码语言建模MLM。代码示意训练循环核心# 伪代码展示预训练的核心思想 import torch import torch.nn as nn from transformers import AutoModelForCausalLM model AutoModelForCausalLM.from_pretrained(“gpt2”) # 初始化一个模型 optimizer torch.optim.AdamW(model.parameters(), lr1e-4) for batch in pretraining_dataloader: # batch[‘input_ids’] 是文本序列例如 [BOS, “The”, “cat”, “sat”, EOS] # 标签是向右偏移一位的 input_ids模型需要预测下一个词 inputs batch[‘input_ids’][:, :-1] # 输入 “BOS The cat sat” labels batch[‘input_ids’][:, 1:] # 标签 “The cat sat EOS” outputs model(inputs, labelslabels) loss outputs.loss # 交叉熵损失衡量预测与真实标签的差距 loss.backward() optimizer.step() optimizer.zero_grad()结论预训练阶段 100% 依赖于模仿学习模型的能力知识、语法、逻辑几乎全部来源于此。此阶段消耗了绝大部分的计算资源可能 99%。2.2 第二阶段有监督微调 - 依然是模仿学习预训练模型可能无法很好地遵循指令或进行对话。SFT 阶段旨在解决这个问题。目标教会模型理解并遵循人类的指令适应对话格式。数据数万到数十万条高质量的、人工编写的(instruction, response)对。方法标准的监督式学习即模仿学习。模型学习模仿标注员提供的优质回答。代码示意# 伪代码SFT 与预训练在代码形式上非常相似 for batch in sft_dataloader: # batch 包含 ‘instruction’ 和 ‘response’ # 我们需要将它们拼接成对话格式例如 # prompt “|system|You are a helpful assistant./s|user|{instruction}/s|assistant|” # labels “{response}/s” # 实际中会使用模板和 tokenizer 来处理 formatted_input_ids batch[‘input_ids’] # 包含 prompt 和 response 的完整序列 # 通常在计算损失时我们会 mask 掉 prompt 部分只对 response 部分计算损失 loss_mask batch[‘loss_mask’] # response 部分为 1prompt 部分为 0 outputs model(inputsformatted_input_ids) logits outputs.logits # 计算只针对 response 部分的交叉熵损失 shift_logits logits[..., :-1, :].contiguous() shift_labels formatted_input_ids[..., 1:].contiguous() loss_fct nn.CrossEntropyLoss(reduction‘none’) loss (loss_fct(shift_logits.view(-1, shift_logits.size(-1)), shift_labels.view(-1)) * loss_mask[..., 1:].view(-1)).sum() / loss_mask[..., 1:].sum() loss.backward() optimizer.step()结论SFT 是另一个关键的模仿学习阶段。它赋予了模型“听话”和“对话”的能力但并未引入新的、复杂的优化目标。模型只是在模仿另一种更高质量、更结构化的数据分布。2.3 第三阶段基于人类反馈的强化学习 - RL 登场但依赖模仿学习的基础这是 RL 发挥作用的地方但其角色是“精调”而非“奠基”。目标使模型的输出在安全性、有用性、无害性等方面更符合人类模糊的、复杂的偏好。流程收集偏好数据标注员对同一个 prompt 的多个模型输出进行排序如 A B C。这仍然是模仿学习的数据收集过程。训练奖励模型用一个模型RM来学习人类的排序偏好。给定(prompt, response)RM 输出一个标量奖励值。RM 的训练本身是监督学习模仿学习它模仿人类的判断。强化学习微调以 SFT 模型为初始策略以 RM 作为奖励函数使用 PPO 等算法进行优化。这是唯一的、纯粹的强化学习阶段。代码示意PPO 核心简化版# 极度简化的 PPO 流程示意真实实现复杂得多 import torch from transformers import AutoModelForCausalLM, AutoTokenizer from trl import PPOTrainer, PPOConfig, AutoModelForCausalLMWithValueHead # 1. 加载 SFT 模型作为策略模型并为其添加价值头用于 PPO model AutoModelForCausalLMWithValueHead.from_pretrained(“my-sft-model”) # 2. 加载训练好的奖励模型 reward_model AutoModelForCausalLM.from_pretrained(“my-reward-model”) # 3. 初始化 PPO 训练器 ppo_config PPOConfig(batch_size32, learning_rate1e-6) ppo_trainer PPOTrainer(configppo_config, modelmodel, tokenizertokenizer) for epoch in range(ppo_epochs): for batch in prompt_dataloader: # 4. 策略模型根据 prompt 生成 response query_tensors batch[‘input_ids’] response_tensors ppo_trainer.generate(query_tensors, **generation_kwargs) # 5. 用奖励模型为每个 (prompt, response) 对打分 texts [tokenizer.decode(r, skip_special_tokensTrue) for r in response_tensors] rewards [reward_model(text) for text in texts] # 简化表示 # 6. 执行 PPO 更新步骤最大化奖励 stats ppo_trainer.step(query_tensors, response_tensors, rewards)关键点分析数据依赖RL 阶段依赖 RM而 RM 来自模仿学习人类偏好数据。模型依赖RL 优化的起点是 SFT 模型一个已经通过模仿学习具备了优秀能力的模型。作用范围RL 主要调整模型输出的“风格”和“偏好”。例如让模型拒绝回答有害问题、减少车轱辘话、使回答更详尽或更简洁。它很难教会模型新的编程语法或历史事实。资源占比在实际训练中RLHF 阶段消耗的计算资源通常远少于预训练甚至少于大规模 SFT。3. 为什么说“LLMs are (still) mostly powered by imitative learning”基于以上流程我们可以得出几个核心结论能力来源模型的事实性知识、语言能力、基础推理能力几乎全部来源于预训练模仿互联网文本和 SFT模仿高质量指令对。这是模型的“硬实力”。RL 的辅助性RLHF 的作用是“软调整”是对模型已有能力的价值观对齐和风格塑形。它解决的是“在众多可能的、语法正确的回答中哪个更让人喜欢”的问题而不是“如何生成一个语法正确的回答”的问题。数据效率模仿学习可以利用海量的、相对容易获取的无监督或弱监督数据。而 RL 需要高质量的偏好数据或与环境交互数据获取成本高、样本效率低。训练稳定性模仿学习基于最大似然估计训练目标明确且稳定。RL 训练尤其是策略梯度方法则 notoriously 不稳定需要精心调参且容易发生“奖励黑客”行为模型找到漏洞获取高奖励但输出无意义内容。因此标题中的观点是成立的当前大模型的强大其主要驱动力是模仿学习。RL 是一个重要的、但处于下游的“抛光”步骤。没有坚实的模仿学习基础RL 将是无源之水。4. 实战启示在模型微调中如何应用此认知理解这一区别对于我们在实际项目中进行模型微调有直接的指导意义。4.1 场景一领域知识注入如医疗、法律、代码目标让模型掌握特定领域的专业知识和术语。正确做法模仿学习收集该领域的大量高质量文本论文、手册、代码库。进行继续预训练或领域自适应预训练。这本质上是让模型模仿该领域的文本分布。或者收集高质量的(领域问题, 专业回答)对进行有监督微调。应避免的误区试图用 RLHF 来让模型“学会”新知识。RL 奖励信号无法有效传递复杂的事实信息。4.2 场景二调整回答风格与安全性目标让模型的回答更简洁/更详细或拒绝回答不安全请求。正确做法结合模仿学习与 RL模仿学习打底先通过 SFT使用一批符合目标风格或安全规范的(prompt, response)示例对模型进行微调。例如准备一批“简洁回答”的示例对。RL 精细调整如果风格或安全边界非常复杂、难以用有限示例完全覆盖再考虑使用 RLHF。训练一个能区分“简洁 vs 啰嗦”或“安全 vs 不安全”的奖励模型然后用 PPO 进行微调。4.3 数据准备的优先级第一优先级模仿学习数据确保你的任务数据能以(input, output)对的形式清晰定义。这是效果提升最直接、最稳定的途径。投入 80% 的精力收集和清洗高质量的对齐数据。第二优先级偏好数据只有当模型在“能力”上已达标但需要在“多个都正确的选项中做出更优选择”时才需要收集偏好数据(prompt, chosen_response, rejected_response)用于训练 RM。谨慎使用 RL将 RL 视为最后一步的“精调工具”而非核心学习手段。准备好应对其不稳定性并设置严格的评估指标防止退化。5. 常见问题与排查思路在实际操作中可能会遇到以下典型问题问题现象可能原因排查与解决思路SFT 后模型“胡说八道”或忘记知识1. SFT 数据量太少严重偏离了预训练分布。2. 学习率太高破坏了预训练权重。3. 指令数据质量差包含错误知识。1. 增加 SFT 数据量或采用 LoRA 等参数高效微调方法减少对原始权重的改动。2. 使用更小的学习率如 1e-5 到 2e-5。3. 严格清洗 SFT 数据确保正确性。可混合少量预训练数据以保持语言模型能力。RLHF 后模型输出变得单一、枯燥1. 奖励模型过度优化导致模型探索不足陷入单一高奖励模式。2. KL 散度惩罚系数设置过大过度约束模型偏离初始策略SFT模型。1. 检查奖励模型的过拟合情况在验证集上评估其泛化能力。2. 调整 PPO 中的 KL 惩罚系数找到一个平衡点既对齐偏好又不过度限制创造性。可以尝试在奖励中增加“多样性”奖励项。奖励分数持续上升但人工评估变差奖励黑客模型找到了欺骗奖励模型的方法生成了对人类无意义但对 RM 有高分的文本。1. 这是 RL 的经典问题。需要迭代优化奖励模型用当前策略模型生成新数据重新标注更新 RM。2. 在奖励函数中加入对异常模式如重复字符、乱码的惩罚。3. 使用多个奖励模型进行集成降低被单一 RM 欺骗的风险。RL 训练不稳定损失剧烈波动1. PPO 的超参数如学习率、clip range设置不当。2. 批次大小或序列长度变化大。3. 奖励值尺度不合适过大或过小。1. 使用更保守的超参数参考成熟实现如trl库的默认值。2. 确保每个训练批次内的数据长度相对均匀。3. 对奖励进行标准化如减去均值除以标准差将其控制在一个合理的范围内如 [-1, 1] 附近。6. 最佳实践与工程建议基于“模仿学习为主强化学习为辅”的认知提出以下工程实践建议数据质量 数据数量 算法技巧对于模仿学习预训练/SFT高质量、干净、多样化的数据是成功的基石。投入资源进行数据清洗和去重其回报远高于尝试复杂的算法魔改。构建坚实的 SFT 基线在考虑 RLHF 之前务必先将 SFT 模型优化到极致。一个强大的 SFT 模型能解决 80% 的问题并且能为后续的 RL 提供稳定的起点。使用多种评估基准如 MT-Bench, AlpacaEval来量化 SFT 的效果。谨慎对待 RLHF明确目标只在需要优化模糊、主观的“偏好”时使用 RLHF例如安全性、幽默感、风格一致性。从小规模开始先在一个小规模、定义清晰的任务上跑通 RLHF 全流程理解其特性和调参方法。监控与评估建立强大的人工评估 pipeline。RL 的自动指标如奖励值不可全信必须辅以人工评测防止优化方向跑偏。利用参数高效微调对于大多数领域适配和指令微调任务使用 LoRA、QLoRA 或 Prefix-Tuning 等 PEFT 方法。它们通过只训练少量参数在实现优秀效果的同时最大程度地保留了模型通过模仿学习获得的基础能力避免了灾难性遗忘。迭代式数据收集采用“模型生成 - 人工标注/评估 - 模型更新”的迭代循环。无论是 SFT 数据还是偏好数据都可以用当前最佳模型来生成候选由人工筛选或评判从而持续提升数据质量和模型能力。理解大语言模型能力来源的真相能让我们在技术选型和资源分配上做出更明智的决策。当前模仿学习无疑是支撑 LLM 庞大体量的骨架和肌肉而强化学习则是使其行为更优雅、更符合预期的精致外衣。作为实践者我们应扎实耕耘于数据工程和模仿学习并审慎、有目的地运用强化学习这一强大但难以驾驭的工具。未来随着 RL 算法和数据收集方式的进步两者的关系可能会演变但就目前而言模仿学习的基础性地位依然无可动摇。希望本文的拆解能帮助你在 LLM 的探索和应用之路上方向更清晰步伐更稳健。