概述
本文用 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 数据
核心洞察 💡
| 维度 | SFT | RL | OPD |
|---|---|---|---|
| 数据来源 | 外部固定 | 模型自生成 (On-Policy) | 模型自生成 (On-Policy) |
| 目标信号 | 标注输出 | 奖励值 (0/1) | 教师分布 |
| KL 方向 | Forward KL | Reverse KL | Reverse KL |
| 更新密度 | 密集 (每 token) | 稀疏 (仅采样) | 中等 |
| 遗忘程度 | ⚠️ 严重 | ✅ 轻微 | ✅ 轻微 |
| 可超教师 | ❌ | ❌ | ✅ |