这次我们来看RL for LLMs这个主题更准确地说是强化学习在大型语言模型里的基础层策略、奖励、策略梯度、PPO 和 RLHF 训练链路。很多人看到 RLHF、PPO、GRPO 这些名词会本能地觉得门槛高但把基础概念拆开之后核心逻辑并不复杂先让模型生成结果再对结果打分最后用分数去更新模型的生成概率。真正需要花时间的是策略、奖励模型、优势估计、KL 约束这些概念以及它们如何在训练循环里组合起来。这篇文章适合这几类读者已经做过 SFT、知道 LoRA 怎么用但还没搞清 RL 阶段到底在训练什么的人做 Agent 或工具调用训练、需要在模型侧引入结果反馈的人准备读 PPO、GRPO、DPO 相关论文但缺基础术语铺垫的人。读完这篇你会掌握 RL 在 LLM 里最基础的一层策略、状态、动作、奖励、回报、策略梯度、PPO 的直观理解以及一套 RL 训练跑不通时可以怎么排查的通用思路。内容偏原理加工程视角不绑定某个具体开源框架但最后会给出落到 TRL、OpenRLHF 这类项目时的学习路径。1. 核心能力速览先把这部分内容定位成一张知识结构速览表方便你判断这个主题有没有必要继续往下读。维度说明主题定位LLM 后训练阶段的对齐与优化方法前置知识Transformers 结构、SFT 流程、基础概率论、简单微积分核心概念策略、状态、动作、奖励、回报、策略梯度、KL 散度、PPO常见算法PPO、GRPO、DPO、Rejection Sampling训练阶段SFT - 奖励模型 - RL最低实验方式伪代码推演 TRL/自实现小规模训练硬件关注点Actor、RM、Critic 多模型同时加载显存和内存占用通常高于 SFT适合读者模型微调工程师、AI 应用开发者、算法研究者这里要先说明一个问题RL for LLMs 不是一个“安装就能跑”的软件所以显存占用、启动速度这类信息没法给固定数字。它取决于基座模型大小、是否开 LoRA、采样 batch、是否加载 Critic、序列长度等多个因素。后面我会给一套观察资源占用的方法而不是拍一个具体数值。2. 为什么 LLM 需要 RL先回答一个最基本的问题SFT 已经把模型训得很好用了为什么还要上 RL。SFT 的核心是模仿学习。它做的事情是让模型学会“按给定输入生成目标输出”的分布。比如给 10 万条问答对让模型去拟合标准答案。这个过程的本质是监督学习模型学到的是训练集里的平均模式并不直接优化任何可量化的下游指标。当任务复杂度上升之后SFT 的局限会暴露在几个地方。第一回答好不好没有直接反馈。SFT 阶段只有“标准答案”。但很多任务没有唯一标准答案比如代码生成是否通过测试、Agent 调用工具是否成功、文案是否满足用户意图。这些反馈必须在生成之后通过外部环境或规则获得无法在 SFT 阶段直接作为监督信号。第二训练分布和推理分布不一致。SFT 的输入输出是固定的但推理时模型会自回归生成一条生成路径上的任何一个 token 偏差都可能被累积放大。SFT 无法针对这种多步展开做端到端优化。第三难以优化离散指标。BLEU、准确率、任务成功率这些指标往往不可导无法通过反向传播直接优化。强化学习天然处理这种“不知道目标函数梯度、只能拿到回报”的场景。所以 RL 在 LLM 中的作用可以概括成一句话在模型生成的完整轨迹上用可量化的奖励信号去调整 token 的概率分布。它不是替代语言建模而是把“生成序列”这件事变成一个决策问题然后用策略优化去解决。3. RL 基础概念策略、状态、动作、奖励、回报在进入 RLHF 细节之前先把 RL 最基础的概念对齐一下。这些概念在 LLM 场景下有不同的具体含义。3.1 策略策略是指智能体根据当前状态选择动作的分布。在 LLM 场景下策略就是语言模型本身。给定提示词和已经生成的前缀模型输出下一个 token 的概率分布。数学上可以写成π(a|s)其中s代表当前状态也就是已经生成的上下文a代表动作也就是接下来生成的 token 或者整段回复。策略训练的目标就是让这个条件分布在期望回报上尽可能高。3.2 状态与动作状态描述了智能体当前所处的环境信息。对 LLM 来说状态就是当前对话上下文包括用户输入历史、已经生成的 token 序列、系统提示词等。生成结束后这个状态会包含完整的输入输出。动作是智能体在某个状态下做出的行为。语言模型的一个动作可以是生成一个 token也可以是在句子层面生成完整回复这取决于我们如何定义问题。在 token 级动作空间是词表大小在回复级动作空间是所有可能句子这个空间更大更适合用采样后的样本估计。要注意的是LLM 生成任务天然是稀疏奖励的。模型在生成 100 个 token 的过程中往往直到最后才拿到一个总奖励。前面 99 个 token 的奖励实际都是同一个值这会带来信用分配问题到底是哪个 token 导致最终结果变好或变坏并没有精确定位。后面讲的 GAE 优势估计就在处理这种稀疏奖励下的估值问题。3.3 奖励奖励是环境对动作的即时反馈。在 LLM 训练里奖励通常来自几个方向人工对生成样本打分后训练出来的奖励模型规则打分比如代码是否通过单元测试外部工具调用是否成功内容是否符合某个规范性评分标准。奖励模型的输入是“提示词 回复”输出是一个标量分数表示“这个回复有多好”。这个分数是策略优化的核心驱动力。如果奖励信号本身不准确后面整个 RL 训练都会朝着错误方向走。3.4 回报与折扣因子回报是未来所有奖励的累计。因为生成一个 token 不会立即获得完整反馈只有在生成结束后才知道评审结果所以 RL 的优化目标应该考虑一段时间的累计奖励而不是单步奖励。常见形式G_t r_t γ * r_{t1} γ^2 * r_{t2} ...γ是折扣因子范围在 0 到 1 之间。γ越接近 1模型越重视长远收益。在 LLM 的常见实现里很多时候只在序列结束时给一个奖励中间步骤不设奖励这种情况下的回报会退化为最终奖励本身。理解这一点对后面读 PPO 代码里的returns计算很有帮助。4. 从 SFT 到 RLHF 的完整训练链路RLHF 并不是直接拿基础模型做强化学习它通常包含三个依次进行的阶段。4.1 阶段一SFT先用高质量人工标注数据做监督微调得到基础可用的模型。这个模型是 RL 阶段的初始策略。SFT 数据质量非常重要因为 RL 阶段一开始采样的样本都来自这个策略的分布如果初始策略很差奖励信号很容易不稳定训练会陷入冷启动问题。4.2 阶段二奖励模型训练准备一个奖励模型输入是“提示词 回复”输出一个标量分数。训练数据是同一提示下多个回复的排序或对比结果。业界常见做法是构造多路采样让人类标注员对优劣排序然后训练奖励模型去拟合这种偏好顺序。举个例子。对同一个 prompt采样 A、B、C 三个回复。人工排序认为 A 最好、B 次之、C 最差。将 A 与 B、A 与 C、B 与 C 组成对比样本奖励模型的训练目标就是让 A 的得分高于 BB 的得分高于 C。损失函数通常采用 pairwise ranking loss本质上是让模型学会“偏好排序”而不是预测一个绝对分数。奖励模型训练完之后在 RL 阶段会被冻结只用来给采样结果打分。4.3 阶段三RL 策略优化固定奖励模型和参考模型用 PPO 等算法对 SFT 模型做策略优化。训练循环大致是采样 - 打分 - 更新模型根据当前 prompt 生成回复奖励模型给回复打分把分数和生成概率通过策略梯度转化为梯度信号更新模型参数。为了不让模型偏离 SFT 太远还会加一个对参考模型的 KL 惩罚。下面给一段极简的 RLHF 训练循环伪代码方便把流程串起来。这段代码不是某个具体框架的 API只是帮助理解训练循环的骨架# 极简 RLHF 训练循环伪代码需按实际项目结构和模型 API 调整 for prompt in prompt_batch: # 1. 从当前策略采样 response, actor_log_prob actor_model.generate(prompt) # 2. 奖励模型打分 reward reward_model(prompt, response) # 3. 参考模型计算 KL 惩罚 ref_log_prob ref_model(prompt, response) kl kl_coef * (actor_log_prob - ref_log_prob).mean() # 4. 组合优势信号 advantage reward - kl # 5. 更新策略 actor_model.update(prompt, response, advantage)这里把 KL 直接减在奖励上是一种简化的表达。真实实现会单独计算 KL 惩罚并作为正则项进入损失函数但整体思想一致让奖励引导模型变好同时用 KL 约束限制模型偏移。5. 策略梯度与 PPO这一节是整个 RL Foundations 的核心。5.1 策略梯度的直觉普通神经网络训练需要损失函数的梯度RL 的目标是最大化期望回报。期望回报可以写成关于策略的积分但真实环境里我们拿不到目标函数的解析梯度只能通过采样来估计。策略梯度的一行核心目标是∇θ J(θ) ≈ E[ ∇θ log πθ(a|s) * A ]直觉解释是在一个状态下如果某个动作带来的优势A是正的就提高它的生成概率如果优势是负的就降低它的生成概率。log πθ(a|s)本身可导因为模型输出经过 softmax 后得到 token 概率log对网络参数的梯度就是标准反向传播。A是外部给定的一个加权数在当次更新中视为常数。5.2 优势函数优势函数表示“当前动作相对于平均水平好多少”。它不直接使用奖励的绝对值而是用“这个动作的回报 - 当前状态的期望回报”。这样能降低不同状态之间的方差让模型更关注“比平均好多少”而不是被某个高奖励状态带偏。在 PPO 里优势通常用 GAE 估计。如果你第一次接触可以先记住两个要点GAE 用衰减方式累计未来收益λ控制估计偏差和方差的平衡。λ越接近 1方差越大但偏差越小λ越接近 0方差越小但可能漏掉远期信息。5.3 PPO 的 clip 目标PPO 的改进点在于“一次更新不要太激进”。它通常用一个老策略采样一批数据然后连续做几个 epoch 的更新。为了防止更新幅度太大PPO 对新旧策略的概率比做了裁剪L E[ min( r_t * A, clip(r_t, 1 - ε, 1 ε) * A ) ]其中r_t πθ(a|s) / πθ_old(a|s)如果新策略把某个动作的概率提高太多clip会限制它的梯度贡献。这个机制的价值在于训练稳定性。用一般策略梯度训练语言模型更新步长稍微大一点生成分布就会崩掉输出可能变成重复的乱码。PPO 的clip是降低这种风险的主要手段。5.4 一个最小 PPO 损失函数示例用 PyTorch 风格写一段最小实现方便理解 clip 的计算过程。注意这一段只是教学示例真实 TRL 实现里还会包含 value loss、entropy bonus、GAE 计算等import torch def ppo_clip_loss(old_log_probs, log_probs, advantages, epsilon0.2): # old_log_probs: 采样时旧策略的 log 概率 # log_probs: 当前新策略的 log 概率 # advantages: GAE 估计出的优势形状与 log_probs 对齐 ratio torch.exp(log_probs - old_log_probs) unclipped ratio * advantages clipped torch.clamp(ratio, 1.0 - epsilon, 1.0 epsilon) * advantages # 取最小值再取负转为最小化损失 return -torch.min(unclipped, clipped).mean()训练时这段损失会加在语言模型原有的生成损失之外构成完整的 PPO actor loss。6. RL 冷启动问题最近“RL 冷启动”被讨论得很多本质是和强化学习里的探索-利用困境有关。在 LLM 场景下冷启动表现为初始 SFT 策略不够强采样出的回复质量波动大奖励模型分不够准模型在垃圾回复上也可能获得高分高方差奖励导致策略更新方向不稳定训练初期 loss 震荡明显生成质量甚至先下降再回升。应对策略有几类。第一保证 SFT 质量给 RL 提供一个足够好的初始策略。RL 不是用来从零救回一个笨模型的它是在好策略基础上做定向优化。第二使用 KL 惩罚锚定参考模型防止策略漂移过远。KL 系数设置需要调参太大会限制优化空间太小又容易让模型跑偏。第三奖励模型先做校准和验证保证打分可靠。奖励模型在验证集上的排序准确率应该先达标再进入 RL 阶段。第四用较小的学习率、较小的 batch在稳定情况下逐步加量。RL 训练的稳定性比训练速度更重要。第五引入 Rejection Sampling 或结果监督替代过程监督降低奖励噪声。有些场景下不依赖逐 token 打分而是只看最终结果是否成功反而更稳定。7. RL 训练的资源占用观察RL 阶段的资源占用策略和 SFT 阶段有明显差异。SFT 通常是模型读数据计算 loss反向传播。RL 阶段至少需要同时维护四个模型副本Actor当前正在训练的策略模型参数参与更新Reference参考模型用于计算 KL 惩罚参数冻结Reward Model奖励模型用于给生成结果打分参数冻结Critic在 PPO 实现中用于估计状态价值参数可能只训练一部分。这意味着显存和内存占用通常会高于同规模模型的 SFT 训练。这不是异常而是 RL 多模型架构的固有成本。具体数字取决于模型参数量、是否开 LoRA、是否使用 Gradient Checkpointing、batch 大小、序列长度等因素必须按实际训练配置测试。观察资源占用时可以用下面命令实时看显存和进程状态# 实时观察显存占用和 GPU 利用率 nvidia-smi --query-gpuindex,memory.used,memory.total,utilization.gpu --formatcsv -l 2 # 查看训练进程是否残留 ps aux | grep train采样阶段对延迟更敏感因为生成过程是自回归的batch 大会明显增加单轮耗时。如果采样使用 vLLM 这类推理引擎加速要额外确认与训练框架的兼容性避免数据格式不一致。8. 常见问题与排查方法RL 训练跑起来之后常见问题集中在训练不稳、奖励不涨、生成质量退化几类。下面整理成表格。问题现象可能原因排查方式解决方案训练 loss 震荡剧烈奖励模型不稳定 / KL 系数太小查看奖励分数分布和 KL 值曲线降低学习率增大 KL 系数检查奖励模型质量模型重复生成clip 比例过高或策略漂移固定评测 prompt采样看输出调小 PPO clip 范围增大 KL 惩罚奖励一直不涨奖励信号与任务目标不一致分析奖励模型在验证集上的排序准确率重新构造偏好数据并训练奖励模型显存不足多模型同时加载用 nvidia-smi 或 PyTorch profiling 定位开 LoRA、Gradient Checkpointing、降低 batch size采样耗时过长自回归生成瓶颈单独测单步生成延迟降低 batch 或使用 vLLM 等推理优化配合采样冷启动阶段效果不升反降初始策略太弱观察初始采样样本质量先加强 SFT 或用更高质量的监督数据KL 值增长过快优化步长太大看 KL 曲线降低学习率减小 KL 系数权重除了表格里的问题还有一类常见问题是奖励黑客。模型会找到奖励函数的漏洞生成一个奖励很高但实际效果很差的回复。比如奖励模型偏好长文本模型就可能疯狂堆砌无意义内容。这种情况没有统一解法只能通过奖励 shaping、人工抽检、增加正则项来缓解。9. 最佳实践与生产建议把这几年 RL 训练工程化的经验浓缩成几个建议。先小验证再大训练。用小模型或少量数据把 RL 训练循环跑通确认奖励方向和任务目标一致再加大规模。这样可以避免大参数量下调试成本过高。离线评测不能只看 reward 曲线。奖励分数高不代表真实效果变好。固定一组评测 prompt定期采样人工检查生成质量。最好建立一份评测集覆盖不同难度和边界情况。KL 值要监控。KL 值增长过快说明模型在偏离参考策略需要及时干预。如果 KL 一直很低又可能说明策略没有充分利用奖励信号需要调整 KL 系数。保留每轮 checkpoints。RL 训练容易反复震荡保留历史版本方便回滚。建议按训练步数定期保存并记录每个 checkpoint 在评测集上的结果方便对比。奖励 shaping 要保守。单维度的奖励容易产生奖励黑客。如果必须加入多维度评分需要明确各维度的权重和边界避免模型发现刷分策略。数据合规必须前置。RL 阶段如果使用用户内容、版权文本或带隐私信息的数据必须确认授权和脱敏。特别是奖励模型依赖用户反馈或标注员排序涉及真实用户数据时要做好匿名化处理避免把未授权内容带入训练集。商用场景还要额外检查最终模型的生成合规边界。10. 总结与下一步RL for LLMs 的基础脉络可以概括为SFT 给一个初始策略奖励模型给出反馈信号策略梯度或 PPO 用采样和更新不断调整生成分布同时用 KL 约束控制漂移。掌握这一层就可以继续往下看 PPO 的具体实现、GRPO 如何去掉 Critic、DPO 如何绕过显式奖励模型。建议你接下来做两件事。第一手推一遍策略梯度公式再用一个小语言模型和简单奖励函数写一个最小 RL 循环把采样、打分、更新的流程跑通。第二去读 TRL 或 OpenRLHF 的代码把 RLHF 的三阶段拆出来对应到代码目录上。理论只有落到训练循环里才真正有用。Part 1 到这里结束。下一篇会直接拆一个具体的 PPO 实现看完就能把训练循环和代码行对应起来。如果这篇对你有帮助建议收藏备用等读到 PPO 和 GRPO 相关代码时再回来对照基础概念。