论文解读:Attention is All you need

论文解读:Attention is All you need

论文解读:Attention is All you need

192 人赞同了该文章

Attention机制最早在视觉领域提出,2014年Google Mind发表了《Recurrent Models of Visual Attention》,使Attention机制流行起来,这篇论文采用了RNN模型,并加入了Attention机制来进行图像的分类。

205年,Bahdanau等人在论文《Neural Machine Translation by Jointly Learning to Align and Translate》中,将attention机制首次应用在nlp领域,其采用Seq2Seq+Attention模型来进行机器翻译,并且得到了效果的提升,Seq2Seq With Attention中进行了介绍。

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


1. Attention机制

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

第一步:计算比较Q和K的相似度,用f来表示

f(Q, K_i), i=1,2,...,m\tag{1}

第二步:将得到的相似度进行Softmax操作,进行归一化

\alpha_i = \frac{e^{f(Q,K_i)}}{\sum_{j=1}^{m}{f(Q,K_j)}}, i=1,2,...,m\tag{2}

第三步:针对计算出来的权重 \alpha_i ,对V中所有的values进行加权求和计算,得到Attention向量

\sum_{i=1}^{m}{\alpha_iV_i}\tag{3}

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

  • 点乘 dot product

f(Q,K_i)=Q^TK_i\tag{4}

  • 权重 General

f(Q,K_i)=Q^TWK_i\tag{5}

  • 拼接权重 Concat

f(Q,K_i)=W[Q;K_i]\tag{6}

  • 感知器 Perceptron

f(Q,K_i)=V^T \tanh(WQ+UK_i)\tag{7}




2. Transformer Architecture

绝大部分的序列处理模型都采用encoder-decoder结构,其中encoder将输入序列 (x_1,x_2,...,x_n) 映射到连续表示 \vec{z}=(z_1,z_2,...,z_n) ,然后decoder生成一个输出序列 (y_1,y_2,...,y_m) ,每个时刻输出一个结果。Transformer模型延续了这个模型,整体架构如下图1所示。

图1 基于Transformer模型的Encoder-Decoder模型示意图

2.1 Encoder

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

  1. 第一个sub-layer是multi-head self-attention mechanism,用来计算输入的self-attention
  2. 第二个sub-layer是简单的全连接网络。

在每个sub-layer我们都模拟了残差网络,每个sub-layer的输出都是

LayerNorm(x+Sublayer(x))\tag{8}

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

2.2 Decoder

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

  1. 第一个是Masked multi-head self-attention,也是计算输入的self-attention,但是因为是生成过程,因此在时刻 i 的时候,大于 i 的时刻都没有结果,只有小于 i 的时刻有结果,因此需要做Mask
  2. 第二个sub-layer是全连接网络,与Encoder相同
  3. 第三个sub-layer是对encoder的输入进行attention计算。

同时Decoder中的self-attention层需要进行修改,因为只能获取到当前时刻之前的输入,因此只对时刻 t 之前的时刻输入进行attention计算,这也称为Mask操作。

2.3 Attention机制

在Transformer中使用的Attention是Scaled Dot-Product Attention, 是归一化的点乘Attention,假设输入的query q 、key维度为 d_k ,value维度为 d_v , 那么就计算query和每个key的点乘操作,并除以 \sqrt{d_k} ,然后应用Softmax函数计算权重。

Attention(Q,K_i,V_i)=softmax(\frac{Q^TK_i}{\sqrt{d_k}})V_i\tag{9}

在实践中,将query和keys、values分别处理为矩阵 Q,K,V , 那么计算输出矩阵为:

Attention(Q,K,V)=softmax(\frac{Q^TK}{\sqrt{d_k}})V\tag{10}

其中 Q\in R^{m\times d_k} , K\in R^{m\times d_k} , V\in R^{m\times d_v} ,输出矩阵维度为 R^{m\times d_v} ,如下所示

 Q=  \begin{array}{cc} \underbrace{ \left( \begin{array}{c} q\\ q\\ q\\ \vdots\\ q \end{array}\right) }_{d_k} \left. \begin{array}{c} \!\!\!\!\!\!\!\!\\[16mm] \end{array} \right\}{m} \end{array} \tag{11}

 K=  \begin{array}{cc} \underbrace{ \left( \begin{array}{c} k_1\\ k_2\\ k_3\\ \vdots\\ k_m \end{array}\right) }_{d_k} \left. \begin{array}{c} \!\!\!\!\!\!\!\!\\[16mm] \end{array} \right\}{m} \end{array} \tag{12}

 V=  \begin{array}{cc} \underbrace{ \left( \begin{array}{c} v_1\\ v_2\\ v_3\\ \vdots\\ v_m \end{array}\right) }_{d_v} \left. \begin{array}{c} \!\!\!\!\!\!\!\!\\[16mm] \end{array} \right\}{m} \end{array} \tag{13}

