jjzjj

Transformer中解码器decoder的详细讲解(图文解释)

showswoller 2023-06-15 原文

假设我们想把英语句子i am good翻译成法语句子 Je Vais bein,首先将原句送入编码器,使编码器学习原句,并计算特征值,在上一篇博客中已经讲解了编码器是如何计算原句的特征值的,然后我们把从编码器求得的特征值送入解码器,解码器将特征值作为输入,并生成目标据,流程如下

 在编码器部分,我们了解到可以叠加N个解码器,同理,解码器也可以有N个叠加在一起,编码器将原句的所有特征值作为输入传给所有解码器,而非只给第一个解码器,因此一个解码器将有两个输入,一个是来自前一个解码器的输出,另一个是编码器输出的特征值

接下来我们学习解码器是如何生成目标句子的,当t=1时(t表示时间步)解码器开始工作,生成目标为句子中的第一个词,当t=2时,解码器使用当前的输入和在上一步生成的单词,来预测句子中的下一个单词,以此类推,在每一步中解码器都将上一步生成的单词与输入的词结合起来,并预测下一个单词

一个解码器模块及其所有的组件如下图所示

 从上图中可以看到,解码器内部有三个子层,分别是

1:带掩码的多头注意力层

2:多头注意力层

3:前馈网络层

与编码器模块相似,解码器模块也有多头注意力层和前馈网络层,但多了带掩码的多头注意力层,下面对它们一一进行讲解

一、带掩码的多头注意力层

 以英法翻译任务为例,假设训练数据集样本如下

解码器将输入的<sos>作为第一个标记,并在每一步中将下一个预测词与输入结合起来,以预测目标句子,直到遇到<eos>为止 

带掩码的多头注意力层就是预测与<sos>相邻的单词时,模型应该只看到<sos>,所有我们掩盖<sos>后边的所有词,因此在使用softmax函数进行归一化之前,我们需要对数值进行掩码转换,可以用负无穷去掩盖

二、多头注意力层

由下图可以看出,每个解码器中的多头注意力层都有两个输入:一个来自带掩码的多头注意力层,另一个是编码器输出的特征值 

多头注意力机制的第一步是创建三个矩阵,我们使用从上一个子层获得的注意力矩阵M创建查询矩阵Q,使用编码器输出的特征值R创建键矩阵和值矩阵,因为查询矩阵是从M求得的,所以本质上包含了目标句子的特征,键矩阵和值矩阵则含有原句的特征,因为它们是用R计算的

三、前馈网络层

 解码器的下一个子层是前馈网络层,它的工作原理与我们在编码器中用到的完全相同,此处不再赘述

四、叠加和归一组件

和在编码器部分讲到的一样,叠加和归一组件连接子层的输入和输出

五、线性层和softmax层

一旦解码器学习了目标句子的特征,我们就将顶层解码器的输出送入线性层和softmax层

线性层将生成一个logit向量,其大小等于原句中的词汇量,接下来使用softmax函数将logit向量转换成概率,然后解码器将输出具有高概率值的词的索引值

六、解码器总览

通过上图,我们可以总结出以下几点

1:首先,我们将解码器的输入转换为嵌入矩阵,然后将位置编码加入其中,并将其作为输入送入底层的解码器

2:解码器收到输入,并将其发送给带掩码的多头注意力层,生成注意力矩阵M

3:然后将注意力矩阵M和编码器输出的特征值R作为多头注意力层的输入,并再次输出新的注意力矩阵

4:把从多头注意力层得到的注意力矩阵作为输入,送入前馈网络层,前馈网络层将注意力矩阵作为输入,并将解码后的特征作为输出

5:最后我们把从解码器1得到的输出作为输入,将其送入解码器2

6:解码器2进行同样的处理,并输出目标句子的特征 

七、训练Transformer 

我们可以退哦那个过最小化损失函数来训练Transformer网络,但是应该如何选择损失函数呢,我们已经知道,解码器预测的是词汇的概率分布,并选择概率最高的词作为输出,所有我们需要让预测的概率分布和实际的概率分布之间的差异最小化,要做到这一点,可以将损失函数定义为交叉熵定义函数,我们通过最小化损失函数来训练网络,并使用Adam算法来优化训练过程

