想让大模型说人话?SFT(监督微调)是关键!手把手教你微调技巧!
本文系统梳理了大模型微调技术,重点探讨了监督微调(SFT)和参数高效微调(PEFT)方法。首先将微调技术分为全参数微调、部分参数微调和PEFT三类,详细分析了各类方法的优缺点。随后聚焦监督微调SFT,阐述了其数据要求与指令微调特点。在PEFT部分,重点介绍了LoRA、Prefix-Tuning等主流方法及其实现原理。最后分析了SFT阶段产生幻觉的原因及应对策略,包括数据质量控制、知识冲突缓解等技术
1. 微调技术分类
微调按照训练的参数范围可以分为全参数微调(Full Fine-Tuning)和部分参数微调(Partial Fine-Tuning)。参数高效微调PEFT(Parameter-Efficient Fine-Tuning)则是一系列具体的高效微调的方法和策略,有的资料中直接分为了全参数微调和高效参数微调两类。
微调按照训练策略可以分为监督微调SFT(Supervised Fine-Tuning)、基于人类反馈的强化学习RLHF(Reinforcement Learning with Human Feedback)、直接偏好优化DPO(Direct Preference Optimization)。其中后两者RLHF和DPO都属于基于强化学习的偏好对齐训练方法。
本文聚焦监督微调SFT及具体的参数高效微调PEFT方法, 探讨其概念组织及关键细节。基于强化学习的RLHF和DPO我们后续专题研究。
1.1 全参数微调
全参数微调指在微调过程中对所有的参数进行训练和更新,这也是最直接传统的微调方式。其实现简单,但因所有参数都参与反向传播与梯度更新,全参微调对GPU资源的需求很高。另外如之前增量预训练及微调的描述,全参数微调因所有参数参与更新,易导致模型过度适配新任务,丢失预训练阶段学习的通用能力,即灾难性遗忘问题。
1.2 部分参数微调
部分参数微调也称选择性微调,指训练中仅更新模型部分参数,而冻结其他参数的方法。这种方法在节省GPU、降低过拟合及提高效率方面具有显著优势。 部分参数微调按照调整的参数不同可分为:
- 输入层参数微调:在输入层的模态、结构、数据分布及token有新增等情况下可以选择仅微调输入层
- 输出层参数微调:当所需训练模型任务的输出要求与原模型不同时,可以选择仅微调输出层。
- 局部结构调整:可以对模型结构中的特定结构进行微调。
此类方法适用于任务差异较小或数据稀缺的场景。若新任务与预训练目标差异过大(如新增输出模态),仅调整局部参数可能无法充分适配。
1.3 PEFT
PEFT是一个更广泛的概念,包含多种技术如LoRA、Prefix Tuning等,PEFT通过引入少量可训练参数(如适配器模块、低秩矩阵)冻结原模型大部分参数,实现计算资源消耗降低与过拟合风险控制,同时保持与原模型相近的性能。
2. 监督微调SFT
监督微调SFT指在预训练模型基础上,基于其具备的知识和能力(如通用知识和语言理解能力等),利用标注数据进一步训练,以增强模型在特定任务上的处理能力。SFT作为监督学习的代表方法,通过结构化指令数据训练模型,是当前实现指令微调最主流且高效的技术路径。相比于预训练,预训练相当于是在背书,在学习知识,而SFT则相当于在刷专业题库后对答案,用此提升自己。
监督微调(SFT)本质是一种训练范式,依赖标注数据(输入-输出对)调整预训练模型参数,使其适应新的特定任务。
SFT的目标是激发预训练模型已具备的知识,并学习特定任务规则与稳定输出格式,而非注入新知识(如世界常识)。新知识需通过增量预训练注入。
2.1 监督微调的数据
SFT的标注数据由与目标任务相关的输入-输出对组成。如:问答对(问题及其答案)、文本分类(文本及其类别)、情感分析(文本及其情感)、翻译(一种语言的文本及其翻译)和摘要(长文本及其摘要)。
优质SFT数据集应包含:输入提示(prompt)、预期模型响应(response)、上下文信息(context)。 高质量SFT数据集需满足:
- 格式统一性:回答风格一致(如先复述问题再解答);
- 难度覆盖性:包含常规样本与边界困难样本;
- 标签平衡性:避免任务数据比例失衡导致模型偏向高频任务。
对于SFT来说,不同的目标任务类型所需的数据格式是不一样的,但通常来说在领域微调时,建议先用指令数据构建基础能力,再叠加领域专用数据细化性能。
2.2 指令微调
指令微调(Instruction Tuning)是SFT的一种具体应用场景,其训练数据格式为 “指令-输入-输出”(例如 {"instruction": "总结文章", "input": "文本内容", "output": "摘要"}),目标是教会模型理解并执行自然语言指令。提高模型在执行特定任务时模型理解和遵循自然语言指令的能力。也减少了因果预测模型的下一个词预测目标与用户对指令遵循的需求之间的差距。指令微调侧重于使LLM在面向任务的方式中更易于控制并与人类意图对齐。虽然一般的SFT可以提高特定任务的性能,但指令微调专门训练模型有效地解释和执行指令,从而产生更可预测和用户友好的行为。
指令微调通过多样化指令模板(如改写、反问、角色扮演)训练模型泛化到未见指令,而常规SFT更侧重固定任务格式下的精度提升。
指令微调除了采用目前主流的监督微调SFT的训练范式外,还可以作为RLHF/DPO强化学习的前置步骤,或与提示词微调(Prompt Tuning)协同。
3. 参数高效微调
常用的参数高效微调方法有LoRA系列(LoRA, AdaLorA, QLoRA, PiSSA, OLoRA, DoRA等),Prompt系列(Prefix-Tuning, Prompt Tuning, P-Tuning),Adapter Tuning等
3.0 网络图示
作者以Qwen3-0.6B模型为例,展示了LoRA系列、Prompt系列及Adapter相应的模块在网络架构中的位置,放到详细介绍各方法之前,以便有个直观的理解。 其中网络结构的一些细节还需调整,后面有机会在单独文章详细分析qwen及deepseek的网络结构。