那么Scaled Dot-Product Attention的示意图如下所示,Mask是可选的(opt.),如果是能够获取到所有时刻的输入(K, V), 那么就不使用Mask;如果是不能获取到,那么就需要使用Mask。使用了Mask的Transformer模型也被称为Transformer Decoder,不使用Mask的Transformer模型也被称为Transformer Encoder。

图2 Scaled Dot-Product Attention示意图

如果只对Q、K、V做一次这样的权重操作是不够的,这里提出了Multi-Head Attention,操作包括:

  1. 首先对Q、K、V做一次线性映射,将输入维度均为 d_{model}Q,K,V 矩阵映射到Q\in R^{m\times d_k} , K\in R^{m\times d_k} , V\in R^{m\times d_v}
  2. 然后在采用Scaled Dot-Product Attention计算出结果
  3. 多次进行上述两步操作,然后将得到的结果进行合并
  4. 将合并的结果进行线性变换

总结来说公示如下所示

Attention(Q,K,V)=Concat(head_1,head_2,\dots,head_h)W^O\\ \where head_i = Attention(QW_i^Q,KW_i^K,VW_i^V)\tag{14}

其中第1步的线性变换参数为 W_i^Q\in R^{d_{model}\times d_k} , W_i^K\in R^{d_{model}\times d_k} , W_i^V\in R^{d_{model}\times d_v} , 第4步的线性变化参数为 W^O\in R^{hd_v\times d_{model}} . 而第三步计算的次数是 h

在论文中取 d_{model}=512, 表示每个时刻的输入维度和输出维度, h=8 表示8次Attention操作,d_k=d_v=\frac{d_{model}}{h}=64 表示经过线性变换之后、进行Attention操作之前的维度。那么进行一次Attention之后输出的矩阵维度是 R^{m\times d_v} = R^{m\times 64} , 然后进行h = 8次操作合并之后输出的结果是 R^{m\times (h\times d_v)} = R^{m\times 512} ,因此输入和输出的矩阵维度相同。

这样输出的矩阵 R^{m\times 512} ,每行的向量都是对 V 向量中每一行 v_i 的加权,示意图如下所示

图3 Multi-Head Attention机制示意图


在图1的Encoder-Decoder架构中,有三处Multi-head Attention模块,分别是:

  1. Encoder模块的Self-Attention,在Encoder中,每层的Self-Attention的输入 Q=K=V , 都是上一层的输出。Encoder中的每个position都能够获取到前一层的所有位置的输出。
  2. Decoder模块的Mask Self-Attention,在Decoder中,每个position只能获取到之前position的信息,因此需要做mask,将其设置为 -\infty
  3. Encoder-Decoder之间的Attention,其中 Q 来自于之前的Decoder层输出, K,V 来自于encoder的输出,这样decoder的每个位置都能够获取到输入序列的所有位置信息。

2.4 Position-wise Feed-forward Networks

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

FFN(x) = \max(0, xW_1 + b_1)W_2+b_2\tag{15}

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

2.5 Position Embedding

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

这里每个token的position embedding 向量维度也是 d_{model}=512, 然后将原本的input embedding和position embedding加起来组成最终的embedding作为encoder/decoder的输入。其中position embedding计算公式如下

PE_{(pos,2i)}=\sin(pos/10000^{2i/d_{model}})\\ PE_{(pos,2i+1)}=\cos(pos/10000^{2i/d_{model}})\tag{16}

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

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

\sin(α+β)=\sinα\cosβ+\cosα\sinβ\\ \cos(α+β)=\cosα\cosβ−\sinα\sinβ\tag{17}

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

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

也可以采用训练的position embedding,但是试验结果表明相差不大,因此论文选择了sin position embedding,因为

  1. 这样可以直接计算embedding而不需要训练,减少了训练参数
  2. 这样允许模型将position embedding扩展到超过了training set中最长position的position,例如测试集中出现了更大的position,sin position embedding依然可以给出结果,但不存在训练到的embedding。

3. Why Self-Attention

这里将Self-Attention layers和recurrent/convolutional layers来进行比较,来说明Self-Attention的好处。假设将一个输入序列 (x_1,x_2,...,x_n) 分别用

  1. Self-Attention Layer
  2. Recurrent Layer
  3. Convolutional Layer

来映射到一个相同长度的序列 (z_1,z_2,...,z_n) ,其中 x_i,z_i\in R^d .

