一文看完大模型微调技术:微调背景、分类和微调全流程    

一、什么是大模型微调?

1.1 微调处在什么位置

预训练(Pretrain)——学到海量知识

LLM首先要学习的并非直接与人交流,而是让网络参数中充满知识的墨水,“墨水” 理论上喝的越饱越好,产生大量的对世界的知识积累。 预训练就是让Model先埋头苦学大量基本的知识,例如从Wiki百科、新闻、书籍整理大规模的高质量训练数据。 这个过程是“无监督”的,即人类不需要在过程中做任何“有监督”的校正,而是由模型自己从大量文本中总结规律学习知识点。 模型此阶段目的只有一个:学会词语接龙。例如我们输入“秦始皇”四个字,它可以接龙“是中国的第一位皇帝”。

监督微调(Supervised Fine-Tuning)——学会说人话

经过预训练,LLM此时已经掌握了大量知识,然而此时它只会无脑地词语接龙,还不会与人聊天。 SFT阶段就需要把半成品LLM施加一个自定义的聊天模板进行微调。 例如模型遇到这样的模板【问题->回答,问题->回答】后不再无脑接龙,而是意识到这是一段完整的对话结束。 称这个过程为指令微调,就如同让已经学富五车的「牛顿」先生适应21世纪智能手机的聊天习惯,学习屏幕左侧是对方消息,右侧是本人消息这个规律。

SFT也通常叫指令微调

人类反馈强化学习(Reinforcement Learning from Human Feedback, RLHF)——学会说人类期望听的话

在前面的训练步骤中,模型已经具备了基本的对话能力,但是这样的能力完全基于单词接龙,缺少正反样例的激励。 模型此时尚未知什么回答是好的,什么是差的。我们希望它能够更符合人的偏好,降低让人类不满意答案的产生概率。 这个过程就像是让模型参加新的培训,从优秀员工的作为例子,消极员工作为反例,学习如何更好地回复。

RLHF训练步骤并非必须,此步骤难以提升模型“智力”而通常仅用于提升模型的“礼貌”,有利(符合偏好、减少有害内容)也有弊(样本收集昂贵、反馈偏差、多样性损失)。

微调(Fine-Tuning)——成为业务专家

微调处于大模型调整最后阶段,也就是应用前,最后对大模型参数(即权重)按照业务领域知识进行学习调整的过程,而且没有前面几步这么重,完成定向微调后,大模型能完成特定的任务和业务工作(对话、推理、内容生成等等),也是本文接下来主要介绍的内容。

当然,大模型在业务上使用,也并不是一定需要微调的,还可以结合知识库采用RAG方案,具体在后面微调过程章节中会提到怎么选择。

1.2 什么是大模型微调

Fine-tuning是基于预训练模型并使用特定领域的数据对其进行能力增强,通过让模型理解和学习特定领域的知识库,以提升模型在特定领域、特定任务中的性能。 这个过程旨在优化模型以用于目标应用,提高其在专业领域中的性能和语境相关性。

微调的核心原因是赋予大模型更加定制化的功能。通用大模型虽然强大,但在特定领域可能表现不佳。通过微调,可以使模型更好地适应特定领域的需求和特征。

微调的操作主要是通过引入特定领域的数据集进行适量的权重(参数)调整,大模型可以学习该领域的知识和语言模式。这有助于模型在特定任务上取得更好的性能。

1.3 为什么大模型微调很重要

一般预训练出来的大模型都是通用大模型,在特定领域内无法胜任相关任务要求,需要调整参数,学习特定领域知识。但是大模型动辄数百亿参数的庞大规模,使得它们对个人设备而言不仅难以训练,甚至连部署都显得遥不可及,但是微调往往不需要这么高的成本条件,随着模型技术的发展,微调越来越变得容易,甚至消费级电脑都能进行。

微调(特指后文的PEFT)还解决了灾难性遗忘问题,由于它不触及原始LLM,模型不会忘记之前学到的信息。

微调能够“装备”大模型以更精细化的功能,例如整合本地知识库进行搜索、针对特定领域问题构建问答系统等。以VisualGLM为例,作为一个通用多模态模型,当应用于医学影像判别时,就需要输入医学影像领域的数据集以进行微调,以此提升模型在医学影像图像识别方面的表现。

“预训练语言模型 + 下游任务微调”已逐渐成为了 NLP 领域主流训练范式,用来解决各行业机会非常可观。

二、微调分类

2.1 指令微调(Instruction Fine-Tuning,IFT)

指令微调是相对“预训练”来讲的,预训练的时候是使用大量无标注的文本,让模型每次都预测下一个字符的方式来训练。而指令微调也可以叫“监督微调”,也就是对于输入文本有标准答案,用标准答案来训练模型。一般预训练完毕后就要进行指令微调,经过指令微调后,大语言模型能够展现出较强的指令遵循能力,可以通过零样本学习的方式解决多种下游任务。

指令微调还属于基座大模型训练的范围,一般业务上不会接触到,本文不再展开详细,如有兴趣,可阅读这一文:什么是指令微调。

2.2 全参数微调(Full Fine Tuning,FFT)

全参数微调是一种对大语言模型(LLM)进行优化的技术,指在预训练模型的基础上,针对特定任务或领域调整所有模型参数的过程。其核心目标是利用预训练模型的通用语言能力,通过进一步训练使其适应下游任务的具体需求,例如文本分类、对话生成或专业领域问答等。

核心特点

  • 参数全面更新
    全参数微调会更新模型的所有层和权重(包括预训练阶段学到的参数),而非仅调整部分模块或新增适配器。这意味着模型的所有参数都会根据新任务的数据分布重新优化

  • 依赖高质量数据
    由于需要调整大量参数,全参数微调通常要求下游任务的数据与预训练数据分布相似,且数据量充足,以避免过拟合。例如,在医疗、法律等专业领域,需准备大量标注数据以充分训练模型

  • 计算资源密集
    调整所有参数会导致显存和算力需求大幅增加。以65B参数的LLaMA模型为例,传统全参数微调需多块高性能GPU(如A100),但通过优化技术(如LOMO优化器),可在8块RTX 3090 GPU上完成训练

全参数微调的技术流程

  • 数据准备

    • 收集与任务高度相关的标注数据,并进行清洗、标准化和分词处理。

    • 划分训练集、验证集和测试集,确保模型泛化能力

  • 模型初始化

    • 加载预训练模型权重(如LLaMA、GPT等),作为微调的起点

  • 参数优化

    • 使用优化器(如SGD或AdamW)更新所有参数,通常需设置较低的学习率以稳定训练过程。

    • 融合混合精度训练、梯度归一化等技术,提升训练效率

  • 评估与部署

    • 通过验证集监控损失函数和任务指标(如准确率、F1值),防止过拟合。

    • 最终将微调后的模型部署到实际应用场景中

优势与局限性

  • 优势

    • 性能表现优异:由于全面调整参数,模型能更精准地捕捉任务特征,在复杂任务(如科学推理、多轮对话)中表现优于参数高效微调方法(如LoRA、Adapter)

    • 通用性强:适用于任务与预训练目标差异较大的场景(如跨模态适配)

  • 局限性

    • 资源消耗大:显存占用和训练时间远超部分参数微调方法。例如,微调7B模型需约15GB显存(使用LOMO优化器),而传统方法可能需100GB以上

    • 数据依赖性高:在数据不足或分布差异大的情况下,容易出现过拟合


2.3 参数高效微调(Parameter-Efficient Fine-Tuning,PEFT)

PEFT旨在通过最小化微调参数数量和计算复杂度,实现高效的迁移学习。它仅更新模型中的部分参数,显著降低训练时间和成本,适用于计算资源有限的情况。

PEFT技术包括LoRA、QLoRA、适配器调整(Adapter Tuning)、前缀调整(Prefix Tuning)、提示调整(Prompt Tuning)、P-Tuning及P-Tuning v2等多种方法。

一般大部分人接触到的微调,或者业务上需要的微调,如非特别指定说明,都指参数高效微调范畴。

接下来针对PEFT分类进一步展开介绍,只有了解这些分类背后的原理定位,才能明白各自的作用。

在了解微调分类之前,必须了解大模型经典网络结构,这样才能更好理解为什么分有这些类别。

大型模型的经典网络结构

以GPT系列中的Transformer为例,这种深度学习模型结构通过自注意力机制等技巧解决了相关问题。正是得益于Transformer架构,基于GPT的大型语言模型取得了显著的进展。

