近年来,基于大规模语言模型的方法在很多 NLP 任务上都取得了比传统方法更好的性能。近日来自 Raytheon BBN、哈佛大学、宾夕法尼亚大学等学校和研究机构的知名 NLP 学者联合编写了一篇综述论文,介绍了基于大规模预训练语言模型的自然语言处理领域进展。
论文链接:https://arxiv.org/abs/2111.01243
这篇论文归纳总结了3类使用大规模预处理模型来做 NLP 的方法:
- 方法一:对大规模预处理模型进行任务相关的微调(pre-train then fine-tune)。这是目前最常用的一种方法。
- 方法二:使用 prompt 把 NLP 任务转换成一个更接近预训练的任务,以更好地利用大规模预处理模型里的知识做自然语言处理。这是最近日渐流行的一种新方法。
- 方法三:把 NLP 任务转换成 text to text 的语言生成任务。这是目前崭露头角的一种新方法。
另外,该论文还介绍了利用大规模预训练模型来生成数据,以更好地训练和解释 NLP 模型。
此外,这篇论文还是一篇前瞻性的综述文章。第 6 章指出了目前利用大规模语言模型来做 NLP 的方法存在的问题,并指出一些未来的方向。
方法一:预训练语言模型并对每个 NLP 任务进行微调
这是 BERT,ELMo 和 GPT 论文中提出的方法, 也是目前为止最流行的一种方法。这种模式首先会预训练一个大规模语言模型, 然后对每个任务利用任务相关的标注数据进行模型微调(fine-tuning),从而得到一个任务相关的 PLM 来完成相关任务。作者首先回顾了预训练 + 微调这种方法的历史并解释了几种常见的语言模型与预训练方法, 然后介绍了各种微调预训练模型的方法。
图1:三种常见的 Pre-Trained Language model:模型示意图、训练目标和示例。
图1总结了几种不同的预训练方法。总的来说, 有三种语言模型:autoregressive language model(例如 GPT),masked language model(例如 BERT), encoder-decoder language model(例如 T5)。
图2:常见的 pre-train then fine-tune 的策略和模型结构。
图2总结了对任务进行微调的几种方法:
1. 使用 PLM 对输入的句子抽取语境词嵌入。这种方法只使用 PLM 来抽取特征而并不对 PLM 参数进行微调。这种方法主要适用于以下几种情况:
- 任务相关的标注数据很少, 不足以用来微调整个 PLM 的参数。
- 很复杂的 NLP 任务:例如语义/句法分析。在这种情况下,微调 PLM 带来的好处很少,所以可能更有效的方法是改进分析(parsing)模型而不是 PLM 本身。
- 无监督的学习,例如词义消歧(WSD)/词义归纳(WSI)。例如利用 BERT 嵌入空间里的最近邻( nearest neighbor)来进行 WSD 或 WSI。
2. 微调整个 PLM 中的参数, 然后直接利用 PLM 或者简单的前馈层(feedforward layer)来进行任务相关的预测。这种方式适用于文本分类、自然语言推理等不需要复杂算法的任务。
3. 调整个 PLM 中的参数和任务相关的模型(在 PLM 之上)来完成NLP任务。这种方式适用于分析,共指消解(coreference resolution)等需要在 PLM 之外加一个复杂模型或者算法的任务。
4. 高效的微调方法。因为 PLM 往往有动辄上亿的参数需要微调,这无疑有很高的计算复杂度。有几种方法可以更高效地进行微调:
- 只微调一个小的,局部的子网络,例如微调 adapter 模块而不是整个 PLM,只需要微调 5% 的参数;
- 只微调一部分参数,例如 BitFit 只微调PLM 中的偏置项(bias term),只需要微调 0.1% 的参数。
方法二:基于 Prompt 的方法
这是最近一年来引起学界广泛关注的一种新方法。前面提到的预训练并微调的方法有一个很大的问题:微调的训练目标(training objective)跟预训练的训练目标很不一样,所以可能并没有很好地利用预训练任务(例如掩码语言建模)学得的知识。基于 prompt 的方法的中心思想是通过设计巧妙的模板或者 prompt,来把 NLP 任务转换成一个更接近语言模型的预训练任务,从而更好地利用预训练学得的知识。图 3 描述了三种典型的基于 prompt 的方法。
图3:几类常见的基于 prompt 的方法。
第一类是最简单的方式:基于任务指令(instruction)的方法。这种方法最早出现于 GPT-3 和 T5 的论文中。使用这种方法的时候, 一般会使用能进行文本生成的语言模型(例如 GPT-3,T5):输入会提供任务的描述和一些例子,接着提供一个想要让 PLM 来处理的输入文本,让 GPT-3/T5 来生成答案。这种方法也被称为语境学习(In-context learning)或 priming。这种方式往往需要一个非常大的,类似于 GPT-3 的模型,才能有不错的性能。因为 PLM 模型并不一定能理解任务描述或者通过例子来「理解」任务需求, 所以最近一些来自 Google 和 AI2 的工作(详情参见论文 3.1)利用一些 NLP 任务的任务描述来微调 PLM,这样 PLM 在看到全新的任务描述时会有更好的效果。
第二类方法的基本想法是通过设计一个模板来把 NLP 任务转换成一个语言模型的预训练任务(例如掩码语言建模,下一个词预测)。图 3(中)给出了三个分别针对情感分类、话题分类和文本蕴含任务设计的模板。论文的 3.2 小节介绍了设计模板和自动生成模板的方法、数值的(continuous) 或者自然语言文字的模板、使用多个模板的方法以及如何把语言模型预测的结果转换成任务相关的标签等。此外,3.2 小节还给出了针对各种 NLP 任务的应用和例子。
第三类方法的基本想法是通过设计 prompt 把 NLP 任务转换成一个更接近 PLM 预训练任务的任务,例如问答(QA)或 文本蕴含(TE)。这种方式有几个好处:(a)QA 或 TE 是更直接的自然语言理解任务,因此能更好地利用 PLM 中的知识,(b)QA 和 TE 有比其他 NLP 任务更多的训练数据,所以微调用 QA/TE 模型训练过的 PLM 可能会有更好的效果,(c)很多 NLP 任务的标注数据可以被转换成 QA/TE 的格式,这样可以很容易地针对这些任务进一步微调 PLM。一般这一类方法在需要大量知识的任务(比如 IE)上效果会比前面的方法更好。
方法三:利用文本生成模型来解决 NLP 问题
这是一种崭露头角的新方法。前面提到自回归 PLM 或者编码器-解码器 PLM 可以用于生成文本,所以研究人员在尝试另一种方法:把 NLP 任务都转换成「text in text out」的文本转换任务。这种方法使用的模型一般都是编码器-解码器 PLM(也有少数使用自回归 PLM)。如果想使用这种方法来做 NLP 任务,就需要设计好相应的输入输出的格式,从而把 NLP 任务转换成「text in text out」的任务,进而能利用语言生成模型来解决这些 NLP 任务。
图 4 总结了几种常见的把 NLP 任务转换成文本生成任务的方法和它们的应用实例。其中把这些方法按照输出类型来分类:
- 产生包含标注的文本
- 产生词的位置(索引)
- 产生答案
- 按照固定的模板来生成输出(模板填充)
- 产生线性化的结构化输出
- 对输入输出对进行排序
详情请参考论文第四章。
图4:常见的把 NLP 任务转换成文本生成任务的方法。
利用语言模型来生成 NLP 任务相关的数据
PLM 不仅可以用来解决 NLP 问题,还可以用来生成跟任务相关的数据。论文第 5 章主要介绍了以下两类方法:
- 利用 PLM 自动生成标注数据。这些数据可以被加到现有的手工标注数据集来增大训练数据集,从而取得更好的效果。
- 利用 PLM 来生成辅助数据,这类数据可以被用来解释机器学习模型的行为,步骤,生成反例,推理规则等。
该论文按照任务来组织并论述这两类方法(对应于论文中的 5.1 和 5.2)。
目前存在的问题和讨论
虽然利用 PLM 来做 NLP 在很多任务上取得了很好的结果,但目前还存在很多有待解决的问题。论文第六章对现有的方法进行了一些讨论, 然后提出了一些目前尚未解决的问题和研究方向。主要有以下几点:
- 不需要拘泥于一类方法。比如很多基于 prompt 的方法和文本生成的方法也使用了微调,一些基于文本生成的方法也会使用 prompt。同样,不是所有方法都只能基于一种 PLM。例如 ACE(Wang et al., 2021c)就同时使用了 ELMo、BERT、mBERT、XLM-R 等多个 PLM。
- 数据量似乎在很大程度上决定了性能:到底需要多大的无标注数据集来训练 PLM?同样,需要多大的标注数据集来微调 PLM, 才能在 NLP 任务上有好的结果呢?
- 有没有好的方法来减少使用 PLM 的计算量?
- PLM 在理解语义方面如何,是否只是记住见过的文本?
- 是否需要显式的基于语言学的标注?
- 基于 prompt 的方法需要有意义的,人可读的 prompt 吗?
- NLP 领域还需要更多的理论研究。