Dynamic Convolutional Neural Network

一、介绍

一篇14年的很经典的论文, 模型采用动态k-max pooling取出得分topk的特征值,能处理不同的句子,不依赖解析树。网络包含两种类型的层:一维的卷积层和动态k-max池化层(Dynamic k-max pooling)。

k-max pooling:

  • pooling的结果不是返回一个最大值,而是返回k组最大值,这些最大值是原输入的一个子序列;
  • pooling中的参数k可以是一个动态函数,具体的值依赖于网络的其他参数。

二、模型的特点

  1. 保留了句子中词序信息和词语之间的相对位置;
  2. 宽卷积的结果是传统卷积的一个扩展,某种意义上,也是n-gram的一个扩展,更加考虑句子边缘的信息;
  3. 模型不需要任何先验知识,并且模型考虑了句子中相隔较远的词语之间的语义信息。

三、模型结构及原理

可以发现和textCNN不同, 这里卷积是做的二维卷积.

1. 宽卷积

卷积层使用 宽卷积(Wide Convolution) 的方式。
与传统卷积操作相比,宽卷积输出Feature Map宽度更宽,因为卷积窗口并不需要覆盖所有的输入值。
感觉就是先padding吧.

右图就是宽卷积计算过程,当计算第一个节点s1时,可以假定s1节点前面有四个输入值为0的节点参与卷积(卷积窗口为5)。

2. k-max池化

k-max pooling选择序列p中的前k个最大值,这些最大值保留原来序列的词序。
k-max pooling的好处在于,既提取句子中的较重要信息(不止一个),同时保留了它们的次序信息。同时,由于应用在最后的卷积层上只需要提取出k个值,所以这种方法允许不同长度的输入。

3. 动态k-max池化

所谓动态k-max池化, 就是k值是动态变化的.
k是输入句子长度和网络深度两个参数的函数。
K l = max ( k t o p , L l L s ) K_{l}=\max \left( k_{top}, \left \lceil \frac {L-l}{L} s \right \rceil \right) Kl=max(ktop,LLls)
l l l表示当前卷积的层数, L L L是网络总共卷积层的层数; k t o p k_{top} ktop为最顶层卷积层pooling对应的k值,是一个固定值;s是输入句子的长度。
动态k-max池化的意义在于,从不同长度的句子中提取出相应数量的语义特征信息,以保证后续卷积层的统一性。

4. 非线性特征函数

对pooling层的输出做非线性变化

5. 多个Feature Map

和传统CNN一样, 提取出多个featured map以保证提取特征的多样性.

6. 折叠操作(Folding)

之前的宽卷积是在输入矩阵d×s中的每一行内进行计算操作,其中d是word vector的维数,s是输入句子的词语数量。而Folding操作则是考虑相邻的两行之间的某种联系,方式也很简单,就是将两行的vector相加;该操作没有增加参数数量,但是提前(在最后的全连接层之前)考虑了特征矩阵中行与行之间的某种关联.

实验

optimizer: Adagrad

实验1 Sentiment Prediction in Movie Reviews

数据集:SST
参数设置:
word embedding: 48
卷积核大小: 7和5
k-max pooling: k=4
第一层feature map:6
第二层feature map: 14

实验2 Question Type Classification

数据集: TREC
参数设置:
word embedding: 32
feature map: 8, 5

pytorch实现k-max pooling

def kmax_pooling(x, dim, k):
    index = x.topk(k, dim = dim)[1].sort(dim = dim)[0]
    return x.gather(dim, index)