跳转至

微调与对齐(Fine-tuning & Alignment)

预训练后的 Base Model 就像一个"学富五车但不懂交流"的学者——它拥有海量知识,但不会按人类的方式回答问题。微调与对齐的目的就是教会它"好好说话",让它从"文字接龙机器"变成"智能助手"。


训练三阶段全景

graph LR
    A["预训练<br>Base Model<br>(会接龙)"] -->|"SFT"| B["SFT Model<br>(会回答问题)"]
    B -->|"RLHF / DPO"| C["Chat Model<br>(回答得好且安全)"]
    style A fill:#e3f2fd
    style B fill:#fff3e0
    style C fill:#e8f5e9

第一步:监督微调(SFT)

什么是 SFT?

SFT(Supervised Fine-Tuning,监督微调) 是用高质量的"指令-回答"配对数据对 Base Model 进行训练,让它学会按照指令格式回答问题。

SFT 训练数据示例

{
  "instruction": "请用一句话解释什么是光合作用。",
  "output": "光合作用是植物利用阳光、水和二氧化碳合成有机物并释放氧气的过程。"
}

SFT 的核心思路

SFT 在技术上和预训练几乎一样——都是预测下一个 Token。唯一的区别在于:

预训练 SFT
数据格式 纯文本(无结构) 指令-回答对(有结构)
数据规模 万亿 Token 数十万~数百万条
学习率 较大 较小(防止遗忘预训练知识)
训练时长 数周~数月 数小时~数天

SFT 只计算回答部分的损失(Loss),不计算指令部分的。这告诉模型:"我不需要你学会提问,只要你学会回答。"

数据质量的重要性

LIMA 论文的核心发现

仅用 1000 条精选高质量数据 做 SFT,就能训练出比用几万条普通数据更好的模型。数据质量远比数量重要。

高质量 SFT 数据的特征:

  • 指令多样性:覆盖问答、写作、推理、编程、翻译等多种任务
  • 回答质量高:准确、完整、格式规范
  • 风格一致:统一的回答语气和格式

第二步:人类对齐——为什么需要?

经过 SFT 后,模型已经"会回答问题"了,但它可能:

  • 编造事实(幻觉):一本正经地胡说八道
  • 不安全:生成有害、偏见或不当的内容
  • 不符合偏好:回答虽然正确,但啰嗦/生硬/不友好

对齐(Alignment) 的目标就是让模型的输出符合人类的偏好:有帮助(Helpful)、诚实(Honest)、无害(Harmless)——即 3H 原则


RLHF:基于人类反馈的强化学习

RLHF(Reinforcement Learning from Human Feedback) 是 OpenAI 在 InstructGPT/ChatGPT 中使用的核心对齐技术。

完整流程

graph TD
    A["第 1 步:SFT<br>训练初始策略模型"] --> B["第 2 步:训练奖励模型<br>(学习人类偏好)"]
    B --> C["第 3 步:PPO 强化学习<br>(用奖励信号优化策略)"]

第 1 步:训练奖励模型(Reward Model)

奖励模型的作用是给模型的回答打分,代替人类做评判。

训练数据收集:

  1. 给 SFT 模型一个问题,让它生成 多个不同的回答(如 4 个)
  2. 让人类标注员对这些回答进行排序(哪个最好、哪个最差)
  3. 将排序转化为"偏好对"训练数据
问题:"如何做番茄炒蛋?"

回答A(详细步骤,友好语气)   > 排名第 1
回答B(正确但太简略)         > 排名第 2
回答C(包含错误步骤)         > 排名第 3
回答D(完全跑题)             > 排名第 4

训练目标: 让奖励模型学会给好回答高分、给差回答低分。数学上使用 Bradley-Terry 模型

\[\mathcal{L}_{\text{RM}} = -\log \sigma\left(r_\theta(x, y_w) - r_\theta(x, y_l)\right)\]

其中 \(y_w\) 是被偏好的回答,\(y_l\) 是被拒绝的回答,\(r_\theta\) 是奖励模型打的分数。

第 2 步:PPO 强化学习优化

有了奖励模型后,就可以用强化学习(PPO 算法)来优化 LLM:

  • 环境:给模型一个 Prompt
  • 动作:模型生成一个完整的回答
  • 奖励:奖励模型给这个回答打分
\[\mathcal{L}_{\text{PPO}} = \mathbb{E}\left[\min\left(\frac{\pi_\theta(y|x)}{\pi_{\text{old}}(y|x)} A, \text{clip}\left(\frac{\pi_\theta(y|x)}{\pi_{\text{old}}(y|x)}, 1-\epsilon, 1+\epsilon\right) A\right)\right] - \beta \cdot D_{\text{KL}}(\pi_\theta \| \pi_{\text{ref}})\]

其中后面的 KL 散度惩罚项 极为关键——它防止模型为了追求高奖励而偏离 SFT 模型太远(否则模型可能学会"投机取巧"地骗取高分,而非真正提供好回答)。

