当前位置: 首页 > 编程日记 > 正文

谷歌NIPS论文Transformer模型解读:只要Attention就够了

640?wx_fmt=jpeg

作者 | Sherwin Chen

译者 | Major,编辑 | 夕颜

出品 | AI科技大本营(ID:rgznai100)

导读:在 NIPS 2017 上,谷歌的 Vaswani 等人提出了 Transformer 模型。它利用自我注意(self-attention)来计算其输入和输出的表示,而不使用序列对齐 RNN。通过这种方式,它减少了将两个任意位置的信号关联到一个常数所需的操作数量,并实现了明显更好的并行化。在本文中,我们将重点讨论 Transformer 模型的主要架构和 Attention 的中心思想。

简介

循环神经网络(RNN),特别是长短记忆(LSTM)和门控循环单元(GRU),已经作为最先进的序列建模和转导方法被牢固地建立起来。这些模型通常依赖于隐藏状态来保存历史信息。它们的好处在于允许模型根据隐藏状态下提取的有用历史信息进行预测。

另一方面,由于内存大小限制了跨样例的批处理,因此这种固有的顺序性排除了并行化。而并行化在较长的序列长度下变得至关重要。此外,在这些模型中,将来自两个任意输入或输出位置的信号关联起来所需的操作数量随着位置之间距离的增加而增多,这使得学习较远位置之间的依赖性变得更加困难。

有一点应当记住,我们在这里介绍的 Transformer 在一个样本中保存序列信息,就像 RNN 一样。这表明网络的输入是这种形式:[batch size, sequence length, embedding size]。

模型架构

Transformer 遵循编码器-解码器结构,对编码器和解码器都使用堆叠的自我Attention和完全连接的层,如在下图的左半部分和右半部分所示。

640?wx_fmt=png

Transformer 模型架构 (引自论文 Attention is All You Need)

位置编码

在本文中,我们使用不同频率的正弦和余弦函数来编码位置信息:

640?wx_fmt=png

此处,pos 是位置,i 是维度。也就是说,位置编码的每个维度都对应一个正弦曲线。这些波长形成从 2π 到 10000⋅2π 的几何级数。作者之所以选择这个函数,是因为他们假设它可以让模型很容易地学习到相对位置的 Attention,因为对于任何固定的偏移 k,PE_{pos+k} 都可以表示为PE_{pos} 的线性函数。

编码器和解码器堆栈

编码器

编码器由N=6个相同的层堆栈组成。每层有两个子层。第一个是一个多头的自我Attention机制(我们很快就会讨论),第二个是一个简单的完全连接的前馈网络。两个子层的每一层都使用了Residual 连接,并且在这两个子层之间应用了层规范化。

