1、为什么感觉傻
简单来讲,SFT的重点在于激发大模型的能力,SFT的数据量相比于预训练的数据还是太少了。如果抱着灌注领域知识而不是激发能力的想法,去做SFT的话,可能确实容易把LLM弄傻。具体来说:
SFT的目标与数据量的矛盾
- SFT的核心目标:SFT的主要目的是通过少量的标注数据来激发语言模型的潜力,而不是完全重新训练模型。它希望模型能够更好地适应特定的任务或领域,同时保留其预训练阶段学到的通用知识。
- 数据量的限制:SFT的数据量通常较小,例如Alpaca数据集的52k量级。相比预训练阶段使用的海量数据(通常是数十亿甚至数千亿的token),这样的数据量确实微不足道。如果SFT的目标是通过如此少量的数据来“灌注”大量领域知识,而不是激发模型的潜力,可能会导致以下问题:
过度拟合:模型可能会过度拟合这少量的SFT数据,从而在其他未见过的任务或数据上表现变差。
灾难性遗忘:模型可能会在学习新任务的过程中忘记之前学到的通用知识,导致整体性能下降。
误解SFT的作用
- 激发能力 vs. 灌注知识:SFT的核心作用是激发模型的潜力,而不是直接“灌注”领域知识。预训练模型已经具备了强大的语言理解和生成能力,SFT的目的是通过少量标注数据来引导模型更好地适应特定任务,而不是让模型从头学习新的知识。
- 如果错误地将SFT当作一种“灌注知识”的手段,可能会对模型进行过度的调整,从而破坏其原有的通用能力。例如,如果用少量的、特定领域的数据对模型进行微调,模型可能会变得过于专注于这些特定数据,而失去了在其他任务上的泛化能力。
指令微调的真正作用
- 指令微调的优势:指令微调(Instruction Fine-Tuning)是SFT的一种特殊形式,其核心目的是通过少量的指令数据来增强模型对任务的理解能力。它让模型学会如何根据指令来完成任务,而不是直接灌输特定的知识。
- 泛化能力的提升:指令微调后,大语言模型展现出卓越的泛化能力,能够更好地适应未见过的任务,甚至在多语言场景下也能有不错的表现。这是因为指令微调帮助模型学会了如何根据指令来调整自己的行为,而不是依赖于具体的领域知识。
- 如果SFT偏离了这一目标,可能会导致模型在特定任务上表现较好,但在其他任务上表现变差,从而给人一种“变傻”的感觉。
2、如何降低这种现象
SFT数据比较多或者epoch比较大时,可能会导致SFT后大模型的通用能力下降,导致灾难性遗忘,这要根据实际场景判断,如果只关注特殊领域的性能,通用能力下降也不需要过度关注,如果想要不失去通用的生成能力,可以考虑以下几点:
- 多任务微调:如果希望模型保持多任务泛化能力,可以一次性对多个任务执行微调。良好的多任务微调可能需要包含许多任务的50-100,000个示例。
- 考虑PEFT的方法:也就是保留了原始LLM的权重,不采用全参数微调的方法。通过训练少量特定于任务的适配器层和参数。PEFT对灾难性遗忘表现出更大的鲁棒性,因为大多数预训练的权重保持不变。
- 数据配比:在SFT数据中,增加一些通用生成的数据,避免SFT过度学习单一训练集内容。