ACL'24 | 微调大模型前,重写SFT数据
共 1741字,需浏览 4分钟
·
2024-10-12 08:00
微调大模型前,如何重写SFT数据?
作者:张义策
文章地址:https://zhuanlan.zhihu.com/p/710594520
Self-Distillation Bridges Distribution Gap in Language Model Fine-Tuning
论文地址:https://arxiv.org/abs/2402.13669
这是ACL24上的一篇长文。作者来自浙江大学、Sea AI Labs和腾讯。文章提出的方法比较简单。
为什么要重写SFT数据?
-
问题: 文章指出现有的大模型一般具备较好的general instruction-following abilities,但是在specific downstream tasks上可能表现不佳。为此,我们需要在特定任务上对大模型进行有监督的微调(supervised fine-tuning, SFT)。然而,这种微调在提高模型在特定任务上能力的同时,常会损害模型通用的指令遵循能力。
-
解决方案: 文章指出上述问题的原因是,特定任务的数据集和大模型之间存在分布上的差异。为此,文章提出了一种名为self-distillation fine-tuning(SDFT)的方法。名字很复杂,方法其实简单。如下图所示,其实就是让微调前的大模型将任务数据集重写一遍。这样的话,重写后的任务数据集的分布和大模型的差异就小了很多。在这样的数据集上微调对大模型分布上的改变会小很多,对大模型通用能力的损害也会降低。
seed language models = 微调前的大模型
如何重写SFT数据
如下图所示,将instruction和原本的response输入到大模型中,然后让大模型输出重写后的response。
重写后的response错了怎么办?文章使用了一个简单的策略。对比原本的response和重写后的response中的答案部分,如果不同就仍然使用原本的response。比如,在math reasoning问题上,可以用正则表达式从response中抽取最终的答案,然后比较重写前后的答案是否相同。
主要实验
文章使用Llama-2-7b-chat作为基座大模型,在微调时使用LoRA。文章选择的下游任务有GSM8K (数学推理)、Gorilla OpenmFunctions (工具学习)、MagiCoder (代码生成)。
如下图所示,我们可以发现,(1) 在特定任务上的微调会让大模型在其他任务上的性能明显下降;(2) 提出方法可以有效缓解这种下降(但是下降仍是不可避免)。
MagiCoder (代码生成任务) 使用HumanEval的方法评估
正如最开始提到下游任务上的微调会损害模型的通用能力。如下图所示,使用提出方法,大模型的回复的safety和helpfulness上的下降也被缓解。
文章还进行了一系列的实验:
-
微调数据规模的影响:数据越多,模型的分布改变越大,下降越明显。 -
混合原本的数据集和重写后的数据集:重写数据集比例越大,越能缓解性能的下降。 -
Llama-2-13B、Llama-3-8B上的实验:结论差不多。
总结
这篇文章指出特定任务上的微调会对模型的通用能力和其他任务上的能力造成负面影响,提出了重写微调数据集的方案来缓解这一问题。方法比较简单。印象中有其他的持续学习方法的工作,也是解决相同的问题。除此之外,感觉LoRA本身也是解决这个问题的方案之一,即不同的任务使用不同的adapter。