2.2 模型微调.md 9.4 KB

一、什么是微调(Fine-tuning)

预训练模型通常在海量通用数据上训练,具备广泛的语言理解能力。

模型微调是指在预训练的大型语言模型基础上,使用特定领域或任务的数据进行进一步训练,使模型能够更好地适应特定应用场景的过程。

二、微调的作用

  1. 提高准确性:使用垂直领域(如医疗、金融行业)的数据微调后,模型在该领域的准确率和可靠性会显著提升。

  2. 增强可控性:通过微调可以调整模型的行为模式、输出格式和回答风格,使其更符合预期。

三、微调的场景

  1. 尽力优化提示词工程,但模型效果仍不理想,或提示词本身变得过于复杂。

  2. 对模型输出有特定的格式要求,但它有时无法稳定地满足要求。

  3. 希望精简提示词,以加快线上推理速度或降低Token。

四、如何进行微调

可通过【火山方舟】或者【阿里云百炼】进行模型的微调

(一)准备阶段

  1. 明确目标

首先要确定你希望模型微调后具备什么能力。比如:

  • 知识注入:让模型学会公司内部的规章制度。

  • 格式对齐:让模型严格按照 JSON 格式输出结果。

  • 风格迁移:让模型用特定的语气(如客服语气)进行回复。

  1. 收集与构建数据集

微调需要成对的 (指令/问题, 预期回答) 数据。通常格式如下(通常保存为 JSONL 文件):

{"messages":[{"role":"user","content":"请根据古诗内容,仅回复作者的名字:姑苏城外寒山寺,夜半钟声到客船"},{"role":"assistant","reasoning_content":"用户让我根据古诗内容回复作者名字,诗句是“姑苏城外寒山寺,夜半钟声到客船”。首先,我需要确定这句诗出自哪首诗。这句诗很有名,应该是张继的《枫桥夜泊》。记得以前学过,这首诗的作者是唐代诗人张继。用户要求仅回复作者名字,所以不需要其他内容。检查一下搜索到的信息,虽然这里显示没有具体资源,但根据已有的知识,确定作者是张继没错。所以直接回复名字即可,不用多余的解释。","content":"张继","loss_weight":1}]}
{"messages":[{"role": "user", "content": "什么时候需要SFT?"}, {"role": "assistant", "content": "通过 prompt engineering 无法解决或 prompt 中描述过于复杂时;对大模型输出内容有格式要求时,而模型仍有部分 case 不符合要求;期望通过 SFT 来减少 prompt 中的内容,加速线上推理的耗时。"}]}

数据的质量远比数量重要。几千条人工精编、高质量的问答数据,微调效果往往好于几十万条粗糙拼凑的数据。

数据量级建议

起初不需要构建大量 SFT 数据集,建议优先采用少量数据(50条~100条)对模型做 SFT 后观察真实评估是否有收益。如果有收益,可以尝试以部分数据为种子数据集继续扩充以优化表现。如果无明显作用,建议检查 SFT 数据集的质量。

  • 针对不同场景下,数据量级的建议:

    • 文案生成,剧本创作,小说续写等生成类任务:2~3k。

    • 参考问答:2k ~ 1w。

    • 文本分类:1~3k,和类别数量以及任务难易度强相关,类别较多/任务较难的场景可能需要1w条以上。

  • 如何扩充SFT数据:

    • 明确数据扩充任务的输入输出映射关系,选用适配模型,通过前缀提示(PE)+ 小样本示例(Few Shots) 策略构建提示词。

    • 驱动模型生成补充样本,将其纳入 SFT 数据集候选池。

    • 校验生成样本与人工标注样本的风格、精度一致性;若不达标,迭代优化提示词并重新生成。

数据质量判断

  • Badcase 的覆盖度:SFT 核心目标是解决已知 Badcase,需确保数据集充分覆盖存量 Badcase 场景,为模型优化提供明确优化目标。

  • 贴合真实应用场景:示例的提示词与输出需与实际应用场景一致,尽可能贴近真实需求。

  • 保证问答质量:问题与答案需具体、清晰。

  • 高质量数据源:优选历史数据、专家标注数据、业务日志数据。


(二)技术与方案选型阶段

针对你手头的预算和目标,选择合适的微调策略。

  1. 选择基座模型 (Base Model)

