人工智能基础知识笔记十七:微调方法
在微博https://blog.csdn.net/jimmyleeee/article/details/152733155介绍了微调,本文主要是介绍微调的方法。
1、全面微调
全面微调:使用某一领域的专业数据集,对预训练模型的所有参数(权重和偏置)进行再一次的、端到端的训练。模型中的每一个神经元连接都会根据新数据被重新调整。
1.1、 过程描述
-
初始化:从一个在大规模通用语料上预训练好的模型开始(例如,LLaMA 2或BERT)。这个模型已经具备了强大的语言理解和生成能力。
-
数据输入:将你的领域特定数据集输入模型。
-
前向传播:数据通过网络,模型基于其当前的所有参数计算输出,并给出一个预测(例如,下一个词的概率)。
-
计算损失:将模型的预测与数据中的真实标签进行比较,通过损失函数计算出“错误程度”。
-
反向传播:这是关键步骤。损失值通过网络反向传播,计算损失函数对于模型中每一个单一参数的梯度。这个梯度指明了“为了减少错误,每个参数应该向哪个方向、调整多少”。
-
参数更新:使用优化器,根据计算出的梯度,更新整个模型的所有参数。
-
循环迭代:重复步骤2-6,直到模型在训练数据上的损失收敛到满意水平,或达到预设的训练轮数。
1.2、全面微调的优缺点
1.2.1、优点
-
性能潜力最大
-
这是全面微调最核心的吸引力。由于没有任何参数被“冻结”,模型有能力最大限度地适应新数据的分布。理论上,如果数据和算力充足,它在特定任务上的表现可以达到该模型架构的性能上限。它能够学习到数据中非常细微和复杂的模式,这是参数受限的高效微调方法可能无法做到的。
-
-
概念简单,实现直接
-
从原理和实现上看,它和预训练没有本质区别。训练流程简单,不需要像LoRA那样引入额外的结构或像适配器那样修改模型架构。只需加载模型、加载数据、设置优化器,然后开始训练。
-
1.2.2、缺点
-
计算成本极高
-
内存消耗:在训练期间,需要存储整个模型的参数、梯度、优化器状态(如Adam优化器会存储动量和方差),这需要巨大的GPU显存。微调一个70亿参数的模型,可能需要超过40GB的显存。
-
时间成本:训练所有参数意味着更长的训练时间。
-
硬件门槛:通常需要多张高端GPU(如A100/H100)进行分布式训练,个人和小团队难以承担。
-
-
灾难性遗忘
-
这是全面微调一个非常突出的问题。由于所有参数都在更新,模型在专注于学习新任务(如医疗问答)时,可能会覆盖或削弱其在预训练阶段学到的通用知识(如常识、推理能力、对其他领域的理解)。
-
后果:模型可能变成了一个医疗专家,但却忘记了如何写一首像样的诗,或者回答基础的历史问题。它的“通用性”被严重损害。
-
-
存储和部署成本高
-
每针对一个任务进行一次全面微调,你就会得到一个完整的、独立的模型副本。如果一个基础模型有7GB,那么微调10个任务就需要70GB的存储空间。这在模型管理和部署时是一个巨大的负担。
-
-
过拟合风险
-
专业数据集通常规模有限。用一个巨大的模型去拟合一个相对小的数据集,很容易导致过拟合——即模型完美地记住了训练数据,但在未见过的数据上表现很差。
-
2、高效微调
为了解决全面微调的成本问题,这类方法应运而生,也是目前的主流。它们只训练一小部分额外参数或极少的原有参数。
2.1、 适配器微调
在模型的Transformer层之间插入一些小的神经网络层(适配器),在微调时只训练这些新插入的适配器,冻结原始模型的所有参数。
2.2.1、适配器微调的优缺点
2.2.1.1 优点
-
参数效率高:只需训练极少的参数,大大节省内存和计算。
-
模块化:可以为不同任务训练不同的适配器,像插拔U盘一样在同一个基础模型上切换任务。
2.2.1.2、缺点
-
推理速度慢:由于增加了额外的网络层,模型在推理(预测)时速度会变慢。
-
引入了结构复杂性。
2.2、提示微调
在模型的输入序列前,加入一串可训练的、连续的“虚拟token”(即前缀)。微调时只优化这些虚拟token的向量表示,冻结整个原始模型。
2.2.1 优点
-
极其高效:需要训练的参数比适配器还少。
-
无缝集成:不改变模型结构,推理时无额外开销。
2.2.2、缺点
-
会占用上下文窗口:前缀会消耗宝贵的输入长度。
-
训练不太稳定,效果有时不如其他方法。
2.3、LoRA - 低秩适应
发现大模型的权重变化在适应新任务时具有“低秩”特性。因此,它不直接更新巨大的权重矩阵,而是用两个更小的矩阵的乘积来模拟这种更新。微调时,只训练这两个小矩阵。
2.3.1 优点
-
高效且强大:效果通常能媲美全面微调,但训练参数极少,成本极低。
-
零推理开销:训练完成后,可以将小矩阵合并回原模型,推理速度和原模型完全一样。
-
模块化:不同的LoRA适配器可以灵活组合和切换。
2.3.2、缺点
-
需要选择秩:
r
(矩阵的维度)是一个需要手动调整的超参数,虽然通常影响不大。
2.4、QLoRA - 量化LoRA
将预训练模型量化为4-bit(极大地减少内存占用),然后在这个量化模型上应用LoRA进行微调。训练结束后,可以将LoRA权重应用到原来的16-bit模型上。
2.4.1 优点
-
内存需求极低:可以在单张消费级显卡(如24GB的RTX 4090)上微调巨大的模型(如650亿参数)。
-
保持了LoRA的所有优点。
2.4.2、缺点
-
略有性能损失:量化会带来极小的精度损失,但通常可以忽略不计。
3、各种微调的总结和对比
微调方法 | 核心思想 | 优点 | 缺点 | 适用场景 |
全面微调 | 训练所有参数 | 性能潜力最大 | 成本极高,灾难性遗忘 | 算力无限,任务特殊 |
适配器 | 插入并训练小网络 | 参数高效,模块化 | 推理延迟,结构复杂 | 需要快速切换多任务 |
提示微调 | 优化输入前缀 | 极其高效,无结构改动 | 占用上下文,效果不稳 | 轻量级任务适配 |
LoRA | 用低秩矩阵模拟权重更新 | 高效、强效、零开销 | 需选择秩r | 当前绝大多数场景的首选 |
QLoRA | 量化 + LoRA | 极致的内存效率 | 有极小的量化损失 | 资源受限的个人或团队 |
如何选择?
-
首选 LoRA:它在效率、效果和易用性上取得了最佳平衡。Hugging Face的PEFT库对其有非常好的支持。
-
如果显卡内存不足:毫不犹豫地选择 QLoRA。它能让你在有限的资源下完成看似不可能的任务。
-
将全面微调视为最后的手段,仅在LoRA等高效方法无法满足你对性能的极致要求时考虑。