Attention Is All You Need

内容来自哔站跟着李沐学Al

1.摘要

主流的序列转录模型主要依赖复杂循环卷积神经网络,采用encoder-decoder架构。

本文提出了一个简单的架构transformer。

transformer仅仅使用了自注意力机制,没有使用循环和卷积。

2.结论

把之前的循环层换成了multi-headed self-attention,速度快效果好。

3.导言

RNN计算顺序是从左往右计算,没有办法并行,t时刻输出依赖于t-1时刻。

attention用在RNN上没有本质上的改变,因此提出了attention is all you need

4.相关工作

4.1使用卷积神经网络对于比较长的序列难以建模,应为卷积计算时候每次看的只是一个小窗口,想要把里的较远的俩个窗口做到关联的话需要多层卷积才行。如果使用transformer的注意力机制的话我们可以看到全部的像素。但是卷积有一个好处就是可以多通道输出(一个通道可以用来识别一个模式),因此transformer加入了多头注意力机制来模仿卷积的多通道输出。

transformer是第一个只依赖自注意力机制来做encoder-decoder架构的模型。

5.模型

传统模型中的自回归

在encoder将输入变成向量以后,在经过decoder时候是一个一个按顺序进行的,只有算出了i-1时刻的结果才可以得到i时刻的结果。输入又是输出。该模型叫做自回归auto-regressive

transformer是有的也是encoder-decoder框架,结构如下:

左半部分是编码器部分,右半部分是解码器部分。左边input输入原始数据,右边编码器的输入在预测时是没有输入的。输入的是之前的输出output。

5.1encoder and decoder stacks

5.1.1对于encoder来说

文章中n=6,一个有六层,每一层有俩个子层,第一层是多头注意力机制,第二层是feed forward。并且每一层都有加入残差连接:

the output of each sub-layer is LayerNorm(x +  Sublayer(x))

为了方便起见把每一层的输出都变成d model =512。

对于transformer来说也只有俩个参数可调,一个是层数 N,另一个是维度d model。后面设为bert和GPT 也差不多调这俩个。

 对比layerNorm和batchNorm:

因为在batchnorm训练时候要保存每一个样本均值和方差,如果样本长度比较大的话,每次算小批量的方差和均值的变动幅度会比较大。而且全局的均值和方差会受到极端样本均值和方差的影响。

相反的,layernorm计算的是样本各自的自己的均值和方差,不需要存下来全局的方差和均值,相对来说结果比较稳定。

而且layernorm有后续文章研究来看对计算梯度很正则都比较好

5.1.2对于decoder来说

 基本上和编码器一样,但是有第三个子层。

解码器有自回归机制,而注意力机制中每次可以看见完整的输入,因此解码器的输入应该让解码器看不见之后的输入,否则会影响自回归。所以解码器训练的时候应该加入一个带掩码的注意力机制,在图中显示的是mask 。

5.2注意力 attention

注意力函数是将一个querykey - value对映射为输出的函数。其中query、key、value、output都是向量。其中output是value的加权和。因此output和value的维度是一样的。

权重:

对应每一个value的权重,都是value对应的key和query的相似度(compatibility function)得来的。

给一个query,这个query和第一个第二个比较近,所以输出的output对应的三个value值来说,前面的权重比较大一些。

举个例子就是query是查找信息时候输入的文本,可以就是搜索相关联的分类,value就是给我的匹配内容。

5.2.1Scaled Dot-Product Attention(transformer使用的注意力机制)

query和key的长度都是等长的,为dk。value为dv,因此输出也是dv。

query和key做内积(向量内积就是看相似度:a*b*cos夹角)

计算公式如下:

QK内积然后除以根号dk,然后用softmax得到权重:即给一个query,然后有n个key value的话,就会得到n个值。然后放入softmax就可以得到一个各自非负,加起来等于1的权重,将权重作用于value上就得到了想要的输出。