也就是说,每个子层的输出是 x+Sublayer(LayerNorm(x)) (这与由[2]采用的子层输出,略有不同,但遵循[3]中何恺明推荐的模式,其中Sublayer(x) 是子层本身的函数。

解码器

解码器也由N=6个相同的层组成。除了编码器层中的两个子层外,解码器还插入第三个子层,该子层在编码器堆栈的输出上执行多头Attention(即,我们将编码器的输出作为键和值)。解码器中的子层遵循与编码器中相同的方式。

遮罩

编码器和解码器的自我注意层在SoftMax之前使用遮罩,以防止对序列错误位置的不必要注意。此外,与一般遮罩结合,在解码器堆栈中的自注意子层中使用额外的遮罩,以排除后续位置的Attention。这种遮罩形式如下:

640?wx_fmt=png

在实践中,解码器中的两个遮罩可以通过逐位加操作进行混合。

Attention

640?wx_fmt=png

(左)缩放点积Attention。(右)多头Attention由几个并行运行的Attention层组成。

缩放点积Attention

Attention 函数可以描述为从查询和一组键值对到输出的映射,其中查询、键、值和输出都是向量。输出是以值的加权和计算的,其中分配给每个值的权重是通过查询的兼容函数和相应的键计算的。

更严格地说,输出按下列方式计算:

640?wx_fmt=png

其中Q、K、V 分别是查询、键和值;640?wx_fmt=png是键的维度;兼容性函数(SoftMax部分)计算一行中分配给每个值的权重。按1/640?wx_fmt=png比例缩放点积640?wx_fmt=png,以避免对较大的值使用非常小的渐变,在该值中,点积的大小增大,从而将SoftMax函数推送到边缘区域。

一些启示:在数学上,Attention仅仅集中在Q和K 余弦相似的空间上,Q和K余弦相似的空间中,因为它们具有相同的量级((QK^T)_{i,j}=|Q_i||K_j|cosθ)。一个极端的思想练习是Q 和 K都是热编码的情况。

多头 Attention

640?wx_fmt=png

单注意头对注意加权位置进行平均,降低了有效分辨率。为了解决这一问题,提出了多头Attention,关注来自不同位置的不同表示子空间的信息。

其中映射是如下的参数矩阵:

640?wx_fmt=png

对于每个头部,我们首先应用一个完全连接的层来减小维度,然后将结果传递给一个 Attention函数。最后,将所有头连接起来,再次映射,得到最终值。由于所有的头部都是并行运行的,并且每个头部的维度都是预先减小的,因此总的计算成本与单头Attention的全维度计算成本相似。

在实践中,如果我们有h640?wx_fmt=png=hdᵥ=d_{model}, 可以简单地使用注意和还有四个完全连接的层来实现多个头部Attention。每个维度d_{model}×d_{model} 如下:

640?wx_fmt=png

Tensorflow代码

现在,我们提供了用于多头Attention的TensorFlow代码。为了简单起见,我们进一步假设Q、K、V均为X。

640?wx_fmt=png

代码源于:

https://github.com/deepmind/sonnet/blob/56c917e156d84db2bcc1f027ccbeae3cb1192cf/sonnet/python/modules/relational_memory.py l120。为消除不需要的依赖性进行了删减。

结语

作者希望你已经对 Transformer 有了基本的认识。要查看包含代码的完整示例,你可以进一步参考(http://nlp.seas.harvard.edu/2018/04/03/attention.html?source=post_page---------------------------#attention)

原文链接:

https://medium.com/towards-artificial-intelligence/attention-is-all-you-need-transformer-4c34aa78308f

(*本文为AI科技大本营编译文章,转载请联系微信 1092722531)

推荐阅读
  • 六大主题报告,四大技术专题,AI开发者大会首日精华内容全回顾

  • AI ProCon圆满落幕,五大技术专场精彩瞬间不容错过

  • CSDN“2019 优秀AI、IoT应用案例TOP 30+”正式发布

  • 我的一年AI算法工程师成长记

  • 开源sk-dist,超参数调优仅需3.4秒,sk-learn训练速度提升100倍

  • 如何打造高质量的机器学习数据集?

  • 从模型到应用,一文读懂因子分解机

  • 用Python爬取淘宝2000款套套

  • 7段代码带你玩转Python条件语句

640?wx_fmt=png
你点的每个“在看”,我都认真当成了喜欢

相关文章:

中国移动与苹果联姻 三星在华霸主地位或遭取代

据国外媒体12月24日报道,在各方的期待下,苹果终于宣布中国移动将于2014年1月17日开始销售支持其网络的iPhone手机。而中国移动也将于12 月25日开始正式接受预定。作为中国以及世界最大的移动运营商,中国移动与苹果的合作,将会帮助…

二维码Data Matrix编码、解码使用举例

二维码Data Matrix的介绍见: http://blog.csdn.net/fengbingchun/article/details/44279967 ,这里简单写了个生成二维码和对二维码进行识别的测试例子,如下:int test_data_matrix_encode() {std::string str "中国_abc_DEF…

PDF文件如何转成markdown格式

百度上根据pdf转makrdown为关键字进行搜索,结果大多数是反过来的转换,即markdown文本转PDF格式。 但是PDF转markdown的解决方案很少。 正好我工作上有这个需求,所以自己实现了一个解决方案。 下图是一个用PDF XChange Editor打开的PDF文件&am…

关于SAP BW提示“Carry out repairs in non-original only

为什么80%的码农都做不了架构师?>>> 这个提示是由于你在生产系统(正式系统)里面修改了一些东西,才提示"Carry out repairs in non-original system only if they are urgent"这个警告,理论上我们…

windows7 64位机上安装配置CUDA7.5(或8.0)+cudnn5.0操作步骤

按照官网文档 http://docs.nvidia.com/cuda/cuda-installation-guide-microsoft-windows/index.html#axzz4TpI4c8vf 进行安装:在windows7上安装cuda8.0/cuda7.5的系统需求:(1)、ACUDA-capable GPU(本机显卡为GeForce GT 640M);(2)、A support…

多重影分身:一套代码如何生成多个小程序?

前言 影分身术,看过火影的都知道,一个本体,多个分身。 大家肯定要问了,那小程序开发跟影分身术也能扯上关系?没错,那自然就是:一套代码,多个小程序啦。 各位先别翻白眼,且…

TensorFlow全家桶的落地开花 | 2019 Google开发者日

作者 | 唐小引写于上海世博中心出品 | GDD 合作伙伴 CSDN(ID:CSDNnews)Android 10 原生支持 5G,Flutter 1.9、Dart 2.5 正式发布这是 Google Developer Days 在中国的第四年,从 2016 年 Google Developers 中国网站正式…

css的background

背景属性——background是css中的核心属性。你应该对它有充分的了解。这篇文章详细讨论了background的所有相关属性,甚至包括background-p_w_upload,还为我们介绍了它在即将到来的CSS3中的样子,还有那些新加入的背景属性。使用CSS2中的背景属…

windows7 64位机上配置支持GPU版(CUDA7.5)的OpenCV2.4.13操作步骤

很久之前在windows7 32位上配置过GPU版的opencv,可参考http://blog.csdn.net/fengbingchun/article/details/9831837Windows7 64位CUDA7.5的配置可以参考:http://blog.csdn.net/fengbingchun/article/details/53892997这里是在CUDA7.5已正确安装后的操作…

值得注意的知识点

ImageView的属性adjustViewBounds www.jianshu.com/p/13de17744… 转载于:https://juejin.im/post/5c8b7742e51d454e02716e44

阿里深度序列匹配模型SDM:如何刻画大型推荐系统的用户行为?

作者 | 石晓文来源 | 小小挖掘机(ID:wAIsjwj)今天给大家介绍的论文是:《SDM: Sequential Deep Matching Model for Online Large-scale Recommender System》论文下载地址:https://arxiv.org/abs/1909.00385v11、背景像…

find ip from hostname or find hostname from ip

1. find ip from hostname ping <hostname> 2.fin hostname from ip nslookup <ip>

Linux下多线程编程中信号量介绍及简单使用

在Linux中有两种方法用于处理线程同步&#xff1a;信号量和互斥量。线程的信号量是一种特殊的变量&#xff0c;它可以被增加或减少&#xff0c;但对其的关键访问被保证是原子操作。如果一个程序中有多个线程试图改变一个信号量的值&#xff0c;系统将保证所有的操作都将依次进行…

Linux环境HBase安装配置及使用

Linux环境HBase安装配置及使用 1. 认识HBase (1) HBase介绍 HBase Hadoop database&#xff0c;Hadoop数据库开源数据库官网&#xff1a;hbase.apache.org/HBase源于Google的BigTableApache HBase™是Hadoop数据库&#xff0c;是一个分布式&#xff0c;可扩展的大数据存储。当…

适合小团队作战,奖金+招聘绿色通道,这一届算法大赛关注下?

大赛背景伴随着5G、物联网与大数据形成的后互联网格局的逐步形成&#xff0c;日益多样化的用户触点、庞杂的行为数据和沉重的业务体量也给我们的数据资产管理带来了不容忽视的挑战。为了建立更加精准的数据挖掘形式和更加智能的机器学习算法&#xff0c;对不断生成的用户行为事…

Linq 集合处理(Union)

关于Union的两种情况 一、简单值类型或者string类型处理方式(集合需要实现IEnumerable接口) #region int类型List<int> ints1 new List<int> { 1, 2, 3, 4, 5, 6 };List<int> ints2 new List<int> { 5, 6, 7, 8, 9, 0 };IEnumerable<int> ints…

卷积神经网络中十大拍案叫绝的操作

作者 | Justin ho来源 | 知乎CNN从2012年的AlexNet发展至今&#xff0c;科学家们发明出各种各样的CNN模型&#xff0c;一个比一个深&#xff0c;一个比一个准确&#xff0c;一个比一个轻量。下面会对近几年一些具有变革性的工作进行简单盘点&#xff0c;从这些充满革新性的工作…

windows7下解决caffe check failed registry.count(type) == 1(0 vs. 1) unknown layer type问题

在Windows7下调用vs2013生成的Caffe静态库时经常会提示Check failed: registry.count(type) 1 (0 vs. 1) Unknown layer type的错误&#xff0c;如下图&#xff1a;这里参考网上资料汇总了几种解决方法&#xff1a;1. 不使用Caffe的静态库&#xff0c;直接将Caffe的sourc…

js 变量提升 和函数提升

2019独角兽企业重金招聘Python工程师标准>>> 创建函数有两种形式&#xff0c;一种是函数声明&#xff0c;另外一种是函数字面量&#xff0c;只有函数声明才有变量提升 console.log(a) // f a() { console.log(a) } console.log(b) //undefinedfunction a() {consol…

.net_ckeditor+ckfinder的图片上传配置

CKEditor和CKFinder的最新版可以到官方网站&#xff08;http://cksource.com&#xff09;上下载获得。 把以上两个资源放到网站的根目录&#xff1a; /CKEditor 和 /CKFinder (不区分大小写) 在页面使用 CKEditor&#xff1a; <textarea cols"80" id"prcont…

VS2013在Windows7 64位上变慢的解决方法

重装了windows7系统&#xff0c;又重装了vs2013&#xff0c;发现在打开vs2013、编译工程及调试的时候&#xff0c;vs2013都会变的比较慢&#xff0c;参考网上资料&#xff0c;这里列出几种可能的解决方法&#xff1a; 1. 打开工具--> 选项 --> 源代码管理 --> 插件选…

Key-Value数据库:Redis与Memcached之间如何选择?

华为云分布式缓存Redis5.0和Memcached都是华为云DCS的核心产品。 那么在不同的使用场景之下&#xff0c;如何选择Redis5.0和Memcached呢&#xff1f; 就由小编为大家进行详细的数据对比分析吧Redis和Memcached都是非常受欢迎的开源内存数据库&#xff0c;相对关系型数据库&…

裴健等9名华人当选加拿大皇家学会院士

【导读】近日&#xff0c;加拿大皇家学会&#xff08;RSC&#xff0c;The Royal Society of Canada&#xff09;官网宣布已评选出今年的新增院士。其中&#xff0c;京东副总裁、加拿大西蒙弗雷泽大学计算科学学院教授裴健和其他 8 名华人学者均在这份名单之中&#xff0c;而裴健…

Linux中shell命令的用法和技巧

使用Linux shell是我每天的基本工作&#xff0c;但我经常会忘记一些有用的shell命令和l技巧。当然&#xff0c;命令我能记住&#xff0c;但我不敢说能记得如何用它执行某个特定任务。于是&#xff0c;我开始在一个文本文件里记录这些用法&#xff0c;并放在我的Dropbox里&#…

Caffe中Layer注册机制

Caffe内部维护一个注册表用于查找特定Layer对应的工厂函数(Layer Factory的设计用到了设计模式里的工厂模式)。Caffe的Layer注册表是一组键值对(key, value)( LayerRegistry里用map数据结构维护一个CreatorRegistry list, 保存各个Layer的creator的函数句柄)&#xff0c;key为L…

自动驾驶行业观察 | 停车不再难,L2到L4的泊车辅助系统技术剖析

作者 | 陈光来源 | 自动驾驶干货铺&#xff08;ID:IntelligentDrive&#xff09;【导读】在汽车智能化的浪潮中&#xff0c;车载传感器发展迅速&#xff0c;越来越多搭载了先进传感器的汽车进入了我们的视野。比如能够在高速公路上实现单车道巡航的凯迪拉克CT6&#xff0c;以及…

Unity Log重新定向

Unity Log重新定向 使用Unity的Log的时候有时候需要封装一下Debug.Log(message)&#xff0c;可以屏蔽Log或者把log内容写到文本中。通过把文本内容传送到服务器中&#xff0c;查找bug出现的原因。但是封装之后的日志系统如果双击跳转的时候&#xff0c;会跳转到自定义的日志系统…

Javascript 检查一组 radio 中的哪一个被勾选

2019独角兽企业重金招聘Python工程师标准>>> 以前检查单选按钮是否被选择时&#xff0c;我使用的是 if else 一个一个的检查其 checked 属性。 这样虽然可以&#xff0c;但是当一组 radio 有很多个时&#xff0c;就很麻烦了。 可以通过 getElementsByName 得到所有…

二维码Aztec简介及其解码实现(zxing-cpp)

Aztec Code是1995年&#xff0c;由Hand HeldProducts公司的Dr. Andrew Longacre设计。它是一种高容量的二维条形码格式。它可以对ASCII和扩展ASCII码进行编码。当使用最高容量和25%的纠错级别的時候&#xff0c;Aztec可以对3000个字符或者3750个数字进行编码。Aztec的矩阵大小在…

顶配12699 元、没有5G,“浴霸三摄”的iPhone你会买吗?

作者 | 屠敏出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;北京时间 9 月 11 日凌晨 1 点&#xff0c;以「Apple 特别活动」为主题的苹果秋季发布会正式于史蒂夫乔布斯剧院拉开帷幕。按照惯例&#xff0c;在发布会之前&#xff0c;业界“毫不留情”地对新品进行了…