Attention!今天带来小编同(大)学(佬)的一篇总结性文章,大家快来一起享受一场NER的饕餮盛宴吧!!!(公众号无法加入外链,所以引用文章只能直接写出链接了つ﹏⊂

知乎:薛梦鸽

原文链接: https://zhuanlan.zhihu.com/p/136277575

如需转载,请与作者本人联络哦!!

命名实体识别(NER)可以被当作序列标注问题来解决,其中实体边界和类别标签被联合预测。不同于英文命名实体识别,中文没有明显的单词边界,字符序列下不同分词会有不同含义,导致命名实体识别任务更加困难。一种直观的方法是先分词再进行词级别的序列标注,但这种方法会带来分词的错误传递问题。另一种是直接基于字符级的序列标注,但这种方法忽略了词级别的信息。第三种折衷的方法是基于字符级别进行序列标注,把词信息融合到字符序列中。这种方法包括数据融合(例如分词和NER进行多任务学习)、结构融合(通过修改模型结构直接将词典融入到训练过程)。本文主要介绍第二种。涉及到的文章如下。ACL2020似乎也接收了几篇,后期会更新加上。

论文列表

  1. Chinese NER Using Lattice LSTM

  2. An Encoding Strategy Based Word-Character LSTM for Chinese NER[pdf][code]

  3. A Neural Multi-digraph Model for Chinese NER with Gazetteers[pdf][code]

  4. CNN-Based Chinese NER with Lexicon Rethinking[pdf][code]

  5. Leverage Lexical Knowledge for Chinese Named Entity Recognition via Collaborative Graph Network[pdf][code]

  6. A Lexicon-Based Graph Neural Network for Chinese NER[pdf][code]

  7. Porous Lattice-based Transformer Encoder for Chinese NER[pdf]

    以上论文与代码链接请在对应论文标题下获取哦!

开启神秘之旅:)

  • 首先,Paper1,2,3,4前辈们已经做过细致的介绍,所以介绍的比较简单,接下来是愉快的链接时间

>> Chinese NER Using Lattice LSTM(Lattice-LSTM/ACL2018)

pdf & code: http://github.com/jiesutd/LatticeLSTM

code(batch): https://github.com/LeeSureman/Batch_Parallel_LatticeLSTM

模型结构融合词典信息做序列标注的开山之作,致敬杨老师和张老师!

53d6e334551664fe78ef0a5016fce459.png

模型精髓体现在这里:

fd33f76a9da258cf4e1ce0411d7dfef6.png

第j个字的细胞状态由门控单元控制的两部分组成:

  1. 1. 以这个字为结尾的词的细胞状态

  2. 2. RNN计算时第j个字的细胞状态

具体讲解移步以下两文:

  • https://zhuanlan.zhihu.com/p/100863101

  • https://zhuanlan.zhihu.com/p/77788495

>> An Encoding Strategy Based Word-Character LSTM for Chinese NER(WC-LSTM/NAACL2019)

pdf: https://www.aclweb.org/anthology/N19-1247.pdf

code:https://github.com/liuwei1206/CCW-NER

b74f9ee166b2f52cba75c0ad6dff0944.png

这篇文章也是用RNN系列为主模型,但不同于Lattice-LSTM, 在RNN进行编码时只进行字符序列的编码,第j个字符的输入为第j个字符的向量表示和以这个字符为结尾的词的向量表示的拼接,以此为输入进行正常的RNN编码操作。

由于以第j个字为结尾的词的数量不固定,文中提出四种策略得到以第j个字为结尾的词的表示,分别是最长路径,最短路径,均值,自注意力编码四种策略。

具体讲解移步以下两文:

  • https://zhuanlan.zhihu.com/p/100863101

  • https://zhuanlan.zhihu.com/p/77788495

>> A Neural Multi-digraph Model for Chinese NER with Gazetteers(Multi-digraph/ACL2019)

pdf: https://www.aclweb.org/anthology/P19-1141.pdf

code: https://github.com/PhantomGrapes/

