一文带你深度剖析什么叫Transformer
Transformer概述
Transformer是基于自注意机制(self-attention)的神经网络模型。其经常用于来处理时序数据。我们知道还有另外的常用的两类深度神经网络模型循环神经网络(RNN)和卷积神经网络(CNN)。那么对于Transformer而言,其相较于另外两种的优势在哪呢?
- 其使用自注意机制,可同时并行处理时序数据,计算他们之间的相关性
- 并且其输入时引入了位置编码来保留的序列的相关信息
- 因为其可并行处理,所以训练速度可以很快
其结构如下图所示,其特性正是由其结构所决定的,所以接下来带你逐步分析逐层结构。

分模块解析Transformer
模型的输入输出
首先来看输入输出部分,从结构图也很容易看出来,输入有两个,输出一个。那我们以机器翻译为例,左部分输入(Inputs)为需要待翻译的英文数据,右边输入(Outputs(shifted right))为中文的翻译标注数据,那么最终的输出(Outputs Probabilities)即为翻译预测的结果。

其输入首先会经过模型的词向量层进行处理,简单来说就是单词的序列会被转换为单词向量的序列。但是如果仅仅就是这样的序列输入到模型中,会出现一个很大的问题,因为模型是并行处理的,对于这样的输入数据,模型是无法知道其位置如何的,比如我们输入的是Are you ok?但是模型可能会以为是You are ok?或者是Ok? Are you那么对于这样的情况应该怎么处理呢?所以Transformer引入了位置编制加入其位置信息。

位置编码(Positional Encoding)
我们现在知道了其引入位置编码的目的就是为了将其位置信息附加到原始的信息上面,其实现是通过正弦函数和余弦函数的计算来实现的。

具体就是pos代表着在序列中的位置,2i和2i+1怎么理解呢,我们就可以将其看为偶数维度和奇数维度,即对于Are而言PE(0,0),PE(0,2)使用正弦计算其位置信息,PE(0,1),PE(0,3)则使用余弦计算其位置信息。其中d代表了总的维度。故其最终的输入信息为加入了位置信息的编码,如下所示:

编码器解码器结构(Encoder-Decoder)
经过位置编码后的数据则会被输入到Encoder-Decoder结构中,其中N代表了有多个Encoder和Decoder,论文中的N为6.其总共有三个计算过程。

- 计算过程1
待翻译的英文数据经过编码输入后会首先进入其编码器(Encoder),经过多头自注意力机制(Muti-Head Attention),在经过残差连接和归一化层。这里注意下,这里使用的是层归一化(LN),那么为什么不使用批归一化(BN)?因为BN是通过将一个批次的同一维度进行归一化,用其均值方差,代表整个数据的均值方差,那么对于处理不同长度的时序数据就会出现问题,可能有些序列特别长,那么部分维度的数据可能就会特别少,这就会导致其数据太少,噪音过大,不能够正确的代表整个数据的均值方差。然后在经过前馈网络和残差归一化得到最后的编码输出。
- 计算过程2
其实与计算过程1相类似,只不过这里使用的是掩码多头注意力机制(Masked Multi-Head Attention),其与多头自注意力机制(Muti-Head Attention)区别就在于加入了掩码,掩盖了后续的信息。这么做的原因就在于,我们真实预测的时候,是无法知道后续的信息的,我们只能根据我们已有的信息和已经推断出来的信息去推测下一个可能的预测。
- 计算过程3
经过计算1和计算2得出的编码信息会一同进入第三个计算过程进行解码,得到最后的预测结果输出。
多头注意力机制(Muti-Head-Attention)
前文说了很多遍的多头自注意力机制(Muti-Head Attention)了,那么其到底是如何运行的呢?其具体的结构如下图

其就是通过Q、K、V三个线性层对输入数据进行特征变换,在通过注意力机制对其进行融合,多头的意思即有多个自注意机制层。最后将所有自注意机制层的结果进行合并,通过线性层得到最终的输出。(这里我并未详细说明什么是注意力机制,大家其就可以简单的理解其为一个线性处理即可)
具体的计算过程如下,经过编码后的输入x会与Q、K、V三个线性层进行处理得到Qx,Kx,Vx三个不同的编码信息,然后我们通过注意力机制进行融合。

其公式为。简单理解就是对于Q、K、V三组信息,进行选择与融合,从而得到最终的注意力机制结果。

