【Datawhale学习笔记】RLHF微调技术及实践

RLHF 技术详解

有监督微调(Supervised Fine-tuning, SFT):即用成对的"(指令, 回答)"数据来训练模型

SFT 的局限性:

  • 缺乏泛化能力:模型只能很好地响应数据集中出现过的指令模式,无法覆盖用户千奇百怪的真实意图。
  • "对齐"不足:模型的回答可能在事实上正确,但在风格、语气、安全性或有用性上,并不符合人类的期望。它只知道"正确答案",却不知道"更好的答案"。

SFT 与 RLHF 在核心理念与实现方式上的关键差异

对比维度 监督微调 (SFT) 人类反馈强化学习 (RLHF)
核心目标 模仿正确答案(指令遵循) 对齐人类偏好(有用/无害/诚实)
数据需求 高质量的 (指令, 回答) 对 提示词 (Prompt) + 偏好排序/评分
学习方式 填鸭式教学(拟合分布) 探索式学习(试错与反馈)
优化信号 Token 级预测概率(交叉熵) 整句生成质量评分(标量奖励)
泛化能力 局限于训练数据分布 可泛化到未见过的复杂指令

通往对齐模型的三大阶段

  1. 基础模型预训练
  2. 有监督指令微调
  3. 基于人类反馈的强化学习

RLHF 的形式化定义

在 RLHF 框架中,将 Token 生成过程建模为 "片段的(Episodic)马尔可夫决策过程(MDP)" 是连接 NLP 与 RL 的核心桥梁。这个"片段"特指"从接收用户提示到生成完整输出"的单次生成任务。

  • 状态 (State, s t s_t st):当前已生成的上下文,包括用户提示 x x x 和已生成的 Token 序列 y < t y_{<t} y<t。即 s t = ( x , y 1 , . . . , y t − 1 ) s_t = (x, y_1, ..., y_{t-1}) st=(x,y1,...,yt−1)。
  • 动作 (Action, a t a_t at):模型在当前时间步生成的下一个 Token y t y_t yt。
  • 策略 (Policy, π θ \pi_\theta πθ):即我们的大语言模型。 π ( a t ∣ s t ) \pi(a_t|s_t) π(at∣st) 对应模型在当前上下文下预测下一个 Token 的概率分布。
  • 奖励 (Reward, R R R):通常在整个回答生成完毕(Episode 结束)后,由奖励模型给予一个标量反馈 R ( x , y ) R(x, y) R(x,y)。中间步骤的奖励通常为 0。

在这个定义下,RLHF 的目标就是寻找一个最优策略 π θ \pi_\theta πθ,使得生成的完整序列期望奖励最大化:

max ⁡ π E x ∼ D , y ∼ π ( ⋅ ∣ x ) [ R ( x , y ) ] \max_\pi \mathbb{E}_{x \sim \mathcal{D}, y \sim \pi(\cdot|x)} [R(x, y)] πmaxEx∼D,y∼π(⋅∣x)[R(x,y)]

理解了这一形式化定义,我们就能明白为什么 PPO 等算法可以通过试错(Sampling)和反馈(Reward)来调整模型参数,从而让模型生成的"轨迹"(文本)更符合人类偏好。

RLHF 的核心步骤

  1. 首先通过有监督微调得到初始策略模型;
  2. 收集人类偏好数据训练一个奖励模型;
  3. 使用奖励模型作为信号,通过强化学习算法(如 PPO)进一步优化策略模型。

RLHF三步法示意图

LLaMA-Factory RLHF(DPO)实战

LLaMA-Factory 简介

LLaMA-Factory 是一个简洁高效的大型语言模型(Large Language Model)训练与微调平台,旨在让开发者能够"零代码"地完成大模型的定制化训练。