本文利用一个多维图来融合词信息,它将Lattice-LSTM中的链式结构转为图式。图中节点为字符和词,建图后采用GRU方式进行更新。需要注意的是,这篇文章的词汇信息使用的是带标签的gazetteer词表,其余文章的外部词表无标签。

479261b8821cfa0e3b0a843467b72bbc.png

具体讲解移步以下两文:

  • https://zhuanlan.zhihu.com/p/100863101

  • https://zhuanlan.zhihu.com/p/77788495

>> CNN-Based Chinese NER with Lexicon Rethinking(LR-CNN/IJCAI2019)

pdf: https://www.ijcai.org/Proceedings/2019/0692.pdf

code: https://github.com/guitaowufeng/LR-CNN

这篇文章以CNN为模型的主要框架,通过CNN中对N-gram的卷积操作来得到句子中的潜在词语信息。由于自底向上的卷积在低层时无法获取高层语义信息,会导致lexicon的歧义问题,因此采用Rethinking机制,将高层信息重新输入底层,让模型“重新思考”。

27e09e50b7a5c4887ab319718906d0a8.png

具体讲解可移步:

  • https://cloud.tencent.com/developer/article/1595317

  • https://blog.csdn.net/carrie_0307/article/details/104677570

  • 接下来进行Paper5,6,7的细致介绍

>> Leverage Lexical Knowledge for Chinese Named Entity Recognition via Collaborative Graph Network(Lexicon-CGN/EMNLP2019)

pdf: https://www.aclweb.org/anthology/D19-1396.pdf

code: https://github.com/DianboWork/Graph4CNER

  • Motivation

Lattice LSTM存在三个缺点:

  1. 在Lattice LSTM中,第j个字只能获取以它为结尾的词的信息和它之前的时刻状态的词的信息,但无法获取"Inside"词的信息。举例说明:“北京机场”对于“机”的预测起着决定性作用,可以将“机”预测为“B-LOC”,但在Lattice LSTM中,“机”只接受以它为结尾的词的信息和之前时刻的状态信息,且为单向RNN,不能反向建模,因此“北京机场”的信息在建模时无法传递给“机”

  2. 距离最近的上下文对当前token的预测至关重要。例如“希尔顿离开机场”,对于“希尔顿”来说,它的上下文“离开”可以帮助把“希尔顿”预测成"PER",而不是"LOC"。但在Lattice LSTM中,“离开”这个词的表示融合了它之前的所有时刻的状态信息,包括字和词,这些信息会对“离开”本身的含义造成干扰。

  3. 第三个问题就是老生常谈的速度问题。(不过现在出现了Lattice LSTM for NER的多batch版本,速度有一些提升,当然由于LSTM本身的速度问题即使多batch也比不过这篇文章的速度)

  • Model

针对上述问题,本文提出一种字符级的协作图神经网络。包括编码层,构图层,融合层,解码层。为了获取多角度全方位的词语信息,作者在构图层提出三种构图方式,在融合层将三种构图得到的向量表示进行融合。

编码层

字符表示--->双向LSTM编码

词表示----->Lookup Table

构图层

图中的节点为字和词,针对边的连接提出三种构图方式,相邻矩阵中连接边为1,不连通为0

//Containing graph (C-graph)

字与字之间无连边,词与它包含的字之间有连边

6de7411034c359b7b1d6c472892e7247.png

//Transition graph (T-graph)

相邻字符相连,词与它前后的字符相连

c5c695e6904a76e5ad5854ce45605b1b.png

//Lattice graph (L-graph)

相邻字符相连,词与它开始结束的字符相连

240b3c7701790b8443c807182892fcc1.png

最后,针对三种图,使用Graph Attention Network(GAN)来进行编码。最终每个图的输出为

6165d07476e94a59824963515939fe19.png

其中 fa72f756-112b-eb11-8da9-e4434bdf6706.svg 为第k个图的GAN表示,因为是基于字符级的序列标注,所以解码时只关注字符,因此从矩阵中取出前n行作为最终的图编码层的输出。