这份完整版的大模型 AI 学习和面试资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

3.1 LoRA
低秩适配(Low-Rank Adaptation,LoRA)微调方法由微软于2021年发表,其核心思想在与微调前后模型的参数矩阵具有低秩性。基于此内在低秩特性,可对原参数增加旁路矩阵来模拟全参数微调。
LoRA微调是目前最通用、效果最好的微调方法之一,而且能和其它参数高效微调方法有效结合。并且基于其分离特性,并且LoRA部分参数足够小,可以基于一个预训练模型针对不同任务训练不通的LoRA模型,可以按需加载一个大的基础模型及对应的具体任务LoRA部分模型。

具体实现步骤为:
-
在原始预训练模型的参数矩阵旁边增加一个旁路,做一个降维矩阵A(dr)后再乘升维B(rk)的操作。这里d为模型隐层输入特征大小,k为模型层输出特征大小。
-
训练的时候固定原参数,只训练降维矩阵A与升维矩阵B。而模型的输入输出维度不变,输出时将 BA 与原参数叠加。
LoRA的实践
-
A和B的初始化:用随机高斯分布初始化 A ,用 0 矩阵初始化 B ,保证训练的开始此旁路矩阵依然是 0 矩阵。
-
LoraConfig参数设置:
-
r:秩大小,即旁路矩阵的秩大小。通常设置较小的值,如4,8,16,默认8。秩的大小直接影响最终的参数大小,过高的秩可以具备更多的参数取学习复杂模式,但可能会导致参数数量过多,从而导致训练速度变慢及过拟合。
-
lora_alpha:lora 缩放因子,用于控制 lora 矩阵的大小。用于调节模型参数的权重对原始权重的影响,通常值为r,但也可以设置为r的两倍,这会放大LoRA带来的影响,更偏向于学习新的知识。
-
lora_dropout:在训练时随机丢弃一部分lora激活的概率。默认0,推荐设置0-0.1
-
target_modules:需要 lora 化的模块名称,例如 ["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"]
-
以qwen3-0.6B的模型为例,模型原始结构为
Qwen3ForCausalLM(
(model): Qwen3Model(
(embed_tokens): Embedding(151936, 1024)
(layers): ModuleList(
(0-27): 28 x Qwen3DecoderLayer(
(self_attn): Qwen3Attention(
(q_proj): Linear(in_features=1024, out_features=2048, bias=False)
(k_proj): Linear(in_features=1024, out_features=1024, bias=False)
(v_proj): Linear(in_features=1024, out_features=1024, bias=False)
(o_proj): Linear(in_features=2048, out_features=1024, bias=False)
(q_norm): Qwen3RMSNorm((128,), eps=1e-06)
(k_norm): Qwen3RMSNorm((128,), eps=1e-06)
)
(mlp): Qwen3MLP(
(gate_proj): Linear(in_features=1024, out_features=3072, bias=False)
(up_proj): Linear(in_features=1024, out_features=3072, bias=False)
(down_proj): Linear(in_features=3072, out_features=1024, bias=False)
(act_fn): SiLU()
)
(input_layernorm): Qwen3RMSNorm((1024,), eps=1e-06)
(post_attention_layernorm): Qwen3RMSNorm((1024,), eps=1e-06)
)
)
(norm): Qwen3RMSNorm((1024,), eps=1e-06)
(rotary_emb): Qwen3RotaryEmbedding()
)
(lm_head): Linear(in_features=1024, out_features=151936, bias=False))
在
r=16, lora_target_modules = ["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"]
的lora参数下将其转为lora的模型后,其网络结构中属于lora_target_modules的Linear替换为新结构中的lora.Linear。
以某层self_attn中的q_proj为例,其 Linear(in_features=1024, out_features=2048, bias=False)变为新的lora.Linear
lora.Linear(
(base_layer): Linear(in_features=1024, out_features=2048, bias=False)
(lora_dropout): ModuleDict((default): Dropout(p=0.05, inplace=False))
(lora_A):ModuleDict((default):Linear(in_features=1024, out_features=16, bias=False))
(lora_B):ModuleDict((default):Linear(in_features=16, out_features=2048, bias=False))
(lora_embedding_A): ParameterDict()
(lora_embedding_B): ParameterDict()
(lora_magnitude_vector): ModuleDict()
)
3.2 基于Prompt的微调
与基于LoRA的微调不同, 另一类是从模型的提示词入手,思路从人工设计prompt文本或训练出最佳的可作为提示词的向量,将其与输入或模型的各层做拼接以优化模型的输出效果。这些在前缀添加的prompt可以是硬文本提示的形式,也可以是不可见的可训练的prompt向量,通过影响模型注意力计算的过程,对后续的输出起到一定的引导作用。
基于Prompt的微调方法有Prefix-Tuning,Prompt Tuning,P-Tuning(v1/v2)等。
3.2.1 Prefix-Tuning
在Prefix-Tuning 此之前,主要是人工设计模板或自动化搜索离散的模板, 但在实践中人工设计的模板对模型性能的影响很不稳定, 自动搜索得到的模板很大可能并非最优。 Prefix-Tuning由斯坦福大学的研究人员提出,该方法通过通过在输入序列前添加一组可训练的前缀来传递额外的输入信息, 与输入信息共同经模型的注意力机制模块处理。 prefix部分通常会添加到attention模块的k和v部分, 在输入token之前构造一段任务相关的virtual tokens作为prefix,然后训练的时候冻结预训练模型中的参数,只更新prefix部分的参数
prefix-Tuning的实现步骤: 前缀构造:在输入数据前增加一段由自由参数组成的虚拟令牌序列,这些令牌不必是词表中的真实词,而是可训练的嵌入向量。 训练过程:在训练过程中,只更新前缀部分的参数,而模型的其他部分(如Transformer层)保持不变。为了防止训练不稳定,通常在前缀层前添加MLP结构。 应用实例:对于文本生成任务,如摘要生成,Prefix Tuning可以引导模型提取输入中的核心信息并生成摘要。

如图示意, 上半部分是微调全部参数时,所有参数都参与训练,每个任务的模型都保留整个副本。而下方是prefix-tuning示意,只微调prefix部分参数,也可针对每种任务只保存这部分的内容。
3.2.2 Prompt Tuning
Prompt Tuning由Google的研究团队提出,可以看做是Prefix-Tuning的简化版本。它给每个任务定义自己的prompt,然后拼接到数据上作为输入。其只在输入层加入prompttokens,并且不需要MLP。

这图是多任务模型微调和Prompt Tuning训练方式的对比 普通模型微调需要为每个下游任务创建基于预训练模型的任务特定副本,并需独立进行训练。而Prompt Tuning则只需为每个任务存储一个任务相关的prompt,并可基于原始预训练模型进行多任务处理。
Prompt Tuning和Prefix-Tuning都是参数高效微调的方法,其主要区别体现在:
- 参数更新位置:Prompt Tuning只在输入层添加参数,而Prefix-Tuning在每一层都添加参数。
- 参数更新数量:Prefix-Tuning因为在每一层都增加了可微调的前缀,比Prompt有更多的参数
- 任务能力:Prompt Tuning更适合于分类任务,Prefix-Tuning更适合于生成任务。
- 重参数化模块:Prompt Tuning无须借助额外的重参数模块(如MLP结构)训练过程更加稳定
- 性能差异:Prefix-Tuning因在每一层添加前缀参数,效果通常优于Prompt Tuning(仅输入层调整),但训练开销增加 30%~50%;后者更适用于分类任务或低资源场景。
3.3.3 P-Tuning和P-Tuning v2
P-Tuning和P-Tuning v2 由清华大学的研究团队提出,与prefix-Tuning原理类似,都属于基于提示词的微调系列, 更适合用于NLU,未做过多研究,感兴趣的可以查阅响应资料,在此不再赘述。
3.4 Adapter-Tuning
Adapter Tuning 通过在 Transformer 的每层插入用于下游任务的适配器模块,在微调时将模型主体冻结,并仅训练与特定任务相关的参数以进行高效参数微调。 其主要思想是:
-
设计特定的可嵌入transformer层的Adapter结构
-
在每个transformer的MHA和FFN层之后插入Adapter层
-
仅训练Adapter层和Layer Norm的参数,冻结模型主体的参数
-
针对新的下游任务增加新的Adapter层,避免全量微调及灾难性遗忘问题
在论文https://arxiv.org/pdf/1902.00751中附图显示adapter插入位置如下:

实践中,复杂任务的prefix训练需更长的前缀(建议50-100 tokens),以编码更丰富的任务指令,但更长的前缀会影响输入向量。
Adapter层的加入会延长推理路径,导致推理延迟增加 15%~20%。可通过参数剪枝或动态激活策略缓解。但在通常情况下,与LoRA相比并没有明显优势。
3.5 PEFT总结
在PEFT的各种方法中,LoRA是最通用、效果最好的微调方法之一,而且能和其它参数高效微调方法有效结合。其在训练效率、GPU资源节省、场景适用和多任务适配方面均表现良好。 LoRA的Adapter权重可以和模型主体合并,不会增加额外的推理开销。 基于Prompt的微调因增加了序列长度,可能导致推理开销和延迟增加,需要考虑模型的实际使用场景。 Adapter Tuning则因为增加的适配层增加了模型深度,也相应增加了模型的推理开销。
4. SFT阶段的幻觉因素与应对
幻觉(Hallucination)指模型生成的内容看上去合理,但实际是错误、虚构甚至与事实相悖的,也就是一本正经的胡说八道。
在本系列前面一篇文章中探讨了知识注入,SFT的作用应该尽可能是教会模型怎么更好的应用在预训练阶段加入的知识,而不是增加新知识。在SFT微调阶段加入的新知识越多,一方面会导致旧通用知识的灾难性遗忘,另一方面也会导致新知识在模型中产生幻觉。并且注入的新知识占比越多,幻觉会越严重。
4.1 SFT阶段幻觉的主要原因有:
1. 数据质量缺陷
-
低质数据污染:SFT数据若包含错误、过时或矛盾信息,模型会学习并复现这些错误。如错误答案、陈旧答案等都会误导模型的能力。
-
标注偏差:人工标注的主观性可能导致答案偏离客观事实。例如标注员基于个人经验补充细节,引入不准确信息。
2. 知识冲突与过度自信
-
新旧知识冲突:SFT引入的新知识可能与预训练知识冲突,造成模型可能混淆两者。
-
过度自信行为:SFT要求模型模仿专家答案,导致其对不确定问题也生成“确定”回答,而非承认未知。
3. 任务泛化不足
-
指令理解偏差:模糊或多意图指令导致模型自由发挥,生成与需求无关的内容。
-
长尾任务覆盖不足:专业领域或长尾领域场景数据缺乏(如罕见病诊疗、工业生产新技术等),模型被迫“脑补”答案。
4. 训练策略缺陷
-
灾难性遗忘:过度微调使模型遗忘预训练通用知识,降低基础事实一致性。
-
过拟合:小规模SFT数据上过度训练,导致模型机械复制训练样本,缺乏泛化能力。
4.2 SFT阶段幻觉的解决方案
1. 构建高质量SFT数据
-
数据筛选标准:数据集的指令需具体、无歧义。答案需真实(引用权威来源)、连贯(逻辑清晰)、无害(避免误导)。
-
知识动态更新:整合最新权威数据,定期刷新SFT数据集,对争议性问题提供多视角答案,避免以偏概全
2. 知识冲突缓解技术
-
对比学习微调:在SFT数据中显式加入冲突样本对(如旧知识vs新研究),训练模型区分优先级及时间等因素。
-
不确定性建模:在数据集中引入“拒绝回答”样本:训练模型在不确定时输出“需查证”而非虚构答案。
3. 模型行为校正策略
-
渐进式微调(Progressive Tuning):分阶段调整学习率:初期低学习率保护预训练知识,后期提高以适配新任务。
-
任务分层微调:对高频任务(如诊断建议)使用高置信数据;对低频任务(如罕见病)结合RAG检索增强,减少直接生成。
4. 融合外部验证机制
-
SFT-RAG协同:不纯依靠大模型能力,在生成答案前先检索知识库,强制模型参考外部证据。
-
自我校验:设计类似CoT一样的思考能力,首轮生成答案,第二轮以“批判者”身份检查逻辑矛盾。
后记:
自上一篇之后一直在整理本文的内容,一些内容自己了解,但要系统化的整理出来却是非常耗费耐心,需要对每句话、每个图、每个网络结构的表述进行查证,又拖到周末才整理完成,但肯定还存在错漏之处, 欢迎指正共同学习进步。
之前商界有位名人说过:“站在风口,猪都能吹上天”。这几年,AI大模型领域百家争鸣,百舸争流,明显是这个时代下一个风口!
那如何学习大模型&AI产品经理?
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
只要你是真心想学AI大模型,我这份资料就可以无偿共享给你学习。大模型行业确实也需要更多的有志之士加入进来,我也真心希望帮助大家学好这门技术,如果日后有什么学习上的问题,欢迎找我交流,有技术上面的问题,我是很愿意去帮助大家的!
如果你也想通过学大模型技术去帮助就业和转行,可以点扫描下方链接👇👇
大模型重磅福利:入门进阶全套104G学习资源包免费分享!
01.从入门到精通的全套视频教程
包含提示词工程、RAG、Agent等技术点
02.AI大模型学习路线图(还有视频解说)
全过程AI大模型学习路线


03.学习电子书籍和技术文档
市面上的大模型书籍确实太多了,这些是我精选出来的

04.大模型面试题目详解


05.这些资料真的有用吗?
这份资料由我和鲁为民博士共同整理,鲁为民博士先后获得了北京清华大学学士和美国加州理工学院博士学位,在包括IEEE Transactions等学术期刊和诸多国际会议上发表了超过50篇学术论文、取得了多项美国和中国发明专利,同时还斩获了吴文俊人工智能科学技术奖。目前我正在和鲁博士共同进行人工智能的研究。
所有的视频由智泊AI老师录制,且资料与智泊AI共享,相互补充。这份学习大礼包应该算是现在最全面的大模型学习资料了。
资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。


智泊AI始终秉持着“让每个人平等享受到优质教育资源”的育人理念,通过动态追踪大模型开发、数据标注伦理等前沿技术趋势,构建起"前沿课程+智能实训+精准就业"的高效培养体系。
课堂上不光教理论,还带着学员做了十多个真实项目。学员要亲自上手搞数据清洗、模型调优这些硬核操作,把课本知识变成真本事!

如果说你是以下人群中的其中一类,都可以来智泊AI学习人工智能,找到高薪工作,一次小小的“投资”换来的是终身受益!
应届毕业生:无工作经验但想要系统学习AI大模型技术,期待通过实战项目掌握核心技术。
零基础转型:非技术背景但关注AI应用场景,计划通过低代码工具实现“AI+行业”跨界。
业务赋能 突破瓶颈:传统开发者(Java/前端等)学习Transformer架构与LangChain框架,向AI全栈工程师转型。
👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)