大模型微调学习有感
模型微调(Fine-Tuning)是一种基于预训练模型的迁移学习技术,通过在特定任务数据集上进一步训练,调整模型参数以优化其在特定领域的性能。这一过程能够利用预训练模型已有的通用知识,同时适应新任务的需求。下图表示了7种主流微调方法在Transformer网络架构中的作用位置及其简要说明。
模型微调定义
模型微调(Fine-Tuning)是一种基于预训练模型的迁移学习技术,通过在特定任务数据集上进一步训练,调整模型参数以优化其在特定领域的性能。这一过程能够利用预训练模型已有的通用知识,同时适应新任务的需求。模型微调:让大模型“学得更专”。下图表示了7种主流微调方法在Transformer网络架构中的作用位置及其简要说明。

主流算法
全参数微调(FFT):更新所有参数,适合数据充足场景。
参数高效微调(PEFT):
• LoRA:通过低秩矩阵分解调整权重,减少参数量。
• Adapter:插入小型网络模块,仅训练新增参数。
• Prefix Tuning:在输入层添加可学习前缀向量,引导模型适应任务。
知识蒸馏:用大模型指导小模型训练,平衡性能与效率。

举例理解: 你想让模型生成一份“交通违法行为汇总报告”:
-
用 Prompt 就像你不断提示它:“请写一份总结”
-
用 LoRA 就是给模型植入一个“写交通报告”的小能力插件
-
用 RAG 则是让它在一个交通规则数据库里边查边写
LoRA(Low-Rank Adaptation,低秩适配)
LoRA通过在模型的部分权重上添加可训练的低秩矩阵来实现微调。简单来说,就是冻结原模型的大部分参数,仅在每层中引入很小的瓶颈层进行训练。这样做大幅减少了需要更新的参数数量。LoRA的优点是内存开销小、训练高效,在下游任务上的效果通常接近全参数微调。并且多个LoRA适配器可以在一个基模型上切换,方便一个模型服务多种任务。LoRA不增加推理时延,因为微调完可以将低秩权重与原权重合并。实验表明,使用LoRA微调后的性能往往与全量微调相当,但显存占用和计算量却显著降低。缺点是LoRA仍需加载完整的预训练模型作为基础(但可以使用8-bit/4-bit量化减小内存,占用稍高于更轻量的P-Tuning)。LoRA适用于中大型模型在中小规模数据上的高效微调,是目前社区中极为流行的方案。
LoRA的操作流程如下:
- 确定微调目标权重矩阵:首先在大型模型(例如GPT)中识别出需要微调的权重矩阵,这些矩阵一般位于模型的多头自注意力和前馈神经网络部分。
- 引入两个低秩矩阵:然后,引入两个维度较小的低秩矩阵A和B。假设原始权重矩阵的尺寸为dd,则A和B的尺寸可能为dr和r*d,其中r远小于d。
- 计算低秩更新:通过这两个低秩矩阵的乘积AB来生成一个新矩阵,其秩(即r)远小于原始权重矩阵的秩。这个乘积实际上是对原始权重矩阵的一种低秩近似调整。
- 结合原始权重:最终,新生成的低秩矩阵AB被叠加到原始权重矩阵上。因此,原始权重经过了微调,但大部分权重维持不变。这个过程可以用数学表达式描述为:新权重 = 原始权重 + AB。
以一个具体实例来说,假设我们手头有一个大型语言模型,它通常用于执行广泛的自然语言处理任务。现在,我们打算将其微调,使其在处理医疗健康相关的文本上更为擅长。
采用LoRA方法,我们无需直接修改模型现有的大量权重。相反,只需在模型的关键部位引入低秩矩阵,并通过这些矩阵的乘积来进行有效的权重调整。这样一来,模型就能更好地适应医疗健康领域的专业语言和术语,同时也避免了大规模权重调整和重新训练的必要。

QLoRA(Quantized LoRA,量化 LoRA)
QLoRA可以看作是在LoRA基础上的进一步优化。它的核心是在训练时将预训练模型权重以4比特精度加载,大幅降低显存占用,同时同样仅训练LoRA低秩适配器。创新之处在于4-bit量化采用了Norm浮点格式(NF4)等技术,尽可能减少量化带来的性能损。研究表明,QLoRA在单张48GB GPU上就能微调65B参数的模型,而且性能与全16位精度微调几乎持平!这意味着,即使只有一块高端GPU,也能微调过去需要数十张GPU的大模型,这对普通开发者来说是革命性的。QLoRA的优点是极致地节省显存(比LoRA进一步减半左右),使单卡可微调更大的模型。缺点是实现稍复杂,需要依赖如bitsandbytes、可能还需要DeepSpeed等库支持4-bit训练,而且由于进行了强烈的量化,极少数情况下可能出现略微的性能下降或兼容性问题。QLoRA非常适合GPU内存非常有限但又想微调超大模型的情况。例如只有一块16GB卡却希望微调13B或33B参数模型时,QLoRA是不错的选择。

Prompt Tuning
P-Tuning是一种Prompt学习方法,通过为模型的输入添加一些可训练的虚拟token来引导模型输出。与直接调整模型权重不同,P-Tuning让模型保持原有权重不变,只是在输入序列开头插入若干新参数(这些参数在微调时会被更新)。可以理解为我们为每个任务学到了一个“魔法开头咒语”,让预训练模型更好地完成特定任务。P-Tuning的参数规模非常小(只相当于几百个词的嵌入向量),因此训练开销极低。它的优点是实现简单、所需内存极小,非常适合极少样本(Few-Shot)或需要针对很多不同提示调优的场景。缺点是适用范围受限:由于只调整输入提示,模型本身的表示能力没有改变,因而对于复杂任务或需要模型深度调整的场景,效果不如LoRA或全量微调。此外,P-Tuning主要针对生成类任务(prefix-tuning用于NLG,P-Tuning最初用于NLU任务)。总的来说,P-Tuning适合小数据快速尝试,或者配合其他微调一起使用,以进一步提升性能。

前缀调整(Prefix Tuning)
与传统的微调范式不同,前缀调整提出了一种新的策略,即在预训练的语言模型(LM)输入序列前添加可训练、任务特定的前缀,从而实现针对不同任务的微调。这意味着我们可以为不同任务保存不同的前缀,而不是为每个任务保存一整套微调后的模型权重,从而节省了大量的存储空间和微调成本。


前缀实际上是一种连续可微的虚拟标记(Soft Prompt/Continuous Prompt),与离散的Token相比,它们更易于优化并且效果更佳。这种方法的优势在于不需要调整模型的所有权重,而是通过在输入中添加前缀来调整模型的行为,从而节省大量的计算资源,同时使得单一模型能够适应多种不同的任务。前缀可以是固定的(即手动设计的静态提示)或可训练的(即模型在训练过程中学习的动态提示)。
P-Tuning
P-Tuning(基于提示的微调)和提示调整都是为了调整大型预训练语言模型(如GPT系列)以适应特定任务而设计的技术。两者都利用预训练的语言模型执行特定的下游任务,如文本分类、情感分析等,并使用某种形式的“提示”或“指导”来引导模型输出,以更好地适应特定任务。
提示调整与P-Tuning的主要区别在于:
- 提示调整:使用静态的、可训练的虚拟标记嵌入,在初始化后保持固定,除非在训练过程中更新。这种方法相对简单,因为它只涉及调整一组固定的嵌入参数,在处理多种任务时表现良好,但可能在处理特别复杂或需要细粒度控制的任务时受限。
- P-Tuning:使用一个可训练的LSTM模型(称为提示编码器prompt_encoder)来动态生成虚拟标记嵌入,允许根据输入数据的不同生成不同的嵌入,提供更高的灵活性和适应性,适合需要精细控制和理解复杂上下文的任务。这种方法相对复杂,因为它涉及一个额外的LSTM模型来生成虚拟标记嵌入。
P-Tuning中使用LSTM(长短期记忆网络)作为生成虚拟标记嵌入的工具,利用了LSTM的以下优势:
- 更好的适应性和灵活性:LSTM可以捕捉输入数据中的时间序列特征,更好地理解和适应复杂的、顺序依赖的任务,如文本生成或序列标注。
- 改进的上下文理解:LSTM因其循环结构,擅长处理和理解长期依赖关系和复杂的上下文信息。
- 参数共享和泛化能力:在P-Tuning中,LSTM模型的参数可以在多个任务之间共享,这提高了模型的泛化能力,并减少了针对每个单独任务的训练需求。而在提示调整中,每个任务通常都有其独立的虚拟标记嵌入,这可能限制了跨任务泛化的能力。
这些特性使得LSTM特别适合处理复杂任务和需要细粒度控制的应用场景。然而,这些优势也伴随着更高的计算复杂度和资源需求,因此在实际应用中需要根据具体需求和资源限制来权衡使用LSTM的决策。
P-Tuning v2
P-Tuning v2是P-Tuning的进一步改进版,在P-Tuning中,连续提示被插入到输入序列的嵌入层中,除了语言模型的输入层,其他层的提示嵌入都来自于上一层。这种设计存在两个问题:
- 第一,它限制了优化参数的数量。由于模型的输入文本长度是固定的,通常为512,因此提示的长度不能过长。
- 第二,当模型层数很深时,微调时模型的稳定性难以保证;模型层数越深,第一层输入的提示对后面层的影响难以预测,这会影响模型的稳定性。
P-Tuning v2的改进在于,不仅在第一层插入连续提示,而是在多层都插入连续提示,且层与层之间的连续提示是相互独立的。这样,在模型微调时,可训练的参数量增加了,P-Tuning v2在应对复杂的自然语言理解(NLU)任务和小型模型方面,相比原始P-Tuning具有更出色的效能。
除了以上PEFT,当前还存在PILL(Pluggable Instruction Language Learning)、SSF(Scaling & Shifting Your Features)等其他类型的微调方法。
PILL是PEFT的一个特定实现,特别关注于如何通过插入可训练的模块或插件来提升模型的任务适应性。这些插件被设计为与原始模型协同工作,以提高模型在处理特定任务时的效率和效果。
SSF核心思想是对模型的特征(即模型层的输出)进行缩放(Scaling)和位移(Shifting)。简单来说,就是通过调整特征的比例和偏移量来优化模型的性能。
这种方法可以在改善模型对特定任务的响应时,不需要调整或重新训练模型中的所有参数,从而在节省计算资源的同时保持或提升模型性能。这对于处理大规模模型特别有效,因为它减少了训练和调整所需的资源和时间。
全参数微调(Full Fine-Tuning)
这是一种最朴素也最暴力的方式——解冻预训练模型的所有参数,在下游数据上继续训练,使模型完整学习新任务。它的优点是在足够数据下能够获得最充分的适应效果,模型可以自由调整每一层参数来拟合新任务;但缺点也显而易见:资源消耗巨大(需要显存随模型大小线性增加,14B以上模型往往单卡无法全参数微调),过拟合风险更高(尤其当下游数据较少时,大量参数容易记忆训练集导致泛化变差)。另外,全量微调后的模型参数完全改变,如果要服务多个任务需要保存多份完整模型,部署成本高。一般来说,全参数微调适用于小模型或下游数据非常丰富且有充足计算资源的情况。在大模型上,由于效率太低,我们更推荐LoRA/QLoRA这类参数高效微调手段。

阶段
- 数据准备:准备适合目标任务的数据集,包括数据清洗、标注和格式转换,以确保模型能够高效学习任务相关的特征。
- 模型初始化:选择并加载一个合适的预训练模型,为微调提供强大的基础。选择正确的初始化方式能够大大提升后续的微调效果。
- 训练环境配置:配置适合训练的硬件环境,例如高效利用GPU或TPU,设置超参数,并确保环境兼容模型和数据的需求。
- 微调技术:通过少量特定任务的数据,对模型进行进一步训练,调整模型的参数以适应新的任务要求。常见技术包括学习率调节、正则化方法和混合精度训练。
- 评估与验证:使用验证集对微调后的模型进行评估,确保其在目标任务上的效果优异。验证阶段通常还包括性能分析和错误分析,以进一步优化模型。
- 模型部署:将微调后的模型集成到生产环境中,确保其稳定高效地执行任务。这一阶段需要考虑模型的规模、响应速度以及与其他系统的集成。
- 模型监控与维护:持续监控模型的表现,包括性能监控、准确性监控、错误率分析和日志分析等。同时设置反馈循环和警报机制,以便在模型出现问题时及时采取措施。此外,还需要定期进行模型的知识更新,确保其与最新数据保持一致。

更多推荐


所有评论(0)