掌握Transformer之深入多头注意力机制

news2024/9/20 6:10:55

01

引言

这是我关于Transformer系列的第三篇文章。在在前两篇文章中,我们了解了什么是Transformer、Transformer的架构以及其各组件的工作原理。在本文中,我们将进一步深入探讨多头注意力机制,它是Transformer的大脑。

闲话少说,我们直接开始吧!

02

Transformer中的Attention

正如我们在第二部分中所看到的,Transformer架构中的Attention主要有三个:

  • 编码器中的自注意力层 - 关注输入序列本身

  • 解码器中的自注意力层 - 关注输出序列本身

  • 解码器中的交叉注意力层 - 输出序列关注输入序列

Transformer中的Attention

Attention层的输入参数一共有三个,即Query,key和Value。这三个参数的结构相似,序列中的每个词都由一个向量表示。

03

编码器中的自注意力层

输入序列被送入嵌入层和位置编码层 ,它为输入序列中的每个单词生成相应的编码表示,以捕捉每个单词的含义和位置。该编码表示被送入第一个encoder中的自注意力层的三个参数Query,Key和Value中,通过计算注意力为输入序列中的每个单词添加相应的注意力得分;当这一过程通过编码器stack中的所有encoder时,每个注意力模块都会将自己的注意力分数添加到每个单词的编码表示中。

04

码器中的自注意力层

在解码器stack中,目标序列被送入输出嵌入层和位置编码层,为目标序列中的每个单词生成编码表示,捕捉每个单词的含义和位置。在第一个解码器中,这将被送入自注意力层中的三个参数:Query、Key和Value,然后解码器也会为目标序列中的每个单词生成一个编码表示,现在也包含了每个单词的注意力分数。

接着经过LayerNorm层后,该编码表示将送入第一个解码器中的交叉注意力层中的 参数Query中。

05

解码器中的交叉注意力层

与此同时,最后一个编码器的输出也会送入给解码器中的交叉注意力层中的 Value 和 Key 参数中。

因此,解码器中的交叉注意力层同时获得了目标序列的表示(来自解码器自注意力层的输出)和输入序列的表示(来自最后一个编码器的输出)。因此,解码器会为每个目标序列中的单词生成一个包含注意力分数的表征,该表征也会捕捉到输入序列中注意力分数的影响。

当它通过解码器stack中的所有解码器时,每个自注意力层和每个交叉注意力层也会将自己的注意力分数添加到每个单词的编码表示中。

06

多头注意力

在Transformer中,注意力模块会并行多次重复计算。每个并行计算称为一个 Attention Head。注意力模块将其Query、Key和Value进行 N 次拆分,并将每次拆分独立通过一个单独的注意力head头。然后,所有这些类似的注意力最后会合并在一起,产生最终的注意力分数。这就是所谓的多头注意力机制,使Transformer有更大的特征表示能力为每个单词编码多种关系。

为了确切了解其内部是如何处理数据的,让我们在训练Transformer解决翻译问题时,回顾一下注意力模块的工作过程。我们使用上节的翻译例子,包括一个输入序列(英语 “You are welcome”)和一个目标序列(西班牙语 “De nada”)。

07

Attention中的超参数

Attention中有三个超参数可以决定数据的维度。

  • Embedding Size : 嵌入向量的宽度(我们在示例中使用的宽度为 6)。这个维度贯穿整个Transformer模型,因此有时也被称为模型尺寸

  • Query Size: Query大小等于Key和Value的大小 – 三个线性层分别用于生成Query、Key和Value矩阵的权重大小(我们在示例中使用的Query大小为 3)。

  • 注意力头的数量(我们在示例中使用 2 个注意头)。

此外,我们还有参数batchsize,这为我们提供了一个样本数量维度。

08

输入层

输入嵌入层和位置编码层产生一个形状矩阵(Samples,Seq_len,Embedding_size),并将其输入送到编码器stack中第一个编码器的Query、Key和Value中。

为了简单直观,我们将放弃图片中的Batch这一维度,转而关注其余维度。

09

线性层

Query、Key和Value有三个独立的线性层。每个线性层都有自己的权重矩阵。输入通过这些线性层产生 Q、K 和 V 三个矩阵。

10

根据注意力头划分数据

现在,数据被分割到多个注意力头,以便每个注意力头都能独立处理部分数据。

