Transformer:attention is all you need

传统的序列模型通过attention将encoder-decoder结构连接,2017年谷歌针对NLP里的机器翻译问题,提出一种“Transformer”新的网络结构,完全基于self-attention,解决了传统RNN无法并行的问题,速度和效果得到了明显提升。
直接上模型结构


The Transformer-model architecture

大部分的神经序列转换模型都是encoder-decoder结构,encoder将用符号表示的input 映射为 ,decoder根据一次生成一个元素,最终得到输出序列,模型都是自回归的,当生成下一个时,消耗先前生成的符号作为附加输入。

Encoder and Decoder Stacks

Encoder:由N = 6个完全相同的块堆叠组成,每一个又由两个子层组成,第一层是一个multi-head self-attention,第二层是一个简单的、位置完全连接的前馈网络。其中每个子层再用一个残差连接,再进行标准化normalization。 也就是说,每个子层的输出是LayerNorm(x + Sublayer(x)),其中Sublayer(x) 是由子层本身实现的函数。 为了方便这些残差连接,模型中的所有子层以及嵌入层产生的输出维度都为512
Decoder : 同样由N = 6个完全相同的块堆叠而成。 除了每个Encoder中的两个子层之外,Decoder 在中间额外加入一层,该层对Encoder的输出执行multi-head attention。 与Encoder类似,我们在每个子层再采用残差连接,然后进行层标准化。 我们还修改Decoder 的self-attention子层,以防止位置关注到后面的位置(详细见代码)。 这种掩码结合将输出embedding偏移一个位置,确保对位置的预测 i 只能依赖小于i 的已知输出。

Attention

Attention函数可以描述为将query和一组key-value对映射到输出,其中query、key、value和输出都是向量。 输出为value的加权和,其中分配给每个value的权重通过query与相应key的兼容函数来计算。

缩放版的点积attention
Scaled Dot-Product Attention

输入由 维的queries和keys,维的values组成,计算query和所有key的点积,每个都除以 ,然后再通过一个softmax function获得values的权重,其中起调节作用,使softmax足够soft。

其中

Multi-Head Attention
Multi-Head Attention

Multi-Head Attention,由多个并行运行的attention层组成。
作者发现将query、key和value分别用h次通过不同的、学到的线性映射到、和维比直接用(512)维的query、key和value执行单个attention函数效果更好。 基于h个映射的query、key和value,并行执行attention函数,产生 维输出值。 将它们concat并再次映射,产生最终值。Multi-Head就是在原来维度上进行分割,然后并行处理(参数不共享),最后载拼接起来,这可以每个并行的模块可以学习到更多的内容,作者将h设置为8个并行的head,也就是对于每个head,由于每个head的大小减小,总的计算成本与具有全部维度的单个head attention相似。


其中

Attention在transformer模型中的应用

1、encoder包含self-attention,在self-attention层中,所有的key、value和query来自同一个地方,在这里是encoder中前一层的输出。 encoder中的每个位置都可以关注encoder上一层的所有位置。
2、decoder中的self-attention层允许decoder中的每个位置都关注decoder中该位置之前包含该位置的所有位置。
3、在“encoder-decoder attention”层,query来自前一个decoder层,key和value来自encoder的输出。 这允许decoder中的每个位置能关注到输入序列中的所有位置。 这模seq2seq中典型的encoder-decoder的attention机制。

Position-wise Feed-Forward Networks

除了attention子层之外,encoder和decoder中的每个层都包含一个完全连接的前馈网络,该前馈网络单独且相同地应用于每个位置。 它由两个线性变换组成,之间有一个ReLU激活。

同位置的线性变换是一样的,但是层与层之间的参数不一样,其中
input和output的维度都是,中间层的维度是 ,可以这样理解:每个 维向量 x 在此先由 变为维的 ,再经过,变回 维。之后再是一个residual connection。输出 size 仍是

Positional Encoding

由于模型不包含循环和卷积,为了让模型利用序列的顺序,必须注入序列中关于词符相对或者绝对位置的一些信息,文章采取的方法是位置编码(positional encoding),在送入encoder和decoder之前,先对输入进行编码,位置编码的维度和embeddings的维度一致,为 。所以两者可以相加。
结合位置向量和词向量有几个可选方案,可以把它们拼接起来作为一个新向量,也可以把位置向量定义为跟词向量一样大小,然后两者加起来。在文章中采用的是把两者加起来。


其中pos 是位置,i 是维度.。也就是说,位置编码的每个维度对应于一个正弦曲线。

你可能感兴趣的:(Transformer:attention is all you need)