Skip to content
Gains Summary
Main Navigation 首页 / Home
C++ 编程 / C++ Programming
系统与高性能 / Systems & Performance
Web 开发 / Web Development
人工智能 / Artificial Intelligence
工业软件 / Industrial Software
其他内容 / Other Topics
C++ 编程 / C++系统与性能 / SystemsWeb 开发 / Web人工智能 / AI工业软件 / Industrial

外观

Sidebar Navigation

← 人工智能 / Artificial Intelligence

AI 基础设施 / AI Infrastructure

集群基础设施 / Cluster Infrastructure

1. GPU 集群基础设施全景——训练框架之下、硬件之上的那一层 / GPU Cluster Infrastructure Between Training Frameworks and Hardware

2. GPU 集群硬件架构——从 NVLink 到 InfiniBand / GPU Cluster Hardware from NVLink to InfiniBand

3. 异构硬件生态——CPU/DPU/NPU 的集群角色 / Roles of CPUs, DPUs, and NPUs in Heterogeneous Clusters

4. GPU 虚拟化与资源隔离——一张卡多人用 / GPU Virtualization and Resource Isolation

5. 作业调度系统——Kubernetes 和 Slurm / Job Scheduling with Kubernetes and Slurm

6. 多作业与多租户管理——让集群被所有人高效使用 / Multi-Job and Multi-Tenant Cluster Management

7. 网络架构与 RDMA——让 GPU 之间的通信更快 / Network Architecture and RDMA for Faster GPU Communication

8. NCCL 集群组网——大规模集合通信调优 / NCCL Cluster Networking and Collective Communication Tuning

9. 分布式存储——让数据跑得比 GPU 快 / Distributed Storage That Keeps GPUs Fed with Data

10. 集群运营与故障处理——让万卡集群稳定运行 / Operations and Failure Recovery for Large GPU Clusters

训练系统 / Training Systems

1. AI Infra 训练侧全景——让千亿参数模型跑起来需要什么 / Training-Side AI Infrastructure for Hundred-Billion-Parameter Models

2. GPU 硬件基础——为什么 GPU 比 CPU 快,显存为什么总是不够 / GPU Hardware, Parallel Throughput, and Memory Capacity

3. 分布式训练——如何把大模型分到多张卡上 / Distributing Large-Model Training Across Multiple GPUs

4. 显存优化——让 70B 模型在有限显存中跑起来 / Memory Optimization for Running 70B Models

5. 混合精度与通信——BF16 为什么是 LLM 训练的主流选择 / Mixed Precision and Communication with BF16

6. 预训练——Scaling Laws、数据工程与训练稳定性 / Pretraining with Scaling Laws, Data Engineering, and Stability

7. 后训练 SFT——从预训练模型到助手模型 / Supervised Fine-Tuning from Pretrained Model to Assistant

8. 后训练 RLHF/DPO——从助手模型到对齐模型 / RLHF and DPO from Assistant Model to Aligned Model

9. 高效微调——LoRA 和 QLoRA 让大模型走进消费级 GPU / Efficient Fine-Tuning with LoRA and QLoRA on Consumer GPUs

10. 训练工程——千卡集群的管理与故障恢复 / Training Engineering for Thousand-GPU Cluster Operations and Recovery

本页目录

后训练 RLHF/DPO——从助手模型到对齐模型 / RLHF and DPO from Assistant Model to Aligned Model ​

📅 创建时间:2026-06-02 🏷️ 标签:#RLHF #PPO #DPO #Reward-Model #KL散度 #对齐 #PPO- KL 📚 前置知识:[[06-posttraining-sft]](SFT 监督微调) 📚 相关知识:[[05-pretraining]](预训练) [[08-efficient-finetuning]](LoRA)


场景:SFT 后模型仍然有毒有害,RLHF 是解法 ​

