Attention Is All You Need

参考论文:Attention is all you need

这篇论文超火的, 楼楼也过来凑个热闹。

背景:

主流的Seq-Seq的模型通常采用RNN或者是CNN,一般在网络结构中都会用到encoder和decoder, 效果比较好的模型会通过attention(注意力机制)连接encoder和decoder。但是这种网络结构也存在一些问题:

1. RNN

网络结构:

递归框架:

基于RNN的这一类网络都存在以下两种问题:

1. RNN的递归依赖使得其难以并行化, GNMT就需要96块GPU训练一周

2. 缺乏对全局信息的理解, 尤其是长距离和层级化的依赖关系难以建立。

2.CNN

网络结构:

基于CNN的这一类网络都此存在

事实上,CNN只能捕捉到局部信息,但是可以通过层叠来增大感受野。

Transformer

而这篇论文提出了一种新的并且更为简单的网络结构, 不再依赖RNN或者是CNN,只需要attention机制就能解决Seq-Seq的问题, 并且能够一步到位获取了全局信息。

这种新的网络结构称为Transformer, 这篇博客将详细介绍Transformer

机器翻译:

Transformer依旧离不开encoder和decoder,依然需要encoder-decoder结构。编码器映射符号表达的输入序列(x1,⋅⋅⋅,xn)到一个连续表达z=(z1,⋅⋅⋅,zn)。给定z, 一个解码器生成一个符号的输出序列(y1,⋅⋅⋅,ym)一次一个元素。在每个步骤中,模型是自动回归,使用之前生成的符号作为额外输入当生成下一个时。

Transformer遵循整体架构,使用堆积的自注意力和点级别,对于编码器和解码器都有全连接层。上面的网络结构实际上

编码器:

使用N = 6的完全一样的层堆积。每层有两个子层,第一个是multi-head 自注意力机制,第二个是一个简单,居于位置的全连接前向反馈网络。我们使用残差连接在每两个子层间,后加上层正则化。每个子层的输出是LayerNorm(x+Sublayer(x)), 其中sublayer(x)是有子层自己实现的函数。为了促进这些残差连接,所有子层和嵌入层一样,产生的输出维度为dmodel=512。

解码器:

解码器也是由N = 6完全相同层推挤而成。在每个编码层包括两个子层,在解码器插入第三个子层,完成multi-head注意力在编码器堆积的输出。类似编码器,我们使用残差连接在每个子层,后面加上层正则化。我们也修订自-注意力子层在解码器堆积来保留位置。结合事实输出嵌入由一个位置抵消,确保对i位置的预测值依赖于已知的在i之前位置的输出。

注意:

Feed Forward: 传统的前馈神经网络

Self-Attention:自注意力机制, 表征句子中不同位置词之间的依赖关系

Encoder-Decoder Attention:源端到目标端的注意力机制, 对源端词到目标端词的依赖关系进行建模

Attention

注意力函数可以描述为映射一个请求和一系列键值对到一个输出,其中请求,键, 值和输出都是向量。输出作为一个值的加权和计算得到,其中分配到每个值的权重由请求的兼容函数关于对应键计算得到。

Scaled Dot-Product Attention

输入为queries和dk维的keys,和dv维的values。我们计算query关于所有key的点积,除以根号下dk, 并应用softmax函数来得到walue上的权重. 一般,我们会将一组query同时输入, 将其以Q矩阵表示, Keys和Values也一同输入, 以K矩阵和V矩阵分别表示。Scaled Dot-Product Attention的输出为:

含义:Q为n*dk的矩阵, K为m*dk的矩阵,V是m*dv的矩阵,最终输出的m*dv的矩阵,忽略softmax函数,上面这个表达式其实就是将 n×dk 的序列 Q 编码成了一个新的 n×dv 的序列。由此可见, attention层其实质也是一个重新编码的过程。单独拿一个query来看qt,这个公式所要表达的就是 qt 这个 query,通过与各个 ks 内积的并 softmax 的方式,来得到 qt 与各个 vs 的相似度,然后加权求和,得到一个 dv 维的向量。

这只是Q和K的一种计算方式(采用了点乘), 其实还有很多种其他表达。更为泛化的表达式是:

