图解Transformer:什么是多头注意力?

本文为图解 Transformer 的第三篇文章。在前两篇文章中,我们学习了何为 Transformer,其架构及工作原理。本文将在此基础上进一步探讨作为 Transformer 核心的多头注意力机制(Multi-head Attentions)

以下为本系列前几篇文章的摘要。在整个系列中,我希望读者不仅能了解这些东西是如何运行的,还要进一步理解它们为何这样运行。

1. 图解 Transformer——功能概览:阐述如何使用 Transformer,为什么 Transformer 优于 RNN,以及 Transformer 的架构,和其在训练和推理过程中的运行。

2. 图解 Transformer——逐层介绍:阐述 Transformer 如何运行,从数据维度变化或矩阵变换的角度,端到端地阐释了 Transformer 内部的运作机制。

本文在前两篇的基础上,探讨多头注意力机制(Multi-head Attentions),旨在说明注意力机制在整个 Transformer 中的工作原理。

在 Transformer 中,注意力模块会并行多次重复计算。每个并行计算称为一个注意力头(Attention Head)。注意力模块将其查询 Query 、键 Key和值 Value的参数矩阵进行 N 次拆分,并将每次拆分独立通过一个单独的注意力头。最后,所有这些相同的注意力计算会合并在一起,产生最终的注意力分数。能够更细致地捕捉并表达每个词汇之间的多种联系和微妙差异。

一、注意力超参数(Attention Hyperparameters)

Transformer 内部流动的数据维度由三个超参数决定:

Embedding Size:嵌入向量的大小(例子中使用的嵌入向量大小为6)。这个维度在整个 Transformer 模型中都是向前传递的,因此有时也被称为“model size – 模型大小”等其他名称。

Query Size(与 Key  size 和 Value size 相等):查询向量的长度,与键向量和值向量的长度相等,也是分别用来产生Query、Key 和 Value矩阵的三个线性层的权重大小(例子中使用的查询大小为3)

Number of Attention heads:注意力头个数。例子中使用注意力头个数为 2 。

此外,还有 Batch_size,批量大小,是一次输入模型中样本的数量。

二、输入层(Input Layer)

经过词嵌入和位置编码后,进入编码器之前,输入的数据维度为:

(batch_size, seq_length, embedding_size)

之后数据进入编码器堆栈中的第一个 Encoder,与 Query、Key、Value 矩阵相乘。

为方便理解,以下的图示与介绍中将去掉 batch_size 维度,聚焦于剩下的维度:

三、线性层(Linear Layers)

Query, Key, Value 实际上是三个独立的线性层。每个线性层都有自己独立的权重。输入数据与三个线性层分别相乘,产生 Q、K、V。

四、通过注意力头切分数据(Splitting data across Attention heads)

现在,数据被分割到多个注意头中,以便每个注意头能够独立地处理它。

需要注意:

1. “切分”只是逻辑上的分割。对于参数矩阵 Query, Key, Value 而言,并没有物理切分成对应于每个注意力头的独立矩阵。

2. 逻辑上,每个注意力头对应于 Query, Key, Value 的独立一部分。各注意力头没有单独的线性层,而是所有的注意力头共用线性层,只是不同的注意力头在独属于各自的逻辑部分上进行操作。

这种切分可以按照两个步骤理解:

第一步,线性层权重矩阵的切分。

这种逻辑分割,是通过将输入数据以及线性层权重,均匀划分到各注意头中来完成的。我们可以通过选择下面的 Query Size大小来实现:

在我们的例子中,这就是为什么 Query_Size=6/2=3。尽管层权重(和输入数据)均为单一矩阵,我们可以认为它是“将每个头的独立层权重‘堆叠’在一起”成为一个矩阵。

也因此,在代码中定义 W_Q、W_K、W_V 矩阵时可这样定义:

self.W_Q = nn.Linear(embedding_size, Query_size * n_heads, bias=False) self.W_K = nn.Linear(embedding_size, Query_size * n_heads, bias=False)self.W_V = nn.Linear(embedding_size, Value_size * n_heads, bias=False)

基于此,所有 Heads 的计算可通过对一个的矩阵操作来实现,而不需要 N 个单独操作。这使得计算更加有效,同时保持模型的简单:所需线性层更少,同时获得了多头注意力的效果。