融合层

50bddc1b823d102f960bca124b8daf77.png

其中 0273f756-112b-eb11-8da9-e4434bdf6706.svg 是编码层的字符表示

解码层

CRF解码

Result

最终实验结果会在最后统一分析,这里说一下作者的消融实验

135d5e216dd975f14acae7dfb99e9e6a.png

其中 0e73f756-112b-eb11-8da9-e4434bdf6706.svg 分别表示C-graph, T-graph, L-graph。"w/o C"表示去掉C-graph编码。

>> A Lexicon-Based Graph Neural Network for Chinese NER(LGN/EMNLP2019)

pdf: https://www.aclweb.org/anthology/D19-1096.pdf

code:https://github.com/RowitZou/LGN

Motivation

RNN结构按照严格的sequential结构进行编码,但语言的底层并不是严格按照sequential序列来理解的。例如“印度河流经印度”,“流”属于“河流”,“流经”, Lattice-LSTM在进行编码时,“流”只能接收“河流”所包含的语义信息,因而造成歧义。(和上一篇论文所提到的第一个缺点类似)

Model

本文提出lexicon-based graph neural network (LGN)来进行图节点分类,从而实现序列标注。通过图中各个节点的相连结构来实现局部语义信息的融合,增加一个全局节点实现全局信息融合。图中节点通过递归融合其传入节点和全局节点实现节点信息更新。

编码层

字符表示------->双向LSTM编码

词表示--------->Lookup Table

全局节点表示-->整句话中,字符和词的平均值

构图

2bf22b435aa81ed97dcbb8cf4fdad425.png

图中节点是所有的字符,边是隐含的词,将其头尾字符相连。例如图中 1973f756-112b-eb11-8da9-e4434bdf6706.svg 分别表示"武","汉",边 1f73f756-112b-eb11-8da9-e4434bdf6706.svg 将这两个节点相连,表示"武汉"。至于为什么这样其实很好理解,这个模型基于字符级进行序列标注,因此最终解码层的输入只有字符节点的表示,因此用字符表示节点,单词表示边用于区分。在下面的具体计算中可以看到其实没有严格的点与边的区分,这里可以直接理解成字与词的区分。

  1. 词表中每个匹配到的词的头尾字符节点相连;

  2. 存在一个全局节点"Global Node",图中的每个节点每条边都与全局节点相连。

  3. 加一个转置图。将图中的有向边的方向反转,类似于双向LSTM中的反向LSTM,最后每个节点的表示是正向图和转置图中节点表示的向量拼接。

局部聚合

使用Multi-Head Attention作为聚合函数

节点:对于当前节点,其流入边和前继节点包含了潜在的单词边界信息,因此当前节点与它的邻接节点和邻接边做聚合。

8db373e79a922daee610905aaaa37e5c.png

边:对于边来说,这边条所cover住的字能够表示这条边上单词的拼写信息,因此当前边与这条边所cover的节点进行聚合

33d8d2dcca5cc7a092c7436d76750f21.png

其中

d94e228e753ef9feaf271b4bf6a00622.png

全局聚合

5dfb75930acc3d9a9288288fab27b0e5.png

其中, 2f73f756-112b-eb11-8da9-e4434bdf6706.svg 为Global Node聚合前的向量表示,初始化为所有字符节点和词边的均值。聚合时,全局节点与字符节点做聚合操作得到 3373f756-112b-eb11-8da9-e4434bdf6706.svg ,与词边做聚合得到 3673f756-112b-eb11-8da9-e4434bdf6706.svg ,拼接得到当前时刻的全局节点向量表示。

递归更新

//节点更新

9e39c0cb87e794aaab410e6681e9a4f8.png

与循环神经网络异曲同工,从上往下依次是输入,注意力,更新门,输入门,忘记门。其中 3b73f756-112b-eb11-8da9-e4434bdf6706.svg 表示bigram的局部信息, 3f73f756-112b-eb11-8da9-e4434bdf6706.svg 表示全局信息

