大模型微调(Fine-tuning)学习笔记
它首先将预训练模型量化为4-bit(使用NF4等量化方法),然后冻结这个4-bit的模型,在此基础上添加LoRA适配器进行微调。不是为所有权重矩阵都分配固定的秩 r,而是根据权重的重要性动态调整 A和 B的秩,将更多的参数预算分配给更重要的模块。其中,W的维度是 d x k,而 A是 d x r,B是 r x k,秩 r << min(d, k)。:每个微调任务都会产生一个与原模型大小相当的副本(
一、 为什么需要微调?
预训练大语言模型(LLM)拥有强大的通用知识,但其输出可能不总是符合我们的特定需求。微调(Fine-tuning)正是在此背景下产生的关键技术,它通过在特定领域或任务的数据集上对预训练模型进行额外训练,使其适应特定场景,从而获得显著提升的效果。
微调的核心目的:
提升特定任务性能:让通用模型在医疗、法律、编程等垂直领域表现更专业。
学习特定风格与格式:让模型学会以特定的风格(如官方、口语化)或格式(如JSON、XML)进行输出。
注入领域知识:让模型掌握预训练时未包含的新知识或实时信息。
改善指令遵循能力:让模型更好地理解和遵循用户的指令(Crucial for Instruction-following models)。
二、 微调策略
微调策略的发展经历了从全参数微调到参数高效微调的演进,核心思想是在效果和成本(计算资源、存储空间、时间)之间寻找最佳平衡。
1. 全参数微调(Full Fine-Tuning)
做法:在目标任务的数据集上,对模型的所有参数进行更新。
优点:通常能获得最好的性能上限,模型可以充分学习任务细节。
缺点:
计算成本极高:需要训练整个模型,动辄需要数百GB的GPU显存。
存储成本高:每个微调任务都会产生一个与原模型大小相当的副本(如一个7B的模型微调后产生一个7B的新模型)。
灾难性遗忘:模型可能会过度适应新数据,而丢失原有的通用能力。
适用场景:计算资源充足,且任务与模型预训练领域差异较大。
2. 参数高效微调(Parameter-Efficient Fine-Tuning, PEFT)
PEFT方法仅微调模型的一小部分参数,从而大幅降低资源需求,目前已成为微调的主流范式。
(1) LoRA (Low-Rank Adaptation)
核心思想:假设模型在适配新任务时,权重更新(ΔW)具有较低的“内在秩”(intrinsic rank)。因此,不需要直接更新巨大的原始权重矩阵 W,而是用两个更小矩阵的乘积 A和 B来近似这个更新量:ΔW = A * B。
其中,W的维度是 d x k,而 A是 d x r,B是 r x k,秩 r << min(d, k)。
过程:在微调时,冻结原始模型参数,只训练 A和 B这两个低秩矩阵。在前向传播时,将更新量加到原始权重上:h = Wx + BAx。
优点:
显存效率高:仅需存储和优化少量参数,大大降低了显存需求。
存储高效:保存和分享时只需要保存微小的适配器权重(通常几MB到几百MB),而不是整个模型(几GB到几十GB)。
易于切换任务:通过加载不同的适配器,同一个基础模型可以快速切换不同任务。
几乎没有性能损失:效果通常可与全参数微调相媲美。
(2) QLoRA (Quantized LoRA)
核心思想:是LoRA的进一步升级。它首先将预训练模型量化为4-bit(使用NF4等量化方法),然后冻结这个4-bit的模型,在此基础上添加LoRA适配器进行微调。
优点:
极致降低显存:使得在单张消费级GPU(如24GB的RTX 4090)上微调大模型(如33B甚至更大)成为可能,是个人开发者和小型团队的福音。
缺点:量化会带来极小的精度损失,但通常可以忽略不计。
(3) AdaLoRA
核心思想:对LoRA的改进,引入了重要性感知的动态秩分配策略。不是为所有权重矩阵都分配固定的秩 r,而是根据权重的重要性动态调整 A和 B的秩,将更多的参数预算分配给更重要的模块。
优点:在相同的参数预算下,通常能获得比LoRA更好的性能。
(4) Prefix Tuning / P-Tuning v2
核心思想:在模型的输入或每一层的输入前,添加一串可训练的连续提示向量(Continuous Prompt Vectors),称为 prefix或 prompt。微调时只优化这些向量,模型主体参数冻结。
与LoRA的区别:LoRA修改的是模型内部的权重,而Prefix Tuning修改的是输入。
三、 常见微调框架对比
以下框架均实现了上述PEFT方法,但设计哲学和易用性上有所不同。
框架 |
主要维护者 |
核心特性 |
易用性 |
集成度 |
推荐场景 |
�� PEFT (推荐) |
Hugging Face |
与 Transformers 库无缝集成,支持 LoRA, Prefix Tuning, P-Tuning, AdaLoRA 等多种PEFT方法,API设计统一。 |
极高 |
极高 |
绝大多数场景的首选,尤其是研究和生产环境。 |
TRL & TRLX |
Hugging Face |
TRL 专注于使用强化学习(RLHF) 来对齐人类偏好。TRLX 是其扩展,支持更大模型的RL训练。 |
中等 |
高 |
需要进行奖励模型训练或RLHF的高级场景。 |
Axolotl |
开源社区 |
一个“一站式”的微调脚本仓库,配置化(YAML)驱动,集成了多种优化和技术(如FSDP, DeepSpeed)。 |
高 |
极高 |
懒人福音,希望快速启动微调实验,不想写太多代码的用户。 |
Unsloth |
Unsloth |
核心卖点是通过优化内核实现2倍训练速度提升和50%显存减少,并提供了简化API。 |
高 |
高 |
极致追求微调速度和降低显存的用户。 |
Lamini |
Lamini AI |
更偏向云服务和MaaS(Model-as-a-Service),旨在降低微调门槛,不关心底层实现。 |
极高 |
云服务 |
完全不想操心基础设施的企业或团队,愿意支付服务费用。 |
FastChat |
LMSYS |
主要专注于训练聊天机器人和对话模型,提供了从数据清洗到训练、评估的完整流程。 |
中等 |
高 |
专门用于微调对话助手和聊天模型。 |
四、 微调流程
确定目标:明确微调要解决的问题(风格迁移、任务执行、知识注入)。
准备数据:收集和清洗高质量的数据集,格式为指令-输出对(对于指令微调)。数据质量至关重要!
选择方法与框架:
资源受限(单卡消费级GPU):QLoRA。
资源充足且追求最佳效果:全参数微调或AdaLoRA。
通用高效选择:LoRA。
框架首选:PEFT。
配置训练参数:设置学习率(通常很小,如 3e-4)、批大小、训练轮数等。使用学习率调度器(如 cosine)。
开始训练与监控:使用wandb或tensorboard等工具监控训练损失和评估指标。
评估与验证:在预留的测试集上评估模型性能,检查是否存在过拟合或遗忘。
推理部署:对于PEFT方法,需要将基础模型与适配器权重合并后进行部署,或使用PEFT库动态加载。
五、 结论
PEFT(尤其是LoRA/QLoRA)已成为微调的事实标准,它让每个人都能以可承受的成本定制自己的大模型。
PEFT库是学习和应用微调技术的最佳起点,因为它生态最好,文档最完善。
微调的成功很大程度上依赖于高质量、高相关性的训练数据。“Garbage in, garbage out”原则在此依然适用。
在选择框架时,优先考虑与现有技术栈(如Hugging Face Transformers)的集成度,这将大大降低开发复杂度。
- 参考资料
大模型微调全攻略:
https://blog.csdn.net/WANGJUNAIJIAO/article/details/151799611
模型微调实例:
https://blog.csdn.net/Java_ZZZZZ/article/details/145728694
openAI的dashboard里可视化模型微调
更多推荐
所有评论(0)