核心目标

预训练好的大语言模型(LLM)如同一个知识渊博但未经世事的通才,拥有广博的世界知识,但要让它在特定领域(如医疗、法律)或特定任务(如代码生成、客服对话)上表现出色,就需要进行“微调”。本模块将带你深入掌握主流的大模型微调技术,学完后你将能够:

  • 深刻理解为什么需要对大模型进行微调,以及微调的核心思想。
  • 掌握参数高效微调(PEFT) 的概念,并能清晰地解释其相比于全量微调的革命性优势。
  • 深入理解LoRA (Low-Rank Adaptation) 的数学原理和工程实现,并能通过代码对一个LLM进行LoRA微调。
  • 系统地了解RLHF(基于人类反馈的强化学习) 的三阶段流程,理解它是如何让模型(如ChatGPT)学会与人类价值观对齐,变得“有用、诚实、无害”的。

5.1 为什么需要微调?

详细文字讲解

想象一下,一个预训练好的LLM就像一个刚毕业的、智商超群的大学生,他阅读了互联网上几乎所有的公开文本,知识渊博,但对于任何一个具体公司的内部“行话”、特定工作流程和企业文化都一无所知。微调,就是让他进入某个公司进行一次高效的“岗前培训”,使其迅速成为能够胜任特定岗位的专家。

微调的核心目的:

  1. 知识注入 (Knowledge Infusion):向模型传授在预训练数据中覆盖不足或不存在的特定领域知识。例如,让模型学习一家公司的内部知识库、产品文档,使其能回答关于该公司产品的专业问题。
  2. 技能适配 (Skill Adaptation):让模型掌握并精通某种特定的任务能力。例如,训练模型专门用于生成符合特定代码规范的Python代码、进行高度格式化的法律文书摘要,或者扮演一个具有特定性格和说话风格的客服角色。
  3. 风格与格式对齐 (Style and Format Alignment):让模型的输出风格和格式严格符合特定要求。例如,要求模型在任何情况下都必须以JSON格式回答,或者在对话中始终保持一种极其正式、专业的“人设”。

微调方法的两大流派:全量微调 vs. 参数高效微调

  • 全量微调 (Full Fine-Tuning, FFT)

    • 做法:在特定任务的数据集上,更新模型所有的参数(对于7B模型,就是70亿个参数)。这是最直接、最传统的方法。
    • 优点:理论上效果的上限最高,因为整个模型的所有知识和能力都为新任务做了最彻底的调整。
    • 缺点:在LLM时代,其缺点是致命的。
      • 计算成本极高:需要非常强大的GPU集群(如多台A100/H100),训练时间和电力消耗都非常昂贵,非普通企业和个人所能承受。
      • 存储成本灾难:每微调一个新任务,就需要存储一份完整的、与原始模型一样大的模型副本(例如,一个7B模型需要约14GB存储)。如果有100个任务,就需要1.4TB的存储空间。
      • 灾难性遗忘 (Catastrophic Forgetting):在全力学习新知识时,模型可能会严重损害甚至忘记它在预训练阶段学到的通用知识,导致其在其他任务上的表现急剧下降。
  • 参数高效微调 (Parameter-Efficient Fine-Tuning, PEFT)

    • 核心思想冻结(Freeze) 原始LLM绝大部分(如99.9%)的参数,只引入或修改一小部分(通常<1%)的“可训练”参数来适配新任务。
    • 优点:完美地解决了全量微调的痛点。
      • 计算成本极低:训练所需的显存和计算量大幅降低,使得在单张消费级GPU(如RTX 3090/4090)上微调7B甚至更大的模型成为可能。
      • 存储成本极低:对于每个新任务,只需要存储那一小部分被修改的参数(称为“适配器”),通常只有几MB到几十MB,实现了“一个基础模型+多个轻量适配器”的部署模式。
      • 有效缓解灾难性遗忘:由于原始模型的主体被冻结,其强大的通用语言能力和世界知识得以最大程度地保留。
    • 代表方法LoRA, Prefix-Tuning, P-Tuning, Adapter Tuning等。其中,LoRA因其效果好、易于实现和无推理延迟的特点,已成为事实上的行业标准。

由于其巨大的优势,PEFT已成为当前LLM微调的绝对主流范式。

本节总结

  • 微调是激发LLM在特定场景潜能的关键步骤。
  • 全量微调效果好但成本高昂,不适合大规模应用。
  • PEFT通过冻结大部分参数、只训练一小部分的方式,实现了低成本、高效率的微调,是当前的主流技术路线。