//边更新

//全局节点更新

边更新和全局节点更新是相似的操作,输入有些许差别,具体可参考论文,这里不贴公式了。

解码

CRF进行解码

Result

最终实验结果会在最后同一分析,这里放消融实验的实验结果

3969b5ca3d9626b127b7ae17218f5805.png

>> Porous Lattice-based Transformer Encoder for Chinese NER(PLTE/Arxiv)

pdf: https://arxiv.org/pdf/1911.02733v2.pdf

写在前面:我觉得这篇论文和前两篇基于图结构的论文在公式表示上有异曲同工之妙,都是用self-attention来表示字词间的关系(当然你也可以说现在万物皆可self-attention),也都需要GRU来维持输入的序列信息,尤其A Lexicon-Based Graph Neural Network for Chinese NER最后的递归操作与本文解码时使用的Bi-GRU有着相似的出发点,且都考虑到了全局和局部信息,使用了全局节点来建模全局信息的流通。

Motivation

   1 . 在Lattice LSTM中,第j个字只能获取以它为结尾的词的信息和它之前的时刻状态的词的信息,但无法获取"Inside"词的信息。与前面所提到的缺点类似:

   2. 依然是速度问题。

 3. 受到2019ACL的Lattice-based Transformer for [NMT][Speech Translation][Speech Translation] 的启发,使用lattice-based transformer encoder来解决lattice-lstm中存在的问题。

  4. 直接将lattice-based transformer用在序列标注上效果并不好。一是star-transformer中提到的全连接自注意力机制对于小数据集并不友好;二是Modeling Localness for Self-Attention Networks 等一系列文章提到的自注意力机制应该更关注局部信息。对于NER来说,邱老师的TENER也提到过局部信息的重要性。因此作者提出了一种多孔机制,对于"相邻节点"(文中对相邻进行了定义,这里的节点指所有的字词token)信息直接计算自注意力,对于"非相邻节点"信息通过一个全局节点实现信息流通,这样所有节点直接最多两步可达。

    5. 这篇文章最后还做了在BERT上的实验,验证基于self-attention的模型会比lattice-lstm和LR-CNN更适合于更新BERT编码。

NMP: https:3A//www.aclweb.org/anthology/P19-1298.pdf

SpeechTranslation: https://www.aclweb.org/anthology/P19-1649.pdf

SpeechTranslation:https://www.aclweb.org/anthology/P19-1115.pdf

Star-Transformer:https://www.aclweb.org/anthology/N19-1133.pdf

Modeling Localness: https://www.aclweb.org/anthology/D18-1475.pdf

TENER: https://arxiv.org/abs/1911.04474

Model

9f1f9cb373bf449004265908281ee46a.png

输入层

字向量和词向量:lookup table

位置编码:字的位置是在字符序列中的位置,词的位置是这个词的开始字符的字符位置。例如"南京市长江大桥"中"南"的位置为0,"南京"的位置也为0

基于lattice-transformer的多孔编码层

//Lattice Aware自注意力机制(LASA)

首先是自注意力机制的计算。在输入层中,位置编码不能完全表示词在句子中的相对位置。例如"南京"和"南京市"的位置都是0,但"南京"对于"市"来说是他前面的词,"南京市"对于"市"来说是包含关系,因此本文在图1列出了几种相对位置的关系定义,在图2给出了具体的例子:

3ffe1e0dbb47215aa282e0844c5031ec.png
图1
eac712f2f0add37685b6b06f4529ef9a.png
图2

这里有七种关系,还有一种是全局节点与所有节点的连接定义为 5273f756-112b-eb11-8da9-e4434bdf6706.svg ,共8种关系。针对这8种关系给一个关系编码矩阵R,R为3维矩阵, 5473f756-112b-eb11-8da9-e4434bdf6706.svg 表示第i个token和第j个token之间的关系向量。最终的自注意力机制计算公式如下:

