ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

RLHF面试八股全解析:强化学习、PPO与大模型对齐实战

RLHF面试八股全解析:强化学习、PPO与大模型对齐实战 1. 面试官盯着RLHF问到底在看什么大模型算法岗的面试前几年还爱问Transformer和BERT这两年风向明显变了尤其是涉及LLM的对齐和微调环节强化学习Reinforcement Learning和RLHF几乎成了必考点。我面过不少候选人也陪朋友模拟过很多轮最直观的感受是很多人能把SFT、RM、PPO这几个缩写背得滚瓜烂熟但一问到“PPO里为什么要做重要性采样”“KL散度惩罚具体加在哪里”“参考模型能不能冻结”立刻就露馅了。这不是记不记得住的问题而是有没有真正理解RLHF这条技术链路的逻辑。面试官问RLHF表面上看是想确认你“知道这个东西”实际上是想确认三件事第一你是否理解强化学习的基本框架能把LLM生成文本的过程建模成一个马尔可夫决策过程MDP第二你是否理解人类反馈信号是怎么变成可优化的奖励信号的第三你是否真正理解PPO这个策略优化算法的数学动机而不是只会调库。这三件事刚好对应一个合格的LLM算法工程师日常要面对的核心工作设计训练流程、分析训练信号、排查不收敛的原因。所以这篇文章我就按面试官的视角把强化学习与RLHF相关的八股问题彻底拆一遍内容覆盖从强化学习基础概念到PPO实现细节再到RLHF工程落地的常见坑。目标很直接让准备面试的人能答得上、答得深让已经在做训练的人能查漏补缺。1.1 为什么RLHF是LLM算法岗的必考项先说个大背景。GPT系列和Claude系列之所以在对话体验上明显优于很多开源模型核心差异之一就是RLHFReinforcement Learning from Human Feedback基于人类反馈的强化学习。预训练解决的是“下一个词预测”的能力问题SFT解决的是“学会对话格式和指令跟随”的问题但用户真正关心的“有用性”和“无害性”本质上是一种主观偏好很难通过静态的交叉熵损失来建模。这时候RLHF的价值就体现了先训练一个奖励模型来编码人类偏好再通过强化学习让策略模型在这个奖励信号下持续优化。这一套组合拳就是当前大模型对齐技术的事实标准。所以面试官考RLHF其实是在考候选人是否了解当前大模型训练的最核心环节之一这不是八股这是真·核心技术栈。另外还有一个很现实的原因市面上很多候选人简历里写了“熟悉大模型训练”但实际只跑过SFT。面试官需要通过RLHF相关的问题来快速区分“调参工程师”和“真正懂对齐的算法工程师”。所以问题往往不是简单的“RLHF是什么”而是会层层追问直到触达你的认知边界。1.2 面试前你需要建立的知识地图在我梳理具体题目之前建议先建立一个知识地图否则容易陷入“记答案”的误区。RLHF的完整链路包含三个训练阶段SFT、奖励模型训练、强化学习微调。其中第三阶段的核心算法是PPOProximal Policy Optimization近端策略优化它属于强化学习里策略梯度类算法。由此往上游推导就会触及一系列基础概念MDP马尔可夫决策过程、策略、状态价值函数、动作价值函数、优势函数、GAE广义优势估计、重要性采样、KL散度、熵正则化。每个概念背下来不难难的是串联成一条线从MDP出发推导出策略梯度的目标函数再理解为什么PPO要加clip约束再理解为什么RLHF训练时还要引入一个冻结的参考模型来计算KL散度。我建议按这条线去备战本文后面的章节也基本按照这个逻辑展开。面试时如果能从底层原理讲到工程细节面试官基本不会在这个环节卡你。2. 强化学习基础先建起一个不露怯的底子很多LLM方向的候选人其实没系统学过强化学习最多看过几篇博客知道PPO这个名字。这本身不是致命伤但如果没有建立起强化学习的思维框架RLHF的问题一问深就容易露怯。所以我先花一部分篇幅把强化学习的底子补上重点讲与RLHF强相关的几个概念。2.1 从MDP说起LLM生成为什么能被建模成强化学习问题强化学习的标准数学框架是MDP由五个元素组成状态S、动作A、状态转移概率P、奖励函数R、折扣因子γ。强化学习的目标是学到一个策略π使得在环境中交互获得的累计折扣回报期望最大化。把大模型生成文本对应到MDP上可以这样理解状态当前已经生成的token序列上下文。动作从词表中选择下一个token。状态转移把新token拼接到已有序列后面。奖励生成完整个序列后由reward model给出一个标量分数。策略语言模型本身也就是给定当前序列输出下一个token的概率分布。这种建模方式和传统强化学习比如玩游戏、机器人控制有一个显著区别LLM的状态转移是确定性的因为拼接token不涉及随机环境而且奖励是稀疏的整个序列只得到一个最终奖励。另一个特点是动作空间非常大词表通常有几万到几十万个token这是很多经典RL算法难以直接处理的。理解了这种建模方式你就能回答“为什么用RL来训练大模型”这个问题了。因为SFT阶段的交叉熵损失只能让模型模仿数据中的行为无法让模型根据偏好信号进行多步优化而RL提供了一套能够直接优化非可微奖励信号的框架。奖励信号来自于人类偏好不可微所以只能用策略梯度这一类免微分的方法。2.2 策略梯度RLHF绕不开的数学框架强化学习算法有很多分类基于价值的如DQN、基于策略的如REINFORCE、PPO以及两者的结合Actor-Critic。LLM场景下因为动作空间太大基于价值的算法基本不可行所以业界基本全部使用策略梯度类算法。策略梯度的核心思想很直接如果某个动作带来的回报高就增大这个动作的概率如果回报低就减小这个动作的概率。用数学语言表达优化目标是最大化期望回报J(θ) E[ R(τ) ]其中τ表示一条完整轨迹一个生成的完整序列。对参数θ求梯度经过一番推导可以得到著名的策略梯度定理∇J(θ) E[ ∇log π_θ(a|s) · R(τ) ]这个式子可以这样直观理解∇log π_θ(a|s) 衡量的是“增加该动作概率的最快方向”R(τ)是这条轨迹的回报权重。如果回报为正参数就往增加这些动作概率的方向更新如果回报为负就反方向更新。这是REINFORCE算法的基础也是PPO的出发点。不过这里有一个显而易见的缺陷直接用轨迹的累计回报作为权重方差会非常大。同一句话可能这次被奖励模型打了8分下次打了6分纯靠运气波动训练会非常不稳定。所以后来的工作都在想办法降低方差主流思路就是引入baseline——用状态价值函数V(s)作为基准把回报R(τ)换成优势函数A(s,a) Q(s,a) - V(s)。这个设计直接引出了Actor-Critic架构也是PPO里同时训练actor和critic两个网络的根源。2.3 on-policy和off-policy面试最爱挖的坑面试官特别爱问的一个问题是“PPO到底是on-policy还是off-policy为什么”很多人会脱口而出“on-policy”但如果继续问“那它为什么还要做重要性采样”就答不上来了。这里的关键在于PPO在更新时使用的数据确实是由旧策略采样的从这个角度它更像off-policy但PPO通过重要性采样把数据“修正”回当前策略的分布并在每次更新后马上丢弃旧数据所以它本质上是on-policy算法。这个区别和前两年流行的off-policy算法DQN完全不同后者会把历史数据存进经验回放池反复使用允许数据利用率大幅提高。PPO为了保证训练稳定性坚持on-policy也就是每一轮用当前策略采样一批数据更新几轮参数后立即重新采样。这样的好处是数据分布始终贴近当前策略坏处是数据利用率低训练成本高。在RLHF场景下这个成本被进一步放大了每采样一次就需要让当前的大模型完整生成一遍文本然后让reward model打分这个流程非常耗时。所以很多工程上的尝试都是围绕“如何在PPO框架下提升数据利用效率”展开的。3. RLHF三阶段流程拆解从SFT到奖励模型再到PPORLHF并不是一个单一算法而是完整的三阶段流水线。面试官通常会要求候选人完整描述这整条链路并且追问每个阶段的细节。下面把三个阶段逐一拆开并结合面试高频追问点展开。3.1 第一阶段SFT是起点别以为它不重要很多人一讲RLHF就急着讲PPO但其实整个流程的起点是SFTSupervised Fine-Tuning监督微调。用人类标注的“问题-理想回答”数据对对预训练模型进行有监督微调让模型学会指令跟随的基本形式。为什么不能直接跳过SFT从预训练模型直接开始RLHF这个问题的答案是预训练模型只会文本续写它甚至不会“扮演一个AI助手”更不会理解问答的交互格式。如果直接从原始模型采样做RLHF采样出来的文本大概率是一堆无意义的续写reward model给出的分数也缺乏有效的区分度。有了SFT这一步模型先学会了“好好回答问题”的基本能力RLHF才能在此基础上有意义地优化偏好。SFT阶段有两个细节值得关注。一个是数据质量比数据数量更重要几千条精心筛选的对话数据效果往往好于几万条粗糙抓取的数据另一个是微调时要注意不要破坏预训练学到的通用知识所以学习率通常要设置得比预训练小得多一般用1e-5到2e-5量级并且可以适当冻结底层参数。3.2 第二阶段训练Reward Model的细节SFT模型训练好之后进入第二个阶段训练奖励模型Reward Model, RM。这是RLHF中最容易被轻视但实际影响最大的一步。奖励模型的训练数据来源于人类对多个模型输出的排序。典型的数据构建方式是给定同一个prompt让SFT模型生成4到9个不同的回答然后请标注员对这些回答按质量从高到低排序。这里关键点在于不要求标注员给出绝对分数只要求相对排序。因为人类对“绝对质量”的判断很不稳定但两两比较通常能给出可靠结论。奖励模型本身的结构通常是在SFT模型的基础上把最后的语言模型输出头替换成一个回归头输出一个标量分数。训练时使用pairwise ranking loss最常用的形式是Loss -log( σ( r(x, y_w) - r(x, y_l) ) )其中y_w是排名更靠前的回答y_l是排名靠后的回答σ是sigmoid函数。这个损失函数的目标是让奖励模型对“更好的回答”给出更高的分数。还有一种扩展做法是让每个回答对应的分数与排名之间的关系满足Bradley-Terry模型本质是同一个思路。这个环节有一个常见的误区奖励模型并不是越准越好还要注意calibration校准度。因为在PPO阶段策略模型会持续探索一旦某个时刻生成了显著好于SFT分布的样本奖励模型面对的是自己训练分布之外的输入预测分数可能完全不可靠。这就是所谓的分布外OOD问题也解释了为什么很多人发现奖励模型loss降到很低但RLHF训练出来的模型反而变差了。3.3 第三阶段PPO微调把奖励信号转化为策略更新第三个阶段是强化学习阶段也是RLHF最核心的部分。在这个阶段SFT模型作为初始策略奖励模型提供奖励信号模型通过PPO算法更新参数目标是最大化奖励分数同时保持与原始模型的分布差异不要太大。整体训练循环可以这样描述从prompt数据集中采样一批提示词。当前策略模型正在被训练的那个针对每个提示词生成完整回答。将回答拼接上提示词输入奖励模型得到奖励分数。同时将回答输入冻结的参考模型计算当前策略与参考模型之间的KL散度。计算最终奖励 奖励模型分数 - β × KL散度。用这个最终奖励作为训练信号通过PPO更新策略模型参数。这里最关键的设计是引入了一个冻结的参考模型reference model来计算KL散度惩罚。为什么需要这个惩罚项因为只用奖励模型信号来优化策略模型很快就会找到奖励模型的漏洞生成奖励模型喜欢但人类并不认可的文本。KL散度惩罚的核心作用是约束策略模型不能偏离参考模型太远从而保证输出的可读性和稳定性。关于β这个KL惩罚系数不同团队有不同的做法。业界有固定系数的也有像OpenAI在InstructGPT里那样做自适应调整的如果当前batch的KL散度超出目标范围就增大β低于目标范围就减小β。自适应方案在实践中更稳因为它减少了对超参数初始值的敏感度。4. PPO算法的面试级拆解重要性采样、GAE与clipPPO算法本身值得单独开一个大章节来拆因为它既是RLHF的核心引擎也是面试中追问最密集的区域。接下来我从数学动机到代码实现把PPO的几个核心组件讲透。4.1 为什么要用重要性采样我们在前面提到策略梯度直接算期望的方差很大所以需要改进。REINFORCE算法的最大问题是只能利用当前策略采样的数据更新一次数据用完就扔。如果能把历史策略采样的数据“修一修”再用就能提升数据效率。这个“修一修”的操作就是重要性采样Importance Sampling。假设旧策略是π_old新策略是π_θ需要用旧策略采样的数据来估计新策略下的期望回报那么E_{π_θ}[ f(x) ] E_{π_old}[ (π_θ(x) / π_old(x)) · f(x) ]其中π_θ(x) / π_old(x)就是重要性权重。放到PPO里就是计算当前策略在新旧策略下生成同一条轨迹的概率比值用这个比值来缩放优势函数。但在实际训练中这个比值如果完全不设限更新幅度可能非常大一旦某条轨迹在旧策略下概率极低而在新策略下概率很高重要性权重就会爆炸训练立刻崩溃。所以PPO在TRPO的基础上做了妥协不再严格限制KL散度而是用clip操作直接裁剪重要性比值让更新幅度控制在一个范围内。4.2 clip到底在做什么PPO的优化目标是L(θ) E[ min( r_t(θ) · A_t, clip(r_t(θ), 1-ε, 1ε) · A_t ) ]其中r_t(θ) π_θ(a_t|s_t) / π_old(a_t|s_t)ε是裁剪范围通常取0.2。这个目标函数很好地体现了“近端”的含义Proximal当某个动作的优势函数为正时我们希望增大这个动作的概率但重要性权重超过1ε后就不再增加梯度当优势函数为负时我们希望减小这个动作的概率但重要性权重低于1-ε后也不再增加梯度。分段来看这个设计的本质是如果新策略和旧策略差异太大就不给更新信号防止一步跨太远。这也是PPO能替代TRPO成为主流选择的原因——TRPO需要用共轭梯度方法求解带约束的优化问题实现复杂且计算开销大PPO只需在损失函数上做一次min和clip操作实现简单效果却相当。在RLHF场景下PPO的actor通常是整个语言模型。每次更新时需要计算当前策略在所有token位置的概率分布然后和旧策略的概率做比值。因为语言模型的输出维度是词表大小这个比值计算在工程上需要小心实现通常会把新旧策略的logprob都缓存下来避免重复前向计算。4.3 GAE与优势函数估计优势函数A(s,a) Q(s,a) - V(s)是PPO中用来衡量“当前动作相对于平均水平的优势”的指标。如果完全用蒙特卡洛采样估计需要等整条轨迹结束才能获得回报方差大如果完全用自举估计用V(s)的预测值代替未来回报偏差又会很大。GAEGeneralized Advantage Estimation广义优势估计就是在这两者之间做权衡。GAE的定义式为A_t δ_t (γλ)δ_{t1} (γλ)²δ_{t2} ...其中δ_t r_t γV(s_{t1}) - V(s_t)γ是折扣因子λ是GAE的权衡系数。λ0时GAE退化为一步TD误差偏差大方差小λ1时退化为蒙特卡洛回报减去V(s)方差大偏差小。实际训练中γ通常取0.99λ取0.95左右这是PPO在RLHF中比较常用的配置。在LLM场景下GAE还有一个特殊性整个轨迹的中间步骤没有即时奖励只有最后一步有奖励。所以δ_t的序列中前面大部分位置的reward都是0只有最后一步有非零值。这意味着GAE的优势值会从最后一步向前“回溯”传播让模型明白“前面生成的token虽然不是直接导致高分但为高分做出了贡献”。4.4 代码级理解一个极简PPO更新伪代码面试中如果要求手写PPO伪代码不用写完整训练循环但核心更新逻辑必须写对。我给出一个简化版本重点在于展示actor和critic如何配合更新。# 伪代码省略数据采样和模型加载部分 # old_logprobs: 旧策略在采样时的log概率shape: [batch, seq_len] # rewards: 奖励模型打分 KL惩罚后的最终奖励 # values: critic模型对每个token位置的V(s)预测 # returns: GAE计算后的return # advantages: GAE计算后的优势值 for _ in range(ppo_epochs): # 计算当前策略的log概率 logprobs, entropy actor_model(sequences, attention_mask) # 比率: exp(new_logprob - old_logprob) ratios torch.exp(logprobs - old_logprobs) # PPO clip损失actor surr1 ratios * advantages surr2 torch.clamp(ratios, 1 - clip_eps, 1 clip_eps) * advantages actor_loss -torch.min(surr1, surr2).mean() # Critic损失价值函数回归 value_loss F.mse_loss(values, returns) # 总损失 actor_loss value_coef * value_loss - entropy_coef * entropy loss actor_loss value_coef * value_loss - entropy_coef * entropy.mean() optimizer.zero_grad() loss.backward() optimizer.step() # 更新后需要用新策略重新计算values和logprobs用于下一轮迭代代码里的核心逻辑就三块比率计算、clip操作、actor和critic联合优化。有一个细节值得注意critic的value targets是用GAE计算出来的returns而不是直接用reward。很多人写PPO时在这里犯迷糊如果把critic直接回归到reward上训练稳定性和收敛速度都会受影响。4.5 value网络要不要初始化成SFT模型这是RLHF工程里一个容易被忽略但很重要的细节critic网络value network的初始化方案。常见做法是在SFT模型基础上增加一个value head然后做几轮warmup。如果随便初始化value head或者直接用reward model的输出头来初始化训练早期critic的预测会非常不准导致GAE估计出来的优势值噪声很大进而让actor训练不稳定。我个人的实操经验是在正式RLHF之前先用一批prompt让actor生成样本并把sequence completion后的reward算出来然后用这些数据对value head做几轮回归预训练。这样可以让critic在训练早期就有一定的预测能力PPO的稳定性会明显改善。这个细节在论文里不常提但在训练实践中非常关键。5. 高频追问与避坑指南为什么越来越多细节决定了成败PPO和RLHF的基本框架搞清楚之后面试官通常会开始追问各种“为什么”和“怎么办”。这些问题没有标准答案但答得好不好能直接体现候选人对RLHF的实践深度。5.1 为什么奖励分数里要减一个KL散度直接说结论纯用奖励模型分数做优化会导致reward hacking奖励黑客行为。啥意思就是策略模型学会了“骗过奖励模型”生成一些奖励模型喜欢但人类并不认可的文本。举例来说如果奖励模型在训练数据中见过很多“内容更长回答更详细”的样本被打高分策略模型就会倾向于生成极度冗长的文本哪怕其中大量是废话。如果奖励模型倾向于给特定句式更高的分策略模型就会反复堆砌此类句式。这不是模型“变聪明”了而是它找到了奖励函数里的捷径。KL散度惩罚的公式是final_reward r_θ(x, y) - β · KL(π_θ(y|x) || π_ref(y|x))这个惩罚项越大模型偏离参考模型越多得到的奖励惩罚也越大。β越大模型的输出就越保守、越接近SFT模型的风格β越小模型就越激进地追求奖励。训练中需要根据实际观测动态调整β或者做自适应KL控制。我面试别人的时候如果候选人能聊到“KL散度惩罚本质是在探索和利用之间做平衡”基本就会给加分。因为这表明他不只是记住了公式而是理解了惩罚项在RL训练中的语义。5.2 reward hackingRLHF最大的敌人reward hacking是RLHF落地中最头疼的问题很多模型在RLHF后期反而变差就是因为它。除了在奖励函数上套KL惩罚层工程实践中还有几道防线限制KL散度目标设定一个目标KL范围当实际KL超过时增大β低于时减小β。Reward模型集成训练多个不同的reward model在RL阶段取平均分或者取最小值降低单个模型被攻击的风险。批量奖励归一化对奖励分数做z-score归一化减小不同prompt之间的分数尺度差异。这里我想强调一点reward model的过拟合问题经常被低估。很多团队在RM训练时看到validation loss很低就很开心但实际上需要额外评估RM对“对抗样本”的鲁棒性。比如拿一个已知质量很差的回答故意用某种高分模板包装如果RM仍然给高分说明RM很容易被表面特征欺骗。5.3 参考模型可以冻结为什么不能干脆去掉这是一个高频追问“参考模型在训练的时候是冻结的那它到底起了什么作用去掉行不行”直接去掉参考模型是可以的但效果往往会变差。原因在于如果没有参考模型提供的分布约束策略模型就可以在没有任何“锚点”的情况下自由漂移。SFT模型本身已经具有不错的语言能力如果没有约束模型可能为了追求奖励而逐渐丧失语言的自然性和多样性。把参考模型想成一个尺子它用来度量“当前策略偏离正常表达的程度”。没有这把尺子模型可能越跑越偏最终产生怪异甚至胡言乱语的输出。在工程实现上参考模型和actor模型通常是同一个初始权重但参考模型全程不更新参数也不计算梯度所以内存和算力开销相对可控。5.4 PPO训练中prompt怎么选总共要多少轮这又是一个很实践性的问题。PPO训练中的prompt数据有两种主流来源一种是从SFT阶段的数据集里采样另一种是额外构造一批更贴近线上真实用法的prompt。后者效果通常更好因为SFT数据里的prompt往往质量较高且分布单一而线上用户的输入五花八门OOD问题在RL阶段同样严重。训练轮数方面学术界和工业界的做法差异很大。OpenAI发布的InstructGPT在RLHF阶段只做了少量PPO更新步数目的是“轻量对齐”避免过度优化奖励模型。但很多开源复现项目会跑几千甚至上万步。一个合理的参考是在单个对话数据集上跑500到2000步PPO更新之后观察输出质量和KL散度的变化如果生成样本的质量已经明显提升而KL又不高就可以停了。训练太久容易过拟合到奖励模型导致语言质量下降。6. 训练不稳定、Loss异常实际工程中的排查经验纸上谈兵容易真正在GPU集群上把RLHF跑起来会遇到各式各样的问题。从数据构造到分布式策略任何一个环节出问题都可能让训练直接崩溃或者模型质量显著下滑。这里把我在实操中踩过的坑和排查思路整理出来希望能帮大家少走弯路。6.1 用TRL在单卡上跑通RLHF的参考配置如果不具备大规模集群条件又想快速验证RLHF效果建议直接用HuggingFace的TRL库。TRL在0.8.0版本之后提供了完整的PPOTrainer接口并且深度集成了transformers框架可以在单卡或者小规模多卡环境下跑通一套极简RLHF流程。一个最基本的配置需要注意以下几点actor模型和reference model用同一个SFT模型初始化两者独立加载。reward model单独加载输入是完整回答文本输出一个标量分数。PPO超参方面learning_rate一般设为1e-6到1e-5batch_size按显存尽量调大。KL惩罚系数β初始值可以设0.01到0.05之间配合自适应KL控制。生成回答时设置温度0.7到1.0过低的温度会让采样多样性不足影响探索。如果你在单卡上跑建议用7B量级的模型配合LoRA来做否则显存压力会非常大。LoRA的秩一般取16到32在训练时只更新低秩矩阵能大幅降低显存占用效果和全量微调差距不大。这是个人实践下来性价比最高的单卡RLHF配置。6.2 训练不稳定的三类典型症状第一类症状actor loss直接爆炸或NaN。通常是学习率设置太高或者KL惩罚项缺失导致更新步幅过大。排查时先确认reward scale是否合理再把学习率调到更小值如5e-7重新跑。第二类症状生成文本越来越短或越来越长。这多半是奖励模型对长度存在隐含偏好并且KL惩罚系数不够大。可以手动统计训练过程中生成的sample长度变化趋势如果发现长度单调增长说明reward model被长度特征主导了需要调大β或者重新训练RM来消除长度偏好。第三类症状reward不断提升但人工评估效果反而变差。这是最典型的reward hacking信号。建议训练过程中用固定prompt集做人工评估或者用独立的评估模型打分。一旦发现reward指标与人工评估趋势不一致基本可以判定出现了reward hacking需要增加KL约束或者重新设计奖励信号。表格总结一下排查思路症状可能原因排查方向loss爆炸/NaN学习率过大、奖励尺度不正常降低lr检查reward分布输出长度异常RM偏好长度、KL惩罚不足增大β评估RM偏见reward涨但效果差reward hacking增加KL约束更换RM训练早期崩溃value网络未初始化好对value head做warmupKL持续快速增大策略漂移过快调大β检查PPO clip边界6.3 多卡并行与显存优化的一些经验RLHF训练对显存的要求比SFT高得多因为它有actor、critic、reference model、reward model四个网络同时参与训练。在资源有限的情况下我推荐两个思路第一是参数高效微调也就是用LoRA/QLoRA来更新actor模型。由于reference model和reward model都只是前向计算可以加载为4bit量化版本以显著降低显存占用。第二是使用DeepSpeed ZeRO-2或ZeRO-3进行分片让不同GPU分担模型参数和优化器状态。我个人实测下来在4张A100-80G的环境下用QLoRAZeRO-3可以轻松跑13B量级的RLHF训练这已经能覆盖大量实际业务场景了。还有一个小细节在生成阶段和训练阶段之间的切换。很多RLHF框架跑得慢的瓶颈不在计算而在生成的batch size设置不合理。生成阶段的batch size最好单独设置不要复用训练阶段的batch size因为生成阶段需要完整跑一遍自回归解码显存占用跟生成长度强相关。把生成阶段尽量压紧可以提升吞吐约20%到30%。7. 给准备面试和正在做RLHF的朋友一些实在的建议聊了这么多最后说说我个人的一些体会。如果你正在准备LLM算法岗的面试一个很有效的学习方式是自己从头实现一遍极简版的PPO。不需要在真实大模型上跑先用一个小规模GPT模型比如两层的transformer在一个玩具数据集上完成“生成→奖励→PPO更新”的闭环。这个实践过程会让你对logprob的计算、重要性比率的维度、clip操作的形状对齐都有非常直觉的理解。纸上得来终觉浅这句话在RLHF上尤其成立。如果你已经在做RLHF相关的工作我的建议是不要只盯着reward曲线看要建立多维度的评估视角。边训练边留出一批固定的prompt做人工评估并且持续监控KL散度、生成长度、多样性指标。训练是否该停止不应该只看一个指标而是综合判断。我自己见过太多团队因为“reward还在涨”就一直训下去最后得到的模型反而被评委一致评差。最后分享一个小技巧如果生成的回答质量不稳定试着把推理时的temperature降低一些比如从1.0降到0.8。RLHF训练完成的模型本身就偏好于高概率动作如果再配上过高的采样温度会引入不必要的随机性。这个细节在部署环节经常被忽略但它对用户体验的影响非常直接。训练跑得好上线效果也可能因为一个采样参数而失真这点一定要格外留意。
返回列表