跳转至

Posttraining

1723 个字 4 行代码 9 张图片 预计阅读时间 17 分钟

Pretraining language model 学会了大量语言统计规律和世界知识,但它的训练目标本质上仍然是:

\[ \text{predict next token} \]

这并不等价于:

\[ \text{be helpful, truthful, harmless, and follow user intent} \]

因此,base language model 往往还需要额外的 posttraining,让模型从“会续写文本”变成“能按照用户意图完成任务的 assistant

Important

Posttraining 的核心目标不是继续扩大预训练语料,而是让模型行为更符合人类需求。

常见步骤包括 instruction finetuning, preference modeling, RLHF, DPO 等。

Instruction Finetuning

Language modeling \(\ne\) assisting users

一个 pretrained LM 只是在学习:

\[ p_\theta(x_t \mid x_{< t}) \]

如果给它一个 prompt,它最自然的行为是“继续写看起来像训练语料的文本”,而不一定是在认真完成用户指令

Instruction finetuning 的想法是:收集大量(instruction, output) pair,然后用 supervised learning finetune language model

posttraining-instruction-finetuning-12

例如训练数据可以是:

Instruction: Answer the following question by reasoning step-by-step.
Input: The cafeteria had 23 apples...
Output: The cafeteria had 23 apples originally...

训练目标仍然是 language modeling,只是条件变成了 instruction

\[ \max_\theta \log p_\theta(y \mid x_{\text{instruction}}) \]

等价于最小化:

\[ J_{\text{SFT}}(\theta) = - \sum_t \log p_\theta(y_t \mid x_{\text{instruction}}, y_{< t}) \]

Tip

Instruction finetuning 可以理解为:把很多不同任务都写成自然语言指令,让模型学会“看到指令后应该输出什么样的答案”。

Scaling up finetuning

普通 finetuning 往往只针对一个具体任务,例如 sentiment classification

Instruction finetuning 则是把 finetuning 扩展到 many tasks

  • classification
  • sequence tagging
  • rewriting
  • translation
  • QA
  • reasoning with rationale
  • summarization

这使模型在训练时见过很多 task formats,测试时即使遇到 unseen task,也更可能理解 instruction 的含义

Important

Instruction finetuning 的效果也强依赖 scale

model 越大、instruction tuning data 越多,通常提升越明显。

甚至由于 Instruction finetuning 使用的数据量非常大,有些时候我们更愿意将其归为预训练而非微调

Why instruction finetuning is not enough?

Instruction finetuning 有两个明显限制

posttraining-instruction-limits-24

Problem 1: 很多任务没有唯一正确答案

例如:

Write me a story about a dog and her pet grasshopper.

开放式写作、对话、创意生成、总结等任务,很难说只有一个 ground-truth output

Problem 2: token-level loss 不能表达人类偏好

Language modeling loss 会把所有 token-level mistake 当成类似的错误

但在人类看来,不同错误的严重程度完全不同:

  • 少一个无关紧要的形容词,可能问题不大
  • 编造事实、误导用户、语气冒犯,问题很大

Important

Instruction finetuning 仍然是在做 supervised next-token prediction

但我们真正想优化的是:输出是否满足 human preferences

Optimizing for Human Preferences

假设我们有一个 promptLM 可以生成不同 response

如果人类可以给每个 response 一个 reward

\[ R(s)\in \mathbb{R} \]

其中 \(s\) 是模型生成的 samplereward 越高代表人类越喜欢

那么我们真正想优化的是:

\[ \mathbb{E}_{\hat{s}\sim p_\theta(s)}[R(\hat{s})] \]

也就是:希望模型生成的样本在期望意义下获得更高的人类偏好分数

posttraining-human-preference-reward-25

Tip

这一步把“训练语言模型”转成了一个 reinforcement learning 问题:

LM policy,生成的文本是 action sequence,人类偏好是 reward

Policy Gradient and REINFORCE

问题是:如何更新参数 \(\theta\),让模型生成高 reward response 的概率变大?

我们想做 gradient ascent

\[ \theta_{t+1} := \theta_t + \alpha \nabla_{\theta_t} \mathbb{E}_{\hat{s}\sim p_{\theta_t}(s)} [R(\hat{s})] \]

reward function 可能是不可微的,因为它可能来自人类判断

policy gradient 使用一个重要技巧:log-derivative trick

\[ \nabla_\theta \log p_\theta(s) = \frac{1}{p_\theta(s)} \nabla_\theta p_\theta(s) \]

因此:

\[ \nabla_\theta p_\theta(s) = p_\theta(s)\nabla_\theta \log p_\theta(s) \]

代回期望梯度:

\[ \nabla_\theta \mathbb{E}_{\hat{s}\sim p_\theta(s)}[R(\hat{s})] = \mathbb{E}_{\hat{s}\sim p_\theta(s)} [ R(\hat{s}) \nabla_\theta \log p_\theta(\hat{s}) ] \]

posttraining-reinforce-derivation-28

Monte Carlo samples 估计:

\[ \nabla_\theta \mathbb{E}_{\hat{s}\sim p_\theta(s)}[R(\hat{s})] \approx \frac{1}{m} \sum_{i=1}^m R(s_i) \nabla_\theta \log p_\theta(s_i) \]

直觉上:

  • 如果 \(R(s_i)\) 高,就增加模型生成 \(s_i\) 的概率
  • 如果 \(R(s_i)\) 低,就降低模型生成 \(s_i\) 的概率

Important

REINFORCE 的公式直觉很简单:reinforce good actions。

但实际训练 LM 时,vanilla REINFORCE 方差高、训练不稳定、sample inefficient,所以实际 RLHF 中常用 PPO 这类更稳定的 RL algorithm

PPO

PPO 全称为 Proximal Policy Optimization

它的核心思想是:每次更新不要让 policy 变化太大

如果新 policy 相比旧 policy 改得太激进,可能会让模型突然偏离原本稳定的语言分布,训练变得不稳定

PPO 使用 probability ratio

\[ r_t(\theta) = \frac{p_\theta(s_i)}{p_{\theta_{\text{old}}}(s_i)} \]

并通过 clipping 限制 update range,例如限制在:

\[ [1-\epsilon, 1+\epsilon] \]

Tip

PPO 的作用可以理解为:既要让模型朝高 reward 的方向走,又不能一步走太远。

Reward Modeling

直接让人类给每个模型输出打分很贵,而且人类打分容易 noisy and miscalibrated

所以 RLHF 通常先训练一个 reward model

\[ RM_\phi(s) \]

它输入一个 response,输出一个 scalar reward,用来近似人类偏好

但比起让人类直接给分数,实践中更常见的是收集 pairwise comparisons

例如给定同一个 prompt 的两个回答:

\[ s_w \succ s_l \]

表示人类更喜欢 winning sample \(s_w\),而不是 losing sample \(s_l\)

posttraining-reward-model-bt-33

Reward model 的训练目标使用 Bradley-Terry paired comparison model

\[ J_{RM}(\phi) = - \mathbb{E}_{(s^w,s^l)\sim D} \left[ \log \sigma \left( RM_\phi(s^w) - RM_\phi(s^l) \right) \right] \]

直觉是:

\[ RM_\phi(s^w) > RM_\phi(s^l) \]

也就是 reward model 应该给人类更喜欢的回答更高分

Important

Pairwise comparison 通常比直接打分更可靠。

人类可能很难稳定判断一个回答是 7 分还是 8 分,但更容易判断两个回答哪个更好。

RLHF

RLHF 全称为 Reinforcement Learning from Human Feedback

它把前面几个部分组合起来:

  1. 先有一个 pretrained / instruction-finetuned LM
  2. 收集人类 preference data
  3. 训练 reward model \(RM_\phi\)
  4. RL 优化 LM,使它生成 reward model 更喜欢的回答

posttraining-rlhf-pipeline-36

在课件中,RLHF reward 写成:

\[ R(s) = RM_\phi(s) - \beta \log \frac{ p_\theta^{RL}(s) }{ p^{PT}(s) } \]

其中:

  • \(RM_\phi(s)\) reward model 给出的偏好分数
  • \(p_\theta^{RL}\) 是正在被 RL 优化的 policy
  • \(p^{PT}\) 是原始 pretrained / instruction-finetuned model
  • 第二项是 KL penalty,防止模型偏离原始模型太远

posttraining-rlhf-objective-35

Important

RLHF 不只是“最大化 reward model 分数”。

它还通过 KL penalty 约束新模型不要离原模型太远,否则模型可能为了骗 reward model 而产生奇怪、退化或不真实的输出。

InstructGPT and ChatGPT

课件中把 InstructGPT / ChatGPT 看成 instruction finetuning + RLHF 的代表

大致流程是:

  • pretrain 一个 large language model
  • 用人工 demonstration supervised instruction finetuning
  • 收集多个 model outputs human ranking
  • 训练 reward model
  • PPO 优化 policy

InstructGPT 的重要意义是:它把 RLHF 扩展到了大量真实用户任务上,而不仅是单一任务如 summarization

ChatGPT 则可以理解为把 instruction finetuning + RLHF 用到 dialog agent 场景中

Limitations of RL and Reward Modeling

RLHF 很强,但它也有明显问题

Human preferences are unreliable

人类偏好本身并不稳定:

  • 不同 annotator 的标准可能不同
  • 同一个 annotator 在不同时间判断也可能不同
  • 标注者可能有文化、政治、教育背景上的 bias

Reward hacking

RL 中常见问题是 reward hacking

也就是模型找到一种方式最大化 reward,但这种方式并不符合我们真正想要的目标

chatbot 中,这可能表现为:

  • 回答看起来很权威,但其实是 hallucination
  • 输出更长、更有条理,因此 reward model 更喜欢,但内容未必更准确
  • 学会迎合偏好模型,而不是真正解决用户问题

Important

Reward model 只是人类偏好的近似模型。

如果过度优化这个近似目标,模型可能学会 exploit reward model,而不是满足真实人类需求。

RL optimization is complex

