大语言模型(LLM)微调方法总结
一、引言
$\quad$在预训练后,大模型可以获得解决各种任务的通用能力。然而,越来越多的研究表明,大语言模型的能力可以根据特定目标进一步调整。降低大模型微调成本,由于模型规模的增大,传统微调的方法变得难以实现。指令微调与传统微调间的本质区别:
- 指令微调:是为了使得模型理解指令的含义,为了拟合指令,具体怎么做由底座模型来执行,所以它只需要少量的标注数据,而注重多样的指令数据。
- 传统微调:传统微调是为了拟合整个预测行为,所以它需要越多标注数据越好。
$\quad$ 更高效率的微调方式,因而称之为增量微调(Delta-tuning)的方法被提出。Delta tuning只更新少量参数,同时冻结其余占绝大多数的参数。目前主要有两种微调大模型的方法。
- 指令微调: 目标是增强(或解锁)大语言模型的能力。
- 对齐微调: 目标是将大语言模型的行为与人类的价值观或偏好对齐。
$\quad$ 此外,在多任务数据集上进行微调,微调后的语言模型具有很强的零任务概括能力。多任务微调也是很多大模型的常用手段。其目标是提升语言模型在多任务中零样本推理能力。参考文献
二、 指令微调(Instruction Tuning)
$\quad$ 指令微调是在自然语言格式的实例集合上微调预训练后的大语言模型的方法。这种方法与有监督微调和多任务提示训练密切相关。为了进行指令微调,我们首先需要:
- 收集或构造指令格式的实例;
- 使用这些格式化的实例以有监督的方式微调大语言模型(例如,使用序列到序列的损失进行训练)。
- 指令微调后,大语言模型展现出泛化到未见过任务的卓越能力 ,即使在多语言场景下也能有不错表现。
2.1 格式化实例构造(微调数据集)
$\quad$ 一个指令格式化的实例包括一个任务描述(被称为指令 instruction)、一个输入输出对以及少量示例(可选)。数据集一般用两种方法产出:
2.2 实例格式化和两种构造指令格式实例
- 格式化已有数据集:将传统的NLP数据集格式调整后,用于指令微调。为降低人工格式化成本,可以通过 ChatGPT 生成 Instruciton。典型 Prompt:“请你为这段内容生成一个合理的问题”
- 人工标注数据集:为获得更好的人类对齐效果,OpenAI 建议使用人工标注数据集。为降低人工标注成本,目前很多数据集由 ChatGPT 生成,包括用户分享的 ChatGPT 对话历史(如 ShareGPT)或者使用 ChatGPT生成的数据集。
$\quad$数据集也分为通用任务的数据集以及特定任务的数据集,前者目前有大量开源数据集可供使用,后者则针对某个具体领域,可以自行构建。此外引入多样化的数据集(包括引入 CoT思维链等)可以有效的提升模型性能。
2.3 数据集格式示例
$\quad$ 典型的数据集格式:{"instruction": "", "input": "", "output": ""}
, 如果要微调已经经过指令微调的模型,那么微调数据集的格式应该保持不变以获得最佳效果,格式包括分隔符、代码标签等。
2.4 指令微调的效果
$\quad$ 指令微调可以让大模型有质的提升,主要体现在两个方面:
- 性能改进:最近的研究发现经过指令微调的较小模型甚至可以比未经微调的较大模型表现更好。除了模型规模外,指令微调在不同的模型架构、预训练目标和模型适应方法上都展现出持续的改进效果。在实践中,指令微调为提升现有语言模型(包括小型预训练语言模型)的能力提供了一种通用的方法 。此外,与预训练相比,指令微调成本较低,因为大语言模型所需的指令数据数量明显较少于预训练数据。
- 任务泛化性:指令微调鼓励模型理解用于任务完成的自然语言指令。它赋予大语言模型遵循人类指令执行特定任务的能力(通常被视为一种涌现能力),即使在未见过的任务上也能够执行 。大量研究已经证实了指令微调在已见和未见任务上实现卓越的性能表现。此外,指令微调还被证明对缓解大语言模型的一些弱点(如生成重复内容或在不完成特定任务的情况下补充输入)具有帮助,从而使大语言模型具有更强的解决现实世界任务的能力。此外,通过使用指令微调训练的大语言模型可以在不同语言之间泛化到相关任务。
三、参数高效微调 (Parameter-Efficient Fine-Tuning)
$\quad$ 虽然指令微调相比于预训练更加高效(只需要处理微调数据集),但是全参数的指令微调依然需要消耗较多的算力。目前有多种高效参数微调方案,可以在实现和全参数微调相同性能的情况下,大幅降低微调成本。
$\quad$ 参数高效微调,也称为 PEFT,可以仅微调少量或者额外的模型参数,并固定住大部分预训练参数,从而大大降低训练成本。目前研究表明,PEFT 相比于全参数微调,在没有微调过的大语言模型上性能略差,但是在已经微调过的模型上,性能接近。PEFT 方法可以分为四类,不同的方法对模型的不同部分进行下游任务的适配:
3.1 Prefix/Prompt-Tuning
$\quad$ 在模型的输入或隐层添加 k 个额外可训练的前缀 tokens(这些前缀是连续的伪 tokens,不对应真实的 tokens),只训练这些前缀参数。具体而言,Prefix tuning是通过更新预先插入的参数来调整PLM;而Prompt tuning更新任务特定的可训练参数。
3.2 Adapter-Tuning
$\quad$ 将较小的神经网络层或模块插入预训练模型的每一层,这些新插入的神经模块称为adapter(适配器),下游任务微调时也只训练这些适配器参数。是在PLM的层之间插入适配器模块,并且只有这些插入的模块在微调期间得到更新。
3.3 LoRA
$\quad$ 通过学习小参数的低秩矩阵来近似模型权重矩阵W的参数更新,训练时只优化低秩矩阵参数。将注意力权重梯度分解为低秩矩阵,以减少可训练参数的数量。
3.4 BitFit
$\quad$ 一种稀疏的finetune方法,它只在训练时更新bias的参数(或者部分bias参数)。对于transformer模型而言,冻结大部分模型参数,只训练更新bias参数跟特定任务的分类层参数。即,只更新PLM中的偏差项,同时冻结PLM其余参数。
$\quad$目前针对大语言模型,评测效果最好的是 LoRa。其基本原理是在原始预训练权重旁边增加一个旁路,做一个降维再升维的操作k。训练的时候固定预训练权重,只训练降维矩阵A与升维矩阵B。而模型的输入输出维度不变,输出时将B/A与预训练权重的参数叠加。实际微调过程中,A/B 基本在MB级别,与之相比,大语言模型的权重通常在GB级别。
3.5 参数高效微调的对比结果
Prompt tuning | Prefix tuning | LORA | Adapter | Fine tuning | |
---|---|---|---|---|---|
需要更新的参数比例 | 0.01% | 7.93% | 0.38% | 2.38% | 100% |
平均得分 | 65.92 | 64.07 | 66.06 | 65.58 | 67.96 |
3.6 分析与结论
- Delta tunig和fine tuning之间的差距并非不可逾越,这证明了参数有效自适应的大规模应用的潜力。参考文献
- Full-Tuning 效果应该是最好的,但 Full-Tuning 需要机器资源多,训练时间长。其次是 P-TuningV2/Lora/Freezing 的话,貌似是 P-TuningV2 效果最佳。 参考文献;开源代码
四、对话微调 (Conversation Tuning)
$\quad$ 对话微调是一种特殊的指令微调。其目的是让大语言模型在「补全」能力的基础上,解锁「对话」能力。典型的数据集格式:
{"instruction": "", "input": "", "output": "", "history": [{"", ""}, {"", ""}]}
五、 COT(Chain-of-Thought)微调
5.1 目的
$\quad$ 大模型的思维链能力,指的是一步一步地展示推理过程能力。但是,研究者发现,小语言模型(通常小于100B)几乎很难获得这种能力。为了使小模型也拥有思维链的能力,多个研究使用大模型GPT3,PalM作为教师模型进行训练,使学生模型T5和FlanT5获得了一定的思维链能力。
5.2 方法/步骤
- 第一步:将文本(questions + prompt)输入给大模型;
- 第二步:用大模型输出含有思维链且正确的文本作为label;
- 第三步:用上述数据组成的数据对(右图Reasoning samples),直接对小模型进行微调。
5.3 对齐微调
$\quad$大语言模型在多个自然语言处理任务上展示出了惊人 的能力。但是, 这些模型有时可能表现出意外的行为,例如制造虚假信息、追求不准确的目标,以及产生有害的、误导性的和偏见性的表达。对于 LLM, 语言建模目标通过单词预测对模型参数进行预训练,但缺乏对人类价值观或偏好的考虑。为了避免这些意外行为,研究提出了人类对齐,使大语言模型行为能够符合人类的期望。
$\quad$但是, 与初始的预训练和适应微调(例如指令微调)不同, 语言模型的对齐需要考虑不同的标准(例如有用性, 诚实性和无害性)。 已有研究表明对齐微调可能会在某种程度上损害大语言模型的通用能力,这在相关研究中被称为对齐税。
5.4 对齐标准
- 有用性: 简明扼要且高效的方式帮助用户解决任务或回答问题。在更高层次上,当需要进一步澄清时,大语言模型应展示出通过相关提问获取额外相关信息的能力,并表现出合适的敏感度、洞察力和审慎程度。
- 诚实性:应该向用户提供准确的内容,而不会捏造信息。此外,大语言模型在输出时传达适当程度的不确定性至关重要,以避免任何形式的欺骗或信息误传。这需要模型了解其能力和知识水平(即所谓的“知道自己不知道”)。
- 无害性:模型生成的语言不得具有冒犯性或歧视性,同时不能生成违反法律法规以及道德规范的有害信息。
5.5 基于人类反馈的强化学习思想(RLHF)
通过 RLHF,大模型可以根据人类反馈进行强化学习,从而和人类对齐。典型步骤如下图:
5.6 基于人类反馈的强化学习步骤
- 监督微调(可选):为了使 LM(语言模型) 具有初步执行所需行为的能力,通常需要收集一个包含输入提示(指令)和所需输出的监督数据集,以对 LM 进行微调。这些提示和输出可以由人工标注人员针对某些特定任务编写,同时确保任务的多样性。例如,InstructGPT 要求人工标注者编写提示(例如,“Listfive ideas for how to regain enthusiasm for my career”)和一些生成式任务(如开放域问答、头脑风暴、聊天和重写)的期望输出。
- 训练奖励模型:第二步是使用人类反馈数据训练 RM(奖励模型)。具体来说,使用 LM 使用采样提示(来自监督数据集或人工生成的提示)作为输入来生成一定数量的输出文本,然后邀请人工标注员为这些对标注偏好。标注过程可以以多种形式进行,常见的做法是对生成的候选文本进行排序标注,这样可以减少标注者之间的不一致性。然后,需要训练 RM 预测人类偏好的输出。在 InstructGPT 中,标注员将模型生成的输出从最好到最差进行排名,然后训练 RM(即 6B 参数量的 GPT-3)来预测排名。
在实践中,目前可以使用 GPT-4 代替人类进行排序标注,从而降低人工标注成本。 - RL(强化学习) 微调:在这一步骤中,对齐(即微调)LM 被形式化为 RL 问题。在此设置中,预训练的 LM 作为策略,将提示作为输入并返回输出文本,它的动作空间是 LM 的词表,状态是当前生成的 token 序列,奖励由 RM 生成。为了避免显着偏离初始(调整前)LM,通常将惩罚项纳入奖励函数。例如,InstructGPT 使用 PPO 算法针对 RM 优化 LM。对于每个输入提示,InstructGPT 计算当前 LM 和初始 LM 生成的结果之间的 KL 散度作为惩罚。值得注意的是,第二步和最后一步可以多次迭代来更好地对齐 LLM。
六、参考文献以及相关工具
- 大语言模型(LLM)微调技术笔记
- Teaching Small Language Models to Reason
- Large Language Models Are Reasoning Teachers
- Specializing Smaller Language Models towards Multi-Step Reasoning
- BELLE: 基于 LLaMA 的中文模型及微调训练工具库。
- ChatGLM-6B 清华开源中文大模型,及微调训练工具库。
- ChatGLM-Efficient-Tuning: 对 ChatGLM-6B 进行参数高效微调。
- Linly: 基于 LLaMA 使用中文增量预训练以及微调训练的中文模型。
-LLM-Adapters 对 PEFT 的扩展,支持AdpaterP、AdpaterH、Parallel 等方法。 - LLMZoo: Phoenix-inst-chat-7b 中文模型(基于BLOOMZ)及微调训练工具库。
- Chinese-LLaMA-Alpaca: 基于 LLaMA 使用中文增量预训练以及微调训练的中文模型。
- LMFlow : 一个可扩展、方便和高效的工具箱,用于微调大型机器学习模型。支持所有 Decoder 模型的微调。
- PEFT: 参数高效微调工具库。支持 LoRA、Prefix Tuning、P-Tuning、Prompt Tuning、AdaLoRA等方法。
- FastChat: FastChat is an open platform for training, serving, and evaluating large language model based chatbots.