零基础学nlp【6】 self attention(Attention is all you need)

零基础学nlp【6】 self attention

论文:Vaswani A, Shazeer N, Parmar N, et al. Attention is all you need[C]//Advances in Neural Information Processing Systems. 2017: 5998-6008.

1 前言

前几节已经介绍了有关attention机制以及其各种变种,见第【2】【4】【5】节。其基本思想都是用rnn作为输入与输出的编码,用attention机制寻找编码与编码之间的联系,抽象来说可以表示为如下图所示:
零基础学nlp【6】 self attention(Attention is all you need)_第1张图片
在上面的例子中query就是decoder得到的某时刻的隐变量,key与value相同,都是所有(部分)时刻encoder中的编码,最后得到了attention-value。(key与query判断相关性,得到相关性系数后乘以value得到attention-value,但是在之前的例子中两者都是encoder的编码所以一样)
那么所谓的self attention 究竟指的是什么,有什么作用呢?这也就是这篇文章的主要内容

2 主要内容

所谓的 self attention 用上面那一张图表示,可以看做query与key与value都是相同的。不过需要注意的是,他的输入不再是rnn的编码,因为整个框架并没有用rnn编码,而是用了self attention代替了rnn作为编码。也就是说,这整个模型是一个encoder-decoder模型,其中encoder使用了self-attention和一个feed forward堆叠而成,self attention的输入是词的嵌入向量和用于表示位置的位置编码,输出是 。而decoder同样也使用了self attention代替rnn作为解码器,并且使用了encoder与decoder两者编码的注意力机制(即传统的注意力机制)。整体模型如下图所示:
零基础学nlp【6】 self attention(Attention is all you need)_第2张图片

3 attention构造

在文章中,attention的构造使用了一个叫做multi-head attention的结构,下图左所示,其中包含了一个叫做scaled dot-product-attention的结构,如下图右所示
零基础学nlp【6】 self attention(Attention is all you need)_第3张图片零基础学nlp【6】 self attention(Attention is all you need)_第4张图片
先说scaled dot-product-attention,公式如下,简单地说就是Q和K的点积然后softmax后作为权重乘以了V,只不过和之前的不一样的是在Q和K点积后除了一个标准差,可以看做是让softmax分布更平滑
在这里插入图片描述
之后来说multi-head attention,这是我认为的文章的难点
通过上图所示的结构,这里的难点我认为是要能理解这一层输入和输出分别是什么,以及他们的维度是多少。如论文中所介绍的,单词的词嵌入向量长度为512维,首先在linear层,将K,Q,V映射到8个每个64维的向量中,其次对应将8个K,Q,V的三个64维向量输入到scaled dot-product-attention,得到864个输出的attention——value,之后用concat将这864联合起来变成512维,最后再做一个映射到512维即输入和输出的维数是一样的。这就是他的整个流程。可以看做是某个单词Q根据这句话其他的单词以及位置关系(暂时还没提到)输出一个同维的向量。

4 positional encoding

上面的介绍中重点标出了“位置关系”,然而到目前为止,这一点完全没有体现,即交换输入词的位置,结果不会得到任何改变,因此为了体现位置关系,使用了positional encoding 来构建
这一块自己看了好久也不是很明白,所以引用了一文读懂「Attention is All You Need」| 附代码实现这篇文章,见图
零基础学nlp【6】 self attention(Attention is all you need)_第5张图片

5 encoder与decoder

有了上述的multi-head attention,已经可以理解encoder和decoder是如何利用self-attention进行编码的了,即输入的每一个单词得到的都是该单词与整个句子结构位置关系总结后得到的一个向量,这就和rnn编码结果是类似的,即蕴含整个句子信息的向量。
不过值得注意的是,在文章中,encoder和decoder都是用了6层的结构,每一层 最终层的encoder输出的还要与对应的每一层 decoder相应层进行一个注意力机制,整体结构还是非常复杂的
零基础学nlp【6】 self attention(Attention is all you need)_第6张图片
在层与层的连接中,使用了残差连接,这个我记得在cnn中经常使用比如resnet,用来防止梯度消失或梯度爆炸保证了CNN在很深层的时候任然有较好的效果。在这里不知道是不是也是类似的效果。

困惑

  1. 这篇文章看的很累,看了很久才看懂,但是可能仍然有理解错误,希望有错误可以指出。
  2. 对于这样的一个模型结构,我不太清楚该怎么样进行训练,在encoder中的Q应该是指的整个句子而不是一个单词吧,这样可以构成一个大的矩阵用来训练。不知道理解对不对。
  3. 文中用了许多次的linear但是到底是不是都需要的,还是说是和cnn一样为了加深网络深度,提供更好的效果?
  4. 对句子使用位置编码真的合适吗,总觉得不如RNN和CNN来的直接。

在看网上的解析时也有人提到了用CNN代替RNN,决定下一篇论文看看这个,再与这篇文章对比一下,总结一下。好难。。。。

【零基础学nlp,争取每天看一篇文章,大家有建议,或者我理解错的地方请批评指正。希望有人能和我一起学!!!!】

你可能感兴趣的:(attention,nlp,零基础学nlp)