5.2 PEFT核心技术:LoRA原理解析

详细文字讲解

LoRA (Low-Rank Adaptation) 是目前最流行、最有效的PEFT方法之一。它的核心思想基于一个深刻的数学洞察,实现方式却异常简单和巧妙。

核心洞察

由微软的研究者发现,虽然大语言模型的参数量巨大,但在微调过程中,参数的变化量矩阵(即 ΔW = W_finetuned - W_pretrained)具有**“低内在秩”(Low Intrinsic Rank)** 的特性。通俗地讲,这意味着这个代表了模型为适应新任务所做“调整”的巨大矩阵,其包含的“有效信息”并不多,可以用两个小得多的矩阵相乘来高度近似地表示。即 ΔW ≈ B * A

LoRA的具体做法

  1. 冻结原始权重:对于模型中的一个大权重矩阵 W (例如,Transformer中的查询Q或值V的投影矩阵,维度是 d x k),我们将其完全固定,不参与任何梯度更新。

  2. 引入可训练的低秩“旁路”:我们在 W 旁边增加两个小的、随机初始化的、可训练的矩阵:

    • 矩阵 A,维度是 r x k
    • 矩阵 B,维度是 d x r
      这里的 r 就是“秩”(Rank),是一个远小于 dk 的关键超参数(例如,r 可以是8, 16, 32, 64)。
  3. 修改前向传播

    • 在模型的前向传播中,输入 x 经过原始权重 W 的计算结果是 h = Wx
    • 同时,x 也流经这个新的旁路,计算结果是 Δh = B(Ax)。注意,这里通常还会用一个缩放因子 alpha/r 来乘以 Δh
    • 最终的输出是两者的和:h_final = h + Δh = Wx + (alpha/r) * B(Ax) = (W + (alpha/r) * BA)x
  4. 高效的训练过程:在微调时,我们只更新矩阵 AB 的参数,而巨大的 W 始终保持不变。这就实现了“参数高效”。

LoRA的魔力所在

  • 参数量急剧减少:我们不需要更新巨大的 W (参数量 d*k),只需要更新 AB (总参数量 d*r + r*k = r*(d+k))。由于 r 很小,可训练参数量通常只有原始的0.1%甚至更少。
  • 推理时无额外延迟:这是LoRA最优雅的一点。在微调完成后,我们可以将学习到的旁路权重 BA 无损地合并回原始的 W 中,即 W_merged = W + (alpha/r) * BA。然后,在部署推理时,我们只需要加载这个合并后的 W_merged 即可,模型的结构和原始模型完全一样,没有任何额外的计算层或操作。因此,LoRA微调后的模型与原始模型相比,推理速度完全没有变慢
