论文阅读笔记-FLAT: Chinese NER using Flat-Lattice Transformer

论文地址:https://arxiv.org/pdf/2004.11795.pdf

github地址:https://github.com/LeeSureman/Flat-Lattice-Transformer

再给大家推一个作者本人的讲解视频 讲的特别透彻【AI TIME PhD】结合词典的中文命名实体识别-李孝男_哔哩哔哩_bilibili

 还是先把论文过一遍吧  这篇论文里面可能会涉及到Lattice LSTM的内容 这篇论文后续也会仔细研究的 ok

Abstract

工作中提出,命名实体识别是一个重要且实用的任务。近年来,将词典信息加入模型被证明对中文命名实体识别任务很有效。但是结合词典的方法通常会使输入变为一个动态的结构,模型需要在运行时态改变结构来表征输入,导致无法有效利用GPU的并行计算,运行速度缓慢因此提出FLAT模型,在Transformer的基础上,采用一个特殊的位置编码表征输入结构,而不需要在运行时改变结构来表征输入。实验结果显示我们的模型在实体识别的正确率以及运行速度上均有良好的表现。

Introduction

命名实体识别(NER)在许多下游自然语言处理(NLP)任务中发挥着不可或缺的作用
与英语相比中文NER更为困难,因为它通常涉及词的分割。最近,格子结构被证明在利用单词信息和避免单词传播错误方面有很大的好处。我们可以将一个句子与一个词库相匹配,以获得其中的潜在词,然后得到一个如图1(a)所示的格子。该格子是一个有向无环图,其中每个节点是一个字符或一个潜词。网格包括句子中的字符和潜在词的序列。它们不按顺序排列,单词的第一个字符和最后一个字符决定其位置。网格中的一些词可能对NER很重要。例如,在图1(a)中,"人和药店(Renhe Pharmacy) "可以被用来区分地理上的人和药店。用来区分地理实体的  "重庆(Chongqing) "和组织实体 "重庆人(Chongqing People)"。

有两条线的方法来利用格子。(Lattice)
(1)一条线是设计一个与格子输入兼容的模型,如格子LSTM(Zhang and Yang, 2018)和LR-CNN(Gui et al., 2019a)。
在LatticeLSTM中,一个额外的单词单元被用来编码潜在的单词,并且注意力机制被用来融合每个位置的变数节点在每个位置上,如图1(b)。


LR-CNN使用CNN对不同窗口大小的潜在词进行编码。然而,RNN和CNN很难对长距离的依赖关系进行建模 (Vaswani等人,2017),这在NER中可能是有用的,比如核心推理(Stanislawek等人,2019)。
由于动态网格结构,这些方法不能充分利用GPU的并行计算。
(2)另一条线是将格子转换成图,并使用图神经网络(GNN)进行编码,如基于词典的图网络(LGN)(Gui等人,2019b)和协作图网络(CGN)(Sui等人,2019)。虽然顺序结构对NER仍然很重要,而图是一般的对应物,但它们的差距是不可忽视的。
这些方法需要使用LSTM作为底层编码器来承载顺序性的归纳偏见。
这使得该模型变得复杂。

在本文中,我们提出了FLAT。Flat LAttice Transformer用于中文NER。Transformer(Vaswani等人,2017)采用全连接的自我关注来模拟序列中的长距离依赖关系。
为了保持位置信息,Transformer为序列中的每个标记引入了位置表示。
受位置表示法的启发我们为格子结构设计了一个巧妙的位置编码,如图1(c)所示。
详细地说,我们为一个标记分配了两个位置索引,即头部位置和尾部位置,通过这两个索引,我们为一个标记(字符或词)指定了两个位置。头部位置和尾部位置,据此我们可以从一组标记中重构一个格子。
因此,我们可以直接使用Transformer对格子输入进行全面建模
Transformer的自注意力机制使得字符能够直接与任何潜在的词,包括自我匹配的词。
对一个字符来说,它的自我匹配词表示单词
包括它。
例如,在图1(a)中。药(Drug)"的自配词是 "人和药店(人和药店)"和 "药店(药店)"(Sui 等人,2019)。实验结果表明,我们的模型在性能和推理速度上优于其他基于词库的方法。

然后直接看模型吧

2 Model

2.1 Converting Lattice into Flat Structure

从有词库的字符中得到一个格子后,我们可以把它平铺成平面对应物。平坦的格子可以被定义为一个跨度的集合,一个跨度对应于一个标记、一个头和一个尾,如在图1(c)中。


