自然语言处理Transformer模型最详细讲解(图解版)

近几年NLP较为流行的两大模型分别为Transformer和Bert,其中Transformer由论文《Attention is All You Need》提出。该模型由谷歌团队开发,Transformer是不同与传统RNN和CNN两大主流结构,它的内部是采用自注意力机制模块。

前排提示,文末有大模型AGI-CSDN独家资料包哦!

该模型在WMT 2014英语到法语的翻译任务中达到了28.4BLEU,Transformer具有良好的并行性,能够很多地推广到其它任务中。

在本篇文章中,我们将对Transformer模型进行讲解,并逐一介绍内部的各个组件,希望能够让刚学习Transformer的同学可以轻易理解它的运行机理。

1、Transformer整体架构

下图为从原论文中截取中的Transformer架构图,可以看出主要分别为两个部分,分别是Encoder和Decoder:

2、Transformer的输入、输出

那么Transformer是怎样运作的呢?它的输入和输出是什么呢?

由上图,可以看到Transformer由Encoder和Decoder两个部分组成,而且编码器和解码器都包含6个block(原论文中是默认6个块)。

下面以机器翻译(由中文我爱你翻译为英文I love you)为例来讲解Transformer的运作机理

2.1 Transformer的输入

对于上图整个模型的输入是中文我爱你,我们的目标是将其翻译成英文的I love you,但是对于中文我爱你模型是无法训练的,我们需要将其数值化再送入模型当中。

对于将中文转成数值一般是有两种方法:

One Hot编码:形成高维向量,向量的维度为词袋大小,如果是中文,向量的维度就是所有汉字的数量,然后是哪个字就将对应位置变为1,其它位置为0

Embedding词嵌入:通过网络进行训练或者通过一些训练好的模型将其转化成连续性的向量

一般来说第二种方法使用较多,因为第一种有几个缺点,第一个就是每个字都是相互独立的,缺少语义联系信息,第二就是汉字数量太多,会导致生成的维度过大,占用系统内存。

2.1.1 Word Embedding(词嵌入)

对于Embedding有很多方式可以获得,可以使用一些预训练好的模型得到,比如word2vec,另外也可以自己训练得到。

通过图来说明,到底是如何转换的:

通过Embedding会将每个字形成一个连续型向量,这里假设嵌入维度为5,所以是使用一个维度为5的向量来表示一个字。

嵌入后输入的向量维度为【序列长度,嵌入维度】,【3,5】

2.1.2 Positional Encoding(位置编码)

由于Transformer中使用的是自注意力机制来提取信息,虽然处理每个字的时候能够考虑到所有字对其的影响,但是并没有考虑到各个字相互之间的位置信息,也就是上下文,例如如果输入序列变为爱我你,如果仅使用自注意力机制那么输出应该是一样的,所以需要添加整个序列的位置信息。

在Transformer中使用的是位置编码来表示单词的顺序信息,位置信息也是通过Embedding进行表示,对于位置编码来说有两种方式可以得到:

通过Embedding进行训练

通过公式计算

Transformer中使用的是后者:

这样就会将每个位置信息进行编码,然后将这个编码信息和对应位置词的编码进行相加,让自注意力机制同时考虑词的顺序信息,同时又可考虑到所有输入的词。

2.2 Transformer的输出

对于Transformer的输出就是我们翻译出的I love you,由于我们需要预测出每个字需要翻译为哪个词,所以这显然是个多分类问题(Softmax),相当于做词个数个多分类问题,每个位置对应的输出的维度应为所有单词的个数,每个维度对应预测为该词的概率,概率最大位置对应的词就是该位置预测出翻译的词。

我们会输出n个词,每个词对应的维度为词袋的个数,第一个位置预测为I,说明对应该向量I单词对应的概率最大。

3、Self-Attention(自注意力机制)

Transformer中最重要的模块就是自注意力机制,所以这里重点讲解一下Self-Attention,自注意力机制有三个输入,分别是Q(查询)、K(键)、V(值)。

3.1 Self-Attention整体架构

下图是注意力机制的图解:

