Skip to content

Latest commit

 

History

History
576 lines (467 loc) · 32.4 KB

File metadata and controls

576 lines (467 loc) · 32.4 KB

RLHF (基于人类反馈的强化学习) 🧣✒️📋13

create date last modify

Keywords: 偏好学习, 对齐学习


快速回顾 ⏰

核心步骤 (监督微调 . 奖励模型 . 策略优化)

监督微调 → 奖励模型 → 策略优化 (强化学习)

  • 监督微调 (SFT):

    • 目标:
      🚩 构建基础能力, 使模型具备基本的指令跟随能力, 构建良好基线.

    • 训练数据:

      • 人类编写的高质量 (Prompt, Response) 对;
    • 训练方法:

      • 全参数微调;
      • 参数高效微调 (PEFT);
        🚩 LoRA (低秩自适应):
    • 目标函数:
      🚩 交叉熵损失

  • 奖励模型 $R_{\phi}(x, y)$:

    • 目标:
      🚩 将人类偏好转化为标量分数;

    • 输入输出:

      • 预测时: $(x,y) \rightarrow r$
      • 训练时: $(x,y^+,y^-) \rightarrow (x,y^+), (x,y^-) \rightarrow (r^+,r^-) \rightarrow \sigma(r^+ - r^-)$
    • 训练数据: 人类偏好数据 (Prompt, Chosen Response, Rejected Response)

    • 模型结构: SFT 模型 (移除 lm_head 层) + 新线性层;

    • 目标函数: 🚩 成对排序损失 (Pairwise Ranking Loss) / 负对数似然损失

      其中 $\boxed{\sigma \big( R_{\phi}(x, y^+) - R_{\phi}(x, y^-) \big) = P(y^+ \succ y^- \mid x)}$成对比较概率 (Bradley–Terry 模型), 表达了 $y^+$ 优于 $y^-$ 的概率.

  • 策略优化 (基于 PPO 算法):

    • 目标函数 (组合目标):
      🚩 策略优化 (PPO-Clip) + 价值函数误差 + KL 正则项

    • 策略模型 $\pi_{\theta}(s)$ 📌

    • 价值模型 $V_{\phi}(s)$:

      • 训练方法: 自举 (Bootstrapping), 监督信号由 奖励模型 提供;
      • 训练数据:
        • 一条长度为 $T$ 的轨迹, 提供 $T$ 个训练样本:

          其中

          • $T$ : Response 的 token 数;
          • $r$ : 奖励模型对完整上下文 (prompt + response) 给出的最终奖励 (可能含 KL 惩罚, 折扣因子等修正);
          • $s_t$ : prompt + 已生成的前缀 (partial response);
          • $R_t$ : 每个时间步的奖励, 都取最终奖励 $r$;

            直观理解: 无论在序列的哪个位置, 后续都会走向同一个结果.

      • 目标函数:
        • 均方误差 (MSE) 损失
    • 参考模型 $\pi_{\text{ref}}$:

      • 固定参数的 SFT 模型;
      • PPO-Penalty 需要, 因为要计算 KL;
      • PPO-Clip 不需要 (主流), 只需要 旧策略 (即 上一次迭代的策略);

优化过程 (轨迹采样 . 策略更新)

伪代码 📌

部分函数说明 (python):

  • Categorical(): torch.distributions.Categorical(probs)
  • Append(): list.append()
  • Extend(): list.extend()
  • Length(): list.len()
  • Gather(): torch.gather()

💡 要点说明


其他改进算法


