SFT最佳实践
本内容为您提供了SFT的支持文档,引导并指引市面上聚焦问题,帮助您方便并快速应用SFT。
目录大纲
- 识别应用场景:首先明确目标任务和需求,通用场景如NL2SQL、阅读理解等,行业场景如作业批改、客服助手等。
- 数据准备与微调:确保数据质量和相关性,对数据进行清洗和预处理,必要可做数据增强。
- 训练配置:基于任务需求与应用场景,同时对数据集做量化统计,选择合适的模型进行训练。在训练配置中,根据需求在全量参数与LoRA中做选择。
- 训练结果优化:鼓励用户根据训练报告结果对模型进行优化、下一次的迭代。
- 训练持续迭代:当您已经使用模型完成了SFT或其他训练,我们便拥有了更多的反馈数据,结合反馈数据,在实际应用中发现需要适应其他的场景或解决特定问题时,通过持续迭代的方式可以让模型的效果更好。
一、识别应用场景
我们将SFT使用场景拆解为两个维度,从通用、垂类两个维度,帮助您明确聚焦SFT可以解决的问题与场景。
通用场景
垂类场景
部分场景、仅供参考。
在以上的通用与垂直场景中,SFT能做到:
- 任务特定性能提升:预训练语言模型通过大规模的无监督训练学习了语言的统计模式和语义表示。然而,它在特定任务上的性能可能不如在大规模无监督数据上表现出的性能。通过在任务特定的有标签数据上进行SFT,模型可以进一步学习任务相关的特征和模式,从而提高性能。
- 提高领域适应性:预训练语言模型可能在不同领域的数据上表现不一致。通过在特定领域的有标签数据上进行SFT,可以使模型更好地适应该领域的特殊术语、结构和语义,提高在该领域任务上的效果。
- 解决数据稀缺性:某些任务可能受制于数据的稀缺性,很难获得大规模的标签数据。SFT可以通过使用有限的标签数据来训练模型,从而在数据有限的情况下取得较好的性能。
- 防止过拟合:在SFT过程中,通过使用有标签数据进行有监督训练,可以减少模型在特定任务上的过拟合风险。这是因为SFT过程中的有标签数据可以提供更具体的任务信号,有助于约束模型的学习,避免过多地拟合预训练过程中的无监督信号。
二、数据准备与微调
准备数据
首先我们要明确,SFT任务需要选择多轮对话-非排序类的数据集。通常上千条左右的精标数据即可发挥良好的效果。
- 如图中的问答对,我们希望用户标注的数据就是正确的有效答案。
- 如涉及到结构化的输出,我们希望用户标注的数据都是结构化的标准数据。
- 问题与回答的类型多样、场景多样、避免重复,尽可能覆盖到全场景做到数据的多样性,避免过拟合导致模型效果不佳。当然,考虑到多样性数据收集的成本较高,下游任务finetune时可以暂时忽略指令数据的多样性。着重在具体下游任务的数据准备。
针对不同用户的标注能力,我们提供了多种提高数据标注效率方法。
(1)零基础不会标注数据的用户:
- 预置数据集:SFT训练提供了预置开源公开数据集促进算法研究和开发,降低数据获取⻔槛。预置数据集可直接被用于模型训练和模型评估任务。包含了多种场景来满足用户需求,但预置数据集本身不支持用户更改。
- 众测标注:文心千帆支持提交标注人力服务的需求发布至百度众测。 百度众测团队具备10年以上的数据服务经验和丰富的标注人力,尤其在大模型方面已在内部将经验和人员打磨优化,如在文心大模型的训练过程中对数据进行标注。众测团队可为客户专业、准确、高效、安全地完成包括SFT、RM、模型评估等各类大模型数据标注任务,助力展开大模型建设。 平台支持统一纳管自训练模型的数据集,并支持自主版本迭代、数据查看、导入导出和删除等操作。
- 批量自动生成:用户在数据标注时,需要对回答逐一点击自动生成。我们通过文心一言大模型批量自动生成,不仅可以实现一键生成多问答对数据,同时生成问答对数据的质量好且生成速度快。
(2)有一点标注数据经验的用户:
- self-QA:通过self-QA生成问答对。自动问答生成系统,利用文心大模型从给定的文件中抽取信息生成一系列问题,并对这些问题给出答案。self-QA可以对PDF、word、excel、txt等文档进行抽取解析,self-QA使用用户提供的格式化文档进行文字抽取和表格抽取,对抽取后的数据进行如切片、拼接、结构化等预处理方式,从而生成真实的问答对数据。
(3)有标注数据经验的用户:
- self-instruct:从已有的样本中每次随机选取一定数量样本送入大模型,大模型能够根据数据隐含规律生成新的样本。self-instruct需要用户在数据集的每条样本中提供输入和输出。
三、训练配置
1 选择合适长度的模型
(Why)为什么?
文本长度在不同的模型版本中有所差异。选择合适的模型版本能够有效处理特定长度的文本,从而提高模型的整体性能。
(How)怎么做?
- 数据量化:对数据集进行统计,了解文本的最大、最小、平均和中位数长度。同时也要对自身应用场景的输出长度有评估。
- 模型选择建议:
- 如果数据集长度(95%以上)在4k以内:考虑使用4k模型并进行SFT微调,保证效果与性能的平衡。
- 如果超过4k的数据较多(20%以上)或需长文本处理:使用8k版本模型进行微调。
当前版本千帆提供可SFT的模型有如下基础模型
- ERNIE-Bot-turbo是百度自行研发的大语言模型,覆盖海量中文数据,具有更强的对话问答、内容创作生成等能力;
- BLOOMZ-7B是业内知名的大语言模型,由BigScience研发并开源,能够以46种语言和13种编程语言输出文本;
- Llama-2-7b是Llama-2-7b-chat-hf的大语言模型。
- Qianfan-Chinese-Llama-2-13b,千帆团队在Llama-2-13b基础上的中文增强版本。
提问:模型选择有风险么?
***答***:针对单个垂直的行业任务,不同基础模型的表现肯定是有差异的,用户需要做好预期进行选择。后续千帆也会更新其他的基础模型供用户选择。
实际案例
实验场景:医学领域科普问答
数据集的统计指标:
prompt+reponse 平均长度: 2806
prompt+reponse 最大长度: 7652
prompt+reponse 最小长度: 554
prompt+reponse 超过4k的数据占比:23.36%
数据量:训练数据2w+条,预测数据700+条
实验配置:
ERNIE-Bot-Turbo-0704(4k) VS ERNIE-Bot-Turbo-0725(8k)
使用相同的采样策略,训练步数,和训练长度。
实验结果:
实验结论:
在该场景数据集中,按照专家的评分标准分别对EB-Turbo-4k和EB-Turbo-8k打分,EB-v201-4k的加权平均分为1.86,而EB-v201-8k为2.02。
v201-8k相较于v201-4k提高了8.6%,效果更佳。
2 选择训练方法
(Why)为什么?
不同的训练方法(如SFT与LoRA)可以达到不同的性能权衡点,选择合适的方法能够在通用性和任务特定效果之间找到平衡。
(How)怎么做?
权衡考虑:
- 样本数量少于1000且需注重基座模型的通用能力:优先考虑LoRA。
- 如果特定任务数据样本较多且主要注重这些任务效果:使用SFT。
- 如果希望结合两者优势:将特定任务的数据与通用任务数据进行混合配比后,再使用这些训练方法能得到更好的效果。
实际案例
在用户场景中,经过评估,选择LoRA微调略有优势。但混合通用数据与特定任务数据后再进行微调,能够达到更好的综合效果。
3 配置超参数
EPOCH 影响比 LR 大,可以根据数据规模适当调整EPOCH大小,例如小数据量可以适当增大epoch,让模型充分收敛。
例如:EPOCH:100条数据时, Epoch为15,1000条数据时, Epoch为10,10000条数据时, Epoch为2。
提问:超参数选择有风险么?
***答***:1.过高的epoch可能会带来通用nlp能力的遗忘,这里根据客户实际需要考虑,若客户只需要下游能力提升,则通用NLP能力的略微下降影响不大。若客户依然在乎通用NLP能力,平台侧也提供过来种子数据来尽可能保证通用NLP能力不降低太多。 2.用户需要保证数据量的真实性,也就是确保数据是多样且泛化能力强的数据。而不是1000条数据只是100条数据的复制10次。
提问:学习率需要如何调整?
***答***:学习率(LearningRate)是在梯度下降的过程中更新权重时的超参数,过高会导致模型难以收敛,过低则会导致模型收敛速度过慢,平台已给出默认推荐值,如果没有专业的调优经验,推荐使用默认值。
实际案例
为用户理解配置超参数的时候更直观,我们提供CASE供用户参考。
「1」使用场景
应用于学生的作文批改场景,其中包括:对文章的总评、每一段落的点评、段落的润色、文章整体结构的点评、文章的思维导图以及文章的全文升格。
「2」问题描述
SFT (3) 0818精调后评分下降较多。
「3」解决思路
遇到SFT训练效果不好或出现多次波动的问题,我们解决的思路与顺序为:
- 数据问题,我们需要对用户使用的数据做排查,是否是因为数据的质量或者不平衡导致了训练效果问题。
- 训练参数问题,如果数据没有问题的话,我们需要对如: 进行排查,用户的问题就出现在数据量过1w+,依然使用了大epoch训练导致模型过拟合。
- 模型本身问题,涉及到我们同学开发的算法问题,用户无法解决。
「4」思考与启发
由于客户会有超参选择不好的情况,我们这边统计了一下epoch与训练集数目的关系整理后,提供选取方案:
- 若用100条数据SFT,EPOCH推荐为15。
- 若用1000条数据SFT,EPOCH推荐为10。
- 若用10000条数据SFT,EPOCH推荐为2。
如何通过模型结果分析出是否过拟合?提高排查效率:
如果测试的时候,都只会回答训练见过的内容,可能是训练过拟合了,需要调整数据或超参。
四、训练结果优化
得到SFT模型后,可以观察以下数据:
(1)Training loss和Perplexity的收敛曲线,成功的训练一般有明显的收敛过程。收敛出现在训练过程的后半部分都是合理的。
a)如果没有明显收敛,说明训练不充分,可以增加训练epoch重训,或者进行增量训练。
b)如果收敛出现在训练过程的前半部分,而后部分的loss平稳无变化,说明可能有过拟合,可以结合评估结果选择是否减少epoch重训。
c)如果有收敛趋势,但没有趋于平稳,可以在权衡通用能力和专业能力的前提下考虑是否增加epoch和数据以提升专业能力,但会有通用能力衰减的风险。
收敛良好:
loss上升,未收敛:
loss持续下降,没有平稳,判断为收敛未完成,可以增加数据或epoch。
ppl在训练1/3处已经非常接近1,同时loss及其接近0,是明显的过拟合。建议把epoch减少到当前的1/3重训。
(2)观察Rouge、Bleu等评估指标。需要了解这些指标的计算原理。在输出比较封闭的分类场景中,这些指标近似于准确率;在开放任务中,这些指标需要和以往在同任务上训练得到的指标横向比较。如果指标相比以前训练的结果变差了,需要重新调整训练数据、超参配置等。
指标 | 说明 |
---|---|
BLEU-4 | BLEU-4 是NLP中机器翻译/⽂本摘要等生成类任务常⽤的评价指标,是将模型生成结果和标注结果分别按1-gram、2-gram、3-gram、4-gram拆分后,计算出的加权平均精确率(n-gram 指⼀个语句⾥⾯连续的n个单词组成的⽚段)。 |
ROUGE-1 | ROUGE-1 是NLP中机器翻译/⽂本摘要等生成类任务常⽤的评价指标,是将模型生成结果和标注结果按1-gram拆分后,计算出的召回率(n-gram 指⼀个语句⾥⾯连续的n个单词组成的⽚段)。 |
ROUGE-2 | ROUGE-2 是NLP中机器翻译/⽂本摘要等生成类任务常⽤的评价指标,是将模型生成结果和标注结果按2-gram拆分后,计算出的召回率(n-gram 指⼀个语句⾥⾯连续的n个单词组成的⽚段)。 |
ROUGE-L | ROUGE-L 是NLP中机器翻译/⽂本摘要等生成类任务常⽤的评价指标,是将模型生成结果和标注结果按最长公共子序列(longest-gram)拆分后,计算出的召回率。 |
(3)对于评估指标的举例说明:
a. 简单的封闭任务例如标签抽取的任务,抽取prompt中的试题属于语文还是数学,response只有“语文试题”或者“数学试题”四个字。在这个任务中,大模型的回答是封闭的,且任务简单,ROUGE、BLEU指标都可以接近100满分。
b. 开放任务例如文本生成,按照用户的提示和材料生成一个故事。在这个例子中,评估指标能达到50-60已经是很好的结果了,在没有sft时指标甚至只有10-20。
(4)在模型中心进行离线评估。使用和训练数据集不重复的数据进行评估。除了评估指标和裁判员模型的打分,同时也要肉眼观察评估结果是否符合预期,是否有明显的badcase。例如某客户做意图识别时,发现离线评估的预测结果中有一些case没有预测出任何意图,回去检查训练集发现有少量训练数据标注有误,训练数据的response就是空。删除劣质数据重训后问题得到解决。另一个例子是离线评估使用了不同的prompt模板来提问,发现某些模板下的结果明显偏差,这种情况应按照效果短板重新调整训练数据集中不同模板训练数据的配比。
(5)发布预测服务后在playground进行主观测试。一方面用和训练数据集类似的专业case测试大模型对专业能力的学习是否充分,另一方面,如果需要保留通用对话能力,也可以尝试通用问题,或者闲聊,观察大模型的通用对话能力有没有衰减。例如某个摘要场景调优时,因为训练数据集的response都很短,导致sft后的模型如果进行闲聊,也会只回复很短的内容。所以这个模型只可用于专业场景,不适用于通用场景了。
五、训练持续迭代
当您已经使用模型完成了SFT或其他训练,但在实际应用中发现需要适应其他的场景或解决特定问题时,可以考虑模型迭代。这份指南旨在为您提供大模型SFT迭代的方法和建议。
(Why)为什么?
模型的性能可以受到多种因素的影响,包括但不限于新的数据源或业务需求的变化。持续地对模型进行优化和迭代能够确保它始终能够满足或超越预期的效果。
(How)怎么做?
- 定期评估:设定一个时间表,对模型的性能进行一次全面的评估。
- 数据更新:考虑周期性地更新或扩充训练数据,以反映最新的数据趋势或业务需求。在数据更新问题上,千帆大模型平台提供了数据回流功能,支持将线上预测服务的结果保存回数据集,经人工筛选、调整以及处理后,用于下一次的模型优化训练。
- 目标重新定位:随着业务的发展,可能会有新的需求或目标出现,需要重新考虑和定位模型的优化方向。
实际案例
「1」使用场景
基于用户提供的case,直接使用EB-turbo模型回答结果存在较大幻觉,对用户产品编造相关回答。期望通过SFT、LoRA等方法微调用户的相关产品知识,提高回答的准确性,同时不降低通用能力。
「2」场景描述
使用客户的约1000条SFT数据训练后,回答相关产品的答案准确性提高,回答详实,而且经测算通用问答能力也没有明显下降。
「3」提高表现
第一个例子:
我们用预置的模型EB-turbo的话,回答【用户公司上市的时间】问题时回答是有问题的,准确的是18年9月12日,经SFT训练后,得到准确的答案。
第二个例子:
在使用SFT微调之前,我们使用了预置模型中的ernie bot turbo 进行回答,其模型没有分析出此智能系统在用户应用的特殊性,经SFT后可以分析出此智能系统是用户业务的中央处理系统。
「4」思考与启发
微调确实能解决特定行业上一些标准模型无法解决或回答有误的问题。