注意力机制有几个步骤:

根据输入向量x计算对应q、k、v

用自己的查询向量q和其它词的k做点积来计算注意力分数

将得到的注意力分数进行Softmax

将注意力分数与各个词的v向量相乘得到加权表示向量

经过注意力机制后我们就会得到词个数个新的编码向量,新的编码向量由于采用了注意力机制就会考虑到其它词对其的影响,影响程度就由注意力分数所影响。

3.2 Q、K、V的计算

为了得到Q、K、V,我们需要使用三个不同的权重矩阵,然后与输入矩阵相乘,然后将输入矩阵X映射到一个新的维度空间,然后就可以利用得到的Q、K、V计算相应的注意力分数和加权向量。

得到的Q、K、V行代表的是每个词,就是每个词对应的q向量

3.3 Self-Attention的计算过程

由上面可知Q、K、V矩阵,然后我们利用Q和K相乘得到不同词之间的注意力分数

为了提高并行度,我们利用矩阵进行运算,将Q和K的转置相乘,这样就会得到一个方型矩阵,矩阵的每个元素代表每个词对其它词的注意力分数。

然后我们会对得到的注意力分数进行Softmax操作来归一化,这样每一行的分数加起来就为1。

然后利用归一化后的注意力分数然后与V进行相乘得到各个词的加权向量,得到的Z每一行代表每个词的新的编码向量。

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

但是Transformer中采用的是Multi-Head Attention(多头注意力机制),它可以类比CNN中的多个kernel,CNN中每个kernel可以理解为提取不同模式的特征图,所以这里也引入了这个机制,不同的头可以提取出不同的语义信息。

多头注意力机制就是采用了多个的Self-Attention,这样每一次就会得到多组的Z,比如这里我们设置头的个数为8,那么我们就会得到8个Z矩阵。

我们会将输入向量X分别送入8个不同的头中,就是8个不同个自注意力机制模块,每个模块拥有自己的参数(Wq,Wk,Wv)。

得到了8个输出矩阵Z1,Z2…Z8之后,然后把这个8个矩阵拼接起来,然后利用全连接网络将其映射成一个与输入向量X形状一致的矩阵。

Multi-Head Attention输出的矩阵Z和输入矩阵X的维度是一致的。

4、Encoder结构

Encoder是由Multi-Head Attention、Add & Norm、Feed Forward、Add & Norm四个小模块组成的,下面将详解介绍各个部分,我将根据文章开始给出的我爱你实例进行讲解。

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

在上面注意力机制中我们已经讲解了多头注意力机制的原理,以及其对应的输入和输出。

第一个Encoder块的输入是中文我爱你的嵌入向量,维度是【词个数,嵌入维度】,也就是【3,5】,然后经过多头注意力机制进行特征提取,会得到多个输出Z向量,也就是每个头提取出不同模式的矩阵,维度是【词个数,隐向量维度】。

然后我们将各个头对应的Z矩阵进行拼接,形成一个大矩阵维度为【词个数,头个数*隐向量维度】,然后我们将其喂入一个全连接网络,然后会映射成为一个与输入向量形状一致的Z矩阵,这样目的就是能够保持最终的输出向量和输入维度一致,因为Transformer中采用了残差结构,以便于能够相加。

最终的Z矩阵每一行就是经过多头注意力机制提取后每个词对应的编码向量。

注意:第一个Encoder块的输入是第一个Encoder块的输入是中文我爱你的嵌入向量,而之后的Encoder块的输入是每个块的输出,因为维度是一致的,都为【词个数,词嵌入维度】。

4.2 Add & Norm

Add & Norm是分成两个部分,一个是残差结构,一个是LayerNorm,其计算公式如下:

Encoder中有两处使用了残差结构:

第一处是将输入矩阵X与经过多头注意力机制得到的Z相加,第二处是将输入向量与经过FeedForward网络的输出相加

采用残差结构主要是为了解决网络难以训练的问题,有了残差结构我们就可以把网络做的更深,现很多深层的神经网络都使用了残差结构。