背景 . 动机 . 优势

  • RLHF (Reinforcement Learning from Human Feedback, 基于人类反馈的强化学习)

    • 是一种通过结合 人类偏好强化学习 来微调大语言模型的 技术范式;
    • RLHF 是建立在 SFT 基础上的进一步微调;
  • 预训练的局限:

    • 大规模无监督语料预训练 虽然能使 LLM 获得强大的 语言建模能力,
    • 但输出内容可能与 人类价值观, 安全性要求交互习惯 等不一致;
  • SFT 的不足:

    • SFT 的目标是 拟合训练数据的条件分布, 虽然能让模型在 特定任务 上更可控,
    • 但其性能上限取决于 数据的质量和范围,
    • 未见场景的泛化细粒度偏好的对齐 能力有限;
  • RL 引入难题:

    • 奖励函数难以定义:
      • 自然语言的好坏缺少客观标准;
      • BLEU/ROUGE 等自动指标与人类主观感受差异较大;
    • 奖励稀疏 & 延迟:
      • LM 输出是逐 token 生成, 但奖励通常只在序列结束时给出;
      • 这导致奖励信号稀疏, 难以为每个 token 的选择提供即时反馈;
      • 传统 RL 在这种长序列且延迟奖励的场景下训练效率极低;
    • 动作空间大:
      • 对 NLP 来说, 动作空间是整个词表, 比一般游戏的动作空间大几个数量级;
      • 传统 RL 算法在如此巨大的组合空间中极易陷入无效探索;
    • 训练不稳定:
      • 语言模型参数规模庞大, 若无良好初始化, 极易出现梯度爆炸/模式崩坏等问题;
      • 传统 RL 算法在高维连续动作空间中表现不稳定;
  • 动机/思路

    • RLHF 的核心在于 将人类偏好作为优化目标;
      • 通过将 人类偏好 量化为一个 标量奖励分数 (当做评价一个回答好坏的信号),
      • 鼓励 模型去探索那些未在原始训练集中出现, 但可能获得高奖励 (即更符合人类偏好) 的回答,
      • 使模型具有 更大的策略搜索空间, 从而有可能 突破静态数据的限制, 生成 更符合要求 的输出;
  • 优势 (相比仅 SFT)

    • 更大的策略空间:
      • SFT 的损失函数 (交叉熵) 惩罚模型输出与标准答案之间的差异, 因此其搜索空间被限制在示范数据附近;
      • RLHF 的目标是 最大化奖励信号, 这允许模型 尝试训练中未出现, 但高奖励 (更符合偏好) 的表达, 因此拥有更大的策略探索空间;
    • 更容易对齐抽象偏好:
      • SFT 模仿给定的示范数据, 难以学习复杂/模糊/抽象的维度或概念, 比如 逻辑性/幽默感 等;
      • RLHF 将人类反馈转化为 序列级奖励/排序信号/比较信号
        • 抽象偏好虽然难以用单一答案标注, 但可以通过 成对比较排序 体现 (如 A 比 B 更有说服力);
    • 更低的数据成本:
      • SFT 需要提供高质量的示范数据, 对抽象偏好更是难以统一标准;
      • RLHF 只需要获得数据间的 相对关系, 比如 A 和 B 哪个更好/更幽默/更简洁/更有逻辑 等;

        虽然不同人的判断标准依然有差异, 但相比直接撰写一个 "好的/幽默的/简洁的/有逻辑的" 的回答, 难度降低了非常多;

    • 其他优势, 比如 更好的泛化性, 更好的安全性, 更少的幻觉/错误, 更灵活的优化方式, 平衡多个优化目标 等等, 基本都是以上优势的拓展;

实施流程 (三个核心步骤)

RLHF 通常包含三个核心步骤: SFT → RM → RL

1. 监督微调 (SFT)

构建基础能力

  • 动机:
    • 预训练模型虽然知识丰富, 但其输出格式和内容质量可能不符合特定任务的要求;
  • 目的/预期:
    • 将预训练语言模型调整到具备基本的 指令遵循能力, 为后续步骤提供一个性能良好的 基线模型;
    • 提供一个稳定可用的初始策略, 避免 RL 从随机策略开始导致训练不稳定;
    • SFT 是 RLHF 的基础, 若 SFT 模型效果不佳, 会导致后续 奖励模型失真 / RL 优化失败 等一系列问题;
  • 输入:
    • 预训练语言模型;
    • 高质量指令-响应对数据集 (Prompt + 人工撰写的理想回答);
  • 输出:
    • 初步对齐 的 SFT 模型
  • 失败模式:
    • 数据质量差: 学到错误或不一致的模式;
    • 数据覆盖低: 在未见任务上表现差;
    • 灾难性遗忘: 在微调过程中可能遗忘预训练阶段获得的知识;

2. 人类反馈收集与奖励模型 (Reward Model)

