实体识别和关系抽取是例如构建知识图谱等上层天然语言处理应用的基础。实体识别能够简单理解为一个序列标注问题:给定一个句子,为句子序列中的每个字作标注。由于同是序列标注问题,除去实体识别以外,相同的技术也能够去解决诸如分词、词性标注等不一样的天然语言处理问题。git
说到序列标注直觉是会想到RNN的结构。如今大部分表现最好的实体识别或者词性标注算法基本都是biLSTM的套路。就像Ruder在他的博客 Deep Learning for NLP Best Practices 里面说的,There has been a running joke in the NLP community that an LSTM with attention will yield state-of-the-art performance on any task.算法
对于序列标注来说,普通CNN有一个劣势,就是卷积以后,末层神经元可能只是获得了原始输入数据中一小块的信息。而对NER来说,整个句子的每一个字都有可能都会对当前须要标注的字作出影响。为了覆盖到输入的所有信息就须要加入更多的卷积层, 致使层数愈来愈深,参数愈来愈多,而为了防止过拟合又要加入更多的Dropout之类的正则化,带来更多的超参数,整个模型变得庞大和难以训练。由于CNN这样的劣势,大部分序列标注问题人们仍是使用biLSTM之类的网络结构,尽量使用网络的记忆力记住全句的信息来对单个字作标注。网络
Fisher Yu and Vladlen Koltun 2015 提出了一个dilated CNN的模型,意思是“膨胀的”CNN。想法其实很简单:正常CNN的filter,都是做用在输入矩阵一片连续的位置上,不断sliding作卷积。dilated CNN为这片filter增长了一个dilation width,做用在输入矩阵的时候,会skip掉全部dilation width中间的输入数据;而filter矩阵自己的大小仍然不变,这样filter获取到了更广阔的输入矩阵上的数据,看上去就像是“膨胀”了通常。orm
具体使用时,dilated width会随着层数的增长而指数增长。这样随着层数的增长,参数数量是线性增长的,而receptive field倒是指数增长的,能够很快覆盖到所有的输入数据。ip
咱们的模型是4个大的相同结构的Dilated CNN block拼在一块儿,每一个block里面是dilation width为1, 1, 2的三层Dilated卷积层,因此叫作 Iterated Dilated CNN。get
IDCNN对输入句子的每个字生成一个logits,这里就和biLSTM模型输出logits以后彻底同样,放入CRF Layer,用Viterbi算法解码出标注结果。博客
在biLSTM或者IDCNN这样的深度网络模型后面接上CRF层是一个序列标注很常见的方法。biLSTM或者IDCNN计算出的是每一个词分类的几率,而CRF层引入序列的转移几率,最终计算出loss反馈回网络。网上有很多相关帖子,如这里it