RLHF 的痛点

  1. 训练极不稳定:PPO 超参数敏感,容易训崩
  2. 流程复杂:需要同时维护 4 个模型(策略模型、参考模型、奖励模型、价值模型)
  3. 奖励模型可能被"黑":LLM 可能找到奖励模型的漏洞,输出"高分但低质"的回答(Reward Hacking)

DPO:直接偏好优化

DPO(Direct Preference Optimization) 是 2023 年提出的一种更简洁的对齐方法,完全绕开了强化学习

核心思想

DPO 证明了一个数学等价关系:RLHF 的优化目标可以被重写为一个简单的分类损失函数,直接在偏好对数据上训练即可。

\[\mathcal{L}_{\text{DPO}} = -\log \sigma\left(\beta \left[\log \frac{\pi_\theta(y_w|x)}{\pi_{\text{ref}}(y_w|x)} - \log \frac{\pi_\theta(y_l|x)}{\pi_{\text{ref}}(y_l|x)}\right]\right)\]

直觉理解 DPO

DPO 的目标很直接:让模型生成好回答 \(y_w\) 的概率变高,生成差回答 \(y_l\) 的概率变低,同时不要偏离参考模型太远。

DPO vs RLHF

对比 RLHF DPO
是否需要奖励模型 需要单独训练 不需要
是否涉及强化学习 是(PPO) 否(纯监督学习)
训练稳定性 不稳定,超参敏感 稳定,易于调参
参与模型数量 4 个(策略、参考、奖励、价值) 2 个(策略、参考)
训练数据 偏好排序 → 奖励模型 → RL 直接用偏好对
效果 业界验证充分 迅速追赶,部分场景持平或超越

DPO 因其简洁高效,已被 LLaMA 3、Qwen 2 等众多模型采用。


其他对齐技术

ORPO(Odds Ratio Preference Optimization)

ORPO 更进一步,将 SFT 和偏好对齐合并为一步。它在 SFT 的损失函数中直接加入偏好优化项,无需单独的对齐阶段。

GRPO(Group Relative Policy Optimization)

DeepSeek 提出的方法,针对数学/代码等有明确正确答案的任务。它不需要人类偏好标注,而是:

  1. 让模型对同一问题生成多个回答
  2. 用规则验证哪些回答正确、哪些错误(如数学题可直接验算)
  3. 正确回答获得正奖励,错误回答获得负奖励

这种方法特别适合推理能力的对齐,DeepSeek-R1 即采用此方案。


参数高效微调(PEFT)

全量微调一个 70B 模型需要上百 GB 显存,成本极高。参数高效微调(Parameter-Efficient Fine-Tuning) 冻结模型的绝大部分参数,只训练极少量的新参数。

LoRA(Low-Rank Adaptation) ⭐ 最主流

LoRA 的核心思想源于一个关键观察:微调时参数的变化量是低秩的——即只影响一个低维子空间。

\[W' = W + \Delta W = W + BA\]

其中 \(W \in \mathbb{R}^{d \times d}\) 是原始的冻结权重矩阵,\(B \in \mathbb{R}^{d \times r}\)\(A \in \mathbb{R}^{r \times d}\) 是两个小矩阵(\(r \ll d\),通常 \(r\) = 8~64)。

参数量对比

以一个 \(4096 \times 4096\) 的权重矩阵为例:

  • 全量微调:训练 \(4096 \times 4096 = 16,777,216\) 个参数
  • LoRA(r=16):训练 \(4096 \times 16 + 16 \times 4096 = 131,072\) 个参数
  • 参数缩减:仅为原来的 0.78%

LoRA 的优点:

  • 内存友好:冻结原始模型,只训练小矩阵,显存需求大幅降低
  • 可组合:针对不同任务训练不同的 LoRA 权重,推理时即插即用
  • 无推理开销:推理前将 \(BA\) 合并到 \(W\) 中,推理速度不受影响

QLoRA

QLoRA = 量化 + LoRA。先将模型量化到 4-bit(显存降为原来的 1/4),再在其上应用 LoRA 微调。

这使得在单块消费级 GPU(如 24GB 的 RTX 4090) 上微调 70B 模型成为可能。

其他 PEFT 方法

方法 核心思想
Prefix Tuning 在每一层的输入前拼接可训练的虚拟 Token
Prompt Tuning 只在输入 Embedding 前加可训练的 Soft Prompt
Adapter 在 Transformer 每层中间插入小型可训练模块

总结:选择哪种微调/对齐方案?

graph TD
    A["我想优化 LLM"] --> B{"有多少计算资源?"}
    B -->|"很多(集群)"| C{"有人类偏好数据?"}
    B -->|"有限(单卡/几卡)"| D["LoRA / QLoRA 微调"]
    C -->|"有"| E{"追求训练稳定性?"}
    C -->|"没有,但有正确答案"| F["GRPO"]
    E -->|"是"| G["DPO"]
    E -->|"要极致效果"| H["RLHF(PPO)"]