通常,单个预训练的大型语言模型(LLM)需要在多项不同任务上表现出色。多任务微调(MT-FT)提供了一个有吸引力的方案,而不是为每个目标分别微调独立模型。这种方法让一个模型实例同时或按顺序在多项任务的数据上训练,目标是提高整体性能、泛化能力和效率。通过学习相关任务间的共同表示,模型通常能取得更好效果,尤其当某些任务训练数据有限时。
多任务微调的基本理念
多任务微调的核心理念是,从一项任务中获得的学习信号可以为另一项任务提供有用的归纳偏置。考虑文本摘要和标题生成这类任务;为一项任务学到的技能(例如,识别突出信息)通常对另一项任务也很有益处。这与单任务微调形成对比,后者模型仅为一个目标进行优化,可能因此错失这些协同效果。
采用多任务微调的主要原因包括:
- 泛化能力提升: 接触多类任务有助于模型学习更基础的语言理解能力,从而在未见数据或相关下游任务上表现更好。
- 数据效率: 数据充足的任务可以隐式地对数据稀缺的任务进行正则化并提供支持,从而利用共享知识。
- 降低部署开销: 维护和运行一个多功能模型通常比管理多个专用模型更简单、更具成本效益。
- 正向迁移: 明确鼓励模型在任务之间找到共通点,可以带来超越单任务微调结果的性能提升,特别是对于密切相关的任务。
多任务实现方法
存在多种实现多任务微调的方法,每种都有其取舍:
联合训练(混合数据方法)
这是最常用的策略。来自不同任务的数据实例被合并起来,并用于共同更新模型参数。
- 机制: 训练批次通过从所有包含任务的数据集中采样示例来构建。模型处理这些示例,计算每个示例任务特定的损失,并根据组合的损失信号更新其参数。
- 数据采样: 数据的采样方式显著影响训练动态。常用方法包括:
- 比例采样: 根据每个任务数据集的大小比例进行采样。可能导致较大任务占主导地位。
- 均匀采样: 在任务间均匀采样,确保每个任务获得同等表示,不考虑数据集大小。
- 基于温度的采样: 使用温度参数根据数据集大小调整采样概率,实现比例采样和均匀采样之间的平滑控制。公式:P(ext任务i)∝∣Di∣1/T,其中 ∣Di∣ 是数据集 i 的大小,T 是温度参数。T→0 接近均匀采样,T=1 为比例采样。
- 任务格式化: 由于单个模型处理所有任务,输入示例通常需要格式化以指示预期任务。这通常通过在输入序列前添加任务特定的指令或前缀来完成(例如,
"Summarize the following article: ...","Translate to German: ...")。格式的一致性很重要。
多任务微调中典型联合训练的数据流。来自不同任务的数据被采样、格式化、分批并输入到单个大型语言模型中。损失被合并以进行参数更新。
顺序训练
在这种方法中,模型一个接一个地在任务上进行微调。例如,首先在任务A上微调,然后使用所得检查点在任务B上进一步微调。
- 机制: 实现起来比联合训练更简单,因为每个阶段都类似于单任务微调。
- 挑战: 极易受到灾难性遗忘的影响,即模型在适应后续任务时丧失对早期任务的熟练度。任务呈现的顺序可以显著影响最终性能。后续讨论的减轻灾难性遗忘的方法在此处尤为相关。尽管有时会被使用,但在实现平衡的多任务熟练度方面,它通常不如联合训练受欢迎,除非有特定的任务顺序(如课程学习)意图。
参数分配策略
第4章讨论的参数高效微调(PEFT)技术可以适用于多任务场景。
- 任务专用适配器: 为每个任务训练独立的适配器模块(如LoRA层或适配器块),同时保持大型语言模型的基础部分冻结。在推理期间,可以根据任务加载相应的适配器。这隔离了任务特定知识,并在内在避免了负向迁移,但代价是训练期间参数数量略有增加(尽管仍远低于完全微调)。
- 带任务嵌入的共享适配器: 使用一组单一的适配器层,但根据学到的任务嵌入来调节它们的行为,从而实现部分参数共享,同时保持任务的特异性。
联合训练中的损失计算
在联合训练时,批次内来自不同任务的损失需要合并为一个单一标量值以进行反向传播。
- 简单求和: L总计=∑i=1NLi,其中 Li 是批次中任务 i 的损失。这会平等对待所有任务。
- 加权求和: L总计=∑i=1NwiLi。权重 wi 允许优先处理某些任务,补偿不同的数据集大小,或平衡具有不同损失尺度或收敛速度的任务。权重可以是静态的(作为超参数设置)或动态的(在训练期间调整,例如,基于任务不确定性或性能)。选择合适的权重通常是经验性的,并增加了调优过程的复杂性。
优点与挑战概述
优点:
- 任务间协同学习和正向迁移的潜力。
- 模型泛化能力和鲁棒性提升。
- 有效的正则化,对低数据任务特别有益。
- 通过单一、多功能模型实现操作效率。
挑战:
- 负向迁移: 学习一项任务可能会妨碍另一项任务的性能,尤其当任务不相关或冲突时。
- 任务干扰: 优化动态可能变得复杂;一项任务的进展可能会波动或退步,而另一项任务却在改进。
- 任务平衡: 确保没有单一任务主导学习过程需要仔细的数据采样和损失加权。任务间梯度的高方差可能使训练不稳定。
- 优化复杂性: 找到在所有任务上都表现良好的最佳超参数(学习率、批次大小、采样策略、损失权重)比单任务微调要求更高。
- 评估: 需要对所有目标任务进行全面评估以确保性能平衡。
实际考量
- 任务选择: 当任务相关或共享底层语言现象时,多任务微调效果最佳。组合高度不相似的任务可能导致负向迁移。
- 实现: 像Hugging Face的
Trainer这样的库可以处理混合数据集,但可能需要仔细配置数据整理、采样以及潜在的自定义损失计算。自定义训练循环提供了更大的灵活性。
- 监控: 在整个训练过程中跟踪每个独立任务的性能指标,而不仅仅是组合损失。这有助于诊断任务主导或遗忘等问题。
多任务微调是构建能力更强、效率更高的大型语言模型的有效技术。然而,它在数据处理、训练动态和评估方面带来了复杂性,需要仔细考量和经验调优才能获得最佳效果。成功时,它能够生成远比单任务模型更通用的模型。