另外需要注意,为了防止过拟合,我们可以将dropout方法应用于每个子层的输入以及嵌入和位置编码的总和

创作不易 觉得有帮助请点赞关注收藏~~~

有关Transformer中解码器decoder的详细讲解(图文解释)的更多相关文章

  1. ruby - 有人可以帮助解释类创建的 post_initialize 回调吗 (Sandi Metz) - 2

    我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法

  2. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  3. 在VMware16虚拟机安装Ubuntu详细教程 - 2

    在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主

  4. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

    Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

  5. ruby - 解释为局部变量会覆盖方法名称吗? - 2

    如thisquestion,当在其自己的赋值中使用未定义的局部变量时,它的计算结果为nil。x=x#=>nil但是当局部变量的名称与现有的方法名称冲突时,就比较棘手了。为什么下面的最后一个示例返回nil?{}.instance_eval{a=keys}#=>[]{}.instance_eval{keys=self.keys}#=>[]{}.instance_eval{keys=keys}#=>nil 最佳答案 在Ruby中,因为可以在没有显式接收器和括号的情况下调用方法,所以在局部变量引用和无接收器无参数方法调用之间存在语法歧义:f

  6. 语法类似于 GitHub Flavored Markdown 的 Ruby markdown 解释器? - 2

    我使用Jekyll运行博客,并认为我会解决RedcarpetMarkdown解释器,因为它是developedandusedbyGitHub.好吧,我只是碰巧遇到了一个错误,去检查问题,然后foundthis.Maintainersays,"Asyouprobablyhavenoticed(harharharhar)Idon'thavetimetomaintainRedcarpetanymore.It'snotapriorityforme(IfindMarkdownthoroughlyboring)andit'snotapriorityforGitHub,becausewenolong

  7. ruby - 有人可以解释一下在 Ruby 中注入(inject)的真实、通俗易懂的用法吗? - 2

    我正在学习Ruby,遇到了inject。我正处于理解它的风口浪尖,但当我是那种需要真实世界的例子来学习一些东西的人时。我遇到的最常见的例子是人们使用inject来添加一个(1..10)范围的总和,我不太关心这个。这是一个任意的例子。在实际程序中我会用它做什么?我正在学习,所以我可以继续使用Rails,但我不必有一个以Web为中心的示例。我只需要一些我可以全神贯注的目标。谢谢大家。 最佳答案 inject有时可以通过它的“其他”名称reduce更好地理解。它是一个对Enumerable进行操作(迭代一次)并返回单个值的函数。它有许多有

  8. ruby - 一种语言如何被自身解释(如 Rubinius)? - 2

    我使用Ruby编程已经有一段时间了,现在只使用Ruby的标准MRI实现,但我一直对我经常听到的其他实现感到好奇。前几天我在读有关Rubinius的文章,这是一个用Ruby编写的Ruby解释器。我试着在不同的地方查找它,但我很难弄清楚这样的东西到底是如何工作的。我在编译器或语言编写方面从来没有太多经验,但我真的很想弄明白。一门语言究竟如何才能被自己解释?编译中是否有一个我不明白这有意义的基本步骤?有人可以像我是个白痴一样向我解释这个吗(因为无论如何这都不会太离谱) 最佳答案 它比你想象的要简单。Rubinius并非100%用Ruby编

  9. 100个python算法超详细讲解:画直线 - 2

    1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva

  10. H2数据库配置及相关使用方式一站式介绍(极为详细并整理官方文档) - 2

    目录H2数据库入门以及实际开发时的使用1.H2数据库的初识1.1H2数据库介绍1.2为什么要使用嵌入式数据库?1.3嵌入式数据库对比1.3.1性能对比1.4技术选型思考2.H2数据库实战2.1H2数据库下载搭建以及部署2.1.1H2数据库的下载2.1.2数据库启动2.1.2.1windows系统可以在bin目录下执行h2.bat2.1.2.2同理可以通过cmd直接使用命令进行启动:2.1.2.3启动后控制台页面:2.1.3spring整合H2数据库2.1.3.1引入依赖文件2.1.4数据库通过file模式实际保存数据的位置2.2H2数据库操作2.2.1Mysql兼容模式2.2.2Mysql模式

随机推荐