首页 > 其他分享 >Transformer简介

Transformer简介

时间:2024-04-02 09:33:37浏览次数:26  
标签:Transformer 简介 Attention Multi Head Encoder 单词

参考:https://www.zhihu.com/tardis/bd/art/600773858?source_id=1001

Transformer是谷歌在2017年的论文《Attention Is All You Need》中提出的,用于NLP的各项任务

1、Transformer整体结构

在机器翻译中,Transformer可以将一种语言翻译成另一种语言,如果把Transformer看成一个黑盒,那么其结构如下图所示:

image-20240329173757838

拆开这个黑盒,那么可以看到Transformer由若干个编码器和解码器组成,如下图所示

image-20240329173848232

继续将Encoder和Decoder拆开,可以看到完整的结构,如下图所示:

img

可以看到Encoder包含一个Muti-Head Attention模块,是由多个Self-Attention组成,而Decoder包含两个Muti-Head Attention。Muti-Head Attention上方还包括一个 Add & Norm 层,Add 表示残差连接 (Residual Connection) 用于防止网络退化,Norm 表示 Layer Normalization,用于对每一层的激活值进行归一化。

假设我们的输入包含两个单词,我们看一下Transformer的整体结构:

image-20240329174849815

为了能够对Transformer的流程有个大致的了解,我们举一个简单的例子,还是以之前的为例,将法语"Je suis etudiant"翻译成英文。

  • 第一步:获取输入句子的每一个单词的表示向量 \bm{x}\bm{x} 由单词的Embedding和单词位置的Embedding 相加得到。

img

  • 第二步:将单词向量矩阵传入Encoder模块,经过N个Encoder后得到句子所有单词的编码信息矩阵C,如下图。输入句子的单词向量矩阵用$ X \in{R} ^ {n \times d}$表示,其中n是单词个数,d表示向量的维度,每一个Encoder输出的矩阵维度与输入完全一致。

image-20240329175704213

  • 第三步:将Encoder输出的编码矩阵C传递到Decoder中,Decoder会根据当前翻译过的单词1~i,翻译下一个单词i+1,如下图所示。

    image-20240329175855395

上图Decoder接收了Encoder的编码矩阵,然后首先输入一个开始符 "",预测第一个单词,输出为"I";然后输入翻译开始符 "" 和单词 "I",预测第二个单词,输出为"am",以此类推。这是Transformer的大致流程,接下来介绍里面各个部分的细节。

2、Transformer的输入表示

Transformer中单词的输入表示由单词Embedding位置Embedding(Positional Encoding)相加得到。

image-20240329180128486

2.1、单词Embedding

单词的Embedding可以通过Word2vec等模型预训练得到,可以在Transformer中加入Embedding层。

2.2、位置Embedding

Transformer 中除了单词的Embedding,还需要使用位置Embedding 表示单词出现在句子中的位置。因为 Transformer不采用RNN结构,而是使用全局信息,不能利用单词的顺序信息,而这部分信息对于NLP来说非常重要。所以Transformer中使用位置Embedding保存单词在序列中的相对或绝对位置。

3、Multi-Head Attention(多头注意力机制)

image-20240329180320385

上图是Transformer的内部结构,其中红色方框内为Multi-Head Attention,是由多个Self-Attention组成,具体结构如下图:

image-20240329180844558

因为Self-Attention是Transformer的重点,所以我们重点关注 Multi-Head Attention 以及 Self-Attention,首先介绍下Self-Attention的内部逻辑。

3.1 Self-Attention结构

image-20240329180814340

上图是Self-Attention结构,最下面是Q查询、K键值、V值矩阵,是通过输入矩阵X和权重矩阵Wk,Wq,Wv相乘得到的。

image-20240330095325000

得到Q,K,V之后就可以计算出Self-Attention的输出,如下图所示:

image-20240330095415600

3.2 Multi-Head Attention输出

在上一步,我们已经知道怎么通过Self-Attention计算得到输出矩阵Z,而Multi-Head Attention是由多个Self-Attention组合形成的,下图是论文中Multi-Head Attention的结构图。

image-20240329180933250

从上图可以看到Multi-Head Attention包含多个Self-Attention层,首先将输入X分别传递到 h个不同的Self-Attention中,计算得到 h 个输出矩阵 Z。下图是h=8的情况,此时会得到 8 个输出矩阵Z 。

image-20240330095626326

得到8个输出矩阵 \({Z}_0\sim {Z}_7\)后,Multi-Head Attention将它们拼接在一起(Concat),然后传入一个Linear层,得到Multi-Head Attention最终的输出矩阵Z 。

