LLM 持续微调:技术详解与实战
让大语言模型(LLM)持续更新业务相关的新知识和技能,一直是业界难题。Together 微调平台今天推出了一个新功能:持续微调(Continued Fine-Tuning,CFT)。简单说,你只需要在微调时指定 --from-checkpoint 参数,训练就会从之前保存的检查点(Checkpoint)开始,而不是从头开始。
这篇技术文章将深入探讨持续微调的方方面面:它是什么、什么时候该用、以及最强大的应用场景。
如果你想直接看代码,我们准备了一个详细的代码笔记本。
什么是持续微调?
持续微调(CFT)指的是对一个已经经过训练的 LLM 进行顺序微调的过程。与从基础模型从头开始不同,持续微调建立在模型已经获得的知识和能力之上,能更高效地适应新任务、新领域或新语言。
持续微调在 LLM 生命周期中至关重要——如果你曾经微调过模型,很可能已经用过某种形式的 CFT。通常,人们会继续微调模型发布者放出的指令模型检查点。随着模型演进,CFT 提供了一种资源高效的方式来适应新用例,同时最大限度地减少先前学习能力的损失(也就是灾难性遗忘)——后面会详细讨论。
理解 LLM 的持续学习
LLM 的持续学习大致可分为持续预训练(CPT)和持续微调(CFT)。CPT 侧重于在特定领域的大规模文本语料上进一步训练基础预训练 LLM,用特定领域的信息增强模型的通用知识。CFT 则是在具有不同数据分布或时间偏移的连续下游任务上对 LLM 进行指令微调。这类数据集通常包含带标签的输入-输出对(比如问答对),目的是让模型的行为对齐到特定、定义明确的任务上。
CFT 包含多种方法,包括针对不同任务的微调、指令微调、模型精炼/编辑以及对齐。最近的研究也在探索用 CFT 来增强 LLM 的多语言能力。
持续微调最大的挑战之一是灾难性遗忘(Catastrophic Forgetting):当模型在新数据上微调时,其在先前任务上的性能会下降。先前的研究表明,不同微调阶段所用数据集之间的相似性,会显著影响模型保留先前能力的效果。
当阶段间的数据集编码相似任务时,模型能保持甚至提升其在先前任务上的表现。但如果数据集编码的是不同任务,模型在先前任务上的性能就可能大幅下降。这个发现对于设计有效的持续微调策略至关重要。
什么时候该用持续微调?
持续微调在以下几种场景中特别有价值:
- 当你已经微调过一个模型,想进一步改进它又不想从头开始:这在已经投入大量资源训练模型,又需要它适应新数据或新任务时尤其有用。
- 当你需要让模型适应新语言时:如果你有一个精通英语的模型,想扩展其到其他语言的能力,同时又不损害其英语表现。
- 当你的数据分布随时间变化时:对于部署在生产环境中的模型,查询类型或用户行为可能会演变。
- 当你想增量式地融入新知识或技能时:相比从头训练,持续微调能更高效地获取知识。
- 将 SFT 与 DPO 叠加使用——当你需要让模型与人类偏好对齐时:收集用户反馈后,你可以进一步微调模型,使其回应更符合用户预期。可以参考我们关于如何做 DPO 微调的深度笔记本。
实施持续微调前,有几个关键因素需要考虑:
- 数据集相似性:你的新数据集与模型先前训练的数据有多相似?高相似度通常能带来更好的知识保留。
- 学习率和训练时长:这些超参数对成功的持续微调至关重要,可能需要根据你的具体模型和数据集进行调整。
- 性能指标:明确定义成功标准,既要看新能力,也要看旧技能的保留情况。除了当前 CFT 步骤要提升的能力,还可以评估所有能力。
真实世界用例
多语言适配
持续微调最有前景的应用之一,是增强模型理解和生成多种语言文本的能力。先前的研究表明,CFT 可用于让模型适应新语言,同时不削弱其已掌握语言的表现。
传统方法常导致灾难性遗忘:模型在学习新语言时,其原始语言(通常是英语)的表现会下降。但最近的研究显示,只要用对技术——比如在不同语言间使用相似的任务数据集——模型就能在保持原始语言能力的同时,获得新语言能力。
例如,一个两阶段的 CFT 过程:先对纯英语的 LLM 进行微调,再在 multilingual 数据集上顺序微调,可以在不牺牲任务表现的前提下增强模型的语言能力,尤其是在数据集编码相似任务时。
任务特定性能提升
持续微调能显著提升模型在特定任务上的表现。这篇AWS 博客文章讨论了一个持续自指令微调框架,它用一个复合 AI 系统来驱动性能提升的微调工作流。
他们的基准测试结果显示,通过监督微调(SFT)训练的自定义 LLM 比标准 RAG 系统准确率更高,而通过偏好对齐(如 DPO)进一步精炼的模型表现提升更大。
偏好对齐与模型精炼
最后,持续微调对于让模型与人类偏好对齐非常有用。收集用户反馈后,你可以使用直接偏好优化(DPO)等技术来微调模型,使其更符合用户期望。可以阅读我们关于使用 DPO 进行偏好调优的深度文章。
AWS 的实现表明,通过人类和 AI 反馈进行偏好对齐的微调模型,其表现显著优于标准 RAG 流程,即使使用的是更小的基础模型。
想了解更多如何有效叠加持续微调和 DPO 偏好调优,请阅读我们另一篇关于 DPO 的技术深度文章。
在 Together 上开始使用 CFT
技术方法与最佳实践
要有效实施持续微调,你可以在我们的微调 API 中指定 --from-checkpoint 参数,如下所示:
together fine-tuning create \
--training-file "file-5e32a8e6-72b3-485d-ab76-71a73d9e1f5b" \
--from-checkpoint "ft-bb62e747-b8fc-49a3-985c-f32f7cc6bb04" \
--wandb-api-key $WANDB_API_KEY # 可选
你也可以使用 Python 或 TypeScript 客户端:
import os
from together import Together
client = Together(api_key=os.environ.get("TOGETHER_API_KEY"))
response = client.fine_tuning.create(
training_file = 'file-5e32a8e6-72b3-485d-ab76-71a73d9e1f5b',
from_checkpoint = 'ft-bb62e747-b8fc-49a3-985c-f32f7cc6bb04',
wandb_api_key = '1a2b3c4d5e.......',
)
print(response)
可以通过以下方式指定检查点:
- 先前任务的输出模型名称
- 微调任务标识符
- 特定检查点步骤,格式为
ft-...:{STEP_NUM}
要查看某个任务所有可用的检查点,使用 together fine-tuning list-checkpoints {FT_ID}。
持续微调代表了一种随时间演进和改进 LLM 的强大方法。通过在已训练模型的基础上构建,而不是从头开始,你可以更高效地让模型适应新任务、新领域和新语言,同时保留其现有能力。
查看深度代码笔记本,了解如何应用持续微调来改进函数调用,以及我们的文档。
参考资料
觉得有用?分享给更多人