量化人类偏好

  • 动机:
    • 人类偏好难以用简单规则定义, 需要一种可泛化到新样本的自动化 评分机制;
  • 目的/预期:
    • 人类偏好 转化为可量化的 标量奖励信号;
    • 训练一个能够 对模型输出打分奖励模型 作为评价人类偏好的代理, 其评分能反映模型回答的好坏;
  • 输入:
    • SFT 模型 + 人类偏好数据集,

      给定 提示 后, 由 SFT 模型 生成多个回答, 每组回答有人类标注的 偏好排序;

  • 输出:
    • 奖励模型: 一个能够为任何「提示+回答」对打分的模型;
    • 模型输入: 提示+回答 → 模型输出: 标量分数;
  • 失败模式:
    • 奖励失真/标注偏差: 奖励模型学习到错误的偏好模式;
    • 数据多样性不足/泛化能力不足: 奖励模型在 分布外数据 上表现不佳, 无法准确评估训练集范围外的回答;
    • 过拟合: 在训练样本上打分准确, 但对新样本失效;

奖励模型训练流程

  • 目标:

    • 将人类的相对偏好转化为一个可优化的 标量奖励函数 $R_{\phi}(\cdot)$;
    • 训练一个模型, 使其能够为给定的 提示-回答$(x, y)$ 分配一个 标量分数 $r = R_{\phi}(x, y)$;
  • 训练数据:

    • 来源:
      • 使用 阶段一训练的 SFT 模型 在同一提示下生成的两个或多个候选输出;
      • 由人类标注者进行成对比较或排序;
    • 数据形式 (每条样本包含):
      • 上下文 (Prompt): $x$;
      • 获胜回答 (Chosen Response) $y_j$;
      • 失败回答 (Rejected Response) $y_k$;
  • 模型结构:

    • 骨干:
      • 使用阶段一微调后的 SFT 模型初始化 Transformer 主体, 并 移除 lm_head (即预测下一个 token 的线性层)

        为了减少训练成本; 也可以是另一个经过微调的 LM; 还可以是根据偏好数据从头开始训练的 LM (Anthropic)

    • 输出层
      • 一般取 最后一个 token (通常是 EOS) 对应的隐藏向量 $h_{\scriptscriptstyle EOS}$ 作为整段输入的表示;
      • 通过一个新的 线性层 $Wh_{\scriptscriptstyle EOS}+b$ 得到标量分数;
        • 通常线性层的 输入维度 等于隐层维度, 输出维度 为 1;
  • 损失函数

    • Bradley–Terry Loss / Pairwise Logistic Loss (成对样本, 一正一负)

      • 对给定 上下文 $x$一对回答 $(y_j, y_k)$, 其中人类标注认为 $y_j$ 优于 $y_k$, 记作 $y_j \succ y_k$;

      • 根据 Bradley-Terry 模型, 定义 $y_j \succ y_k$ 的概率为:

      • 训练目标是 最大化似然函数 $L$, 或最小化对应的 负对数似然损失:

    • InfoNCE Loss (候选回答大于 2 时, 一正多负)

  • 训练阶段:

    • 在一次前向计算中, 奖励模型分别对 $(x, y_j)$$(x, y_k)$ 各跑一遍, 得到两个标量分数 $r_j$$r_k$;
    • $y_j \succ y_k$, 则损失为 $l = -\log \ \sigma(r_j - r_k)$
  • 推理阶段:

    • 输入:
      • Prompt + 单个候选输出;
    • 输出:
      • 标量分数 (越高表示越符合奖励模型学到的人类偏好);

Bradley–Terry 模型介绍

