原文链接https://jalammar.github.io/illustrated-transformer/

所需知识储备: RNN, Seq2Seq序列模型,Residual残差计算...

自从Attention is All you need 这篇文章发布后,Transformer火的一塌糊涂,热度不低于Bert。接下来让我们一起领略这个号称可以取代RNN,CNN的结构究竟是什么。

概览:

以机器翻译任务来示例,Transformer有着上述的黑盒结构,里面是多层的encoder和decoder:

其中每一个encoder单元有着完全相同的结构(但是并不互相共享权重),每个encoder单元可以分为两层:

encoder的输入首先流入Self-Attention单元,然后进入feed forward network(FFNN),之后完全相同的FFNN被应用在相同位置。

Decoder 的结构与上面的类似,但是中间又多了一个attention层,这使得解码时能够集中在输入句子的最相关部分(与seq2seq模型中使用attention的方法类似):

在上述模型中加入Tensor:

这一部分看图就行,先是词嵌入的表示,然后词嵌入输入encoder:

在这里,我们开需要注意Transformer的一个关键属性,即每个位置的单词在编码器中流向属于自己的路径。Self attention层中的这些路径之间存在依赖关系, FFNN层则不具有这些依赖。因此各种路径可以在流过FFNN层时并行执行。各个encoder之间的数据流如下图所示:

概述Self-Attention:

在阅读Attention is All You Need论文之前,我个人从未遇到过这个概念。 让我们提炼它是如何工作的:

如果我们想要翻译下面的英文句子:

The animal didn't cross the street because it was too tired

‘it’在句子中指的是什么?是''street"还是‘animal’?对人而言这是简单的问题,但对于算法而言却不是。当算法模型在处理'it'这一个词的时候,Self-attention的作用就是将他与‘animal’相关联。当模型处理每个单词(输入序列中的每个位置)时,Self-attention允许它查看输入序列中的其他位置从而优化当前词汇的编码。

如果你很熟悉RNN,想象一下如何使得RNN中的hidden state能够融合之前处理过的词汇与当前正在处理的词汇的语义信息?在Transformer中,Self-attention就是起到了这样的作用。它能够将其他相关单词的“语义理解”融入我们当前正在处理的单词中。比如上面的示例中,encoder堆栈的最上层的encoder #5 在编码'it'时,部分注意力集中在The animal上,并在it的语义表示上与这些词进行了融合。

请务必查看Tensor2Tensor Notebook https://colab.research.google.com/github/tensorflow/tensor2tensor/blob/master/tensor2tensor/notebooks/hello_t2t.ipynb,您可以在其中加载Transformer模型,并使用此交互式可视化对其进行检查。

详解Self-attention

计算Self-attention的第一步--从每个编码器的输入向量创建三个向量(在这种情况下就是词嵌入)。 因此,对于每个单词,我们创建一个Query向量,一个Key向量和一个Value向量(简称Q,K,V)。 这些向量是通过将词嵌入乘以我们在训练过程中训练的三个矩阵而创建的。(这些向量帮助attention理解与计算,是语义的抽象)

请注意,这些新向量的尺寸小于嵌入向量。 它们的维数为64,而嵌入和encoder输入/输出向量的维数为512。当然这里并不是必须这样设置,而是一种可以使multihead attention计算大致固定结构的选择,。

第二步--计算一个数值score。假设我们正在计算这个例子中第一个单词“Thinking”的self attention。 我们需要根据这个词对输入句子的每个单词进行评分。 当我们在某个位置编码单词时,分数决定了对输入句子的其他部分放置多少焦点。

该数值score的计算方式是q与k向量的点积,k向量随着关注词汇的变化而变化。如上例图示,如果我们在计算#1单词(thinking)的attention时,我们应该先计算q1*k1,再计算q1*k2

第三步第四步--将score除以8(论文中使用的k向量维数64的平方根,这使得模型具有更稳定的梯度。这里可能存在其他合理的值,但默认值是这么计算的),然后将结果传入softmax操作。 Softmax将分数标准化,因此从而使得它们都是正数并且加起来为1。(Softamx score决定了在当前位置某个词的语义被表达出来多少,明显的是当前位置的词具有较大的score,但是关注其他位置的与当前位置有关的词也非常有用 ps:上下文语义)

