赞
踩
微调作为一种技术手段,是在已具备广泛知识基础的大型预训练语言模型上,利用针对性的数据集实施额外的训练过程,旨在使模型更精准地契合特定任务需求或深入某一专业领域。微调的核心目标在于实现知识的精细化灌输与指令系统的精确匹配。当前实践中,微调通常采用以下几种策略:
大模型的SFT(Supervised Fine-Tuning)方式主要包括以下几种:
全参数微调(Full Parameter Fine Tuning):全参数微调涉及对模型的所有权重进行调整,以使其完全适应特定领域或任务。这种方法适用于拥有大量与任务高度相关的高质量训练数据的情况,通过更新所有参数来最大程度地优化模型对新任务的理解和表现。
部分参数微调(Sparse Fine Tuning / Selective Fine Tuning):部分参数微调策略仅选择性地更新模型中的某些权重,尤其是在需要保留大部分预训练知识的情况下。这包括:
LoRA(Low-Rank Adaptation):通过向模型权重矩阵添加低秩矩阵来进行微调,既允许模型学习新的任务特定模式,又能够保留大部分预训练知识,从而降低过拟合风险并提高训练效率。
P-tuning v2:这是一种基于prompt tuning的方法,仅微调模型中与prompt相关的部分参数(例如,额外添加的可学习prompt嵌入),而不是直接修改模型主体的权重。
QLoRA:可能是指Quantized Low-Rank Adaptation或其他类似技术,它可能结合了低秩调整与量化技术,以实现高效且资源友好的微调。
冻结(Freeze)监督微调:在这种微调方式中,部分或全部预训练模型的权重被冻结(即保持不变不再训练),仅对模型的部分层(如最后一层或某些中间层)或新增的附加组件(如任务特定的输出层或注意力机制)进行训练。这样可以防止预训练知识被过度覆盖,同时允许模型学习针对新任务的特定决策边界。
如果在资源充足的情况下,建议使用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》论文中得到了有力阐述,该文献强调了在指令微调过程中,高品质微调数据的决定性作用。据此,我们应当将重心放在提升样本质量的打磨上,而非单纯追求数量的增长。
然而,这种策略引出了一个新的议题:如何有效地评估待用于微调的样本质量?这是一个值得深入探讨的独立话题。在评估微调样本质量的过程中,通常需要关注以下几个核心维度:
样本多样性(Sample Diversity):
指令多样性:考察样本中指令的覆盖范围是否广泛,是否包含了各类任务类型、不同难度级别以及多样化的指令结构和表达方式,确保模型在微调后能应对多种复杂情境。
内容多样性:检查样本中提供的文本内容是否涵盖了不同主题、文体、长度以及语境,以避免模型在特定领域或文本类型上过拟合,确保其具备良好的泛化能力。
答案质量(Answer Quality):
准确性(Accuracy):评估答案是否准确无误地响应了给定指令和内容,是否忠实反映了任务要求,且不包含事实性错误、逻辑矛盾或语义模糊。
完备性(Completeness):考察答案是否全面覆盖了指令所要求的所有任务点,尤其对于多步骤或复合任务,答案应完整体现所有必要的操作结果。
简洁性与清晰度(Conciseness & Clarity):衡量答案是否言简意赅、表达清晰,避免冗余信息或含糊表述,确保模型在微调后生成的输出易于理解和使用。
一致性(Consistency):
内部一致性:检查同一指令对不同内容的处理结果是否保持一致,即模型在相似情境下应给出相似的答案。
外部一致性:对比样本答案与已知的知识库、专家判断或公认的基准结果,确保答案符合领域共识和常识。
难度适配(Difficulty Calibration):
难易程度分布:分析样本集中简单、中等、复杂任务的比例,确保微调数据集包含不同难度级别的样本,有助于模型逐步提升处理复杂指令的能力。
噪声控制(Noise Reduction):
标签错误检查:识别并剔除标注错误或不一致的样本,确保答案与指令、内容间的映射关系正确无误。
数据清洗:去除重复样本、无关内容或低质量文本,提升数据集的整体纯净度。
可以看出评估微调样本质量属于一项涉及多方面考量的综合性工作,旨在确保用于指令微调的数据既能有效驱动模型学习指令理解与执行的核心技能,又能促进模型在实际应用中展现卓越的性能和广泛的适应性。通过严谨的质量评估与持续优化,可以最大限度地利用有限的高质量样本资源,实现大模型指令微调的高效与精准。
在GPT系列论文的启发下,当前大模型普遍遵循一种三步训练范式:预训练(Pre-training)、监督式微调(SFT, Supervised Fine-Tuning)及基于人类反馈的强化学习微调(RLHF, Reinforcement Learning with Human Feedback)。通过这一流程,首先获得基础模型(Base Model),继而在其基础上通过通用任务的SFT与RLHF训练得到具备对话交互、逻辑推理、用户偏好契合及广泛自然语言理解(NLU)技能的聊天模型(Chat Model)。
当要在具体业务环境中应用此类大模型时,通常还需借助领域数据进行针对性的微调。以下列举若干在进行领域数据SFT时颇具实效的策略与技巧:
精心构筑领域数据集:
定向采集:确保数据集富含领域特有情境、术语、规范标准及业务流程中典型的对话实例。
均衡分布:注意各类子任务、场景类别及问题难度在数据集中的均匀分布,防止模型在微调时对任何部分过度学习或忽视。
高标准标注:邀请领域专家进行数据标注,确保标签的精确无误,特别是在处理复杂或专业性强的任务时。
数据增强与跨域迁移:
数据扩充:运用合成、变换、拼接等手段丰富数据多样性,模拟真实场景中的变体,如文本替换、句法变化、噪声插入等,提升模型抗干扰能力。
跨域借鉴:若存在关联领域的预训练或微调数据,可适度引入作为补充,利用领域间共性加速模型学习进程。
微调方案定制:
分层次微调:面对复杂业务场景,可先进行宏观层面的领域适应,随后针对具体子任务进行精细化微调,逐步提升模型的专业化水准。
多任务融合:结合多个相关任务的数据集进行联合微调,运用多任务学习机制增强模型对领域整体认知能力。
动态优化:依据模型在验证集上的表现适时调整学习率、正则化力度、早停规则等超参数,确保微调过程既不陷入过拟合也不至于欠拟合。
应用轻量级微调技术:
Adapter插件:在模型内部植入可学习的Adapter模块,仅更新这些模块参数以适应新领域,保持主模型参数不动,节省存储与计算资源。
LoRA(低秩适应):通过向模型参数添加低秩矩阵进行修正,约束参数更新规模,维持原模型架构的同时实现高效微调。
Prompt调优:仅对提示(Prompt)进行微调,利用精心构造的提示引导模型生成与特定领域紧密相关的输出,无需改动模型主体结构。
持续监控与迭代:
性能监控:定期评估模型在实际业务场景下的表现,及时发现并解决潜在问题。
在线学习:结合实际用户交互数据进行实时或定期在线微调,持续优化模型性能。
反馈循环:建立用户反馈机制,收集用户对模型输出的意见,用于指导后续模型改进。
综上所述,通过上述策略与技巧对大模型进行领域数据SFT,能够有效地将其强大的通用能力与特定业务需求相结合,实现模型在实际应用场景中的高效、精准服务。
在进行领域任务的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
…
大模型的知识来自于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数据;
模型的参数量非常重要;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。