LLM 微调全景:LoRA、QLoRA、RLHF 与 DPO 的选择
为什么要微调大语言模型
大语言模型虽然在通用任务上表现出色,但落地到具体场景时常常力不从心。微调的核心目标有三个:领域适配(让模型理解医疗、法律、金融等专业术语和知识)、风格对齐(使输出的语气、格式符合企业或产品规范)、任务特化(在分类、抽取、代码生成等特定任务上达到生产级准确率)。没有微调,通用模型在垂直场景的可用性往往大打折扣。
全量微调 vs 参数高效微调
全量微调(Full Fine-Tuning)会更新模型全部参数,效果上限高,但代价同样高昂。以 LLaMA-2 70B 为例,全量微调需要 8 张 A100(80G)起步。这对于大多数团队来说不现实。参数高效微调(PEFT,Parameter-Efficient Fine-Tuning)的思路是冻结预训练权重,仅训练少量新增或选定的参数。PEFT 不仅将显存需求降低 1-2 个数量级,还天然避免了灾难性遗忘问题,并且产生的适配器文件通常只有几 MB 到几十 MB,便于分发和版本管理。
LoRA:低秩适应的核心原理
LoRA(Low-Rank Adaptation)是当前应用最广泛的 PEFT 方法。它的核心思想基于一个经验发现:模型在下游任务适配时,权重矩阵的更新量 ΔW 通常是低秩的。因此可以将 ΔW 分解为两个小矩阵 A 和 B 的乘积(ΔW = BA),其中 B 的维度为 d×r,A 为 r×k,秩 r 远小于原始维度。训练时只更新 A 和 B,推理时将 BA 合并回原权重,不增加任何推理延迟。
几个关键参数需要理解:秩 r 决定了可训练参数的数量,一般取 8、16、32、64,r 越大表达能力越强但显存消耗也增加,实践中 r=16 通常是一个性价比较高的起点。Alpha 缩放因子控制适配器对原始输出的影响强度,实际有效学习率正比于 alpha/r。目标模块(target modules)指定对哪些层的权重矩阵施加 LoRA,常见选择是全部线性层的 Q、K、V、O 投影矩阵,有时也包含 MLP 层。只对 Q 和 V 施加 LoRA 是一种常见的简化策略,能在效果和效率间取得平衡。
QLoRA:量化遇上低秩适应
QLoRA 将模型量化技术与 LoRA 结合,进一步压缩显存开销。其核心技术栈包括:NF4(NormalFloat4),一种针对正态分布权重量身定制的 4-bit 量化格式,比传统的 INT4 更贴合 LLM 权重的实际分布;双重量化(Double Quantization),对量化常数本身再做一次量化,进一步节省约 0.4 bit/参数的内存;分页优化器(Paged Optimizer),利用统一内存处理梯度检查点时的内存尖峰。
凭借 QLoRA,在单张 48GB 显存的消费级 GPU 上就能微调 65B 参数的模型,这在两年前是不可想象的。实际微调 7B 模型时,QLoRA 只需要约 6-10GB 显存,而全量微调则需要 50GB 以上。
指令微调与 SFT
指令微调(Instruction Tuning)是有监督微调(SFT,Supervised Fine-Tuning)的一种形式,目的是让模型学会遵循人类指令而不是单纯做文本补全。数据集通常以(instruction, input, output)三元组的形式组织,典型格式如 Alpaca 格式。数据质量远比数量重要——几千条精心筛选的高质量指令对模型行为的改善效果往往超过几万条嘈杂数据。实际项目中,建议先从 1000-2000 条高质量指令样本起步,根据评估结果决定是否需要扩展数据集。
RLHF:强化学习的人类反馈之路
RLHF(Reinforcement Learning from Human Feedback)是 InstructGPT/ChatGPT 背后的关键技术。流程分为三步:首先进行 SFT 获得基础策略模型;然后收集人类偏好数据,训练一个奖励模型(Reward Model),用于学习人类对输出质量的判断标准;最后用 PPO(Proximal Policy Optimization)算法在奖励模型的指导下优化策略模型。
RLHF 在实践中面临重重挑战:奖励黑客(Reward Hacking)——模型学会钻奖励模型的空子,输出形式上符合奖励标准但内容毫无意义;训练不稳定——PPO 对超参数敏感,需要大量调参经验;人工标注成本高——高质量偏好数据需要专业标注员,且不同标注员的标准难以统一。此外还需要维护奖励模型、策略模型、参考模型和价值模型四套网络,系统复杂度极高。
DPO:从 RLHF 中抽走强化学习
DPO(Direct Preference Optimization)提出了一种优雅的简化方案。其核心洞察是:在 RLHF 的数学框架下,最优策略与奖励函数之间存在一个解析映射关系。利用这个映射,可以把偏好概率直接写成关于策略函数的形式,从而在偏好数据集上直接优化语言模型策略,完全省略显式奖励模型训练和 PPO 强化学习阶段。
DPO 只需要两个模型(策略模型和参考模型),训练流程与标准的 SFT 几乎一致,稳定性和收敛速度都优于 PPO。实践中 DPO 已经成为许多团队替代 RLHF 的首选方案——当你的偏好数据质量足够高、数据量在数千条以上时,DPO 往往能以更低的工程成本达到相近甚至更好的对齐效果。
如何选择微调策略
实际选型建议:如果数据和算力都充足、追求极致效果,走完整的 SFT + DPO 路线;如果主要目标是领域知识注入,用 QLoRA 做 SFT 最经济高效;如果需要对齐特定偏好或风格,在 SFT 基础上追加 DPO;如果还在快速验证阶段,用 LoRA/QLoRA 在小规模数据上迭代,验证可行后再考虑是否需要全量微调。
工具生态
HuggingFace 的 PEFT 库提供了 LoRA、QLoRA、Prefix Tuning 等方法的统一接口,几行代码即可完成配置。**TRL(Transformer Reinforcement Learning)**封装了 SFT、Reward Model 训练、PPO 和 DPO 的完整流程。Axolotl 是一个面向实用主义的微调框架,通过 YAML 配置文件驱动训练,集成了 QLoRA、FSDP、DeepSpeed 等特性,极大降低了上手门槛。
成本与算力估算
以下是一些参考数据(以 7B 模型、1000 条训练样本为例):LoRA(FP16)约需 14-18GB 显存,训练时长约 30-60 分钟(单张 A10);QLoRA(NF4)约需 6-10GB 显存,训练时长约 40-80 分钟;全量微调约需 50-60GB 显存,需要多卡并行。对于 70B 模型,QLoRA 可以在单张 48GB GPU 上完成,而全量微调则需要 8 张 A100。在实际预算评估中,模型规模的选择往往比微调方法的选择对成本影响更大,因此优先考虑能否用 7B/13B 模型替代更大的模型。