第五步—将v向量与对应的softmax值相乘(为最后的相加做准备),该做法的缘由是保持我们关注的单词不变的情况下,过滤掉不相关词汇(比如将他们乘以非常小的数值)

第六步—将上一步v*softmax后的矩阵加总求和,即为此位置(本例为第一个单词)self-attetion层的输出,总流程为下图所示:

上述过程阐述了self attention的总体计算流程,但在实际使用过程中,为了加速计算等需求,常常以词级别矩阵来计算Self attention.

Self attention 的矩阵计算方式:

将我们上一节的输入变为矩阵X(由word embedding拼接而成),乘以对应的权重矩阵WQ,WK,WV,得到Q,K,V矩阵:

其他流程与上一节相同,因为我们正在处理矩阵,所以我们可以在一个公式中浓缩步骤2到6来计算self attention层的输出:

‘多头巨兽’—attention with multi heads

Attention is all you need论文中提出了multi-head attention来精炼改进self attention,这样做带来的改进是:

  1. 扩展了模型关注不同位置的能力。在上见面的示例中,self attention最后输出的z1仅包含了其他位置的一点点语义,其值还是极有可能由本位制单词支配。
  2. 它为注意层提供了多个“表示子空间”。 正如我们接下来将看到的,我们不仅有一个,而且还有多组Query / Key / Value权重矩阵(Transformer使用8个注意头,因此我们最终为每个编码器/解码器设置了8组矩阵)。 每组矩阵都是随机初始化的。 然后,在训练之后,每组矩阵用于将输入矩阵(或来自较低编码器/解码器的矢量)投影到不同的表示子空间中。

使用上一节的self attention计算方式计算,会出现8次不同的矩阵乘法(8组不同的权重矩阵),得到8个不同的z值(矩阵),称为attention head。

前馈网络FFNN并不能接收8个矩阵作为输入,所以必须将这8个矩阵进行整合,得到一个矩阵。做法是将8个z矩阵先拼接再乘以一个附加权重矩阵WO.这样得到的矩阵Z就可以作为FFNN的输入了。

Multi-head attention总计算流程如下:

使用位置编码表示序列的顺序

到目前为止,上述模型还缺少一种记录输入序列中词顺序的方法。

为了解决这个问题,transformer为每个输入嵌入添加了一个向量(positional encoding)。 这些向量遵循模型学习的特定模式,这有助于确定每个单词的位置,或者序列中不同单词之间的距离。这种方法的意义是将这些值添加在embedding中,当它们被映射到Q / K / V向量中且在点积计算期间,能够提供embedding vector之间的距离表示。图示该过程如下:

残差的使用

encoder架构中还有一个细节是每个编码器中的每个子层(Self-attetion,ffnn)在其周围都具有残差(Residual)连接,然后是层规范化步骤(layer norm)。同样,在decoder 中也是这样的结构,用2个encoder 、2个decoder构成的seq2seq网络结构为:

Decoder

PS:该部分动图在原链接中看更直观。

用两张图表示decoder的解码过程:

第一步--通过encoder得到K,V矩阵,依次输入各个decoder解码出第一个step的结果。

第二步到最后一步—通过上一步解码出的结果作为decoder输入,经过decoder解码器解码出当前step的结果:

在decoder中,self attention层与其在encoder中不尽相同,区别在:

在解码器中,仅允许self attention关注输出序列中的较早位置。 这是通过在self attention计算中的softmax步骤之前屏蔽未来位置(将它们设置为-inf)来完成的。

Encoder-Decoder Attention层与multi head attention类似,不同的是它从它下面的层建立Q矩阵,并从编码器堆栈的输出中获取K,V矩阵。

Linear + Softmax

Deep Learning必备基础知识,不赘述。

训练过程的重点

与seq2seq一致,不赘述

