Transformer为什么要引入MHA?

offer捷报

恭喜训练营的同学,成功斩获字节的 offer。

谈到 NLP 任务和近年最火的大模型,都绕不开 transformer 类结构模型。

transformer 的核心是注意力机制,在 transformer 中引入了 multi-head-attention(MHA),大大提升了 token 的语义和 token 之间的关系。

但是 MHA 也存在一些缺点,其中最主要的就是计算量大(特别是对于长序列),而对于大模型 8k、32k 甚至 100k 的文本长度,对于传统的 MHA 计算是无法接受的。所以本文介绍 MHA 及其变种的原理和优缺点。

01

self-attention

在介绍 MHA 之前先介绍一下基础知识 self-attention。‍‍‍

self- attention 的步骤如下:

  • **输入:**每个 token 向量的三个线性变换 k(key)、q(query)、v(value)(源代码中输入的都是同一个 token 向量,在 self-attention 函数里变换)

  • **自注意力计算:**每个 token 的 q 与所有 token 的 k 做向量点乘运算,得到一个维度为1*序列长度的向量 S;

  • **Scaling(缩放):**对注意力的分矩阵 S 做缩放处理,即 S 除以 token 维度的开放(原因和 softmax 函数曲线有关);

  • **Softmax 归一化:**对 scaling 后的 S 经过 softmax 得到和为 1 的得分矩阵;

  • **输出:**token 的输出等于 S(1*序列维度)*V(序列长度*token维度)得到该 token 的输出;

  • **并行计算:**实际计算中是 batch_size*len_l*d(批处理*序列长度*token维度)做的矩阵并行计算;

上面介绍了self- attention的计算过程,可以发现计算主要与token的维度和序列长度有关。

02

原始multi-head-attention(MHA)

MHA 是在 self-attention 的多头处理版本,即每个 token 的 kqv 被分割到多头上,多头分别处理,增加 token 的语义表达能力。

MHA 本质上和 self-attention 的计算量并没有区别,所以对于长序列的数据和高维度的模型,计算量是非常大的,所以优化点也可以从这两方面进行。

(1)从序列上优化 MHA

原始的 self-attention(MHA)是每个 token 和所有的 token 做注意力计算(稠密计算),可以针对这一点优化,做稀疏计算,即每个 token 只与一部分 token 做注意力计算(而非全部)。

具体与那一部分 token 做注意力计算,下面介绍主流几个模型的做法:

Atrous self-attention(空洞自注意力):

每个 token 等间隔的和其他 token 做注意力计算,降低计算量。

优点:简单、降低计算量。缺点:模型性能损失。

Local self-attention(局部注意力):

局部注意力的做法类似于 n-gram,每个 token 与附近的几个 token 做注意计算。

优点:简单、降低计算量。缺点:模型性能损失,缺少全局视野。

Sparse attention(稀疏注意力):

openai 于 2019 年结合了空洞注意力和局部注意力机制,根据规则(或者动态决定),每个 token 即有附近感受野,也有全局感受野。

优点:简单、即有附近感受野,也有全局感受野;缺点:实现复杂,难以调试、存在信息丢失的可能。

Longformer

Longformer 是稀疏注意力的一种,参与注意力的包括局部注意力、空洞注意力和全局注意力。

全局注意力就是对于一些特定位置的 token(例如 Bert 中的 CLS),做全部的注意力计算。

Reformer

论文中指出每个 token 的输出主要关注的是 softmax 后几个得分靠前的元素(长尾效应),所以 reformer 是通过 Locality sensitive hashing(LSH)方法将 attention score 相近的分到一个 bucket 中。

因为我们经过 softmax 之后,一个 query 和其他的所有的 token 的计算 attention score 主要是取决于高相似度的几个 tokens,所以采用这种方式将近似算得最终的 attention score。

例如当序列比较长的时候比如 64K,可能模型关心的只有前 64 个,其他的都是长尾。

基于此,问题就转化成为了找最相似的 Top-N 问题,而这个问题是可以用局部敏感哈希来解决的。

局部敏感哈希,是一类将高维向量映射到一组离散值(桶/聚类簇)上的方法。在大多数情况下,它被用作一种近似的最近邻搜索方法。

Reformer 的作者针对注意力操作的键向量和查询向量使用了一种单一投影,他们使用了一种基于随机旋转的局部敏感哈希方法,将共享的键/查询聚集到至多几百个词例的桶。

哈希方法的示意图如下:

计算了每个桶中的注意力矩阵,并对相应的值进行加权。由于它们只能注意到给定的中的元素,当选取的桶大小合适时,这样做可以将注意力操作的整体空间复杂度从O(N²)降低到O(nlogn)。

