FLAN
总结
GPT-3等预训练模型对于指令的理解问题: GPT-3等大预言模型在零样本学习上表现不佳, 可能因为指令格式和预训练数据不符. GPT-3在预训练的过程中主要接触了大量的文本内容, 例如维基百科的文章, 书籍等, 这些文本的风格多数是描述性的, 信息性的, 它学到的是如何根据上下文预测下一个词, 而不是直接执行指令. 现在我们给他一个零样本指令任务: "请将'你好'翻译为英文". 如果GPT-3没有经过指令微调, 它可能会: 继续补充指令周围的文本, 例如"请将 '你好' 翻译成英文. 这个词用在日常问候中很常见."; 或者重复输入或者混淆, 它可能不理解翻译这个词在这里是一个动作指令, 而是将其当作是文本的一部分, 或者尝试寻找与'你好'和'英文'相关的文本模式, 例如, 输出可能是"你好英文. 我们常说..."
概要¶
本文探究了一种提升语言模型零样本学习能力的简单方法. 作者证明了指令微调, 即在通过指令描述的数据集集合上微调语言模型, 能够显著提升其在未见过的任务上的零样本性能. 他们采用一个137B参数的预训练语言模型, 并在超过60个通过自然语言指令模板表述的NLP数据集上对其进行指令微调. 他们将这个经过指令微调的模型命名为FLAN, 并在未见过的任务类型上对其进行评估. FLAN的性能相较于其未经修改的对应模型有显著提升, 并且在他们评估的25个数据集中有20个超过了零样本的175B GPT-3. 在ANLI, RTE, BoolQ, AI2-ARC, OpenbookQA和StoryCloze等任务上, FLAN甚至大幅领先于少样本的GPT-3. 消融实验表明, 微调数据集的数量, 模型规模以及自然语言指令是指令微调成功的关键.

引言¶
GPT在零样本学习上的局限性¶
像GPT-3这样的大型语言模型(LMs)非常擅长"少样本学习"(few-shot learning), 也就是你给它几个例子, 它就能学会怎么做. 但是, 它们在"零样本学习"(zero-shot learning)上表现要差得多, 也就是在不提供任何范例的情况下直接让它执行任务. 一个可能的原因是, 没有范例的任务指令(prompt)格式与模型预训练时见过的数据格式不太一样, 这让模型难以很好地理解和执行.
提出指令微调¶
本文的目的是提升大型语言模型(LLM)的零样本(zero-shot)学习能力. 作者认为任何自然语言处理(NLP)任务都可以通过一个直接的指令来描述. 例如 "判断情感是积极还是消极" 或 "把'how are you'翻译成中文". 研究人员将超过60个不同的NLP数据集全部转换成这种指令的形式, 然后用这些数据去微调(finetune)一个有1370亿参数的预训练模型. 这个过程被称为"指令微调"(instruction tuning). 经过这种方式微调后诞生的新模型, 被命名为FLAN (Finetuned Language Net).
如何评估FLAN零样本性能¶
他们先把所有任务按类型分组. 当要测试模型在某一类型任务(比如"自然语言推理")上的表现时, 他们会在训练阶段完全不让模型接触任何该类型的任务. 模型只在所有其他类型的任务(比如翻译, 情感分析)上进行微调. 这样就保证了最终的测试是真正的零样本测试, 因为模型对被测试的任务类型是完全陌生的.
评估结果¶
作者的评估表明, FLAN显著提升了137B参数基础模型的零样本性能. 在作者评估的25个数据集中, FLAN的零样本性能在其中20个上超过了175B参数GPT-3的零样本性能, 甚至在ANLI, RTE, BoolQ, AI2-ARC, OpenbookQA和StoryCloze上大幅领先于GPT-3的少样本性能. 在消融实验中, 作者发现增加指令微调中任务簇的数量("任务簇的数量" 指的就是在指令微调(instruction tuning)过程中, 使用了多少种不同类别的任务.)可以提升在未见过任务上的性能, 并且指令微调的益处只有在模型规模足够大时才会显现.

