当前位置: 首页 > news >正文

【论文笔记】Attention is All You Need(NIPS’17)

Attention is All You Need(NIPS’17)

Abstract

  • 序列转录模型——根据给定的序列生成另一个序列
  • 一般使用encode-decode架构,表现好的模型,通常也会在编码器和解码器之间使用注意力机制
  • 提出了一个新的简单架构

Conclusion

  • 提出了Transformer,第一个仅适用attention的序列转录模型,将之前所有的循环过程换成了multi-headed self-attention

2 Background

  • 如何用CNN替换循环神经网络来减少时序的计算
  • CNN难以对长序列建模,这是因为在做卷积计算时,每一次只能看到一个小窗口(卷积核),比如3*3的像素块,如果两个像素块离得距离很远,需要用很多层卷积去实现,才能最后将两个离得远的像素块的信息融合起来,如果使用Transformer里面的注意力机制的话,每一次可以看到所有的像素块,一层就能够看到整个序列,就不会存在上述问题。
  • 但CNN的好处在于,可以做多个输出通道,一个输出通道可以认为是它可以去识别的不一样的模式。所以提出了multi-head attention,来模拟CNN的多输出通道的效果。
  • self-attention,是transfomer的关键点。transfomer是第一个做encode-decode架构的模型。

3 Model Architecture

在这里插入图片描述

  • encode-decode架构:编码器会将输入长为n的(x1,…,xn)表示成为隐式长为n的z=(z1,…,zt),其中zi是一个表征xi的向量,即编码器将原始输入变成机器学习可以理解的一系列向量。解码器是以编码器的输出作为输入,生成长为m的序列(y1,…,yn),m不一定等于n,解码器中的yi是一个一个生成的,这叫做自回归auto-regressive模型,即给定z生成y1,给定z和y1生成y2,给定z和y1…yt-1生成yt,以此类推。

3.1 Encoder and Decoder Stacks

Encoder

在这里插入图片描述

  • The encoder is composed of a stack of N = 6 identical layers。
  • Each layer has two sub-layers.
    • The first is a multi-head self-attention mechanism
      在这里插入图片描述
    • the second is a simple, positionwise fully connected feed-forward network(其实就是MLP)
      在这里插入图片描述
  • 每一个子层都用了残差链接residual connection,然后使用了layer normalization(公式表达LayerNorm(x + Sublayer(x)) )
  • 为了方便残差链接(x + Sublayer(x))),all sub-layers in the model, as well as the embedding layers, produce outputs of dimension dmodel = 512,这就使得每个编码器只有两个超参数:N = 6和dmodel = 512
  • LayerNorm是对每个样本在channel方向做归一化(均值为0方差为1),BatchNorm是对batchsize中的所有样本在batch方向做归一化。
Decoder

在这里插入图片描述

  • The decoder is also composed of a stack of N = 6 identical layers.

  • 除了编码器encoder layer中包含的两个子层the two sub-layers,解码器decoder插入了另一个子层a third sub-layer。

  • which performs multi-head attention over the output of the encoder stack.
    在这里插入图片描述

  • 解码器中使用了自回归,即当前时刻的输出的输入集是前面所有时刻的输出。通过带masked的multi-head attention保证在输入进来时,在t时刻是不会看到t时刻之后的输入的从而保证训练和预测时候的行为是一致的。

3.2 Attention子层

  • 注意力函数是将一个query和一些key-value对映射成一个output的函数,其中query、key、value都是向量。output是value的加权和,所以output维度和value维度是一致的。对于每个value的权重,它是由每个value对应的key和query的相似度compatibility function计算而来。compatibility function不同的注意力机制有不同的算法。
3.2.1 Scaled Dot-Product Attention

在这里插入图片描述

  • 不一样的相似函数导致不一样的注意力的版本,这里的Scaled Dot-Product Attention是transfomer用到的一个注意力
  • 这里queries和keys的维度是相等的,即为d_k,values的维度是d_v。
  • query和key的相似度计算方法:对每一个query和key计算内积作为相似度(类似余弦相似度),然后除以 d k \sqrt{d_k} dk ,然后再用softmax得到权重
  • 实际中是如何实现这个计算的:queries可以写成一个矩阵Q(n*d_k),keys可以写成矩阵K(d_k*m),Q和K的内积就是n*m的矩阵。values可写成矩阵V(m*d_v),则K和V的内积就是最终的output(n*d_v)。这样就将queries(n*d_k)映射到了output(n*d_v)。
  • 一般有两种常见的注意力机制:加型注意力additive attention和点积注意力dot-product (multiplicative) attention。additive attention可以处理query和key不等长的情况,dot-product attention跟本文的Scaled dot-product attention基本上是一样的,只 Scaled Dot-Product Attention除了一个 d k \sqrt{d_k} dk
  • 为什么选择dot-product attention?additive attention和dot-product attention两种注意力机制差不多,这里选择后者是因为实现简单、计算高效。
  • 为什么要在dot-product attention的基础上除以 d k \sqrt{d_k} dk ?当d_k不是很大是,除不除都没关系,但是当d_k比较大时,也就是说query和key这两个向量的长度比较长的时候,那么点积值可能就会比较大/小。当点积值比较大的时候,各个点积值(相似度)之间的差距就会比较大,就导致在softmax之后,大的值非常接近于1,而小的值接近于0,使得点积值(相似度)更加向两端靠拢。当出现这种情况时,计算梯度的时候,梯度会比较小,训练的时候就会“跑不动”(这是因为:softmax的最后结果就是希望预测值置信的地方尽量靠近1,不置信的地方尽量靠近0,代表着收敛的差不多了,这时候的梯度就变得比较小)。在transfomer中,d_k比较大,所以除以 d k \sqrt{d_k} dk 效果会更好。
Mask(opt.)
  • mask主要是为了避免训练和预测时,在t时刻看到t时刻以后时间的东西。
  • 具体来说:假设query和key是等长的,长度为n且在时间上是能一一对应的,对于第t时刻的query q_t,在训练和预测中做计算时,应该只能看到k_1到k_t-1的东西,而不看不到k_t和它之后的东西,因为k_t及之后的东西在当前时刻是还看不到的。
  • 但是其实在计算注意力的时候,是会看到所有的query和key,q_t会跟所有的K中的东西(k_1,…,k_m)全部做运算,虽然都计算了,但是在算出来之后,只要保证在计算权重(计算output)的时候,不要用k_t之后计算的值,所以加了mask。
  • mask的意思就是说,对于q_t和k_t之后计算的那些值,换成一个非常大的复数,比如-1e10,这个大的负数在计入softmax做指数的时候,它就会变成0,所以softmax之后出来的东西,q_t和k_t之后计算的值都会变成0,而只会q_t和k_1到k_t-1的计算值才会有效果。
  • 这样就保证了在计算output时,只用了v对应的v_1到v_t-1的结果,而后面的东西没有看,所以mask的效果是在训练的时候,让t个时间的query只看对应的t前面那段时间的key-value pair,使得在做预测的时候是能跟训练的时候对应上的。
3.2.2 Multi-Head Attention

在这里插入图片描述

  • 与其做单个注意力函数,不如将整个query、key、value投影到一个低维,投影h次,然后做h次注意力函数,每一个函数的输出concatenated在一起,再投影回来,得到最终的输出。
  • 线性层Linear就是将Q,K,V投影到比较低的维度,然后再做Scaled Dot-Product Attention,然后将结果concat在一起,再经过Linear层得到多头注意力output
  • 为什么要有多头注意力机制?Scaled Dot-Product Attention没有可学习的参数,只是相似度度量(内积);但是为了识别不同的模式,希望有不一样的计算相似度的方法,具体做法:先投影到低维,投影过程是有参数可以学习的,也就是说给h次机会,希望学习到不一样的投影方式,使得投影后的度量空间可以匹配不同的模式需要的一些相似函数,类似CNN中的多通道。
    在这里插入图片描述
3.2.3 Applications of Attention in our Model

在Transformer模型中是如何使用注意力的?有三种使用方式,分别对应:

  1. 编码器中的注意力
    在这里插入图片描述
  • 编码器的输入是n个长度为d的向量,注意力层有3个输入,分别表示key,value,query,三者是一样的,就是自己本身,故称为自注意力机制。
  • n个query,每个query都会得的一个输出,意味着会有n个输出且输出和value的长度是一样的,即输出维度也是d。输出其实就是value的一个加权和,权重来自query和key的相似度。
  • 假设不考虑多头和有投影的情况,输出就是输入query的加权和,权重来自于query本身(因为计算相似度用的query和key是一样的,即当query与第i个key相等时,相似度取最大值)。
  • 如果有多头的话,因为有投影,在这个地方可以学习h个不同的距离(相似度)空间,使得输出结果不仅仅是query与key本身的距离。
  1. 解码器的注意力
    在这里插入图片描述
  • 解码器的输入key,value,query也是一样的,维度d是一样的,只是长度可能变成了m而不是编码器中的n。
  • 与编码器不同的是多了一个mask,在解码器中,当计算一个query它对应的输出时,它是不应该看到query当前位置之后的东西的,所以在解码器中后面的计算值要设为0,这就是mask的作用。
  1. 第三个注意力在编码器和解码器之间传递信息
    在这里插入图片描述
  • 这里的注意力不在是自注意力了!因为key和value来自于编码器的输出,query来自于解码器masked attention的输出。
  • 编码器最后一次的输出是n个维度为d的向量,解码器masked attention的输出是m个维度为d的向量,意味着对于解码器的每一个输出,需要通过每一个query与来自于编码器输出的相似度的加权和。这就是说,在这个attention中所做的事请就是去有效的把编码器的输出,根据我想要的东西把它挑出来。根据在解码器输入的不同,根据当前的输入向量,在编码器的输出中挑选感兴趣的东西,也就是应该“注意”到的东西赋予大的权重,不该“注意”的东西赋予小的权重。