标记是一个字符或词。
头和尾表示该标记的第一个和最后一个字符在原始序列中的位置索引,它们表示该标记在格子中的位置。
对于字符来说,其头部和尾部是相同的。
有一个简单的算法可以将平坦的格子恢复成它的原始结构。
我们可以首先取具有相同头部和尾部的标记。
来构建字符序列。然后我们使用 其他标记(词)的头部和尾部来构建跳过路径。
由于我们的转换是可恢复的,我们假设平坦的格子可以保持的原始结构。

3.2 Relative Position Encoding of Spans

平坦的lattice结构由不同长度的跨度组成。为了编码跨度之间的相互作用 间的相互作用,我们提出了相对位置编码的方法 跨度的相对位置编码。
对于格子中的两个跨度xi和xj,它们之间有三种关系:相交、包容和 它们之间有三种关系:相交、包含和分离,由它们的头和尾决定。
我们不直接对这三种关系进行编码 这三种关系的直接编码,我们使用一个密集向量来 来模拟它们的关系。
它是通过头和尾信息的连续变换来计算的。
因此,我们认为它不仅可以表示两个标记之间的关系 符号之间的关系,而且还可以表示更多的细节 信息,例如一个字符和一个词之间的距离。让 head[i] 和 tail[i] 表示 跨度xi的头部和尾部位置。有四种相对距离可以用来表示xi和xj之间的关系。它们可以被计算为



从头到尾解构一下这篇文章

1.深度学习框架下比较通用的NER的模型架构

深度学习框架下的NER模型一般可以拆解为三个部分:输入表示层,上下文编码器,标签解码器。

输入表示层(Input Layer)的作用是将构成句子的离散记号映射到一个连续空间以方便之后的计算。比较常见的输入表示层有Word Embedding(Glove / Word2Vec / Random Init),即通过词的ID直接为这个词找到向量表示。英文中Character embedding也经常使用,即用序列编码模型(RNN/CNN/Transformer based char-level representation)编码这个词的字符序列,得到词的字符级别表示。

另一种常用的输入表示层是Pretrained Contextual Embedding,比如说ELMo和BERT,它们生成的表示会根据上下文产生变化。最后一种Other features,比如POS/gazetteers/linguistic dependency。不同的输入表示层经常搭配在一起使用,这样既能够良好的建模,也能够表示词内部的特征,这对NER来说是比较重要的。

上下文编码器(Context Encoder)的作用是建模词在句子中的语义。一个词在不同的句子中可能有不同的意思,而上下文编码器就负责通过上下文来为此得到一个更好的表示。比较经典的模型有Recurrent Neural Network (RNN) 循环神经网络,它能够较好的建模词之间的依赖,同时性能稳定,但由于它的循环结构会导致运行速度较慢。另外一种是Convolutional Neural Network (CNN) 卷积神经网络,由于它在句子级别上并行运行,所以速度较快,但由于局部建模的特性,所以比较难以建立长距离的依赖。Transformer (Encoder)相对来说是比较新的模型,由于计算简单且并行所以跑起来比较快,同时也能够直接建立长距离的依赖,但由于它本身的一些特性,在小数据集上的表现不是很好。

标签解码器(Tag Decoder)主要有两种,第一种是MLP + Softmax,我们在得到每个词的表示后,直接用一个线性层来得到该词所对应的各个标签的分数。第二种是Conditional Random Field (CRF) 条件随机场,它可以建模标签序列内部的依赖,比如说B-PER后面是不能跟I-ORG的,条件随机场能够在训练的时候逐渐学会这种标签间的依赖,从而避免一些错误发生。

2.中文NER的难点

由于英文和中文不同的语言特性,中文没有空格且基本单元是字,所以中文NER要比英文NER困难一点。比如,“货拉拉拉拉布拉多吗?”,如果我们想从字级别来理解这个句子会非常困难,但如果分好词,”货拉拉 / 拉 / 拉布拉多 / 吗 / ?“,这个句子的意思就更容易理解了。

所以分词对于中文NLP比较重要。但如果用先分词后NER的pipeline方法是有些问题的,比如, “南京市长江大桥”,假如分词工具错分成了“南京市长/江大桥”,那之后再怎么序列标注都不能把正确的实体抽取出来。那么能不能不分词直接在字级别的句子上做NER?理论上是可以的,但还可以改善,因为这么做并没有利用中文的词信息,即分词的边界信息和词义信息。边界信息就是指如何断句,词义信息就是指中文的某些词意不能由组成它的字来推断得到,比如“沙发”这个词和构成它的两个字“沙”和“发”都没有意思上的直接联系。

那么,在先分词后做NER的pipeline方法和字级别的NER方法都有缺陷的情况下,一个关键的问题就冒了出来:如何在不分词的情况下向字级别的序列中加入词信息?(这一段讲得非常透彻)

3.中文NER加入词典信息的方法

近年来的中文NER的paper大多采用了词典匹配(Lexicon matching)的方式,向字级别的句子中加入词信息。我们可以用一个字词Lattice结构直观的表明,每匹配到一个词就为这个词形成一个新的节点,然后根据它横跨的范围来进行连边。比如“重“”庆”匹配到了“重庆”这个词,就会形成一个新节点,根据它横跨的范围从“重”这个字前面连条入边到“重庆”上,再连条出边到“人”字前面。

同时,我们需要修改模型的一小部分使它能够兼容这个结构。思路一是为每个词的节点形成一个新的向量表示,(就是上面举的例子 重庆)并和字向量一起送给上下文编码器,并相应的修改上下文编码器使它能编码这个结构。思路二是把词典匹配的信息加入到向量表示中,相当于修改了输入表示层。(就是这个字能匹配哪些字)

接下来,这张图片根据方法的不同对近年来中文NER的paper做了大致的分类

 第一大类是Dynamic Architecture,输入的结构会动态的改变,上下文编码器也需要动态的修改结构来表征输入的结构。对应刚才的思路一。

第二大类是Adapt Embedding,修改输入表示层,对应刚才的思路二。

4.第一大类——修改上下文编码器

Chinese NER Using Lattice LSTM,这篇文章对LSTM做了一些改动使它能够接受Lattice为输入。对于Lattice中的字序列, Lattice LSTM的更新路径是类似于LSTM的,而对于额外的词节点,Lattice LSTM会在更新路径加额外的跳边。比如“人和药店”这个词的跳边是从“人”开始到“店”,每个字可能会有大于一个的前驱,“店”的前驱有“药”字,以及“人和药店”和“药店”这两个词。所以Lattice LSTM采用了类似注意力机制的方法,对前驱的状态进行融合并更新状态,从而得到当前位置的表示。“店”这个字对“人和药店”这个词的注意力分数特别高,说明模型认为“人和药店”在这个句子中应该是一个词。相对于普通的LSTM,效果提升很明显,但是它也存在一些缺点,第一个缺点是运行速度较慢,Batch运行效率较低。第二个缺点是,词内部的字无法接收到这个词的信息。

CNN-Based Chinese NER with Lexicon Rethinking,这篇文章是通过修改CNN,使它能够接受Lattice为输入。普通CNN是通过在文本上不断卷积,不断获得更强的N-Gram表示,以建模更好的上下文信息。这篇文章是通过在匹配到的词汇与对应长度的N-Gram中进行一次soft的选择,从而更好的编码词信息。比如,现在有一个长度为2的词“广州“,“广”和“州”这两个字一次卷积后得到的结果就是它们的Bigram表示,然后在Bigram表示和“广州”的直接词义表示中进行一次soft的选择,如果选择 “广州”的直接词义表示,模型就能获得更好的词信息。相较上篇文章,这篇文章采用的底层编码器是CNN,并采用rethinking机制加强信息传输能力,所以性能和速度都有所提升。但是由于CNN局部建模的特性,模型难以建模长距离依赖,并且如果编码长词则需要比较深的CNN,会在模型结构设计上有所限制。

除了上面介绍的两种,还有基于图网络的方法(GNN-Based Methods)的两篇文章:A Lexicon-Based Graph Neural Network for Chinese NER和Leverage Lexical Knowledge for Chinese Named Entity Recognition via Collaborative Graph Network,方法是用词典匹配的信息构建图,用优秀的图神经网络来编码这个图,以获得更好的信息传输能力和结构编码能力。这类方法的不足是,序列和图之间的gap较大,通常需要一个RNN作为底层编码器,这会使模型复杂,运行速度下降。

5. FLAT模型

接下来,为大家介绍一下FLAT: Chinese NER Using Flat-LAttice Transformer。这篇文章将Transformer改造了一下,使它能够接受Lattice为输入。

1.简单的介绍一下Transformer吧?

Transformer的第一个优点是能直接建模任意两个节点之间的依赖,在输入是Lattice的场景下,每个字或词都能接收到所有词和字的信息。第二个优点是Transformer的计算过程是静态的,不管输入的Lattice结构怎么变,计算过程都不变。Transformer简单来说有三个模块,其中两个是Self-Attenion和Feed Forward,这两个模块的计算输入与位置无关,比如,“货拉拉拉拉布拉多吗”这个句子,如果直接把句子的字向量送到Self-Attenion和Feed Forward里,得到的几个“拉”字的表示是相同的。这时,Transformer的第三个模块就能解决这个问题,字向量或词向量输入到Self-Attenion之前,会被加上对应的位置编码,就像涂上了不同的颜色,整体的模型就能够感知到位置了。

2.FLAT具体是怎么实现命名实体识别的?

这篇文章中,我们提出了一种新的针对Lattice的位置编码方式。

首先,我们将Lattice结构转换为Flat-Lattice。给每个字一个位置标签,然后给每个词两个位置标签,分别为头和尾。比如说“人和药店”的头和尾是“人”和“店”的位置标签,也就是3和6。这样我们就能将Lattice结构转化为一个三元组的集合,每个三元组包括了字或者词,头和尾。我们就称这个集合为Flat-Lattice。且Flat-Lattice可以还原为原来的Lattice结构,所以如果Transformer良好的编码了Flat-Lattice,就相当于编码了原来的Lattice结构。

 然后,我们把所有字和词给到Transformer,利用头和尾的信息计算出每2个节点之间的4个相对距离,利用多层全连接对4个相对距离进行信息融合,用相对位置编码的方式将融合信息给到Self-Attenion。相对位置编码的方式能使得节点对其他节点进行更好的关注,从而对整个结构更好的编码。举例来说,“重”和“重庆“的4个相对距离是0011,我们就能判断出”重“这个字在”重庆“这个词里面,那么模型就能根据包含的关系,使”重“对”重庆“这个词多加关注,从而更好的识别实体的边界。

最后,在Transformer编码完这些信息后,利用条件随机场解码出标签序列,实现命名实体识别。

3.FLAT的评估结果怎么样?

运行速度上,第一,基于图网络的模型跑的比Lattice LSTM和LR-CNN快。第二,FLAT跑的比其它结合词典的模型快。这是因为我们模型不需要动态修改模型结构来表征输入的结构,而是通过特定设计的位置编码。第三,FLAT从Batch并行化中获得的加速比较高。

我们也进行了几个分析实验来分析FLAT的性能提升来源。

第一个分析实验发现,利用词典资源和使用特定于Lattice的位置编码,能够提升模型在定位实体和分类设计上的能力。

第二个分析实验发现,FLAT相比于Lattice LSTM会带来性能提升的原因是:词内部的字能够接收到词信息,FLAT能直接建模长距离依赖。

第三个分析实验探究了FLAT与BERT的兼容性。对于大数据集,BERT+FLAT显著超过只使用BERT的模型,而对于小数据集,BERT+FLAT的提升不是很大。这可能是由于BERT+FLAT组合的参数量过大,容易在小数据集上过拟合。

6.第二大类——修改输入表示层

Soft-Word是一种可以将分词信息转化为标签序列的方法。比如“明”这个字是“李明”这个词的最后一个字,那么就用E(nd)标签就代表它的分词状态,还有3种标签分别是B代表Begin, M代表这个字处于词的内部,S代表这个字是单独的词。之后Soft-Word再把代表分词标签信息的向量序列与自向量拼接加入输入表示层,这样输入表示层就拥有了分词的边界信息。

在Adapt Embedding类paper中,Simplify the Usage of Lexicon in Chinese NER这篇不仅将分词的边界信息加入了输入表示层,又将词义信息加入了输入表示层。

从这张模型结构图中,我们可以看到具体步骤。第一步是把句子与词典进行匹配。比如“中国语言学”匹配到了“中国语言”、“语言学”等词。第二步是找到包含每个字的所有词,然后把这些词分类,分组映射到向量中。比如“语”这个字,“语言”和“语言学”这两个词是以它为开头的,就把它分到Begin类,"中国语言"这个词是包含这个字的,就把它分到M类。第三步是将这个字的表示和4种对应类别的词的表示,拼接后送到输入表示层中。这样输入表示层既拥有了分词的边界信息,又拥有了词的语义信息。在这之后,用一些通用的上下文编码器编码输入,最后用标签解码器解码出标签序列,从而实现命名实体识别。 

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lyttonkeepgoing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值