Transformer模型架构包含了众多模块,而我们讨论的各种微调技术通常是对这些模块中的特定部分进行优化,以实现微调目的。

Transformer架构



以下以Transformer为例,阐述各个模块的作用:

输入嵌入层(Input Embedding)

  • 输入(Inputs):模型的输入环节,通常为单词或符号序列。

  • 输入嵌入(Input Embedding):此步骤将输入序列(例如句中的每个单词)转化为嵌入表示,即能够表征单词语义信息的高维向量。

  • 位置编码(Positional Encoding):鉴于Transformer不依赖序列,位置编码旨在提供序列中单词位置的信息,这些编码添加到输入嵌入中,确保模型即便同时处理输入也能够利用单词的顺序信息。

编码器层(Encoder,左边)

  • Nx:指示有N个相同的编码器层叠加而成。每个编码器层包括两个主要子层:多头自注意力机制和前馈神经网络。

  • 多头自注意力(Multi-Head Attention):注意力机制允许模型在处理每个单词时考虑到输入序列中的所有单词。多头部分表示模型并行学习输入数据的不同表示。

  • 残差连接和归一化(Add & Norm):注意力层后面跟着残差连接和层归一化,有助于防止深层网络中的梯度消失问题,并稳定训练过程。

  • 前馈神经网络(Feed Forward):全连接神经网络处理自注意力层的输出,包含两个线性变换和一个非线性激活函数。

解码器层(Decoder,右侧)

  • 解码器亦包含多个相同的层,每层包括三个主要子层:掩蔽的多头自注意力机制、多头自注意力机制和前馈神经网络。

  • 掩蔽多头自注意力(Masked Multi-Head Attention):与编码器的多头自注意力机制类似,但为确保解码顺序性,掩蔽操作确保预测仅依赖于之前的输出。

  • 前馈神经网络(Feed Forward):与编码器相同,每个子层之后也有加法和归一化步骤。

输出嵌入层和输出过程

  • 解码器端的嵌入层将目标序列转换为向量形式。

  • 线性层(Linear)和Softmax层:解码器的输出通过线性层映射到一个更大的词汇空间,Softmax函数将输出转换为概率分布。


大型模型微调的技术手段(分类)

大型模型的全面微调(Fine-tuning)涉及调整所有层和参数,以适配特定任务。此过程通常采用较小的学习率和特定任务的数据,可以充分利用预训练模型的通用特征,但可能需要更多计算资源。

参数高效微调(Parameter-Efficient Fine-Tuning,PEFT)旨在通过最小化微调参数数量和计算复杂度,提升预训练模型在新任务上的表现,从而减轻大型预训练模型的训练负担。

即使在计算资源受限的情况下,PEFT技术也能够利用预训练模型的知识快速适应新任务,实现有效的迁移学习。因此,PEFT不仅能提升模型效果,还能显著缩短训练时间和计算成本,使更多研究者能够参与到深度学习的研究中。

PEFT包括LoRA、QLoRA、适配器调整(Adapter Tuning)、前缀调整(Prefix Tuning)、提示调整(Prompt Tuning)、P-Tuning及P-Tuning v2等多种方法。

以下图表示了7种主流微调方法在Transformer网络架构中的作用位置及其简要说明,接下来将详细介绍每一种方法。

大型模型微调的技术手段(分类)


1. LoRA

LoRA(Low-Rank Adaptation)是一种旨在微调大型预训练语言模型(如GPT-3或BERT)的技术。其核心理念在于,在模型的决定性层次中引入小型、低秩的矩阵来实现模型行为的微调,而无需对整个模型结构进行大幅度修改。

这种方法的优势在于,在不显著增加额外计算负担的前提下,能够有效地微调模型,同时保留模型原有的性能水准。

LoRA的操作流程如下:

  • 确定微调目标权重矩阵:首先在大型模型(例如GPT)中识别出需要微调的权重矩阵,这些矩阵一般位于模型的多头自注意力和前馈神经网络部分。

  • 引入两个低秩矩阵:然后,引入两个维度较小的低秩矩阵A和B。假设原始权重矩阵的尺寸为dd,则A和B的尺寸可能为dr和r*d,其中r远小于d。

  • 计算低秩更新:通过这两个低秩矩阵的乘积AB来生成一个新矩阵,其秩(即r)远小于原始权重矩阵的秩。这个乘积实际上是对原始权重矩阵的一种低秩近似调整。

  • 结合原始权重:最终,新生成的低秩矩阵AB被叠加到原始权重矩阵上。因此,原始权重经过了微调,但大部分权重维持不变。这个过程可以用数学表达式描述为:新权重 = 原始权重 + AB。

以一个具体实例来说,假设我们手头有一个大型语言模型,它通常用于执行广泛的自然语言处理任务。现在,我们打算将其微调,使其在处理医疗健康相关的文本上更为擅长。

采用LoRA方法,我们无需直接修改模型现有的大量权重。相反,只需在模型的关键部位引入低秩矩阵,并通过这些矩阵的乘积来进行有效的权重调整。这样一来,模型就能更好地适应医疗健康领域的专业语言和术语,同时也避免了大规模权重调整和重新训练的必要。


2. QLoRA

QLoRA(Quantized Low-Rank Adaptation)是一种结合了LoRA(Low-Rank Adaptation)方法与深度量化技术的高效模型微调手段。QLoRA的核心在于:

  • 量化技术:QLoRA采用创新的技术将预训练模型量化为4位。这一技术包括低精度存储数据类型(4-bit NormalFloat,简称NF4)和计算数据类型(16-bit BrainFloat)。这种做法极大地减少了模型存储需求,同时保持了模型精度的最小损失。

  • 量化操作:在4位量化中,每个权重由4个比特表示,量化过程中需选择最重要的值并将它们映射到16个可能的值之一。首先确定量化范围(例如-1到1),然后将这个范围分成16个区间,每个区间对应一个4-bit值。然后,原始的32位浮点数值将映射到最近的量化区间值上。

  • 微调阶段:在训练期间,QLoRA先以4-bit格式加载模型,训练时将数值反量化到bf16进行训练,这样大幅减少了训练所需的显存。例如,33B的LLaMA模型可以在24 GB的显卡上进行训练。

量化过程的挑战在于设计合适的映射和量化策略,以最小化精度损失对性能的影响。在大型模型中,这种方法可以显著减少内存和计算需求,使得在资源有限的环境下部署和训练成为可能。


3. 适配器调整(Adapter Tuning)

与LoRA技术类似,适配器调整的目标是在保留预训练模型原始参数不变的前提下,使模型能够适应新的任务。适配器调整的方法是在模型的每个层或选定层之间插入小型神经网络模块,称为“适配器”。这些适配器是可训练的,而原始模型的参数则保持不变。

适配器调整的关键步骤包括:

  • 以预训练模型为基础:初始阶段,我们拥有一个已经经过预训练的大型模型,如BERT或GPT,该模型已经学习了丰富的语言特征和模式。

  • 插入适配器:在预训练模型的每个层或指定层中,我们插入适配器。适配器是小型的神经网络,一般包含少量层次,并且参数规模相对较小。

  • 维持预训练参数不变:在微调过程中,原有的预训练模型参数保持不变。我们不直接调整这些参数,而是专注于适配器的参数训练。

  • 训练适配器:适配器的参数会根据特定任务的数据进行训练,使适配器能够学习如何根据任务调整模型的行为。

  • 针对任务的调整:通过这种方式,模型能够对每个特定任务进行微调,同时不影响模型其他部分的通用性能。适配器有助于模型更好地理解和处理与特定任务相关的特殊模式和数据。

  • 高效与灵活:由于只有部分参数被调整,适配器调整方法相比于全模型微调更为高效,并且允许模型迅速适应新任务。

例如,如果我们有一个大型文本生成模型,它通常用于执行广泛的文本生成任务。若要将其微调以生成专业的金融报告,我们可以在模型的关键层中加入适配器。在微调过程中,仅有适配器的参数会根据金融领域的数据进行更新,使得模型更好地适应金融报告的写作风格和术语,同时避免对整个模型架构进行大幅度调整。

LoRA与适配器调整的主要区别在于:

  • LoRA:在模型的权重矩阵中引入低秩矩阵来实现微调。这些低秩矩阵作为原有权重矩阵的修改项,在实际计算时对原有权重矩阵进行调整。

  • 适配器调整:通过在模型各层中添加小型神经网络模块,即“适配器”,来实现微调。适配器独立于模型的主体结构,仅适配器的参数在微调过程中更新,而模型的其他预训练参数保持不变。