回顾前一小节的内容,input 的维度是:

(batch_size, seq_length, embedding_size)

而线性层的维度是:

(batch_size, embedding_size,  Query_size * n_heads)

由于 embedding_size = Query_size * n_heads,所以线性层的维度并未发生变化。

输入经过线性层映射后,得到 Q、K 和 V 矩阵形状是:

(batch_size, seq_length, Query_size * n_heads)

第二步,重塑 Q、K 和 V 矩阵形状。

经由线性层输出得到的 Q、K 和 V 矩阵要经过 Reshape 操作,以产生一个 Head 维度。现在每个“切片”对应于代表每个头的一个矩阵。

通过交换 n_heads 和 seq_length 这两个维度,改变 Q、K 和 V 矩阵的形状。图示中虽然未表达出 Batch 维度,但对应于每一个注意力头的 ‘Q’ 的维度是:

(batch_size, n_heads, seq_length, Query size)

在上图中,我们可以看到从线性层 (Wq) 出来后,分割 Q 矩阵的完整过程。

最后一个阶段只是为了形象化。

实际上 Q 矩阵仍然是一个单一矩阵,但可以把它看作是每个注意力头的逻辑上独立的 Q 矩阵。

五、为每个头计算注意力分数(Compute the Attention Score for each head)

现在有了分属各头的 Q、K、V 3个矩阵,这些矩阵用来计算注意力分数。

为方便理解,只展示单个 head 的计算。使用最后两个维度(seq_length, Query size),跳过前两个维度(batch_size, n_heads)。从本质上讲,可以想象,计算对于每个头和每个批次中的每个样本都是“重复”进行的(虽然实际上它们是作为一个单一矩阵操作进行的)

1. 在 Q 和 K 的转置矩阵做一个矩阵乘法。

2. 将掩码值被添加到结果中。在 Encoder Self-attention 中,掩码用于掩盖填充值,这样它们就不会参与到注意分数中。

3. 上一步的结果通过除以 Query size 的平方根进行缩放,然后对其应用Softmax。

4. 在 Softmax 的输出和 V 矩阵之间进行另一个矩阵乘法。

在 Encoder Self-attention 中,一个注意力头的完整注意力计算如下图所示:

每个注意力头的输出形状为:

(batch_size,n_heads,seq_length,Query size)

注意,实际上此处最后一个维度的大小为 value_size,只是在 Transformer 中 value_size=key_size=query_size。

六、融合每个头的注意力分数(Merge each Head’s Attention Scores together)

我们现在对每个头都有单独的注意力分数,需要将其合并为一个分数。这个合并操作本质上是与分割操作相反,通过重塑结果矩阵以消除 n_heads 维度来完成的。其步骤如下:

1. 交换头部和序列维度来重塑注意力分数矩阵。换句话说,矩阵的形状从(batch_size,n_heads,seq_length,Query_size)变为(batch_size,seq_length,n_heads,Query_size)。

2. 通过重塑为 (Batch,  Sequence,Head * Query size)折叠头部维度。这就有效地将每个头的注意得分向量连接成一个合并的注意得分。

由于 embedding_size=n_heads * query_size ,合并后的分数是(batch_size,seq_length,embedding_size)。在下图中,我们可以看到分数矩阵的完整合并过程:

(在李沐的代码中,直接使用 permute 和 reshape 两次变换就可以)

整体上多头注意力的计算过程如下:

七、多头分割可以捕捉到更丰富的表示(Multi-head split captures richer interpretations)

一个嵌入向量捕捉了一个词的含义。在 Multi-head Attention 的机制下,正如我们所见,输入(和目标)序列的嵌入向量在逻辑上被分割到多个头。

这意味着,嵌入向量的不同部分可以表征每个词在不同方面的含义,而每个词不同的含义与序列中的其他词有关。这使得 Transformer 能够捕捉到对序列更丰富的表示。

例如,嵌入向量的某一部分可以捕获一个名词的词性,而另一个部分可以捕获一个名词的单复数。这在翻译中很重要,许多语言中,动词的使用与这些因素有关。

以上虽然不是一个现实的例子,但它可能有助于建立直觉。例如,一个部分可以捕捉名词的“性别”(男、女、中性),而另一个部分则可以捕捉名词的“词性”(单数与复数)。这在翻译过程中可能很重要,因为在许多语言中,需要使用的动词取决于这些因素。