方法¶
指令调优 (instruction tuning) 的动机是提升语言模型响应自然语言处理 (NLP) 指令的能力. 核心思想是, 通过有监督学习的方式, 教会语言模型执行指令描述的任务. 模型通过这种训练学会遵循指令, 甚至能完成从未见过的新任务. 为了评估模型在新任务上的表现, 研究者会将数据集按任务类型分组. 评估时, 会保留一个任务组作为测试集, 用所有其余的任务组来对模型进行调优. 这个过程可以检验模型对未知任务的泛化能力.
任务&模板¶
由于从头创建包含许多任务的指令调优数据集会耗费大量资源, 他们将研究界现有的数据集转换为指令格式. 他们聚合了 Tensorflow Datasets 上公开的 62 个文本数据集, 将它们整合成一个单一的混合体, 其中包括语言理解和语言生成任务. 如图3所示, 每个数据集被归类到 12 个任务集群中的一个, 同一集群内的数据集任务类型相同.

研究人员为每个数据集手动编写了十个独特的自然语言指令模板. 大多数模板描述了数据集的原始任务 (例如, 判断情感). 为了增加任务多样性, 其中最多三个模板被设计成"逆向任务" (例如, 不是判断情感, 而是生成一条带有特定情感的评论). 他们将所有数据集混合在一起, 用这些指令模板来格式化数据, 然后对一个预训练语言模型进行调优. 在训练过程中, 每个样本会从其对应数据集的十个模板中随机选择一个来格式化. 图4展示了用于自然语言推理 (NLI) 数据集的多个不同指令模板.
所以总共有620个模板.

评估¶
他们将所有任务根据类型分成不同的组(例如, "情感分析"组, "问答"组). 为了测试模型在某一类任务上的零样本(zero-shot)能力, 他们会训练一个新模型. 这个新模型在训练时会使用除了那一类任务之外的所有其他类型的任务数据. 最后, 他们用这个训练好的模型去直接测试那个被完全排除在外的任务类型, 以此来评估模型的泛化能力.
如何处理分类任务¶
FLAN模型本质上是一个生成自由文本的模型. 对于分类任务(比如判断题答案是"是"或"否"), 如果只看模型生成"是"或"否"的概率, 可能会有问题. 因为模型可能把概率分散到许多意思相同的词上(比如"对的", "没错"都表示"是"), 导致单个词"是"的概率降低. 为了解决这个问题, 他们在指令的末尾加上一个"选项"列表. 例如, 在问题后面明确地加上 "选项: 是, 否". 这样做能让模型明确知道答案必须从这个列表中选择, 从而让分类更准确.
训练细节¶
实验中使用的模型是LaMDA-PT, 这是一个包含1370亿参数的密集型从左到右解码器专用Transformer语言模型. 该模型在一个包含2.49万亿BPE词元的数据集上进行了预训练, 这个数据集涵盖了网页文档(包括代码), 对话数据和维基百科, 并使用SentencePiece库构建了一个32000词的词汇表. 预训练数据中约有10%为非英语内容, 且需要注意的是LaMDA-PT只经过了语言模型预训练, 这与专为对话进行微调的LaMDA不同.
FLAN是LaMDA-PT的指令微调版本, 其训练过程混合了所有数据集并从中随机抽样. 为了平衡不同大小的数据集, 他们将每个数据集的训练样本数限制为3万, 并采用与样本数成比例的混合方案, 最大混合率为3000. 他们使用Adafactor优化器和3e-5的学习率对所有模型进行了3万步梯度更新, 批处理大小为8192个词元, 输入和输出序列长度分别为1024和256. 训练中他们使用打包技术将多个样本合并到单一序列中, 并用一个特殊的EOS符号分隔输入和目标. 整个指令微调过程在拥有128个核心的TPUv3上耗时约60小时, 所有评估结果均基于训练了3万步后得到的最终模型检查点.