Densely-connected Recurrent and Co-attentive Information(DRCN) 借鉴了DenseNet的思想,据作者说是第一个将Dense思想用在RNN上面的。其中作者为了解决密集链接带来的数据维度太大的问题,采用了AE来进行了数据降维。
论文地址:
https://arxiv.org/pdf/1805.11360.pdfarxiv.org一、概述
此论文作者受到了DenseNet的启发,将RNN进行了Dense链接,并且结合了attention机制,刷新了Semantic sentence matching中好几个任务的state of the art。DenseNet是从resnet进化来的,他不是传统的残差链接了而是将每一层的输出采用concat方式链接,然后输入到后面的层中。也就是说,每一层都能接收到前面所有层的信息。但是这样随着网络深度加深,后面数据的维度将会非常大,很容易造成OOM。针对上面的问题,作者采用autoencoder来作为bottleneck进行数据降维。
二、模型详解
此模型的基本骨架使用密集链接的RNN,据作者说是第一个这样做的。密集链接主要的好处就是每一层都能得到前面所有层的信息,但带来的问题可能就是数据维度会比较大,作者采用了自编码器来解决维度增加的问题。同时在两个句子的交互上,作者使用了attention机制,attention权重则是用的cosine相似度计算。整个模型结构图如下:
这个图画的还是比较清晰地,不过里面也存在着一些问题,后面我会一部分一部分的说。首先没什么悬念,两个句子先经过embedding层进行抽象,然后通过密集链接的RNN层。这里两个句子会先求attention,然后将attention的值还有rnn的输出以及前面所有层的输出concat到一起,之后经过一个自编码器来输出固定维度也就是降维。最后则是常见的池化加一些加减乘除绝对值等神仙操作后经过全连接得到结果。
- Embedding Layer
这里作者除了使用词向量,还是用了字符向量,主要为了结局OOV的问题,这里使用的是cnn来做char embedding。作者在这里还讨论了是固定的向量好,还是可训练的比较好。结论就是这个东西跟任务有关,需要我们根据不同的任务自己去尝试,这两种方式各有各的好处,可能fixed无法抓住数据集的特点,但是不容易过拟合;而可训练的正好相反。同时作者这里还加入了exact match flag, 来自 [Gong, Luo, and Zhang 2018 ]的一篇文章,这里我还没有仔细看这篇论文,但大致就是加入了ner,pos等其他标签信息。
上面的公式应该非常清晰了,计算出来fix embedding, train embedding, char embedding, extract flag,然后再把这四部分concat到一起,形成了最后的词表示。
- Densely connected rnn
这里的RNN网络采用的就是传统的Bi-LSTM, 但是这里没有使用传统的堆叠方式进行组合,而是借鉴了DenseNet采用了密集链接的方式。同时作者在这里还比较了三种不同的连接方式,传统的堆叠,后面的残差链接,现在的密集链接方式。公式见下图:
作者在这里分别比较了三种不同连接方式的优缺点,对于传统的堆叠LSTM网络来说,造成的最大问题就是随着网络的加深,容易造成梯度消失以及梯度爆炸;对于残差链接来说,虽然通过加法操作绕过了非线性部分,似的深层网络的训练称为可能,但是这种加法的方式阻碍了一部分信息的传播。为了解决上面的问题,这里采用了密集链接的方式,也就是单纯的前面所有层的信息拼接在一起。虽然这样也会存在问题,也就是随着网络的加深,参数大小会越来越大。作者在这里使用了autoencoder在作为一个瓶口限制了参数的维度。同时作者也在后面使用消融实验验证了其效果。
- Densely-connected Co-attentive networks
看到这里大家等的attention也终于出场了,似乎每个求句子相似的任务都不可避免的使用了attention,这已然成为了一个标配。在这里作者使用cosine相似度经过softmax得到attention权重。公式如下
得到attention向量后,将其与rnn的输出以及前面一层的输出进行拼接。这里和原来的densenet还不是很一样,densenet是将前面所有层的信息都在后面进行拼接,而这里只是对前一层进行拼接。
- Bottleneck component
前面说过这种密集链接的形式虽然解决了随着网络加深信息丢失的问题,但是也带来了参数温度过大的问题。作者在这里利用了autoencoder来作为一个bottleneck部件,实现了数据的降维。由于没有源码,这里不是很确定作者是只使用了AE的encoder部分,还是说使用了整个AE。这里猜测大概率是整个AE,因为后面会说道loss函数是两个部分组成,一个是分类的交叉熵,另一个就是AE的loss。同时作者还提到了这个组件在这个模型中用来知识蒸馏以及正则化,这里暂时还不是很理解,有明白的同学可以告诉我。
- Interaction and Prediction Layer
这一层就是最后的交互以及预测层了,在这里通过最大池化以及一些神奇的加减乘除绝对值操作,完成了两个句子最后的交互。然后通过一个两层的带relu激活函数的全连接层完成最后的分类。这里也提到了最后是有两个loss的,一个就是交叉熵另外一个是 reconstruction loss of autoencoder。
三、总结
此论文最大的创新点应该是首次将densenet的思路应用到了rnn上,并通过实验验证是就有非常好的效果的。通过跟attention的结合,实现了句子间的交互。另外一个点就是使用autoencoder作为瓶口结构,实现了参数温度的减小,同时避免了信息的丢失。相信densenet的思路可以得到更广泛的应用,最近我也在尝试将其应用到transformer上面,然是目前还没有很好地效果。