八、解码器中的“编码器-解码器注意力”与“掩码操作”(Decoder Encoder-Decoder Attention and Masking)

“编码器-解码器注意力”从两个来源获得输入。因此,与计算输入中每个词与其他词之间相互作用的 Encoder Self-Attention 不同;也与计算每个目标词与其他目标词之间相互作用的 Decoder-Self-Attention 不同,“编码器-解码器注意力”计算的是每个 input word 与每个 target word之间的相互作用。

因此,所产生的注意分数中的每一个单元都对应于一个 Q(target sequence word)与所有其他 K(input sequence)词和所有 V(input sequence)词之间的相互作用。

九、总结

希望这能让你对 Transformer 中 Attention 的模块作用有一个很好认识。当与我们在第二篇文章中提到的整个 Transformer 的端到端流程放在一起时,我们现在已经涵盖了整个Transformer架构的详细操作。

我们现在明白了 Transformer 到底是做什么的。但是我们还没有完全回答为什么 Transformer 的 Attention 要进行这样的计算,为什么它要使用查询、键和值的概念,为什么它要执行我们刚才看到的矩阵乘法?

我们有一个模糊的直观想法,即它“抓住了每个词与其他词之间的关系”,但这到底是什么意思?这到底是如何让转化器的注意力有能力理解序列中每个词的细微差别的?

这是一个有趣的问题,也是本系列的最后一篇文章的主题。一旦我们了解了这一点,我们就会真正理解 Transformer 架构的优雅之处。

原文链接:https://towardsdatascience.com/Transformers-explained-visually-part-3-multi-head-attention-deep-dive-1c1ff1024853

本文来自微信公众号:Afunby的 AI Lab(ID:AI_Lab_of_Afunby),作者:Afunby

声明: 该内容为作者独立观点,不代表新零售资讯观点或立场,文章为网友投稿上传,版权归原作者所有,未经允许不得转载。 新零售资讯站仅提供信息存储服务,如发现文章、图片等侵权行为,侵权责任由作者本人承担。 如对本稿件有异议或投诉,请联系:wuchangxu@youzan.com
(0)
上一篇 2024年4月3日
下一篇 2024年4月3日