LayerNorm是指Layer Normalization,他与Batch Normalization是不同的,对于Batch Normalization我们会对同一批次的所有样本的同一特征计算均值和方差,但是对于文本问题,一般来将我们的序列长度是不一致的,所以无法对于同一特征进行计算,所以这里采用了Layer Normalization,它的意思就是对于同一样本的所有特征计算均值和方差。对于Batch Normalization来将,是计算蓝色截面的均值和方差,而Layer Normalization来讲是计算黄色截面的均值和方差。

4.3 Feed Forward

Transformer中的Feed Forward就是普通的全连接网络,激活函数使用的是ReLU

但注意一点,由于我们输入数据是我爱你,那么经过多头注意力机制及残差网络后得到的输出向量为Z,维度为【词个数,嵌入维度】,这个全连接网络会对每个词输出的Z向量进行转换,并不是有3个全连接网络,而是和RNN差不多,是使用了一个全连接网络参数共享。

处理每个字的全连接网络是一个,这是参数共享的,并不是说为每个字都分配一个网络。

4.4 最后层的输出

经过6个Encoder个层堆叠后,最后一层的输出就是整个Encoder的输出,输出的维度为【词个数,嵌入向量维度】,也就是和Z一样的形状。

这个Z需要传入到Decoder中计算相应的K和V,下面会进行讲解。

5、Decoder结构

上图为Transformer中的Decoder结构,和Encoder是差不多的

每个Decoder Block有两个Multi-Head Attention层

第一个Multi-Head Attention层采用了Masked操作

第二个Multi-Head Attention层的K、V矩阵输入源来自Encoder的输出编码矩阵,而Q矩阵是由经过Add & Norm层之后的输出计算来的

5.1 Masked Multi-Head Attention(带掩码的多头注意力机制)

Decoder中的第一个Multi-Head Attention是采用了Masked的操作,他和普通的多头注意力机制计算上来将是一致的,只是多了个掩码矩阵,用于遮盖当前输入后面的数据,不让当前时间模型知道后面的答案是什么。

Transformer的训练方式和其它模型不太一样,他在训练过程是采用了Teacher Forcing的训练模型,就是会将原始输入和正确答案都会喂给模型,然后模型进行训练,而在推理过程中,是不会给正确答案的,至于训练和推理有什么具体区别下面会讲,这里先了解Transformer在训练时会把原始输入为给Encoder形成编码向量,然后将正确答案喂给Decoder的第一层。

比如对于我们的例子我爱你来说,首先会把我爱你的Embedding嵌入送入Encoder中,然后把<开始> I love you的编码向量送入Decoder中,这个<开始>是个标志表示开始翻译,它也是个向量表示。

对于翻译我爱你来说,它是要按照顺序翻译的,就是首先把我翻译成I,然后是翻译love,最后是you,但是我们在训练会把正确答案喂给模型,如果这样注意力机制就会看到所有的信息,所以要采用掩码机制来遮盖当前词后面的信息,防止模型知道之后单词的信息。

首先会根据开始标志预测出第一个单词翻译 “I”,然后根据输入 “<开始> 我” 去预测下一个单词 “love” ,最后会根据所有输入 "<开始> 我 爱 你"去预测结束标志。

这里要着重说明一下,防止同学们混淆,这个掩码只是在第一个注意力机制使用,第二个是没有用的,因为第一个注意力机制接收的输入为正确答案,在预测当前单词的翻译是我们是不能够让他知道正确答案的,只能根据前面已经翻译出来的内容进行推理,有同学会问,翻译一句话不是应该要看一整句话嘛,就是要结合上下文信息,没错是这样的,但是你看的整句话语义信息是原始输入的,也就是我爱你中文信息,这也就是Encoder的输出结果,这也就是为什么第二个注意力机制需要Encoder的输出结果。

那么掩码矩阵是如何发挥作用的呢?

第一步:构造掩码矩阵Mask,目的就是为了遮盖当前位置之后的信息,由于我们的输入词个数为3,所以我们会形成一个 3* 3 的掩码矩阵,矩阵绿色代表当前位置是否可利用,第一个单词只可利用自身,第二个单词则可利用自身和前一个单词,而最后一个则可利用所有信息。

