实体识别(NER)中两大常用模型比较,BiLSTM+crf 和 Bert+crf

发布于:2025-06-17 ⋅ 阅读:(11) ⋅ 点赞:(0)

1、实体识别任务介绍

在NLP中,常常需要对文本中的实体信息进行提取,例如王小二今年5月份刚刚去过北京天安门,在这条文本数据中,王小二人名今年5月时间信息北京天安门则是地点信息。我们需要从诸多类似的非结构化文本中,提取出需要用到的结构化数据,这个过程称为命名实体识别(Named Entity Recognition, NER)。其本质是通过人工标注文本中感兴趣的部分,然后送入模型学习,从而使得模型能够按照预期提取文本中的关键内容。

2、文本标注

在实际开展过程中,NER问题一般会转换成 词性标注 问题。英文中一般是按照单词来进行标注,但是中文由于分词较为困难,并且中文分词也很依赖上下文语言环境,所以中文标注一般是按照一个字一个字进行的。常用的实体标注方法分为两种:BIO标注法BIOES标注法

在BIO标注法中:B代表Begin,表示实体开头;I代表Inside,表示实体中部;O代表Other,表示非实体部分。以地点提取为例,我爱北京天安门,使用BIO标注后如下:
在这里插入图片描述
BIOES标注法与BIO标注类似,其中BIO同样分别表示实体开头,实体中部和非实体部分。其中E代表End,表示实体结束部分;S代表Single,表示单个实体,即某个字自己就构成一个实体。 使用BIOES对上面的文本进行标注后,如下:
在这里插入图片描述

实际问题中,有时会遇到实体嵌套的问题,这种情况下一般会使用 指针标注法 来解决。例如我爱北京天安门,这个句子中即存在 北京天安门 这个实体,同时也存在 天安门 这个实体,并且天安门这个实体是嵌套在北京天安门这个实体中的,这种情况就称为 实体嵌套。使用指针标注,会采用两个向量,一个用于表示实体的开始位置,每一个实体开始的位置都为1,其余为0;另一个用于表示实体的结束位置,每一个实体结束位置都为1,其余为0。采用指针标注法标注上面的文本如下:
在这里插入图片描述

本文使用的是BIO标注法,其余标注法这里不做详细讨论。

3、模型介绍

3.1 BiLSTM+CRF

NER实体识别当中,最经典的模型就是 BiLSTM+CRF 的组合了,是Baidu Research在2015年发表的一篇论文《Bidirectional LSTM-CRF Models for Sequence Tagging》。它使用双向长短期记忆网络LSTM加条件随机场CRF的方式解决文本标注的问题。该方法至今仍是命名实体识别的主流方法之一。其原理是将文本向量送入双向LSTM网络进行编码,然后再使用CRF进行解码,从而得到词语相应的标注。
请添加图片描述使用双向神经网络BiLSTM是为了特征提取的时候能够分别考虑到前向和后向的上下文语言环境,CRF的作用则是为了考虑标签输出的上下文环境。CRF的具体介绍可以参考前面这篇博客,CRF全网最详细解读。

3.2 Bert / Bert+CRF

BiLSTM+CRF的组合在很长一段时间里,基本都是一枝独秀,直到2018年10月,Google AI提出了 BERT模型(Bidirectional Encoder Representation from Transformers)。Bert模型是一种预训练模型,通过特有的 分词方式 以及 多头注意力机制 对数据进行特征提取,在很多场景中都有中不俗的表现,不论是文本分类,情感分析或者词性标注等等。本着打不过就加入的思想,很多学者也开始结合Bert对模型进行NER研究。本文同样尝试了使用Bert进行NER识别,但是Bert由于其分词按照最大匹配原则,所以原有的标注数据要进行重新标注。比如1999年5月,按照中文每个字都是一个分词,应该是 1 9 9 9 年 5 月,但是Bert分词后却是 1999 年 5 月,将1999看成了一个整体,所以一般情况下原先的标注数据要重新调整。本文利用Bert进行编码后,还分别用 BiLSTMBiLSTM+CRF 进行解码,结构如下:
在这里插入图片描述
其中因为多头注意力机制,所以每个字会考虑其他字的部分特征。图中仅简单绘制了 这个字的数据情况,关于注意力机制和Bert的详细信息,可以参考原论文进一步去了解。

4、实验结果

因为目前还在实验阶段,所以并没有站在实体角度去进行准确度的评估,而是站在标注正确性的角度,做了一个验证集的简单评估,目前看下来,Bert确实是不讲道理的遥遥领先。BiLSTM+CRF 达到 0.88 左右以后,基本已经很难再提升了,下一步准备进行数据增强,来进一步提高BiLSTM的准确度。而 Bert+BiLSTM 的组合则出人意料的惊喜,第二次迭代就已经达到了0.95的准确度,最终更是达到了 0.9964 的准确度。(可能因为场景比较简单,目标是提取文本中的学校信息。)

模型 准确度(标注)
BiLSMT + CRF 0.8854
Bert + BiLSTM 0.9964

Bert+BiLSTM的准确度相当高,但是实际使用的时候,经常会出现断连的情况。比如 我爱北京天安门,我们期望能得到 北京天安门 这样的实体,但是实际得到的会是北天安门,猜测是因为没有加CRF,导致预测时没考虑到标签的前后关系所以断连。如果在 Bert+BiLSTM 的基础上,再添加CRF,那不得起飞了呀。