训练奖励模型时, 在 损失函数 中使用了 Bradley–Terry (BT) 模型, 这里简单介绍下.

  • 背景:

    • BT 模型最早应用于体育领域,
    • 目的 是通过分析一系列两两对战的胜负结果, 估算出参赛对象的潜在 能力分数;
    • 核心思想: 能力分数越高, 获胜概率越大;
  • 基本假设:

    • 每个对象 $y$ 存在一个 不可直接观测的标量能力分数 $r$, 用于衡量其 强度;

    • 当两个对象 $y_j$$y_k$ 进行比较时, 结果是一个随机事件, 其 概率 仅取决于它们之间的 能力分数差, 即 $r_j - r_k$;

    • 具体地, $y_j$ 战胜 $y_k$ (记 $y_j \succ y_k$) 的概率由以下公式定义:

      其中 $\sigma(z) = \dfrac{1}{1 + e^{-z}}$Sigmoid 函数, 显然有 $P(y_j \succ y_k) + P(y_k \succ y_j) = 1$;

    • 因此, BT 模型本质上是通过 Sigmoid 函数 将两个对象的 能力分数差 映射为其比较的胜率;

  • 目的:

    • 在经典 BT 模型中, 其目标是利用观测到的大量 成对比较结果 $D = {(y_j, y_k) \mid y_j \succ y_k}$, 学习一个 评分函数 $R_{\phi}(y)$; 该函数接收一个对象 $y$ 作为输入, 输出其静态能力分数;
  • 优化过程/损失函数:

    • 模型的优化目标是 最大化 所有观测结果在模型下的 似然估计;

    • 其对应的 负对数似然损失函数 为:

    • 该损失函数的直观作用是: 鼓励模型拉大强弱对象之间的分数差, 使得模型的预测结果与观测到的胜负关系一致;


3. 策略优化 (Policy Optimization)

基于 强化学习 (RL) 框架 进一步优化 SFT 模型, 对齐人类偏好.

  • 强化学习基础

    RL 基础 (基于 LLM 背景)

  • 动机:
    • SFT 模型的学习受限于静态数据, 缺乏主动探索能力;
    • 策略优化旨在让模型通过与 环境 的交互, 在 更大的策略空间 中寻找更优的行为;

      LLM 微调语境下的 环境, 即模型生成下一个 token 时的 上下文 (Prompt + 已生成的 token 序列)

  • 核心目标:
    • 通过优化策略参数, 最大化策略模型的期望累计回报;
    • 通常会引入一个正则项 (比如 KL 散度), 以防止优化后的策略过度偏离原始的 SFT 模型, 以保持生成内容的稳定性和质量;
  • 输入 (关键组件):

    以 PPO 算法为例, 不同策略优化算法需要的输入不同.

    • Prompt 数据集;
    • 策略模型: 待优化的模型, 通常由 SFT 模型初始化;
    • 奖励模型 (可选): 作为人类的 偏好代理, 为模型输出打分; 在策略优化阶段不参与更新;
    • 参考模型 (可选): 提供 KL 散度约束; 初始 SFT 模型的副本, 不参与更新;
    • 价值模型 (可选): 估计 给定状态的回报; 结构与奖励模型一致, 在策略优化阶段 独立于策略模型进行训练, 使用 SFT 模型初始化;
  • 输出:
    • 对齐人类偏好的最终模型 (经过 RLHF 微调后的模型)
  • 失败模式:
    • 奖励过度/过度优化: 在奖励模型的打分上越来越高, 但实际输出质量下降;
    • 模式坍塌: 过度优化的副作用之一, 输出模式单一, 失去多样性 (模型为了获得高分只会生成「安全」回答);
    • 奖励黑客 (Reward Hacking): 模型学会利用奖励模型漏洞而非真正提升质量; 比如更冗长的回答/更礼貌的回答等, 观感提升但忽视质量;
    • 除此之外, 还有 偏好冲突/价值错配 等失败模式,
    • 根源 一般是 "奖励信号不完美/失真 + 优化算法过度依赖奖励模型";

策略梯度算法

策略梯度 (Policy Gradient) 算法笔记

TRPO → PPO (Clip/KL) → DPO → GRPO/IPO/KTO/...


Q&A


1. 🏷️ 基础概念

1.1. ✅ 什么是 RLHF? 它的背景/动机是什么? 相比 SFT 的优势在哪里? 怎么实现的?

• RLHF (Reinforcement Learning from Human Feedback, 基于人类反馈的强化学习), 是一种通过结合 人类偏好强化学习微调大语言模型 的技术;

1.2. ⬆️ 什么是 对齐? RLHF 是如何实现大模型与人类意图对齐的?