我们分析下面三个指标:

  1. 每一层的计算复杂度
  2. 能够被并行的计算,用需要的最少的顺序操作的数量来衡量
  3. 网络中long-range dependencies的path length,在处理序列信息的任务中很重要的在于学习long-range dependencies。影响学习长距离依赖的关键点在于前向/后向信息需要传播的步长,输入和输出序列中路径越短,那么就越容易学习long-range dependencies。因此我们比较三种网络中任何输入和输出之间的最长path length

结果如下所示

3.1 并行计算

Self-Attention layer用一个常量级别的顺序操作,将所有的positions连接起来

Recurrent Layer需要 O(n) 个顺序操作

3.2 计算复杂度分析

如果序列长度 n< 表示维度 d ,Self-Attention Layer比recurrent layers快,这对绝大部分现有模型和任务都是成立的。

为了提高在序列长度很长的任务上的性能,我们对Self-Attention进行限制,只考虑输入序列中窗口为 r 的位置上的信息,这称为Self-Attention(restricted), 这回增加maximum path length到 O(n/r) .

3.3 length path

如果卷积层kernel width k<n ,并不会将所有位置的输入和输出都连接起来。这样需要 O(n/k) 个卷积层或者 O(log_k(n)) 个dilated convolution,增加了输入输出之间的最大path length。

卷积层比循环层计算复杂度更高,是k倍。但是Separable Convolutions将见效复杂度。

同时self-attention的模型可解释性更好(interpretable).

Reference

[1]github.com/Kyubyong/tra

[2]Vaswani, Ashish, et al. "Attention is all you need."Advances in Neural Information Processing Systems. 2017.

编辑于 2018-10-18
「真诚赞赏,手留余香」
赞赏
还没有人赞赏,快来当第一个赞赏的人吧!
机器学习
深度学习(Deep Learning)
神经网络
赞同 192​18 条评论
分享
收藏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/480827.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文浅尝 | 基于神经网络的知识推理

本文转载自公众号&#xff1a;PaperWeekly。论文笔记来自 PaperWeekly 社区用户 britin。本文对基于 RNN 的从大规模知识库中进行推理进行了精度和可操作性的改善&#xff0c;提出的模型使用单个 RNN 就可以在多种 relation types 之间进行推理。如果你对本文工作感兴趣&#x…

手把手教你成为年薪60万的架构师

“ 这篇文章是帮助你成为架构师系列文章其中一篇&#xff0c;偏向0-5年工作的IT程序员员、架构师同学。 如果你能掌握这个系列提到的内容的70%左右&#xff0c;去阿里拿个P7问题不大&#xff0c;阿里的P7基本能拿到60W左右的年薪。 提醒一点&#xff0c;不要小看和不重视基础&a…

图解强化学习

小夕寄语 最近五年&#xff0c;是强化学习&#xff08;Reinforcement Learning, RL&#xff09;爆发的时期。RL是机器学习大家族中的一大类, 使用强化学习能够让机器学着如何在环境中拿到高分, 表现出优秀的成绩. 而这些成绩背后却是他所付出的辛苦劳动, 不断的试错, 不断地尝试…

领域应用 | 知识图谱数据构建的“硬骨头”,阿里工程师如何拿下?

本文转载自公众号&#xff1a;阿里技术。 阿里妹导读&#xff1a;搜索“西红柿”&#xff0c;你不但能知道它的营养功效、热量&#xff0c;还能顺带学会煲个牛腩、炒个鸡蛋&#xff01;搜索引擎何时变成“暖男”了&#xff1f;原来背后…

阿里P8架构师谈:开源搜索引擎Lucene、Solr、Sphinx等优劣势比较

开源搜索引擎分类 1.Lucene系搜索引擎&#xff0c;java开发,包括&#xff1a; Lucene Solr Elasticsearch Katta、Compass等都是基于Lucene封装。 你可以想象Lucene系有多强大。 2.Sphinx搜素引擎&#xff0c;c开发,简单高性能。 以下重点介绍最常用的开源搜素引擎&#…

知识图谱(KG)中的同义词挖掘

前言 在语义搜索推荐、智能问答等场景中&#xff0c;随着通过各类方法挖掘得到知识数据越来越多&#xff0c;我们需要考虑一个新问题——新老知识合并加以整合&#xff1f;比如 “拉肚子” 与 “腹泻” 实则同一意义&#xff0c;但是因为在字面上差距较大&#xff0c;在各抽取任…

注册第一次练习

注册 使用微信注册练习使用Markdown编辑器 Markdown编辑器功能与语法支持 全新的界面设计 &#xff0c;将会带来全新的写作体验&#xff1b;在创作中心设置你喜爱的代码高亮样式&#xff0c;Markdown 将代码片显示选择的高亮样式 进行展示&#xff1b;增加了 图片拖拽 功能&…