由于这里的分桶(bucketing)处理是随机并且基于随机旋转的,他们计算了若干次哈希,从而保证具有相近的「键-查询」嵌入的词例最终很有可能被分在同一个桶中。

通过 LSH 的方法近似的快速找到最大的 topk 的值。并且 Reformer 构造了可逆的 Feedforward Nateork 来替换掉原来的 Feedforward Network,降低了显存占用。什么都好,就是实现起来太麻烦!

Linformer

Linformer 的论文通过实验和证明了 Transformer 的 Attention 矩阵是低秩矩阵,他在 RoBERTa-base 模型上在语言模型和文本分类两个任务上进行训练,并对每一层和每一个 Attention 头得到的 Attention 矩阵 P 进行奇异值分解 SVD。

从上图可以看到一个长尾分布,这说明了矩阵 P 大部分的内容可以通过少部分最大的奇异值得到。

作者也对比了 Transformer 不同层的奇异值累计百分比 ,得到结论层级越高,会有越多的信息集中在最大的奇异值上。

Linformer 对 Self-Attention 的结构进行了一些修改,使复杂度降到线性,修改后的 Self-Attention 结构如下图所示,主要的区别在于增加了两个线性映射层 (用矩阵 E 和 F 表示)。

线性映射层 E 和 F 维度是 k×n,原来计算得到的 K V 矩阵维度是 n×d,通过新增的两个线性映射层可以把其转为 k×d 的矩阵,如下图所示。

因此得到的 Attention 矩阵 P 维度是 n×k,新结构的 Self-Attention 计算公式如下:

上面的计算方法需要 O(nk) 的时间和空间复杂度,如果让映射维度 k 远远小于 n,则复杂度就相当于线性的了。

可以证明,当 k=(d/ε^2) 时可以获得误差不超过 ε 的结果,论文中给出了证明结果。

BigBird

BigBird 是由 Google Research 提出的模型,它扩展了标准 Transformer 模型的自注意力机制,使得模型能够有效处理非常长的序列。

BigBird 的关键特点在于使用了一种块稀疏的注意力模式,结合了局部(窗口)、全局(固定点)和随机的注意力。

其主要特点包括:

  • **块式稀疏注意力:**将注意力机制应用在连续的局部块上,而不是整个序列。

  • **全局注意力点:**为了保持交互的全局性,添加了总是彼此进行注意力操作的标记,如 CLS 标记。

  • **随机注意力:**在序列中随机引入额外的注意力连接,以确保任意两个位置之间总有一个路径(可能通过多个中间节点)使得彼此可以连接。

  • **易于并行处理:**有助于在现代硬件上实现并行处理,提升效率。

(2)从 multi-head 上优化(MHA、MQA、GQA)

MQA,全称 Multi Query Attention, 而 GQA 则是前段时间 Google 提出的 MQA 变种,全称 Group-Query Attention。

说 GQA,要最先说传统的注意力机制计算 MHA(Multi-Head-Attention)的计算逻辑。‍

kv cache

在自回归模型架构中,当前步骤计算 attention,是将当前位置与上一步的输出做 attention 计算,所以会将上一步骤的输出存储起来,提升计算效率。

为了提升计算效率,每次计算完后存储下来 KV(key 和 value)到 cache 中,但是 cache 容量有限(A100 的 cache 只有 40MB)。可以不存 cache,存储到显存中,但是现存速度很慢。

(3)MHA 到 MQA 到 GQA

首先是原始的 MHA(Multi-Head Attention),QKV 三部分有相同数量的头,且一一对应。

每次做 Attention,head1 的 QKV 就做好自己运算就可以,输出时各个头加起来就行。

而 MQA 则是,让 Q 仍然保持原来的头数,但 K 和 V 只有一个头,相当于所有的 Q 头共享一组 K 和 V 头,所以叫做 Multi-Query 了。

实现改变了会不会影响效果呢?确实会影响但相对它能带来的收益,性能的些微降低是可以接受的。

能带来多大的收益呢,实验发现一般能提高 30%-40% 的吞吐。

收益主要就是由降低了 KV cache 带来的。实际上 MQA 运算量和 MHA 是差不多的,可理解为读取一组 KV 头之后,给所有 Q 头用,但因为之前提到的内存和计算的不对称,所以是有利的。

而 GQA 呢,是 MHA 和 MQA 的折衷方案,既不想损失性能太多,又想获得 MQA 带来的推理加速好处。

具体思想是,不是所有 Q 头共享一组 KV,而是分组一定头数 Q 共享一组 KV,比如上面图片就是两组 Q 共享一组 KV。

