微信扫码
添加专属顾问
我要投稿
微调作为一种技术手段,是在已具备广泛知识基础的大型预训练语言模型上,利用针对性的数据集实施额外的训练过程,旨在使模型更精准地契合特定任务需求或深入某一专业领域。微调的核心目标在于实现知识的精细化灌输与指令系统的精确匹配。当前实践中,微调通常采用以下几种策略:
大模型的SFT(Supervised Fine-Tuning)方式主要包括以下几种:
如果在资源充足的情况下,建议使用SFT进行全量微调。部分参数微调的方法不稳定,在有的场景下效果不理想。
大模型指令微调(Instruction Tuning)是一种针对大型预训练语言模型的微调技术,其核心目的是增强模型理解和执行特定指令的能力,使模型能够根据用户提供的自然语言指令准确、恰当地生成相应的输出或执行相关任务。指令微调特别关注于提升模型在遵循指令方面的一致性和准确性,从而拓宽模型在各种应用场景中的泛化能力和实用性。
在进行指令微调的时候,会将Instruction(指令) 以及对应的answer拼接成文本(在拼接过程中一般会加入【USER】、【BOT】等角色,同时会加入开始、结束的special token,这样可以转换成一个chat式任务)。
如翻译任务
【USER】:将下列内容翻译成英语:{待翻译文本}
【BOT】:{翻译结果}
<bos_token>【USER】:将下列内容翻译成英语:{待翻译文本}<special token>【BOT】:{翻译结果} <eos_token>
将拼接文本采用预训练任务的方式进行自回归预测,和预训练的区别在于loss的计算,同样使用Cross-Entropy作为loss,在指令微调的时候只会计算answer部分,Instruction部分通过设置ignore_index隐掉。在上面的案例中,我们只会计算 “【BOT】:” 之后的loss。
对大模型进行指令微调时,样本的精髓在于其质量而非数量,少量但精良的样本往往胜过大批中低品质的样本,实现同样甚至更优的微调效果。通常情况下,仅需约一万份样本便足以达成理想的微调成果。这一理念在Meta发布的《LIMA: Less Is More for Alignment》论文中得到了有力阐述,该文献强调了在指令微调过程中,高品质微调数据的决定性作用。据此,我们应当将重心放在提升样本质量的打磨上,而非单纯追求数量的增长。
然而,这种策略引出了一个新的议题:如何有效地评估待用于微调的样本质量?这是一个值得深入探讨的独立话题。在评估微调样本质量的过程中,通常需要关注以下几个核心维度:
可以看出评估微调样本质量属于一项涉及多方面考量的综合性工作,旨在确保用于指令微调的数据既能有效驱动模型学习指令理解与执行的核心技能,又能促进模型在实际应用中展现卓越的性能和广泛的适应性。通过严谨的质量评估与持续优化,可以最大限度地利用有限的高质量样本资源,实现大模型指令微调的高效与精准。
在GPT系列论文的启发下,当前大模型普遍遵循一种三步训练范式:预训练(Pre-training)、监督式微调(SFT, Supervised Fine-Tuning)及基于人类反馈的强化学习微调(RLHF, Reinforcement Learning with Human Feedback)。通过这一流程,首先获得基础模型(Base Model),继而在其基础上通过通用任务的SFT与RLHF训练得到具备对话交互、逻辑推理、用户偏好契合及广泛自然语言理解(NLU)技能的聊天模型(Chat Model)。
当要在具体业务环境中应用此类大模型时,通常还需借助领域数据进行针对性的微调。以下列举若干在进行领域数据SFT时颇具实效的策略与技巧:
综上所述,通过上述策略与技巧对大模型进行领域数据SFT,能够有效地将其强大的通用能力与特定业务需求相结合,实现模型在实际应用场景中的高效、精准服务。
在进行领域任务的SFT的时候我们通常会有以下训练模式进行选择,根据领域任务、领域样本情况、业务的需求我们可以选择合适的训练模式。
大模型的知识来自于pre-train阶段,如果你的领域任务数据集与pre-train的数据集差异较大,比如你的领域任务数据来自公司内部,pre-train训练样本基本不可能覆盖到,那一定要进行continue pre-train。
如果你的领域任务数据量较大(token在1B以上),并只追求领域任务的效果,不考虑通用能力,建议进行continue pre-train。
如果你有一个好的base模型,在base模型基础进行领域数据的SFT与在chat模型上进行SFT,效果上差异不大。基于chat模型进行领域SFT,会很容导致灾难性遗忘,在进行领域任务SFT之后,模型通用能力会降低,如只追求领域任务的效果,则不用考虑。
如果你的领域任务与通用任务有很大的相关性,那这种二阶段SFT会提升你的领域任务的效果。如果你既追求领域任务的效果,并且希望通用能力不下降,建议选择base模型作为基座模型。在base模型上进行多任务混合训练,混合训练的时候需要关注各任务间的数据配比。
学习率是一个非常重要的参数 ,如果学习率设置不当,很容易让你的SFT模型烂掉。SFT数据集不是特别大的情况下,建议设置较小学习率,一般设置为pre-train阶段学习率的0.1左右,如在pre-train阶段的学习率为9e-5,则SFT学习率设置为9e-6。在10万SFT样本上,采用与pre-train一样的学习率,发现loss一直不收敛,在调低学习率至原来0.1之后,loss在两个epoch之后就收敛。
通常pre-train训练的warmup_ratio 0.01~0.015之间,warmup-steps在2000左右。在SFT的时候,建议使用更小的ratio,因为相较于pre-train,SFT样本非常小,较小warmup_ratio可以使模型收敛更平滑。但如果你的学习率设置较大,那可以增大你的warmup_ratio,两者呈正相关。
Epoch设置可以根据loss收敛情况设置,如果SFT样本较少,可以设置较大epoch,在较小的epoch上loss会不收敛,指令都很难遵循。较大epoch会容易导致过拟合,但过拟合要优于欠拟合。如果SFT样本数量较多,如在十万以上,一般2个epoch即可收敛。
如果SFT任务类型较多,可以尝试添加system_prompt,不同的任务使用不同的system_prompt;
一个好的基座模型非常重要!
在SFT的时候,loss依然是你最重要的指标!一般在SFT过程中,loss会先升后降;
可以尝试多种模式训练方案,如在continue pre-train 中添加SFT数据,在SFT数据添加高质量的pre-train数据;
模型的参数量非常重要;
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2025-02-01
2025-01-01
2024-08-13
2025-02-04
2024-07-25
2024-04-25
2024-06-13
2024-09-23
2024-04-26
2024-08-21
2025-03-17
2025-03-17
2025-03-17
2025-03-17
2025-03-17
2025-03-17
2025-03-16
2025-03-16