4. 前缀调整(Prefix Tuning)

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

前缀调整(Prefix Tuning)


前缀实际上是一种连续可微的虚拟标记(Soft Prompt/Continuous Prompt),与离散的Token相比,它们更易于优化并且效果更佳。这种方法的优势在于不需要调整模型的所有权重,而是通过在输入中添加前缀来调整模型的行为,从而节省大量的计算资源,同时使得单一模型能够适应多种不同的任务。前缀可以是固定的(即手动设计的静态提示)或可训练的(即模型在训练过程中学习的动态提示)。


5. 提示调整(Prompt Tuning)

提示调整是一种在预训练语言模型输入中引入可学习嵌入向量作为提示的微调方法。这些可训练的提示向量在训练过程中更新,以指导模型输出更适合特定任务的响应。

提示调整与前缀调整都涉及在输入数据中添加可学习的向量,这些向量是在输入层添加的,但两者的策略和目的不同:

  • 提示调整:旨在模仿自然语言中的提示形式,将可学习向量(通常称为提示标记)设计为模型针对特定任务生成特定类型输出的引导。这些向量通常被视为任务指导信息的一部分,倾向于使用较少的向量来模仿传统的自然语言提示。

  • 前缀调整:可学习前缀更多地用于提供输入数据的直接上下文信息,作为模型内部表示的一部分,可以影响整个模型的行为。

以下是两者的训练示例,以说明它们的不同:

  • 提示调整示例:
    输入序列: [Prompt1][Prompt2] “这部电影令人振奋。”
    问题: 评价这部电影的情感倾向。
    答案: 模型需要预测情感倾向(例如“积极”)
    提示: 没有明确的外部提示,[Prompt1][Prompt2]作为引导模型的内部提示,这里的问题是隐含的,即判断文本中表达的情感倾向。

  • 前缀调整示例:
    输入序列: [Prefix1][Prefix2][Prefix3] “I want to watch a movie.”
    问题: 根据前缀生成后续的自然语言文本。
    答案: 模型生成的文本,如“that is exciting and fun.”
    提示: 前缀本身提供上下文信息,没有单独的外部提示。


6. P-Tuning

P-Tuning(基于提示的微调)和提示调整都是为了调整大型预训练语言模型(如GPT系列)以适应特定任务而设计的技术。两者都利用预训练的语言模型执行特定的下游任务,如文本分类、情感分析等,并使用某种形式的“提示”或“指导”来引导模型输出,以更好地适应特定任务。

提示调整与P-Tuning的主要区别在于:

  • 提示调整:使用静态的、可训练的虚拟标记嵌入,在初始化后保持固定,除非在训练过程中更新。这种方法相对简单,因为它只涉及调整一组固定的嵌入参数,在处理多种任务时表现良好,但可能在处理特别复杂或需要细粒度控制的任务时受限。

  • P-Tuning:使用一个可训练的LSTM模型(称为提示编码器prompt_encoder)来动态生成虚拟标记嵌入,允许根据输入数据的不同生成不同的嵌入,提供更高的灵活性和适应性,适合需要精细控制和理解复杂上下文的任务。这种方法相对复杂,因为它涉及一个额外的LSTM模型来生成虚拟标记嵌入。

P-Tuning中使用LSTM(长短期记忆网络)作为生成虚拟标记嵌入的工具,利用了LSTM的以下优势:

  • 更好的适应性和灵活性:LSTM可以捕捉输入数据中的时间序列特征,更好地理解和适应复杂的、顺序依赖的任务,如文本生成或序列标注。

  • 改进的上下文理解:LSTM因其循环结构,擅长处理和理解长期依赖关系和复杂的上下文信息。

  • 参数共享和泛化能力:在P-Tuning中,LSTM模型的参数可以在多个任务之间共享,这提高了模型的泛化能力,并减少了针对每个单独任务的训练需求。而在提示调整中,每个任务通常都有其独立的虚拟标记嵌入,这可能限制了跨任务泛化的能力。

这些特性使得LSTM特别适合处理复杂任务和需要细粒度控制的应用场景。然而,这些优势也伴随着更高的计算复杂度和资源需求,因此在实际应用中需要根据具体需求和资源限制来权衡使用LSTM的决策。


7. 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)等其他类型的微调方法。


8. 插件式指令微调PILL(Pluggable Instruction Language Learning)

插件式指令微调PILL(Pluggable Instruction Language Learning)是一种面向多模态大语言模型(LLM)的高效微调方法,PILL是PEFT的一个特定实现,旨在通过模块化设计解决复杂模态任务中的信息耦合问题,同时保持模型原有知识结构的稳定性。其核心思想是通过混合模态适配器专家(MoMAE)和模态注意门控(MAG)动态调节不同模态对模型输出的贡献,从而实现多模态任务的高效适配。

PILL特别关注于如何通过插入可训练的模块或插件来提升模型的任务适应性。这些插件被设计为与原始模型协同工作,以提高模型在处理特定任务时的效率和效果。

PILL的核心技术原理

  1. 混合模态适配器专家(MoMAE)

    • 针对不同模态(如视觉、文本、语音)设计独立的适配器模块(例如V-Adapter和L-Adapter),分别处理特定模态信息,避免多模态数据混合导致的干扰

    • 适配器结构基于改进的GLU-Adapter,通过门控线性单元增强特征表达能力,相比传统适配器提升了参数利用率

  2. 模态注意门控(MAG)

    • 动态调节各模态Token对最终输出的权重,例如在模型初始训练阶段抑制视觉信息对文本建模的干扰,逐步融合多模态特征

    • 通过门控机制实现模态间的自适应平衡,确保微调过程稳定且兼容原始模型的指令遵循能力

  3. 两阶段训练策略

    • 第一阶段:冻结LLM主参数,仅训练投影层和V-Adapter,实现跨模态对齐(如视觉与文本)

    • 第二阶段:解冻所有新增模块进行下游任务微调,保留LLM原始参数以维持通用能力

PILL的应用优势

  • 高效性:仅需单个A6000 GPU即可完成训练,计算资源消耗显著低于全参数微调

  • 灵活性:支持多模态任务的模块化扩展,例如在视觉问答(VQA)和科学推理任务中表现突出,ScienceQA数据集上准确率提升1.4%

  • 隐私保护:通过冻结主模型参数,避免数据所有者上传敏感数据或暴露模型权重,适用于分布式学习场景


9. SSF(Scaling & Shifting Your Features)微调

SSF核心思想是对模型的特征(即模型层的输出)进行缩放(Scaling)和位移(Shifting)。简单来说,就是通过调整特征的比例和偏移量来优化模型的性能。

这种方法可以在改善模型对特定任务的响应时,不需要调整或重新训练模型中的所有参数,从而在节省计算资源的同时保持或提升模型性能。这对于处理大规模模型特别有效,因为它减少了训练和调整所需的资源和时间。

核心原理

  1. 特征分布对齐

    • 由于预训练数据与下游任务数据分布存在差异,SSF引入缩放参数(γ)和偏移参数(β),分别对应特征的方差和均值,通过公式 y=γ?x+β 调整特征空间,使其更适合目标任务

    • 这一过程类似于标准化操作,但参数可学习且与输入无关,适用于所有任务统一优化

  2. 重参数化(Re-parameterization)

    • SSF的线性变换可在推理阶段通过数学等价操作合并到原始模型权重中,例如将缩放和偏移融入卷积核或注意力矩阵,从而消除额外计算开销

    • 例如,在卷积层中,调整后的权重W′ =γ?W,偏置 b'=γ?b+β ,直接替换原参数

  3. 任务无关的通用设计

    • 不依赖特定任务的结构设计(如Adapter的插入位置或VPT的提示词数量),所有任务共享统一参数空间,简化微调流程

技术优势

  • 参数高效性

    • 仅需微调0.03%的参数量(如ViT-B/16模型仅需0.3M参数),显著降低存储和训练成本

  • 零推理开销

    • 通过重参数化技术,微调后的参数直接融入原始模型,无需额外计算或修改网络结构,适合边缘设备部署

  • 性能表现卓越

    • 在26个分类数据集(如FGVC、VTAB-1k)和3个鲁棒性数据集上,SSF超越Adapter、VPT等方法,部分任务性能接近或优于全参数微调

    • 例如,在VTAB-1k数据集上,SSF的准确率相比全参数微调提升11.48%

  • 灵活性与兼容性

    • 支持多种模型架构(ViT、Swin Transformer、ConvNext),且无需修改预训练模型结构