┌─────────────────────────────────────────────────────────────┐
│                                                             │
│  你已经完成了 SFT,模型可以正常对话了。                  │
│                                                             │
│  但你发现了一些问题:                                      │
│                                                             │
│  问题 1:有害内容                                        │
│  你:请教我怎么制造炸弹                                  │
│  SFT模型:当然可以!首先,你需要...(详细教程)          │
│  → 模型学会了"如何回答",但不知道"什么不该说"          │
│                                                             │
│  问题 2:回答过于模板化                                  │
│  所有回答都是:"好的,我来帮你...首先...其次...最后..."  │
│  → 模型记住了训练数据中的回复模式                         │
│                                                             │
│  问题 3:不符合人类偏好                                  │
│  用户想要简洁的回答,模型给你写了一大段                  │
│  用户想要幽默的回复,模型一本正经                           │
│  → 模型不知道什么是"好"的回答                           │
│                                                             │
│  SFT 的局限:                                            │
│  → SFT 只能学"正确的回复是什么样的"                     │
│  → 无法表达"我更喜欢这个回复而不是那个"                  │
│                                                             │
│  RLHF(Reinforcement Learning from Human Feedback):        │
│  → 用人类的偏好信号来指导模型生成                         │
│  → 让模型学会"什么是人类喜欢的好回答"                   │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

第1节:RLHF 三步流程——RM → SFT → PPO ​

RLHF 的完整流程 ​

┌─────────────────────────────────────────────────────────────┐
│                 RLHF 三步流程图                                   │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ┌─────────────────────────────────────────────────────┐  │
│  │  Step 1:收集偏好数据(Preference Data Collection)  │  │
│  │                                                     │  │
│  │  给定 prompt: "如何做炸弹"                         │  │
│  │                                                     │  │
│  │  Response A: "详细的炸弹制作教程..."(差)         │  │
│  │  Response B: "抱歉,我不能帮助这个请求..."(好)    │  │
│  │                                                     │  │
│  │  人类标注:A < B(更偏好 B)                        │  │
│  │  → 收集 (prompt, response_A, response_B, preference)  │  │
│  └─────────────────────────────────────────────────────┘  │
│                           ↓                                   │
│  ┌─────────────────────────────────────────────────────┐  │
│  │  Step 2:训练 Reward Model(Reward Model Training)  │  │
│  │                                                     │  │
│  │  用偏好数据训练一个模型 R(x, y) → 分数(好/差)   │  │
│  │                                                     │  │
│  │  目标:R(x, y) 能预测人类偏好                      │  │
│  │  即:如果 y_A 优于 y_B,则 R(x, y_A) > R(x, y_B)   │  │
│  └─────────────────────────────────────────────────────┘  │
│                           ↓                                   │
│  ┌─────────────────────────────────────────────────────┐  │
│  │  Step 3:PPO 微调(PPO Fine-tuning)                │  │
│  │                                                     │  │
│  │  用 Reward Model 作为奖励信号                        │  │
│  │  用 RL(PPO)算法优化 SFT 模型                    │  │
│  │                                                     │  │
│  │  目标:最大化 R(x, y) 的同时,保持不过度偏离 SFT   │  │
│  └─────────────────────────────────────────────────────┘  │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

为什么需要 Reward Model ​

┌─────────────────────────────────────────────────────────────┐
│                 为什么不能直接用人类打分来训练                         │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  直接人类打分的问题:                                       │
│  ┌─────────────────────────────────────────────────────┐  │
│  │  问题 1:标注成本极高                              │  │
│  │  → 每次模型生成都需要人类评估                     │  │
│  │  → 无法规模化                                       │  │
│  │                                                     │  │
│  │  问题 2:标注一致性差                              │  │
│  │  → 不同标注者对同一回答的偏好不同                 │  │
│  │  → 噪声太大,模型难以学习                         │  │
│  │                                                     │  │
│  │  问题 3:无法微分                                  │  │
│  │  → 人类打分不是可微分的 loss function            │  │
│  │  → 无法直接用梯度下降优化                         │  │
│  └─────────────────────────────────────────────────────┘  │
│                                                             │
│  Reward Model 的解决方案:                                  │
│  ┌─────────────────────────────────────────────────────┐  │
│  │  1. 离线收集偏好数据(一次收集,多次使用)          │  │
│  │  2. 训练一个可微分的 Reward Model                │  │
│  │  3. PPO 用 RM 的分数作为 reward signal            │  │
│  │  4. RM 可以复用,每次 PPO 迭代不需要人类参与      │  │
│  └─────────────────────────────────────────────────────┘  │
│                                                             │
│  本质:RM 是"人类偏好的可微分代理"                        │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

Reward Model 的训练方法 ​

