Attention Is All You Need 论文笔记_attention is all you need kv_墨鱼mo的博客-程序员宅基地

技术标签: 机器翻译  深度学习  自然语言处理  

2017 年,Google 机器翻译团队发表的《Attention is All You Need》中,完全抛弃了RNN和CNN等网络结构,而仅仅采用Attention机制来进行机器翻译任务,并且取得了很好的效果,注意力机制也成为了大家近期的研究热点。该论文发表在2017年的NIPS 上。

1、Attention机制

Attention用于计算“相关程度”,他考虑的是随意线索,而CNN,RNN考虑的是不随意线索。

Attention可以进行以下描述,表示为将query(Q)和key(K)-value(V)映射到输出上,输出是所有V的加权和,权重是根据query和key的相似度计算的并进行softmax归一化。

自注意机制是将输入Xi当做key,value,query(复制成三份),来对序列抽取特征。

Transformer

首先是说之前做的工作,主流的模型还是利用CNN和RNN,且比较复杂。介绍当前模型的局限性。

RNN的两个缺陷:

1、要计算ht就要知道ht-1和当前的输出t,所以想要得到t的隐藏状态,就必须要计算ht-1的隐藏状态,这使得RNN的并行度是很差的,需要一步一步的向后计算。

2、RNN记忆过早的历史信息比较差,时序信息是一步一步往后计算的。

考虑使用CNN代替RNN来解决并行问题(CNN有多个输出通道),但是CNN也有问题,CNN对长序列难以建模。因为卷积做计算的时候,每次是看一个比较小的窗口(例如3*3的窗口),两个像素点离得比较远,那么要通过很多层卷积把两个像素点联系起来。

CNN的多个输出通道,且每个通道的是不一样的,这一点和本文中提出的Multi-Head Attention是相似的。

Model Architecture

模型采用的是Encoder-Decoder架构。(输出结构化信息比较多,适合编码器-解码器架构)

编码器会将输入序列X=(X1,,,,Xn)(如果X是一个句子,那么每个分量是一个词)映射成向量Z=(Z1,,,,Zn).

解码器做的是一个自回归,是一个词一个词生成的,无法看到整个句子,当前的输出的输入集是上一个时刻的输出。

模型的整个架构如下图:

Transformer 编码器

使用了N=6完全一样的模块,每个块由两个子层组成:Multi-head self-attention和FNN(其实就是一个单隐藏层的MLP) ,对于每个子层使用了残差连接(残差连接的输入与输出维度大小要相通同),在最后使用了一个层归一化(Layernorm),即每个子层的输出是:LayerNorm(x+Sublayer(x))

这里的为了计算方便使用统一的维度为512,(与卷积不同,卷积每经过一层,空间维度会减小,通道的维度会增加)

输入首先使用了一个词嵌入方法,使词变为向量d=512,方便计算,接着将向量加入位置编码,(在输入中加入位置信息),使得自注意力能够记忆位置信息,假设长度为n的序列X(n*d的矩阵),那么使用位置编码P(n*d),来输出X+P作为自编码输入。P的元素计算如下:

这里使用正余弦函数计算,每列的周期不一样(可以看出每个样本加的值是不一样的),这里记录的是相对位置信息(即第i个位置的信息和第i+e位置的两者的相对位置),而不是绝对位置信息。

Transformer 解码器

使用了N=6完全一样的模块,每个模块有三个子层组成:Masked multi-head self-attention、Multi-head attention和FNN(其实就是一个单隐藏层的MLP),由于在预测时,当前时间的输出不应该看到当前时间之后的输入(当前时间之后的权重为0),所以第一个是带掩码(mask)的注意力机制。

 Layer_Norm

神经网络学习过程中的本质是为了学习数据的分布,如果不做归一化,每批次训练的数据的分布是不一样的(一般有四个步骤,计算均值、方差,归一化处理到均值为0,方差为1(减去均值,除以标准差),变化重构)。

transformer使用的层归一化,这里可以与batch_norm做对比。

batch_norm:批量归一化对每个特征/通道元素做归一化 。

layer_norm:层归一化对每个样本的进行归一化处理,比较适合序列长度变化的NLP应用。

各种归一化操作的简单介绍

layer_norm和batch_norm的主要区别如下图,

 Attention

注意力函数是将一个query和一些key-value键值对映射成一个输出的函数,query,key,values和output是一些向量。output是values的加权和(其输出的维度与values的维度是一致的),其中这些权重是通过计算key和query的相似度得出的。

 以图为例,蓝色的Q靠近K的前两个值(与前两个K的相似度比较高),所以对应的前两个V的权重会比较大,同理红色的Q靠近后两个,后两个V对应的权重会比较大。不同的Q会导致权重分配不同,这样得到的输出也是不一样的。

Scaled Dot-Product Attention

attention的计算方法有很多,这里transformer采用的是一种比较简单的方法,内积计算相似度,