相关推荐

  • 水温80度:AI行业真假繁荣的临界点

    我们从来没拥有过这么成功的AI主导的产品。

    (这种分析统计并不那么准,但大致数量级是差不多的)

    这两个产品碰巧可以用来比较有两个原因:

    一个是它们在本质上是一种东西,只不过一个更通用,一个更垂直。

    蓝海的海峡

    未来成功的AI产品是什么样,大致形态已经比较清楚了,从智能音箱和Copilot这两个成功的AI产品上已经能看到足够的产品特征。

    未来科技 2024年6月5日
  • ChatGPT、Perplexity、Claude同时“罢工”,全网打工人都慌了

    美西时间午夜12点开始,陆续有用户发现自己的ChatGPT要么响应超时、要么没有对话框或提示流量过载,忽然无法正常工作了。

    因为发现AI用久了,导致现在“离了ChatGPT,大脑根本无法运转”。”

    等等,又不是只有一个聊天机器人,难道地球离了ChatGPT就不转了。

    大模型连崩原因猜想,谷歌躺赢流量激增6成

    GPT归位,人们的工作终于又恢复了秩序。

    未来科技 2024年6月5日
  • ChatGPT宕机8小时,谷歌Gemini搜索量激增60%

    ChatGPT一天宕机两次

    谷歌Gemini搜索量激增近60%

    ChatGPT在全球拥有约1.8亿活跃用户,已成为部分人群工作流程的关键部分。

    过去24小时内提交的关于OpenAI宕机的问题报告

    图片来源:Downdetector

    ChatGPT系统崩溃后,有网友在社交媒体X上发帖警告道:“ChatGPT最近发生的2.5小时全球中断,为我们所有依赖AI工具来支持业务的人敲响了警钟。

    未来科技 2024年6月5日
  • ChatGPT、Perplexity、Claude同时大崩溃,AI集体罢工让全网都慌了

    接着OpenAI也在官网更新了恢复服务公告,表示“我们经历了一次重大故障,影响了所有ChatGPT用户的所有计划。Generator调查显示,在ChatGPT首次故障后的四小时内,谷歌AI聊天机器人Gemini搜索量激增60%,达到327058次。

    而且研究团队表示,“Gemini”搜索量的增长与“ChatGPT故障”关键词的搜索趋势高度相关,显示出用户把Gemini视为ChatGPT的直接替代选项。

    未来科技 2024年6月5日
  • 深度对话苹果iPad团队:玻璃的传承与演变

    iPad最为原始的外观专利

    没错,这就是iPad最初被设想的样子:全面屏,圆角矩形,纤薄,就像一片掌心里的玻璃。

    2010年发布的初代iPad

    好在乔布斯的遗志,并未被iPad团队遗忘。

    初代iPad宣传片画面

    乔布斯赞同这一想法,于是快速将资源投入平板电脑项目,意欲打造一款与众不同的「上网本」,这就是iPad早年的产品定义。

    iPad进化的底色

    苹果发布会留下过很多「名场面」,初代iPad发布会的末尾就是一例。

    未来科技 2024年6月5日
  • 底层逻辑未通,影视业的AI革命正在褪色…

    GPT、Sora均为革命性产品,引发了舆论风暴,但它在上个月发布的“多模态语音对谈”Sky语音,却由于声音太像电影明星斯嘉丽·约翰逊,被正主强烈警告,被迫下架。

    华尔街日报也在唱衰,认为“AI工具创新步伐正在放缓,实用性有限,运行成本过高”:

    首先,互联网上已经没有更多额外的数据供人工智能模型收集、训练。

    03、

    如果说训练“数字人”、使用AI配音本质上瞄向的仍是影视行业固有的发展方向,那么还有另外一群人试图从根本上颠覆影视行业的生产逻辑和产品形态。

    但分歧点正在于此,电影公司希望通过使用AI技术来降低成本,但又不希望自己的内容被AI公司所窃取。

    未来科技 2024年6月5日
  • KAN会引起大模型的范式转变吗?

    “先变后加”代替“先加后变”的设计,使得KAN的每一个连接都相当于一个“小型网络”, 能实现更强的表达能力。

    KAN的主要贡献在于,在当前深度学习的背景下重新审视K氏表示定理,将上述创新网络泛化到任意宽度和深度,并以科学发现为目标进行了一系列实验,展示了其作为“AI+科学”基础模型的潜在作用。

    KAN与MLP的对照表:

    KAN使神经元之间的非线性转变更加细粒度和多样化。

    未来科技 2024年6月5日
  • 这个国家,也开始发芯片补贴了

    //mp.weixin.qq.com/s/tIHSNsqF6HRVe2mabgfp6Q
    [4]中国安防协会:欧盟批准430亿欧元芯片补贴计划:2030年产量占全球份额翻番.2023.4.19.https。//mp.weixin.qq.com/s/VnEjzKhmZbuBUFclzGFloA
    [6]潮电穿戴:印度半导体投资大跃进,一锤砸下1090亿,政府补贴一半.2024.3.5https。

    未来科技 2024年6月5日
  • 大模型的电力经济学:中国AI需要多少电力?

    这些报告研究对象(数字中心、智能数据中心、加密货币等)、研究市场(全球、中国与美国等)、研究周期(多数截至2030年)各不相同,但基本逻辑大同小异:先根据芯片等硬件的算力与功率,计算出数据中心的用电量,再根据算力增长的预期、芯片能效提升的预期,以及数据中心能效(PUE)提升的预期,来推测未来一段时间内智能数据中心的用电量增长情况。

    未来科技 2024年6月5日
  • 你正和20万人一起接受AI面试

    原本客户还担心候选人能否接受AI面试这件事,但在2020年以后,候选人进行AI面试的过程已经是完全自动化的,包括面试过程中AI面试官回答候选人的问题,AI面试官对候选人提问以及基于候选人的回答对候选人进行至多三个轮次的深度追问。

    以近屿智能与客户合作的校验周期至少3年来看,方小雷认为AI应用不太可能一下子爆发,包括近屿智能在内的中国AI应用企业或许要迎来一个把SaaS做起来的好机会。

    未来科技 2024年6月4日