GQA 提供了 MHA 到 MQA 的自然过渡,当 g=h 时就是 MHA,g=1 时就是 MQA,当 1<g<h1< <ℎ,它只将 KV Cache 压缩到 g/h,压缩率不如 MQA,但同时也提供了更大的自由度,效果上更有保证。

(4)从软硬件层面优化 MHA

上文说过,GPU 的 cache 计算速度快,但是内存小(实际运算单元),显存是空间大、计算速度慢,这被称为内存墙。

冯诺依曼架构需要先从内存中调取数据,送入计算单元进行处理,但现在计算单元的速度是显著提升的,而从内存中读取数据的速度却没跟上,所以计算和内存这里就形成了一个瓶颈。因为短板效应,内存读取速度限制了整体速度。

计算单元能很快将数据处理完,但新数据却还没到,于是就只能等待,造成利用率不高。这就是内存墙。

因为内存墙问题,以 A100 (40GB HBM) 为例,上图显示其内存层次结构的粗略图。

SRAM 内存分布在 108 个流式多处理器(SMs)上,每个处理器 192KB。片上 SRAM 比 HBM 快得多,但比 HBM 小得多,在计算方面,使用 Tensor Core 的 BFLOAT16 的理论峰值吞吐量为 312 TFLOPS。

GPU 的典型操作方式是使用大量的线程来执行一个操作,这个操作被称为内核。

输入从 HBM 加载到寄存器和 SRAM,并在计算后写回 HBM。内存墙成为了限制 GPU 利用率的主要瓶颈。

03

内存墙怎么越过呢?

(1)硬件层面上

硬件层面上,比如现在已在使用的 HBM(高速带宽内存)提高读取速度,或者更彻底些,抛弃冯诺依曼架构,改变计算单元从内存读数据的方式,不再以计算单元为中心,而以存储为中心,做成计算和存储一体的“存内计算”。

软件层面上的话,最近的很多优化,比如 Flash Attention,Paged Attention。

Flash Attention

在 self-attention 中,计算速度比内存速度快得多,因此进程(操作)越来越多地受到内存(HBM)访问的瓶颈。因此,FlashAttention 论文的目标是尽可能高效地使用 SRAM 来加快计算速度。

回顾一下 self-attention 中:

因为 SRAM 大小限制的原因,所以需要反复从 HBM 中读取和写入数据(类似于 CPU 的操作),这个反复读取写入的过程就会导致内存墙的影响提升。

(2)FlashAttention 的优化思路

主要优化是做了两件事:

  • 在不访问整个输入的情况下计算 softmax

  • 不为反向传播存储大的中间 attention 矩阵

(3)PagedAttention 原理及实践

vLLM 主要用于快速 LLM 推理和服务,其核心是 PagedAttention,这是一种新颖的注意力算法,它将在操作系统的虚拟内存中分页的经典思想引入到 LLM 服务中。

在无需任何模型架构修改的情况下,可以做到比 HuggingFace Transformers 提供高达 24 倍的 Throughput。

如何学习AI大模型 ?

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。【保证100%免费】🆓

优快云粉丝独家福利

这份完整版的 AI 大模型学习资料已经上传优快云,朋友们如果需要可以扫描下方二维码&点击下方优快云官方认证链接免费领取 【保证100%免费】

读者福利: 👉👉优快云大礼包:《最新AI大模型学习资源包》免费分享 👈👈

(👆👆👆安全链接,放心点击)

对于0基础小白入门:

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

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

👉1.大模型入门学习思维导图👈

要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。

对于从来没有接触过AI大模型的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。(全套教程文末领取哈)
在这里插入图片描述

👉2.AGI大模型配套视频👈

很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,每个章节都是当前板块的精华浓缩。

在这里插入图片描述
在这里插入图片描述

👉3.大模型实际应用报告合集👈

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。(全套教程文末领取哈)

在这里插入图片描述

👉4.大模型落地应用案例PPT👈

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

在这里插入图片描述

👉5.大模型经典学习电子书👈

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。(全套教程文末领取哈)
img

在这里插入图片描述

👉6.大模型面试题&答案👈

截至目前大模型已经超过200个,在大模型纵横的时代,不仅大模型技术越来越卷,就连大模型相关的岗位和面试也开始越来越卷了。为了让大家更容易上车大模型算法赛道,我总结了大模型常考的面试题。(全套教程文末领取哈)

在这里插入图片描述
👉学会后的收获:👈
基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

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

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

能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习

优快云粉丝独家福利

这份完整版的 AI 大模型学习资料已经上传优快云,朋友们如果需要可以扫描下方二维码&点击下方优快云官方认证链接免费领取 【保证100%免费】

读者福利: 👉👉优快云大礼包:《最新AI大模型学习资源包》免费分享 👈👈

(👆👆👆安全链接,放心点击)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值