膨胀卷积+crf实现命名实体识别

1.ner任务

ner是named entity recognition的缩写,即命名实体识别,是在纯文本中识别出实体来,传统的实体包括:人名,地名,机构名等。ner是序列标注任务的一种,序列标注包括CWS(中文分词),POS(词性标注),。

主要实现方案有

  • 传统的基于词典和规则的方式

  • 机器学习方式

    • HMM

    • MEMM

    • CRF

  • 深度学习方式

    • BILSTM+CRF

    • IDCNN+CRF

  • 近期

    • 注意力模型

    • 迁移学习

    • 半监督学习

2.IDCNN加CRF模型

模型主要过程是:IDCNN对输入句子的每一个字生成一个logits,这里就和biLSTM模型输出logits之后完全一样,放入CRF Layer,用Viterbi算法解码出标注结果。

下面说一下idcnn是什么和主要优点

idcnn模型

传统的序列标注问题都使用bilstm+crf来做的,但是lstm有以下缺点,导致性能不高。

lstm的缺点

RNN can't exploit the parallelism opportunities of GPU.rnn或者lstm是时序模型,不能并行化,不能重复挖掘gpu的性能。

于是考虑实现一个:即能够像CNN那样充分利用GPU的性能,又能像LSTM这样用简单的结构记住尽可能多的输入信息。但是普通的cnn有以下缺点:

普通cnn的缺点

  1. to catch broader information, number of layer grows linear with the length of sentence。普通的卷积,3个3*3卷积叠加,stride为1的话,能达到:(kernel-1)*lay+1=7的感受野,也就是和层数layer是线性关系,公式可能:1+(kernel-1)*n n为叠加的卷积核个数。这样对于序列标注这种密集预测型的任务(文本分类是稀疏预测类型的任务)来讲,卷积之后,末层神经元可能只是得到了原始输入数据中一小块的信息。而对NER来讲,整个句子的每个字都有可能都会对当前需要标注的字做出影响。为了覆盖到输入的全部信息就需要加入更多的卷积层, 导致层数越来越深,参数越来越多,而为了防止过拟合又要加入更多的Dropout之类的正则化,带来更多的超参数,整个模型变得庞大和难以训练。

  2. using pool representation to avoid this scaling will reduce the output resolution of the representation。普通的卷积还有池化操作会造成信息损失,对于序列标注这种任务不合适,文本分类是整个句子的分类,只需要总体影响比较大的特征就可以了,所以可以用池化等,ner是需要对每个字都需要打标签的,所以不仅需要影响比较大的特征,不能丢任何的特征,才能精准标注。

idcnn是什么

基于以上cnn的问题,Fisher Yu and Vladlen Koltun 2015 提出了一个dilated CNN的模型,意思是“膨胀的”CNN。想法其实很简单:正常CNN的filter,都是作用在输入矩阵一片连续的位置上,不断sliding做卷积,接着通过pooling来整合多尺度的上下文信息,这种方式会损失分辨率。既然网络中加入pooling层会损失信息,降低精度。那么不加pooling层会使感受野变小,学不到全局的特征。如果我们单纯的去掉pooling层、扩大卷积核的话,这样纯粹的扩大卷积核势必导致计算量的增大,此时最好的办法就是Dilated Convolutions(扩张卷积或叫空洞卷积)。

dilated CNN为这片filter增加了一个dilation width,作用在输入矩阵的时候,会skip掉所有dilation width中间的输入数据;而filter矩阵本身的大小仍然不变,这样filter获取到了更广阔的输入矩阵上的数据,看上去就像是“膨胀”了一般。dilated width会随着层数的增加而指数增加。这样随着层数的增加,参数数量是线性增加的,而receptive field却是指数增加的,可以很快覆盖到全部的输入数据。

如图

对应到文本上面如下图:

dcnn的优点

  1. the window size grows exponentially with the layer number;感受野随着层数的增加指数增加。

  2. the number of input for a convolutional operator is fixed with a skip method; 输入的长度对于卷积操作的性能是不影响的,卷积性能只跟层数有关系

  3. 4 layers is enough to cover a sentence; 8 layers is enough to cover a document;

  4. 防止过拟合

dnn和普通cnn的网络区别

  1. 没有池化操作。

  2. 没有步长参数,默认是1,增加了膨胀系数参数。

     

IDCNN是什么和优点

a proper number of D-CNN make up a block;

iteratively apply the block with the same parameters to incorporate broader context without over-fitting

堆叠dcnn可以很容易的整合上下文信息,比如4层dcnn感受野可以达到31,8层可以达到超过1000。但是简单增加dcnn的层数会导致过拟合严重,所以作者提出了idnn即Iterated Dilated CNNs, 循环膨胀卷积,比如一个block有dilation width为1, 1, 2的三层Dilated卷积层,然后对这个block重复执行4次,这样可以防止过拟合 而且获得了比较好的泛化性。

 

3.具体实现

 

实现的模型是4个大的相同结构的Dilated CNN block拼在一起,每个block里面是dilation width为1, 1, 2的三层Dilated卷积层,所以叫做 Iterated Dilated CNN。IDCNN对输入句子的每一个字生成一个logits,这里就和biLSTM模型输出logits之后完全一样,放入CRF Layer,用Viterbi算法解码出标注结果。

模型流程

模型的具体流程如下:

  1. 将查询语句转换为id,做为输入char_id

  2. 将查询语句用结巴分词,转换为seg_id

  3. 将char_id和seg_id输入模型,首先通过embedding_lookup分别获得各自的embedding

  4. 然后将char_id和seg_id的embedding拼接concat_embedding

  5. 将concat_embedding输入到idcnn层

  6. idcnn层

    1. 先一层普通卷积

    2. 然后输入dcnn block

      1. 膨胀系数为1

      2. 膨胀系数为1

      3. 膨胀系数为2

    3. b步骤的idcnn block循环4次

    4. 4词循环的结果 按照最后一个维度做拼接(有点像残差网络,也可以理解为低维度的特征(词特征)和高纬度的特征(语义)拼接吧)

  7. 将idcnn层的输出model_outputs,做全连接,得到最终的得分

  8. 然后输入到crf层,得到全局最优的序列。

5.参考

  1. https://www.aclweb.org/anthology/D17-1283

  2. https://blog.csdn.net/Kaiyuan_sjtu/article/details/89143573

  3. https://blog.csdn.net/imsuhxz/article/details/84941484

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值