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的缺点
-
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之类的正则化,带来更多的超参数,整个模型变得庞大和难以训练。
-
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的优点
-
the window size grows exponentially with the layer number;感受野随着层数的增加指数增加。
-
the number of input for a convolutional operator is fixed with a skip method; 输入的长度对于卷积操作的性能是不影响的,卷积性能只跟层数有关系
-
4 layers is enough to cover a sentence; 8 layers is enough to cover a document;
-
防止过拟合
dnn和普通cnn的网络区别
-
没有池化操作。
-
没有步长参数,默认是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算法解码出标注结果。
模型流程
模型的具体流程如下:
-
将查询语句转换为id,做为输入char_id
-
将查询语句用结巴分词,转换为seg_id
-
将char_id和seg_id输入模型,首先通过embedding_lookup分别获得各自的embedding
-
然后将char_id和seg_id的embedding拼接concat_embedding
-
将concat_embedding输入到idcnn层
-
idcnn层
-
先一层普通卷积
-
然后输入dcnn block
-
膨胀系数为1
-
膨胀系数为1
-
膨胀系数为2
-
-
b步骤的idcnn block循环4次
-
4词循环的结果 按照最后一个维度做拼接(有点像残差网络,也可以理解为低维度的特征(词特征)和高纬度的特征(语义)拼接吧)
-
-
将idcnn层的输出model_outputs,做全连接,得到最终的得分
-
然后输入到crf层,得到全局最优的序列。