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的更多相关文章

  1. OpenHarmony 3GPP协议开发深度剖析——一文读懂RIL

    (以下内容来自开发者分享,不代表 OpenHarmony 项目群工作委员会观点)本文转载自:https://harmonyos.51cto.com/posts/10608 夏德旺 软通动力信息技术(集 ...

  2. HashMap源码深度剖析,手把手带你分析每一行代码,包会!!!

    HashMap源码深度剖析,手把手带你分析每一行代码! 在前面的两篇文章哈希表的原理和200行代码带你写自己的HashMap(如果你阅读这篇文章感觉有点困难,可以先阅读这两篇文章)当中我们仔细谈到了哈 ...

  3. 深度好文:Linux文件系统剖析

    一个执着于技术的公众号 Linux 文件系统体系结构是一个对复杂系统进行抽象化的有趣例子.通过使用一组通用的 API 函数,Linux 可以在许多种存储设备上支持许多种文件系统.例如,read 函数调 ...

  4. 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的无状态模 ...

  5. .NET5.0 单文件发布打包操作深度剖析

    .NET5.0 单文件发布打包操作深度剖析 前言 随着 .NET5.0 Preview 8 的发布,许多新功能正在被社区成员一一探索:这其中就包含了"单文件发布"这个炫酷的功能,实 ...

  6. 【项目实践】一文带你搞定Spring Security + JWT

    以项目驱动学习,以实践检验真知 前言 关于认证和授权,R之前已经写了两篇文章: [项目实践]在用安全框架前,我想先让你手撸一个登陆认证 [项目实践]一文带你搞定页面权限.按钮权限以及数据权限 在这两篇 ...

  7. 《AngularJS深度剖析与最佳实践》简介

    由于年末将至,前阵子一直忙于工作的事务,不得已暂停了微信订阅号的更新,我将会在后续的时间里尽快的继续为大家推送更多的博文.毕竟一个人的力量微薄,精力有限,希望大家能理解,仍然能一如既往的关注和支持sh ...

  8. Objective-C类成员变量深度剖析

    目录 Non Fragile ivars 为什么Non Fragile ivars很关键 如何寻址类成员变量 真正的“如何寻址类成员变量” Non Fragile ivars布局调整 为什么Objec ...

  9. LCD深度剖析

    LCD 深度剖析 来源:http://blog.csdn.net/hardy_2009/article/details/6922900 http://blog.csdn.net/jaylondon/a ...

  10. 【渗透课程】第二篇下-HTTP协议的请求与响应深度剖析

    [渗透课程]第二篇下-HTTP协议的请求与响应深度剖析 HTTP1.1目前支持以下7种请求方法: 常见的MIME类型如下: 第一个数字有五种可能的取值: 目录 什么是请求方法?什么是请求头? HTTP ...

随机推荐

  1. biancheng-数据结构

    目录http://c.biancheng.net/data_structure/ 1数据结构入门2线性表3栈和队列4字符串5数组和广义表6树存储结构7图存储结构8动态内存管理9查找表结构10排序算法1 ...

  2. Redis组件的特性,实现一个分布式限流

    分布式---基于Redis进行接口IP限流 场景 为了防止我们的接口被人恶意访问,比如有人通过JMeter工具频繁访问我们的接口,导致接口响应变慢甚至崩溃,所以我们需要对一些特定的接口进行IP限流,即 ...

  3. 小程序 uni-app动态更改标题

    uni-app动态更改顶部标题 uni-app uni.setNavigationBarTitle({ title: '编辑班级荣誉' }) 小程序 wx.setNavigationBarTitle( ...

  4. Centos 7 单用户模式修改密码/配置

    1.启动系统,启动项界面显示时,按"↑↓"键停留在此界面,按下"e"键进入编辑模式 2.利用"↑↓"键找到"linux16&quo ...

  5. RowCellMenuCustomizations 实现 Command 绑定

    给GridControl的行数据单元格添加菜单项,并通过Command绑定的方式实现菜单点击动作触发: <dxg:GridControl x:Name="mainGrid" ...

  6. Prism 学习(一)

    转载自:http://www.cnblogs.com/Clingingboy/archive/2009/01/07/prism_part2.html 本篇将介绍Prism中Region的使用. 本篇D ...

  7. [NOI2014] 购票 题解

    首先发现 \(p_x\times dis(x,y)+q_x\) 异常像是能斜率优化的样子,那先把求 \(f_x\) 的式子写出来(下设 \(d_x\) 表示 \(x\) 到根的距离): \[f_x=\ ...

  8. 傻妞PLUS机器人教程——安装

    特性 简单易用的消息搬运功能. 简单强大的自定义回复功能. 完整支持 ECMAScript 5.1 的插件系统,基于 otto. 支持通过内置的阉割版 Express / fetch ,接入互联网. ...

  9. [rustGUI][iced]基于rust的GUI库iced(0.13)的部件学习(06):基于iced实现一个简单的图片浏览器

    前言 本文是关于iced库的部件介绍,iced库是基于rust的GUI库,作者自述是受Elm启发. iced目前的版本是0.13.1,相较于此前的0.12版本,有较大改动. 本合集是基于新版本的关于分 ...

  10. 【编程思维】临近实施 WPF 下拉框闪烁问题!!

    私以为架构是业务开发的发展历史,顺应大方向而生,再为贴切时刻的用户需求,持续微改动. 我本以为了解这个软件的架构没甚意思,加快的开发速度不能过渡到下一个别的软件去: 却不知以小窥大,关键还是计算机思维 ...