LoRA原理图(精细版)
graph TD
    subgraph sLoRA[LoRA 微调过程 - Training]
        direction LR
        X[输入 x] --> W_frozen[原始权重 W d x k 冻结]
        W_frozen --> Add[+]
        
        X --> A[小矩阵 A r x k 可训练]
        A --> B[小矩阵 B d x r 可训练]
        B -- 矩阵乘法 --> Delta_W[DeltaW ~= BA]
        Delta_W --> Scale[乘以缩放因子 alpha/r]
        Scale --> Add
        
        Add --> H_final[最终输出 h']

        style W_frozen fill:#eee,stroke:#333,stroke-dasharray: 5 5
        style A fill:#ccf,stroke:#333
        style B fill:#ccf,stroke:#333
    end

    subgraph sInfer[推理部署 - Inference]
        direction LR
        W_orig[原始权重 W] --> Merge_Add[+]
        Learned_Delta[学习到的 BA] --> Merge_Add
        Merge_Add --> W_merged[合并后权重 W' = W + BA]
        X_deploy[输入 x] --> W_merged
        W_merged --> H_final_deploy[最终输出 h']
    end

Python代码示例 (使用Hugging Face peft库)

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import get_peft_model, LoraConfig, TaskType

# 1. 加载预训练模型和分词器
# 为了方便运行,我们使用一个较小的模型
model_name = "gpt2"
tokenizer = AutoTokenizer.from_pretrained(model_name)
# 确保模型在CPU上加载,如果有多GPU环境可改为device_map="auto"
model = AutoModelForCausalLM.from_pretrained(model_name, device_map="cpu")

# 打印原始模型信息
print("原始模型参数量:")
model.get_memory_footprint()

# 2. 定义LoRA配置 (LoraConfig)
# 这是配置LoRA微调的关键
lora_config = LoraConfig(
    r=16,  # 低秩矩阵的秩,可以调整的关键超参数,r越大,适配能力越强,但参数也越多
    lora_alpha=32, # LoRA的缩放因子alpha,通常设为r的两倍
    target_modules=["c_attn"], # 指定要应用LoRA的模块。在GPT-2中,注意力权重在'c_attn'中。可以设为["q_proj", "v_proj"]用于Llama等模型
    lora_dropout=0.05, # 在LoRA层上应用的dropout
    bias="none", # 是否训练偏置项,'none'表示不训练
    task_type=TaskType.CAUSAL_LM # 任务类型,对于GPT-2这类模型是因果语言模型
)

# 3. 将LoRA适配器应用到模型上
peft_model = get_peft_model(model, lora_config)

# 4. 打印可训练参数和总参数的对比
print("\n应用LoRA后:")
peft_model.print_trainable_parameters()

# 现在,peft_model就可以像普通Hugging Face模型一样进行训练了
# 在训练时,只有标记为'trainable'的LoRA参数(矩阵A和B)会被更新
# ... training code using Hugging Face Trainer or custom loop ...

# 示例:如何保存和加载LoRA适配器
# 训练完成后,只保存轻量的适配器权重
# peft_model.save_pretrained("./my-lora-adapter")

# 加载时,先加载基础模型,再加载适配器
# from peft import PeftModel
# base_model = AutoModelForCausalLM.from_pretrained(model_name)
# lora_model = PeftModel.from_pretrained(base_model, "./my-lora-adapter")

本节总结

  • LoRA的核心是低秩近似,它假设模型微调的变化量是低秩的。
  • 它通过在原权重旁增加可训练的低秩矩阵A和B来实现参数高效微调。
  • LoRA的最大优势是无额外的推理延迟,因为学习到的权重可以合并回原模型。
  • Hugging Face的peft库使得在代码中应用LoRA变得极其简单。

5.3 对齐技术:RLHF

详细文字讲解

即使经过了SFT(监督微调),模型学会了知识和技能,但它的行为可能仍然不符合人类的复杂期望。例如,它可能会生成有害的、不真实的、逻辑混乱或无用的内容。对齐(Alignment) 的目标就是让模型的价值观和行为方式与人类的普适价值观对齐,使其遵循HHH原则:有用的(Helpful)、诚实的(Honest)、无害的(Harmless)

RLHF (Reinforcement Learning from Human Feedback) 是实现对齐最核心、最强大的技术,也是ChatGPT、Claude等顶尖模型成功的关键秘诀。它巧妙地将人的主观偏好转化为可优化的数学信号,通过强化学习来“塑造”模型的行为。

RLHF的流程通常分为三个环环相扣的阶段:

阶段一:监督微调 (Supervised Fine-Tuning, SFT)
  • 目标:为模型注入基础的指令遵循能力,让它初步学会如何以对话或指令驱动的方式回应用户。
  • 做法
    1. 雇佣高质量的人类标注员,精心撰写一批高质量的“指令-回答”对(Prompt-Response Pairs)。这些数据的质量至关重要。
    2. 使用这些数据对预训练好的LLM进行常规的监督微调(可以使用全量微调或PEFT)。
  • 结果:得到一个SFT基础模型。它已经具备了基本的对话和指令遵循能力,但回答的质量、安全性和可靠性还不稳定,可以看作是一个“毛坯房”。
阶段二:训练奖励模型 (Reward Model, RM)
  • 目标:训练一个“品味裁判”模型,它能够模拟人类的偏好,判断哪个回答更好。
  • 做法
    1. 使用第一阶段的SFT模型,对同一个指令(Prompt)生成多个(通常是4到9个)不同的回答。
    2. 让人类标注员对这些回答进行排序,而不是打分。例如,对于回答A, B, C, D,标注员给出 A > C > B > D 的排序,代表A最好,D最差。
    3. 将排序结果转化为成对的比较数据。例如,A > C 构成一个数据点 (prompt, chosen=A, rejected=C)
    4. RM模型通常基于SFT模型(或另一个预训练模型)的架构,但其头部被替换为一个线性层,只输出一个标量值(Scalar),代表对输入的“喜爱程度”得分。
    5. 使用这些成对比较数据来训练RM。其目标是让“被选择”的回答的得分高于“被拒绝”的回答的得分,即 RM(prompt, chosen) > RM(prompt, rejected)
  • 结果:得到一个奖励模型。它可以为任何一个“指令-回答”对打分,分数越高,代表越符合人类偏好。
阶段三:基于强化学习的策略优化 (RL Optimization with PPO)
  • 目标:使用奖励模型作为指导,通过强化学习进一步优化SFT模型,使其生成能够获得更高奖励分数的回答。
  • 核心组件
    • 策略(Policy):这就是我们要优化的SFT模型。它在RL环境中扮演“智能体(Agent)”的角色。
    • 动作空间(Action Space):模型可以生成的整个词汇表。
    • 环境(Environment):当策略(SFT模型)接收到一个指令(Prompt)并生成一个回答时,环境就形成了。
    • 奖励函数(Reward Function):由第二阶段训练好的奖励模型(RM) 给出。当SFT模型生成一个回答后,RM会为其打分,这个分数就是奖励信号。
  • PPO算法 (Proximal Policy Optimization)
    1. 从一个数据集中随机抽取一个指令(Prompt)。
    2. 策略(SFT模型) 根据这个Prompt生成一个回答(Response)。
    3. 奖励模型(RM) 为这个 (Prompt, Response) 对打分,得到一个奖励值 r
    4. 这个奖励值 r 被用来计算一个目标函数,并更新策略(SFT模型) 的参数。PPO算法的核心是确保每次更新不会让策略偏离其原始版本太远,这通过引入一个KL散度惩罚项来实现。这个惩罚项计算当前策略和原始SFT模型输出分布的差异,防止模型为了追求高奖励而“胡言乱语”,忘记了在SFT阶段学到的语言能力。
    5. 重复以上步骤,不断迭代优化策略模型。
  • 结果:得到一个最终的、与人类偏好对齐的LLM
RLHF全流程图解
graph TD
    subgraph sP1[Phase 1 - Supervised Fine-Tuning SFT]
        direction TB
        P1_Data[高质量指令-回答数据] --> P1_LLM[预训练LLM]
        P1_LLM --> P1_SFT[SFT模型 - 初步对齐]
    end

    subgraph sP2[Phase 2 - Reward Model RM Training]
        direction TB
        P2_Prompt[Prompt] --> P1_SFT
        P1_SFT --> P2_Gen[生成多个回答 A,B,C,D]
        P2_Gen --> P2_Human[人类标注员排序 A>C>B>D]
        P2_Human --> P2_Data[偏好数据 A,C; A,B; ...]
        P2_Data --> P2_RM_Train[训练奖励模型]
        P2_RM_Train --> P2_RM[奖励模型 - 学会人类偏好]
    end

    subgraph sP3[Phase 3 - RL Optimization PPO]
        direction TB
        P3_Prompt[Prompt] --> P3_Policy[策略 - SFT模型]
        P3_Policy -- 生成回答 --> P3_Response[Response]
        P3_Response -- 打分 --> P2_RM
        P2_RM -- 奖励信号 r --> P3_Update[PPO算法更新策略]
        P3_Update --> P3_Policy
        P3_Policy -- KL散度惩罚 --> P1_SFT_Ref[SFT模型 - 参考]
    end

    P1_SFT --> P2_Prompt
    P1_SFT --> P3_Policy
    P1_SFT --> P3_Update
    P2_RM --> P3_Response

    style P1_SFT fill:#ccf,stroke:#333
    style P2_RM fill:#cfc,stroke:#333
    style P3_Policy fill:#fcc,stroke:#333

RLHF之后:DPO

RLHF虽然效果强大,但其三阶段流程非常复杂、不稳定且难以复现。近年来,一种更简单、更高效的对齐技术DPO (Direct Preference Optimization) 横空出世,并迅速成为新的SOTA(State-of-the-Art)方法。

  • 核心思想:DPO巧妙地证明了,RLHF中通过强化学习最大化奖励的整个过程,等价于一个简单的分类问题。它直接使用人类的偏好数据(chosen vs rejected),通过一个新的损失函数,直接在SFT模型上进行微调,而完全不需要训练一个独立的奖励模型,也不需要复杂的强化学习过程
  • 优势
    • 流程简单:将三阶段的RLHF简化为单阶段的微调。
    • 训练稳定:避免了RL训练中的超参数敏感和不稳定性问题。
    • 效果更优:在多个基准测试上,DPO的效果通常优于或持平于复杂的RLHF方法。

由于其简单和高效,DPO正在迅速取代RLHF,成为LLM对齐技术的新范式。

本节总结

  • 对齐是让模型变得有用、诚实、无害的关键过程。
  • RLHF是经典的对齐技术,通过SFT、奖励建模、RL优化三阶段实现。
  • RLHF的核心是将人类偏好通过奖励模型转化为可优化的奖励信号
  • DPO作为RLHF的简化和改进版,因其简单、稳定、高效而成为当前对齐技术的新主流。
    2. 让人类标注员对这些回答进行排序。例如,对于回答A, B, C, D,标注员可能给出 D > B > A > C 的排序。排序比直接打分更符合人类的判断习惯,也更容易达成共识
    3. 收集成千上万条这样的排序数据,形成一个人类偏好数据集
    4. 基于这些排序数据,训练一个奖励模型(RM)。RM的结构通常与SFT模型类似,但最后输出的是一个标量分数(Reward),代表这个“指令+回答”对的“好坏”程度。训练的目标是让RM给出的分数与人类的排序尽可能保持一致(即 RM(Prompt, D) > RM(Prompt, B) > RM(Prompt, A) > RM(Prompt, C))。
  • 结果:得到一个奖励模型,它学会了人类的价值观和偏好,可以作为后续强化学习的“代理裁判”。
阶段三:基于PPO的强化学习微调 (Reinforcement Learning via PPO)
  • 目标:利用奖励模型作为实时的、自动化的反馈信号,进一步优化SFT模型,使其生成能获得更高奖励(即更符合人类偏好)的回答。
  • 做法
    1. 将第一阶段的SFT模型作为强化学习中的策略(Policy),第二阶段的奖励模型作为环境(Environment) 的一部分。
    2. 使用一种先进的强化学习算法——PPO (Proximal Policy Optimization) 进行在线训练。
    3. 核心循环
      a. 从一个无标签的指令数据集中随机采样一个Prompt。
      b. 当前的策略模型(初始为SFT模型)根据Prompt生成一个回答。
      c. 奖励模型(RM)为这个生成的“Prompt+回答”对打分,得到一个Reward
      d. 这个Reward被用来计算PPO的优势函数,并形成一个梯度信号,用于更新策略模型的参数
  • KL散度惩罚:这是PPO步骤中的一个关键细节。在优化目标中,会加入一个KL散度惩罚项,用来衡量当前策略模型与原始SFT模型的“距离”。这个惩罚项的作用是防止优化后的模型为了追求高奖励而“走火入魔”,从而忘记了预训练和SFT阶段学到的语言能力和通用知识,确保了模型的稳定性和泛化能力。
RLHF流程图(精细版)
阶段三 - PPO强化学习
阶段二 - 训练奖励模型 RM
阶段一 - 监督微调 SFT
微调
学习人类偏好
生成
评估
输出Reward
计算梯度更新
KL散度约束
迭代优化
SFT模型作为初始策略
Prompt
回答C
PPO算法
Prompt
回答A
回答B
人类偏好数据
奖励模型RM
训练好的RM
预训练LLM
高质量指令-回答数据
SFT基础模型
对齐后的最终模型

本节总结

  • RLHF是让LLM与人类价值观对齐的关键技术,遵循SFT -> RM -> RL三部曲。
  • SFT阶段为模型提供基础的指令遵循能力。
  • RM阶段通过学习人类的排序偏好,训练出一个“品味裁判”。
  • RL阶段使用PPO算法和RM的奖励信号,对模型进行精细“雕琢”,并用KL散度防止其“跑偏”。

模块总结

本模块聚焦于如何“驯服”和“定制”强大的预训练LLM,让它们从一个“通才”转变为能够满足我们特定需求的“专家”。

  • 我们理解了微调的必要性,它能为模型注入领域知识、适配特定技能和对齐输出风格,是释放LLM潜力的必经之路。
  • 我们清晰地区分了全量微调参数高效微调(PEFT),并明确了PEFT因其在计算和存储成本上的巨大优势,已成为当前LLM应用的主流范式。
  • 我们深入剖析了PEFT中的明星技术——LoRA,理解了其通过低秩近似来大幅减少可训练参数的巧妙数学原理,并通过代码示例了解了其在Hugging Face生态中的简便应用。
  • 我们系统地学习了使ChatGPT成功的核心技术——RLHF的三个核心阶段:SFT、奖励模型训练和PPO强化学习。理解了这一复杂而优雅的流程是如何通过引入人类反馈,将模型的行为与人类的价值观和偏好对齐,从而创造出强大且有用的AI助手。

掌握了微调技术,我们就拥有了将通用大模型转化为领域专家的“点金术”。在下一个模块,我们将把所有学到的知识融会贯通,从数据准备到模型训练再到部署,完成一个完整的端到端实战项目。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