fc9d94f1a1ce010bafa2e8d7299ad870.png

公式中,针对K和V给了两个关系矩阵 5d73f756-112b-eb11-8da9-e4434bdf6706.svg 进行区别。"einsum"是爱因斯坦求和约定,其实只是制定了一种三维矩阵与二维矩阵相乘方式,在pytorch和tensorflow中都有现成的包可以调用。

//多孔多头编码层(PMHA)

Motivation中我们提到,为了更加关注局部信息,本文提出了多孔机制,对于相邻节点直接计算自注意力,对于不相邻节点通过全局节点两步到达。这里,文章对于相邻的定义是图1中的前6种关系 6173f756-112b-eb11-8da9-e4434bdf6706.svg ,不相邻关系为 6573f756-112b-eb11-8da9-e4434bdf6706.svg ,即两个token的间隔大于1。多头注意力计算如下:

54a484402aa6be4fb76873aca4f85406.png

从第二行公式可以看出,当前token 6c73f756-112b-eb11-8da9-e4434bdf6706.svg 与6e73f756-112b-eb11-8da9-e4434bdf6706.svg进行自注意力机制的计算,其中6e73f756-112b-eb11-8da9-e4434bdf6706.svg是当前token的相邻token与全局节点s的拼接。在具体代码实现时,这一步通过attention种的mask矩阵实现。

解码层

解码的时候,因为是基于字符序列的序列标注模型,所以将词mask掉。最后的解码层使用Bi-GRU+CRF。至于为什么要加GRU层,笔者认为,单纯的几层多头注意力机制并不能很好的捕捉序列信息,而作为用CRF解码的序列标准模型来说,序列信息是至关重要的,因此在之前加了一层GRU。其实在前面两篇图神经网络的论文中,他们的字符表示都是通过GRU得到的,尤其是A Lexicon-Based Graph Neural Network for Chinese NER最后还加了递归更新操作,加强序列信息的建模。

BERT_based

这篇论文还加了BERT作为编码层的实验。在这个实验设置中,字向量由BERT得到,词向量由lookup table获得。最终的解码层和BERT-Tagger保持一致,使用softmax解码。

Result

同样的,放消融实验结果

7765b33600ed24291329acde0a1d4e58.png

我终于。。。总结完了,最后是开心的对比结果时间,我把所有模型的结果放在了一个表格中,还有最终的速度对比。

碎碎念一下实验过程,我跑了[1]lattice-LSTM, [4]LR-CNN, [7]PLTE,总的来说,用Glove为编码层做实验的时候,超参多,效果不稳定,比较难复现,收敛需要的迭代轮数也比较多(几十轮),尤其对于Weibo这种小数据集效果尤其的不稳定。但在BERT实验的时候,效果容易复现,迭代只需要5-10轮,最终的效果也高。由于Glove时需要使用CRF做解码层,并且有LSTM的存在,最终的测试速度与BERT为编码层的速度不相上下,所以强烈建议大家使用BERT做编码层来用这几个模型。

在实验结果中,[7]PLTE这篇论文自己做了[1]lattice-LSTM, [4]LR-CNN, [7]PLTE这三种模型在BERT上的实验,效果是PLTE最好,至于为什么在Glove的时候PLTE和LR-CNN差不多但在BERT时效果更好,作者认为PLTE使用的多头自注意力机制为模型主干,更容易和BERT结合,同时模型结构比LR-CNN更简单。BERT模型参数量大,NER数据集规模较小,所以更容易在简单的模型PLTE上取得更好的效果,对于大数据集这种差距还有待验证。

实验结果

3b0ee43140b6ff77517329876c25a642.png

速度对比

a2416a187e54deb8eb5d918467b2c570.png

最后要致敬苏劲松老师提出的Lattice-LSTM模型给大家提供了无穷的后续:)))

结束啦!第一次写知乎~请大家批评指正:)))


了解更多论文分享信息,请关注公众号深度学习的知识小屋39e6298f7d33ef89a17d07ef7317a8aa.png

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