首页 > 其他分享 >transformer如何实现并行

transformer如何实现并行

时间:2023-10-31 13:01:50浏览次数:32  
标签:输出 transformer 并行 如何 解码器 Decoder 时刻 输入

 

RNN 无法并行

 

我们先看一个典型的基于RNN的Encoder-Decoder结构

transformer如何实现并行_编码器

 

输入是:“机器学习“,输出是“machine learning”。模型的大概工作时序是:Encoder部分,输入序列逐个送进RNN,计算出最后时刻的隐藏状态c,作为上下文信息传给Decoder。Decoder部分,将c和t-1时刻的输出作为t时刻的输入,逐步计算预测得到t时刻的输出。这个结构中,Encoder和Decoder部分都是无法并行化的,这是由RNN结构本身决定的(t时刻计算依赖t-1时刻的输出)。值得注意的一点是,这里我们讨论的并行化,不是指多个“输入-输出”样本批量处理,而是指对于单个的“输入-输出”样本,模型中Encoder和Decoder都需要历经t次迭代。

RNN之所以不支持并行化是因为它天生是个时序结构,t时刻依赖t-1时刻的输出,而t-1时刻又依赖t-2时刻,如此循环往前,我们可以说t时刻依赖了前t时刻所有的信息。RNN的实质目的是学习时序数据中的局部依赖关系,实际上深度学习很多模型的目的都是为了学习样本之间的局部关系,如CNN也是为了学习空间数据中局部依赖关系。为了完成对长距离样本之间依赖关系的学习,CNN采用多次卷积、池化等操作,这样需要加大网络的深度,才能更多的学习到更大范围的样本局部依赖关系。RNN虽然理论上可以建立长距离依赖关系,但由于存在梯度消失、网络容量等问题,实际上效果也要打折扣。

Transformer并行化

Transformer中的Encoder和Decoder分别如何支持并行化训练。

Encoder支持并行化

理解Encoder部分能支持并行化训练的关键就在于理解自注意力机制:

transformer如何实现并行_依赖关系_02

之间两两相关性作为权重的一种加权平均,将每一个xi 映射到 zi。

这样说可能还有点抽象,如上图所示, 表示“Thinking”和“Machines”的embedding。

此时可以说 和x2 都只表示自己的word,没有考虑局部依赖关系。

自注意力机制首先计算了 之间的相关性, 和x2之间的相关性,记为 ,

transformer如何实现并行_编码器_03

,通过对x1,x2 来表示“Thinking”,此时我们说z1

已经考虑了和其他元素之间的依赖关系。

这里我们举例是一个简单的长度为2的句子,可以推广到长度为N的句子处理上,

的加权平均,哪个元素的权重大,我们说它获得了更高的“注意力”。

同理,我们可以可以计算Z2:N 对不同的xi

注意力分布不同。

换句话说,在计算每一个zi

,而无需像RNN那样严格按照时序依次迭代计算。

 

 

 

Decoder支持并行化

假设目标语句为:“I love China”这样一个长度为3的句子。首先我们给句子加入一个起始符号:“<start> I love China”。对于解码器模块,我们先来看一个正常的处理思路。

第一轮:给解码器模块输入“<start>” 和 编码器的输出结果,解码器输出“I”

第二轮:给解码器模块输入“<start> I” 和 编码器的输出结果,解码器输出“Iove”

第三轮:给解码器模块输入“<start> I love” 和 编码器的输出结果,解码器输出“China”

第四轮:给解码器模块输入“<start> I love China” 和 编码器的输出结果,解码器输出“<end>”,至此完成。

这就是一个“完美”解码器按时序处理的基本流程。之所以说完美,是因为解码器每次都成功的预测出了正确的单词,如果编码器在某一轮预测错了,那么给下一轮解码器的输入中就包含了错误的信息,然后继续解码。

Transformer之所以能支持Decoder部分并行化训练,是基于以下两个关键点:

  1. teacher force
  2. masked self attention

对于teacher force,在其他seq2seq模型中也有应用。它是指在每一轮预测时,不使用上一轮预测的输出,而强制使用正确的单词。还以上面这个例子来说,第二轮时,给解码器模块输入“<start> I” 和 编码器的输出结果,解码器没有正确预测出“Iove”,而是得到了“want”。如果没有采用teacher force,在第三轮时,解码器模块输入的就是“<start> I want”。如果采用了 teacher force,第三轮时,解码器模块输入的仍然是“<start> I love”。通过这样的方法可以有效的避免因中间预测错误而对后续序列的预测,从而加快训练速度。而Transformer采用这个方法,为并行化训练提供了可能,因为每个时刻的输入不再依赖上一时刻的输出,而是依赖正确的样本,而正确的样本在训练集中已经全量提供了。值得注意的一点是:Decoder的并行化仅在训练阶段,在测试阶段,因为我们没有正确的目标语句,t时刻的输入必然依赖t-1时刻的输出,这时跟之前的seq2seq就没什么区别了。

对于masked self attention,它本质就是一种自注意力,只是加了一个mask,也正是这个mask为Decoder提供了并行化训练的可能。为了更好的说明mask的作用,我自己手画了两个简图,画的比较丑,请读者凑合着看。

 

transformer如何实现并行_并行化_04

 