image-20240330095743425

4、编码器Encoder结构

image-20240330095948902

上图红色部分是Transformer的Encoder结构,N表示Encoder的个数,可以看到是由Multi-Head Attention、Add & Norm、Feed Forward、Add & Norm组成的。前面已经介绍了Multi-Head Attention的计算过程,现在了解一下Add & Norm和 Feed Forward部分。

4.1 单个Encoder输出

Add & Norm是指残差连接后使用LayerNorm,表示如下:

\[Add \& Norm :\text{LayerNorm}\left( {X}+\text{Sublayer}\left( {X} \right) \right)\tag1 \]

Sublayer表示经过的变换,比如第一个Add & Norm中Sublayer表示Multi-Head Attention。

Feed Forward**是指全连接层,表示如下:

\[\text{FFN}\left( {X} \right)=\text{max}\left( 0, {XW_1}+b_1\right){W}_2+b_2\tag2 \]

因此输入矩阵X经过一个Encoder后,输出表示如下:

\[{O}=\text{LayerNorm}\left( {X}+\text{Multi-Head-Attention}\left( {X} \right) \right)\tag3 \]

\[{O}=\text{LayerNorm}\left( {O}+\text{FFN}\left( {O} \right) \right) \tag4 \]

4.2 多个Encoder输出

通过上面的单个Encoder,输入矩阵 ${X}\in \mathbb{R}^{n\times d} $,最后输出矩阵 \({O}\in \mathbb{R}^{n\times d}\)。通过多个Encoder叠加,最后便是编码器Encoder的输出。

5、解码器Decoder结构

image-20240330110358782

上图红色部分为Transformer的Decoder结构,与Encoder相似,但是存在一些区别:

  • 包含两个Multi-Head Attention
  • 第一个Multi-Head Attention采用了Masked操作
  • 第二个Multi-Head Attention的\({K},{V}\) 矩阵使用Encoder的编码信息矩阵\({C}\)进行计算,而 \({Q}\)使用上一个 Decoder的输出计算
  • 最后有一个Softmax层计算下一个翻译单词的概率

5.1、第一个Multi-Head Attention

Decoder的第一个Multi-Head Attention采用了Masked操作,因为在翻译的过程中是顺序翻译的,即翻译完第\(i\)个单词,才可以翻译第 \(i+1\)个单词。通过 Masked 操作可以防止第\(i\)个单词知道\(i+1\)个单词之后的信息。下面以法语"Je suis etudiant"翻译成英文"I am a student"为例,了解一下Masked 操作。

在Decoder的时候,需要根据之前翻译的单词,预测当前最有可能翻译的单词,如下图所示。首先根据输入""预测出第一个单词为"I",然后根据输入" I" 预测下一个单词 "am"

image-20240330112929439

Decoder在预测第i个输出时,需要将第i+1之后的单词掩盖住,Mask操作是在Self-Attention的Softmax之前使用的,下面以前面的"I am a student"为例。

第一步:是Decoder的输入矩阵和Mask矩阵,输入矩阵包含" I am a student"4个单词的表示向量,Mask是一个\(4\times4\) 的矩阵。在Mask可以发现单词""只能使用单词""的信息,而单词"I"可以使用单词" I"的信息,即只能使用之前的信息。

image-20240330113729209

第二步:接下来的操作和之前Encoder中的Self-Attention一样,只是在Softmax之前需要进行Mask操作。

image-20240330114202484

第三步:通过上述步骤就可以得到一个Mask Self-Attention的输出矩\(Z_{i}\),然后和Encoder类似,通过Multi-Head Attention拼接多个输出!\(Z_{i}\)然后计算得到第一个Multi-Head Attention的输出\({Z}\) , \bm{Z} 与输入\(X\)维度一样。

5.2、第二个Muti-Head Attention

  • Decoder的第二个Multi-Head Attention主要的区别在于其中Self-Attention的 \({K},{V}\)矩阵不是使用上一个Multi-Head Attention的输出,而是使用Encoder的编码信息矩阵$ { C } $ 计算的。
  • 根据Encoder的输出 \({C}\)计算得到\(K,V\),根据上一个Multi-Head Attention的输出$ {Z} \(计算\)Q$。这样做的好处是在Decoder的时候,每一位单词(这里是指"I am a student")都可以利用到Encoder所有单词的信息(这里是指"Je suis etudiant")。

6、Softmax预测输出

image-20240330142829074

编码器Decoder最后的部分是利用 Softmax 预测下一个单词,在Softmax之前,会经过Linear变换,将维度转换为词表的个数。假设我们的词表只有6个单词,表示如下:

image-20240330142901466

最后的输出为

image-20240329181039677

7、总结

Transformer由于可并行、效果好等特点,如今已经成为机器翻译、特征抽取等任务的基础模块,目前ChatGPT特征抽取的模块用的就是Transformer,这对于后面理解ChatGPT的原理做了好的铺垫。

标签:Transformer,简介,Attention,Multi,Head,Encoder,单词
From: https://www.cnblogs.com/xine/p/18109880

相关文章

  • [Paper Reading] VQ-GAN: Taming Transformers for High-Resolution Image Synthesis
    名称[VQ-GAN](TamingTransformersforHigh-ResolutionImageSynthesis)时间:CVPR2021oral21.06机构:HeidelbergCollaboratoryforImageProcessing,IWR,HeidelbergUniversity,GermanyTL;DRTransformer优势在于能较好地长距离建模sequence数据,而CNN优势是天生对局部......
  • 视觉Transformer和Swin Transformer
    视觉Transformer概述ViT的基本结构:①输入图片首先被切分为固定尺寸的切片;②对展平的切片进行线性映射(通过矩阵乘法对维度进行变换);③为了保留切片的位置信息,在切片送入Transformer编码器之前,对每个切片加入位置编码信息;④Transformer编码器由L个Transformer模块组成,每个模......
  • ET8开源游戏:英雄传说(零)简介与总目录篇
    《英雄传说》是一个基于ET8.1的双端C#(Client-Unity3D,Server:.Net8)开发的在线联网多人竞技游戏。当前文章主要做此Demo的技术分解,主要是战斗系统跟状态同步的技术分享,大伙有想法的欢迎评论区讨论,后续会逐步迭代分享写完:(一)鲁班配置表方案集成与使用(二)YooAsset介绍与使用,加密(......
  • nodejs做中间层_Nodejs 之 RPC 协议简介
    背景随着Nodejs的兴起,越来越多的Web服务中间层被搭建起来。如Node服务端渲染,BFF(BackendForFrontend))层,而RPC是远端过程调用,经常用于BFF层。最近,我打算写一个中间层,用Nodejs调用Go服务,除了可以简单用http调用之外,发现还有基于RPC的调用就研究了一下。RPC简......
  • Yii2架构简介
    Yii2架构简介Yii2是一个基于组件的PHP框架,它遵循MVC(Model-View-Controller)架构模式。以下是一个简化的Yii2应用程序的基本架构代码概述,以便你可以更好地理解其组成部分和工作原理。目录结构一个典型的Yii2应用程序的目录结构如下:/├──commands/#命......
  • 学习transformer模型-Dropout的简明介绍
    Dropout的定义和目的:Dropout是一种神经网络正则化技术,它在训练时以指定的概率丢弃一个单元(以及连接)p。这个想法是为了防止神经网络变得过于依赖特定连接的共同适应,因为这可能是过度拟合的症状。直观上,dropout可以被认为是创建一个隐式的神经网络集合。PyTorch的nn.Drop......
  • 【Zabbix系列】--1、简介
    日常工作中,IT需要对维护的设备和业务系统进行监控和预警,以便当出现问题时能及时预警。监控系统无疑是重要性最高的机制之一,但它却常常遭到我们的忽视。如果能够建立起一套坚实的监控系统来针对可能发生的故障加以警示,我们就有机会迅速启动应急方案和故障排除,这对于任何规模的企业......
  • 方法区及元空间简介
    什么是方法区?方法区属于是JVM运行时数据区域的一块逻辑区域,是各个线程共享的内存区域。《Java虚拟机规范》只是规定了有方法区这么个概念和它的作用,方法区到底要如何实现那就是虚拟机自己要考虑的事情了。也就是说,在不同的虚拟机实现上,方法区的实现是不同的。当虚拟机要使......
  • React Native简介和环境配置,差点挂在第四面
    ReactNative目前需要NodeJS5.0或更高版本。本文发布时Homebrew默认安装的是最新版本,一般都满足要求。brewinstallnode安装完node后建议设置npm镜像以加速后面的过程(或使用科学上网工具)。注意:不要使用cnpm!cnpm安装的模块路径比较奇怪,packager不能正常识别!npmconfig......
  • 1.python简介
    """python简介python版本:python-V或python--versionpython特色:1.python是一种解释性语言:这意味着开发过程中没有编译这个环节。类似于PHP和Perl2.python是交互式语言:这意味着可以在一个python提示符>>>后直接执行代码3.python是面向对象语言:这意味着python支持面向......