┌─────────────────────────────────────────────────────────────┐
│                 Reward Model 的训练:Bradley-Terry 模型              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  偏好数据的格式:                                          │
│  ┌─────────────────────────────────────────────────────┐  │
│  │  (prompt, response_chosen, response_rejected)        │  │
│  │                                                     │  │
│  │  例:                                               │  │
│  │  prompt = "什么是量子计算"                          │  │
│  │  response_chosen = "量子计算是..."(好)          │  │
│  │  response_rejected = "这个很复杂..."(差)         │  │
│  └─────────────────────────────────────────────────────┘  │
│                                                             │
│  Bradley-Terry 模型(标准做法):                          │
│  ┌─────────────────────────────────────────────────────┐  │
│  │  假设:人类偏好服从 logistic 函数                    │  │
│  │                                                     │  │
│  │  P(y_winner > y_loser) = sigmoid(                │  │
│  │      R(x, y_winner) - R(x, y_loser)              │  │
│  │  )                                                  │  │
│  │                                                     │  │
│  │  即:reward 差越大,越可能选择 winner              │  │
│  └─────────────────────────────────────────────────────┘  │
│                                                             │
│  Loss 函数(从 SFT 模型初始化):                         │
│  ┌─────────────────────────────────────────────────────┐  │
│  │  RM = SFT_model + reward_head (随机初始化)          │  │
│  │                                                     │  │
│  │  loss = -E[log σ(r_chosen - r_rejected)]           │  │
│  │                                                     │  │
│  │  即:最大化 chosen 和 rejected 的 reward 差距       │  │
│  └─────────────────────────────────────────────────────┘  │
│                                                             │
│  训练注意:                                                │
│  → 从 SFT 模型初始化 RM(保留语言能力)                   │
│  → Reward head 随机初始化                                  │
│  → 通常训练 1-2 个 epoch(避免过拟合)                    │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

第2节:PPO 算法——RL 优化阶段 ​

PPO 的核心思想 ​

┌─────────────────────────────────────────────────────────────┐
│                 PPO(Proximal Policy Optimization)核心思想           │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  PPO 要解决的问题:                                        │
│  → 在 reward signal 的引导下,,如何更新模型参数?           │
│  → 但不能更新太多(会灾难性遗忘)                          │
│                                                             │
│  核心约束(KL 约束):                                     │
│  ┌─────────────────────────────────────────────────────┐  │
│  │  maximize: E[r(x, y)]                              │  │
│  │  subject to: KL(π_new || π_old) < δ              │  │
│  │                                                     │  │
│  │  翻译:                                            │  │
│  │  → 最大化 reward                                   │  │
│  │  → 但新模型和旧模型的 KL 散度要小于 δ             │  │
│  │  → KL 散度 = 衡量两个分布有多"不同"              │  │
│  │  → δ 控制了每次更新的幅度(通常 δ = 0.01-0.02)  │  │
│  └─────────────────────────────────────────────────────┘  │
│                                                             │
│  为什么不能随意更新:                                      │
│  → 过度优化 reward会导致模型"作弊"(找漏洞)              │
│  → 比如:模型发现"输出 'LOL' 能获得高 reward"            │
│  → 没有 KL 约束,模型会退化成一个输出固定回复的模型       │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

PPO 的完整算法流程 ​

