论文名称:《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的介绍如下:
建议阅读代码,以便更好理解具体实现。
下载源码:
$ git clone [https://github.com/BrikerMan/Kashgari](https://github.com/BrikerMan/Kashgari)
下载环境docker镜像:
$ docker pull tensorflow/tensorflow:2.3.1-gpu-jupyter
目前最高版本tensorflow+gpu+jupyters,其python版本3.6.9
启动镜像:
$ nvidia-docker run -d -p 8894:8888 -v/raid/xieyan/2020:/tf/2020/ tensorflow/tensorflow: 2.3.1-gpu-jupyter
进docker之后,安装Kashgari(先编辑一下pip.conf,下载比较快)
$ cd Kashgari下载目录
$ pip install -r requirements.txt
$ python setup.py install
参考
五分钟搭建一个基于BERT的NER模型
https://www.jianshu.com/p/1d6689851622
Albert模型国内下载地址(下载tiny版本即可)
https://github.com/bojone/albert_zh
网友评论