Appearance
微调基础概念介绍
微调基本概念
所谓大模型微调,指的在已有的大规模预训练模型基础上,通过对标注数据进行训练,进一步优化模型的表现,以适应特定任务或场景的需求。不同于RAG或者Agent技术,通过搭建工作流来优化模型表现,微调是通过修改模型参数来优化模型能力,是一种能够让模型“永久”掌握某种能力的方法。
全量微调与高效微调
而从方法的大类上来划分,微调又可以划分为全量微调:带入全部数据进行微调,和高效微调:只带入部分数据进行微调。毫无疑问,全量微调是一种算力消耗更大、但对模型的能力改造更为彻底的方法,而高效微调则更类似一种“四两拨千斤”的方法,通过修改模型部分参数,来调整模型整体能力。
全量指令微调
全量微调的一个最核心的应用场景就是全量指令微调,在当代大模型的训练流程中,首先需要进行 模型预训练,在这个过程中我们需要输入大量不带标签的文本段落,让模型学习到语言的基本结构、语 法规则、上下文信息等。经过预训练的模型就拥有了“成语接龙的能力”, 参考如下部分代码:
python
# 录入文本
input_text = "长江"
input_ids = tokenizer.encode(input_text, return_tensors="pt").to(model.device)
# 生成多个 token
num_tokens_to_generate = 2
generated_tokens = []
with torch.no_grad():
for _ in range(num_tokens_to_generate):
output = model(input_ids)
next_token = output.logits.argmax(dim=-1)[:, -1] # 获取最后一个token的预测
generated_tokens.append(next_token.item())
input_ids = torch.cat([input_ids, next_token.unsqueeze(0)], dim=-1)
# 将生成的token转文本
generated_text = tokenizer.decode(generated_tokens, skip_special_tokens=True)
# print
print(generated_text)
# 此时会输出比如:"黄河",因为没有进行微调,所以模型不知道我们要的是长江的简介,它只会输出和长江经常关联在一起的词语,比如黄河但目前在很多场景下,我们需要大模型进行对话(chat)而非补全(completion),因此我们需要围绕经过预训练的模型进行进一步的全量指令微调,通过输入海量的对话文本(一问一答构成的文本,同时 也是有监督的文本),让模型学会对话的能力,也就是在输入"长江"后能输出长江的介绍相关信息。
现在绝大多数开源模型,在开源的时候都会公布两个版本的模型,其一是Base模型,该模型只经过了预训练,没有经过指令微调;其二则是Chat模型(或者就是不带尾缀的模型),则是在预训练模型基础上进一步进行全量指令微调之后的对话模型
高效微调与LoRA、QLoRA
尽管全量微调可以对模型的能力进行深度改造,但要带入模型全部参数进行训练,需要消耗大量的算力,且有一定的技术门槛。相比之下,在绝大多数场景中,如果我们只想提升模型某个具体领域的能力,那高效微调会更加合适。尽管在2020年前后,深度学习领域诞生了很多高效微调的方法,但现在适用于大模型的最主流的高效微调方法只有一种——LoRA。
LoRA( Low-Rank Adaptation)微调是一种参数高效的微调方法,旨在通过引入低秩矩阵来减少微调时需要调整的参数数量,从而显著降低显存和计算资源的消耗。具体来说,LoRA 微调并不直接调整原始模型的所有参数,而是通过在某些层中插入低秩的适配器(Adapter)层来进行训练。
LoRA的原理:
- 在标准微调中,我们会修改模型的所有权重,而在 LoRA 中,只有某些低秩矩阵(适配器)被训练 和调整。这意味着原始模型的参数保持不变,只是通过少量的新参数来调整模型的输出。
- 低秩矩阵的引入可以在显存和计算能力有限的情况下,依然有效地对大型预训练模型进行微调,从 而让 LoRA 成为显存较小的设备上的理想选择。 LoRA的优势:
- 显存优化: 只需要调整少量的参数(适配器),显著减少了显存需求,适合显存有限的GPU。
- 计算效率: 微调过程中的计算负担也更轻,因为减少了需要调整的参数量。
- 灵活性: 可以与现有的预训练模型轻松结合使用,适用于多种任务,如文本生成、分类、问答等。
而QLoRA(Quantized Low-Rank Adaptation) 则是 LoRA 的一个扩展版本,它结合了 LoRA 的 低秩适配器和量化技术。 QLoRA 进一步优化了计算效率和存储需求,特别是在极端显存受限的环境下。与 LoRA 不同的是, QLoRA 会将插入的低秩适配器层的部分权重进行量化(通常是量化为 INT4 或 INT8) ,在保持性能的同时显著降低模型的存储和计算需求。
QLoRA原理:
- 核心思想:在 LoRA 的基础上加入量化技术,减少权重表示的位数,从而降低显存和计算需求。 QLoRA 结合了低秩适配器和量化的优点,能够在显存有限的设备上进行更高效的微调。
- 量化:通过将模型权重量化为低精度(如 INT4),减少内存占用,并提高推理和训练速度。
QLoRA优势
- 在显存非常有限的情况下仍能进行微调
- 可以处理更大规模的模型
- 适合用于边缘设备和需要低延迟推理的场景
LoRA与QLoRA对比
| 特性 | LoRA | QLoRA |
|---|---|---|
| 核心技术 | 低秩适配器(Low-Rank Adapters) | 低秩适配器 + 量化技术(Low-Rank Adapters + Quantization) |
| 适用场景 | 显存受限,但设备性能较好 | 极限显存受限或需要快速推理的设备 |
| 计算效率 | 提高计算效率,减少调整的参数数量 | 进一步提升效率,减少内存使用并加快推理速度 |
| 量化技术 | 无量化 | 将权重量化为低精度(如 INT4 或 INT8) |
| 内存消耗 | 较低,但不如 QLoRA 低 | 显著降低内存消耗,适合更小的设备 |
| 训练复杂度 | 较简单,适用于大多数微调场景 | 需要更多的量化和适配工作,但适合超大模型和设备受限场景 |
高效微调的应用场景
- 对话风格微调: 高效微调可以用于根据特定需求调整模型的对话风格。例如,针对客服系统、虚拟助理等场景,模型可以通过微调来适应不同的 语气、礼貌程度或回答方式,从而在与用户互动时提供更符合要求的对话体验。通过微调少量的参数(例如对话生成的策略、情感表达等),可以使 模型表现出更具针对性和个性化的风格。
- 知识灌注: 知识灌注是指将外部知识或领域特定的信息快速集成到已有的预训练模型中。通过高效微调,模型可以更好地学习新领域的专有知识,而无需重新从头开始训练。例如,对于法律、医疗等专业领域,可以使用少量的标注数据对预训练模型进行微调,帮助模型理解特定行业的术语、规则和知识,进而提升专业领域的问答能力。
- 推理能力提升: 高效微调还可以用于提升大模型的推理能力,尤其是在处理更复杂推理任务时。通过微调,模型能够更加高效地理解长文本、推理隐含信息,或者从数据中提取逻辑关系,进而在多轮推理任务中提供更准确的答案。这种微调方式可以帮助模型在解答复杂问题时,提高推理准确性并减少错误。
- Agent能力(Function calling能力)提升: 在多任务协作或功能调用场景中,高效微调能够显著提升模型Agent能力,使得模型能够有效地与其他系统进行交互、调用外部API或执行特定任务。通过针对性微调,模型可以学会更精准的功能调用策略、参数解析和操作指令,从而在自动化服务、智能助手或机器人控制等领域表现得更加高效和智能。