前言

SFT是现在很多面试存在的一个大面,看到总结很好的面试大纲题目,分享给大家。

微调是一种有监督的技术手段,是在已具备广泛知识基础的大型预训练语言模型上,利用针对性的数据集实施额外的训练过程,旨在使模型更精准地契合特定任务需求或深入某一专业领域。

微调的核心目标在于实现知识的精细化灌输与指令系统的精确匹配,所以 SFT 的重点是学习样式和指令,而非知识注入。

当前实践中,微调主要分为全参数微调和部分参数微调,下面详细说一下这两个方式的特点和技巧。

1 全参数微调有什么技巧?

主要是利用小学习率的方式,对大模型的全参数进行调整,以使其完全适应特定领域或任务。

这种方法适用于拥有大量与任务高度相关的高质量训练数据的情况,通过更新所有参数来最大程度地优化模型对新任务的理解和表现。

全参数微调技巧如下:SFT 模式选择:模式一:基于 base 模型+领域任务的 SFT;

模式二:基于 base 模型+领域数据 continue pre-train +领域任务 SFT;

模式三:基于 base 模型+领域数据 continue pre-train +通用任务 SFT+领域任务 SFT;

模式四:基于 base 模型+领域数据 continue pre-train +通用任务与领域任务混合 SFT;

模式五:基于 base 模型+领域数据 continue pre-train(混入 SFT 数据) +通用任务与领域任务混合 SFT;

模式六:基于 chat 模型+领域任务 SFT;

模式七:基于 chat 模型+领域数据 continue pre-train +领域任务 SFT;总结:在资源充足的情况下,如只考虑领域任务效果,建议选择模式二;在资源充足的情况下,如考虑模型综合能力,建议选择模式五;在资源不允许的情况下,我会考虑模式六。

2 常用的轻量级微调有哪些?

常用的轻量级微调方法有什么异同点,与传统的 fine-tuning 的区别?

部分参数微调策略仅选择性地更新模型中的某些权重,尤其是在需要保留大部分预训练知识的情况下。

这包括:

(1)prefix/prompt-tuning

在模型的输入或隐层添加 kkk 个额外可训练的前缀 tokens(这些前缀是连续的伪 tokens,不对应真实的 tokens),只训练这些前缀参数;

(2)P-tuning

P-Tuning 利用少量连续的 embedding 参数作为 prompt使 GPT 更好的应用于 NLU 任务,而 Prefix-Tuning 是针对 NLG 任务设计。

同时,P-Tuning 只在 embedding 层增加参数,而 Prefix-Tuning 在每一层都添加可训练参数。

(3)P-tuning v2

V2 更接近于 prefix- tuning,微调了每一层 transformer 的输入 embedding,v2 在大小模型都有效;

(4)Adapter-Tuning

将较小的神经网络层或模块插入预训练模型的每一层,这些新插入的神经模块称为 adapter(适配器),下游任务微调时也只训练这些适配器参数;

(5)LoRA(Low-Rank Adaptation)

通过向模型权重矩阵添加低秩矩阵来进行微调,既允许模型学习新的任务特定模式,又能够保留大部分预训练知识,从而降低过拟合风险并提高训练效率。

(6)AdaLoRA

是对 LoRA 的一种改进,它根据重要性评分动态分配参数预算给权重矩阵;

(7)QLoRA

使用一种新颖的高精度技术将预训练模型量化为 4 bit,然后添加一小组可学习的低秩适配器权重,这些权重通过量化权重的反向传播梯度进行微调。

与传统的 fine-tuning 的区别:参数量:fine-tuning 是全参数微调,PEFT 是部分参数微调;

训练效率:fine-tuning 训练效率慢,PEFT 是快;

适用场景:fine-tuning 需要更多的资源和数据,相应的上限可能也会更高,PEFT 适用于资源较少的场景。

3 为什么 SFT 后模型变傻了

为什么 SFT 后模型变傻了(灾难性遗忘),如何降低这种现象?

SFT 数据比较多或者 epoch 比较大时,可能会导致 SFT 后大模型的通用能力下降,导致灾难性遗忘,这要根据实际场景判断,如果你只关注特殊领域的性能,通用能力下降你也不需要过度关注。

如果想要不失去通用的生成能力,可以考虑以下几点:多任务微调:如果希望模型保持多任务泛化能力,可以一次性对多个任务执行微调。良好的多任务微调可能需要包含许多任务的 50-100,000 个示例。

考虑 PEFT 的方法:也就是保留了原始 LLM 的权重,不采用全参数微调的方法。通过训练少量特定于任务的适配器层和参数。PEFT 对灾难性遗忘表现出更大的鲁棒性,因为大多数预训练的权重保持不变。

数据配比:在 SFT 数据中,增加一些通用生成的数据,避免 SFT 过度学习单一训练集内容。

4 SFT 指令微调数据如何构建?

SFT 的重点是学习样式,而非知识注入,所以 SFT 的样本在于其质量而非数量,少量但精良的样本往往胜过大批中低品质的样本,实现同样甚至更优的微调效果。

通常情况下,2-10k 数据就会有一个不错的效果。这一理念在 Meta 发布的《LIMA: Less Is More for Alignment》论文中得到了有力阐述,该文献强调了在指令微调过程中,高品质微调数据的决定性作用。

据此,我们应当将重心放在提升样本质量的打磨上,而非单纯追求数量的增长。

如何评估样本的效果,在评估微调样本质量的过程中,通常需要关注以下几个核心维度:

样本多样性(Sample Diversity):指令多样性:考察样本中指令的覆盖范围是否广泛,是否包含了各类任务类型、不同难度级别以及多样化的指令结构和表达方式,确保模型在微调后能应对多种复杂情境。

内容多样性:检查样本中提供的文本内容是否涵盖了不同主题、文体、长度以及语境,以避免模型在特定领域或文本类型上过拟合,确保其具备良好的泛化能力。答案质量(Answer Quality):准确性(Accuracy):评估答案是否准确无误地响应了给定指令和内容,是否忠实反映了任务要求,且不包含事实性错误、逻辑矛盾或语义模糊。

完备性(Completeness):考察答案是否全面覆盖了指令所要求的所有任务点,尤其对于多步骤或复合任务,答案应完整体现所有必要的操作结果。

简洁性与清晰度(Conciseness & Clarity):衡量答案是否言简意赅、表达清晰,避免冗余信息或含糊表述,确保模型在微调后生成的输出易于理解和使用。一致性(Consistency):内部一致性:检查同一指令对不同内容的处理结果是否保持一致,即模型在相似情境下应给出相似的答案。

外部一致性:对比样本答案与已知的知识库、专家判断或公认的基准结果,确保答案符合领域共识和常识。难度适配(Difficulty Calibration):难易程度分布:分析样本集中简单、中等、复杂任务的比例,确保微调数据集包含不同难度级别的样本,有助于模型逐步提升处理复杂指令的能力。噪声控制(Noise Reduction):

标签错误检查:识别并剔除标注错误或不一致的样本,确保答案与指令、内容间的映射关系正确无误。

数据清洗:去除重复样本、无关内容或低质量文本,提升数据集的整体纯净度。可以看出评估微调样本质量属于一项涉及多方面考量的综合性工作,旨在确保用于指令微调的数据既能有效驱动模型学习指令理解与执行的核心技能,又能促进模型在实际应用中展现卓越的性能和广泛的适应性。

通过严谨的质量评估与持续优化,可以最大限度地利用有限的高质量样本资源,实现大模型指令微调的高效与精准。

5 如何缓解SFT后模型通用能力的下降?

有如下两点:多任务微调:如果希望模型保持多任务泛化能力,可以一次性对多个任务执行微调,在训练数据中增加一些通用数据;

数据回放:在 SFT 数据后,再做一下通用能力的 SFT,但是这样做的一个风险是之前微调的专业能力会受到影响(死锁了 );

6 选用Chat还是Base?

进行 SFT 时,基座模型选用 Chat 还是 Base 模型?

选 Base 还是 Chat 模型,首先先熟悉 Base 和 Chat 是两种不同的大模型,它们在训练数据、应用场景和模型特性上有所区别。

在训练数据方面,Base 模型是基于海量语料库进行的无监督学习。它从大量文本中学习语言模式和知识,而不需要人工标注或监督。

相比之下,Chat 模型则是在指令微调的有监督学习下进行训练的。这意味着它使用人工标注的数据集进行训练,以便更好地理解和响应特定指令。

在应用场景上,Base 模型主要用于无监督学习任务,如文本分类、情感分析、摘要生成等。这些任务主要关注文本内容的理解和处理,而不需要对特定指令做出响应。

相反,Chat 模型则主要用于指令学习任务,如问答系统、对话生成、智能客服等。在这些任务中,模型需要理解和响应人类的指令,以提供准确和有用的信息。

在模型特性上,Base 模型预训练之后没有做任何调整。它提供了基本的语言理解和生成能力,但可能需要针对特定任务进行微调或优化。

而 Chat 模型则是在 Base 模型上进行微调的版本,它通过指令微调和人工反馈强化学习等方法,使模型更加符合人类的价值观和指令要求。

总之,Base 和 Chat 是两种不同的大模型,它们在训练数据、应用场景和模型特性上有所区别。

Base 主要用于无监督学习任务,而 Chat 则专注于指令学习任务。在模型特性上,Chat 通常在 Base 上进行微调,以更好地适应特定任务的需求。

根据以上区别,在选择基座模型时也要考虑数据量和任务差别难度,对于训练数据量少的,任务和基座大模型比较优秀能力接近的选 chat 模型。

对于训练数据量比较大,或任务与 chat 版本的相似的能力比较差,选择 base 版本。

另一种说法是 base 模型可以更方便做知识注入,而 chat 版本是做过对其的,不好做知识注入。

所以基于 base 的 SFT 可以做的上限更高,更方便做知识的注入,而基于 chat 模型的 SFT 是做的样式学习或者指令学习。

但是 base 也存在没有对其的风险,输出可能和希望有差距,需要更多的调优和对齐。

7 SFT需要多少条数据?

这个没有一个明确的答案,但是根据大家的经验和一些开源的技术报告来看,SFT 的数据一般在 2k-10k 之间,epoch 可以根据 SFT 数据设定为 2-10 个 epoch。

epoch 和数据量成反比,SFT 的数据在准确,不在量大,所以在数据比较精确的情况下,一般 5k 的数据 5 个 epoch,就能得到一个不错的效果。

另外,对于一般的人类阅读和生成能力,仅在 1000 个样本上就可以有不错的效果,但是对于数学推理、代码生成等复杂任务,需要较大的数据量。

8 SFT 多优化问题

SFT 对于需要优化多个能力项时(比如数学、聊天、推理等),需要多个 SFT 数据集,这比优化单一能力的难度要大很多,需要考虑数据配比、优化的策略等。

策略解释:

多任务学习:直接混合不同的 SFT 能力项数据进行 SFT。若将每个数据源视为不同任务,则可视为多任务学习;

顺序训练:按顺序依次在各能力项数据集上微调。由于通用能力是人类对齐的核心能力,我们将通用能力数据放在最后阶段微调;

混合顺序训练:首先在特定能力数据集(代码、数学)上进行多任务学习,然后在通用能力数据集上进行 SFT;

两阶段混合微调(DMT):我们综合 RQ1-3 的结论与上述训练策略的优缺点,提出 DMT 策略。

在第一阶段我们首先在特定能力数据集(代码、数学)上进行多任务学习。

在第二阶段我们使用混合数据源进行 SFT,其中包括通用数据和一定比例k的特定能力数据(k = 1, 1/2, 1/4, 1/8, 1/16, 1/32),这有助于缓解模型对特定能力的灾难性遗忘。

主要结论:

随着数据量的增加,数学推理、代码生成和通用能力的性能变化趋势如何?

不同能力项有不同的 Data Scaling 曲线:数学推理能力,通用能力与数据量呈正相关模型的性能缩放曲线。

值得注意的是通用能力只需要大约 1k 数据样本便会产生性能激增(数据量从1/256 到 1/64),并在达到一定阈值提高缓慢(1/64),这契合于LIMA[5]文中所提到的“Less is more”。然而代码能力在 7B,13B 则呈现不规则的性能曲线,33B 呈现 log-linear 的趋势;

数据充足的情况下,更大参数量的模型往往有更强大的性能;

在 SFT 阶段中,将三种能力项数据直接混合是否会产生性能冲突?

与单数据源相比,混合数据源设置呈现低资源性能增益,而高资源性能冲突: 三种能力的性能放缩曲线一致呈现高资源下(1/1)混合数据源设置弱于单数据源,然而随着数据量下降二者产生性能转折,最终低资源(1/256)下混合数据源产生明显性能增益;

随着模型参数量的提高,数学推理与通用能力在低资源下的性能增益更加显著;

什么是产生性能冲突的关键因素?

当不同的 SFT 能力之间存在显著的任务格式和数据分布差异时(数学和通用数据之间),数据比例的影响较小。

然而,当存在一定程度的相似性时(代码和通用数据之间),数据比例可能会导致明显的性能波动;

即便在通用数据资源非常有限的情况下,特定能力的数据比例的放缩也没有对通用能力造成明显影响;

不同的 SFT 训练策略对数据组成的影响是什么?

多任务学习在尽可能保留了特有能力,但是通用能力性能下降显著;

两种顺序训练保留了通用能力能力,但是由于多阶段的微调产生灾难性遗忘,使得他失去了太多的特定能力(尤其是数学);

在不同的模型参数量下(7B,13B,33B),DMT (k = 1/256)策略在特定能力方面(数学,代码)均有显著改善,甚至对于通用能力也有一定程度的优化;

总结:大模型混合多种能力项数据进行微调时,会呈现高资源冲突,低资源增益的现象。

我们提出的 DMT 策略通过在第一阶段微调特定能力数据,在第二阶段微调通用数据+少量的特定能力数据,可以在保留通用能力的同时,极大程度地挽救大模型对特定能力的灾难性遗忘,这为 SFT 的数据组成问题提供了一个简单易行的训练策略。

值得注意的是,第二阶段微调时混合的特定能力数据量需要根据需求而定。

阿里一面,SFT连环14问,跪了..._人工智能

9 大模型在进行SFT的时候是在学习什么?

简单总结一下:指令追随和样式学习:并没有学习到世界知识;

领域适用性:特定领域的语言、术语、上下文内容,优化其在特定领域的表现;

激发大模型能力:通过 SFT 激发大模型在特定领域的能力;

安全性:在 SFT 中增加一些对抗数据,提高模型的鲁棒性和安全意识。

10 预训练和SFT的区别?

主要有以下几点:目的:预训练是通过大量无标注数据学习知识,SFT 是在少量标注数据上学习指令;

数据类型:预训练大量无标注数据,SFT 少量标注数据;

模型类型上:预训练是一般学习模式,SFT 是在特定任务服务;

11 微调模型需要多大的显存?

这块要分两类,分 SFT 和 PEFT,他们两个的显存差距比较大;

SFT:全参数微调,包括参数的梯度、优化器都要激活。

如果一个 1B(fp32)的模型需要显存如下:模型需要显存:1B*4byte = 4GB

梯度显存(每个参数都需要有一个梯度):4GB

优化器显存:以 adamw 优化器为例,他需要一阶动量+二阶动量=4GB+4GB=8GB;PEFT:需要的显存与模型没有大的区别,主要看 PEFT 部分,大概是几 M 到几 GB。

12 多轮对话任务如何微调模型?

多轮对话的核心是指令追随。

13 什么是冻结(Freeze)监督微调?

在这种微调方式中,部分或全部预训练模型的权重被冻结(即保持不变不再训练),仅对模型的部分层(如最后一层或某些中间层)或新增的附加组件(如任务特定的输出层或注意力机制)进行训练。

这样可以防止预训练知识被过度覆盖,同时允许模型学习针对新任务的特定决策边界。

14 选用全参数SFT还是部分参数的SFT?

这个说法不一,所以要根据自己场景选用不同的方法,如果资源充足的话,建议 SFT 和 PEFT 都尝试一下,选用效果最用的方式,如果资源不足,建议选 PEFT。从理论分析上来看,SFT 会修改大模型全量参数,可以在数据量充足的情况下学习更多的内容,效果上限应该更高,但也存在灾难性遗忘等不稳定情况。

PEFT 不管是 prompt training 还是 LORA 都是只修改少量参数,所以他的优点就是需要资源少,稳定性高,但是存在效果上限问题,有些场景下效果不好,特别是基座大模型在该领域任务上的效果本身就不好,很难通过 PEFT 来提升。来源: