前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >细讲 | Attention Is All You Need

细讲 | Attention Is All You Need

作者头像
zenRRan
发布2018-12-24 16:04:59
4.3K0
发布2018-12-24 16:04:59
举报

Attention Is All You Need

自从Attention机制在提出之后,加入Attention的Seq2Seq模型在各个任务上都有了提升,所以现在的seq2seq模型指的都是结合rnn和attention的模型。传统的基于RNN的Seq2Seq模型难以处理长序列的句子,无法实现并行,并且面临对齐的问题。

所以之后这类模型的发展大多数从三个方面入手:

  • input的方向性:单向 -> 双向
  • 深度:单层 -> 多层
  • 类型:RNN -> LSTM GRU

但是依旧收到一些潜在问题的制约,神经网络需要能够将源语句的所有必要信息压缩成固定长度的向量。这可能使得神经网络难以应付长时间的句子,特别是那些比训练语料库中的句子更长的句子;每个时间步的输出需要依赖于前面时间步的输出,这使得模型没有办法并行,效率低;仍然面临对齐问题。

再然后CNN由计算机视觉也被引入到deep NLP中,CNN不能直接用于处理变长的序列样本但可以实现并行计算。完全基于CNN的Seq2Seq模型虽然可以并行实现,但非常占内存,很多的trick,大数据量上参数调整并不容易。

本篇文章创新点在于抛弃了之前传统的encoder-decoder模型必须结合cnn或者rnn的固有模式,只用Attention。文章的主要目的在于减少计算量和提高并行效率的同时不损害最终的实验结果。

Model

1 整体框架

整体框架很容易理解,但看上图又很复杂,简化一下:

其实这就是一个Seq2Seq模型,左边一个encoder把输入读进去,右边一个decoder得到输出:

第一眼看到论文中的框图,随之产生问题就是左边encoder的输出是怎么和右边decoder结合的。因为decoder里面是有N层的。再画张图直观的看就是这样:

也就是说,Encoder的输出,会和每一层的Decoder进行结合。我们取其中一层进行详细的展示:

2 Attention Mechanism
2.1 Attention定义

Attention用于计算"相关程度",例如在翻译过程中,不同的英文对中文的依赖程度不同,Attention通常可以进行如下描述,表示为将query(Q)和key-value pairs映射到输出上,其中query、每个key、每个value都是向量,输出是V中所有values的加权,其中权重是由Query和每个key计算出来的,计算方法分为三步:

  • 第一步:计算比较Q和K的相似度,用f来表示:
  • 第二步:将得到的相似度进行Softmax操作,进行归一化:
  • 第三步:针对计算出来的权重

,对V中所有的values进行加权求和计算,得到Attention向量:

注:第一步中计算方法包括以下四种:

  • 点乘 dot product:
  • 权重 General:
  • 拼接权重 Concat:
  • 感知器 Perceptron:

在论文中,将Attention落实到具体,分别叫做 Scaled Dot-Product Attention 和 Multi-Head Attention。

2.2 Scaled Dot-Product Attention

它的结构图如下:

  • First Step

首先从输入开始理解,Scaled Dot-Product Attention里的Q, K, V从哪里来:按照我的理解就是给我一个输入X, 通过3个线性转换把X转换为Q,K,V。

两个单词,Thinking, Machines. 通过嵌入变换会X1,X2两个向量[1 x 4]。分别与Wq,Wk,Wv三个矩阵[4x3]想做点乘得到,{q1,q2},{k1,k2},{v1,v2} 6个向量[1x3]。

  • Second Step

向量{q1,k1}做点乘得到得分(Score) 112, {q1,k2}做点乘得到得分96。

  • Third and Forth Steps

对该得分进行规范,除以8。这个在论文中的解释是为了使得梯度更稳定。之后对得分[14,12]做softmax得到比例 [0.88,0.12]。

  • Fifth Step

用得分比例[0.88,0.12] 乘以[v1,v2]值(Values)得到一个加权后的值。将这些值加起来得到z1。这就是这一层的输出。仔细感受一下,用Q,K去计算一个thinking对与thinking, machine的权重,用权重乘以thinking,machine的V得到加权后的thinking,machine的V,最后求和得到针对各单词的输出Z。

  • 矩阵表示

之前的例子是单个向量的运算例子。这张图展示的是矩阵运算的例子。输入是一个[2x4]的矩阵(单词嵌入),每个运算是[4x3]的矩阵,求得Q,K,V。

Q对K转制做点乘,除以dk的平方根。做一个softmax得到合为1的比例,对V做点乘得到输出Z。那么这个Z就是一个考虑过thinking周围单词(machine)的输出。

注意看这个公式,

其实就会组成一个word2word的attention map!(加了softmax之后就是一个合为1的权重了)。比如说你的输入是一句话 "i have a dream" 总共4个单词,这里就会形成一张4x4的注意力机制的图:

这样一来,每一个单词就对应每一个单词有一个权重

注意encoder里面是叫self-attention,decoder里面是叫masked self-attention。

这里的masked就是要在做language modelling(或者像翻译)的时候,不给模型看到未来的信息。

mask就是沿着对角线把灰色的区域用0覆盖掉,不给模型看到未来的信息。

详细来说,i作为第一个单词,只能有和i自己的attention。have作为第二个单词,有和i, have 两个attention。 a 作为第三个单词,有和i,have,a 前面三个单词的attention。到了最后一个单词dream的时候,才有对整个句子4个单词的attention。

做完softmax后就像这样,横轴合为1

2.3 Multi-Head Attention

Multi-Head Attention就是把Scaled Dot-Product Attention的过程做H次,然后把输出Z合起来。论文中,它的结构图如下:

我们还是以上面的形式来解释:

我们重复记性8次相似的操作,得到8个Zi矩阵

为了使得输出与输入结构对标 乘以一个线性W0 得到最终的Z。

3 Transformer Architecture

绝大部分的序列处理模型都采用encoder-decoder结构,其中encoder将输入序列

映射到连续表示

,然后decoder生成一个输出序列

,每个时刻输出一个结果。从框架图中,我们可以知道Transformer模型延续了这个模型。

3.1 Position Embedding

因为模型不包括Recurrence/Convolution,因此是无法捕捉到序列顺序信息的,例如将K、V按行进行打乱,那么Attention之后的结果是一样的。但是序列信息非常重要,代表着全局的结构,因此必须将序列的分词相对或者绝对position信息利用起来。

这里每个分词的position embedding向量维度也是

, 然后将原本的input embedding和position embedding加起来组成最终的embedding作为encoder/decoder的输入。其中position embedding计算公式如下:

其中 pos 表示位置index, i 表示dimension index。

Position Embedding本身是一个绝对位置的信息,但在语言中,相对位置也很重要,Google选择前述的位置向量公式的一个重要原因是,由于我们有:

这表明位置p+k的向量可以表示成位置p的向量的线性变换,这提供了表达相对位置信息的可能性。

在其他NLP论文中,大家也都看过position embedding,通常是一个训练的向量,但是position embedding只是extra features,有该信息会更好,但是没有性能也不会产生极大下降,因为RNN、CNN本身就能够捕捉到位置信息,但是在Transformer模型中,Position Embedding是位置信息的唯一来源,因此是该模型的核心成分,并非是辅助性质的特征。

3.2 Position-wise Feed-forward Networks

在进行了Attention操作之后,encoder和decoder中的每一层都包含了一个全连接前向网络,对每个position的向量分别进行相同的操作,包括两个线性变换和一个ReLU激活输出:

其中每一层的参数都不同。

3.3 Encoder

Encoder有N=6层,每层包括两个sub-layers:

  • 第一个sub-layer是multi-head self-attention mechanism,用来计算输入的self-attention
  • 第二个sub-layer是简单的全连接网络。
  • 在每个sub-layer我们都模拟了残差网络,每个sub-layer的输出都是:

其中Sublayer(x) 表示Sub-layer对输入 x 做的映射,为了确保连接,所有的sub-layers和embedding layer输出的维数都相同

3.4 Decoder

Decoder也是N=6层,每层包括3个sub-layers:

  • 第一个是Masked multi-head self-attention,也是计算输入的self-attention,但是因为是生成过程,因此在时刻 i 的时候,大于 i 的时刻都没有结果,只有小于 i 的时刻有结果,因此需要做Mask
  • 第二个sub-layer是全连接网络,与Encoder相同
  • 第三个sub-layer是对encoder的输入进行attention计算。 同时Decoder中的self-attention层需要进行修改,因为只能获取到当前时刻之前的输入,因此只对时刻 t 之前的时刻输入进行attention计算,这也称为Mask操作。
3.5 The Final Linear and Softmax Layer

将Decoder的堆栈输出作为输入,从底部开始,最终进行word预测。

3.6 The Decoder Side

继续进行:

4 Experiment

可以看出,transformer 用了最少的资源得到了state-of-art的输出回报。

对模型自身的一些参数做了改变自变量的测试,看一下哪些参数对模型的影响比较大。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 深度学习自然语言处理 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Attention Is All You Need
    • Model
      • 1 整体框架
      • 2 Attention Mechanism
      • 3 Transformer Architecture
      • 4 Experiment
相关产品与服务
GPU 云服务器
GPU 云服务器(Cloud GPU Service,GPU)是提供 GPU 算力的弹性计算服务,具有超强的并行计算能力,作为 IaaS 层的尖兵利器,服务于深度学习训练、科学计算、图形图像处理、视频编解码等场景。腾讯云随时提供触手可得的算力,有效缓解您的计算压力,提升业务效率与竞争力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档