3.3 Position-wise Feed-Forward Networks

  • a fully connected feed-forward network
  • 其实就是MLP,不同点是applied to each position separately and identically。position就是输入序列中的每个元素,即对每一个position作用同样的MLP,这就是Position-wise的意思。
  • 这个MLP只是作用在最后一个维度。
    在这里插入图片描述
    公式即为:FFN(x)=Linear(Rule(Linear(x))),线性层+Rule激活层+线性层
    注意力层的输出,即一个query对应输出的维度是512的向量,也就是这里的x维度是512的向量,W1会把512投影成2048,这个投影等于将维度放大了4倍。因为最后会有一个残差链接,还得投影回512,即W2是将2048投影回512。
  • Position-wise Feed-Forward Networks其实就是单隐藏层的MLP,中间隐藏层将输入扩大了4倍,最后输出的时候又缩小回输入的大小。
  • Transformoer中的MLP是对每个attention的输出都单独做一次投影,且权重是共享的。而RNN在做MLP的时候会把上一次的输出和这一次的输入一起输入进MLP, 这样就完成了序列信息的传递。而Transformoer中的attention起到的作用是就是将整个序列的信息抓取出来(做一次聚合aggregation),然后再输入进MLP,映射成我们更想要的语义空间。
  • RNN和Transfomer都是用MLP来做语义空间的转换,区别在于如何传递序列信息:RNN是把上一时刻的信息输出传入下一时刻做输入,而Transfomer是通过attention层在全局去获取序列信息,然后再用MLP做语义转换。这是两个模式的区别,但是它们的关注点都是在于如何有效的利用序列信息。

3.4 Embeddings and Softmax

在这里插入图片描述

  • 因为输入是一个一个的序列元素token(词汇、图像切片等),需要将它们映射成一个向量,Embedding就是给每个token,学习一个维度为d的向量去表示它。
  • 编码器和解码器的输入都需要Embedding,并且we share the same weight matrix between the two embedding layers and the pre-softmax linear transformation
  • In the embedding layers, we multiply those weights by d m o d e l \sqrt{d_{model}} dmodel 。为什么权重要乘以 d m o d e l \sqrt{d_{model}} dmodel ?因为在学Embedding的时候,学到的权重值会很小,乘以$\sqrt{d_{model}}为了保证在后续加Positional Encoding的时候在一个量级scale上。

3.5 Positional Encoding

  • Transformer中attention输出是value的加权和,没有时序信息,权重是query和key之间的距离(相似度);RNN是将上一时刻的输出作为下一时刻的输入,来传递历史信息,这种操作本身就包含了时序信息。

  • attention的做法是通过Positional Encoding在输入中加入时序信息。
    -在这里插入图片描述

  • 输入inputs进入embedding层之后,对每个序列token都会得到一个长为512向量,然后Positional Encoding将词在句子中位置信息编码为一个长为512的向量表示位置,然后将两个512的向量加起来。

  • 因为Positional Encoding是sin/cos的函数,所以结果是在(-1,1)之间的,所以Embedding乘以 d m o d e l \sqrt{d_{model}} dmodel 使得每个结果也是在差不多(-1,1)之间,保证两者相加是在一个量级。这样就完成了在输入中加入了位置信息。

相关文章:

  • 递增链表去重
  • 【WEEK13】 【DAY3】Shiro第三部分【中文版】
  • SSL证书制作及nginx部署
  • 局域网传文件怎么操作?轻松实现文件共享!
  • 用Python的PyAutoGUI库控制鼠标滚轮
  • 深度学习之基于TensorFlow人脸表情识别
  • 用C语言把一棵普通二叉树安排得明明白白
  • 【重学C++】02 脱离指针陷阱:深入浅出 C++ 智能指针
  • 掌握Edge浏览器的使用技巧
  • HarmonyOS开发之DevEco Studio安装
  • 前端面试项目细节重难点(已工作|做分享)
  • 循环双链表算法库构建
  • 解决 VSCode 编辑器点击【在集成终端中打开】出现新的弹框
  • HD哈默纳科行星减速机:工业传动领域的卓越之选
  • 云原生技术:开启你的数字王国
  • 收藏网友的 源程序下载网
  • 0x05 Python数据分析,Anaconda八斩刀
  • 10个确保微服务与容器安全的最佳实践
  • CentOS从零开始部署Nodejs项目
  • Docker 笔记(2):Dockerfile
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • PAT A1050
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 高性能JavaScript阅读简记(三)
  • 警报:线上事故之CountDownLatch的威力
  • 聊聊hikari连接池的leakDetectionThreshold
  • 如何在 Tornado 中实现 Middleware
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 交换综合实验一
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (十六)Flask之蓝图
  • (一)Thymeleaf用法——Thymeleaf简介
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)用.Net的File控件上传文件的解决方案
  • (转)重识new
  • .gitattributes 文件
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .Net 8.0 新的变化
  • .NET Core跨平台微服务学习资源
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .NET企业级应用架构设计系列之应用服务器
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • 。。。。。
  • 。Net下Windows服务程序开发疑惑
  • [2008][note]腔内级联拉曼发射的,二极管泵浦多频调Q laser——