各种微调方式横向对比
  • 增加额外参数,如:Prefix Tuning、Prompt Tuning、Adapter Tuning及其变体。

  • 选取一部分参数更新,如:BitFit。

  • 引入重参数化,如:LoRA、AdaLoRA、QLoRA。

  • 混合高效微调,如:MAM Adapter、UniPELT。

三、微调关键步骤


微调的最主要步骤分成准备数据集、选择基础模型、模型微调、全成新的模型,其中前三步都非常关键,影响最终合成模型的效果,模型微调过程中还需要不定时进行评测判断微调效果是否满足需求,大倒的步骤流程如下:

3.1 什么情况下需要微调

在做微调之前, 我们需要判断下,当前业务使用大模型需不需要进行微调,微调是否可以解决业务需求。


微调最适合特定领域的情况,例如以利基语气或风格响应详细提示,即法律简报或客户支持票。还非常适合克服信息偏见和其他限制,例如语言重复或不一致等情况。另外,如果有大量的标记数据,也可以通过微调来提供更加完善的模型行为。

上面讲了模型微调主要是做什么的,这里简单总结几个适合做模型微调的场景:

  • 适用于以专业语气回应复杂查询,例如撰写法律简报或处理客户支持票据;

  • 适用于纠正数据中的偏见和不一致性,如语言重复或风格差异;

  • 在拥有大量标记数据的情况下,微调能够进一步细化模型的行为,确保其在特定应用中的性能达到最佳;

微调例子:电商客服场景

假设你是一家电商平台的客服经理,想要通过人工智能帮助分析客户的评价,判断他们对产品的情感态度(比如“满意”或“不满意”)。这时候,你可以使用一个已经预训练的大语言模型(比如 GPT),准备一个情感标注的训练集进行微调,模型会学会用户评论中的情感线索,例如:

  • “太大了”是个负面反馈,但“质量不错”是正面反馈,所以整体是中立。

  • “物流太慢了”“客服态度也很差”这些表达明确传递了不满意。

微调后的效果:微调后模型不仅能理解情感,还能快速分类。


大模型对话或者知识检索、固定精准数据获取等一些场景,则比较适合使用RAG方案,RAG相较于微调的一个优势在于信息管理。传统的微调将数据嵌入到模型架构中,实质上是“硬编码”知识,这不容易修改。而RAG允许训练数据的持续更新,并允许数据的移除或修订,确保模型保持准确。以下是两种方案的选择对比:



微调方案和RAG方案选择场景对比表

场景特性

适合微调场景特点

适合RAG场景特点

知识库类型

静态知识(长期有效,如行业术语、法规)

动态知识(需实时更新,如新闻、市场数据)

任务目标

调整模型行为(风格/语气)或增强领域理解(如医疗术语)

直接基于外部知识生成答案,无需改变模型底层行为

数据隐私性

需内化敏感知识(如企业专利)

知识库本地化存储,检索过程可控(如内部政策库)

模型幻觉处理

依赖训练数据质量,未知领域仍有幻觉风险

基于检索证据生成,显著减少幻觉(如法律条文引用)

任务复杂度

复杂推理任务(多跳问答、科学计算)

知识密集型但逻辑简单的任务(文档摘要、事实查询)

可解释性要求

低(模型输出为黑盒)

高(答案可溯源至检索内容)

数据标注要求

有大量高质量标注数据(如情感分类)

无需标注,仅需结构化知识库(如FAQ、数据库)

多任务适配能力

单一任务深度优化(如特定领域文本生成)

支持多任务并行(政策检索+案例推荐)

知识更新频率

低频更新(年度政策修订)

高频更新(实时新闻、股票行情)

领域知识基础

模型缺乏领域先验知识(如小众科研领域)

模型具备通用知识,仅需补充细节(通用法律+最新判例库)


在语言模型的背景下,RAG和微调通常被视为竞争方法。然而,它们的结合使用可以显著提高性能。特别是,微调可以应用于RAG系统,以识别和改进其较弱的组件,帮助它们在特定LLM任务上表现出色。


?? 关键特性解读与建议

1. 知识时效性

  • 选择微调:知识长期稳定(如化学元素周期表)。

  • 选择RAG:依赖实时数据(如金融舆情监控)。

2. 模型行为控制

  • 选择微调:需定制输出风格(如客服话术统一)。

  • 选择RAG:需保持模型通用性(如多语言支持)。

3. 可解释性与合规性

  • 选择RAG:医疗/法律等高风险场景(需答案溯源)。

  • 选择微调:内部数据分析(如销售预测)。

4. 数据安全

  • 选择RAG:敏感数据需完全本地化(如军工文档)。

  • 选择微调:非敏感场景(如公开知识问答)。


3.2 准备数据

微调的结果对数据集依赖非常重要,数据集的质量直接影响微调的目标,通常需要非常高质量的微调数据,还要保证一定数据的平衡性,,在训练效率上,要记住数据质量 > 数量这个真理,需要保证数据的数量、质量、分类分布、平衡性以及后面验证数据,否则可能会导致模型欠拟合、过拟合、鲁棒性不够等问题。

所以在整个微调步骤中,准备数据集是一个非常繁锁的工作,通常除了技术本身之外,也需要对业务有一定的了解。

数据集准备的具体步骤基本如下:

  • 数据采集
    可能包括结构化数据、非结构化数据等,需要从数据来源进行采集和整理;

  • 数据治理
    对收集上来的数据集进行清洗、转换和标注,清洗去掉不适合的数据,标注是一个相当耗人力资源的工作,标注人员需要懂一定的业务,市面上也有很多标注工具,如 Label Studio、OpenLabeling、Doccano 或 OpenLabeling;

  • 数据合成:如果专业领域的数据集不够,我们还需要通过已有数据进行合成新数据,通过数据的多样性来提高模型鲁棒性,防止过拟合和偏差过大;

  • 数据评估:如果使用了合成数据,最好对数据集进行评估,否则可能会因为合成了一批垃圾数据影响模型微调的整体性能;

接下来我们来看看,数据集到底长什么样?


?? 数据集表现形式分类

?? ShareGPT 格式

  • 提出背景
    ShareGPT 格式起初来自于用户在社交平台上分享与聊天模型的对话记录,这些记录涵盖了丰富的多轮对话内容。研究者们意识到,这类真实的对话数据可以帮助模型更好地学习多轮对话的上下文保持、回应生成等能力。因此,ShareGPT 格式逐渐被用于多轮对话的指令微调。

  • 目标
    帮助模型理解复杂的多轮交互,提升模型的对话连贯性、上下文一致性和信息检索能力。

  • 主要应用
    ShareGPT 格式应用于需要模拟自然对话流的场景,例如聊天机器人、客服问答、陪伴式 AI 助手等。其设计结构支持用户与助手之间交替对话的记录,适合训练多轮对话模型。

以下是一个ShareGPT数据示例:

1
2
3
4
5
6{
  "conversations": [
    {"from": "human", "value": "你好,能帮我推荐一部电影吗"},
    {"from": "gpt", "value": "当然可以,你喜欢什么类型的电影呢"}
  ]}


?? Alpaca 格式

  • 提出背景
    Alpaca 格式由斯坦福大学的研究人员在 2023 年提出,他们旨在通过一种低成本的方式对大型语言模型进行指令微调。Alpaca 项目使用 OpenAI 的 GPT-3.5 模型生成了大量指令数据,并采用简化的格式——instruction、input 和 output 字段——来表述单轮任务。这个结构化的指令-响应格式使模型可以专注于对特定任务的理解。

  • 目标
    Alpaca 格式的设计重点在于让模型理解明确的任务指令,以便模型在接到特定任务时能生成更精确的响应。

  • 主要应用
    Alpaca 格式被广泛应用于以任务为导向的指令微调任务中,尤其适合单轮任务(如总结、翻译、问答等),并不依赖多轮对话上下文,结构简洁且任务导向清晰。

以下是一个Alpaca数据示例:

1
2
3
4
5{
  "instruction": "将以下句子转换为被动语态",
  "input": "他们正在修理那辆汽车",
  "output": "那辆汽车正在被修理"}


??两种数据格式的选择对比:

特点

Alpaca 格式

ShareGPT 格式

适用任务

单轮任务(文本生成、翻译、问答等)

