NLP 领域首次将 attention 机制应用到 CNN 中,CNN 擅长提取输入的鲁棒和抽象特征。这项工作提出了一个基于注意力的卷积神经网络ABCNN,该网络可以通过考虑两个句子之间的相互依赖性来建模一个句子对。 另外,ABCNN 是一种通用体系结构,可以处理各种各样的句子对建模任务。
1. BCNN:Basic Bi-CNN
上图中 Wide convolution 操作其实就是在原始 s 两端补 0 之后的卷积,假设卷积核长 3,宽度和词向量维度一致,那么宽卷积就会在句子长度两侧分别 padding 长度为 3-1=2 的维度和词向量维度一致的向量,对于 s0 来说在卷积之前就得到了尺寸为 9 * 300 的矩阵 (300 为词向量维度)。那么如果步长为1,就会得到第二层长度为 7 (9-3+1) 的特征图。这里所谓 Average pooling 就是同样以 3 为宽度沿着特征维度那一维进行平均,所以又回到了长度为 5 (7-3+1) 的特征图。这种以 Wide convolution + Average pooling 组成的 block 可以重复多次,每个block 依次生成更高粒度的更多抽象特征。
最后一层 pooling 宽度取整个特征图长度就得到了最终的句子表示用于最终的任务预测,同时还可以对中间的 pooling 层也执行宽度为整个特征图长度的操作,得到的向量直接用于最终的任务预测。因为来自不同层的表示覆盖了不同抽象级别的句子属性,并且所有这些级别的特征对于特定的句子对都很重要,所以一般能提升任务表现。
2. ABCNN: Attention-Based BCNN
2.1 ABCNN-1
红色的两个句子原始特征表示经过某种 attention 计算得到 attention 矩阵 (A in R^{s0*s1}),这里经过实验,表现最好的函数是:
(|cdot|) 表示欧拉距离。
然后分别使用两个可学习的权重矩阵对上述 attention 矩阵进行变换得到 attention feature map:
然后将 representation feature map 和 attention feature map 堆叠输入到卷积网络中
这里 A 和现在常用的 attention 玩法还是有些不太一样,直觉上如果我来做,会计算出两份一样的 A,比如说:
2.2 ABCNN-2
这里 A 的计算方式论文中并未给出描述,暂且认为和前面的方法一样。不过 ABCNN-2 计算 attention 是在卷积输出上进行的,而前一种方法是在卷积之前进行的。
然后分别按行和列相加进行池化得到对应两个长度的特征,然后将这个特征作为池化权重,比如池化宽度为 3,如图中所示对 4/5/6 列进行操作时,则相应地取出 col-wise sum 特征的最后三个元素对 4/5/6 进行加权求和。最后就得到了 attention-based average pooling 的结果。
2.3 ABCNN-3
结合前两个方法,允许 attention 机制同时在卷积层和池化层发生作用,允许 attention 机制同时作用在在输入粒度和更抽象的输出粒度上。
3. 输出层
假设共有 k 个 block,每个 block 能提供 n 个相似度得分 (相似度计算方式有很多种,余弦或者前面介绍的 attn 的计算方式),那么输出层共有 kn 个特征,然后不同的任务还可以手动构造一些特征,比如:
- 同时出现在问题和答案中的非停用词的数量 (使用 question 中词的 IDF 值加权数量)
- 句子长度
- 15个 MT 指标 (BLEU....)
- 同义词、反义词、上位词数量等等