看到这里相信你已经对于Transformer的结构已经有了很深入的了解了,但是这仅仅就是理论的基础,后续将会给大家更新如何搭建自己的transformer去处理相关的问题。
参考资料:
[Transformer模型详解,Attention is all you need](Transformer模型详解,Attention is all you need_哔哩哔哩_bilibili)
Transformer从零详细解读(可能是你见过最通俗易懂的讲解)
一文带你深度剖析什么叫Transformer的更多相关文章
- OpenHarmony 3GPP协议开发深度剖析——一文读懂RIL
(以下内容来自开发者分享,不代表 OpenHarmony 项目群工作委员会观点)本文转载自:https://harmonyos.51cto.com/posts/10608 夏德旺 软通动力信息技术(集 ...
- HashMap源码深度剖析,手把手带你分析每一行代码,包会!!!
HashMap源码深度剖析,手把手带你分析每一行代码! 在前面的两篇文章哈希表的原理和200行代码带你写自己的HashMap(如果你阅读这篇文章感觉有点困难,可以先阅读这两篇文章)当中我们仔细谈到了哈 ...
- 深度好文:Linux文件系统剖析
一个执着于技术的公众号 Linux 文件系统体系结构是一个对复杂系统进行抽象化的有趣例子.通过使用一组通用的 API 函数,Linux 可以在许多种存储设备上支持许多种文件系统.例如,read 函数调 ...
- ASP.NET MVC深入浅出系列(持续更新) ORM系列之Entity FrameWork详解(持续更新) 第十六节:语法总结(3)(C#6.0和C#7.0新语法) 第三节:深度剖析各类数据结构(Array、List、Queue、Stack)及线程安全问题和yeild关键字 各种通讯连接方式 设计模式篇 第十二节: 总结Quartz.Net几种部署模式(IIS、Exe、服务部署【借
ASP.NET MVC深入浅出系列(持续更新) 一. ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态模 ...
- .NET5.0 单文件发布打包操作深度剖析
.NET5.0 单文件发布打包操作深度剖析 前言 随着 .NET5.0 Preview 8 的发布,许多新功能正在被社区成员一一探索:这其中就包含了"单文件发布"这个炫酷的功能,实 ...
- 【项目实践】一文带你搞定Spring Security + JWT
以项目驱动学习,以实践检验真知 前言 关于认证和授权,R之前已经写了两篇文章: [项目实践]在用安全框架前,我想先让你手撸一个登陆认证 [项目实践]一文带你搞定页面权限.按钮权限以及数据权限 在这两篇 ...
- 《AngularJS深度剖析与最佳实践》简介
由于年末将至,前阵子一直忙于工作的事务,不得已暂停了微信订阅号的更新,我将会在后续的时间里尽快的继续为大家推送更多的博文.毕竟一个人的力量微薄,精力有限,希望大家能理解,仍然能一如既往的关注和支持sh ...
- Objective-C类成员变量深度剖析
目录 Non Fragile ivars 为什么Non Fragile ivars很关键 如何寻址类成员变量 真正的“如何寻址类成员变量” Non Fragile ivars布局调整 为什么Objec ...
- LCD深度剖析
LCD 深度剖析 来源:http://blog.csdn.net/hardy_2009/article/details/6922900 http://blog.csdn.net/jaylondon/a ...
- 【渗透课程】第二篇下-HTTP协议的请求与响应深度剖析
[渗透课程]第二篇下-HTTP协议的请求与响应深度剖析 HTTP1.1目前支持以下7种请求方法: 常见的MIME类型如下: 第一个数字有五种可能的取值: 目录 什么是请求方法?什么是请求头? HTTP ...
随机推荐
- WebSocket详解:技术原理、代码演示和应用案例
1.内容简介 本文将简要介绍 WebSocket 的由来.原理机制以及服务端/客户端实现,并以实际客户案例指导并讲解了如何使用 WebSocket 解决实时响应及服务端消息推送方面的问题.本文适用于熟 ...
- MySQL---锁、变量、存储过程、游标、自定义函数
一概述 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则.对于任何一种数据库来说都需要有相应的锁定机制. MySQL各存储引擎使用了三种类型 ...
- Redis持久化(RDB、AOF)
为什么要持久化 Redis是内存数据库,如果不将内存中的数据库状态保存到磁盘中,那么一旦服务器进程退出,服务器的数据库状态就会消失(即断电即失).为了保证数据不丢失,我们需要将内存中的数据存储到磁盘, ...
- 使用坦克PWA访问助手为自己的局域网应用快速配置免费域名
这篇教程描述如何使用坦克PWA访问助手.这篇文章简称坦克PWA访问助手为PWA助手.PWA结合了DNS服务器技术和HTTP服务器技术实现,因此它需要系统的53端口和80端口.所以,如果你的电脑有程序占 ...
- python:公共操作
运算符 公共方法 range """ 1 2 3 4 5 6 7 8 9 """ # 不包含 end# 如果不写开始,默认从零开始# 如果不 ...
- Kotlin:【泛型】
- playwright相关
Playwright 介绍 Playwright 是一个用于自动化浏览器操作的开源工具,由 Microsoft 开发和维护.它支持多种浏览器(包括 Chromium.Firefox 和 WebKit) ...
- 一键部署,玩转AI!天翼云Llama 3大模型学习机来了!
近日,Meta公司发布了其最新研发成果--开源大模型Llama 3,共包含Llama 3 8B和Llama 3 70B两种规格,参数量级分别为80亿与700亿,并表示这是目前同体量下性能最好的开源模型 ...
- 单机麒麟kylin安装
https://archive.apache.org/dist/kylin/ 2.5.0版本 首先启动hadoop.hive.hbase 并记得设置环境变量 #JDK export JAVA_HOME ...
- postman获取时间戳并自动计算token
工作中时常要测试接口,公共请求参数包括id, timestamp, token, token = MD5(id + key + timestamp)并转大写. 每次用外部工具去获取时间戳并计算toke ...