对齐: 让 AI 模型的目标与 人类偏好 (价值观和意图) 保持一致;
• 通过 奖励模型 将人类偏好作为优化目标, 使用 强化学习 驱动模型行为向这个目标靠近, 从而实现对齐;

1.3. ⬆️ 为什么说 RLHF 比 SFT 具有 更大的策略搜索空间?

SFT: 拟合示范数据, 搜索空间被限制在其附近;
RLHF: 对齐人类偏好, 鼓励模型探索高奖励回答;

1.4. ⬆️ 为什么说 RLHF 比 SFT 更容易 对齐抽象偏好?

SFT: 基于示范数据, 抽象偏好的数据难以构造;
RLHF: 基于奖励模型, 将抽象偏好转化为 比较信号;

1.5. ✅ RLHF 的一般流程是什么? 每一步的目的? 分别解决什么问题?

• 1.SFT (构建基础能力) → 2.奖励模型 (量化人类偏好) → 3.策略优化/RL (对齐人类偏好)

1.6. ⬆️ 指出每阶段的 输入, 输出失败模式

1.7. ✅ 若 SFT 质量不高, RLHF 会发生什么连锁反应?

• 基础能力弱 → 奖励模型失真 → RL 优化失败;

1.8. ✅ 什么是 奖励黑客 (Reward Hacking)/奖励过度/模式坍缩?

奖励黑客: 发现奖励模型漏洞, 使用奖励模型偏好的回答获得高分;
奖励过度 (过拟合): 在奖励模型上得分越来越高, 但实际输出质量下降;
模式坍缩: 输出模式单一, 失去多样性;

本质是 奖励模型失真, RL 过度依赖奖励模型;

2. 🏷️ 奖励模型

2.1. ✅ 详细说明 奖励模型 是如何训练的? 包括 训练数据/模型结构/损失函数 等方面

  • 展开详情 ⬇️
    • 训练数据: $(x, y_j, y_k, l_{y_j \succ y_k})$
    • 模型结构: SFT 模型 (移除 lm_head 层) + sigmoid 线性层
    • 损失函数: $L = -\log \ \sigma (r_j - r_k)$

    奖励模型训练流程

2.2. ✅ 介绍一下 Bradley-Terry (BT) 模型, 它是如何应用到奖励模型中的?

  • 展开详情 ⬇️
    • Bradley-Terry 模型是一种通过 成对比较 数据来估计实体强度的概率模型;
      • 通过一系列成对的比较结果 ($x_j \succ x_k$), 为每个对象估算出一个标量分数, 代表其强度;
    • 在 RLHF 中, 我们给出对同一 Prompt 下两个不同回答的偏好标注结果, 将 BT 模型应用到损失函数中, 来训练奖励模型;

3. 🏷️ 价值模型

3.1. ✅ 价值模型是如何训练的?

• 在轨迹采样过程中收集奖励信号, 然后在策略优化时与策略模型一起训练;

3.2. 🚨 PPO 中的 价值模型 存在什么问题?

• 1.奖励稀疏; 2.资源消耗

  • 展开详情 ⬇️
    • 奖励稀疏/奖励分配:
      • LLM 场景下, 奖励模型通常只在 序列末尾 给出一个整体分数;
        • 这意味着中间每个 token 没有直接的监督信号;
        • 因此价值函数很难学到逐 token 的精确信号, 导致 baseline 不准确, 进而影响 PPO 的稳定性;
    • 资源消耗:
      • 在 PPO 中, 价值函数通常是一个与策略模型同规模的网络;
      • 对于 7B, 13B 甚至更大的模型, 这意味着需要额外维护这样一个庞大的模型, 显著增加存储和计算成本.

3.3. 💡 PPO 是典型的 在线策略 (On-Policy) 算法, 但为什么有人说 RLHF 中使用的 PPO 是 Off-Policy 的?

• RLHF 场景中 奖励模型 固定且基于旧策略训练, 导致实际优化过程可能带有 off-policy 的性质.

3.4. 🚨 🚩 💡 ❓ ⚠️ ⬆️ 🏷️ ✅ 为什么离线算法 (如 DPO) 不需要价值模型?


  • 展开详情 ⬇️