Transformer模型的多头注意力机制,非常通俗的讲解

Transformer模型最核心的内容就是多头自注意力机制

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

今天的这篇文章,我希望能帮助同学们:

在没有学习过Transformer的情况下,快速的学习它的核心算法:

多头自注意力机制;

Multi Head Self Attention。

很多时候,如果我们想快速的学习一个特别复杂的模型,比如Transformer。

最好一开始,就能对它的核心结构,有一个基本的“认知”。

然后再去深入的探索这个模型的算法设计和代码实现。

这样能够让我们更快的学习和理解这个复杂的深度学习模型。

学习的过程,也会变得事半功倍!

“多头自注意力机制”,就是Transformer的核心结构。

观察Transformer模型,会看到其中包含了3个用橙色标记的“多头自注意力”。

这些橙色标记的“多头自注意力”的内部结构,长成下面这个样子:

接下来,我们就开始深入、详细的讨论,Transformer的“多头自注意力机制”。

讲解包括以下3个部分:

1.多头自注意力机制,到底是什么?

2.输入给多头自注意力的Q、K、V,是什么?

3.如何使用Q、K、V,计算多头自注意力?

1.多头自注意力机制,到底是什么?

我们需要快速对“多头自注意力”,有一个基本认识。

简单来说,它就是一个“超级复杂”的线性层组合体。

在这个超级复杂的线性层中,包含了许多组子线性层。

实际上,我们一开始去理解它,就把它当做是一个线性层就好了。

因为它最主要的功能,与线性层(nn.linear)一样,就是:

对输入的张量x,进行特征变换。

下面这张图,就表示了“多头自注意力机制”的计算过程。

为了观察的方便,我将多头自注意力的结构图“横着”摆。

观察设计图,可以看到:

多头注意力机制,包括了很多组“子线性层”;

图中标注的深浅不一的“Linear”,都是它的“子线性层”。

在这些子线性层中,包含了数量极为庞大的w和b参数。

这些w和b参数,就是用于对输入x,进行特征变换的!

它们的工作方式,与nn.Linear中的w和b的工作方式,并没有本质的不同。

当然了,这么多子线性层的计算,并且计算过程中还包含了:

Scaled Dot Product Attention(缩放点积注意力)和concat(多头结果合并)

这肯定会比普通的线性层计算更复杂。

这里这样解释,只是为了让大家对“多头自注意力”有基本的“认知”。

“多头自注意力”整体的功能和目标,仍然是“特征变换”。

当我们将输入序列的张量x,输入到“多头自注意力”后;

就会使用这些w和b参数,对x进行一系列的“复杂计算”。

最终输入x就会被“多头自注意力”,变换为一个新的张量x’。

此时我们会发现x和x’,它们具有完全一样的尺寸!

也就是如果x是3×5×4大小的张量,那么x’也是3×5×4大小的张量。

这时可能有同学可能会困惑,为什么要整这么复杂呢?

将x变换到x’,而x’似乎什么都没变?(至少尺寸完全没变)。

简单来说,特征变换后,x’会包含更多的信息,更能体现x本身的语义信息。

也就张量x’里面的那堆浮点数,更能表达原始输入序列的意义。

上述的解释都是为了表达:

经过自注意力的计算后,x’就包含了x中的“上下文”信息。

同学们此时如果不太明白也也没关系,只要知道:

“多头自注意力”的核心作用,就是对“输入张量x”进行特征变换。

而这个特征变换后的x’,会带有“全局上下文信息”;

对原始的输入序列,有着更好的“理解”和“表示”,就可以了。

2.输入给多头自注意力的Q、K、V,是什么?

在Transformer的编码器中,有一个“多头自注意力”。

在Transformer的解码器中,有两个“多头自注意力”。

这三个“多头自注意力”的内部结构和代码实现是完全相同的。

不同的地方是“输入数据”和对数据的“Masked掩码方式”不同。

备注:这块如果详细说,比较耗时,所以我就不深入探讨了。

同学们只要知道,这三个橙色的方块,都是“多头自注意力”;

其中的内部计算过程,是完全相同的,就可以了!

在讨论这个橙色方块内部的计算过程之前,我们要讨论它的输入数据。

我们以“编码器”中的橙色方块为例来说明。

备注:“编码器”中的多头自注意力和“解码器”中的内部结构和计算过程都一样,

但是由于“编码器”的输入更简单,所以更好讲。

上图的左侧是编码器,其中有一个橙色方块代表多头自注意力。

右侧是橙色方块的内部结构。

观察“多头自注意力”内部结构,可以看到,它包括了3个输入和一个输出。

这3个输入被称为,查询(Query)、键(Key)、和值(Value)。

