7. InstructGPT 核心

7.1 InstructGPT 核心

1. 问题与动机

  • 问题 :语言模型(如GPT-3)规模扩大后仍存在幻觉、偏见、有害内容等问题,未对齐人类意图。
  • 目标 :通过人类反馈强化学习 (RLHF),使模型具备有用性、诚实性、无害性 。

2. 核心方法:RLHF 三阶段流程

Step 1:监督微调(SFT)

  • 输入:随机抽取的指令(如“解释登月”)+ 人工标注的理想回答。
  • 过程:用高质量问答对对GPT-3进行监督训练。
  • 目标:使模型初步模仿人类回答模式(“照猫画虎”)。

Step 2:奖励模型训练(RM)

  • 输入:同一指令下多个模型生成的答案(如A/B/C/D)。
  • 过程:人工标注员对答案排序(如 D>C>A=B),训练RM预测偏好分数。
  • 目标:构建“人类偏好裁判”,为后续强化学习提供评分依据。

Step 3:强化学习微调(PPO)

  • 输入:新指令(如“写青蛙故事”)+ RM的奖励值 rk
  • 过程:模型生成回答 → RM评分 → 通过PPO算法更新策略,最大化奖励并加入KL散度惩罚(防止偏离原始分布)。
  • 目标:通过“试错-反馈”机制,使模型输出更贴合人类偏好。

核心逻辑模仿人类(SFT)→ 学习偏好(RM)→ 动态优化(PPO),最终实现模型行为与人类意图的对齐。

先让模型学会人类怎么做(监督微调),
再让它知道什么样的答案更受欢迎(奖励模型),
最后用强化学习,不断调整自己,让输出越来越“人味儿”(PPO模型)。

3. Models

1. 监督微调(SFT)

  • 在人工标注的“理想回答”数据上对 GPT-3 进行监督微调。
  • 训练设置:16 个 epoch,余弦学习率衰减,0.2 残差 dropout。
  • SFT 模型选择依据:验证集上的奖励模型(RM)评分。
  • 发现:在第 1 个 epoch 后验证损失即开始过拟合,但增加 epoch 数仍能提升 RM 分数和人工偏好得分。

2. 奖励建模(RM)

  • 基于 SFT 模型构建奖励模型,去掉最后一层 embedding,输出 prompt + response 的标量分数。
  • 使用 6B 参数规模的 RM(计算效率高),发现 175B RM 不稳定,不适合作为价值函数。
  • RM 训练基于对比数据集,每个 prompt 对应两个模型输出,由人工标注偏好。

对比数据构建方式

  • 标注员对 K 个(K=4~9)模型输出排序,生成 (K2) 组对比样本。
  • 每个 prompt 的所有对比视为一个 batch 元素,避免过拟合并提高训练效率。

RM 损失函数

loss(θ)=1(K2)E(x,yw,yl)[log(σ(rθ(x,yw)rθ(x,yl)))]
  • rθ(x,y):奖励模型对 prompt x 和回答 y 的打分。
  • yw,yl:同一 prompt 下被标注员认为更好/更差的回答。
  • σ:sigmoid 函数,使输出落在 [0,1] 区间。
  • 损失目标是最大化偏好差异,本质是一个二分类逻辑回归问题。

奖励模型 rθ(x,y) 是在监督微调(SFT)之后单独训练的,其目标是模拟人类对模型输出的偏好(通过标注的排序数据)。

对于prompt x,取出一对 yw,yl,假设 ywyl 排序高。首先把 (x,yw)(问题 x 和回答 yw)输入到奖励模型 rθ() 中计算出分数,然后减去关于 yl 的奖励分数。我们希望这个差值越大越好,最后通过sigmoid函数、log加负号的方式构成损失函数。具体而言,这是一个Logistic Regression 的二分类问题 {+1,1},目标是让 yw 的分数尽可能大,yl 的分数尽可能小。当 K=9 时,理想情况下,我们能从1次排序中生成36对样本((92))。

排序4个答案可能要30s,排序9个答案大概只要40s,加上读题时间,时间其实只多了30% ~ 40%,并没有成倍增长。但由于9个答案能产生36个排序对,而4个答案只能产生6个,所以用差不多的人工时间,标注信息却多了6倍。极大提升数据效率,这是很赚的地方。

最贵的部分是 rθ(x,yw) 的计算。对于6B的GPT-3模型,虽然每次计算涉及到36个对比样本,但实际只需要做9次前向传播。如果某个输出的分数已经计算出来,可以在后续对比中复用这个结果。这样,我们通过复用前向计算结果,将36次计算减少到9次,节省了大约4倍的时间。如果K=4,每次只选出最优答案(一个对比对),模型容易过拟合,因为样本数量太少。