q和k的维度相同都为dk,values的维度为dv(输出也是),q,k,v都是向量,q,k采用的内积的方法计算相似度,内积越大说明相似度越高,如果内积为0,说明向量正交,没有相似度。内积为负(钝角),但经过softmax还是会在0-1之间。

如果一个一个计算那么效率会很低,一般采用矩阵的方法。

Q(n,dk), K(m,dk),V(m,dv),其注意力机制计算公式如下:

这里相似度计算采用的dot-product attention(内积法,维度要相同),还有一种方法时additive-attention(加性法,维度可以不同),两种方法其实差不多,但是内积法的速度更快,空间效率高。

首先做内积计算相似度,再利用softmax产生权重并把V加权求和,这里与内积法不同的是除以了根号下dk,为什么除以sqrt(dk)原因

 在dk不大的时候,开不开根号都可以,但是当维度很大时,内积的值会比较大或者比较小。当值很大的时候,相对的差距会变大,导致最大值 softmax会更加靠近于1,剩下那些值就会更加靠近于0。softmax的值会在两端,这样梯度会比较小,剃度比较小,优化起来就比较困难,就可能跑不动,transformer中的dk=512,是比较大的,所以除以根号dk是个不错的选择。

其模型如下图:

这里加了一个mask,对于t时间的qt,本应该只看到k1,k2,,,,kt-1,后面的还没有,但在注意力机制,qt会看到所有的k,k1,k2,,,,kt,所以在计算当前值时,其后的值令其为一个很大的负数,这样做softmax就会变为0。

Multi-Head Attention

如果只做单一的注意力机制函数,效果不是很好,不如说把整个query,key,value线性投影到(project)到一个低维的空间,投影h次,然后再做h次注意力函数,把每个函数的输出拼接起来,再投影到原来的维度进行输出。

为什么要用多头? 

单个的Dot-Product Attention没有什么参数可以学习,但还是希望能够学得一些东西,所以将其线性投影到低维,这个投影权重的W的矩阵是可以学习的,投影h次,会得到h个不同的模型,有点类似于CNN的多通道。可以提高并行度。

维度d=512,h=8,所以他投影到了512/8=64维上面。因为投影到了低维度,其计算成本与全维度的计算成本相似。

transformer使用了三种不同方式的multi-head attention。

编码器中的self-attention

 因为是自注意力机制,所以qkv是一样的,所以最后的输出维度与输入维度是相同的。

解码器中的self-attention

这里加了一个掩码(mask),也是为了不能知道后面的信息。

解码器中另一个attention

 这里的key、values不再是自己,而是来自编码器输出。query来自之前解码器的输出。

Feed Forward

其本身就是一个MLP,max就是一个RELU激活函数。xW1+b1是第一层max()W2+b2是第二层。

 x是query后的输出,维度是d=512.W1会投影到2048,W2又把2048投影回了512.(即中间隐藏层扩大了四倍)。

与RNN做对比,两者的传递信息的方式不同,而语义转换的MLP基本相同。

attention是把序列中的信息抓取出来,做一次加权求和,然后放到MLP中,这里每个词用了一个MLP,其所有的MLP的权重是一样的。

RNN是上一个时刻的信息传输到下一个时刻做输入来进行信息传递。

Embedding

embedding:将输入的一个词、词语 token 映射成为一个长为 d = 512的向量。

论文中提到模型的编码器、解码器之前的 2个 embedding 共享权重。–> 训练更简单【注意这里是把英语和德语放到一个字典中了,不再分开做两个字典,所以才能共享权重】。

注意Embedding之后乘了一个sqrt(d)!

原因:权重 * sqrt(dmodel = 512) ,学 embedding 的时候,会把每一个向量的 L2 Norm 学的比较小。维度大的话,学到的一些权重值就会变小,但之后还需要加上 positional encoding(不会随着维度的增加而变化,是一个-1, 1之间的数)。

why attention

n是序列长度,d是维度。

self-attention的复杂度计算是,Q,K(n*d)两个矩阵相乘,所以复杂度为n*n*d

Sequential Operations 是指做下一步操作之前要等待多久,越小越好。

Maximum Path Length是指信息从一个点到另一个点要多久,越小越好。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45553275/article/details/123197218

智能推荐

某国际酒店国内组网通信--加速访问新加坡AWS_gaoshan467888的博客-程序员宅基地

海外加速FS Cloud Direct Connect 云直连方案客户需求:FS酒店国内6个region组网,所有员工访问新加坡aws,底层线路加速。 Telstra 在北京pop已经和北京AWS做好对接,在新加坡Equinix数据中心已和IBM Softlayer做好对接,Telstra为FS在北京AWS和新加坡Softlayer的VPC分别创建50M的托管连接(云端口最低50M),在...

FZU 1406 凯撒密码_无幻的博客-程序员宅基地

  凯撒密码Time Limit:1sMemory limit:32MAccepted Submit:657Total Submit:1690在人类历史上,对信息保护的需求与对信息本身的需求一样久远。第一个用于加密和解密文本的编码方式是凯撒密码。凯撒密码约定的规则是,源文本中每个英文字母都被英文字母表中该字母后第三个位