上图是一个普通的自注意力机制示意图,实际上Encoder部分的自注意力机制大概就是这个关系。图中为了不太凌乱,我没有画出z2 、z3、z4 和x1:4

是两两关联的。

有的读者可能发现了,这是不是类似于一个的全连接网络?

其实自注意力机制本质就是一种全连接网络,只是普通的全连接网络每层的节点数量在建立模型时就已经确定了,对于一个模型这些连接的权重也通过训练得到。

而自注意力机制可以适应不同长度的输入,这些权重是由K、Q动态生成的,我们要训练得到的是产生K、Q的参数矩阵。这一点和我们要说的并行化训练关系不大,只是做一点补充。

以上这个自注意力模型在训练Decoder无法直接使用,因为Decoder是在做解码,解码时要求第t时刻的输出,是看不到t时刻以后的样本的。换句话说,我们需要把

全相关。如下图所示:

 

 

REF:

https://zhuanlan.zhihu.com/p/368592551

https://zhuanlan.zhihu.com/p/368592551



标签:输出,transformer,并行,如何,解码器,Decoder,时刻,输入
From: https://blog.51cto.com/emanlee/8103771

相关文章

  • Apache Dolphinscheduler如何不重启解决Master服务死循环
    个人建议ApacheDolphinscheduler作为一个开源的调度平台,目前已经更新到了3.X版本,4.0版本也已经呼之欲出。3.0版本作为尝鲜版本,新添加了许多的功能,同时也存在非常多的隐患,本人使用3.0版本作为生产调度也踩了很多坑,到现在依然存在很多难以解决的问题,所以建议小伙伴们尽量使用2.x版......
  • Oracle 参数 STANDBY_FILE_MANAGEMENT 官方解释,作用,如何配置最优化建议
    本站中文解释STANDBY_FILE_MANAGEMENT:用于控制应用日志文件的处理,如果设置为AUTO时,此参数将用于控制应用日志文件是被自动删除、备份或迁移,以满足物理备份恢复要求。设置正确的方法:1.在Oracle实例中,使用ALTERSYSTEM命令将STANDBY_FILE_MANAGEMENT参数的值设置为AUTO:ALTERSYS......
  • 海康EHOME协议设备如何加到畅联平台
    ​              海康摄像机如何通过EHMOE协议手动加入畅联平台操作流程示意图 添加前准备工作准备摄像机准备一台带有EHOME协议的海康摄像机,把摄像机联网,且知道摄像机的IP、用户名、密码。查看摄像机注册地址登录畅联查看摄像机通过EHOME协议注......
  • 导入个Excel页面直接卡死,该如何解决
    JavaScript是单线程的语言,也就是说同步代码都需要排队去执行,这样就会造成很多问题,就比如:数据量大的excel文件的导入导出,会造成整个页面出现“假卡死”的现象。什么是“假卡死”呢?意思就是页面其实并没有卡死,但是用户做一些操作时,页面并没有及时给到反馈,这就会让用户觉得页面卡死......
  • 【CVPR2023】Learning A Sparse Transformer Network for Effective Image Deraining
    论文:https://readpaper.com/paper/4736105248993591297代码:https://github.com/cschenxiang/DRSformerTransformer模型通常使用标准的QKV三件套进行计算,但是部分来自K的token与来自Q的token并不相关,如果仍然对这些token进行特征聚合计算会影响图像修复的性能。......
  • VSCode如何把代码转换成一行
    或者mac直接ctrl+j,可以把选中的代码转成一行。https://www.fengnayun.com/news/content/314947.html......
  • 聊聊多层嵌套的json的值如何解析/替换
    前言前阵子承接了2个需求,一个数据脱敏,一个是低代码国际化多语言需求,这两个需求有个共同特点,都是以json形式返回给前端,而且都存在多层嵌套,其中数据脱敏的数据格式是比较固定,而低代码json的格式存在结构固定和不固定2种格式。最后不管是数据脱敏或者是多语言,业务抽象后,都存在需要......
  • Microsoft 365:如何借助Power Virtual Agents来打造智能客服方案
    Blog链接:https://blog.51cto.com/13969817从ChatGPT问世后,微软的Microsoft365权限产品也陆续拥抱AI,比如PowerVirtualAgents就可以使用生成式AI在几分钟内创建强大的聊天机器人,不需要开发人员的帮助,开箱即用的解决方案,快速地响应客户和员工的需求,适用于相关问题客服支持、相关产......
  • windows如何连接远程桌面
    方法挺多,蜜蜂这里分享三种比较简单的(win自带插件、向日葵、todesk)1.按下win+R,输入mstsc,然后点击确认。1.2输入远程IP,然后点击连接.1.3点击是1.4就能连接到远程桌面了2.向日葵,这个比较简单需要双方都装上这个软件。3.todesk,用法和向日葵一样......
  • 7 年 Android 老油条告诉你:天天工作拧螺丝,如何打破技术瓶颈?
    引言作为在Android这个圈子摸爬滚打7年的老油条想给你们工作“3~5”年的朋友提点职业上和技术上的建议其实很多做开发的朋友都会遇到的怪圈。就是当你到某一个阶段,会觉得业务和技术提升都很难,现在的公司待着感觉没有前途混吃等死,想跳槽吧,心里却没底。如果是碰到这种情况,那么十......