不过需要注意的是,这只是逻辑上的切分。Query、Key和Value在物理上并没有被切分成单独的矩阵,每个Attention都对应一个单独的矩阵。所有注意力头共享同一个线性层,只是在自己的数据矩阵上运行。

11

根据注意力头划分线性层权重

这种逻辑分割是通过将输入数据和线性层权重均匀地划分到各注意头来实现的。我们可以通过选择Query Size来实现这一目标:

Query Size = Embedding Size / Number of heads

在我们的例子中,这就是QuerySize = 6/2 = 3 的原因。尽管权重(和输入数据)是一个单独的矩阵,但我们可以将其视为 "堆叠 "了每个头的单独权重。如下所示:

因此,所有注意力头的计算都可以通过单一的矩阵运算实现,而不需要 N 个单独的运算。这不仅提高了计算效率,还减少了所需的线性层,使模型保持简单,同时还能发挥单个注意力头的威力。

针对所有自学遇到困难的同学们,我帮大家系统梳理大模型学习脉络,将这份 LLM大模型资料 分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

👉[CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)]()👈

12

重塑QKV矩阵

线性层输出的 Q、K 和 V 矩阵经过reshape操作,包含了一个明确的head的维度。现在,每个切片都对应于每个head的一个矩阵。

通过交换heads维度和seq维度,该矩阵再次重塑。虽然没有绘制Batch维度,但现在Q的维度已经变成了(Batch、heads、seq_len、query_size)。

在下图中,我们可以看到从线性层出来后拆分示例 Q 矩阵的完整过程。

最后一个阶段只是为了形象化–虽然 Q 矩阵是一个单一的矩阵,但我们可以把它看作是逻辑上每个头互相独立的Q 矩阵的集合。

13

计算每个头的注意力得分

现在我们有了 3 个矩阵,即 Q、K 和 V,它们被分割到各个head中去。这些矩阵用于计算注意力得分。

我们将仅使用后两个维度(seq_len和query_size)来显示单个head的计算过程,而跳过前两个维度(batch和heads)。从本质上讲,我们可以想象,我们正在查看的计算正在 "重复 "批次中的每个头和每个样本。

第一步是在 Q 和 K 之间进行矩阵乘法运算。

现在会在结果中添加一个掩码值。在编码器的自注意力层中,掩码用于掩盖填充值,使其不参与注意力得分的计算。在解码器的自注意力层和解码器的交叉注意力层中会应用不同的掩码,我们稍后会在流程中介绍。

现在,将结果除以Query_size的平方根,然后对其应用Softmax操作。

Softmax 的输出与 V 矩阵之间再进行一次矩阵乘法运算。如下所示:

编码器自注意力层的完整注意力分数计算过程如下:

14

合并多头注意力得分

我们现在有了每个head的独立注意力得分,我们需要将它们合并成一个分数。合并操作本质上与拆分操作相反。

其方法是对结果矩阵进行简单reshape。具体步骤如下:

  • 通过交换维度heads和维度seq_len来重塑注意力得分矩阵。换句话说,矩阵形状从(batch、heads、seq_len、query_size)变为(batch、seq_len、heads、query_size)。

  • 通过reshape操作将其重塑为(batch、seq_len、heads * query_size)来折叠维度。这样就能有效地将每个头部的注意力分数向量合并成一个单一的合并注意力分数。

由于embedding_size=heads *query_size,因此合并后的注意力分数为(batch、seq_len、embedding_size)。在下图中,我们可以看到注意力得分矩阵合并的完整过程。

15

端到端的多头注意力

综上所述,这就是多头注意力的端到端处理流程。

16

多头注意力的优势

嵌入向量用以捕捉单词的含义。在多头注意力的情况下,正如我们所看到的,输入(和目标)序列的嵌入向量在逻辑上被分割成多个head。这有什么意义呢?

这意味着嵌入的不同部分可以学习每个单词不同方面的含义,因为它与序列中的其他单词相关。这使得Transformer可以捕捉到序列中更丰富的语义信息。

为了帮助大家理解,我们来看个例子:一个head可以捕捉名词的 “性别”(男、女、中性),而另一个head则可以捕捉单词的 “词性”(单数与复数)。这在翻译过程中可能很重要,因为在许多语言中,需要使用的动词取决于这些因素。

