这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战
Background
预训练语言模型成为 NLP 主流之后,大家已经习惯了用 Pretrain-finetune 解决各类语言任务。直到 2021 年下旬 prompt 突然爆火,涌现了一大批 prompting 相关的工作,从模板设计到答案映射,可谓盛极一时。
然而,不管是 finetuning 还是 prompting,都只在 few-shot 情况下表现尚可,而不能胜任 zero-shot learning,尽管在很多任务中的表现差强人意,但也暴露了一个很重要的问题:预训练语言模型的巨大潜力还远远没有被发掘出来,每次都要依靠微调来适应下游任务终究不是长久之策,训练起来如此耗时费力,PLM 的表现还能否更进一步呢?
于是,prompting 的狂欢还未结束,2021 年 9 月,谷歌提出新模型 FLAN,用 Multi-task Learning 的方法和一种别出心裁的微调方式对 PLM 进行微调,在参数少 400 亿的情况下,性能超越 GPT-3。这种 Multi-task Learning 的策略看似毫无新意,却很可能就是让 PLM 更通用、更成熟的解决方案之一。
本文发表于 ICLR 2022,作者团队来自 Google Research。
原文链接:Finetuned Language Models Are Zero-Shot Learners
Methods
对于未知任务 A,将预训练 LM 在很多个其它任务 ( B, C, ... ) 上进行微调,用微调后的模型直接处理下游任务 A,如图:
其中,微调时将自然语言描述的任务指令与数据拼在一起,如下图所示,以 Commonsense Reasoning 为例,将 How would you accomplish this goal? 拼接在预测对象 OPTIONS 的前面。
作者一共选取了 60 多个 NLP 数据集用来微调,分类为 12 个任务形式。这里值得注意的是,作者在实现的过程中,为了保证 zero-shot 的公平性,对于未知任务 A ,所有与 A 同类的数据集都不会用于微调,而与 A 不同类的数据集则全部用于 instruction tuning。
并为每个数据集设计了 10 个不同的指令模板。此外,为了让任务形式更加多元化,作者还为每个数据集设计了至多 3 个的特殊模板用来转变一下任务形式(比如在情感分类任务中要求模型生成影评)。
Experiments
对于 zero-shot 表现,作者对比了 FLAN 和其他几个大规模模型,以及有监督模型(T5、BERT 等)在不同四个不同任务上的表现,如图:
FLAN 在大部分数据集上的表现优于之前的模型,在很多数据集上甚至大幅度领先。zero-shot 下的 FLAN 比 zero-shot LaMDA-PT 表现得更好,并取得了与 few-shot LaMDA-PT 相媲美的性能,这表明了 instruction tuning 的有效性。
不过,尽管 FLAN 在这些任务中性能优异,但在许多语言建模任务中表现一般,如 commensense reasoning 和 coreference resolution。这说明当下游任务形式与语言模型的预训练手段相似的时候,instruction tuning 并没有用。
Ablation Study
Multi-task Learning
作者想定量分析一下多种任务的 instruction tuning 对模型的影响,因此作者逐步增加微调的任务集,观察到了性能的持续提升:
这说明 instruction tuning 对 zero-shot 下模型在新任务中的表现有益,而且随着微调任务的增加,模型性能的增长还未见饱和现象,这说明如果进一步增加数据集,性能还会进一步提升。
Scaling
作者还探究了模型大小对性能的影响,如图:
模型接近 100B 量级时,instruction tuning 能够给模型带来大幅度的增益;然而,模型较小时,instruction tuning 反而会让模型的性能降低。作者认为一个可能的原因是,几十个任务的微调会充满模型的容量,以至于在新任务上缺乏泛化能力而无法适应。大模型不会被填满,因此既具备理解指令的能力,又具备适应新任务的能力。
Instructions
作者还研究了指令的作用,在微调的时候用空模板(即没有指令)、数据集名称代替 instruction 进行实验,结果如下:
不使用 instruction 的微调性能急剧下降,这说明 instruction 在 zero-shot 下的未知任务中至关重要。
有的同学可能会说了,微调的时候用空模板和数据集名称,测试的时候却用 instruction 模板,这不公平。但是如果测试时不用 instruction 指明任务类型,模型怎么知道自己要干啥呢?(毕竟是 unseen tasks)我猜测作者额外做了微调和测试都是 dataset name 的这组实验,就是为了对这个消融实验进行消融实验,证明不是测试策略的影响。
Few-shot
作者还测试了 few-shot 表现,少量微调数据对于具有大的或者复杂的输出空间的任务有更大的增益,比如 struct to text、translation 和 closed-book QA,因为少量样本能让模型更清楚输出形式。(下图中橙色表示不同数据集中的表现的标准差)
Prompt Tuning
除此之外,作者将 FLAN 用于 prompt tuning ,在所有情况下,FLAN 的 prompt tuning 比 LaMDA-PT 效果更好,甚至在许多情况下性能领先超过 10% 。这在一定程度上说明 FLAN 比过去的模型更适合执行 NLP 任务。
Summary
作者提出了一种指令微调方法,并用其训练了一个大模型,实验证明具有很好的泛化能力,在 zero-shot 下表现很好,甚至超过过去一些模型(如 GPT-3)的 few-shot performance 。此外,作者进行了一系列消融实验,证实了 multi-task learning 、instruction tuning 和模型规模对模型表现的重要意义。
比起过去用特定数据集来微调,本文提出的 FLAN 在完全不使用同类任务数据集微调的情况下体现出了良好的跨任务泛化能力,这无疑是通用语言模型的一大进步。