Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

9.4 面向分类的微调

预训练语言模型的力量,在于它们能够从海量文本中提取泛化知识,而这些知识可用于无数下游应用。利用这些泛化知识解决下游任务有两种方式。最常见的方式是用自然语言提示模型,使其进入一种能够根据上下文生成所需内容的状态。

本节考察另一种将预训练语言模型用于下游应用的方式,即一种微调。在掩码语言模型所用的这类微调中,我们会在预训练模型顶端添加应用专用结构(通常称为专用模型头),并以预训练模型的输出作为其输入。微调过程使用与应用有关的有标注数据,训练这些额外的应用专用参数。通常,这种训练会冻结预训练语言模型的参数,或只对其做很小的调整。

下面几节将介绍一些常见文本应用类别所用的微调方法:序列分类、句对分类和序列标注。

9.4.1 序列分类

序列分类(sequence classification)的任务,是用单个标签对整个文本序列进行分类。这类任务通常称为文本分类,例如情感分析或垃圾信息检测(附录 B);在这些任务中,我们把文本分入两个或三个类别(如正面或负面)。它还包括类别数量很多的分类任务,例如文档级主题分类。

进行序列分类时,我们用单个向量表示需要分类的整个输入。序列有多种表示方法,其中一种是对序列中每个词元的最终输出向量求和或取平均。对于 BERT,我们改为向词表中加入一个名为 [CLS] 的独特新词元,并在预训练和编码期间把它放在所有输入序列的开头。模型最终层中对应 [CLS] 输入的输出向量表示整个输入序列,并充当分类器头的输入;分类器头是一个逻辑回归分类器或神经网络分类器,用于做出相应决策。

以情感分类问题为例。为该应用微调分类器,需要学习一组权重 WC\mathbf { W } _ { C },把 [CLS] 词元的输出向量 hCLSL\mathbf { h } _ { \mathrm { CLS } } ^ { L } 映射为各个可能情感类别上的一组分数。假设情感分类任务有三个类别(正面、负面、中性),模型维度为 dd,那么 WC\mathbf { W } _ { C } 的大小为 [d×3][ d \times 3 ]。为了对文档分类,我们让输入文本经过预训练语言模型以生成 hCLSL\mathbf { h } _ { \mathrm { CLS } } ^ { L },将其乘以 WC\mathbf { W } _ { C },再把所得向量传入 softmax。

y=softmax(hCLSLWC)(9.6)\mathbf { y } = \operatorname { softmax } (\mathbf { h } _ { \mathrm { CLS } } ^ { L } \mathbf { W } _ { C })\tag{9.6}

微调 WC\mathbf { W } _ { C } 中的值,需要由输入序列及其正确情感类别标签组成的监督训练数据。训练按通常方式进行:利用 softmax 输出与正确答案之间的交叉熵损失驱动学习,从而得到 WC\mathbf { W } _ { C }

这一损失不仅可以用来学习分类器的权重,也可以更新预训练语言模型本身的权重。在实践中,通常只需对语言模型参数做很小的改动,就能获得合理的分类性能;这种改动往往仅限于更新 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 训练语料库上训练。