第二步:接下来和普通注意力机制是一样的,通过输入矩阵,计算出Q、K、V矩阵

第三步:然后利用Q和K矩阵计算出对应的注意力分数

第四步:将上一步得到的注意力分数进行归一化操作,使每一行的概率和为1

第五步:将归一化后的注意力分数与掩码矩阵按位相乘,这样就会得到一个遮盖后的注意力分数矩阵,然后我们说明一下,对于QK矩阵来说,每一行是每个单词对其它单词的注意力分数,为了不让当前位置看到单词的信息,所以我们要将当前位置单词之后的注意力分数变为0,这样注意力机制就只会参考前面出现的信息。

第六步:使用Mask矩阵与V矩阵相乘得到输出矩阵Z,这样每个词的输出向量就只包含它之前单词的信息。

第七步:和多头注意力机制一样,将每个头的输出矩阵Z进行拼接,然后使用全连接网络将其映射成和输入矩阵X维度一样。

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

Decoder中的第二个Multi-Head Attention其实和Encoder中的是一样的,只不过输入的Q、K、V数据来源不一样,K、V矩阵是由Encoder最后一层输出计算得来的,而Q矩阵是由经过第一个掩码注意力机制后的矩阵计算得来的。

这里是不需要Mask的,因为在翻译过程需要看所有单词的信息,就是我爱你所有上下文信息都要看到,这也是为什么要从Encoder的输出矩阵计算K和V,Encoder的最终输出可以理解为整句话的最终编码信息,包含了所有的语义信息。

具体的计算过程这里就不图解了,和之前是一样的,只需记住Q、K、V的来源不同就可以了。

5.3 Decoder的输入

对于Decoder的输入分为第一个Decoder Block和之后的Block,第一个Block输入的是Ground Truth,也就是我们的真实答案的嵌入向量,而之后block的输入为前一个块的输出。

5.4 Decoder的输出

对于我们的翻译任务来说,需要预测每个字的概率,那么我们就需要使用Softmax来预测所有可能词的概率,比如我们的词库有I、love、you、today、me这五个单词,那么对于我们的一个词 “I” 的输出就为 【0.5,0.1,0.1,0.2,0.1】,由于对应 “I” 位置的概率最大,所以第一个单词预测为 “I”。

经过Softmax后,每一行的概率和为1,每一行预测出的词就为概率最大的一个。

6、Transformer训练和推理过程

训练过程:

对于训练过程,我们是将原始输入和正确答案一同输入的,训练过程采用Teacher Forcing,而对于正确答案输入是采用了Mask操作,就是为了不让模型看到当前词之后的信息,这是可以并行进行的。

推理过程:

但是对于推理过程,是不会输入正确答案的,而且和RNN运行差不多是一个一个的,首先会给Decoder输入开始标志,然后经过Decoder会预测出 “I” 单词,然后拿着这个 “I” 单词继续喂入Decoder去预测 “love”,但后拿着 “love” 去预测 “you” ,最后拿着 “you” 去预测结束标志。

对于翻译任务来说,这是序列到序列的问题,显然每次的输出序列的长度是不一致的,所以需要一个结束标志来表明这句话已经翻译完成,所以需要按顺序一个一个翻译,不断拿着已经翻译出的词送入模型,知道预测出结束标志为止。

读者福利:如果大家对大模型感兴趣,这套大模型学习资料一定对你有用

对于0基础小白入门:

如果你是零基础小白,想快速入门大模型是可以考虑的。

一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。

包括:大模型学习线路汇总、学习阶段,大模型实战案例,大模型学习视频,人工智能、机器学习、大模型书籍PDF。带你从零基础系统性的学好大模型!

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

👉AI大模型学习路线汇总👈

大模型学习路线图,整体分为7个大的阶段:(全套教程文末领取哈)

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

👉大模型实战案例👈

光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉大模型视频和PDF合集👈

观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述
在这里插入图片描述

👉学会后的收获:👈

• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

👉获取方式:

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员二飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值