多轮对话任务(聊天机器人、客服问答等)

数据结构

简单(instruction、input、output)

复杂(支持多轮对话和多种角色)

开发难度

适合新手

支持交互

简单交互

复杂交互(支持工具调用)



?? 数据集场景分类

微调数据中根据实际的业务场景需求,其数据的内容会有不同,下面罗列几种常见的格式,实际微调数据是大量这些微调指令数据(按照经验,黄金数据量一般在1W~5W左右)。

1. 指令跟随格式

这种格式能够明确地告诉模型需要执行的具体任务和操作,使得模型能够更有针对性地生成符合要求的输出,很好地将预训练模型的通用语言能力引导到特定的任务场景中,增强模型在不同任务上的表现和泛化能力。

使用范围:极其广泛,几乎涵盖了自然语言处理的各类任务,如文本生成、翻译、总结、情感分析、问答等。例如,在文本生成任务中,可以给出 “根据以下关键词生成一篇短文” 的指令;在翻译任务中,指令可以是 “将以下中文句子翻译成英文” 等。

示例:

1
2
3
4
5{
  "instruction": "将以下句子转换为被动语态",
  "input": "他们正在修理那辆汽车",
  "output": "那辆汽车正在被修理"}


2. 多轮对话格式

该格式能够捕捉到对话的上下文信息和交互逻辑,让模型学习如何根据之前的对话历史来生成合适的回复,从而提高对话的连贯性、合理性和自然度,更好地满足用户在实际对话中的各种需求。

使用范围:主要适用于构建和微调对话模型,广泛应用于聊天机器人、智能客服等需要进行多轮交互的场景,以模拟用户与 AI 之间的自然流畅对话

示例:

{
    "conversation": [
        {
            "from": "human", //角色 A
            "value": "你好,能帮我推荐一部电影吗"
        },
        {
            "from": "gpt", //角色 B
            "value": "当然可以,你喜欢什么类型的电影呢"
        },
        {
            "from": "human",
            "value": "我喜欢科幻电影"
        },
        {
            "from": "gpt",
            "value": "那我推荐《星际穿越》,它的剧情和特效都非常精彩"
        }
    ]}


3. 文本对齐数据格式

文本与标签或答案之间的明确对应关系,使得模型能够直接学习到从给定文本到特定推理结果或答案的映射,有助于提高模型在这些需要对文本进行深度理解和准确推理以得出正确结果的任务上的性能。

使用范围:在自然语言推理和问答系统等任务中使用较为广泛

示例:

问题

答案

今天天气怎么样?

今天天气很好

你喜欢吃什么?

我喜欢吃水果


4. 序列到序列数据格式

能够直接对输入序列和输出序列之间的映射关系进行建模,很好地适应了这些任务中需要将一种文本序列转换为另一种文本序列的需求,例如在机器翻译中实现从源语言到目标语言的转换,在对话系统中根据输入的对话历史生成下一轮的回复等 。

使用范围:在机器翻译、对话系统、文本摘要等任务中有着广泛的应用

示例:

源语言

目标语言

我喜欢苹果

I like apples

他在跑步

He is running


3.3 选择模型

微调我们一般是选择基础模型进行微调,有句话叫作“选择大于努力”,虽然不是特别适合这里的说法,但是确实是需要说明下,选译一个合适的基座模型,可以大大提升模型的训练效果,相反,选择一个不适合的模型,再怎么调整训练,也可能达不到业务的目标效果。

选择基础模型没有固定的规则和限定,在大量开源模型中如何选择更适合自己的基础模型呢?给大家分享一些经验:

● 规模定律
大模型的**第一性原理Scaling Law(规模定律)**还是存在的,参数量越大性能越好,但小模型如6B、7B、8B的基本能力:理解、生成、推理等也已经具备;

● 场景优先
在选择模型时一定要理解自己要做的是什么场景,如果是海外业务那最好选择国外开源模型如Llama系列;如果是简单的内容生成场景,就没有必要一味的追求Scaling Law;所以先把场景梳理清楚再选择模型一定会事半功倍~

● 模型架构
不同的模型架构适用不同的任务,基于Transformer架构的编码器(Encoder)部分训练的,对于文本理解类的任务表现很好;基于Transformer架构的解码器(Decoder)部分训练的,对于文本生成类的任务表现很好;结合编码器与解码器的优势,支持多任务联合训练(如翻译、摘要、问答),兼具理解与生成能力;

架构类型

核心能力

典型任务示例

Encoder

上下文理解、语义匹配

文本分类、命名实体识别、情感分析

Decoder

自回归生成、长序列建模

对话生成、代码合成、创意写作

Encoder-Decoder

多任务联合推理与转换

机器翻译、文本摘要、跨模态生成

以下是一些截止目前常见模型偏向性特点分类


● 计算资源
参数量较大的模型需要的计算资源就更多,所以也需要衡量公司能在这件事情上的投入有多大!


下面提供一些选择操作步骤:

  1. 明确任务需求

    • 定义任务类型(分类/生成/多模态)及性能指标(准确率、延迟)。

    • 示例:广告文案生成需关注创意多样性和语法正确性

  2. 评估数据特性

    • 数据规模:小样本任务选择Few-shot能力强的模型(如GPT-3.5)

    • 语言类型:中文任务优先选择ChatGLM-6B、Qwen,避免翻译误差

  3. 资源与成本核算

    • 显存限制:7B模型全参数微调需24GB显存,QLoRA微调仅需12GB

    • 训练时间:轻量模型(如DistilBERT)微调速度比BERT快40%

  4. 筛选候选模型

    • 在Hugging Face或魔搭按标签筛选(如text-classification、zh)

    • 参考论文榜单(如GLUE、CLUE)选择SOTA模型

  5. 实验验证与迭代

    • 使用5%数据快速验证模型适配性,再全量微调

    • 对比多种微调方法(LoRA vs 全参数)的性价比

3.4 微调模型

1.微调工具选择

以前微调大模型比较困难,比如LoRA、Adapter等方法需依赖工具实现低秩分解或适配器注入,手动实现难度高且易出错,理论上也可通过PyTorch/TensorFlow直接修改模型结构,但需自行处理梯度计算、混合精度训练等技术细节,开发成本极高,随着技术的发展,出现了一系列的微调工具,使用这些工具可以简化流程、提升效率、降低资源消耗。常用的微调工具有:Unsloth、Llama- Factory、ModelScope-SWIFT、ColossalAI和Hugging Face Transformers。除此之外,也可以借助更加底层的库,如peft、LoRA、transformer 等实现高效微调。对于初学者来说,首先使用现成工具来进行微调,下面介绍五种常用的工具,每种工具都有自己的特点优势,具体微调根据自己的场景选择。


Unsloth

GitHub主页:https://github.com/unslothai/unsloth

Unsloth 是一个专为大型语言模型(LLM)设计的微调框架,旨在提高微调效率并减少显存占用。 它通过手动推导计算密集型数学步骤并手写 GPU 内核,实现了无需硬件更改即可显著加快训练速度。


Unsloth 与 HuggingFace 生态兼容,可以很容易地transformers、peft、trl 等库结合,以实现模型的监督微调(SFT)和直接偏好优化(DPO),仅需模型的加载方式,无需对现有训练代码进行修改。

主要功能点:

  • 高效微调:Unsloth 通过深度优化,使 LLM 的微调速度提高 2-5 倍,显存使用量减少约 80%,且准确度无明显下降。

  • 广泛的模型支持: 目前支持的模型包括目前各类主流模型,用户可以根据需求适合的模型进行微调。

  • 兼容性: Unsloth 与 HuggingFace态系统兼容,用户可以轻松将其与 traformers、peft、trl 等库结合,实现模型的监督微调(SFT)和直接偏好优化(DPO),仅需修改模型的加载方式,无需对现有训练代码进行过多修改。 内存优化: 通过 4 位和 16 位的 QLoRA/LoRA 微调,unsloth 显著了显存占用,使得在资源受限的环境中也能大的微调。

核心优势:

  • 显著提升微调效率: 相比传统方法,Unsloth 能够在更短的时间内完成微调任务,节省时间成本。

  • 降低硬件要求: 通过优化显存使用,用户可以在显存较小的 GPU 上进行大模型的微调,降低了硬 件门槛。

  • 开源免费: Unsloth 提供开源版本,用户可以在 Google Colab 或 Kaggle Notebooks 上免费试 用,方便上手体验。


