2024 年大语言模型(LLM)微调方法全面总结
全面总结了 2024 年大语言模型微调的核心技术与实践。内容涵盖 LLM 项目生命周期、微调的适用场景判断、有监督微调(SFT)流程及代码实现、全微调与参数高效微调(PEFT/LoRA)的区别、迁移学习与多任务学习策略、检索增强(RAG)与微调的对比关系,以及微调最佳实践。文章重点解析了如何通过标记数据更新模型权重以适应特定任务,同时探讨了灾难性遗忘的解决方案及超参数调优技巧,为开发者构建垂直领域模型提供理论指导与实战参考。

全面总结了 2024 年大语言模型微调的核心技术与实践。内容涵盖 LLM 项目生命周期、微调的适用场景判断、有监督微调(SFT)流程及代码实现、全微调与参数高效微调(PEFT/LoRA)的区别、迁移学习与多任务学习策略、检索增强(RAG)与微调的对比关系,以及微调最佳实践。文章重点解析了如何通过标记数据更新模型权重以适应特定任务,同时探讨了灾难性遗忘的解决方案及超参数调优技巧,为开发者构建垂直领域模型提供理论指导与实战参考。

众所周知,大语言模型(LLM)正在飞速发展,各行业都有了自己的大模型。其中,大模型微调技术在此过程中起到了非常关键的作用,它提升了模型的生成效率和适应性,使其能够在多样化的应用场景中发挥更大的价值。
本文将深入探讨大模型微调的核心概念、适用场景、主流方法以及最佳实践,帮助开发者构建更专业的垂直领域模型。
在介绍大模型微调方法之前,首先了解一下大语言模型的项目生命周期,它大致可以分为以下几个步骤:
LLM 微调是一个将预训练模型在较小、特定数据集上进一步训练的过程,目的是精炼模型的能力,提高其在特定任务或领域上的性能。微调的目的是将通用模型转变为专用模型,弥合通用预训练模型与特定应用需求之间的差距,确保语言模型更贴近人类的期望。
以 OpenAI 的 GPT-3 为例,这是一个为广泛的自然语言处理(NLP)任务设计的先进 LLM。假设一家医疗组织希望使用 GPT-3 来帮助医生从文本笔记生成患者报告。虽然 GPT-3 能理解和创建一般文本,但它可能没有针对复杂的医学术语和特定医疗术语进行优化。
为了提高 GPT-3 在这一专业角色中的性能,该组织会在包含医疗报告和患者笔记的数据集上对 GPT-3 进行微调。通过这个过程,模型变得更加熟悉医学术语、临床语言的微妙之处和典型的报告结构。微调后,GPT-3 能够协助医生生成准确且连贯的患者报告,展示了它对特定任务的适应性。
尽管微调听起来对每个 LLM 都很有价值,但请记住,这并非没有代价。接下来,将会详细讨论这些成本。
说起 LLM,总会涉及到上下文学习、零样本、单样本和少样本推理等话题。我们先快速了解一下它们主要的功能。
上下文学习的问题:将以上这些技术直接应用于用户提示,旨在优化模型输出,使其更符合用户偏好。问题是它们并不总是有效,尤其是对于较小的 LLM。除此之外,在提示中包含的任何示例都会占用宝贵的上下文窗口空间,减少了包含其他有用信息的空间。
当以上方式无法解决相关问题时,这就需要 LLM 微调。但它与预训练阶段使用大量非结构化文本数据不同,微调是一个监督学习过程。这意味着你使用标记好的示例数据集来更新 LLM 的权重。这些标记好的示例通常是 prompt-response,使得模型能更好地完成特定任务。
有监督微调意味着使用标记数据更新预先训练的语言模型来完成特定任务。所使用的数据已提前检查过。这与不检查数据的无监督方法不同。通常语言模型的初始训练是无监督的,但微调是有监督的。
以下是一个基于 Hugging Face Transformers 库进行 SFT 的简化 Python 代码示例:
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer
from datasets import load_dataset
# 1. 加载模型和分词器
model_name = "meta-llama/Llama-2-7b-hf"
model = AutoModelForCausalLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
# 2. 准备数据集
dataset = load_dataset("json", data_files="train.jsonl")
def format_prompt(example):
return f"Instruction: {example['instruction']}\nInput: {example['input']}\nOutput: {example['output']}"
def tokenize_function(examples):
inputs = tokenizer(examples["text"], truncation=True, max_length=512)
return inputs
tokenized_dataset = dataset.map(tokenize_function, batched=True)
# 3. 配置训练参数
training_args = TrainingArguments(
output_dir="./sft_model",
per_device_train_batch_size=4,
num_train_epochs=3,
learning_rate=2e-5,
fp16=True,
logging_steps=10
)
# 4. 初始化 Trainer 并训练
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_dataset["train"],
)
trainer.train()
LLM 微调是一个有监督学习过程,主要使用标注数据集来更新 LLM 的权重,并使模型提高其特定任务的能力。接下来将为大家介绍一些值得注意的微调方法。
一种提高模型在各种任务上表现的策略是指令微调。这涉及到使用示例来训练机器学习模型,展示模型应该如何响应查询。用于微调大型语言模型的数据集必须符合你的指令目的。
例如,如果你想提高模型的摘要能力,你应该构建一个包含摘要指令和相关文本的数据集。在翻译任务中,应包含'翻译这段文本'等指令。这些提示有助于让模型以新的专业方式'思考',并服务于特定任务。
即更新模型所有权重的过程,被称为全微调。这个过程会产生一个具有更新权重的新模型版本。需要注意的是,与预训练一样,全微调需要足够的内存和计算预算来存储和处理训练过程中的所有梯度、优化器和其他更新组件。
训练语言模型是一项计算密集型任务。对于 LLM 全微调,内存不仅来存储模型,还要存储训练过程中必要的参数。你的计算机可能能够处理模型权重,但在训练过程中为优化状态、梯度和前向激活分配多余的内存可能会存在挑战。
简单的硬件无法处理这种挑战。这就是参数高效微调(PEFT)的关键所在。虽然全 LLM 微调在监督学习过程中更新每个模型的权重,但 PEFT 方法只更新一小部分参数。这种迁移学习技术选择特定的模型组件并'冻结'其余参数。结果是,与原始模型相比,参数数量显著减少(在某些情况下,仅为原始权重的 15-20%;2021 年微软提出的 LORA,斯坦福提出的 Prefix-Tuning,谷歌提出的 Prompt Tuning,2022 年清华提出的 P-tuning v2、2023 年华盛顿大学提出的 QLoRA、2024 年英伟达提出 DoRA 等基本上都是属于该范畴)。
这使得内存需求更加可管理。不仅如此,PEFT 还解决了灾难性遗忘问题。由于它不触及原始 LLM,模型不会忘记之前学到的信息。全微调会为每个训练任务产生一个新版本的模型,每个新版本都与原始模型大小相同,如果你在多个任务上进行微调,这可能会造成昂贵的存储问题。
注意,其实还有其它的微调类型,如自适应、行为和指令、强化微调,这些涵盖了训练语言模型的一些重要特定情况。
说到模型微调,这里就必须要提一下检索增强 RAG 了。RAG 是微调的一种替代方法,它结合了自然语言生成和信息检索。RAG 确保语言模型通过外部最新知识或相关文档提供信息来源。这种技术弥合了通用模型广泛知识与最新知识信息需求之间的差距。因此,RAG 是事实随时间演变情况下的重要技术。
RAG 相较于微调的一个优势在于信息管理。传统的微调将数据嵌入到模型架构中,实质上是'硬编码'知识,这不容易修改。而 RAG 允许训练数据的持续更新,并允许数据的移除或修订,确保模型保持准确。
在语言模型的背景下,RAG 和微调通常被视为竞争方法。然而,它们的结合使用可以显著提高性能。特别是,微调可以应用于 RAG 系统,以识别和改进其较弱的组件,帮助它们在特定 LLM 任务上表现出色。
大语言模型的微调技术正处于快速发展阶段,从全量微调到参数高效微调,再到与 RAG 的结合,不同的技术路径适用于不同的业务场景。开发者应根据数据规模、算力资源和业务需求,选择最合适的微调策略,以实现模型效果与成本的最佳平衡。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online