实际情况却是,加了CRF的模型,远不如 不加CRF 的模型效果,训练后的模型准确度仅有 0.9240

模型 准确度(标注)
BiLSMT + CRF 0.8854
Bert + BiLSTM 0.9964
Bert + BiLSTM + CRF 0.9240

查阅了很多资料,发现这种情况的原因应该是因为 学习速率不匹配 导致的,Bert+BiLSTM 的拟合速度太快,导致模型在拟合的时候基本忽略了CRF,CRF无法收敛到一个合适的位置,从而使得模型整体的准确度下降了。简答理解的话,可以想象下面场景:
在这里插入图片描述我们假设绿色的线条是 Bert+BiLSTM 的优化曲线,红色曲线是 CRF 的优化曲线。对于 Bert+BiLSTM 而言,因为其梯度大,只需要很小的学习率就可以实现快速收敛,而 CRF 想要收敛的话,则需要更大的学习率。当两者使用相同的学习率时,就会导致CRF无法收敛,或者 Bert+BiLSTM 因为学习率过大而发散。

我们遇到的问题,应该是因为设置的学习率对于 CRF 太小,而导致没有收敛。但是又不能直接设置太大,容易导致 Bert+BiLSTM 发散。所有又考虑了三种方式来进行模型优化:

1、按照统计数据初始化CRF转移矩阵。 因为CRF转移矩阵,其本质是为了让模型学习到标签间的状态转移情况,所以可以先人工统计,构造出一个转移矩阵。然后将基于统计数据构造的转移矩阵作为CRF的初始化状态,在这个基础之上再进行训练。同样迭代周期内,准确度略高于随机初始化的矩阵,但是仍然不是很理想。

模型 准确度(标注)
BiLSMT + CRF 0.8854
Bert + BiLSTM 0.9964
Bert + BiLSTM + CRF 0.9240
Bert + BiLSTM + CRF(人工初始化转移矩阵) 0.9432

2、模型分成两步训练。先训练 Bert + BiLSTM 模型,然后再以该模型为基础,添加CRF层后进行迁移学习。这时只需要考虑优化CRF层,所以学习步长可以放大一点。实际操作时,发现这种方式并不可行。因为Bert模型在训练完成后,输出的结果中没有Mask,而维特比解码又必须要知道实际的序列长度,所以先训练好 Bert + BiLSTM 层后,再添加 CRF 行不通。 除非 Bert + BiLSTM 除了输出结果,同时也输出 Inputs 的 mask,但这就又涉及到调整模型了,比较麻烦。并且即使调整了模型,但是因为是分开训练的,本质是两个模型,CRF 只是为了适应 Bert+BiLSTM,模型无法依据两者的联合表现来调整整体,只会单方面调整CRF。综合考虑下,第二种方式没有尝试。

3、针对不同的层,设置不同的学习率。 比较常规的做法都是采用的这种方式,设置两个优化器,并且两个优化器的学习步长不同,然后针对不同的层使用不同的优化器。Tensorflow 设置分层学习率 的时候,可以通过实现 Model 的 train_step 函数来实现。直接使用循环来实现梯度下降的话,容易显存溢出(可能是由于使用了Bert)。另外定义梯度的时候,不要将Bert装入,否则同样会OOM,只需要装解码层就好。

在这里插入图片描述

BiLSTM 的初始学习率设置的是 0.001,是Adam优化器的默认初始步长。CRF 的初始学习率设置扩大100倍为 0.1。模型的收敛速度明显快了很多,第二次迭代的准确率就已经达到了 0.9507。最终模型准确度达到了 0.9899

模型 准确度(标注)
BiLSMT + CRF 0.8854
Bert + BiLSTM 0.9964
Bert + BiLSTM + CRF 0.9240
Bert + BiLSTM + CRF(人工初始化转移矩阵) 0.9432
Bert + BiLSTM + CRF(分段学习率) 0.9899

5、后记

后续对于 Bert+BiLSTM+CRF 的模型进行了重新调整,增大了 epochs 以及 STEPS_PER_EPOCH ,发现模型其实也能拟合的不错。表现情况是前面迭代拟合不是很好,中期后,模型开始拟合,准确度也有了很明显的上升。原因还是因为 CRF 拟合较慢,所以需要更大的迭代次数。 拟合后的模型标注维度的准确度在0.9904,而且断连情况基本没有了,按照实体的维度进行检验,效果也很好。

模型 准确度(标注)
BiLSMT + CRF 0.8854
Bert + BiLSTM 0.9964
Bert + BiLSTM + CRF 0.9240
Bert + BiLSTM + CRF(增大迭代次数) 0.9904
Bert + BiLSTM + CRF(人工初始化转移矩阵) 0.9432
Bert + BiLSTM + CRF(分段学习率) 0.9899

对于 Bert+BiLSTM 的模型,后续也做了一些调整,不是单个标注输出,而是按照 BIIII 这样的方式去正则匹配,然后挑选长度大于3的匹配项,虽然输出的结果有一些会被规则卡掉,但是基本解决了数据断连的问题,甚至站在实体角度的表现还要高于 Bert+BiLSTM+CRF

模型 准确度(实体) 召回率(实体) F1(实体)
Bert + BiLSTM 0.9286 0.9696 0.9487
Bert + BiLSTM + CRF 0.9230 0.9101 0.9165

网站公告

今日签到

点亮在社区的每一天
去签到