9.4 面向分类的微调
预训练语言模型的力量,在于它们能够从海量文本中提取泛化知识,而这些知识可用于无数下游应用。利用这些泛化知识解决下游任务有两种方式。最常见的方式是用自然语言提示模型,使其进入一种能够根据上下文生成所需内容的状态。
本节考察另一种将预训练语言模型用于下游应用的方式,即一种微调。在掩码语言模型所用的这类微调中,我们会在预训练模型顶端添加应用专用结构(通常称为专用模型头),并以预训练模型的输出作为其输入。微调过程使用与应用有关的有标注数据,训练这些额外的应用专用参数。通常,这种训练会冻结预训练语言模型的参数,或只对其做很小的调整。
下面几节将介绍一些常见文本应用类别所用的微调方法:序列分类、句对分类和序列标注。
9.4.1 序列分类¶
序列分类(sequence classification)的任务,是用单个标签对整个文本序列进行分类。这类任务通常称为文本分类,例如情感分析或垃圾信息检测(附录 B);在这些任务中,我们把文本分入两个或三个类别(如正面或负面)。它还包括类别数量很多的分类任务,例如文档级主题分类。
进行序列分类时,我们用单个向量表示需要分类的整个输入。序列有多种表示方法,其中一种是对序列中每个词元的最终输出向量求和或取平均。对于 BERT,我们改为向词表中加入一个名为 [CLS] 的独特新词元,并在预训练和编码期间把它放在所有输入序列的开头。模型最终层中对应 [CLS] 输入的输出向量表示整个输入序列,并充当分类器头的输入;分类器头是一个逻辑回归分类器或神经网络分类器,用于做出相应决策。
以情感分类问题为例。为该应用微调分类器,需要学习一组权重 ,把 [CLS] 词元的输出向量 映射为各个可能情感类别上的一组分数。假设情感分类任务有三个类别(正面、负面、中性),模型维度为 ,那么 的大小为 。为了对文档分类,我们让输入文本经过预训练语言模型以生成 ,将其乘以 ,再把所得向量传入 softmax。
微调 中的值,需要由输入序列及其正确情感类别标签组成的监督训练数据。训练按通常方式进行:利用 softmax 输出与正确答案之间的交叉熵损失驱动学习,从而得到 。
这一损失不仅可以用来学习分类器的权重,也可以更新预训练语言模型本身的权重。在实践中,通常只需对语言模型参数做很小的改动,就能获得合理的分类性能;这种改动往往仅限于更新 Transformer 最后几层。图 9.6 展示了这种序列分类方法的整体思路。
9.4.2 序列对分类¶
正如 9.3.2 节所述,有一类重要问题涉及对输入序列对进行分类。属于这一类别的实际应用包括释义检测(两个句子是否互为释义?)、逻辑蕴含(句子 A 是否在逻辑上蕴含句子 B?),以及语篇连贯性(句子 B 作为句子 A 的后续内容有多连贯?)。
为其中一项任务微调应用的过程,与使用 NSP 目标进行预训练相同。微调期间,把监督微调集中的有标签句对提供给模型,让它们通过模型的全部层,从而产生每个输入词元的输出 h。与序列分类相同,放在开头的 [CLS] 词元所对应的输出向量,表示模型对输入句对的整体理解;与 NSP 训练相同,两个输入由 [SEP] 词元分隔。执行分类时,将 [CLS] 向量乘以一组学到的分类权重,再传入 softmax 生成标签预测,随后利用这些预测更新权重。

图 9.6 使用双向 Transformer 编码器进行序列分类。[CLS] 词元的输出向量充当简单分类器的输入。
下面以 Multi-Genre Natural Language Inference(MultiNLI)数据集上的蕴含分类任务为例(Williams et al., 2018)。在 自然语言推理(natural language inference, NLI)任务中——它也称为识别文本蕴含——模型会看到一对句子,并且必须对它们意义之间的关系进行分类。例如,在 MultiNLI 语料库中,每个句对会被赋予三个标签之一:蕴含、矛盾和中性。这些标签描述第一个句子(前提)与第二个句子(假设)的意义关系。下面是语料库中各类别的代表性样例:
• 中性(Neutral)
a: Jon walked back to the town to the smithy.
b: Jon traveled back to his hometown.
• 矛盾(Contradicts)
a: Tourist Information offices can be very helpful.
b: Tourist Information offices are never of any help.
• 蕴含(Entails)
a: I’m confused.
b: Not all of it is very clear to me.
“矛盾”关系表示前提与假设相矛盾;“蕴含”表示前提蕴含假设;“中性”则表示两者都不一定为真。这些标签的含义比严格的逻辑蕴含或矛盾更宽松,表示一般人在阅读这些句子时,最有可能以这种方式理解其意义。
为了针对 MultiNLI 任务微调分类器,我们按照上述方式让前提/假设句对通过双向编码器,再将 [CLS] 词元的输出向量用作分类头的输入。与普通序列分类相同,该模型头为三分类器提供输入,而分类器可以在 MultiNLI 训练语料库上训练。