挑选一个经过预训练的开源模型。常见的有 Llama-3、Qwen (通义千问)、GLM-4 等。如果你想在普通电脑上跑,可能选 7B(70亿)或 8B 量级的参数;如果在服务器上,可能选 70B 或更大。

  1. 选择微调方法

这是技术核心所在。目前主流有两类:

  • 全参数微调 (Full Parameter SFT)

    • 把模型里所有的参数(几十到几千亿个)全都解冻,根据新数据重新训练一遍。

    • 缺点:极其烧钱,需要巨量显存(GPU),普通人玩不起。

    • 优点:模型吸收新知识非常通透,能力天花板高。

  • 高效参数微调 (PEFT, Parameter-Efficient Fine-Tuning) —— 以 LoRA 为代表

    • LoRA (Low-Rank Adaptation) 的原理是:冻结原模型所有的巨大参数网,不改变它。而在它旁边挂载一个非常小的附加网络(补丁)。训练时,只更新这个“补丁”里的参数。 比喻:就像你买了一本昂贵的《辞海》(预训练模型),你不想在书上乱画(全参数微调),所以你拿了一本小小的便利贴(LoRA),把笔记写在便利贴上,贴在书旁边。

    • QLoRA (Quantized LoRA):进一步把原模型的数据精度压缩(从32位浮点数压到4位),极大地降低显存占用。现在甚至可以在单张普通游戏显卡(如 RTX 4090)上微调几十亿参数的大模型。


(三)训练阶段

在这个阶段,让机器开始“啃教材”。现在开源社区有很多傻瓜式的框架(如 LLaMA-Factory),懂一点点参数配置就能跑起来。

  1. 设置超参数

你需要像老中医配药一样,调整模型学习的参数,决定它如何学习:

  • 学习率 (Learning Rate):模型更新知识的跨度。设置过高可能导致陷入局部最优或过拟合,设置过低则会减慢训练速度或导致训练难以收敛。 经验参考值

    • LORA 训练:建议设置为 1e-5 到 5e-5。

    • 全量 SFT:建议设置为 1e-5 到 2e-5。

  • 批次大小(Batch Size):模型一次看多少道题。

  • 训练轮数(Epoch):这套教材让模型反复读几遍。读少了没学会(欠拟合),读多了会死记硬背变成了书呆子(过拟合)。

    • 通用建议:通常设置为 2 到 5 轮。

    • 判断方法:可以通过观察 loss 曲线来判断是否需要调整:

      • 过拟合:如果训练集 loss 下降而验证集 loss 上升,说明模型已过拟合,应停止训练。

      • 未收敛:如果训练集和验证集 loss 都在缓慢下降,说明模型尚未收敛,可以继续训练。

    • 特殊场景:对于文案生成、小说创作等生成类任务,loss 无法完全反映上下文逻辑和风格。根据经验,可将 epoch 适当增大,例如设置为 5 到 10 轮。

  1. 开始训练

点击运行后,紧紧盯着一张叫做 Loss(损失函数)下降曲线 的图表。Loss 分数代表着“模型当前回答跟标准答案的差距”。

理想状态下,Loss 线会平稳下降,最终稳定在一个低水平。

  1. 警惕“灾难性遗忘”

如果在微调时喂了太多某一领域的特定数据(比如一直让它背法律条文),模型可能会把原来预训练时学到的常识给忘了(比如忘记了基本运算或者无法正常对话)。这就叫灾难性遗忘。通常通过在微调数据中混入一些通用对话数据来缓解。


(四)效果评估阶段

  1. 确定性任务:

    Label 标注准确、输出结果唯一的任务,如分类、实体抽取、信息提取等任务。

    核心评估依据为训练集与验证集的 loss 指标,重点关注两点:

    • 训练集与验证集的损失是否同步下降;

    • 多轮 epoch 训练后,loss 是否趋于收敛。

  2. 生成式任务: 输出结果多样、无固定标准答案的任务,如问答、文案生成、角色扮演对话等任务。

    采用训练集 loss 参考 + 真实评估集业务指标主导的评估策略:

    • 训练集 loss 仅作参考:验证集 loss 计算依赖 token 级 KL 散度损失,与真实业务场景的输出要求不完全匹配,可能出现验证集 loss 无明显下降但业务指标提升的情况;

    • 真实评估集指标为核心:服务发布后,基于真实评估集的业务指标(如内容相关性、流畅度、用户满意度等)判定最终微调效果。

五、微调的价格

https://www.volcengine.com/docs/82379/1544106?lang=zh#b3a42676