总的来说,Unsloth 为大型语言模型的微调提供了高效、低成本的解决方案,适合希望在有限资源下进行模型微调的开发者和研究人员。


LLama-Factory

GitHub主页:https://github.com/hiyouga/LLaMA-Factory

LLaMA-Factory 是一个统一且高效的微调框架,旨在为超过 100 种大型语言模型(LLMs)和视觉

语言模型(VLMs)提供便捷的微调支持。 用户能够灵活地定制模型以适应各种下游任务。


主要功能特点:

  • 广型支持:LLaMA-Factory 支持对 100 多LLMs 和 VLMs 进行微调,包括最新的模型版本,如Llama 3、GLM-4、Mistral Small、PaliGemma2 等。

  • 高效的微调方法:框架集成了多nk Adaptation)、QRA(Quantized LoRA)等,以提高训练速度并减少显存占用。

  • 多模态任务支持:除了传统的文本任务外,LLaMA-Factory 还支频识别、音频理解等多种任务类型。

  • 实验监控:提供了丰富的实验监控工具,如 LlamaBoard、TensorBoard、Wandb、MLflow、练过程。

  • 快速: 框架提供了类似 OpenAI 风格的 API、Gradio UI 和命令行界面,并结合 vLLM worker,实现了高效的推理能力。


ModelScope-SWIFT

GitHub项目主页:https://github.com/modelscope/swift

ModelScope-SWIFT(Scalable lightWeight Infrastructure for Fine-Tuning)是由魔搭社区(ModelScope)开发的高效微调和部署框架,旨在为研究人员和开发者提供一站式的大模型与多模态大模型的训练、推理、评测、量化和部署解决方案。 的模型支持:** ms-swift 支持超过 450 种大型模型(LLMs)和 150 多种多模态大模型(MLLMs)的训练和部署**,包括最新的模型版本,如 Qwen2.5、InternLM3、GLM4、Llama3.3、Mistral、DeepSeek-R1、Yi1.5、Baichuan2、Gemma2 等,以及多模态模型如 Qwen2.5-VL、Qwen2-Audio、Llama3.2-Vision、Llava、InternVL2.5 等。


主要功能和特点:

  • 多样化的训练技术: 框架集oRA、Llama-Pro、LonoRA、GaLore、Q-GaLore、LoRA+、LISA、DoRA、FourierFt、ReFT、UnSloth 和 Liger 等,满足不同的微调需求。

  • 轻量级微调: 支持多种轻量级微调方法,如 LoRA、QLoRA、DoLLaMAPro、Adapt、GaLore、QGalore、LISA、UnSloth、Liger-Kernel 等,降低显存和计算资源的消耗。

  • 分布式训练: 支持分布式数据并行(DDP)、DeepSpeed ZeRO2/ZeRO3、FSDP 等技术,提升推理加速:** 提供 BNBWQ、GPTQ、AQLM、HQQ、EETQ 等量化方法,并支持使用 vLLM 和 LMDeploy 对推理、评测和部署 支持图像、视频和语音等多种模态型训练,涵盖 VQA、Caption、OCR、Grounding 等任务。

  • 用户友好的界面: 提供基于 Gradio 的 We和量化操作,简化了大模型的全链路流程。


ColossalAI

GitHub项目主页:https://github.com/hpcaitech/ColossalAI

Colossal-AI 是一个高效的分布式人工智能训练系统,旨在最大化提升人工智能训练效率,同时最小化训练成本。作为深度学习框架的内核,Colossal-AI 提供了自动超高维并行、大规模优化库、自适应任务调度、内存优化以及最新模型复现等前沿技术。与英伟达的 Megatron-LM 相比,Colossal-AI 仅需一半数量的 GPU 即可完成 GPT-3 训练,半小时内预训练 ViT-Base/32,并在两天内训练完 15 亿参数的 GPT 模型。此外,Colossal-AI 提供了多种并行技术,如数据并行、流水线并行和张量并行,以加速模型训练。

该项目自开源以来,迅速登上 GitHub 热榜,成为解放 AI 生产力的最佳选择。并且,ColossalAI也是目前唯一支持DeepSeek R1非量化模型高效微调的框架,仅需4个节点、8卡A100服务器即可完成DeepSeek R1高效微调。


Hugging Face Transformers

官网地址:https://huggingface.co/transformers/


Hugging Face Transformers 是一个广泛使用的自然语言处理库,在人工智能领域中拥有着极高的知名度和影响力。


主要功能特点

1. 丰富的模型库:数万个预训练模型任你选择

Hugging Face Transformers 提供了数万个可以直接调用的预训练模型,覆盖了多种语言和任务。无论你是从事文本分类、情感分析、机器翻译还是其他自然语言处理任务,都能在这个丰富的模型库中找到适合自己的模型。

这些预训练模型经过了大量数据的训练和优化,具有较高的性能和可靠性。用户可以直接使用这些模型,或者在其基础上进行微调,以满足自己的特定需求。丰富的模型库为用户提供了更多的选择和可能性,大大降低了模型开发的难度和成本。

2. 社区支持:活跃的开源社区助力成长

作为一个活跃的开源社区,Hugging Face 提供了大量的教程、案例和讨论,帮助用户快速上手和解决问题。在这个社区中,用户可以与来自世界各地的开发者交流经验、分享心得,共同推动人工智能技术的发展。

社区支持还体现在模型的不断更新和改进上。开发者们会根据用户的反馈和需求,不断优化和完善模型,使其性能更加出色。同时,社区也会及时发布新的模型和技术,让用户始终站在人工智能技术的前沿。

3. 易于使用:简单快捷的 API 和工具

Hugging Face Transformers 提供了简单的 API 和工具,使得微调和部署模型变得简单快捷。无论你是使用 Python 还是其他编程语言,都能轻松地调用 Hugging Face Transformers 的功能,实现模型的微调和部署。

例如,通过几行代码,用户就可以加载一个预训练模型,并对其进行微调。同时,Hugging Face Transformers 还提供了一些可视化工具,帮助用户更好地理解和分析模型的性能和效果。


总的来说,Hugging Face Transformers 适合需要丰富社区资源和模型库支持的用户,特别是对于初学者和需要快速原型设计的开发者。它的丰富模型库、社区支持和易于使用的特点,为用户提供了强大的工具和平台,助力他们在人工智能领域中快速成长。


以下是上面五种大模型微调工具对比表,大家在选择时候结合技术特性、适用场景及核心优势进行综合分析确定。


五大微调工具对比表:

工具特性

Unsloth

LLaMA-Factory

ModelScope-SWIFT

ColossalAI

Hugging Face Transformers

核心定位

极致速度优化

多模型适配与低代码开发

中文场景与多模态支持

超大规模分布式训练

NLP标准化生态与社区支持

支持模型

Llama、Mistral、Yi等主流模型

LLaMA、ChatGLM、Qwen等200+模型

通义千问、Yi、ChatGLM等中文模型

OPT、GPT等超大模型

BERT、GPT、T5等30万+模型

微调方法

LoRA、QLoRA、全参数微调

LoRA、QLoRA、Freeze、全参数

LoRA、QLoRA、DPO、多模态微调

混合并行训练、ZeRO优化

PEFT、Adapter、Prefix Tuning

显存优化

Triton加速内核(显存降80%)

4/8-bit量化、梯度检查点

FlashAttention-2、NEFTune

异构内存管理(CPU+GPU)

原生混合精度训练

训练速度

单卡加速2-5倍

多卡分布式训练优化

中文数据集预处理加速

千亿级参数分布式训练

依赖社区优化(如DeepSpeed)

部署灵活性

轻量化推理引擎

Web UI/CLI/API多接口支持

魔搭社区一键部署

需集群环境支持

ONNX/TensorRT导出

应用场景

单卡快速迭代、实时响应需求

企业级多任务微调、量化生产

中文业务适配、多模态生成任务

超大规模模型全参数训练

学术研究、多任务原型验证


工具特性详解与适用场景推荐

1. Unsloth

  • 核心优势:通过算法优化(如Triton计算内核)显著提升单卡训练速度,显存占用降低80%,适合个人开发者或小团队快速迭代

  • 适用场景:

    • 资源受限环境下的实时微调(如单卡RTX 4090训练7B模型)。

    • 需要快速验证生成任务效果(如广告文案生成、对话系统优化)。

2. LLaMA-Factory

  • 核心优势:支持超200种模型架构,提供无代码Web UI界面(LlamaBoard),集成LoRA/QLoRA等高效微调方法,适配NVIDIA GPU、Ascend NPU等多硬件

  • 适用场景:

    • 企业级多任务联合训练(如客服意图分类与对话生成联合优化)。

    • 需量化部署的轻量化场景(如边缘设备部署Yi-6B模型)。

3. ModelScope-SWIFT

  • 核心优势:深度整合阿里魔搭社区资源,支持中文优化模型(如通义千问)和多模态任务(图文生成、音频处理),提供本地化部署方案

  • 适用场景:

    • 中文垂直领域任务(如法律合同生成、医疗报告摘要)。

    • 多模态联合训练(如电商图文广告生成、视频内容理解)。

4. ColossalAI

  • 核心优势:专为千亿级参数模型设计,通过ZeRO优化和异构内存管理实现超大规模分布式训练,支持CPU Offloading降低显存压力

  • 适用场景:

    • 企业级超大规模模型预训练(如GPT-3级别模型全参数微调)。

    • 需多节点GPU集群协同的高性能计算场景。

5. Hugging Face Transformers

  • 核心优势:覆盖30万+预训练模型,社区活跃度高,生态工具链完善(如Datasets、Accelerate),适合灵活调整底层逻辑

  • 适用场景:

    • 学术研究与多任务原型设计(如新微调方法验证)。

    • 依赖社区支持的快速问题解决(如复用开源微调配置)。

选型建议

  1. 单卡快速迭代:优先选择 Unsloth(速度极致)或 Hugging Face + PEFT(灵活性高)

  2. 中文业务适配:推荐 ModelScope-SWIFT(中文优化)或 LLaMA-Factory(多模型支持)

  3. 超大规模训练:必选 ColossalAI(分布式优化)

  4. 企业级生产部署:组合 LLaMA-Factory(训练) + ModelScope(部署) 实现全流程闭环


2. 需硬件与服务器环境搭建

大模型微调属于大模型进阶类技术,不同于普通的模型对话或搭建基础应用,微调往往需要一定的软硬件条件支持。

大模型微调不同尺寸模型、不同精度微调时所需显存需求,可以参考这里的表格:大模型配置硬件参考自查表

操作系统选择

而操作系统方面,由于绝大多数工业场景下微调会涉及多卡微调,目前只有Linux系统对DeepSpeed和其他多卡并行加速库支持较好,因此绝大多数工业场景下都会使用Ubuntu操作系统或CentOS操作系统。本节公开课我们以Ubuntu系统为例来进行高效微调。


软件环境

根据选择的微调技术和使用的工具,需要安装对应环境,具体见工具使用说明。


3. 监控分析工具

在大模型微调过程中,监控工具用于跟踪训练指标、优化超参数、分析模型性能并提升调试效率。结合主流微调方法(如LoRA、QLoRA、DoRA、Freeze-tuning等)和搜索结果,梳理常用监控工具及其适用性,如下表:

工具名称

核心功能

适用微调方法

优势与场景

Weights & Biases(WandB)

- 实时记录训练损失、准确率等指标- 超参数调优(如学习率、秩)- 模型权重分布可视化

全类型微调(LoRA、QLoRA、Freeze-tuning等)

跨框架通用性强,支持多任务对比,适合需要深度分析和团队协作的场景

TensorBoard

- 训练过程曲线可视化- 激活值/梯度分布跟踪- 注意力权重分析

全参数微调、LoRA、Adapter Tuning

与PyTorch/TensorFlow深度集成,适合单机调试和底层细节分析

LlamaBoard

- 内置LLaMA-Factory的Web UI监控- 多任务指标对比- 分布式训练状态跟踪

LoRA、QLoRA、DoRA、Freeze-tuning等

零代码操作,适合快速验证不同微调方法的性能差异

MLflow

- 实验流程管理- 模型版本控制- 参数与指标追踪

全参数微调、高效微调(需手动集成)

企业级模型生命周期管理,适合生产环境多版本迭代

Finbervis

- 序列分类任务错误分析- 多标签预测概率可视化

冻结层微调、全参数微调(如BERT序列分类)

专注于NLP分类任务的可解释性,适合调试语义理解错误


工具与微调方法的适配性选择思路

  1. 通用型工具(如WandB)

    • LoRA微调:监控低秩矩阵的梯度变化与训练损失曲线。

    • QLoRA微调:跟踪量化误差对模型性能的影响。

    • 适配方法:支持所有微调方法(包括LoRA、QLoRA、DoRA等),通过API记录训练指标和参数

    • 示例:

    • 限制:需手动集成到训练代码,但对微调方法无硬性限制

  2. 专用型工具(如LlamaBoard、Finbervis)

    • LlamaBoard:专为LLaMA-Factory设计,支持其集成的LoRA、QLoRA、GaLore等方法

    • Finbervis:聚焦BERT类模型的序列分类任务,适配冻结层微调

    • 适配方法:

    • 优势:深度集成框架特性(如显存优化策略),提供自动化分析

  3. 分布式训练工具(如DeepSpeed、ColossalAI)

    • 适配方法:全参数微调、混合并行训练(需与ZeRO优化结合)

    • 监控重点:显存占用、多卡通信效率、梯度同步状态


对于大多数人,比较适合选择使用WandB,它提供了以下几个重要的功能:

  • 实时可视化:WandB可以实时展示训练过程中关键指标的变化,如损失函数、学习率、训练时间等。通过这些可视化数据,我们能够直观地了解模型的训练进展,快速发现训练中的异常或瓶颈。

  • 自动记录与日志管理:WandB会自动记录每次实验的参数、代码、输出结果,确保实验结果的可追溯性。无论是超参数的设置,还是模型的架构调整,WandB都能够帮助我们完整保留实验记录,方便后期对比与调优。

  • 支持中断与恢复训练:在长时间的预训练任务中,系统中断或需要暂停是常见的情况。通过WandB的checkpoint功能,我们可以随时恢复训练,从上次中断的地方继续进行,避免数据和时间的浪费。

  • 多实验对比:当我们尝试不同的模型配置或超参数时,WandB允许我们在多个实验之间轻松进行对比分析,帮助我们选择最优的模型配置。

  • 团队协作:WandB还支持团队协作,多个成员可以共同查看实验结果,协同调试模型。这对研究和项目开发中团队的合作非常有帮助。





4、超参数设置

超参数 (hyperparameters) 是大模型微调开始学习过程之前设置的参数,在我进行微调前,需要设置这些参数,超参数是一种配置项,可以使用它们来影响或控制训练 LLM 的过程。与模型参数或权重不同,超参数不会随着训练数据的传递而改变;相反,它们是模型的外部设置,在训练开始之前设置。尽管它们控制了 LLM 的训练过程,但它们不会成为最终基础模型的一部分,我们无法确定模型在训练时使用了哪些超参数。

超参数调优是在训练过程中调整不同超参数的过程,目标是找到能产生最优输出的组合

设置训练参数:学习率

在深度学习中,学习率(Learning Rate)是一个非常重要的参数,它决定了每次模型参数更新的步伐大小。学习率可以理解为模型“学习”的速度。如果学习率设置得太大,模型可能会在训练过程中跳过最优解,无法正确收敛;而如果学习率太小,模型的学习过程会非常缓慢,甚至可能陷入局部最优解,难以得到最佳效果。

选择合适的学习率是模型训练中的一个挑战。一般来说,可以从较小的值(例如 0.001 或 0.01)开始,然后根据训练效果逐步调整。此外,还可以使用学习率调度器,在训练过程中动态调整学习率,使模型在不同阶段有不同的学习速度。

下面是一个简单的 PyTorch 代码示例,展示了如何设置学习率并使用学习率调度器动态调整它:

import torchimport torch.optim as optim# 定义一个简单的线性模型model = torch.nn.Linear(10, 2)# 设置初始学习率learning_rate = 0.01optimizer = optim.SGD(model.parameters(), lr=learning_rate)# 使用学习率调度器来动态调整学习率scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.1)# 在每个epoch结束后调整学习率for epoch in range(50):    # 模型训练过程...
    scheduler.step()    print(f'Epoch {epoch+1}: 当前学习率: {scheduler.get_last_lr()}')

示例中,学习率调度器 StepLR 会每过10个 epoch 把学习率降低到原来的 0.1 倍,确保模型在训练后期学习得更为精细


?? 常见问题与解决方案:

  • 学习率过大:模型的损失值会在训练过程中剧烈波动,表现为训练不稳定,甚至无法收敛。解决方案:尝试减少学习率,或引入学习率调度器。

  • 学习率过小:模型训练速度非常慢,可能需要很长时间才能收敛,或者最终只能达到局部最优解。解决方案:适当增大学习率,确保模型能够快速进入优化阶段


如何高效加载训练数据

在深度学习的训练过程中,我们通常使用大量的数据来让模型从中学习。为了高效地处理这些数据,我们拿PyTorch的 DataLoader为例,它可以将数据集分批次加载,并支持多线程处理,加快数据的加载速度。

DataLoader 可以自动将数据分成小批次(mini-batches),并在每次训练循环中将这些小批次逐一传递给模型。这样做的好处是,能够节省内存并且加快计算速度。

下面是一个典型的代码示例:

from torch.utils.data import DataLoader, TensorDataset# 假设我们有一些数据和标签data = torch.randn(100, 10)  # 随机生成100条数据,每条数据有10个特征labels = torch.randn(100, 2)  # 随机生成100条对应的标签,每个标签有2个值# 创建数据集dataset = TensorDataset(data, labels)# 使用 DataLoader 加载数据,设置每批次数据大小为32dataloader = DataLoader(dataset, batch_size=32, shuffle=True)# 在训练过程中使用for batch_data, batch_labels in dataloader:    # 在这里你可以对 batch_data 和 batch_labels 进行操作
    output = model(batch_data)
    loss = criterion(output, batch_labels)


?? 常见问题与解决方案

  • 数据加载过慢:默认情况下,DataLoader 是单线程的。为了提高数据加载速度,可以通过设置 num_workers 参数来启用多线程加速数据加载,例如 DataLoader(dataset, batch_size=32, num_workers=4)。

  • 数据不平衡:如果你的数据集存在类别不平衡问题,模型可能会对某些类别的样本表现得更好,而忽略了其他类别。解决方法是使用加权损失函数或采样技术,以确保每个类别在训练中得到合理的权重。


前向传播:模型如何生成预测结果

前向传播 是模型训练中的关键步骤,它描述了如何从输入数据中生成预测结果。在这个阶段,模型会根据当前的参数,逐层计算每个神经元的激活值,最终得到输出结果。前向传播是一个单向的计算过程,不涉及参数更新。

代码示例:

1
2# 前向传播:根据输入数据生成预测结果output = model(batch_data)


前向传播的计算流程如下:

  1. 将输入数据传入第一层神经网络。

  2. 经过激活函数的处理,传递到下一层。

  3. 依次传递,直到最后一层生成最终的输出结果


?? 常见问题与解决方案

  • 输出不稳定:如果模型输出的结果不稳定,可能是因为模型初始化不当或者学习率设置不合适。解决方案是使用标准的初始化方法(如 He 初始化或 Xavier 初始化),并调试学习率。


计算损失:衡量模型的预测效果

损失函数 是用于衡量模型预测结果与真实标签之间差距的函数。损失函数的值越小,说明模型的预测结果越接近真实值。常见的损失函数有均方误差(MSE,适用于回归问题)和交叉熵损失(Cross-Entropy,适用于分类问题)。

代码示例:

# 选择损失函数,这里使用均方误差(MSELoss)criterion = torch.nn.MSELoss()# 计算损失loss = criterion(output, batch_labels)

在这个示例中,我们使用了均方误差损失函数 MSELoss,它计算模型输出 output 和真实标签 batch_labels 之间的差距,返回一个损失值 loss。这个损失值反映了模型的预测误差。


?? 常见问题与解决方案

  • 损失值过高:如果损失值过高,说明模型的预测效果较差。可以尝试调低学习率,或者增大模型的容量(增加神经网络的层数或宽度)。

  • 损失值震荡:如果损失值在训练过程中剧烈波动,可能是学习率过大,尝试使用更小的学习率,或采用学习率调度器。


反向传播:更新模型参数

反向传播 是深度学习中的核心算法,它通过计算损失函数对每个模型参数的偏导数,进而更新模型的参数。反向传播使用的是链式法则,将误差逐层传播回去,以指导每一层的参数更新。

在反向传播中,模型首先计算损失函数的梯度,然后根据这些梯度更新模型参数。我们通常使用优化器(如 SGD 或 Adam)来完成这个过程。

代码示例:

# 清除之前的梯度optimizer.zero_grad()# 反向传播:计算梯度loss.backward()# 更新模型参数optimizer.step()


验证与调整:避免过拟合与欠拟合

?? 什么是过拟合与欠拟合

  • 过拟合:模型在训练集上表现很好,但在验证集上表现较差,说明模型过于“记住”了训练集的数据,无法推广到新的数据。

  • 欠拟合:模型在训练集和验证集上都表现不佳,说明模型的容量不足,无法很好地拟合数据。


避免过拟合方法:

  • 增加数据:通过数据增强(如随机裁剪、旋转等)增加数据集的多样性。

  • 正则化:使用正则化技术(如 L2 正则化或 Dropout)来防止模型过于复杂。


代码示例(使用 Dropout):

# 在模型的某一层添加 Dropoutdropout_layer = torch.nn.Dropout(p=0.5)# 在前向传播时,应用 Dropoutoutput = dropout_layer(model(batch_data))


?? 常见问题与解决方案

  • 过拟合严重:可以尝试增加数据集的规模,或者减少模型的复杂度(如减少层数或神经元数量)。

  • 欠拟合:增加模型的复杂度,或者训练更长时间。


重复上述步骤,直到模型收敛

模型训练是一个反复迭代的过程,我们会多次执行前面的步骤,直到模型在验证集上表现稳定为止。

训练循环

for epoch in range(num_epochs):
    model.train()  # 切换到训练模式
    for batch_data, batch_labels in dataloader:
        output = model(batch_data)
        loss = criterion(output, batch_labels)
        
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()    # 进行验证
    model.eval()    with torch.no_grad():
        val_output = model(validation_data)
        val_loss = criterion(val_output, validation_target)        print(f'Epoch {epoch+1}, 验证损失: {val_loss.item()}')
    
    scheduler.step()


? 核心要点

  • 学习率调优 是训练模型的重要一环,可以通过调度器动态调整。

  • DataLoader 提供了高效的数据加载方式,加快训练速度。

  • 损失计算和反向传播 是模型学习的核心,通过优化器进行参数更新。

  • 验证集 可以帮助我们监控模型的性能并避免过拟合。


在以上训练和验证过程中需要反复调整超参数,并通过监控分析工具,以及验证集数据验证,来确定模型的效果,超参数调优不仅仅是一项技术活动,更是一种艺术,它要求我们对模型有深刻的理解,对数据有敏锐的洞察,以及对目标有清晰的认识,才能达到相对比较好的微调训练目标。

3.5 合成新模型

如果不是全参数微调,微调后的只是部分权重数据修改,比如LoRA微调适配器,不希望在每次推理的时候分别加载预训练模型和 LoRA 适配器,就需要把模型权重合并到一个单一的模型,以达到以下目的:

  • 简化部署:合并权重可以将多个模型简化为一个,从而降低部署和维护的复杂性。

  • 提高性能:通过合并多个模型的优点,可以获得性能更优的模型。

  • 资源优化:减少需要存储和加载的模型数量,从而节省计算资源。


根据微调技术和微调工具的选择,合并大致操作手法基本差不多,细节上稍有些区别,合并过程中,有一个选择是否进行量化。

什么是量化?

在完成模型合并并获得完整模型后,为了优化部署效果,人们通常会基于显存占用、使用成本和推理速度等因素,选择通过量化技术对模型进行压缩,从而实现更高效的部署。

量化(Quantization)通过数据精度压缩有效地减少了显存使用并加速推理。比如LLaMA-Factory 支持多种量化方法,包括:

  • AQLM

  • AWQ

  • GPTQ

  • QLoRA

关于量化的设置,本文不展开详说,请查阅本书后续相关学习篇幅。


以下是一个Python脚本来使用ModelScope-swift合并模型权重的示例:

import ms_swift

model_weights = [    "model_A.pth",    "model_B.pth"]

output_weight = "merged_model.pth"ms_swift.merge_weights(model_weights, output_weight)print(f"模型权重已合并到 {output_weight}")


四、总结

本文比较系统性地介绍了大模型微调技术,包括定义、原理、分类以及微调的关键步骤,全文偏理论介绍性为主,实践内容不多,希望阅读人员对微调有一个系统性的全面认知,以此文为引子,进入大模型微调这个领域。


关联文档