红字为重点或个人理解,大部分图文为原博,图文侵删

原博https://blog.csdn.net/qqywm/article/details/100091331

新看到的一个self attention的Nice的动图:

编码解码器总览

每个编码器结构相同,但是不共享权重。

编码器输入首先经过一个自注意力层(self-attention layer),自注意力层可以帮助编码器在编码具体单词时查看句子中的其他单词。我们会在后面详细说明自注意力层。

自注意力层的输出会进入到一个前馈神经网络。完全相同的前馈神经网络独立作用于每个位置。

解码器也有同样的两个层,但是在自注意层和前馈网络层之间有一个注意力层注意力层可以帮助解码器注意输入句子的其他部分(和seq2seq中注意力机制类似)

张量(Tensors)图像化

目前为止我们已经看到了模型的主要组成部分,现在让我们看看各个向量(张量)是怎么经过训练模型的这些部分,由输入变为输出的。

和一般的NLP应用一样,我们将通过词嵌入技术(embedding algrithm)将单词变为向量。

每个词都被嵌入到512大小的向量中,这里用简单的盒子代替表示一下。

嵌入(embedding)只会在编码器最底层使用。概括的说就是所有编码器都接收一个由很多512大小的向量组成的列表,在最底层的编码器接收的是词嵌入层的输出(就是词转为向量,接收向量),但是在其他层的编码器直接接收前一层的输出。这个列表长度(大小)是一个可以设置的超参数,一般是我们训练集中最长句子的长度

当我们句子中的词经过嵌入层变成向量后,它们都会经过编码器的两个层。

这里我们可以看到Transformer的一个关键性质——每个位置的词经过编码器时都有自己的路径。路径在自注意力层中相互依赖,但是在前馈层中没有依赖关系,因此各个路径通过前馈层时可以并行执行。

编码模块

像我们之前提到的,编码器接收一个输入的向量列表。它将这个列表经过自注意力层(self-attention layer)处理,然后输入到一个前馈神经网络层,最后输出给下一个编码器

self-attention”就是Transformer用来将其他相关单词的“理解”融入当前处理单词的方法

当我们对"it"进行编码的时候,自注意力机制将“it”与其他词的相关性传入“it”的编码中,并会给“The animal”更大的权重。

用梯子看看这个:https://colab.research.google.com/github/tensorflow/tensor2tensor/blob/master/tensor2tensor/notebooks/hello_t2t.ipynb

自注意力详解

首先让我们用向量来简单的看看自注意力是怎么计算的,然后再让我们看看我们实际用的矩阵是怎么计算的。

第一步,自注意力机制会将编码器输入向量(这个例子中,输入向量是每个词经过embedding后的向量)变为三个向量。所以对于每个词,我们会创建一个Query向量,一个Key向量,一个Value向量。这三个向量是由词嵌入的向量乘以我们训练得出的三个矩阵得到的。

注意,这些新向量维度小于词嵌入的向量。当嵌入层和编码器输入和输出的向量维度是512时,这些向量的维度是64。但是他们并非一定要比原向量更小,这是一种架构选择,它可以使多头注意力(multiheaded attention)(大多数的多头注意力)计算保持不变。

X1乘以WQ得到q1,X2乘以WQ得到q2,(WQ是我们训练出来得到的)以此类推,最后得到所有的Query,Key,Value.。

注意这里WQ训练好后是固定的,每个不同的词都乘这个WQ,得到每个词对应的Q

那究竟什么是“query”, “key”, and “value” 向量呢?

他们就是抽象出来方便理解和计算注意力的。看下文你就知道他们是什么意思了。

第二步,计算注意力的第二步是打分。假设我们计算例子中的第一个单词“Think”。我们需要根据这个单词给输入句子中的每一个词打分。当我们编码当前位置的单词的时候,分数决定了我们给其他位置的单词多少关注(权重)。