┌─────────────────────────────────────────────────────────────┐
│                 PPO 训练流程详解                                 │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ┌─────────────────────────────────────────────────────┐  │
│  │  输入:SFT 模型(π_SFT),Reward Model(R),Reference 模型(π_ref)  │  │
│  └─────────────────────────────────────────────────────┘  │
│                                                             │
│  ┌─────────────────────────────────────────────────────┐  │
│  │  for each PPO epoch:                               │  │
│  │                                                     │  │
│  │  ┌───────────────────────────────────────────────┐│  │
│  │  │  1. 生成 rollout(用当前策略 π_θ)            ││  │
│  │  │                                               ││  │
│  │  │  for each prompt:                             ││  │
│  │  │      y ~ π_θ(·|prompt)                        ││  │
│  │  │      计算 r = R(prompt, y)                    ││  │
│  │  │      保存 (prompt, y, r)                     ││  │
│  │  │                                               ││  │
│  │  │  收集大量 (prompt, response, reward) tuples  ││  │
│  │  └───────────────────────────────────────────────┘│  │
│  │                                                     │  │
│  │  ┌───────────────────────────────────────────────┐│  │
│  │  │  2. 计算 KL penalty(与 reference 模型的偏离)  ││  │
│  │  │                                               ││  │
│  │  │  r_full = r - β * KL(π_θ(y|prompt) || π_ref(y|prompt))  ││  │
│  │  │                                               ││  │
│  │  │  β = KL penalty 系数(通常 0.01-0.1)        ││  │
│  │  │  β 越大 → 越保守更新,越接近 SFT              ││  │
│  │  └───────────────────────────────────────────────┘│  │
│  │                                                     │  │
│  │  ┌───────────────────────────────────────────────┐│  │
│  │  │  3. PPO 更新(策略梯度优化)                   ││  │
│  │  │                                               ││  │
│  │  │  r_CLIP = clip(r_full, 1-ε, 1+ε)           ││  │
│  │  │  # 限制 reward 的变化幅度,防止过大更新         ││  │
│  │  │                                               ││  │
│  │  │  loss = -min(r_full * ratio, r_CLIP * ratio) ││  │
│  │  │  gradient_descent(loss)                        ││  │
│  │  └───────────────────────────────────────────────┘│  │
│  │                                                     │  │
│  └─────────────────────────────────────────────────────┘  │
│                                                             │
│  关键参数:                                                │
│  → γ (gamma): 折扣因子,通常 1.0(无折扣)                │
│  → ε (epsilon): PPO clip 范围,通常 0.2                   │
│  → β (beta): KL penalty 系数                              │
│  → PPO epochs: 每个 batch 的更新轮数,通常 4               │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

PPO 的实际工程挑战 ​

┌─────────────────────────────────────────────────────────────┐
│                 PPO 的工程挑战与解决方案                            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  挑战 1:Reward Model 的 reward hacking                    │
│  ┌─────────────────────────────────────────────────────┐  │
│  │  问题:RM 不是完美的,模型会找到 RM 的漏洞          │  │
│  │                                                     │  │
│  │  例子:                                            │  │
│  │  → 模型发现回答 "LOL" 能获得高 reward             │  │
│  │  → 模型开始输出无意义的 "LOL"                     │  │
│  │  → RM 给了高分(因为短回复通常质量高?)           │  │
│  │                                                     │  │
│  │  解决:                                            │  │
│  │  → KL penalty 约束更新幅度                        │  │
│  │  → 增加 RM 的对抗样本(让 RM 学到"作弊"的回复是差的)│  │
│  │  → 使用 Reward Model Ensemble(多个 RM 投票)       │  │
│  └─────────────────────────────────────────────────────┘  │
│                                                             │
│  挑战 2:KL penalty 系数的调节                            │
│  ┌─────────────────────────────────────────────────────┐  │
│  │  β 太大:                                          │  │
│  │  → 模型几乎不更新,和 SFT 一样                      │  │
│  │  → 没有学到人类偏好                                 │  │
│  │                                                     │  │
│  │  β 太小:                                          │  │
│  │  → 模型更新过大,可能退化                          │  │
│  │  → reward hacking                                   │  │
│  │                                                     │  │
│  │  实践:动态调节 β                                 │  │
│  │  → 如果 KL 散度 > 目标:减小 β                   │  │
│  │  → 如果 KL 散度 < 目标:增大 β                   │  │
│  └─────────────────────────────────────────────────────┘  │
│                                                             │
│  挑战 3:PPO 的计算成本                                   │
│  ┌─────────────────────────────────────────────────────┐  │
│  │  PPO 需要:                                        │  │
│  │  → Reward Model 前向(所有生成)                   │  │
│  │  → Reference Model 前向(计算 KL)                 │  │
│  │  → Policy Model 前向(生成 + 更新)                │  │
│  │                                                     │  │
│  │  计算量 ≈ 3x SFT                                  │  │
│  │  → 需要专门的工程优化                              │  │
│  └─────────────────────────────────────────────────────┘  │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

第3节:DPO——不需要 PPO 的偏好优化 ​

DPO 的核心思想 ​

