论文地址:https://arxiv.org/abs/2109.01652
相关博客
【自然语言处理】【ChatGPT系列】FLAN:微调语言模型是Zero-Shot学习器
【自然语言处理】【ChatGPT系列】ChatGPT的智能来自哪里?
【自然语言处理】【ChatGPT系列】Chain of Thought:从大模型中引导出推理能力
【自然语言处理】【ChatGPT系列】InstructGPT:遵循人类反馈指令来训练语言模型
【自然语言处理】【ChatGPT系列】大模型的涌现能力
大语言模型(例如 GPT-3 \text{GPT-3} GPT-3)已经展现出了非常好的 few-shot learning \text{few-shot learning} few-shot learning的能力。然而,在 zero-shot learning \text{zero-shot learning} zero-shot learning上并不成功。例如, GPT-3 \text{GPT-3} GPT-3在阅读理解、问答和自然语言推断上的 zero-shot \text{zero-shot} zero-shot效果远差于 few-shot \text{few-shot} few-shot。一个潜在的原因是,不使用 few-shot \text{few-shot} few-shot样例模型很难在与预训练数据形式不一样的 prompts \text{prompts} prompts上表现良好。
本文探索一种改善大语言模型 zero-shot \text{zero-shot} zero-shot效果的简单方法,这将扩大语言模型的受众。利用一个直觉: NLP \text{NLP} NLP任务可以通过自然语言指令来描述,例如:"这篇影评是正面还是负面?“或者"将how are you翻译为中文”。本文在 137B \text{137B} 137B参数的预训练语言模型上执行 instruction tuning \text{instruction tuning} instruction tuning,即通过自然语言指令在60个 NLP \text{NLP} NLP任务混合数据集上微调模型。这个模型称为 FLAN \text{FLAN} FLAN,即 Finetuned Language Net \text{Finetuned Language Net} Finetuned Language Net。
为了评估 FLAN \text{FLAN} FLAN在未见过任务上的 zero-shot \text{zero-shot} zero-shot效果,根据任务类型将 NLP \text{NLP} NLP数据集分为不同的组,将一个组的任务留出来,然后在其他组上微调 FLAN \text{FLAN} FLAN。如上图1所示,为了评估 FLAN \text{FLAN} FLAN在执行自然语言推理的能力,在常识推理、翻译和情感分析等广泛的 NLP \text{NLP} NLP任务上 instruction tune \text{instruction tune} instruction tune模型。
评估结果显示, FLAN \text{FLAN} FLAN显著的改善了 137B \text{137B} 137B参数量模型的 zero-shot \text{zero-shot} zero-shot效果。 FLAN \text{FLAN} FLAN在25个数据集中的20个上的 zero-shot \text{zero-shot} zero-shot效果都优于 GPT-3 \text{GPT-3} GPT-3的 zero-shot \text{zero-shot} zero-shot效果,甚至在ANLI, RTE, BoolQ, AI2-ARC, OpenbookQA, StoryCloze数据集上的效果大幅度超过了 few-shot \text{few-shot} few-shot的 GPT-3 \text{GPT-3} GPT-3。在消融研究中发现增加任务组的数量能够改善模型在未见过任务上的效果,并且 instruction tuning \text{instruction tuning} instruction tuning仅出现在足够大的模型上。
如上图2描述, instruction tuning \text{instruction tuning} instruction tuning是一种结合了预训练-微调和 prompting \text{prompting} prompting范式的简单方法,其通过微调来改善语言模型对于推理时文本交互的响应。实验结果显示语言模型能够很好的执行指令描述的任务。
instruction tuning \text{instruction tuning} instruction tuning的动机是改善语言模型回答 NLP \text{NLP} NLP指令的能力。想法是使用监督来教语言模型执行指令描述的任务, LM \text{LM} LM将学会遵循指令并且在未见过的任务上也可以完成。为了在未见过的任务上进行评估,根据任务类型将任务分组,将一组任务留出评估,并使用余下的任务进行 instruction tuning \text{instruction tuning} instruction tuning。
由于从头创建一个具有许多任务的 instruction tuning \text{instruction tuning} instruction tuning数据集非常消耗资源,所以将研究社区的现有数据集转换为指令的形式。将 Tensorflow \text{Tensorflow} Tensorflow数据集中的62文本数据集整合为单个混合数据集,包含语言理解和语言生成任务。上图3展示了这些数据集,每个数据集会被分类至12个任务组中。
对于每个数据集,手动构造10个唯一的模板,这些模板使用自然语言指令来描述该数据集的任务。10个模板中的大多数都描述原始任务,但为了增加多样性,每个数据集还会增加3个“扭转任务”的模板(例如:对于情感分类,包含了一些要求生成电影评论的模板)。然后在所有数+据集混合的数据集上 instruction tune \text{instruction tune} instruction tune预训练语言模型。下图4展示了一个自然语言推理数据集的多个指令模板。
本文感兴趣的是, FLAN \text{FLAN} FLAN在未见过任务上 instruction tuning \text{instruction tuning} instruction tuning表现,所以定义什么是未见过的任务至关重要。尽管先前的工作通过不允许相同的数据集出现在训练中来定义未见过的任务,本文通过上图3的任务分组来使用更加保守的定义。在本文中,若在 instruction tuning \text{instruction tuning} instruction tuning时没有见过 D \mathcal{D} D所属任务组中的所有数据集,那么在评估时 D \mathcal{D} D是未见过的。例如,若 D \mathcal{D} D是一个蕴含任务,然后在 instruction tuning \text{instruction tuning} instruction tuning中没有任何蕴含数据集,并且在所有的其他组中的任务上进行 instruction-tuned \text{instruction-tuned} instruction-tuned。
给定任务的输出空间通常是几个类别中的一个(分类),或者是自由文本(生成)。由于 FLAN \text{FLAN} FLAN是 instruction-tuned \text{instruction-tuned} instruction-tuned版本的纯解码器语言模型,其天然能够生成自由文本,所以对于生成任务不需要进一步修改。
对于分类任务,先前的工作使用一个 rank classification \text{rank classification} rank classification方法,例如:仅有两个输出被考虑(“yes"和"no”),较高概率的一个就是模型的预测。虽然这个过程在逻辑上是合理的,但是不完美。因此,我们包括了一个选项后缀,即将 OPTIONS \text{OPTIONS} OPTIONS这个单词添加至分类任务的末尾,附带该任务输出类别列表。这使得模型知道在响应分类任务时需要选择哪些。样本如上图1所示。
模型结构和预训练
在本文实验中,使用 LaMDA-PT \text{LaMDA-PT} LaMDA-PT,一个具有 137B \text{137B} 137B参数量的稠密的 left-to-right \text{left-to-right } left-to-right 纯解码器 Transformer \text{Transformer} Transformer语言模型。该模型在网络文档(包括计算机代码)、对话数据和 Wikipedia \text{Wikipedia} Wikipedia上进行预训练,使用 SentencePiece \text{SentencePiece} SentencePiece和 32k \text{32k} 32k词表,共有 2.49T \text{2.49T} 2.49T的 BPE tokens \text{BPE tokens} BPE tokens。大约有10%的预训练数据是非英文的。
Instruction tuning \text{Instruction tuning} Instruction tuning过程
FLAN \text{FLAN} FLAN是 instruction-tuned \text{instruction-tuned} instruction-tuned版本的 LaMDA-PT \text{LaMDA-PT} LaMDA-PT。 instruction tuning pipeline \text{instruction tuning pipeline} instruction tuning pipeline混合了所有的数据集,并且随机从每个数据集中采样。为了平衡不同数据集的尺寸,限制每个数据集的训练样本数量为 30k \text{30k} 30k。模型微调时, learning rate \text{learning rate} learning rate为 3e-5 \text{3e-5} 3e-5, batch size \text{batch size} batch size为8192,使用 Adafactor \text{Adafactor} Adafactor优化器,所有模型都微调 30k \text{30k} 30k个梯度步。微调时输入和输出的序列的长度为1024和256。整个 instruction tuning \text{instruction tuning} instruction tuning在128核的 TPUv3 \text{TPUv3} TPUv3上用了60个小时。对于所有的评估,报告最终 checkpoint \text{checkpoint} checkpoint的结果。
本文在自然语言推理、阅读理解、闭卷问答、翻译、常识推理、指代消解和 struct-to-text \text{struct-to-text} struct-to-text上评估了 FLAN \text{FLAN} FLAN。对于每个数据集,评估所有模板效果的平均值,其代表了给定一个典型自然语言指令的预期性能。
为了比较,报告了使用与 GPT-3 \text{GPT-3} GPT-3相同 prompts \text{prompts} prompts下 LaMDA-PT \text{LaMDA-PT} LaMDA-PT的 zero \text{zero} zero和 few-shot \text{few-shot} few-shot结果。这个 baseline \text{baseline} baseline提供了最直接的消融, instruction tuning \text{instruction tuning} instruction tuning到底有多少帮助。 instruction tuning \text{instruction tuning} instruction tuning在大多数数据集上改善了 LaMDA-PT \text{LaMDA-PT} LaMDA-PT。
本文还展示了 GPT-3 175B \text{GPT-3 175B} GPT-3 175B和 GLaM 64B/64E \text{GLaM 64B/64E} GLaM 64B/64E的 zero-shot \text{zero-shot} zero-shot效果。 zero-shot FLAN \text{zero-shot FLAN} zero-shot FLAN在25个数据集中的20个上超过了 zero-shot GPT-3 \text{zero-shot GPT-3} zero-shot GPT-3,甚至在10个数据集上超过了 GPT-3 \text{GPT-3} GPT-3的 few-shot \text{few-shot} few-shot性能。 zero-shot GLaM \text{zero-shot GLaM} zero-shot GLaM在19个数据集中的13个上超越了 zero-shot GLaM \text{zero-shot GLaM} zero-shot GLaM,以及在19个数据集中的11个上超越了 one-shot GLaM \text{one-shot GLaM} one-shot GLaM。
总的来说,发现 instruction tuning \text{instruction tuning} instruction tuning对自然表述为指令的任务上非常有效,并且对于那些直接形式化为语言模型的任务上不是很有效,其中指令大部分冗余(例如:常识推理和指代消歧任务被形式化为完成不完整的句子或者段落)。自然语言推理、阅读理解、闭卷问答和翻译的结果如上图5所示。
自然语言推理 (NLI) \text{(NLI)} (NLI)
在5个 NLI \text{NLI} NLI数据集,对于给定 premise \text{premise} premise,模型需要判断 hypothesis \text{hypothesis} hypothesis是否为真, FLAN \text{FLAN} FLAN大幅度超越了所有的 baselines \text{baselines} baselines。正如Brown et al.
所说, GPT-3 \text{GPT-3} GPT-3在 NLI \text{NLI} NLI上挣扎的一个原因是, NLI \text{NLI} NLI样本不太可能自然的出现在无监督训练集中,其只会作为句子的延续来使用。对于 FLAN \text{FLAN} FLAN,将 NLI \text{NLI} NLI作为更加自然的问题 Dose
阅读理解
在阅读理解上,模型要求在给定的段落上回答问题, FLAN \text{FLAN} FLAN效果超过了baseline MultiRC \text{MultiRC} MultiRC和 QBQA \text{QBQA} QBQA。在 BoolQ \text{BoolQ} BoolQ上, FLAN \text{FLAN} FLAN大幅度超越了 GPT-3 \text{GPT-3} GPT-3。
闭卷问答
对于闭卷问答,在不访问包含答案的具体信息情况下,要求模型回答关于世界的问题, FLAN \text{FLAN} FLAN在所有4个数据集上都超越了 GPT-3 \text{GPT-3} GPT-3。相较于 GLaM \text{GLaM} GLaM, FLAN \text{FLAN} FLAN在 ARC-e \text{ARC-e} ARC-e和 ARC-c \text{ARC-c} ARC-c上的效果更优,在 NQ \text{NQ} NQ和 TQA \text{TQA} TQA上的效果略差于 GLaM \text{GLaM} GLaM。
翻译
类似于 GPT-3 \text{GPT-3} GPT-3, LaMDA-PT \text{LaMDA-PT} LaMDA-PT的训练数据90%是英文并且包含一些其他语言的文本。本文在 GPT-3 \text{GPT-3} GPT-3论文中评估的三个机器翻译数据集上评估了 FLAN \text{FLAN} FLAN:来自于 WMT’14 \text{WMT'14} WMT’14的法语-英语,来自 WMT’16 \text{WMT'16} WMT’16的德语-英语和罗马尼亚语-英语。相较于 GPT-3 \text{GPT-3} GPT-3, FLAN \text{FLAN} FLAN在6个评估上效果优于 zero-shot GPT-3 \text{zero-shot GPT-3} zero-shot GPT-3,大多数情况下效果差于 few-shot GPT-3 \text{few-shot GPT-3} few-shot GPT-3。类似于 GPT-3 \text{GPT-3} GPT-3, FLAN \text{FLAN} FLAN在翻译为英文上有很好的效果,并且比监督翻译基线效果更好。然而,将英语翻译为其他语言的效果相对较弱,可能是因为 FLAN \text{FLAN} FLAN使用英文的 sentencepiece tokenizer \text{sentencepiece tokenizer} sentencepiece tokenizer且主要在英文数据集上预训练。
额外任务
虽然在上面几组任务中有很好的结果, instruction tuning \text{instruction tuning} instruction tuning的一个局限是不能够改善需要语言建模任务的表现(例如:常识推理或者指代消解)。对于7个常识推理和指代消解任务, FLAN \text{FLAN} FLAN仅在7个任务中的3个上超越了 LaMDA-PT \text{LaMDA-PT} LaMDA-PT。负面结果表明,当下游任务与原始语言建模预训练目标相同时, instruction tuning \text{instruction tuning} instruction tuning是没有用的。最终,本文在附录中报告了情感分析、段落检测和 struct-to-text \text{struct-to-text} struct-to-text的结果。一般来说, zero-shot FLAN \text{zero-shot FLAN} zero-shot FLAN效果优于 zero-shot LaMDA-PT \text{zero-shot LaMDA-PT} zero-shot LaMDA-PT,并且能够达到甚至超过 few-shot LaMDA-PT \text{few-shot LaMDA-PT} few-shot LaMDA-PT。
本篇文章的核心问题是 instruction tuning \text{instruction tuning} instruction tuning如何改善模型在未见过任务上的 zero-shot \text{zero-shot} zero-shot效果。在第一个消融实验中,主要是研究任务组的数量和任务类型在 instruction tuning \text{instruction tuning} instruction tuning的影响。在这个设定下, NLI \text{NLI} NLI、闭卷问题和常识推理作为评估任务组,并使用7个余下的组来进行 instruction tuning \text{instruction tuning} instruction tuning。本文展示了1到7个 instruction tuning \text{instruction tuning} instruction tuning组的结果,每个组按照任务数量递减的顺序添加。
上图6展示了这些结果。正如预期的那样,发现随着向 instrunction tuning \text{instrunction tuning} instrunction tuning添加组和任务时,三个留出来组的平均效果都有提高,确定了提出的 instruction tuning \text{instruction tuning} instruction tuning方法在新任务上的 zero-shot \text{zero-shot} zero-shot表现是有改善的。更有趣的是,对于测试的7个组,效果并没有饱和,意味着向 instruction tuning \text{instruction tuning} instruction tuning添加更多的任务组,效果可能进一步改善。
对于更大的模型,语言模型的 zero \text{zero} zero和 few-shot \text{few-shot} few-shot能力会得到显著的改善。接下来我们会探索模型规模对 instruction tuning \text{instruction tuning} instruction tuning的影响。使用前一个消融实验相同的组划分,评估了 442M,2B,8B,68B \text{442M,2B,8B,68B} 442M,2B,8B,68B和 137B \text{137B} 137B参数量对于 instruction tuning \text{instruction tuning} instruction tuning的影响。
上图7展示了这些结果。可以看到两个模型在 100B \text{100B} 100B参数的规模, instruction tuning \text{instruction tuning} instruction tuning在留出的任务上有显著的改善。然而, instruction tuning \text{instruction tuning} instruction tuning在 8B \text{8B} 8B以及更小模型上是对效果有害的。对这个结果的潜在解释可能是:对于小模型来说,通过 instruction tuning \text{instruction tuning} instruction tuning学习约40个任务已经填充满整个模型的容量,导致模型在新任务上效果差。在这个潜在的解释下,对于更大的模型, instruction tuning \text{instruction tuning} instruction tuning填充了模型的一些容量,但是也教会这些模型遵循指令,允许使用其余的容量泛化到新任务上。
在最后的消融研究中,探索了 instruction \text{instruction} instruction在微调过程中的角色。一个可能是效果的收益完全来自于多任务微调,在没有 instruction \text{instruction} instruction模型也能够有相同的表现。因此考虑两种没有 instruction \text{instruction} instruction的微调设置。在"no template"的设置中,仅把输入和输出给到模型;在“dataset name”设置中,每个输入前添加任务名和数据集名(例如: 对于翻译为法语任务,输入为"[Translation: WMT’14 to French] The dog runs.")
比较了两种消融实验与 FLAN \text{FLAN} FLAN微调。对于"no template"设置,在 zero-shot \text{zero-shot} zero-shot推断时使用 FLAN instructions \text{FLAN instructions} FLAN instructions(因为没有使用模板,模型不知道该执行哪个任务)。对于在数据集名上微调的模型,报告 FLAN instructions \text{FLAN instructions} FLAN instructions和使用数据集名的 zero-shot \text{zero-shot} zero-shot效果。上图8展示了结果,这两种消融配置都显著差于 FLAN \text{FLAN} FLAN,表明使用 instructions \text{instructions} instructions训练对于在未见过任务上的 zero-shot \text{zero-shot} zero-shot效果至关重要。
目前为止都专注在 zero-shot \text{zero-shot} zero-shot设置下的 instruction tuning \text{instruction tuning} instruction tuning。这里研究当在推理时有 few-shot \text{few-shot} few-shot样例时如何使用 instruction tuning \text{instruction tuning} instruction tuning。 few-shot \text{few-shot} few-shot设置中的格式是建立在 zero-shot \text{zero-shot} zero-shot格式上。对于输入 x x x和输出 y y y,令 instruct(x) \text{instruct(x)} instruct(x)表示 zero-shot instructions \text{zero-shot instructions} zero-shot instructions。然后,给定 k k k个 few-shot \text{few-shot} few-shot样例 ( x i , y i ) i = 1 k (x_i,y_i)_{i=1}^k (xi,yi)i=1k和一个新输入 x x x,对于 few-shot \text{few-shot} few-shot设置下的 instruction \text{instruction} instruction格式为
instruct ( x 1 ) ⊕ y 1 ⊕ instruct ( x 2 ) ⊕ y 2 ⊕ ⋯ ⊕ instruct ( x k ) ⊕ y k ⊕ instruct ( x ) \text{instruct}(x_1)\oplus y_1\oplus\text{instruct}(x_2)\oplus y_2\oplus\dots\oplus\text{instruct}(x_k)\oplus y_k\oplus\text{instruct}(x) instruct(x1)⊕y1⊕instruct(x2)⊕y2⊕⋯⊕instruct(xk)⊕yk⊕instruct(x)
其中 ⊕ \oplus ⊕表示通过分隔符来平均字符串。在训练和推理阶段,样例是随机从训练集中采样的,并且样例数量的上限是16且总长度序列小于960。实验使用相同的任务划分和评估过程,未见过任务上的 few-shot \text{few-shot} few-shot样例仅在推理时使用。
如上图9所示,相较于 zero-shot FLAN \text{zero-shot FLAN} zero-shot FLAN, few-shot \text{few-shot} few-shot样例在所有任务上都有显著改善。 few-shot \text{few-shot} few-shot样例对于具有大型且复杂输出空间任务都特别有效,例如: struct to text \text{struct to text} struct to text,翻译,闭卷问答。可能是因为样例有助于模型更好的理解输出格式。