Q、K、V这三组张量,其中保存的数据可以是相同的,也可以是不同的。

比如输入给解码器的“Q、K、V”就是相同的。

在最初理解多头自注意力时,其实并不需要关注Q、K、V所代表的具体含义。

什么是“查询(Query)”?

什么是“键(Key)”?

什么又是“值(Value)”?

这些根本就不重要,一上来去了解这么多概念,反而把简单的事弄得复杂。

我们在最初理解时,就把Q、K、V当做是三组输入张量,就可以了!

并且对于输入给解码器的多头自注意力的Q、K、V,还都来源于一个张量x!

这个张量x,就是Transformer左下方编码器的输入Inputs。

将Inputs序列输入至词嵌入层Embedding与位置编码Positional Encoding两个结构进行计算。

计算得到的x,就是Q、K、V!

也就是说,将x复制3份,变成Q、K、V,形成3个分支;

接着输入到橙色的多头注意力机制,再进行计算。

3.如何使用Q、K、V,计算多头自注意力?

多头,顾名思义,就是同时通过多个“自注意力机制”进行特征提取。

示意图中的不同颜色,就代表了“多头”。

简单来说,我们可以把“多头”理解成“多组”。

分成“多组”计算自注意力的原因是:

捕捉输入序列x,中不同子空间的特征。

如果你对这个描述不理解,那就别纠结了。

因为你完全可以将“多头”当做“单头”来理解“注意力机制”的计算,

并不影响对模型整体的理解。

备注:也就是把n_head这个参数当做是1就好了!无所谓的。

下面我们一步一步的来描述“多头自注意力机制”的计算过程。

第1步:对Q、K、V线性变换

上方的示意图,左侧表示了一个头的结构和右侧表示了其中的计算过程。

在每个“头”中,都有三组Linear线性层。

它们用于对输入张量Q、K、V进行线性变换。

所谓线性变换,就是将张量Q输入到qnet,计算出一个新的Q。

将张量K输入到knet,计算出一个新的K。

将张量V输入到vnet,计算出一个新的V。

第2步:计算缩放点积注意力

完成对Q、K、V的线性变换后,用新的Q、K、V这三组张量,计算缩放点积注意力。

也就是基于下方的公式,计算Scaled Dot Product Attention:

备注:对于这个公式的详细解释,这里就不说了;

因为想解释清楚,得用超级多的篇幅来说。

同学们可以直接将它就当做是一个张量的计算公式就好了。

简单来说,这个Attention计算的作用就是,将Q、K、V中信息进行“融合”。

融合后的输出,就有了全局信息。

第3步:融合多头计算的结果

每个头都会基于一组Q、K、V ,计算缩放点积注意力结果;

我们需要将这些不同头的计算结果拼接(concat)起来:

然后通过一个线性层进行融合,得到最终的输出张量。

这个输出张量的尺寸会和Q、K、V中的V,是一样的。

由于我们讨论的是解码器中的多头自注意力;

因此最终的输出结果,和最开始输入Q、K、V,都是一样的。

举例说明

下面我们基于一个具体例子,说明多头注意力的计算过程。

观察下方的示意图:

首先,输入的数据是,经过位置编码后的“You are welcome PAD”;

它对应最下方的黄色词向量矩阵。

第1步:对Q、K、V线性变换

4×6的输入张量,首先被复制为Query、Key和Value。

然后分别和3个Linear线性层做线性变换:

生成三组新的Q、K和V。

这里使用浅橙色、红色和深橙色来表示,尺寸都是4×6。

这个过程就是最基础的线性层计算。

第2步:计算缩放点积注意力

接着将q、k和v,三个计算结果,先split为多头的形式。

备注:split就是一种张量尺寸变换,可以忽略。

然后带入到Attention的计算公式中:

计算注意力机制的输出。

经过Attention的计算后,就会融合输入序列中的全局信息。

第3步:融合多头计算的结果

在示意图的最上方,Attention Score的输出是多组结果。

我们会使用一个线性层,将这些结果进行“Merge”,输出最终的一个结果。

我们会看到:

最下方的输入张量尺寸是4×6;

最上方的输出张量尺寸也是4×6;

备注:实际上中间的Q、K、V不一定是4×6大小的,示意图画的是4×6。

因此总结来说,整个多头注意力机制的作用,就是对输入张量进行特征变换!

变换后的输出张量,就带有了全局信息!

到这里,这篇“多头自注意力机制”的讲解,就说完了。

我知道里面还有很多细节没有讲到。

比如:

为什么计算Attention后,就能融合全局信息?

怎么用Pytorch实现多头自注意力?

这些问题,以后都会给大家讲的。

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

对于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、付费专栏及课程。

余额充值