https://openreview.net/forum?id=XkHJo8iXGQ
本文介绍一篇相当有意思的文章,该文章的内容对我们使用指令微调将预训练模型改造为chat模型和下游专业模型相当有指导意义。本文的标题听起来有些唬人,有些标题党,但是这个论点在一定的限定条件下是成立的,笔者归纳为:对充分预训练的模型使用通用指令微调数据集进行全量微调有害。
LoRA指令微调并不能学习知识,但它很优秀
试图使用指令微调来为模型灌输知识,其实是一个很常见的做法。然而只要这样做过的人会发现,效果并不会特别好,特别是使用LoRA训练时,模型几乎学不到任何知识。笔者自己的实践是,在使用LoRA对一个Llama3.1本身没有怎么预训练过的内容进行微调时,最终的结果和随机预测基本没有区别(分类和回归任务改造的指令微调数据集)。这提示我们,在使用指令微调对模型进行训练时,首先需要确定模型是否预训练过相关内容,如果没有,最好进行补充性的继续预训练。
如何衡量模型是否通过指令微调学习到了知识?
作者团队通过比较微调后的模型和预训练模型的输出token概率分布来确定模型是否学习到了新知识。也就是说,我们定义指令 ,期望的输出为 。那么在第 步时,模型输出的token: 对应的上下文窗口为 。作者团队分析 对应的模型概率分布来量化指令微调过程中的知识学习。具体而言,对一个给定的上下文窗口,有预训练模型的概率分布 和指令微调模型的概率分布 。对于这两个概率分布,我们有三种分析方法:
直接衡量两个概率分布的KL散度,KL散度越大说明模型学到了越多的知识。 对于 中的 token 我们查看它在 中的概率,该概率越小,说明模型的知识产生的越大的偏离。 对于 中的 token 我们查看它在 的排序,如果排序仍为 我们将其归类为未偏移;如果排序为 将其归类为边缘偏移;否则归类为偏移。
从图一中我们可以发现,通过LoRA训练后,模型的概率分布偏移的并不大。模型仅在前百分之五的概率分布中有比较大的KL散度发散,而在余下的概率分布中几乎保持不变,并且与全量训练相比,LoRA训练的KL散度偏移接近于0。这说明LoRA仅仅做到了学会输出的格式,而做不到学会具体的知识。体现在loss上我们可以发现,使用LoRA训练时模型收敛的非常快,然而在快速收敛之后loss保持平稳,无法进行进一步的下降。
当然,这个结论有一个前提,那就是模型在相关领域上有充分的预训练。经过充分预训练之后,将模型应用到聊天上,只需要令其学会输出结果的格式。而不需要让其学会新的知识,因为模型能够依靠充足的知识储备来给出正确回答。而新的知识反而会扰乱这种知识储备。
全量微调有害
指令微调数据集通常都有自己的模式,最典型的例子,去年被很多大模型厂商用来训练自己的模型的非常受欢迎的ShareGPT数据集。由于该数据集是由与ChatGPT对话而来,它完全是ChatGPT的风格。使用ShareGPT训练模型会使模型的风格贴近ChatGPT,甚至认为自己就是ChatGPT。使用有明显风格的数据集训练模型,会让模型进行模式复制。模式复制有两种:
模仿指令微调数据集中的用词。 模型指令微调数据集中的风格。
作者团队研究了全量微调和LoRA微调后模型输出概率分布中的边缘偏移token和偏移token。发现LoRA训练后的偏移token常常为风格token,例如However和Typically。而全量微调中的偏移token包含了指令微调数据集中出现的所有token,也就是说全量微调可能会把指令微调数据集中的任何token利用到测试场景中,即使这些token与测试场景无关。图五给出了一些例子,例如在图五的左边。测试场景的提问为是什么导致了极光,而全量微调的模型大量使用了指令微调数据集中问题为“哪里能看到极光“的样本中的token,这导致了输出的内容偏离了实际的提问,而LoRA训练的模型则正确的回答了该问题。
扫描二维码添加小助手微信