论文阅读_BiLSTM-CRF实现序列标注
论文阅读: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 | cd Kashgari下载目录 |