(实际中使用的算法如下)

很多的query写为一个矩阵,和所有的key做内积得到一个矩阵,然后softmax一下在与value内积得到输出结果:

注意力机制常见的有加型注意力机制和点乘注意力机制,本文使用的是点乘注意力机制,因为比较简单,但是点积注意力机制可处理q和k不等长的情况。本文在点乘注意力的基础上除以了dk,因为当dk比较大的时候,向量的相对差距就会变大,这导致在softmax的时候小的值会靠近0,大的值会靠近1。

出现这样的情况时候算梯度会导致梯度比较小,跑不太动。

流程图如下图所示:

scale就是 除以dk,mask就是为了避免t时刻看到t时刻以后的东西。

假设qk长度相等在相同的时刻t,对应的k有:

k1 k2 k3 ......k (t-1) k(t) ......k (n),因为attention机制中可以看到所有的k的值,但是循环时候不应该看见t时刻之后的,所以我们把k在t时刻之后的值都为一个极大的负数,极大的负数在softmax做指数的时候得到的值就会变成0,这样就等价于看不见了,这就是mask的原理。

5.2.2 Mukti-head Attention

如上图右图所示,先将QKV进入线性层linear,把他投影到一个较低的维度,然后进入注意力机制。把这个步骤进行h次,得到h个输出,把这些输出向量合并到一起,再线性投影一次得到输出。

为什么要做多头注意力机制:

在上左图中的注意力会发现里面没有可以学习的参数,但是有时候为了识别不同的模式,希望可以有一些不一样的计算像素的办法,加性attention中有一点权重在里面可以解决这个问题,对于这种attention来说就用了多头注意力机制。

通过第一次的投影到低维,这个投影过程是可学习的过程,给h次机会希望学到了不同的投影方法,使得投影进去的度量空间里面可以用来匹配不同的特征。

计算公式如下:

5.2.3此模型中attention的应用

一.左下注意力机制:

输出是输入的加权和(自己和自己权重最大),假设不考虑多头和有投影的情况,输出就来自于输入的加权和,权重来自于自己本身和其他输入的相似度。有多头的话就涉及到了投影,会学习出h个不一样的距离空间,使得得到不同的输出。

二.解码器的下层注意力机制:

和一相似,只不过可能长度变为了m,维度也是相同,唯一不一样的就是加入了mask。

三.解码器上层注意力机制:

不再是自注意力,K V来自于编码器的输出。Q来自于解码器attention的输入

5.3feed forward :point-wise feed forward network

实际上是一个MLP,本文章把 MLP作用到了序列当中的每一个词(position)上面,作用的是最后一个维度。

式中  xW1+b1 是一个线性层,加上前面的max代表激活层,在与W2和b2线性组合。

本式中的输入是输入query对应的注意力层的输出x,x原本是一个长为512的向量,W1把这个向量变成了2048,扩大了四倍。应为最后还有残差连接,所以W2又将2048向量投影回了512.

本质是一个:单隐藏层的MLP,中间隐藏层把输入扩大了4倍,输出又回到了输入的大小

对比transformer和RNN:

transformer将序列的全部都通过注意力机制按照权重进行了输出,输出包含了序列的全部信息,该序列信息通过MLP的投影,转换为了我们想要的语义空间信息。

RNN通过MLP将position信息输出,序列的t时刻MLP的输入来自于t时刻对应的position和t-1时刻MLP的输出,这样就把前面序列的信息传递到了t时刻。

由此也可以看出transformer不包含时序信息,即使打乱输入序列的顺序也不会影响输出。而RNN包含了时序信息。

5.4Embeddings and Softmax

输入是一个一个的词,也就是一个一个的词源token,embedding可以把token变成长为d的向量。

5.5Positional Encoding

为了解决transformer不包含时序信息的缺点。

6.实验

对比值为:

计算复杂度、顺序计算、信息点之间的长度

笔记:

  • 30
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值