RLHF 中的 PPO 训练也比较复杂:

  • 需要 online sampling,训练慢
  • 需要 fitting value function
  • hyperparameters 敏感
  • 训练过程不稳定
  • compute cost

这也是后面 DPO 这类方法出现的重要动机:能不能保留 preference optimization 的效果,但去掉复杂的 RL loop

Direct Preference Optimization

DPO 全称为 Direct Preference Optimization

它的目标是:直接用 preference data 优化 policy,而不显式训练 reward model,也不跑 PPO

换句话说:

removing the "RL" from RLHF

From RLHF objective to DPO

RLHF 想最大化:

\[ \mathbb{E}_{\hat{y}\sim p_\theta^{RL}(\hat{y}\mid x)} \left[ RM_\phi(x,\hat{y}) - \beta \log \frac{ p_\theta^{RL}(\hat{y}\mid x) }{ p^{PT}(\hat{y}\mid x) } \right] \]

这个目标有一个 closed-form optimal policy

\[ p^*(\hat{y}\mid x) = \frac{1}{Z(x)} p^{PT}(\hat{y}\mid x) \exp \left( \frac{1}{\beta} RM(x,\hat{y}) \right) \]

整理后可以得到:

\[ RM(x,\hat{y}) = \beta \log \frac{ p^*(\hat{y}\mid x) }{ p^{PT}(\hat{y}\mid x) } + \beta \log Z(x) \]

posttraining-dpo-derive-54

DPO 的关键想法是:用当前 policy \(p_\theta\) 来表示这个 implicit reward

\[ RM_\theta(x,\hat{y}) = \beta \log \frac{ p_\theta(\hat{y}\mid x) }{ p_{\text{ref}}(\hat{y}\mid x) } + \beta \log Z(x) \]

其中 \(p_{\text{ref}}\) 通常是 reference model,例如 SFT model

Tip

DPO 不需要单独训练一个 reward model

它把“这个回答有多好”转成了当前 policy 相对 reference policy 给这个回答提高了多少概率。

DPO loss

Preference data 的形式是:

\[ (x, y_w, y_l) \]

其中:

  • \(x\) prompt
  • \(y_w\) human-preferred winning response
  • \(y_l\) losing response

DPO 使用 Bradley-Terry 形式:

\[ J_{DPO}(\theta) = - \mathbb{E}_{(x,y_w,y_l)\sim D} \left[ \log \sigma \left( RM_\theta(x,y_w) - RM_\theta(x,y_l) \right) \right] \]

implicit reward 代入后:

\[ J_{DPO}(\theta) = - \mathbb{E}_{(x,y_w,y_l)\sim D} \left[ \log \sigma \left( \beta \log \frac{p_\theta(y_w\mid x)}{p_{\text{ref}}(y_w\mid x)} - \beta \log \frac{p_\theta(y_l\mid x)}{p_{\text{ref}}(y_l\mid x)} \right) \right] \]

posttraining-dpo-loss-55

注意 \(\beta\log Z(x)\) 会消掉,因为 loss 只关心 winning losing response reward

Important

DPO 的直觉是:

  • 提高模型给 preferred response \(y_w\) 的相对概率
  • 降低模型给 dispreferred response \(y_l\) 的相对概率
  • 同时通过 reference model ratio 保持模型不要偏离原分布太远

Human Preference Data

Posttraining 的效果很大程度上依赖 preference data 的质量

但这些 labels 本身也有复杂问题:

  • RLHF labels 往往来自低薪标注者
  • 标注者偏好会影响模型行为
  • 不同国家、文化、政治立场、教育背景的人对“好回答”的标准可能不同
  • 如果 preference data 有偏,模型会把这种偏好学习进去

Important

Human feedback 并不是一个客观、无偏、完美的 reward source

它本身也是一种带有社会、文化、经济背景的训练信号。

Human feedback vs AI feedback

由于 human feedback 很贵,后续很多工作尝试使用 AI feedback

例如:

  • 用更强模型给 response 排名
  • 用模型自己生成 instruction tuning data
  • 用模型 critique revise 自己的输出

这可以降低数据成本,但也带来新的风险:

  • AI feedback 会继承 judge model 的偏差
  • 如果模型互相训练,错误可能被放大
  • 评估结果可能更偏向“像模型喜欢的回答”,而不是真正符合人类需求

Summary of Posttraining

可以把 Posttraining 的主线总结成:

  • Pretraining 让模型学会语言建模,但不保证模型会按照用户意图行动
  • Instruction finetuning (instruction, output) 数据让模型学会 follow instructions
  • Instruction finetuning 仍然受限于 token-level supervised learning,无法充分表达 open-ended human preferences
  • RLHF human preference data 训练 reward model,再用 RL 优化 LM
  • Reward model 通常用 pairwise comparisons Bradley-Terry loss 训练
  • RLHF 需要 KL penalty,防止 policy 偏离原模型太远
  • PPO 是常见 RLHF 优化方法,但复杂、昂贵、对超参数敏感
  • DPO 直接用 preference pairs 优化 policy,绕开显式 reward model PPO
  • Preference data 本身也可能带有 bias,因此 posttraining 不只是技术问题,也是数据和价值选择问题