LLM基础8_使用人类反馈进行微调(RLHF)
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn
为什么需要人类反馈?
适应人类需求。
RLHF 的三大阶段
阶段1:监督微调(SFT)
-
目标:模型生成人类想要的回答
-
方法:人类示范优质回答
-
数据:人工编写的问答对
用户:如何做煎蛋?
人类示范:首先,在平底锅加少许油,中火加热。然后打入鸡蛋...
阶段2:奖励模型训练
训练一个"裁判模型"来评判回答质量:
收集对比数据:
-
给模型同一个问题生成多个回答
-
人类标注哪个回答更好
问题:解释量子纠缠
回答A:量子纠缠是量子力学现象...(专业但晦涩)★
回答B:想象两个心灵感应的粒子...(通俗易懂)★★★
训练奖励模型:
-
输入:问题 + 回答
-
输出:质量评分
-
目标:准确预测人类偏好
关键点:奖励模型学会人类价值观:简洁性、安全性、有用性
阶段3:强化学习微调(PPO)
原始模型->>+奖励模型: 生成回答
奖励模型->>-原始模型: 评分反馈
原始模型->>原始模型: 根据评分调整参数
使用近端策略优化(PPO) 算法:
-
模型生成回答
-
奖励模型打分
-
模型调整策略获得更高分
-
避免偏离原始能力(KL散度约束)
RLHF 的效果
经过RLHF训练的模型:
能力 | 提升效果 |
---|---|
有用性 | 回答更精准解决用户问题 |
诚实性 | 减少"一本正经胡说八道" |
无害性 | 过滤有害/偏见内容 |
风格适配 | 能调整正式/幽默等风格 |
RLHF实战
# 伪代码 - PPO核心训练循环
for epoch in range(num_epochs):# 1. 生成回答responses = model.generate(prompts)# 2. 获取人类/奖励模型评分rewards = reward_model.score(prompts, responses)# 3. 计算原始模型评分(KL约束)with torch.no_grad():old_log_probs = original_model(responses)# 4. PPO优化loss = ppo_loss(current_log_probs, old_log_probs, rewards)optimizer.zero_grad()loss.backward()optimizer.step()