核心目的是为了防止一个叫做灾难性遗忘 的现象,并提升模型的泛化能力。
-
防止灾难性遗忘
- 什么是灾难性遗忘? 如果只用新数据对预训练好的模型进行微调,模型会为了完美拟合新数据而剧烈地调整其权重。这个过程会覆盖掉它在海量原始预训练数据中学到的通用知识和技能。最终,模型可能会变成一个只懂新任务的“专家”,但忘记了如何说人话、理解基本语法、拥有常识等基础能力。
- 类比:就像一个学会了多种武术的格斗家,如果让他只专注于练习拳击,他可能会忘记如何踢腿和摔跤。混合数据就像是让他在练习拳击的同时,也复习一下其他武术,保持全面的格斗技能。
-
提升泛化能力和稳定性
- 只在新数据上微调,模型容易过拟合到新数据的特定分布和噪声中。混合旧数据(即原始预训练数据的抽样)相当于一种正则化,迫使模型在学习新任务的同时,不能偏离其原始的知识基础太远。
- 这有助于模型找到一个更好的平衡点,使其既能完成新任务,又保留了强大的基础能力,从而在面对未见过的、需要综合知识的任务时,表现得更鲁棒。
-
保持基础能力
- 预训练模型具备的强大能力,如语言理解、逻辑推理、代码生成等,是其价值所在。混合数据是为了在注入新知识或技能时,尽可能地保留这些宝贵的基础能力。
新旧数据的混合比例是多少?
这是一个没有固定答案的“炼丹”问题,最佳比例取决于你的具体目标、数据和资源。但我们可以给出一些指导原则和常见的经验范围。
影响比例的关键因素:
-
微调目标:
- 目标驱动型:如果你的目标是让模型掌握一个全新的、与预训练知识关联不大的技能(例如,让一个通用模型学习法律条文分析),你可能需要较高比例的新数据。
- 风格/知识增强型:如果你的目标是让模型适应一种新的写作风格,或者在保留其大部分能力的基础上注入一些新知识,那么旧数据的比例应该更高。
-
新数据的数量和质量:
- 新数据量很少(几百条):旧数据的比例需要非常高,以防止过拟合和严重遗忘。
- 新数据量很大(数万条以上):旧数据的比例可以适当降低,因为模型有足够多的样本来学习新任务而不至于立刻忘记旧知识。
-
新任务与预训练任务的相似度:
- 相似度高(如:从通用聊天到客服聊天):新旧数据分布接近,旧数据比例可以低一些。
- 相似度低(如:从通用聊天到生成SQL代码):新旧数据分布差异大,需要更高的旧数据比例来“拉住”模型,防止它跑偏。
常见的经验比例范围:
在实践中,新旧数据的比例通常在 10:90 到 50:50 之间(新数据:旧数据)。以下是一些常见的场景:
- 常用起点: 20:80 (新:旧) 是一个被广泛使用的、相对安全的起点。这个比例能在学习新任务和防止遗忘之间取得一个不错的平衡。
- 指令微调: 在使用指令数据集(如 Alpaca, ShareGPT)对基础模型进行指令微调时,经常会混合大量原始预训练数据(作为“旧数据”),比例可能达到 10:90 甚至 5:95。这是因为目标是激发模型遵循指令的能力,而不是让它忘记通用知识。
- 小规模领域适应: 如果你只有几百条领域数据(如医疗报告生成),你可能会使用一个更高的旧数据比例,比如 10:90 或 15:85,以确保模型不会“学废了”。
- 大规模任务学习: 如果你有上万条高质量的任务数据,可以尝试更激进的比例,如 50:50 或 30:70。
如何寻找最佳比例?
最好的方法是通过实验:
-
确定基线:首先,评估你的基础模型在新任务和旧任务上的表现。
- 新任务:在你的验证集上评估。
- 旧任务:通过一些通用的评测集(如 MMLU, HellaSwag)或设计一些简单的测试来评估模型的基础能力是否下降。
-
设置实验:选择几个不同的比例进行微调实验,例如
10:90,20:80,30:70。 -
评估与选择:微调完成后,全面评估每个模型:
- 新任务性能:是否达到了预期?
- 旧任务性能:相比基线下降了多少?下降是否在可接受范围内?
- 综合能力:回答一些需要常识和推理的通用问题,感受其流畅度和智商是否在线。
- 选择:选择一个在新任务性能和旧任务保留度上达到最佳平衡的模型及其对应的比例。
总结
| 情况 | 推荐做法 | 目的 |
|---|---|---|
| 防止模型遗忘基础能力 | 必须混合 | 避免灾难性遗忘,保持模型通用性 |
| 新数据量少/任务差异大 | 高旧数据比例 (如 10:90, 20:80) | 防止过拟合,稳定训练 |
| 新数据量大/任务相似度高 | 可降低旧数据比例 (如 30:70, 50:50) | 更高效地学习新任务 |
| 不确定最佳比例 | 从 20:80 开始实验 | 这是一个相对安全且有效的起点 |
总而言之,新旧数据混合是微调成功的关键技巧之一。比例不是一个魔法数字,而是一个需要根据你的目标、数据和评估结果进行权衡和优化的超参数。