论文阅读:BiLSTM-CRF 实现序列标注

论文名称:《Bidirectional LSTM-CRF Models for Sequence Tagging》

论文地址:https://arxiv.org/pdf/1508.01991v1.pdf

相关代码:https://github.com/BrikerMan/Kashgari(Keras)

《Bidirectional LSTM-CRF Models for Sequence Tagging》是 Baidu Research 在 2015 年发表的一篇论文,它使用双向长短期记忆网络 LSTM 加条件随机场 CRF 的方式解决文本标注的问题。该方法至今仍是命名实体识别的主流方法之一。

之前一直不理解的是 RNN、LSTM、CRF、HMM 都可以单独实现文本标注,为什么要将 LSTM 和 CRF 结合起来?本文就来看看它是如何实现的。文后结合命名实体识别 NER,展示了它的具体使用方法。

文本标注用途非常广泛,不仅标注切分,还可以通过标注拆分出关键信息,供下游应用使用。在该文发表之前,实现文本标注常用的方法有线性统计模型,比如隐马尔可夫模型 HMM、最大熵马尔可夫模型 MEMM、条件随机场 CRF;卷积网络、卷积网络与 CRF 相结合的方式;以及循环神经网 RNN。

文中对比了长短期记忆网络 LSTM,双向长短期记忆网络 Bi-LSTM,以及 Bi-LSTM+CRF 处理自然语言标注。论文的主要贡献是:(1) 系统地对比了上述三种模型在各数据集上的效果;(2)LSTM 模型更好地利用了文本上下文中的信息,CRF 处理标签之间的关系,二者结合较之前模型效果更佳;(3) 相较于之前模型,从上下文中获取了更多信息,从而减小了对词向量的依赖。

模型原理

在模型原理部分,文中介绍了从 RNN 到 CRF 各个模型,以及 LSTM+CRF 结合的原理。

RNN

论文中对循环 RNN 在命名实体识别 NER 上的应用描述非常清晰到位,简单翻译如下:

下图描绘了 RNN 结构,它由输入层 x,隐藏层 h 和输出层 y 组成。在命名实体识别问题中,x 是输入文本,y 是输出标签。模型给输入文本中的每个词做标注。

命名实体识别常用 BIO 标法和 BIOES 标法,其中 B-begin 表示开始,I-inside 表示内部,O-outside 表示非实体,E-end 表示实体尾部,S-single 表示该词本身就是一个实体。文中使用 BIO 标注,其中 EU 是 ORG 组织型实体,rejects 非实体,German 为 Miscellaneous 型实体,call 非实体。

输入文本数据时还需要进行一些处理,比如提取词向量,one-hot 变量,或提取其它统计特征(图中忽略此步骤),作为 x 输入,输出 y 是该词对应各个类别的概率。每个词一般称作一个时间点 t。

RNN 计算公式如下:

其中 t 时刻隐藏层的值 h(t),由前一个隐藏层的值 h(t-1) 和该时刻的输入 x(t) 计算得出;t 时刻输出值 y(t),由当前隐藏层 h(t) 计算得出,U,W,V 是模型参数,通过调参得到;公式中 f 和 g 是激活函数。

LSTM 与 Bi-LSTM

LSTM 是 RNN 的加强版,主要解决 RNN 对距离较远文本之间关联较差的问题;文中虽然给出了原理图和公式,但对于之前没有学习过 LSTM 的读者来说,还是无法理解,此处略过,将其看成升级版 RNN 即可。Bi-LSTM 是双向 LSTM,它同时关注前文和后文对标注的影响,如下图所示:

CRF

条件随机场 CRF 是从隐马尔可夫模型 HMM 以及最大熵马尔可夫模型 MEMM 进化而来的。论文中只做了一些简要的介绍,下面以命名实体识别为例,引入一些 CRF 相关原理。

比如标注“EU rejects German call”,文本输入记作 X(x1,x2,x3,x4);它的标签为“B-ORG, O, B-MISC, O”,即输出为 y(y1,y2,y3,y4),通过 N 组数据训练出模型,最终目标是输入任意文字,模型可输出标注信息。计算 yi 的具体方法是:

Yv 是由所有位置的文本 X,以及除位置 v 外其它位置的 Y 决定的(前后标签都可以用);比如上例中标签 y2(O)是由词序列 X“EU rejects German call”这四个词的词义及其位置,以及除 y2 外其它位置的词性 Y“B-ORG,  ?,  B-MISC,  O”计算得出的。

其中序列 X 和 Y 内部的规律可以理解成图结构,它们由点 V(标签) 和连接各点的边 E(标签间相互关系) 组成。1971 年提出的随机场的理论,给定条件 X 下标签 Y 的联合分布为:

其中 g 可理解为 X 映射到 Y 的规则,比如 X“EU”一般是“B-ORG”。而 f 是相邻 Y 之间的关系,比如一般两个动词不会接连出现。计算的目标是调节模型参数θ(包括λ和μ),使在 X 的条件下最可能计算出 Y。

相比之前模型,CRF 计算整个标记序列的联合概率分布,而不是在给定当前状态条件下,定义下一个状态的状态分布,但 CRF 的参数也更多,训练量更大,复杂度更高。

综上,与 LSTM 相比,CRF 的优势是考虑了标签间的关系。

LSTM-CRF

LSTM-CRF 结合了上述两种模型。CRF 将状态转移矩阵作为参数,并使用之前和之后的标签预测当前标签。

如图所示,从下到上依次是:文本数据输入 LSTM 网络,再传入上层的 CRF 网络,最终生成标注数据。具体从公式可见:

(个人认为上述公式中的 + 不是指矩阵加法,而是同时考虑两种逻辑)

输出根据各时点的输入词 x,标签 i(后面具体解释),以及模型的参数θ决定;具体计算方法是对于每个时点 t(每个单词),计算 LSTM 的 f 和 CRF 的 A。

其中的 f 是 LSTM 的输出,它是一个矩阵,其中包含 LSTM 模型计算出的每一个单词,对应每一个标签的概率,如果标签个数为 L,LSTM 输出的矩阵大小为 L×T,每点存储一个概率值。转移评分 A 是从前一个标签到后一个标签的转移概率,如果标签种类为 L,则转移矩阵的大小为 LxL。

具体讲,上图中的圆点是 LSTM 的输出 f,即每一个字是各种标签的概率,颜色越深表示可能性越大,图中的连线是 A,它描述了从前一种标签到后一种标签转换概率,比如 B-MISC 之后更可能是 O 而不是其它的 B-MISC。综合二者,最终得到了得分最高的橙色路径。

CRF 的连接方式和调参方式也类似神经网络。整个网络也是先向前传播 LSTM->CRF->loss,再反向传播调参。

当前更加流行的实现是 BERT+Bi-LSTM+CRF,使用 BERT 提取的词向量,LSTM+CRF 结合的标注算法。

实战

下面来看看具体的实现方法,Kashgari 是一种工业化的命名实体识别解决方案,github 加星 1.9K,其中支持多种 NER 方法,也包含论文中介绍的 LSTM+CRF,来自 github 的介绍如下:

建议阅读代码,以便更好理解具体实现。

下载源码:

1
$ git clone [https://github.com/BrikerMan/Kashgari](https://github.com/BrikerMan/Kashgari)

下载环境 docker 镜像:

1
$ docker pull tensorflow/tensorflow:2.3.1-gpu-jupyter

目前最高版本 tensorflow+gpu+jupyters,其 python 版本 3.6.9

启动镜像:

1
$ nvidia-docker run -d -p 8894:8888 -v/raid/xieyan/2020:/tf/2020/ tensorflow/tensorflow: 2.3.1-gpu-jupyter

进 docker 之后,安装 Kashgari(先编辑一下 pip.conf,下载比较快)

1
2
3
$ cd Kashgari下载目录
$ pip install -r requirements.txt
$ python setup.py install

参考

五分钟搭建一个基于BERT的NER模型

Albert模型国内下载地址(下载tiny版本即可)

效果评测