关于JMicro微服务开发及使用说明_gg7894125的博客-程序员宅基地

JMicro是一个用Java语言实现的开源微服务全家桶,源码地址:https://github.com/mynewworldyyl/jmicro,Demo地址:http://124.70.152.7 。摘要假设你已经按照前面分享的文章下载JMicro源码并编译成功。现在开始开发一个JMicro微服务,并通过Java客户端及JS调用此微服务,Java支持同步和异步调用,JS目前只支持异步调用。服务提供者和消费者模式上图是最基本的服务提供者和消费者关系图,服务方实现服务接口,消费方通过接口使用服务

16进制颜色透明度_h5透明度颜色16禁止_HungBun的博客-程序员宅基地

转载请标明出处,谢谢!第一部分:十六进制符号的含义如:#FFFFFFFF 十六进制由#加八位的十六进制数(1~9和A~B)组成,前两位(FF)代表透明度,后六位(FFFFFF)代表颜色代码。(本文主要讲解透明度)。第二部分:如何调整透明度还是以#FFFFFFFF为例,前面说过了前两位代表透明度,所以我们只要设置前两位就可以达到调整透明度的目的,下面按照百

Excel 快捷键 (Mac版本)_mac电脑深度隐藏excel表格快捷键_Gavin姓陈的博客-程序员宅基地

显示和隐藏筛选:ctrl+shift+L显示单独某列的筛选项:alt+↓选中某行起下边所有行:cmd+shift+↓

随便推点

Google这款人工智能开发套件,人人都可以玩转AI!_谷歌智能交互框架_钛灵科技的博客-程序员宅基地

人工智能 AI 已经无处不在,并且已经渗透到人类生活的方方面面。无论是科技巨头,还是普通大众,都在紧密关注和谈论着这一大技术话题。2017 年上半年,Google 宣布了一个新的开源计划--AIY Projects(AIY项目),其目标是让每个 Maker(创客)都能 DIY 自己的 AI 人工智能产品,让更多人能学习、探索并体验人工智能。同年 5 月份,Google 针对...

Spark1.2及CDH5.2~CDH5.3安装和使用(A)_the short-circuit local reads feature cannot be us_春宇大数据的博客-程序员宅基地

本文主要记录 Spark 的安装过程配置过程并测试 Spark 的一些基本使用方法。安装环境如下:操作系统:CentOs 6.5Hadoop 版本:CDH-5.3.0Spark 版本:1.2关于 yum 源的配置以及 Hadoop 集群的安装,请参考 使用yum安装CDH Hadoop集群。1. 安装选择一个节点 cdh1 来安装 Spark ,首先查看 S

电子设计教程30:温度滞回控制系统_滞回比较器的阈值公式_yummy说电子的博客-程序员宅基地

  本节我们用滞回比较器的原理,设置一个温度滞回控制系统,让散热风扇在温度高于40℃时启动,在温度低于25℃时停止。  我用的温度传感器应用的是TPM235,在温度大于0℃的时候,输出电压Vt与温度t的关系如下:Vt = 0.5 + 0.01 * t  风扇在温度高于40℃时启动,此时电压为0.9V;在温度低于25℃时停止,此时电压为0.75V。令v_h= 0.9V,v_l= 0.75V。...

xhtmlrenderer + iText-HTML转PDF_湖南第一帅的博客-程序员宅基地

文章目录xhtmlrenderer + iText - HTML转PDF主要步骤详细过程xhtmlrenderer + iText - HTML转PDFxhtmlrendere+itext2.0.8 将html转成pdf,带样式、图片(也支持二维码、条形码)等主要步骤生成html(css样式直接放在style中)html转换pdf方法数据返回给前端详细过程html模板:p...

spring AOP+自定义注解,实现记录接口调用日志_spring 记录外部接口调用日志_时间睡着了的博客-程序员宅基地

spring AOP+自定义注解,实现记录接口调用日志文章目录spring AOP+自定义注解,实现记录接口调用日志前言一、自定义注解二、使用aop记录日志1.切入点方法类,记录日志存入数据库2.获取访问ip地址工具类2.参数脱敏注意总结前言提示:随意记录提示:以下是本篇文章正文内容,下面案例可供参考一、自定义注解注解在Java中,与类、接口、枚举类似,因此其声明语法基本一致,只是所使用的关键字有所不同@interface。在底层实现上,所有定义的注解都会自动继承java.lang.ann

SparkPi源码分析--包含对新安装的Spark集群的测试_Yore Yuen的博客-程序员宅基地

一、Spark集群的测试当我们安装好Spark后,需要对Spark做一些测试,看新安装的Spark集群是否可以使用,这个时候有如下几种方法验证和测试:①使用jps命令查看下进程,在主节点上org.apache.spark.deploy.master.Master进程会启动,从节点上则会启动org.apache.spark.deploy.worker.Worker进程,如果启动了histor...

推荐文章

热门文章

相关标签