LLaMA-Factory特点

  • 广泛的模型支持:支持业界主流的开源模型,如 LLaMA、Qwen(通义千问)、Baichuan(百川)、ChatGLM、Mistral、Yi 等。
  • 全流程覆盖:涵盖了从 预训练(Pre-Training)、指令监督微调(SFT) 到 RLHF(包含奖励模型建模、PPO、DPO、KTO、ORPO 等)的完整训练阶段。
  • 高效的微调技术:内置了 LoRA、QLoRA、DoRA、GaLore 等多种参数高效微调(PEFT)方法,大幅降低了显存需求。
  • 易用的交互界面:提供名为 LLaMA-Board 的 Web UI 界面,通过可视化操作即可配置训练参数、监控训练进度以及进行模型对话测试。
  • 硬件友好:支持 DeepSpeed、FlashAttention 等加速技术,并支持 4-bit/8-bit 量化训练,使得普通消费级显卡也能运行大模型训练。

环境搭建

bash 复制代码
conda create -n peft python=3.11 -y
git clone https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory

# 激活环境
conda activate peft

# 安装依赖
pip install -e .[metrics]

# 验证安装
llamafactory-cli version

输出结果

复制代码
----------------------------------------------------------
| Welcome to LLaMA Factory, version 0.9.5.dev0           |
|                                                        |
| Project page: https://github.com/hiyouga/LLaMA-Factory |
----------------------------------------------------------

启动 Web UI 界面

bash 复制代码
llamafactory-cli webui

启动后的输出

复制代码
Visit http://ip:port for Web UI, e.g., http://127.0.0.1:7860
* Running on local URL:  http://0.0.0.0:7860
* To create a public link, set `share=True` in `launch()`.

访问http://localhost:7860.主界面如下:

DPO 训练准备

配置模型

下拉框中选择Qwen2.5-0.5B-Instruct(聊天 / 指令版本)并设置下载源。默认为 Hugging Face,如果遇到网络问题,可以切换为 ModelScopeOpenMind 进行下载

配置微调参数

微调方法 :保持默认的 lora。
量化配置:对于显存较小的设备,可以选择将 Quantization bit 设置为 8 或 4,启用量化训练(QLoRA)。如果显存充足或希望获得更好的效果,可以保持默认(不量化)。

配置其他参数:

Quantization method : 量化方法,默认为 bnb(bitsandbytes)。
Chat template : 对话模板。

对于 Base 模型,可选择 default, alpaca, vicuna 等。

对于 Instruct/Chat 模型,务必选择对应的模板(例如 Qwen 系列选择 qwen)。

训练和推理时必须使用相同的模板。
RoPE scaling : 旋转位置编码缩放,用于扩展上下文长度。
Booster: 加速库,默认 auto 即可,它会自动选择最适合的加速后端(如 FlashAttention)。

配置数据集

训练阶段 下拉菜单中选择 DPO。接着,在"数据集"一栏中,选择需要的训练数据。我们将使用 LLaMA-Factory 自带的 DPO 演示数据集 dpo_zh_demo。这个数据集包含了偏好对比(chosen vs rejected)的数据对。选中数据集后,可以点击右上角的 Preview dataset 按钮预览数据格式,确认数据无误。

启动 DPO 训练

关键参数说明

  • Learning rate: 1e-4 (学习率)
  • Epochs: 3.0 (训练轮数)
  • Compute type: bf16
  • Cutoff length: 2048
  • Batch size: 1 (取决于显存)
  • Gradient accumulation: 16 (建议 Batch size × Gradient accumulation ≈ 16 或 32)
  • LoRA rank: 8 (LoRA 的秩,决定微调参数量,8 是默认配置)
  • LoRA alpha: 16 (缩放系数,默认设置为 Rank 的 2 倍)

启动训练

设置好输出目录后,可以点击 Preview command 预览训练命令,确认无误后直接点击 Start 开始训练

训练命令

bash 复制代码
llamafactory-cli train \
    --stage dpo \
    --do_train True \
    --model_name_or_path Qwen/Qwen2-0.5B-Instruct \
    --preprocessing_num_workers 16 \
    --finetuning_type lora \
    --template qwen \
    --flash_attn auto \
    --dataset_dir data \
    --dataset dpo_zh_demo \
    --cutoff_len 2048 \
    --learning_rate 0.0001 \
    --num_train_epochs 3.0 \
    --max_samples 100000 \
    --per_device_train_batch_size 2 \
    --gradient_accumulation_steps 8 \
    --lr_scheduler_type cosine \
    --max_grad_norm 1.0 \
    --logging_steps 5 \
    --save_steps 100 \
    --warmup_steps 0 \
    --packing False \
    --enable_thinking True \
    --report_to none \
    --output_dir saves/Qwen2-0.5B-Instruct/lora/Qwen2.5-0.5B-dpo-demo \
    --bf16 True \
    --plot_loss True \
    --trust_remote_code True \
    --ddp_timeout 180000000 \
    --include_num_input_tokens_seen True \
    --optim adamw_torch \
    --lora_rank 8 \
    --lora_alpha 16 \
    --lora_dropout 0 \
    --lora_target all \
    --pref_beta 0.1 \
    --pref_ftx 0 \
    --pref_loss sigmoid 

