在Attention Is All You Need-谷歌的"自注意力"中提到了为什么不在NLP中的原因。今天再分析一下由facebook提出采用卷积完成的seq2seq模型。这篇论文早于google的attention模型,其证明了CNN在NLP领域也能有较好的效果。
基本卷积结构
由于是对自然语言进行处理,因此模型的卷积与普通的图像卷积模型有一点点不同。从形式上看,更像是一维卷积,即卷积核只在句子的方向移动。这种卷积形式最早应该是[1]中提出。卷积的过程如图:
这里假设词向量为,则卷积的核大小为即卷积核的宽度始终等于词向量的维度,为卷积窗口一次覆盖的词语个数。设卷积核个数为,输入。则卷积操作:
此外,论文中还使用了一种新的非线性单元GLU(gated linear units)
[2],其方法是
表示逐个元素相乘。将输入进行两次不共享参数的卷积,其中一个输出通过sigmoid
函数作为另一个输入的gate
,这里类似于LSTM
的gate
机制,因此叫做gated linear units。在[2]中已经证明了这种非线性机制在NLP任务中要优于其他的激活函数。
总体结构
conv seq2seq总体结构还是sequence to sequence。source 和 target都会先被编码,然后做attention。Attention输出再加上decoder输出用来做预测,不过这里编码的模型从RNN变为了CNN。但是从细节上来看,这里仍然有一些不同于传统RNN语言模型的东西:
残差连接
文中提到为了使得模型能够堆叠的更深使用了残差连接。对于decoder来说也就是:
其中为decoder第层的输出。
Multi-step Attention
这也论文对attention机制的一个改变,RNN中只会对decoder与encoder做一次attention。这里可以分解为3个步骤:
- 首先并不直接使用encoder state与decoder state计算attention,而是先对decoder state做一个变换再加上target的embeding:
这里的也就是target的embeding。前面做变换是为了使得卷积输出维度变换与embedding一致。 - 然后进行attention:
这里做了一个点乘attention,是encoder堆叠的层数。也就是encoder最后一层的输出。 - 计算出attention权重后,基于计算attention输出:
这里计算attention输出的时候也并不是直接基于还加上了source的embedding 。这和传统的attention有一点差别。论文中给出的解释是:
Encoder outputs represent potentially large input contexts and provides point information about a specific input element that is useful when making a prediction
当计算出后,会直接与相加,作为下一层的输入。这也就是Multi-step Attention。
- 最终的预测方式为:
一点分析
论文中提到通过不断堆叠CNN层的方式同样可以capture long-range dependencies compared to the chain structure modeled by recurrent networks。而在Attention Is All You Need中的解决办法更为直接,既然要capture long-range dependencies,直接进行attention就对了。这样根本就不存在long-range dependencies,每个单词之间的依赖都变得shorter。
参考
[1] Convolutional Neural Networks for Sentence Classification
[2] Language modeling with gated linear units
网友评论