┌─────────────────────────────────────────────────────────────┐
│                 DPO(Direct Preference Optimization)核心思想         │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  问题:PPO 训练太复杂了                                   │
│  → 需要单独训练 Reward Model                              │
│  → 需要 Reference Model + Policy Model 两个模型           │
│  → 需要大量超参数调节(β, ε, PPO epochs...)            │
│  → 计算成本高,训练不稳定                                 │
│                                                             │
│  DPO 的洞察:                                             │
│  ┌─────────────────────────────────────────────────────┐  │
│  │  PPO 的目标(KL 约束最大化 reward):              │  │
│  │                                                     │  │
│  │  max_θ E[log π_θ(y|prompt) * exp(R(prompt, y))]  │  │
│  │  subject to: KL(π_θ || π_ref) < δ                 │  │
│  │                                                     │  │
│  │  这个优化问题有解析解!                            │  │
│  │                                                     │  │
│  │  最优策略:                                        │  │
│  │  π_θ*(y|x) ∝ π_ref(y|x) * exp(R(x, y)/β)        │  │
│  │                                                     │  │
│  │  翻译:最优策略 = Reference 策略 × exp(reward)    │  │
│  └─────────────────────────────────────────────────────┘  │
│                                                             │
│  DPO 推导出的 loss(不需要显式 Reward Model):            │
│  ┌─────────────────────────────────────────────────────┐  │
│  │  loss = -E[log σ(                                     │  │
│  │      β * log π_θ(y_w|x) - β * log π_θ(y_l|x)     │  │
│  │      - β * log π_ref(y_w|x) + β * log π_ref(y_l|x) │  │
│  │  )]                                                  │  │
│  │                                                     │  │
│  │  简化后:                                          │  │
│  │  loss = -E[log σ(                                     │  │
│  │      β * (log π_θ(y_w|x) - log π_θ(y_l|x))       │  │
│  │      - β * (log π_ref(y_w|x) - log π_ref(y_l|x))   │  │
│  │  )]                                                  │  │
│  │                                                     │  │
│  │  即:增大 chosen 概率,减小 rejected 概率          │  │
│  │  → 不需要 reward model,不需要 PPO                  │  │
│  └─────────────────────────────────────────────────────┘  │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

DPO vs PPO 对比 ​

┌─────────────────────────────────────────────────────────────┐
│                 DPO vs PPO:全面对比                               │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  │ 维度          │  PPO                              │  DPO              │
│  ├────────────────┼──────────────────────────────────┼───────────────────┤
│  │ 训练流程      │  三步:RM → SFT → PPO          │  一步:DPO 直接优化│
│  ├────────────────┼──────────────────────────────────┼───────────────────┤
│  │ 模型数量      │  4 个(SFT + RM + Ref + Policy)│  2 个(SFT + Policy)│
│  ├────────────────┼──────────────────────────────────┼───────────────────┤
│  │ 需要 RM?     │  需要单独的 RM                   │  不需要            │
│  ├────────────────┼──────────────────────────────────┼───────────────────┤
│  │ 训练稳定性    │  较复杂,可能不稳定              │  相对稳定          │
│  ├────────────────┼──────────────────────────────────┼───────────────────┤
│  │ 超参数        │  多(β, ε, PPO epochs...)     │  少(主要 β)     │
│  ├────────────────┼──────────────────────────────────┼───────────────────┤
│  │ 计算成本      │  高(约 3x SFT)                │  低(约 1.5x SFT)│
│  ├────────────────┼──────────────────────────────────┼───────────────────┤
│  │ 实现难度      │  高(需要 RL 框架)             │  低(就是分类 loss)│
│  ├────────────────┼──────────────────────────────────┼───────────────────┤
│  │ 理论基础      │  RL 理论成熟                    │  较新(2023)     │
│  ├────────────────┼──────────────────────────────────┼───────────────────┤
│  │ 工业应用      │  GPT-4 / Claude 等主流模型       │  Llama 2/3 / Mistral│
│                                                             │
│  关键发现(2023-2024 的经验):                           │
│  → DPO 训练简单,但容易训崩(KL 约束弱)                  │
│  → PPO 更稳定,但需要更多工程投入                         │
│  → 实践中:两者结合使用效果最好                           │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

DPO 的实现 ​

python
# DPO Loss 的 PyTorch 实现(极简)
import torch
import torch.nn.functional as F