17

解码器中的自注意力和Mask

解码器中的自注意力层的工作原理与编码器中的自注意力层的功能相同,只是它对目标序列的每个单词进行操作。

同样,掩码mask也会屏蔽掉目标序列中的 "填充 "词。

18

解码器中的交叉注意力和Mask

解码器的交叉注意力层有两个输入来源。因此,与计算每个输入词与其他输入词之间交互作用的编码器自注意力层和计算每个目标词与其他目标词之间交互作用的解码器自注意力层不同,解码器中的交叉注意力层会计算每个目标词与每个输入词之间的交互作用。

因此,交叉注意力得分中的每个单元格都对应于一个 Q(即目标序列词)与所有其他 K(即输入序列)和所有 V(即输入序列)之间的相互作用。

同样,掩码mask也会屏蔽掉目标输出中后面的单词,这在本系列的第二篇文章中有详细说明。

19

结论

希望这篇文章能让大家对 Transformer 中的注意力模块有一个很好的了解。结合我们在第二篇文章中介绍的整个 Transformer 的端到端流程,我们现在已经介绍了整个 Transformer 架构的详细操作。

您学废了吗?

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

对于0基础小白入门:

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

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

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

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

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

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

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

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

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

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

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

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

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

👉大模型实战案例👈

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

在这里插入图片描述

👉大模型视频和PDF合集👈

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

👉学会后的收获:👈

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

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

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

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

👉获取方式:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2136146.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每天五分钟玩转深度学习PyTorch:模型参数优化器torch.optim

本文重点 在机器学习或者深度学习中,我们需要通过修改参数使得损失函数最小化(或最大化),优化算法就是一种调整模型参数更新的策略。在pytorch中定义了优化器optim,我们可以使用它调用封装好的优化算法,然后传递给它神经网络模型参数,就可以对模型进行优化。本文是学习第…

福建聚鼎科技:装饰画怎么运营更受大家喜欢

在繁华喧嚣的都市中,装饰画宛如一首无言的诗篇,静静地诉说着生活的美好。如何让这门艺术走进千家万户,成为装点空间、启迪心灵的一抹亮色?今天,我们就来探寻装饰画运营的秘诀,让它在市场的海洋中乘风破浪。 一幅优秀的…

Python+Pytest框架,“conftest.py文件编写如何获取token和获取日志“?

1、新增"conftest.py" import pytest import loggingfrom api_keyword.api_key import ApiKey from config import *# 获取token # 1. 正常的请求对应的接口并且提取数据 # 2. pytest.fixture()测试夹具(测试前置、后置操作)pytest.fixture(s…

黑神话悟空+云技术,游戏新体验!

近期,一款名为黑神话悟空的游戏因其独特的艺术风格和创新的技术实现在玩家中产生了不小的影响。 而云桌面技术作为一种新兴的解决方案,正在改变人们的游戏体验方式,使得高性能游戏可以在更多设备上流畅运行。 那么,黑神话悟空如…

大数据安全需求分析与安全保护工程

大数据安全威胁与需求分析 特征:海量是数据规模、快速的数据流转、多样的数据类型和价值密度低 种类和来源:结构化、半结构化和非结构化数据 数据种类: 结构化数据:关系模型数据,以关系数据库表形式管理的数据 非…

【FATFS】FATFS简介及下载

1、FATFS简介 FatFs 是一个针对嵌入式系统开发的通用文件系统模块,主要用于支持 FAT 文件系统。它最初由 ChaN 开发,并被广泛应用于嵌入式设备上。FatFs 以其轻量级、可配置和设备无关的特性著称,支持 FAT12、FAT16、FAT32 以及 exFAT 文件系…

还有人认为C++容器是线程安全的吗?

C标准库中的容器(如std::vector, std::list, std::map等)本身不是线程安全的、不是线程安全的、不是线程安全的,重要的事情讲三遍。这意味着如果你在多线程环境中同时访问(读或写)同一个容器实例,而没有进行…

力扣14.最长公共前缀

思路:将字符串数组中第一个字符串用作参考; 8.将他的长度作为范围,因为超范围了之后就不会再有公共前缀了 9.将字符串数组的长度也作为范围,意思是便利字符串数组中的字符串 11.开始第一层循环,依次遍历第一个字符串的…

