概述

本文用 Mermaid 图表可视化 nrehiew 的博客文章《SFT, RL, and On-Policy Distillation Through a Distributional Lens》中的核心概念。三个图表分别展示:完整训练管线、三种方法的对比流程、以及分布视角下的概率景观重塑。


图表一:完整 Post-Training 管线 🔄

从预训练到部署的完整流程,展示了每个阶段的数据来源(外部数据 vs 模型自身生成)和目标分布

graph LR
    subgraph 预训练 ["🧠 预训练 Pretraining"]
        A["🌐 海量互联网语料<br/>Massive Web Corpus"]
    end

    subgraph SFT阶段 ["📚 SFT 监督微调"]
        B["📋 固定外部数据集<br/>Fixed External Dataset"]
        C["🎯 目标分布: 外部标注分布<br/>Forward KL (Mode-Covering)"]
    end

    subgraph RL阶段 ["🎮 RL 强化学习"]
        D["🔄 模型自生成 (On-Policy)<br/>Model-Generated Data"]
        E["🏷️ 奖励信号过滤<br/>Reward Signal as Filter"]
        F["🎯 目标分布: 最近的最优策略<br/>Reverse KL (Mode-Seeking)"]
    end

    subgraph OPD阶段 ["🔬 OPD 在线蒸馏"]
        G["🔄 学生模型自生成 (On-Policy)<br/>Student-Generated Data"]
        H["👨‍🏫 教师分布监督<br/>Teacher Distribution Signal"]
        I["🎯 目标分布: 教师分布约束<br/>Reverse KL (Mode-Seeking)"]
    end

    subgraph 部署 ["🚀 部署 Deploy"]
        J["✅ 最终模型<br/>Final Model"]
    end

    A --> B
    B --> C
    C --> D
    D --> E
    E --> F
    F --> G
    G --> H
    H --> I
    I --> J

    style A fill:#e1f5fe,stroke:#01579b
    style B fill:#fff3e0,stroke:#e65100
    style C fill:#fff3e0,stroke:#e65100
    style D fill:#e8f5e9,stroke:#1b5e20
    style E fill:#e8f5e9,stroke:#1b5e20
    style F fill:#e8f5e9,stroke:#1b5e20
    style G fill:#f3e5f5,stroke:#4a148c
    style H fill:#f3e5f5,stroke:#4a148c
    style I fill:#f3e5f5,stroke:#4a148c
    style J fill:#c8e6c9,stroke:#2e7d32

说明

  • SFT 阶段:使用固定的外部数据集,模型学习模仿外部分布 → 容易遗忘通用能力
  • RL 阶段:模型自己生成数据(on-policy),奖励信号做过滤器 → 遗忘更少
  • OPD 阶段:学生模型自己生成数据,教师提供分布级监督 → 融合专家能力

图表二:三种方法对比流程图 ⚖️

从数据生成、目标损失、KL 方向、更新密度到遗忘行为的完整对比。

flowchart TD
    START["🎯 Post-Training 方法选择"]
    
    START --> SFT["📚 SFT<br/>监督微调"]
    START --> RL["🎮 RL<br/>强化学习"]
    START --> OPD["🔬 OPD<br/>在线蒸馏"]

    subgraph SFT_path ["SFT 路径"]
        SFT_A["📋 固定数据集<br/>Fixed Dataset"]
        SFT_B["📐 Forward KL 散度<br/>Mode-Covering (模式覆盖)"]
        SFT_C["⬛ 密集更新<br/>每 token 均匀监督"]
        SFT_D["⚠️ 灾难性遗忘<br/>Catastrophic Forgetting"]
        SFT_E["🧪 测试时分布不匹配<br/>Compounding Errors"]
        
        SFT_A --> SFT_B --> SFT_C --> SFT_D --> SFT_E
    end

    subgraph RL_path ["RL 路径"]
        RL_A["🔄 On-Policy 数据<br/>模型自生成"]
        RL_B["🏷️ 奖励过滤 (0/1)<br/>≈ 拒绝采样"]
        RL_C["📐 Reverse KL 散度<br/>Mode-Seeking (模式寻求)"]
        RL_D["🔲 稀疏更新<br/>仅通过 on-policy 样本"]
        RL_E["✅ 保持通用能力<br/>Preserves General Skills"]
        
        RL_A --> RL_B --> RL_C --> RL_D --> RL_E
    end

    subgraph OPD_path ["OPD 路径"]
        OPD_A["🔄 On-Policy 数据<br/>学生自生成"]
        OPD_B["👨‍🏫 教师 KL 匹配<br/>Teacher Distribution"]
        OPD_C["📐 Reverse KL 散度<br/>Mode-Seeking (模式寻求)"]
        OPD_D["🟡 分布坍缩风险<br/>Mode Collapse"]
        OPD_E["✨ 可超越教师<br/>Can Outperform Teacher"]
        
        OPD_A --> OPD_B --> OPD_C --> OPD_D --> OPD_E
    end

    style START fill:#e0e0e0,stroke:#424242
    style SFT fill:#ffccbc,stroke:#bf360c
    style RL fill:#c8e6c9,stroke:#1b5e20
    style OPD fill:#e1bee7,stroke:#4a148c
    style SFT_D fill:#ff8a80,stroke:#b71c1c
    style SFT_E fill:#ff8a80,stroke:#b71c1c
    style RL_E fill:#69f0ae,stroke:#00c853
    style OPD_E fill:#b39ddb,stroke:#4527a0