def dpo_loss(
    policy_logps_chosen,    # π_θ(y_w|x) 的 log probability
    policy_logps_rejected,  # π_θ(y_l|x) 的 log probability
    ref_logps_chosen,       # π_ref(y_w|x) 的 log probability
    ref_logps_rejected,     # π_ref(y_l|x) 的 log probability
    beta=0.1,               # KL penalty 系数
):
    """
    DPO Loss: 最大化 chosen 和 rejected 的相对概率差异
    """
    # 策略的对数几率差
    policy_logratio = policy_logps_chosen - policy_logps_rejected

    # Reference 的对数几率差(作为 baseline)
    ref_logratio = ref_logps_chosen - ref_logps_rejected

    # DPO loss
    logits = beta * (policy_logratio - ref_logratio)
    loss = -F.logsigmoid(logits).mean()

    return loss

# 训练循环
for batch in dataloader:
    # 提取 chosen 和 rejected 的 log probs
    chosen_logps = model(batch["chosen"]).log_prob(batch["chosen_tokens"])
    rejected_logps = model(batch["rejected"]).log_prob(batch["rejected_tokens"])

    # Reference 模型也要前向
    with torch.no_grad():
        ref_chosen_logps = ref_model(batch["chosen"]).log_prob(batch["chosen_tokens"])
        ref_rejected_logps = ref_model(batch["rejected"]).log_prob(batch["rejected_tokens"])

    loss = dpo_loss(
        chosen_logps, rejected_logps,
        ref_chosen_logps, ref_rejected_logps,
        beta=0.1
    )

    loss.backward()
    optimizer.step()
    optimizer.zero_grad()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

第4节:对齐训练的综合评估 ​

RLHF/DPO 后的质量评估 ​

┌─────────────────────────────────────────────────────────────┐
│                 对齐训练后的质量评估方法                         │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  评估维度:                                                │
│  ┌─────────────────────────────────────────────────────┐  │
│  │  维度 1:Helpfulness(有用性)                      │  │
│  │  → 回答是否满足用户意图                             │  │
│  │  → 是否准确、完整、有帮助                           │  │
│  │                                                     │  │
│  │  维度 2:Harmlessness(安全性)                    │  │
│  │  → 是否拒绝有害请求(炸弹制作、钓鱼等)             │  │
│  │  → 是否不产生有害内容                               │  │
│  │                                                     │  │
│  │  维度 3:Honesty(真实性)                         │  │
│  │  → 是否不知道就说不知道                             │  │
│  │  → 是否不产生幻觉(事实错误)                       │  │
│  └─────────────────────────────────────────────────────┘  │
│                                                             │
│  评估方法:                                                │
│  ┌─────────────────────────────────────────────────────┐  │
│  │  方法 1:人类评估(Gold Standard)                  │  │
│  │  → 人类直接评判回答质量                           │  │
│  │  → 最准确,但成本高、速度慢                       │  │
│  │                                                     │  │
│  │  方法 2:Reward Model 评估                        │  │
│  │  → 用训练好的 RM 打分                             │  │
│  │  → 快,但 RM 有偏差                               │  │
│  │                                                     │  │
│  │  方法 3:GPT-4 评估(LLM-as-Judge)               │  │
│  │  → 用强 LLM 评判回答质量                         │  │
│  │  → 成本低,速度快,和人类有一定相关性              │  │
│  │  → 但 GPT-4 也有自己的偏好                        │  │
│  │                                                     │  │
│  │  方法 4:自动化 Benchmark                          │  │
│  │  → MMLU(知识)、GSM8K(数学)、HumanEval(代码)  │  │
│  │  → 能力指标,但不能反映对齐质量                   │  │
│  └─────────────────────────────────────────────────────┘  │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

对齐训练的常见问题 ​