其中,Similarity(Query, Key)可以是点积,也可以是Cosine相似度,也可以是MLP网络。

可以分解为三个计算阶段, 如下图:

阶段1:

根据Query和Key计算权重系数(Query dot Key, Cosine(Query, Key), Mlp(Query, Key)).

阶段2:

对第一阶段的原始分数进行归一化,也就是Softmax函数过程

阶段3:

根据阶段2获得权重对Value进行加权求和

Multi-Head Attention

从形式上看,它其实就再简单不过了,就是把 Q,K,V 通过参数矩阵映射一下,然后再做 Attention,把这个过程重复做 h 次,结果拼接起来就行了. 它的结构图就非常明显说明了这一点。

最后得到一个 n×(hd̃v) 的序列。所谓“多头”(Multi-Head),就是只多做几次同样的事情(参数不共享),然后把结果拼接。

Attention in Transformer

Transformer使用multi-head注意力在三种不同的方式: 1,在编码和解码注意力层(encoder-decoder attention),来自之前解码层的请求,和内存键和值来自编码的输出。这允许解码器中每个位置去参与输入序列的所有位置。 2,编码器包含自注意力层(self attention),在自注意力层中所有的键、值和请求来自同一个位置,在编码器的之前层的输出。编码器中每个位置能参与到编码器之前层的所有位置。 3,相似地,自注意力层在解码器中允许解码器中每个位置去参与到解码器中所有位置。我们需要防止解码器中信息向左留到来预防auto-regressive属性。 位置状态的前向网络 除了注意力子层,在编码器和解码器中的每一层包含一个全连接的前向网络,被应用到每个位置独立地、相同地。这包含两个线性转化使用RELU激活函数。

然而线性转化在很多不同位置是相同的,他们使用不同的参数层与层之间。另一个描述这个的方法是作为两个核大小为1的卷积层。输入和输出的维度为512,内层维度为dff=2048 嵌入和softmax 和其他序列转化模型类似,我们使用学习的嵌入来转化输入字符和输出字符到dmodel的向量。我们使用通常的学习的线性转化和softmax函数去转化解码器输出到预测的下一个字符概率。在本模型中,我们共享相同的权重矩阵在两个嵌入层和pre-softmax线性转化。在嵌入层,我们用根号下dmodel乘上权重 位置编码

Position Embedding,也就是“位置向量”,将每个位置编号,然后每个编号对应一个向量,通过结合位置向量和词向量,就给每个词都引入了一定的位置信息,这样 Attention 就可以分辨出不同位置的词了。 我们模型不包含循环和卷积,为了模型使用序列顺序,我们必须注入一些关于序列中符号的相关或绝对位置的相关信息。最后,我们增加“位置编码”到输入嵌入在编码器和解码器的最底层。位置编码和嵌入的相同维度dmodel,以至于两个可以相加。对于位置编码有很多选择。如下图所示, 最终Embedding with time signal 作为输入。

本文中,使用不同频率的sin和cosine函数:

将 id 为 p 的位置映射为一个 dpos 维的位置向量,这个向量的第 i 个元素的数值就是 PEi(p)。

pos是位置i表示维度。这就是位置编码的每个维度对应着正弦曲线。波长构成了几何级数从2π到10000∗2π。我们选择这个函数因为我们假设它将允许模型简单地学习去使用相关位置,当对于任何固定的偏移量k,PEpos+k可以表示为PEpos的线性函数。 我们也使用学习得的位置嵌入【9】实验,发现这两个版本产生近似一样的结果。我们选择正弦版本是因为允许模型去推断更长的序列 。因此Encoder层,

Transformer的网络结构

Transformer总结:

• Attention Mechanism广泛应用于机器翻译、语音识别、图像标注等很多领域,Attention给模型赋予了区分辨别的能力,例如,在机器翻译、语音识别应用中,为句子中的每个词赋予不同的权重,使神经网络模型的学习变得更加灵活(soft),同时Attention本身可以做为一种对齐关系,解释翻译输入/输出句子之间的对齐关系。 • 区别于主导序列转导模型基于包括编码器和解码器的复杂递归或卷积神经网络,Transformer完全基于Attention机制,避免了重复和卷积,使得并行化成为可能,提高了时间性能。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券