说明

  • SFT (红色路径):固定数据 → 前向 KL → 密集更新 → 遗忘严重 + 分布不匹配
  • RL (绿色路径):自生成数据 → 奖励过滤 → 反向 KL → 稀疏更新 → 保持通用能力
  • OPD (紫色路径):自生成数据 → 教师监督 → 反向 KL → 可能模式坍缩,但也能超越教师

图表三:分布视角下的概率景观 🎨

直观展示 SFT、RL、OPD 三种方法如何以不同方式重塑模型的概率密度分布

graph TB
    subgraph 初始分布 ["🔵 初始模型分布 Initial Distribution"]
        INIT["P_init(x)<br/>涵盖通用能力 + 多样生成"]
        INIT_DESC["🌍 宽泛分布,模式多样<br/>Broad distribution, diverse modes"]
    end

    subgraph SFT分布 ["🔴 SFT 后的分布"]
        SFT_DIST["P_sft(x) → 学习外部标注分布"]
        SFT_EFF["📐 Forward KL: 强制覆盖所有标注模式<br/>⚠️ 牺牲原有非标注模式 → 遗忘"]
        SFT_VIZ["分布图: [🟦🟦🟥🟥🟥🟥🟦🟦]<br/>⬅️ 新区间强迫收缩 → 旧区间被挤出"]
    end

    subgraph RL分布 ["🟢 RL 后的分布"]
        RL_DIST["P_rl(x) → 在已有模式中寻求最优"]
        RL_EFF["📐 Reverse KL: 在模型访问区域寻优<br/>✅ 不探索新区域 → 不遗忘"]
        RL_VIZ["分布图: [🟦🟦🟩🟩🟩🟦🟦🟦]<br/>⬅️ 仅在已有密度上提升"]
    end

    subgraph OPD分布 ["🟣 OPD 后的分布"]
        OPD_DIST["P_opd(x) → 教师引导的模式坍缩"]
        OPD_EFF["📐 Reverse KL: 坍缩到教师模式<br/>✨ 提升目标能力,但可能丢失多样性"]
        OPD_VIZ["分布图: [🟦🟪🟪🟪🟪🟪🟦🟦]<br/>⬅️ 强烈坍缩 → 专注但可能过度"]
    end

    INIT --> INIT_DESC
    INIT --> SFT_DIST --> SFT_EFF --> SFT_VIZ
    INIT --> RL_DIST --> RL_EFF --> RL_VIZ
    INIT --> OPD_DIST --> OPD_EFF --> OPD_VIZ

    style INIT fill:#bbdefb,stroke:#0d47a1
    style INIT_DESC fill:#bbdefb,stroke:#0d47a1
    style SFT_DIST fill:#ffcdd2,stroke:#c62828
    style SFT_EFF fill:#ffcdd2,stroke:#c62828
    style SFT_VIZ fill:#ffebee,stroke:#d32f2f
    style RL_DIST fill:#c8e6c9,stroke:#2e7d32
    style RL_EFF fill:#c8e6c9,stroke:#2e7d32
    style RL_VIZ fill:#e8f5e9,stroke:#388e3c
    style OPD_DIST fill:#e1bee7,stroke:#6a1b9a
    style OPD_EFF fill:#e1bee7,stroke:#6a1b9a
    style OPD_VIZ fill:#f3e5f5,stroke:#7b1fa2

说明

  • Forward KL (SFT):模式覆盖(mode-covering)—— 试图覆盖教师的所有模式,即使是以牺牲模型原有的有效模式为代价
  • Reverse KL (RL/OPD):模式寻求(mode-seeking)—— 在模型已有的概率质量区域中寻找匹配,不强迫探索新空间
  • On-Policy 数据是关键:RL 和 OPD 遗忘更少的根本原因不是算法类型,而是使用 on-policy 数据

核心洞察 💡

维度SFTRLOPD
数据来源外部固定模型自生成 (On-Policy)模型自生成 (On-Policy)
目标信号标注输出奖励值 (0/1)教师分布
KL 方向Forward KLReverse KLReverse KL
更新密度密集 (每 token)稀疏 (仅采样)中等
遗忘程度⚠️ 严重✅ 轻微✅ 轻微
可超教师