3. 强化学习(RL)

  • 因 RM 输出无绝对尺度,需归一化处理(标注员演示数据均值为 0)。
  • 使用 PPO 算法,以 SFT 模型为起点,针对每个 prompt 进行强化学习。
    • 环境为 bandit 类型:输入 prompt → 输出 response → RM 打分 → 结束。
    • 加入 KL 散度惩罚项,防止策略偏离 SFT 分布。
    • 奖励模型初始化 value function,得到的模型称为“PPO”。

进一步优化:PPO-ptx

  • 在 PPO 更新中引入预训练梯度,缓解“对齐成本”(alignment tax)。
  • 新的目标函数:
objective(ϕ)=E(x,y)[rθ(x,y)βlogπϕRL(y|x)πSFT(y|x)]+γExDpretrain[logπϕRL(x)]
  • πϕRL:当前 RL 策略。
  • πSFT:初始 SFT 策略。
  • Dpretrain:原始预训练分布。
  • β:KL 惩罚系数;γ:预训练梯度权重。
  • “PPO”:γ=0;“PPO-ptx”:γ>0
  • 默认模型 InstructGPT 即为 PPO-ptx(结合 RL 与预训练梯度)。

强化学习的PPO也是OpenAI之前的工作,核心是通过在目标函数 objective(ϕ) 上做随机梯度下降 来更新 policy。在RL中,策略(policy)由模型参数化,即我们要学习的模型 πϕRL​ ,它通过生成动作(action)输出结果 y 。一旦生成 y ,环境会通过奖励模型 rθ(x,y) 给这个回答打分,但模型本身不会改变环境(因为任务只有一轮交互)。πϕRL​ 初始化为监督微调后的模型 πSFT ,通过不断更新参数 ϕ 让目标函数 objective(ϕ) 的值最大化。

三个数据集之一在线强化学习数据集 E(x,y)​ (约31,000个固定prompt)。每次取一个prompt x,输入当前 πϕRL 模型生成回答 y,再用训练好的奖励模型 rθ(x,y) 计算reward。每次迭代 x 是固定的,y 随着policy更新会变化,reward也会变化。

为何需要奖励模型 rθ()?因为人类标注的数据是排序(如 ywyl),而不是具体分数或正确答案。如果每次生成 y 后都让人重新标注排序(在线学习Online Learning),成本太高了,所以我们需要训练一个 rθ() 来模拟人类打分。

随着y的不断更新,模型生成的新y可能和奖励模型训练时用的 y 逐渐偏离,导致reward变得不准,为了防止这个问题,我们在目标函数里加了一个KL散度惩罚项 βlogπϕRL(y|x)πSFT(y|x),KL散度其实就是用来衡量两个模型输出概率分布的差异,具体来说,就是比较现在的策略(πϕRL)和最初SFT模型(πSFT)生成答案的概率差别。我们希望KL越小越好,最好为0,说明两个分布几乎一样,加个负号就是鼓励模型尽量别跑偏,输出保持稳定。

如果直接用前面两项,可能模型只对当前任务的输出产生很好的性能,但对其他任务的性能下降(用于缓解alignment tax:模型在追求人类偏好的过程中可能损失通用任务性能 ,泛化能力)。所以 γExDpretrain[logπϕRL(x)] 它复用了原来 GPT-3 的预训练目标(损失函数)又拿了回来了。超参数 γ 控制它偏向原始数据的强度:γ=0 时仅优化RM的目标(PPO 模型);γ>0 时引入预训练梯度(PPO-ptx 模型)。

PPO目标函数的三项

  • rθ(x,y):模型生成答案后,奖励模型给分,分越高越好。
  • KL惩罚项:限制策略别偏离原本SFT模型太远,防止输出越来越离谱。
  • 预训练损失(可选):让模型还能保持原来GPT的泛化能力,不只会讨好人类。

单纯提升GPT-3参数规模(1.3B到175B),效果提升有限;
加入人类反馈微调(SFT)后,模型表现大幅跃升,远超同规模纯GPT-3;
进一步用RL(PPO和PPO-ptx)训练,效果比SFT显著更好;
这说明,光堆算力和数据不如用人类反馈好,方法比规模更重要

参考资料


“觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭”

微信二维码

微信支付

支付宝二维码

支付宝支付

7. InstructGPT 核心
http://neurowave.tech/2025/04/20/11-7.2-InstructGPT/
作者
Artin Tan
发布于
2025年4月20日
更新于
2025年8月2日