Python代码:作为程序员这22个Python单行代码,你还不知道吗?

每个程序员都必须知道的22个Python单行代码是一个相对主观的列表,因为不同的程序员可能会根据自己的经验和需求来定义哪些代码是“必须知道”的。不过,我可以根据Python的常用性和实用性,为你提供一系列非常有用且简洁的Python单行代码及其源…

51单片机 - DS18B20实验1-读取温度

上来一张图,明确思路,程序整体裤架如下,通过单总线,单独封装一个.c文件用于单总线的操作,其实,我们可以把点c文件看成一个类操作,其属性就是我们面向对象的函数,也叫方法&#xff0c…

Linux echo,printf 命令

参考资料 【Linux】ハイフンをいっぱい出したかっただけなのに【printfコマンド】 目录 一. echo命令1.1 -n 选项1.2 -e 选项1.3 配合扩展实现批量换行输出1.3.1 xargs -n 11.3.2 tr \n1.3.3 xargs printf "%s\n"1.4 ANSI转义序列1.5 彩色文本输出 二. printf 命令…

Centos7安装gitlab-ce(rpm安装方式)

本章教程,主要介绍如何在Centos7安装gitlab-ce。 一、安装基础环境 安装gitlab-ce之前,我们需要安装一下jdk版本。 sudo yum install java-11-openjdk-devel二、下载安装包 这里我们下载的是rpm包。更多gitlab-ce版本可以在这里查看:https://…

果蔬识别系统架构+流程图

相关文章和代码 果蔬识别系统 果蔬识别系统优化(1~5) 架构图 流程图 初始化 识别流程 学习流程 同步流程 与初始化类似,只是同步只同步一个storeCode数据 删除数据流程 导入数据

无人机几种常见的避障系统!!!

1. 视觉避障系统 工作原理: 视觉避障系统通过安装在无人机上的摄像头捕捉周围环境的图像,利用计算机视觉技术对图像进行处理和分析,提取出障碍物的信息。 通过对障碍物的识别和分类,无人机可以判断出障碍物的性质和危险程度&am…

AI 时代程序员的挑战与机遇

你好,我是看山。 在当今数字化快速发展的时代,AIGC(如 ChatGPT、Midjourney、Claude 等)大语言模型如雨后春笋般接二连三的涌现,与此同时,AI 辅助编程工具也日益普及。 这一系列的变化使得程序员的工作方…

pdf文件怎么转换成ppt?介绍几种pdf转ppt的方法

pdf文件怎么转换成ppt?将pdf文件转换成ppt格式是一种常见且实用的需求,特别是在制作演示文稿和准备报告时。pdf格式因其文件内容的固定排版和高兼容性而广泛应用于文档的保存和分享。然而,在某些情况下,将pdf文件转换为ppt格式可以…

拒绝千篇一律,AI帮你定制独一无二的个人写真

每个女人都渴望展现最美的自己,你是否厌倦了拍出千篇一律的照片?今天,我要告诉你一个秘密,用简单三步,即可打造属于你的独一无二个人写真!文生图、蒙版换脸、图生图,三步化身超级模特&#xff0…

Java代码审计篇 | ofcms系统审计思路讲解 - 篇4 | XXE漏洞审计

文章目录 Java代码审计篇 | ofcms系统审计思路讲解 - 篇4 | XXE漏洞审计0. 前言1. XXE代码审计【有1处】1.1. 搜索JRXmlLoader1.1.1. JRAntApiWriteTask1.1.2. JRAntUpdateTask1.1.3. TableReportContextXmlRule1.1.4. JasperCompileManager【存在漏洞】 1.2. 搜索XMLReader1.2…

C++初阶:类和对象(上)

🚀前言: 本文主要讲述了,面向过程和面向对象,并引入类,然后就以类为基础并讲解。 目录 🍉1.面向过程和面向对象的初步认识: 🥒2.类的引入: 🍑3.类的定义…

dd 命令:复制和转换文件

一、dd 命令简介 ​dd​ 命令是一个在 Unix 和类 Unix 系统中用于复制文件和转换文件的命令行工具。它的功能非常强大,可以用于各种目的,例如创建镜像文件、备份和恢复数据、复制数据等。 ​dd​ 是一个用于读取、转换和写入数据的工具,通常…