SQL 菜鸟教程

第一节&#xff1a;SQL 语法 数据库表 一个数据库通常包含一个或多个表。每个表有一个名字标识&#xff08;例如:"Websites"&#xff09;,表包含带有数据的记录&#xff08;行&#xff09;。 在本教程中&#xff0c;我们在 MySQL 的 RUNOOB 数据库中创建了 Websit…

领域应用 | 深度学习在知识图谱构建中的应用

本文转载自公众号&#xff1a;阿里技术。深度学习模型介绍DeepDive系统在数据处理阶段很大程度上依赖于NLP工具&#xff0c;如果NLP的过程中存在错误&#xff0c;这些错误将会在后续的标注和学习步骤中被不断传播放大&#xff0c;影响最终的关系抽取效果。为了避免这种传播和影…

阿里P8架构师谈:Quartz调度框架详解、运用场景、与集群部署实践

以下将分别从Quartz架构简介、集群部署实践、Quartz监控、集群原理分析详解Quartz任务调度框架。 Quartz简介 Quartz是Java领域最著名的开源任务调度工具&#xff0c;是一个任务调度框架&#xff0c;通过触发器设置作业的定时运行规则&#xff0c;来执行定时任务。其中quartz集…

Bert在CV领域的应用

一只小狐狸带你解锁NLP/ML/DL秘籍老板老板&#xff0c;听说BERT是个瞎子此话怎讲&#xff1f;它能理解语言&#xff0c;但是理解不了小夕的自拍&#xff01;video-BERT了解一下喵喵喵&#xff1f;AI的三大核心板块&#xff08;CV/Speech/NLP&#xff09;近几年都相继取得了非常…

CRISP-DM:数据挖掘标准流程

CRISP-DM&#xff1a;数据挖掘标准流程 框架 相关信息 https://blog.csdn.net/qq_36387683/article/details/82932680 https://blog.csdn.net/hadoopdevelop/article/details/79282832

训练大型神经网络方法总结

一只小狐狸带你解锁 炼丹术&NLP 秘籍前阵子微软开源了DeepSpeed训练框架&#xff0c;从测试效果来看有10倍的速度提升&#xff0c;而且对内存进行了各种优化&#xff0c;最大可以训练100B(illion)参数的模型。同时发布了这个框架训练出的17B模型 Turing-NLG&#xff0c;处于…

从Java程序员进阶架构师,必看的书单推荐!

算法与数据结构&#xff1a; 数据结构&#xff08;严蔚敏&#xff09; java数据结构和算法&#xff08;美&#xff1a;拉佛&#xff09; 算法导论 大话数据结构 剑指Offer 程序员面试金典 编程珠玑 编程之美 程序员笔试面试最优解 数据结构与算法经典问题解析&#xf…

论文浅尝 | 基于Freebase的问答研究

本文转载自公众号&#xff1a;PaperWeekly。 本期的论文笔记来自 PaperWeekly 社区用户 britin。本文给出了一种 end-to-end 的系统来自动将 NL 问题转换成 SPARQL 查询语言。作者综合了实体识别以及距离监督和 learning-to-rank 技术&#xff0c;使得 QA 系统的精度提高了不少…

机器学习中的特征建模(特征工程)和算法选型建模 - 以暴力破解识别为例

catalogue 1. 特征工程是什么&#xff1f;有什么作用&#xff1f; 2. 特征获取方案 - 如何获取这些特征&#xff1f; 3. 特征观察 - 运用各种统计工具、图标等工具帮助我们从直观和精确层面认识特征中的概率分布 4. 特征处理 - 特征清洗 5. 特征护理 - 特征预处理 6. 特征处理 …

NLP数据增强方法总结:EDA、BT、MixMatch、UDA

本文转载自公众号“夕小瑶的卖萌屋”&#xff0c;专业带逛互联网算法圈的神操作 -----》我是传送门 关注后&#xff0c;回复以下口令&#xff1a; 回复【789】 &#xff1a;领取深度学习全栈手册&#xff08;含NLP、CV海量综述、必刷论文解读&#xff09; 回复【入群】&#xf…

史上最全java架构师技能图谱(上)

java架构师最全技能图谱上篇&#xff0c;包含&#xff1a;数结构算法、java进阶、web开发、框架与工具四大技能图谱。 下篇将包含大数据以及性能、设计模式、UML、中间件、分布式集群、负载均衡、通讯协议、架构设计等技术图谱等章节 本文作者&#xff0c;陈睿 优知学院创始人…