本文原作者:梁源,经授权后发布。
原文链接:https://cloud.tencent.com/developer/article/1454904
序列标注是NLP中一项重要的任务,它主要包括分词,词性标注,命名实体识别等子任务。通过对预训练后的BERT模型进 行finetune,并与CRF进行结合,可以很好地解决序列标注问题。上篇文章对BERT官方源码进行了介绍,本篇文章将介绍 如何通过BERT解决序列标注问题。同时本篇文章将BERT+CRF模型与其他模型进行了对比,并且对BERT在序列标注上任务上存在的问题进行了分析。
所谓序列标注,就是对一个一维线性输入序列,给线性序列中的每个元素打上标签集合中的某个标签。所以,其本质上是对线性序列中每个元素根据上下文进行分类的问题。 中文的序列标注问题,往往可以把一个汉字看做线性序列的一个元素,而不同任务其标签集合代表的含义可能不太相同,但是相同的问题都是:如何根据汉字的上下文给汉字打上一个合适的标签。无论是分词,还是词性标注,或者是命名实体标注,道理都是相通的。 在深度学习流行起来之前,常见的序列标注问题的解决方案都是借助HMM模型,最大熵模型,CRF模型。尤其是CRF,它是解决序列标注问题的主流方法。随着深度学习的发展,RNN在序列标注问题上取得了巨大的成功,Bi-LSTM+CRF模型,在该任务上表现的十分出色。但是当我们把Bi-LSTM升级为BERT,在序列标注上的准确率和训练效率上都达到了新的高度。同时发现,BERT+CRF模型可以同时解决中文分词和词性标注两个任务,下面我们就通过这两个子任务分析BERT在序列标注上的应用。
BERT通过”Fill in the blank task” 以及 “Next sentence prediction” 两个任务进行预训练。在预训练模型的基础上稍加修改就可以处理多个下游任务。如下图所示,中文文本的序列标注问题,每个序列的第一个token始终是特殊分类嵌入([CLS]),剩下的每一个token代表一个汉字。BERT的input embeddings 是token embeddings, segmentation embeddings 和position embeddings的总和。其中token embeddings是词(字)向量,segment embeddings 用来区分两种句子,只有一个句子的任务(如序列标注),可以用来区分真正的句子以及句子padding的内容,而position embedding保留了每个token的位置信息。BERT的output 是每个token的encoding vector。只需要在BERT的基础上增加一层全连接层并确定全连接层的输出维度,便可把embedding vector映射到标集合。词性标注问题的标签集合即中文中所有词性的集合。
BERT模型+FC layer(全连接层)已经可以解决序列标注问题,以词性标注为例,BERT的encoding vector通过FC layer映射到标签集合后,单个token的output vector再经过Softmax处理,每一维度的数值就表示该token的词性为某一词性的概率。基于此数据便可计算loss并训练模型。但根据Bi-LSTM+CRF 模型的启发,我们在BERT+FC layer 的基础上增加CRF layer。 CRF是一种经典的概率图模型,具体数学原理不在此处展开。要声明的是,CRF层可以加入一些约束来保证最终的预测结果是有效的。这些约束可以在训练数据时被CRF层自动学习得到。具体的约束条件我们会在后面提及。有了这些有用的约束,错误的预测序列会大大减小。
我们以词性标注为例具体讲解工作流程。
在词性标注任务中,主要采用1998年人民日报标注预料库(PRF)。该数据集共有19438条数据,格式如下图所示:“__label__” 为分隔符,分隔符的左侧为文本信息,右侧为标注的词性信息。根据6:2:2的比例将数据集分为train, eval 以及 test dataset。
在英文文本中单词为最小单位,且每个单词均有一一对应的词性信息,所以无需过多的预处理。但对中文文本,BERT模型的最小输入单位为单个汉字, 但是词性信息是根据词语进行标注的,为了满足BERT的要求,我们需要对数据进行预处理,将原文本拆分成一系列的汉字,并对每个汉字进行词性标注。这种分词处理有多种体系,这里使用 ”BIO“,其中 “B” 表示该汉字是词汇开始字符,同时也可以表示单字词;“I” 表示该汉字是词汇的中间字符;“O” 表示该汉字不在词汇当中。”O” 在词性标注任务当中不会出现,但是在命名实体标注中有意义。经过预处理后的数据如下图所示。此外根据BERT模型的要求,需要预先设定最大序列长度(max_seq_length),根据此参数对序列进行padding。
同模型训练一样,待预测的句子需要被拆分为一系列单字后输入到训练好的模型当中,模型的输出为每一个单字对应的预测词性。因为这种形式不方便人来查看,所以增加一个后处理的步骤, 把B开头,后面跟着I的汉字拼接在一起,直到碰见下一个B标签位置,这样就等于分出了一个单词词语。整个预测流程如下图所示:
在第二章节提到过增加的CRF层可以学习到一些约束,这些约束可能有:
在训练数据足够大的时候,CRF层可以更好的学习到这些约束,但是无法保证在预测时不出错,因为在模型预测的后处理环节,同样需要考虑上述约束,不符合约束的token,以“ERROR” 来代替预测结果。如下图所示:
为了展示出BERT+CRF的优势,我们将其与CRF, Bi-LSTM+CRF进行比较,模型训练均采用单块Tesla P40。获得如下结果:
我们将以上5种模型进行比较,其中embedding的意思是input token使用预训练好的word embedding。可以看出BERT+CRF模型的正确率最高,相较于BERT-LSTM+CRF主流模型,提升了51.8%,训练用时缩短了78%。当我们查看准确率曲线时不难发现,完成一个epoch后,eval数据集的准确率已经超过90%,可见BERT+CRF模型的训练效率和表现均十分出色。
BERT是一个十分强大的NLP模型,BERT+CRF 可以高质量的完成序列标注任务。目前该模块已经成功部署到最新版本的腾讯智能钛平台上,有兴趣的同学可以在平台上搭建自己的模型进行训练和预测。我们希望听到你们宝贵的意见和建议。谢谢阅读。
腾讯智能钛机器学习平台:【技术分享】BERT系列(一)——BERT源码分析及使用方法zhuanlan.zhihu.com
更多优质技术文章请关注官方微信公众号:
长按/扫描关注我们
专业AI开发者社区,期待您的光临!
智能钛AI开发者 - 云+社区 - 腾讯云cloud.tencent.com