其实实体识别这块看了挺久了的,今天就来好好聊一聊它。实体识别(Name Entity Recognition)是属于NLP任务中的序列标注问题:给定一个输入句子,要求为句子中的每一个token做实体标注(如人名、组织/机构、地名、日期等等)。
明白了NER任务的目的,那我们就来看看具体是怎么实现的。到目前为止,可以大致分为基于规则、基于传统机器学习方法和基于深度学习方法这三大类(其实很多任务的算法都可以从这三个方面去入手)。基于规则的方法效果可能很高,但是实在是太硬核了,很大程度上取决于个人对规则的定义,而且费时费力,基本不可取。
不是今天的重点。简单介绍一下标准流程:
Training
Predicting
也不是今天的重点。最经典最sate-of-the-art的模型就是LSTM+CRF(当然得除去bert这种)
前面废话了那么多,赶紧开始吧。
众所周知,目前在NLP领域用的最多的还是要数RNN这一个大类,因为RNN简直就是为文本这类序列数据而生的。但是在实现中也会有很多问题,所以这时候就可能试试CNN。相对于RNN, CNN由于可以并行训练,使得其训练速度远远高与RNN,可以使得在精度不变或损失一点的情况下打打提高效率。这一点也在前面文本分类任务中有提及。 【论文复现】使用CNN进行文本分类
Fast and Accurate Entity Recognition with Iterated Dilated Convolutions(2017)这篇论文就是基于CNN类来做命名实体识别的。
CNN运用于文本处理,有一个劣势,就是经过卷积之后,末层神经元可能只是得到了原始输入数据中一小部分的信息。所以为了获取上下文信息,可能就需要加入更多的卷积层,导致网络原来越深,参数越来越多,而模型越大越容易导致过拟合问题,所以就需要引入Dropout之类的正则化,带来更多的超参数,整个网络变得庞大冗杂难以训练。
基于上述问题,Multi-Scale Context Aggregation by Dilated Convolutions一文中提出了dilated convolutions,中文意思大概是“空洞卷积”。正常CNN的filter,都是作用在输入矩阵一片连续的位置上,不断sliding做卷积,接着通过pooling来整合多尺度的上下文信息,这种方式会损失分辨率。既然网络中加入pooling层会损失信息,降低精度。那么不加pooling层会使感受野变小,学不到全局的特征。如果我们单纯的去掉pooling层、扩大卷积核的话,这样纯粹的扩大卷积核势必导致计算量的增大,此时最好的办法就是Dilated Convolutions(扩张卷积或叫空洞卷积)。
具体使用时,dilated width会随着层数的增加而指数增加。这样随着层数的增加,参数数量是线性增加的,而receptive field却是指数增加的,可以很快覆盖到全部的输入数据。
对应到文本上,输入是一维向量:
论文中提出的IDCNN模型是4个结构相同的Dilated CNN block拼接在一起,每个block里面是dilation width为1,1,2的三层DCNN。
IDCNN对输入句子的每一个字生成一个logits,这里就和biLSTM模型输出logits之后完全一样,放入CRF Layer,用Viterbi算法解码出标注结果。
在biLSTM或者IDCNN这样的深度网络模型后面接上CRF层是一个序列标注很常见的方法。biLSTM或者IDCNN计算出的是每个词分类的概率,而CRF层引入序列的转移概率,最终计算出loss反馈回网络。
关于IDCNN在NER任务的实现:
官方开源代码
超1k satr github代码
作者首先综述了目前NER算法的主要思路,然后集中于LSTM-CRF模型分析了集中变种模型的优缺点:
基于上述问题,作者们提出了一种新型的Lattice LSTM:将潜在的词语信息融合到基于字模型的传统LSTM-CRF中去,而其中潜在的词语信息是通过外部词典获得的。如下所示,lattice lstm模型会在字向量的基础上额外获取词特征的信息。
但是上述模型中每个词语路径都考虑的话,会导致模型复杂度的指数增长,于是作者利用门结构来控制信息流动。例如,以最后一个“桥”字为例,除了需要考虑该字本身的向量特征,还需要考虑“长江大桥”和“大桥”这些词语信息的贡献量,而这个就是由图中红色圈圈代表的门结构来控制信息流入的。
在论文中,作者们还提出了自己改进过的基于字和词语的NER模型,但是这些应该都是为了最后的Lattice LSTM做铺垫的,所以这里就不做详细介绍。关于Lattice的整体模型如下:
至此LSTM模型部分已经搭建完成了,总结一下:就是由两套LSTM子结构分别是基于字的和基于词的,然后得到基于词的状态输出之后将其加入到基于字的结构中输出预测。
之后就是跟其他模型一样套上一层CRF层。
打完收工。不知道有没有讲清楚,欢迎留言讨论~
官方开源代码
看了一下好像没有TF实现的star比较高的代码,暂时就先不贴了。
来自论文Adversarial Transfer Learning for Chinese Named Entity Recognition with Self-Attention Mechanism。
主要抓住三个关键词,也是构建本文模型的关键点:
在训练命名实体识别系统时,往往需要大量的人工标注语料。为了保证质量,通常需要雇佣专家来进行标注,但这样会造成代价成本高且规模难于扩大。另一种方式是采用众包标注方法,雇佣普通人员来快速低成本完成标注任务,但这样获取的数据含有很多噪音。
作者提出了一种利用众包标注数据学习对抗网络模型的方法,来构建中文实体识别系统。受对抗网络学习的启发,他们在模型中使用了两个双向 LSTM 模块,来分别学习标注员的公有信息和属于不同标注员的私有信息。对抗学习的思想体现在公有块的学习过程中,以不同标注员作为分类目标进行对抗学习。从而达到优化公有模块的学习质量,使之收敛于真实数据 (专家标注数据)。算法框架如下:
右边模块属于传统的NER网络:BiLSTM+CRF ,在文章中也被叫做 private LSTM,用于拟合不同标注员的独立标注。
对抗学习部分,首先第一块是一个common LSTM
, 输入与private LSTM
一样为中文句子的字向量,目的是学习不同标注员之间共同的部分。第二块是一个label LSTM
,输入为对应标注员的标签数据。要注意的是,我们希望标注员分类器最终失去判断能力,所以它在优化时要反向更新
R ( Θ , Θ ′ , X , y ‾ , z ‾ ) = loss ( Θ , X , y ‾ ) − loss ( Θ , Θ ′ , X ) = − log p ( y ‾ ∣ X ) + log p ( z ‾ ∣ X , y ‾ ) \begin{aligned} \mathrm{R}\left(\Theta, \Theta^{\prime}, \mathbf{X}, \overline{\mathbf{y}}, \overline{z}\right) &=\operatorname{loss}(\Theta, \mathbf{X}, \overline{\mathbf{y}})-\operatorname{loss}\left(\Theta, \Theta^{\prime}, \mathbf{X}\right) \\ &=-\log p(\overline{\mathbf{y}} | \mathbf{X})+\log p(\overline{z} | \mathbf{X}, \overline{\mathbf{y}}) \end{aligned} R(Θ,Θ′,X,y,z)=loss(Θ,X,y)−loss(Θ,Θ′,X)=−logp(y∣X)+logp(z∣X,y)
文章提出之前关于NER的研究仅仅关注文本信息是不够的,因为在社交网络(如推特等)上很多内容都是包含图片的,而且如下图所示仅仅考虑文本信息我们可能会认为"Rocky"是一个人名,但是综合考虑图片信息之后就可以判定其为一条狗。基于以上,文章提出一种综合考虑文本和图像信息的NER网络。
对于文本信息: 使用CNN提取字符向量表示,并从lookup table中提出word embedding。输入为两者的拼接,送入Bi-LSTM抽取更高层特征表示。
对于图像信息: 利用16层的VGG-net,注意本文抽取的特征是last pooling layer。并用一个全联接层转化为和文本信息相同维度的向量。
如上图右半部分所示,包含了两个attention和两个gate mechanism。
用于表征对于输入中的特定的词,对应整个图像中的哪个部分。输入为第t时间步的单词表示 h t h_{t} ht和图像特征矩阵 v I v_{I} vI,然后做attention操作 z t = tanh ( W v I v I ⊕ ( W h t h t + b h t ) ) z_{t}=\tanh \left(W_{v_{I}} v_{I} \oplus\left(W_{h_{t}} h_{t}+b_{h_{t}}\right)\right) zt=tanh(WvIvI⊕(Whtht+bht)) α t = softmax ( W α t z t + b α t ) \alpha_{t}=\operatorname{softmax}\left(W_{\alpha_{t}} z_{t}+b_{\alpha_{t}}\right) αt=softmax(Wαtzt+bαt) v ^ t = ∑ i α t , i v i \hat{v}_{t}=\sum_{i} \alpha_{t, i} v_{i} v^t=i∑αt,ivi
同上,通过结合图片信息,来综合考虑句子中每一个词对整体的贡献。输入为句子经过LSTM后的所有隐层表示 x = ( h 1 , h 2 , ⋯   , h n ) x=\left(h_{1}, h_{2}, \cdots, h_{n}\right) x=(h1,h2,⋯,hn)和上一步得到的图像权重 v ^ t \hat{v}_{t} v^t
z t ′ = tanh ( W x x ⊕ ( W x , v ^ t v ^ t + b x , v ^ t ) ) β t = softmax ( W β t z t ′ + b β t ) h ^ t = ∑ j β t , j h j \begin{array}{l}{z_{t}^{\prime}=\tanh \left(W_{x} x \oplus\left(W_{x, \hat{v}_{t}} \hat{v}_{t}+b_{x, \hat{v}_{t}}\right)\right)} \\ {\beta_{t}=\operatorname{softmax}\left(W_{\beta_{t}} z_{t}^{\prime}+b_{\beta_{t}}\right)} \\ {\hat{h}_{t}=\sum_{j} \beta_{t, j} h_{j}}\end{array} zt′=tanh(Wxx⊕(Wx,v^tv^t+bx,v^t))βt=softmax(Wβtzt′+bβt)h^t=∑jβt,jhj
用于自适应地从文本和图像中学习有用的特征。 h v ^ t = tanh ( W v ^ t v ^ t + b v ^ t ) h h ^ t = tanh ( W h ^ t h ^ t + b h ^ t ) g t = σ ( W g t ( h t t ⊕ h h ^ t ) ) m t = g t h v ^ t + ( 1 − g t ) h h ^ t \begin{aligned} h_{\hat{v}_{t}} &=\tanh \left(W_{\hat{v}_{t}} \hat{v}_{t}+b_{\hat{v}_{t}}\right) \\ h_{\hat{h}_{t}} &=\tanh \left(W_{\hat{h}_{t}} \hat{h}_{t}+b_{\hat{h}_{t}}\right) \\ g_{t} &=\sigma\left(W_{g_{t}}\left(h_{t_{t}} \oplus h_{\hat{h}_{t}}\right)\right) \\ m_{t} &=g_{t} h_{\hat{v}_{t}}+\left(1-g_{t}\right) h_{\hat{h}_{t}} \end{aligned} hv^thh^tgtmt=tanh(Wv^tv^t+bv^t)=tanh(Wh^th^t+bh^t)=σ(Wgt(htt⊕hh^t))=gthv^t+(1−gt)hh^t
上面的多模态的信息用门控的方式进行融合,由于文本信息还是占主要部分,再通过一个过滤门控,因为,在预测动词或副词的标签时,图像特征是不必要的。由于多模态融合特征或多或少地包含图像特征并且可能引入一些噪声,使用过滤门来组合来自不同信号的特征,这些特征更好地代表解决特定问题所需的信息。
s t = σ ( W s t , h t h t ⊕ ( W m t , s t m t + b m t , s t ) ) u t = s t ( tanh ( W m t m t + b m t ) ) m ^ t = W m ^ t ( h t ⊕ u t ) \begin{aligned} s_{t} &=\sigma\left(W_{s_{t}, h_{t}} h_{t} \oplus\left(W_{m_{t}, s_{t}} m_{t}+b_{m_{t}, s_{t}}\right)\right) \\ u_{t} &=s_{t}\left(\tanh \left(W_{m_{t}} m_{t}+b_{m_{t}}\right)\right) \\ \hat{m}_{t} &=W_{\hat{m}_{t}}\left(h_{t} \oplus u_{t}\right) \end{aligned} stutm^t=σ(Wst,htht⊕(Wmt,stmt+bmt,st))=st(tanh(Wmtmt+bmt))=Wm^t(ht⊕ut)
最后是一个标准的CRF tagging层。
以上
2019.04.10