从代码学习深度学习 - 针对序列级和词元级应用微调BERT PyTorch版
文章目录
- 前言
- 针对序列级和词元级应用微调BERT
- 单文本分类
- 文本对分类或回归
- 文本标注
- 问答
- 总结
前言
在自然语言处理(NLP)的广阔天地里,预训练模型(Pre-trained Models)的出现无疑是一场革命。它们如同站在巨人肩膀上的探索者,使得我们能够利用在大规模文本语料上学到的丰富知识,来解决各种具体的NLP任务。在这其中,由Google开发的BERT(Bidirectional Encoder Representations from Transformers)模型是一个里程碑式的存在。BERT凭借其强大的双向Transformer编码器结构,对语言的理解达到了新的高度。
本文旨在详细阐述如何针对不同的自然语言处理应用场景,对强大的BERT模型进行微调(Fine-tuning)。我们将深入探讨两大类应用:序列级(Sequence-Level) 和 词元级(Token-Level) 任务。我们将从理论架构出发,解释如何通过最小的架构改动,将预训练的BERT模型适配到具体任务上,释放其巨大潜力。
针对序列级和词元级应用微调BERT
在深入具体的应用之前,我们首先需要理解BERT的宏观定位。BERT模型本身是一个为通用语言理解而设计的庞然大物,其基础版和大型版分别拥有高达1.1亿和3.4亿的参数。为每一个独立的NLP任务从零开始设计和训练一个复杂的模型,既耗时又耗力。而微调BERT则提供了一个高效且效果卓越的解决方案。
微调的核心思想是:在一个巨大的通用文本语料库(如维基百科)上预训练好的BERT模型已经具备了深厚的语言结构和语义知识。 对于下游的具体任务,我们不再需要从头学习所有参数。取而代之的是,我们在预训练的BERT模型之上,增加一个或少数几个简单的全连接层(也称为稠密层)。在针对下游任务进行监督学习时,我们只需要从零开始学习这些新增层的参数,同时对BERT模型原有的海量参数进行“微调”——即在新的任务数据上以较小的学习率进行更新。 这种“最小架构更改”的策略是BERT能够灵活适配多种NLP任务的关键。
接下来,我们将分别探讨序列级和词元级的应用如何通过微调BERT来实现。
单文本分类
单文本分类 是最常见的NLP任务之一,其目标是接收一个单独的文本序列作为输入,然后输出该文本的所属类别。典型应用包括我们熟知的情感分析(判断评论是正面还是负面)和语言可接受性判断。
语言可接受性语料库(Corpus of Linguistic Acceptability, COLA)便是一个用于此任务的数据集,它要求模型判断一个给定的句子在语法上是否成立。 例如,“I should study.” 是一个符合语法的句子,而 “I should studying.” 则不是。
架构说明:
为了处理单文本分类任务,BERT的输入表示经过了精心设计。在输入序列的开头,我们会添加一个特殊的分类标记 [CLS]
。这个标记的特殊之处在于,经过BERT模型的多层Transformer编码器处理后,其对应的最终隐藏状态向量被视为整个输入序列的聚合