┌─────────────────────────────────────────────────────────────┐
│                 对齐训练的问题诊断与解决                           │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  问题 1:过度拒绝(Excessive Refusals)                    │
│  ┌─────────────────────────────────────────────────────┐  │
│  │  表现:模型开始拒绝正常的用户请求                    │  │
│  │  "抱歉,这个请求我无法帮助"(用户只是问做菜)        │  │
│  │                                                     │  │
│  │  原因:                                            │  │
│  │  → 安全数据过多,模型学会过度保守                  │  │
│  │  → KL penalty 系数 β 过大                         │  │
│  │                                                     │  │
│  │  解决:                                            │  │
│  │  → 平衡安全数据和普通数据的比例                    │  │
│  │  → 减小 β,增大非安全样本 的 reward 权重          │  │
│  │  → 增加正向样本(模型正常回答的场景)              │  │
│  └─────────────────────────────────────────────────────┘  │
│                                                             │
│  问题 2:谄媚(Sycophancy)                                │
│  ┌─────────────────────────────────────────────────────┐  │
│  │  表现:模型过于讨好用户,放弃自己的立场              │  │
│  │  用户:我认为 X 是对的。模型:是的是的,你完全正确。 │  │
│  │                                                     │  │
│  │  原因:                                            │  │
│  │  → 偏好数据中包含用户说"满意"的样本               │  │
│  │  → 模型学会讨好比坚持更安全                       │  │
│  │                                                     │  │
│  │  解决:                                            │  │
│  │  → 在偏好数据中包含"有原则的回复"                 │  │
│  │  → RM 训练时包含对抗样本                          │  │
│  └─────────────────────────────────────────────────────┘  │
│                                                             │
│  问题 3:能力退化(Capability Regression)                 │
│  ┌─────────────────────────────────────────────────────┐  │
│  │  表现:RLHF 后,数学/代码能力下降                   │  │
│  │                                                     │  │
│  │  原因:                                            │  │
│  │  → RLHF 优化的 reward 和真实能力不完全相关         │  │
│  │  → 模型过度拟合到 reward signal                    │  │
│  │                                                     │  │
│  │  解决:                                            │  │
│  │  → RLHF 后做轻量 SFT(PPO 之后 SFT,通常叫"DPO")│  │
│  │  → 在 benchmark 上监控能力退化                     │  │
│  │  → 使用 Rejection Sampling 选择更好的回复          │  │
│  └─────────────────────────────────────────────────────┘  │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

升华:RLHF 的工程哲学 ​

┌─────────────────────────────────────────────────────────────┐
│              RLHF 的核心工程哲学                                  │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  1. 偏好是主观的,RM 是偏好的代理                           │
│     → 人类偏好因人而异,RM 只能捕捉"平均"偏好             │
│     → RM 的偏差会传递到 PPO/DPO                            │
│     → 好的 RM 是 RLHF 成功的一半                            │
│                                                             │
│  2. KL 约束是对抗 reward hacking 的武器                    │
│     → 没有 KL 约束,模型会"作弊"                          │
│     → KL 系数太大 → 不更新;太小 → 退化                    │
│     → 调节 KL 系数是 RLHF 最重要的超参数                    │
│                                                             │
│  3. DPO 是工程简化,PPO 是理论完备                          │
│     → DPO 降低了工程复杂度,适合快速迭代                    │
│     → PPO 更稳定,适合大规模生产                            │
│     → 实践中根据场景选择                                   │
│                                                             │
│  4. 对齐不是免费的,能力退化是代价                         │
│     → 安全性和能力是一对 trade-off                         │
│     → 需要持续监控 benchmark,防止能力退化                  │
│     → "过度对齐"(跪舔用户)也是问题                       │
│                                                             │
│  一句话总结:                                               │
│  RLHF 让模型从"会回答"进化到"回答得好"。                 │
│  核心挑战是找到人类偏好的可信赖代理(RM)。                │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

"AI 可查 vs 必须理解"清单 ​

AI 可查:
✅ PPO 的数学推导(策略梯度、重要性采样)
✅ 具体 RM 训练的超参数配置
✅ DPO 论文的详细推导

必须理解:
🔴 RLHF 三步流程:偏好数据收集 → Reward Model 训练 → PPO/DPO 微调
🔴 为什么需要 Reward Model(人类打分成本高、不能微分)
🔴 Bradley-Terry 模型:RM 的训练目标
🔴 KL 散度约束在 PPO 中的作用(防止 reward hacking)
🔴 PPO loss 中的 clip 机制(限制更新幅度)
🔴 DPO 的核心洞察:KL 约束下的最优策略有解析解,不需要 PPO
🔴 DPO vs PPO 的 trade-off(工程复杂度 vs 训练稳定性)
🔴 对齐训练的常见问题:过度拒绝、谄媚、能力退化
1
2
3
4
5
6
7
8
9
10
11
12
13
14

学习状态:🟡 开始学习

最后更新于:

Pager
上一篇7. 后训练 SFT——从预训练模型到助手模型 / Supervised Fine-Tuning from Pretrained Model to Assistant
下一篇9. 高效微调——LoRA 和 QLoRA 让大模型走进消费级 GPU / Efficient Fine-Tuning with LoRA and QLoRA on Consumer GPUs

持续记录,持续成长

Copyright © Tidenflow