A Convolutional Neural Network for Modelling Sentences

使用DCNN对语言进行建模

概述

使用CNN进行语言建模已经取得了较广泛的应用。本文作者提出了一个动态卷积网络DCNN,这是一个针对卷积神经网络的扩展,不需要依赖语法树,并且作者提出了许多比较新颖的概念,比如宽卷积、动态k-max pooling,这些特性使得DCNN可以捕获长短依赖,并且丰富了DCNN提取的特征。

模型结构

DCNN

宽卷积

句子经过embedding后,首先会通过宽卷积。通常情况下,卷积核只会在句子本身的窗口上移动,因此卷积操作会忽略边缘的数据,这种操作也被称为窄卷积。对于句子来说,如果句子的长度是$l$,卷积核的宽度是$s(s>1)$,那么卷积后的宽度变为$l-s+1$。对于宽卷积来说,卷积核会超过句子本身的窗口,多余的位置会通过padding补齐,因此宽卷积操作后,宽度变为$l+s-1$,对于$d$维的embedding操作,宽卷积后的矩阵大小为$(l+s-1) \times d$。

k-Max Pooling

通常情况下,卷积操作后会使用max-pooling来过滤有意义的值。在本文中,作者使用k-max pooling来代替max-pooling。这两者的区别是,max-pooling只取最大的一个数值,而k-max pooling则取最大的$k$个数值,相比max-pooling,k-max pooling能捕获更多的特征。并且对于得到的这$k$个数值,它们的顺序和在原矩阵上的顺序是一致的。这样做的好处是,句子原先的先后顺序不会被破坏掉,因此句子原先存在的某些依赖可以仍然保持。

动态k-Max Pooling

作者所谓的动态k-max,其实是指每一层的$k$是不固定的,实际上,在固定输入长度后,每一层的$k$仍然是提前算好的,并不会在训练时发生改变。

其中$L$表示宽卷积的总层数,$l$表示当前宽卷积的层数,$k_{top}$表示最后一层的k值。

多feature map + 非线性激活函数

使用多个feature map,并且k-max pooling后使用一层非线性激活函数,基本上和CNN类似,不细讲了。唯一需要注意一点的是,作者说

After (dynamic) k-max pooling is applied to the result of a convolution, a bias and a non-linear function g are applied component-wise to the pooled matrix.

这句句子的意思到底是每一层的max-pooling后面都接了全连接,还是只有最后一层接了全连接呢?按常理来说,只在最后一层全连接更加常见。但我看到很多其他关于这篇的论文笔记上说每一层后面都接了?单从作者给的模型图上面来说,似乎只有最后一层接了全连接,但也有可能是作者没有画全吧。

Folding

最后作者还是用了一个称之为Folding的操作,它用在最后一层卷积的k-max pooling后面,这个操作具体来说就是将$d$维的矩阵的所有相邻维度两两相加,变成$d/2$维的矩阵。因此该操作不需要引入额外的参数,并且这个操作发生在全连接层之前,因此不会产生交叉依赖的问题。

总结

总的来说,这篇文章提出了一种新颖的动态CNN网络。相比普通的CNN,它不仅通过使用k-max pooling提取更多的特征,并且使用宽卷积避免了无法很好地提取句子边缘特征的问题。此外,这篇文章中提出的folding,dynamic k-max pooling操作对现在的网络构建仍然具有一定的参考意义。