训练过程的loss曲线

效果测试与对比

加载模型进行对话

切换到 Chat 栏。在训练开始前,我们可以先不选择任何 Adapter,直接点击 Load model 加载原始的 Qwen2.5-0.5B-Instruct 模型,测试一下未训练时的模型表现

测试配置

System prompt:

复制代码
您是一名AI助手。用户会给您一个任务。您的目标是尽量忠实地完成任务。在执行任务时,要逐步思考并合理地解释您的步骤。

input

复制代码
体重增加是一个复杂的问题。但毫无疑问,西方国家当前的食物环境------大量含有高度加工的咸、甜和油脂食品------起着重要作用。我们饮食中摄入的大部分盐都是在制造过程中添加的。这与大多数食物中天然存在的少量盐或在餐桌上或在家里烹饪时添加的盐形成对比。盐可以增加食物的可口性,帮助保鲜;这就是为什么它通常被添加到加工食品中。盐和脂肪的结合被认为是促进食物被 passively 过量消费的强大组合。想想看,咸薯片有多令人回味。对咸和油脂食物更喜欢与整体摄入更多千焦耳、不受控制的饮食和儿童超重有关。食物过量摄入与其盐度程度之间的联系被认为比对甜和油脂食物的喜好更强。从进一步揭示盐可能如何影响对油脂食物的过量摄入,Deakin 大学的感官研究人员招募了 48 名健康成年人参加品尝小组。在四个午餐时间段(在那天早上进行了标准早餐后),每个人都吃了一顿经过脂肪和盐含量调整的通心粉奶酪餐。四种餐食组合分别是低脂/低盐、低脂/高盐、高脂/低盐和高脂/高盐。鼓励参与者吃到饱为止。还记录了进食速度、餐食的可口性以及主观评价的饥饿感和饱腹感。盐促进过量进食当食用含盐量高的餐食时,摄入的千焦耳增加了 11%。而这与脂肪含量高低无关。餐食的脂肪含量并没有导致人们按重量摄入更多食物,但由于其更高的能量密度,这意味着摄入了更多千焦耳。问题:那些习惯于喜欢高热量密度饮食的人可能经常食用高盐食品吗?=== 上述问题的答案是 可选项: (1). 一周以上。 (2). 大多数时候通心粉奶酪被提供时。 (3). 没有足够的信息 (4). 通常在午餐时间。 答案:

输出结果

复制代码
(3). 没有足够的信息

验证 DPO 效果

需要选择 Checkpoint path 为我们刚刚训练好的 Adapter(位于 saves/Qwen2.5-0.5B-Instruct/lora/Qwen2.5-0.5B-dpo-demo),然后再次点击 Load model 加载混合了 DPO 权重的模型

输出答案

复制代码
(4). 通常在午餐时间。

这就是 RLHF 的价值------不仅仅是让模型"做对题",更是让模型学会人类偏好的交互风格。通过 dpo_zh_demo 数据集的训练,模型初步对齐了数据集中这种"诚实且严谨"的偏好风格。

参考资料

https://github.com/datawhalechina/base-llm

相关推荐
NAGNIP10 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
冬奇Lab11 小时前
一天一个开源项目(第36篇):EverMemOS - 跨 LLM 与平台的长时记忆 OS,让 Agent 会记忆更会推理
人工智能·开源·资讯
冬奇Lab11 小时前
OpenClaw 源码深度解析(一):Gateway——为什么需要一个"中枢"
人工智能·开源·源码阅读
AngelPP15 小时前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年15 小时前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼15 小时前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS15 小时前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区16 小时前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈16 小时前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang17 小时前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx