SFT(Supervised Fine-Tuning)简介
监督微调(Supervised Fine-Tuning,SFT) 是大模型训练流程中的关键环节,其目标是通过高质量的人工标注数据(通常为问答对,包含输入的prompt和预期输出的 response),将通用预训练大模型(如Llama、Qwen等)适配到特定的下游任务或专业领域,使其生成更符合人类期望且有一定偏好格式的输出。
SFT的必要条件
1. 何时需要启动SFT
当通过prompt工程,大模型也无法将用户所想看到的回答呈现出来(即指令跟随失败)时;
当大模型生成内容存在事实错误或专业度不足时,比如某些领域的词汇未在预训练模型的前置知识里;
当用户对大模型输出内容有格式要求时,比如某些专业领域(客服)需要格式化输出,而模型仍有部分回答不符合格式要求。
2. SFT的前期准备
当用户确定要使用大模型SFT时,请确保已经做好了以下准备:
用户已经使用prompt工程等方式,将基础模型的潜力发挥到极致,并且针对垂直领域的测试集,仍然存在一定数量的badcase,且数量是不可接受(一般业界定义专业领域知识测试准确率<75%即为不可接受)的;
针对该垂直领域,用户已经标注了至少1K的高质量数据集。如何评判一个数据集是否是高质量数据集请见下一节。
3. 何为高质量数据集
高质量数据集一般存在以下特征:
针对某一领域,该数据集覆盖一定量的badcase或者与badcase特征相似的数据;
该数据集有着多样的prompt类型(即提问方式非单一)以增加模型的泛化性;
该数据集针对同类型prompt的回答方式统一或结构差异较小;
该数据集不存在模棱两可的问题以及答案;
该数据集不存在答案重复输出的数据;
(如需要)该数据集会添加5-10%的通用数据以防止微调后的模型出现灾难性遗忘。
数据集配置
针对不同场景下,以下是数据量级的建议:
简单文本分类任务:对于基础的分类任务,如判断文本情感倾向(积极、消极、中性)或对新闻文章进行简单类别划分(体育、科技、娱乐等),若用户使用较小规模模型(如 7B及以下),通常5k-20k条的数据量即可取得不错效果;若使用更大参数模型(如30B及以上),由于模型学习能力更强,对数据量要求相对降低,2k-10k条也可能实现较好微调。但数据量的大小也与分类数以及任务难易度强相关,类别较多/任务较难的场景可能需要20k条以上的数据,且要做到类别均衡。
信息抽取任务:像从文本中抽取人名、地名、组织机构名等实体,或抽取事件的时间、地点、参与者等关键信息这类任务,任务难易度更大,因此对数据量需求相对较高。若用户使用13B及以下模型时,建议有30k-80k的数据量;若使用30B及以上模型时,20k-60k的数据量较为合适。这是因为信息抽取任务复杂,模型需学习多种实体和关系模式,足够数据量才能让模型有效捕捉这些模式。例如,在医疗领域的实体抽取微调中,50k条的高质量医疗文本数据,能使13B模型的F1值达到75%左右。
生成任务(如文本续写、文案生成):生成任务对模型创造力和语言理解能力要求高,数据量需求更大。对于7B及以下的模型,一般需要100k-300k条以上数据;而13B-30B的模型,50k- 200k条数据较为适宜;30B以上模型,30k-150k数据可能满足需求。数据不仅要量大,还应多样化,涵盖不同风格、主题和语境文本。如在小说续写微调中,200k条包含各种题材小说片段的数据,可让7B模型生成更连贯、富有想象力的续写内容。
复杂问答任务:如开放域问答、专业领域深度问答、领域内长思考链生成问答,数据量要求与生成任务相近甚至更高。7B的模型可能需要50k-150k条数据;13B-30B的模型,40k-100k条数据;30B及以上的模型,则需要50k-80k数据。这类任务需模型理解复杂问题语义,检索知识并生成准确回答,大量的数据帮助模型学习各类问题模式和答案逻辑。但是如果数据中带有思考推理过程,也即cot数据集,则各类模型所需的数据量可以相对应减少50%-80%。在医疗领域的带思考过程的问答微调中,10k数量的含各类疾病的治疗方式的数据,便能让14B的模型在开源医疗问题测评集上提点。
需注意,以上数据量仅为经验参考范围,实际微调中最佳数据量受数据质量、模型架构、任务复杂度及训练方法等多种因素影响。例如,若数据质量极高且与任务高度相关,可能用较少数据量就能取得好效果。在微调前,可通过小规模实验评估不同数据量对模型性能影响,确定适合特定任务和模型的最优数据量。
精调配置
1. 模型选择
一般来说,1-13B为小模型,13-34B为中模型,70B以上为大模型。
依据任务的难易程度:若客户明确针对项目的模型需要有长文本续写能力,或者需要做比较复杂的思维链推理,则可以选择大模型;若只是简单的短文本问答或者分类任务,选择小模型即可,因为小模型更容易捕捉短文本的局部特征。若强行用小模型做困难任务,即使做了极致的prompt工程优化,也不可避免地产生幻觉;若使用大模型做简单任务,则会造成极大的资源浪费。
依据推理时延:一般来说,当推理batch为1时,小模型的推理时延<300ms,中模型的推理时延为500-800ms,大模型的推理时延>1.5s,若客户针对项目的模型有低时延要求,建议使用小模型。
依据资源数:一般来说,小模型在短文本长度的微调上需要的资源数较少,即使是全量微调,也只需要单机,大模型所需的资源则较多,72b至少也需要4台A800机器才能微调,这也是需要考虑的情况。
2. 精调方式
主流的精调方式包括:
全参微调 (Full Fine-Tuning)是解冻整个模型权重进行训练,更新全模型的参数,效果上限高,适合复杂任务,但该方式显存占用巨大,而且在专业领域的数据集上进行全参微调可能造成灾难性遗忘。
LoRA微调 (Low-Rank Adaptation)是冻结预训练模型的权重,并在每个模块中注入可训练的低秩矩阵(Adapter),因为训练参数少所以可以节省60%-70%的显存,也比较适合中小数据集且任务较为简单的情况。由于LoRA微调相当于是给基础模型外接一个知识库,因此其效果也略低于全参微调。
从工程经验上来看,对于全参微调的选择,满足以下几点一般都可以进行全参微调:
任务复杂度高(比如进行长文本思考链的推理);
数据量充足(拥有大于10k的高质量数据);
算力无约束(拥有A800/H100/H800/910B2集群);
数据分布剧变(任务所需的领域数据集与基础模型的KL散度过大)。
而对于LoRA微调,工程上的经验一般都有以下几点:
资源受限但需较好效果(只拥有较少的机器数但又想训练自己的行业大模型);
快速迭代实验(不一样的任务需求搭配不同的LoRA权重,比如电商里的修改订单和商品推荐属于不一样的简单任务);
中小规模数据(仅仅只有1k-50k的数据样本);
防止灾难性遗忘(由于全参微调遗忘过多知识,可以通过增加一定程度的通用数据+LoRA微调减缓)。
关于LoRA微调和全参微调在效果上的差距,在大多数场景,LoRA微调可以达到全参微调95%以上的效果。需要注意的是,LoRA微调和全参微调在学习率上,有着不同的最佳参数取值范围,这一点在训练参数选择中做进一步的说明。
建议先使用小模型+ LoRA微调来验证实验设置及微调数据是否有效,如果有效的话,再逐渐增大数据量并迁移到大模型上验证微调效果。这样做可以显著加快迭代效率,避免在大参数模型上反复做无意义的迭代。
3. 精调参数
在SFT中,不同的超参数选择会影响模型的精度以及性能,下面逐一对部分重要参数进行解释并给出一般性推荐。
epoch:模型训练轮数,通常选择2~5,可以根据eval集的loss曲线来判断:如果train集的loss曲线下降,eval集loss曲线上升,则说明模型已经过拟合,此刻考虑到基础模型的通用能力,应该停止训练;如果train集和eval集loss曲线均在缓慢下降,则说明模型还未收敛,可以继续进行训练。按经验来说,一般性的任务,全参微调训练3个epoch以内,LoRA微调应该取3-5个epoch。而生成类任务的epoch数可以略微设置大一点,如5~10范围内。
learning rate:学习率,设置较大时会加速模型迭代,但是模型可能无法收敛到最优点;设置过小时会使得模型迭代较慢,可能陷入局部最优。按照经验来讲, LORA微调选择 learning rate 在 1e-4 ~ 3e-4,全参微调选择learning rate在1e-6~5e-6即可。
global batch size:全局批处理大小,在大模型加速框架Megatron下,该值的增大不会导致显存溢出的问题,但由于梯度累积的存在,其值越大,模型训练性能会降低。一般来说,小模型使用的gbs值可以小一点,大模型的gbs值一般设置成64及以上,gbs的设置一般是2的次幂,比如2,4,8,16,32等。
seq lens:序列长度,其取值应该大于等于训练数据里面最长的那个,以防止数据被截断。一般来说,由于大模型普遍应用旋转位置编码,其已经具备了一定的外推性,8k的序列长度已经可以满足一些简单的、常规的问答任务。如果有特殊需求,比如长文本续写或者特长思维链推理,才会考虑放大序列长度到32k。而且增大序列长度所需的资源数会成倍增长,通常会开启序列并行或者激活值重计算的方式来支持模型的长序列微调能力,会严重影响训练性能。
另外,针对这些参数,有一些额外建议供用户参考:
微调时,learning rate是随着global batch size的增加而单调递增但有上界的。当优化器是Adam或者RMSProp时,learning rate是和global batch size的平方根成正比。但是增大global batch size到一定阈值后,learning rate反而应该减小。
当增大global batch size并相应增大learning rate时,为保证模型训练一定的步数,有时epoch也需要稍微增大一些。
LoRA微调时,最优的learning rate相比于全参微调时最优的learning rate,一般大1~2个数量级。