学习DGCNN《Dilate Gated Convolutional Neural Network》记录

模型介绍

DGCNN,全名为Dilate Gated Convolutional Neural Network,即“膨胀门卷积神经网络”,顾名思义,融合了两个比较新的卷积用法:膨胀卷积、门卷积,并增加了一些人工特征和trick,最终使得模型在轻、快的基础上达到最佳的效果。

模型结构

学习DGCNN《Dilate Gated Convolutional Neural Network》记录_第1张图片

特点:

学习DGCNN《Dilate Gated Convolutional Neural Network》记录_第2张图片

门机制 :

模型中采用的卷积结构,来自FaceBook的《Convolutional Sequence to Sequence Learning》。假设我们要处理的向量序列是X=[x1,x2,…,xn],那么我们可以给普通的一维卷积加个门:

注意这里的两个Conv1D形式一样(比如卷积核数、窗口大小都一样),但权值是不共享的,也就是说参数翻倍了,其中一个用sigmoid函数激活,另外一个不加激活函数,然后将它们逐位相乘。因为sigmoid函数的值域是(0,1),所以直觉上来看,就是给Conv1D的每个输出都加了一个“阀门”来控制流量。这就是GCNN的结构了,或者可以将这种结构看成一个激活函数,称为GLU(Gated Linear Unit)。

除了有直观的意义外,用GCNN的一个好处是它几乎不用担心梯度消失问题,因为有一个卷积是不加任意激活函数的,所以对这部分求导是个常数(乘以门),可以说梯度消失的概率非常小。如果输入和输出的维度大小一致,那么我们就把输入也加到里边,即使用残差结构:

                 
                                                                                                                               学习DGCNN《Dilate Gated Convolutional Neural Network》记录_第3张图片

值得一提的是,我们使用残差结构,并不只是为了解决梯度消失,而是使得信息能够在多通道传输。我们可以将上式改写为更形象的等价形式,以便我们更清晰看到信息是如何流动的:   

从(3)式中我们能更清楚看到信息的流向:以1−σ的概率直接通过,以σ的概率经过变换后才通过。这个形式非常像递归神经网络中的GRU模型。

学习DGCNN《Dilate Gated Convolutional Neural Network》记录_第4张图片

膨胀卷积:

接下来,为了使得CNN模型能够捕捉更远的的距离,并且又不至于增加模型参数,我们使用了膨胀卷积

普通卷积跟膨胀卷积的对比,可以用一张图来演示

学习DGCNN《Dilate Gated Convolutional Neural Network》记录_第5张图片

同样是三层的卷积神经网络(第一层是输入层),窗口大小为3。普通卷积在第三层时,每个节点只能捕捉到前后3个输入,而跟其他输入完全不沾边。

膨胀卷积在第三层时则能够捕捉到前后7个输入,但参数量和速度都没有变化。这是因为在第二层卷积时,膨胀卷积跳过与中心直接相邻的输入,直接捕捉中心和次相邻的输入(膨胀率为2),也可以看成是一个“窗口大小为5的、但被挖空了两个格的卷积”,所以膨胀卷积也叫空洞卷积(Atrous Convolution)。在第三层卷积时,则连续跳过了三个输入(膨胀率为4),也可以看成一个“窗口大小为9、但被挖空了6个格的卷积”。而如果在相关的输入输出连一条线,就会发现第三层的任意一个节点,跟前后7个原始输入都有联系。

按照“尽量不重不漏”的原则,膨胀卷积的膨胀率一般是按照1、2、4、8、...这样的几何级数增长。当然,这里指明了是“尽量”,因为还是有些重复的。这个比例参考了Google的wavenet模型。

注意力:

从模型示意图可以看到,本文的DGCNN模型中,Attention主要用于取代简单的Pooling来完成对序列信息的整合,包括将问题的向量序列编码为一个总的问题向量,将材料的序列编码为一个总的材料向量。这里使用的Attention稍微不同于《Attention is All You Need》中的Attention,本文这种Attention可以认为是一种“加性注意力”,形式为

学习DGCNN《Dilate Gated Convolutional Neural Network》记录_第6张图片

这里的α,Wα,W都为可训练参数。而Act为激活函数,一般会取tanh,也可以考虑swish函数。注意用swish时,最好把偏置项也加上去,变为

这种Attention的方案参考自R-Net模型。(注:不一定是R-Net首创,只是我是从R-Net中学来的。)

位置向量 :

为了增强CNN的位置感,我们还补充了位置向量,拼接到材料的每个词向量中。位置向量的构造方法直接沿用《Attention is All You Need》中的方案:

 

双标注输出 :

既然用到标注,那么理论上最简单的方案是输出一个0/1序列:直接标注出材料中的每个词“是(1)”或“否(0)”答案。然而,这样的效果并不好,因为一个答案可能由连续多个不同的词组成,要让模型将这些不同的词都有同样的标注结果,有可能“强模型所难”。于是我们还是用两次标注的方式,来分别标注答案的开始位置和终止位置

这样一来,模型的输出设计跟指针方式和纯序列标注都不一样,或者说是两者的简化及融合

大局观:

最后,为了增加模型的“大局观”,我们将材料的序列编码为一个整体的向量,然后接一个全连接层来得到一个全局的打分,并把这个打分的结果乘到前面的标注中,即变成

学习DGCNN《Dilate Gated Convolutional Neural Network》记录_第7张图片

这个全局打分对模型的收敛和效果具有重要的意义,它的作用是更好地判断材料中是否存在答案,一旦材料中没有答案,直接让0即可,不用“煞费苦心”让每个词的标注都为0。

正则项 :

在比赛后期,我们发现一种类似DropPath的正则化能轻微提升效果,不过提升幅度我也不大确定,总之当时是带来了一定的提升。

学习DGCNN《Dilate Gated Convolutional Neural Network》记录_第8张图片

 

对GCNN的门进行扰动,作为模型的一个正则项

 

这个正则化手段建立在(3)式的基础上,我们的思路是在训练阶段对“门”进行扰动:


其中ε[−0.1,0.1]内的均匀随机数张量。这样一来,我们给GCNN的“门”加入了“乘性噪声”来使得具有更好的鲁棒性(对抗参数的小扰动)。

参考

1、基于CNN的阅读理解式问答模型:DGCNN

2、基于DGCNN和概率图的轻量级信息抽取模型

你可能感兴趣的:(学习DGCNN《Dilate Gated Convolutional Neural Network》记录)