图文并茂解释Transformer--The Illustrated Transformer翻译精简相关推荐

  1. 图解transformer | The Illustrated Transformer

    文章目录 写在最前边 正文 从高层面看 图解张量 现在我们来看一下编码器 自注意力 细说自注意力机制 用矩阵计算self-attention 多头注意力 使用位置编码表示序列的位置 残差 解码器 最后 ...

  2. The Illustrated Transformer

    摘自 Jay Alammar https://jalammar.github.io/illustrated-transformer/ The Illustrated Transformer 查看全文 ...

  3. The Illustrated Transformer:中英文(看原文,很多翻译是错误的)

    在上一篇文章中(previous post),我们研究了注意力机制 - 一种在现代深度学习模型中无处不在的(ubiquitous)方法. 注意力是一个有助于提高神经机器翻译(neural machin ...

  4. The Illustrated Transformer 翻译

    In the previous post, we looked at Attention – a ubiquitous method in modern deep learning models. A ...

  5. Paper:《The Illustrated Transformer》翻译与解读

    Paper:<The Illustrated Transformer>翻译与解读 目录 Paper:<The Illustrated Transformer>翻译与解读 The ...

  6. The Illustrated Transformer (Transformer可视化解读自译笔记)

    图解Transformer Reference: The Illustrated Transformer 本文自译用于加深理解与印象. 关于注意力机制,可以参考先前的Seq2Seq Model wit ...

  7. 博客阅读:图解Transformer(The Illustrated Transformer)

    博客阅读:图解Transformer(The Illustrated Transformer) 原文链接:https://jalammar.github.io/illustrated-transfor ...

  8. The illustrated Transformer 笔记

    The illustrated Transformer Transformer是一种使用Attention机制类提升模型训练的速度的模型.该模型的最大优势在于其并行性良好.Transformer模型在 ...

  9. Swin Transformer: Hierarchical Vision Transformer using Shifted Windows 论文翻译 + 网络详解

    目录 1 3 4 5 是论文的翻译,如果看过论文也可以直接看关于网络的结构详解. Abstract 1. Introduction 3. Method 3.1 Overall Architicture ...

  10. Paper:《Spatial Transformer Networks》的翻译与解读

    Paper:<Spatial Transformer Networks>的翻译与解读 目录 <Spatial Transformer Networks>的翻译与解读 Abstr ...

最新文章

  1. 专访阿里达摩院聂再清:不能让每个人无差别享受AI,是程序员的耻辱
  2. 并发编程(四)__ConcurrentHashMap
  3. 【Android 电量优化】JobScheduler 相关源码分析 ( JobSchedulerService 源码分析 | Android 源码在线网址推荐 )
  4. Atitti 大话存储读后感 attilax总结
  5. JDK1.7和JDK1.8中HashMap是线程不安全的,并发容器ConcurrentHashMap模型
  6. pytorch中的squeeze和unsqueeze
  7. url去除掉一个参数php,php怎样去掉url中的参数_后端开发
  8. C++/QT:获取当前路径并通过相对路径读取文件
  9. 引用类型和原始类型的对比(java)
  10. android开发中eclipse里xml开发的自动提示和使用帮助快捷键提示
  11. 什么是 Caché?
  12. python乱码怎么办_Python爬虫结果是乱码怎么办?带你了解乱码的原因及其解决办法...
  13. RDL 报表 - 横向合并单元格后单元格被撑高
  14. 网元的概念 --- 分布式1
  15. 欧几里德结构数据(Euclidean Structure Data) 以及非欧几里德结构数据(Non-Euclidean Structure Data)
  16. 现代OpenGL入门教程
  17. 201771010101 白玛次仁 《2018面向对象程序设计(Java)》第八周学习总结
  18. 1952-2018年中国各省份人均GDP
  19. 新华三与中国移动完成IPv6随流检测互通测试
  20. js和jquery验证密码必须为字母加数字

热门文章

  1. c语言单链表(创建,插入,遍历,打印)
  2. LintCode 1053. 至少是其他数字两倍的最大数 JavaScript算法
  3. 如何正确地放下面子,去挣到大钱?
  4. python矩阵的维度减少(squeeze)
  5. java计算机毕业设计我饿了外卖平台源码+系统+数据库+lw文档+mybatis+运行部署
  6. 点击qq或者微信对话框里面的文件跳转到自己的app时的文件路径问题
  7. Markdown教程--Markdown列表
  8. 用友php漏洞,用友漏洞存在目录整理 | CN-SEC 中文网
  9. 微软暗讽谷歌封杀Windows
  10. c语言窗口程序暂停,C语言中的时间和程序暂停