分数是通过点乘(dot) 当前位置单词的query 向量 和 需要打分位置单词的key 向量 得到的。所以如果我们在位置#1使用注意力给其他部分打分,第一个分数是(qi dot k1),第二个分数是(q1 dot k2)。

第三步和第四步,第三步和第四步是将维度除以8(key 向量维度的平方根,论文里key维度是64。目的是得到更稳定的梯度。当然可以是其他值,不过这个是默认的),然后将结果通过softmax处理。softmax标准化(softmax normalizes)可以将值映射(压缩、标准化)到0-1之间。

第五步,第五步是将每个 value 向量乘以 softmax处理后的得分(为相加做准备)。这一步的目的是保留重要的词(想要关注的词)的完整性,去除不相关的词。(如给不相干的词乘以一个极小的数-0.001)

这里通过算出当前词的q1与当前句中每一个词的q1k1 q1k2 q1k2 q1k4…再经过softmax,得到当前词对句子中每个词的0-1的打分,再把打分乘以每个词的V  ,得到被赋权后新的v1,v2,v3,v4….

第六步将权重值向量相加。结果就是自注意力层(self-attention layer)在这个位置的输出(本例子里是第一个词)

自注意力矩阵运算(把整句话丢进去搞

第一步是计算Query,Key,和Value矩阵。他们是通过嵌入层(embedding)输入的矩阵X和我们训练出来的权重矩阵(WQ,WK,WV)相乘得到的

X矩阵中的每一行对应于输入句子中的一个单词。我们再次看到嵌入向量的大小差异(512,或图中的4个方框)和q / k / v向量(64,或图中的3个方框)

X(长:维度512, 宽:句子中单词数(固定))

最后,处理矩阵时,我们可以将2-6步变为一步计算自注意力层的输出。

Q*KT的结果矩阵:第一行是第一个词的Q与每个词的K得到的第一个词对每个词的打分

第二行是第二个词的Q与每个词的K得到的第二个词对每个词的打分

这里行列都是一句话中词的个数,是个正方形,类似于

再乘以V,相当一个词给句子中所有词打分,所有词也给这个词打分,(相加的操作证明词与词之间作用相互,我认为你重要,你被打分后构成我,如果我们互相觉得重要,那我们互相都是权重高的重要的词。(解决长依赖问题)反之我觉得你不重要,你也觉得我不重要,那你我都不重要)(个人理解)

一只有许多头的野兽(多头注意力,从不同角度判断词与词之间的重要性)

(直观的想也觉得只用一组固定的WQ,WK,WV去得到所有Input x 的Q K V太过单一)

论文通过一个叫“多头注意力”(multi-headed attention)的机制进一步提高了自注意力层的性能。多头注意力机制从两个方面提高注意力层的性能:

1.它提高了模型关注不同位置的能力。的确,上面的例子中,Z1包含了一些其他位置的编码信息,但是实际上它却是由实际的词本身决定。我们翻译一个句子像 “The animal didn’t cross the street because it was too tired”,我们想知道“it”指代的是什么词时,多头注意力很有用。(翻译这段的时候好多 it 一下子把我看晕了…)(就是说it用一个注意力只能关注到“animal”,但是其实“tired”也是和“it”有关的

2.它给予注意力层多个表示子空间。正如我们接下来看到的那样,多头注意力可以让我们拥有多组Q/K/V矩阵(Transformer使用8个注意力头,所以最终我们的编码/解码器有8组)。每组都是随机初始化的。经过训练后,每组将嵌入层的输出(或者底层编码器/解码器的输出)投射到不同的表示子空间中。

如果我们做和之前提到的8头自注意力计算的话,只需要8次和8个不同的权重矩阵相乘,我们会得到8个不同的Z矩阵。(Query,Key,Value首先经过一个线性变换,然后输入到放缩点积attention,注意这里要做h次,其实也就是所谓的多头,每一次算一个头。而且每次Q,K,V进行线性变换的参数W是不一样的)

这就有个问题。前馈神经网络只接受一个矩阵,不接受多个矩阵。所以我们需要把这8个矩阵组合成1个矩阵。

怎么做呢?我们把8个矩阵连接起来,然后乘以一个额外的权重矩阵WO。

这里Z矩阵的长为  维度d*头数h,宽为句子长度/单词数,相当于用一个更大的维度去表示一个单词,再乘以WO得到每个词用512维表示的句子Z

以上就是多头自注意力机制的所有内容了。但是我只是展示了实际计算中的一部分矩阵以便理解。让我们把多头注意力计算放到一张图上看看。

现在我们已经基本了解了多头注意力了,让我们看例句中,当我们编码“it”的时候,不同头的注意力的注意机制是怎么样的。

这里对于it ,橙色头更关注animal,绿色头更关注tired.两个头同时关注animal和tired

(橙色头和绿色头都觉得it本身对it不重要?)

如果我们把所有的注意力头都放到一张图片里,看起来就会很复杂。

在这个多头中,新出现粉色头认为it同时关注didn't,还有头认为it也关注it本身

使用位置编码表示序列的顺序。(position encoding)

目前为止我们忽略了一件事,就是模型没有表示句子中单词的位置信息。

(词与词顺序排列,为啥要用位置信息?感觉比较玄妙,没搞懂,为什么要加cos,sin之类的)

为了标记位置,transformer对每一个输入的嵌入层(embedding)都加了一个向量。这些向量遵循模型学习的特定模式(意思就是向量的维度和模型要的维度一样。)。这有助于决定每个单词的位置,或者句子中不同单词的距离。这里的逻辑是,将这些值添加到嵌入层,嵌入层向量会被投影到Q/K/V向量中,Q/K/V在注意力期间进行点积计算时,就有了位置信息。

假设嵌入层是4维,那么实际位置编码长这个样子:

这玩意在实际模型中到底长啥样?

下面这个图每一行都对应位置信息编码成的向量。也就是说,第一行是我们要往嵌入层添加的输入句子中第一个词的位置向量。每一行由从-1到1之间的512个值构成,我给这些值做了颜色编码,看起来更直观一些。

一个真实的512大小嵌入层和20个词位置编码的例子。你可以看到它在中间很明显的分为两部分。这是因为左半部分的值是由一个函数生成(sin),右半部分是由另一个函数生成(cos)。然后组合 成为一个位置编码向量。

位置编码的具体公式在论文里有描述(3.5节),你可以从源码的get_timing_signal_1d().函数看到公式的代码具体实现。这并不是唯一的一种位置编码方式,只是这种方式可以处理未知长度的序列。(比如要求模型翻译的句子比训练集中所有句子都长)

残差(The Residuals)

我们之前提到过一个细节,每个编码模块的子层(自注意力层和前馈网络层)中间都有残差(residual)连接,然后紧跟着一个层标准化步骤。

就是图中的add操作,self-attention的add是加上未经过self-attention的x

Feed forward的add是加上未经过Feed forward的上一步的输出

解码模块里自注意力子层的样子也差不多。如果整体看Transformer的编、解码模块(以两层为例),它长这样:

解码端

编码模块从处理输入的句子开始,由最顶端的编码器输出是由注意力向量K和V组成的集合解码器会在每个“注意力编-解码层(encoder-decoder attention)”使用,它们能让解码器关注输入句子中恰当的地方。

编码阶段结束后就是解码阶段。解码阶段每一步会输出目标句子的一个元素。(比如翻译出来的句子中的一个词)

下面这些步骤会循环,直到解码器收到一个特殊的标记(EOS),这就代表解码结束。

解码模块每一步输出都会作为下一步的输入,解码模块内部动作和编码器一致,而且也会将每个词的位置嵌入并添加到输入向量中。

解码模块的自注意力层和编码模块的有点不一样。

(多加了mask的操作,屏蔽了后面的词,只关注当前词及当前词之前词的自注意力)

在解码模块中(有些人将解码模块翻译为解码端),自注意力层只关注输入句子中之前位置的单词。这个操作是在自注意力计算中的softmax层之前,通过屏蔽未来的位置(将它们设置成 -inf)来实现的。

编码-解码注意力层的计算方式和多头自注意力是一样的。只不过它是从它下面的层创建Q矩阵,同时从编码模块的输出中获得KV。(普通attention

最后的Linear和Softmax层

解码模块输出的是一个向量或者小数,我们怎么把他们变成一个词呢?这就是最后的线性层和softmax层要做的工作。

线性层是个简单的全连接神经网络,它将解码模块输出的一堆向量投影成为一个炒鸡炒鸡大的向量,这个向量成为logits vector(对数向量)。

假设我们模型从训练集中获得10,000个不同的英文单词(就是字典中的单词),线性层会生成10,000个单元宽度的logits向量,每个单元代表一个词的分数。这就是为什么模型后面紧跟着线性层的原因。

softmax层会将这些分数转为概率(全为正,加起来和是1)。最高概率的单元会被选出来,这个单元代表的词就是这一步的输出。

这里的向量log_probs,长是词典中所有词个数,每个值为0-1的概率,选概率最大的那个对应的单词

训练回顾

这里就写了一个one hot而已,用于与Log_probs对比,算损失

训练期间,未经训练的模型会进行相同的前向训练,但是因为我们是有监督学习,所以是有标签可以对比训练输出的结果来判断正确与否。

为了方便理解,我们假设输出词典只有六个词(“a”, “am”, “i”, “thanks”, “student”, and “<EOS>” ( ‘end of sentence’缩写)).

一旦我们定义了单词表(字典),我们就可以用同样宽度的向量表示每个词,这也叫作one-hot编码。比如,我们可以用下面的向量表示“am”

损失函数

假设我们在训练模型,而且是我们训练阶段的第一波。我们用个简单的例子训练-----把“merci”翻译成“thanks”。

什么意思呢?就是我们想让模型输出是“thanks”的概率分布,但是模型还没有开始训练,所以它还没能力输出。

模型的初始化参数(权重)是随机的,也就是会在每个单元(词)上产生一个随机的概率值。我们把初始的概率值和真正的概率比较,通过反向传播调整初始值,努力让模型输出的概率分布和真正的概率分布相同。

那么两个概率分布怎么比较呢?简单的方法就是一个减去另一个,更多的方法请看交叉熵损失-cross-entropy和相对熵/KL散度(Kullback-Leibler divergence)。

但是注意,上面的只是个超级简化的例子。更实际点,我们用一个句子代替一个词来举例。比如,输入“je suis étudiant”,然后期望输出“i am a student”。也就是说,我们想要我们的模型成功的输出如下要求的概率分布:

每个概率分布都是单词表长度大小的向量(我们的例子中是6个,但是实际上单词表3000-10,000,向量也这么大)

第一个概率分布中概率最高的单元应该是“i”的单元

第二个概率分布的重概率最高的单元是“am”的单元

以此类推,直到第五个输出了“‘<end of sentence>”符号,这个符号也是单词表(词典)里的。

目标输出

这是我们样本概率分布(目标的概率分布)。

在足够大的数据集上训练模型足够次数后,我们希望模型会生成如下概率分布。

小白理解transformer解析博客相关推荐

  1. 小白神器 - 一篇博客学会HTML

    小白神器 - 一篇博客学会HTML 一. 简介 1. HTML 定义 htyper text markup language  即超文本标记语言. 超文本: 就是指页面内可以包含图片.链接,甚至音乐. ...

  2. 芋道源码 -- 纯源码解析博客

    本文转载: 原文地址:   芋道源码 -- 纯源码解析博客

  3. 编程小白的第一条博客

    本人AlleyMeowy,编程小白一只,非理工科学校,非科班出身,为了成为大牛不断努力. --2018年12月23日,在博客园创建博客第一天 转载于:https://www.cnblogs.com/A ...

  4. 手把手教你做一个新浪博客发布软件JAVA版本(5)--打开博客发布页面并解析博客内容

            前言:很多人用新浪博客引流,但是以前可以用api发布,但是现在已经行不通了,市面上也有诸如新浪博客批量发布软件啦,新浪博客批量发帖啦,新浪博客发布软件啊等等的各种工具,但是小心中枪,一 ...

  5. 小白入门------第一篇博客

    大家好,我是来自湖北十堰的小小本科生.自己跨专业专升本考到这个学校的计算机科学技术专业,也算圆了自己的本科梦.但是自己前面专科的专业与计算机一毛钱关系都没有,作为大三的我学起来确实吃力,但是我打算以后 ...

  6. HTTP协议与TCP协议简单理解--转自博客园--留着学习

    TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性.Http协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求.Http会通 ...

  7. 软件架构设计箴言理解 (转自博客园)

    软件架构设计箴言理解 http://www.cnblogs.com/whitewolf/archive/2012/06/02/2532244.html 2012-06-02 21:30 by 破狼, ...

  8. 芋道源码----纯源码解析博客

    1.java四种引用类型:http://www.iocoder.cn/Fight/Four-reference-types-in-Java/ 2. 八种WebSocket框架的性能比较:http:// ...

  9. 技术小白的第一篇博客 --- 虚拟机访问本地文件设置

    虚拟机访问本地文件夹 最近工作中需要使用到虚拟机在不同操作系统上测试软件,总是从服务器拷贝文件太麻烦,就找了一下虚拟机可以直接访问本地文件夹的设置方法,这里就是简单记录一下. 1.在虚拟机的设置页面中 ...

  10. 瞧一瞧看一看:新手小白写Web前端博客

    二序 2.1 表格标签 2.1.1 <table> : 表格的最外面容器<tr> : 定义表格行<th> : 定义表头<td> : 定义表格标题注:之前 ...

最新文章

  1. 基于自适应逆透视变换的车道线SLAM
  2. 洛谷P1880 [NOI1995]石子合并
  3. 解决创建maven项目后,不能创建scala
  4. [转载]【Java EE】Struts2.1.6与Spring2.5.6框架整合
  5. java函数的参数传递
  6. 在淘宝买水果短斤缺两是不是成了潜规则?
  7. htmlselect保留上次选择内容_搬家买什么工具,搬家有什么技巧,搬家选择什么公司?...
  8. 堆排序建堆复杂度在特殊情况下的推导
  9. xilinx sdk查看结构体定义open declaration
  10. Eye Tracking Methodology Theory and Practice, Third Edition
  11. 学生HTML个人网页作业作品:基于web在线汽车网站的设计与实现 (宝马轿车介绍)
  12. pdf转换成jpg python_Python将PDF转成图片PNG和JPG
  13. matlab画图形函数 semilogx semilogy和loglog
  14. python绘制网络拓扑图_python 画网络拓扑图
  15. Cloudera Manager 5升级(官方翻译整理,企业级实战验证)
  16. shell 特殊符号大全
  17. 一位软件测试工程师的5年成长经历,这些职场黑话,你需要知道
  18. Android O(SDK 8.0)新特性,刘海屏
  19. VLookup函数详细教程
  20. 配置伪分布式hadoop集群(附常见配置问题)

热门文章

  1. 大数据---Hadoop的各种版本
  2. 天正2014打开加载lisp_天正CAD2014对不信任加载项的解决方法
  3. snipaste滚动截图方法_windows史上最强截图工具 ,有它就够了
  4. spss数据统计分析工具IBM SPSS Statistics 26 for Mac安装教程
  5. 《软件工程导论》考试复习题集锦
  6. CRM系统实现企业管理高效协同
  7. 软件架构思想和系统架构图
  8. 机载激光雷达原理与应用科普(二)
  9. openwrt的源码下载及其编译 (一)
  10. 通过js操作jwplayer来播放暂停