手动深入了解自注意力机制✍︎

深入解析自注意力机制

原文:towardsdatascience.com/deep-dive-into-self-attention-by-hand-%EF%B8%8E-f02876e49857?source=collection_archive---------0-----------------------#2024-04-22

探索驱动 Transformer 的注意力机制的复杂性

https://medium.com/@srijanie.dey?source=post_page---byline--f02876e49857--------------------------------https://towardsdatascience.com/?source=post_page---byline--f02876e49857-------------------------------- Srijanie Dey, PhD

·发表于 Towards Data Science ·阅读时间:12 分钟·2024 年 4 月 22 日

注意!注意!

因为‘注意力即你所需’。

不,我并不是这么说,Transformer 是。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/fa02dd175a9c6c0c241a9a16281d8d0d.png

图片来自作者(Robtimus Prime 寻求关注。根据我儿子的话,鲜艳的彩虹色更能吸引注意,因此采用了这种配色方案。)

到今天为止,Transformer 的强大力量已经席卷了整个世界。不是像‘Robtimus Prime’那样的变形金刚,而是构成神经网络的那些。而这种力量正是源于‘注意力’的概念。那么,Transformer 上下文中的注意力究竟意味着什么呢?让我们试着在这里找到一些答案:

首先:

什么是 Transformer?

Transformer 是一种专注于从数据中学习上下文的神经网络。它们与我们尝试从 Transformer 的角度理解 ‘注意力与上下文’ 的含义非常相似。

Transformer 如何从数据中学习上下文?

通过使用注意力机制。

什么是注意力机制?

注意力机制帮助模型在每一步扫描序列的所有部分,并确定需要关注哪些元素。注意力机制被提出作为对编码器-解码器架构中固定长度向量的‘严格/硬性’解决方案的替代方案,提供了一种‘软性’解决方案,只关注相关部分。

什么是自注意力机制?

注意力机制最初是为了改善递归神经网络(RNN)的性能,效果随后也渗透到了卷积神经网络(CNN)。然而,随着 2017 年变压器架构的引入,RNN 和 CNN 的需求悄然消失。而这一切的核心原因正是自注意力机制。

自注意力机制的特殊之处在于,它旨在融入输入序列的上下文,以增强注意力机制。这个思想变得具有变革性,因为它能够捕捉语言中的复杂细微差别。

举个例子:

当我问我 4 岁的孩子“变压器是什么”时,他的回答仅包含机器人和汽车这两个词。因为那是他所理解的唯一上下文。但对我来说,变压器也意味着神经网络,因为对于我这个稍微有些经验的人来说,第二种上下文也是存在的。正是这种不同的上下文提供了不同的解决方案,因此它们通常非常重要。

“自”一词指的是注意力机制检查它正在处理的相同输入序列。

自注意力的执行方式有很多种变体。但缩放点积机制是最流行的方式之一。这也是在 2017 年原始变压器架构论文“Attention is All You Need”中介绍的方式。

自注意力在变压器中扮演什么角色,如何发挥作用?

我喜欢把变压器架构看作是由两层结构组成——外部结构和内部结构。

  1. 外部结构是注意力加权机制和前馈层的结合,关于这一点,我在这篇文章中有详细介绍。

  2. 内部结构由自注意力机制组成,是注意力加权功能的一部分。

所以,事不宜迟,让我们深入探讨自注意力机制背后的细节,并揭开其工作原理。查询-键模块SoftMax函数在这一技术中起着至关重要的作用。

这段讨论基于 Tom Yeh 教授的精彩《人工智能手工系列》中的自注意力内容。(以下所有图片,除非另有说明,均来自 Tom Yeh 教授的 LinkedIn 文章,我已获得他的许可并进行了编辑。)

那么,我们开始吧:

自注意力

为了提供一些背景,这里有一个指针,展示我们如何在变压器的外部结构中处理**‘注意力加权’**。

注意力权重矩阵(A)

注意力权重矩阵A是通过将输入特征输入查询-键(QK)模块获得的。这个矩阵试图找到输入序列中最相关的部分。在创建注意力权重矩阵A时,自注意力机制开始发挥作用,利用 QK 模块进行计算。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/98c0a5d3d06cbc56f250062940a59e77.png

QK 模块是如何工作的?

让我们来看看自注意力(Self-Attention)的不同组成部分:查询(Q)、键(K)值(V)

我喜欢用聚光灯的比喻来帮助我形象化这个模型,理解它如何照亮序列中的每个元素,并尝试找到最相关的部分。把这个比喻延伸一下,让我们用它来理解自注意力的不同组成部分。

想象一个巨大的舞台正在为世界上最大的《麦克白》制作做准备。外面的观众兴奋不已。

  • 主角走上舞台,聚光灯照在他身上,他用洪亮的声音问道:“我应该夺取王冠吗?”观众低声耳语,猜测这个问题将会引领到何种结局。因此,麦克白本身代表了 查询(Q) 的角色,他提出关键问题并推动故事向前发展。

  • 根据麦克白的提问,聚光灯转向了其他掌握答案信息的重要人物。故事中其他关键人物,如麦克白夫人,通过其行动激发了麦克白的野心和行动。这些人物可以视为 键(K) ,他们根据所知的不同细节解开故事的各个方面。

  • 最后,扩展的角色——家人、朋友、支持者和反对者通过他们的行动和视角为麦克白提供了足够的动机和信息。这些可以视为 值(V)。* *值(V)推动麦克白做出决策并塑造故事的命运。

随之而来的是世界上最精彩的演出之一,它将深深铭刻在敬畏的观众脑海中,成为多年之后仍然难以忘怀的经典。

现在我们已经见证了QKV在戏剧世界中的作用,让我们回到矩阵的世界,学习QK 模块背后的数学原理。这是我们将要遵循的路线图:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/de5f0f180195583b9ef5aed6a8b04bbb.png

自注意力机制的路线图

于是,过程开始了。

我们已知:

一组 4 个特征向量(维度 6)

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a6ad182544df69a2550ac9be45b5015f.png

我们的目标:

将给定的特征转化为注意力加权特征

[1] 创建查询、键和值矩阵

为此,我们将特征与线性变换矩阵 W_Q、W_K 和 W_V 相乘,分别得到查询向量(q1,q2,q3,q4)、键向量(k1,k2,k3,k4)和值向量(v1,v2,v3,v4),如下面所示:

为了得到Q,将 W_Q 与 X 相乘:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/b6bb9e18f73411d19d946034f15605c2.png

为了得到K,将 W_K 与 X 相乘:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/f535191e8ee035b3d596470749b19577.png

类似地,为了得到V,将 W_V 与 X 相乘。

需要注意:

  1. 如上所述的计算所示,我们对查询和键使用相同的特征集。这也是**“自我”**概念的体现,即模型使用相同的特征集来生成其查询向量和键向量。

  2. 查询向量表示当前的单词(或标记),我们想要计算其相对于序列中其他单词的注意力得分。

  3. 键向量表示输入序列中的其他单词(或标记),我们计算每个键向量相对于当前单词的注意力得分。

[2] 矩阵乘法

下一步是将 K 的转置与 Q 相乘,即 K^T . Q

这里的想法是计算每一对查询和键向量之间的点积。通过计算点积,我们可以估计每个“键-查询”对之间的匹配得分,利用余弦相似度的概念。这就是缩放点积注意力中的 ‘点积’ 部分。

余弦相似度

余弦相似度是向量之间夹角的余弦值;也就是说,它是向量的点积除以它们长度的乘积。它大致衡量了两个向量是否朝同一方向指向,从而意味着这两个向量是相似的。

记住 cos(0°) = 1, cos(90°) = 0 , cos(180°) = -1

  • 如果两个向量之间的点积大约为 1,意味着它们之间的夹角接近零,即它们非常相似。

  • 如果两个向量之间的点积大约为 0,意味着它们是正交的,且不太相似。

  • 如果两个向量之间的点积大约为 -1,意味着它们之间的夹角接近 180°,即它们是相反的。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/977171591ba823b623324c65070e09d0.png

[3] 缩放

下一步是将每个元素按维度 ‘d_k’ 的平方根进行缩放/归一化。在我们的例子中,数字是 3。缩放有助于保持维度对匹配得分的影响在可控范围内。

它是如何做到的呢?根据原始的 Transformer 论文,并回顾一下概率论 101,如果两个独立同分布(i.i.d)变量 qk 具有均值为 0,方差为 1,维度为 d,则它们相乘后的结果是一个新的随机变量,其均值保持为 0,但方差变为 d_k

现在,想象一下如果我们的维度增加到 32、64、128 或甚至 4960 时,匹配得分会是什么样的。更大的维度会增加方差,并将值推入“未知”区域。

为了简化计算,考虑到 sqrt [3] 大约是 1.73205,我们将其替换为 [ floor(□/2) ]。

取整函数

取整函数接受一个实数作为输入,并返回不大于该实数的最大整数。

例如:floor(1.5) = 1, floor(2.9) = 2, floor (2.01) = 2, floor(0.5) = 0。

floor 函数的反函数是 ceil 函数。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/4995dd56bc12525e18ac38b916ef58f6.png

这是“缩放”部分的缩放点积注意力。

[4] Softmax

这一步分为三个部分:

  1. 将每个单元格中的数字取 e 的幂(为了简化,我们使用 3 的幂来计算每个单元格中的数字。)

  2. 求出每列中这些新值的总和。

  3. 对于每一列,将每个元素除以其相应的总和(归一化)。归一化每一列的目的是使数字总和为 1。换句话说,每一列然后成为一个注意力的概率分布,这给我们带来了我们的注意力权重矩阵(A)

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/023e56eda75ef16ae51abfb8df4dae56.png

这个注意力权重矩阵是我们在转换器部分的第 2 步中通过 QK 模块传递特征矩阵后获得的。

(备注:注意力权重矩阵中的第一列存在一个拼写错误,因为当前元素的总和不为 1。请仔细检查。我们允许这些错误,因为我们是人类。)

Softmax 步骤很重要,因为它为前面步骤中获得的分数分配概率,从而帮助模型决定在当前查询下需要给每个单词多少重要性(更高/更低的注意力权重)。正如预期的那样,更高的注意力权重表示更大的相关性,使模型能够更准确地捕捉依赖关系。

再次强调,前一步中的缩放在这里变得很重要。没有缩放,结果矩阵的值会被推到 Softmax 函数处理不好的区域,可能导致梯度消失。

[5] 矩阵乘法

最后,我们将值向量(Vs)与注意力权重矩阵(A)相乘。这些值向量很重要,因为它们包含与序列中每个单词相关的信息。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/65df264c09946b1ed85a2343598b375f.png

这一步中最终乘法的结果是注意力加权特征 Zs,这是自注意机制的最终解决方案。这些注意力加权特征基本上包含了特征的加权表示,根据上下文的相关性为具有更高相关性的特征分配更高的权重。

现在有了这些信息,我们继续转换器架构中的下一步,其中前馈层进一步处理这些信息。

这就是辉煌的自注意力技术的结束!

根据我们上面讨论的想法,回顾所有关键点:

  1. 注意机制是为了改善 RNN 的性能而产生的,解决了编码器-解码器架构中固定长度向量表示的问题。软长度向量的灵活性,重点放在序列中相关部分上,是注意力背后的核心优势。

  2. 自注意力机制被引入作为一种将上下文思想融入模型的方法。自注意力机制评估它所处理的相同输入序列,因此使用了“自”这个词。

  3. 自注意力机制有许多变体,且目前仍在不断努力使其更加高效。然而,缩放点积注意力是其中最受欢迎的一种,也是 Transformer 架构被认为如此强大的关键原因之一。

  4. 缩放点积自注意力机制包括查询-键模块(QK 模块)以及Softmax 函数。QK 模块负责通过计算注意力分数来提取输入序列中每个元素的相关性,而 Softmax 函数通过为注意力分数分配概率来补充它。

  5. 一旦计算出注意力分数,它们会与值向量相乘,以获得加权注意力特征,然后这些特征会传递到前馈层。

多头注意力

为了适应对序列的多样化和全面表示,多个自注意力机制副本会并行实现,然后它们会被连接起来,生成最终的加权注意力值。这被称为多头注意力。

Transformer 概述

这就是 Transformer 架构的内部工作原理。将其与外部结构结合起来,以下是 Transformer 机制的总结:

  1. Transformer 架构中的两个关键思想是加权注意力和前馈层(FFN)。这两者结合在一起,使得 Transformer 可以从两个方向分析输入序列。注意力基于位置查看序列,FFN则基于特征矩阵的维度来分析。

  2. 驱动注意力机制的部分是缩放点积注意力,它由QK 模块组成,并输出加权注意力特征。

‘注意力才是你所需要的一切’

Transformer 只存在了几年,AI 领域已经在此基础上取得了巨大的进展,且这一努力仍在持续。当论文的作者给他们的论文起这个标题时,他们可不是开玩笑。

再次看到一个基本思想——‘点积’与某些修饰结合,竟然能变得如此强大,真是令人感到有趣!

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a50dd9ea40a103d373f2c0faa0b7b37b.png

图片来自作者

附言:如果你希望独立完成这项练习,下面是可以使用的空白模板。

手动练习的空白模板

现在去享受一下练习吧,同时关注你的Robtimus Prime

相关工作:

以下是《深入了解手动系列》中的其他文章:

参考文献:

  1. Vaswani, Ashish, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Łukasz Kaiser 和 Illia Polosukhin. “注意力即一切”。神经信息处理系统进展 30 (2017)。

  2. Bahdanau, Dzmitry, Kyunghyun Cho 和 Yoshua Bengio. “神经机器翻译:通过联合学习对齐和翻译”。CoRR abs/1409.0473 (2014)。

【无人机】基于改进粒子群算法的无人机路径规划研究[和遗传算法、粒子群算法进行比较](Matlab代码实现)内容概要:本文围绕基于改进粒子群算法的无人机路径规划展开研究,重点探讨了在复杂环境中利用改进粒子群算法(PSO)实现无人机三维路径规划的方法,并将其与遗传算法(GA)、标准粒子群算法等传统优化算法进行对比分析。研究内容涵盖路径规划的多目标优化、避障策略、航路点约束以及算法收敛性和寻优能力的评估,所有实验均通过Matlab代码实现,提供了完整的仿真验证流程。文章还提到了多种智能优化算法在无人机路径规划中的应用比较,突出了改进PSO在收敛速度和全局寻优方面的优势。; 适合人群:具备一定Matlab编程基础和优化算法知识的研究生、科研人员及从事无人机路径规划、智能优化算法研究的相关技术人员。; 使用场景及目标:①用于无人机在复杂地形或动态环境下的三维路径规划仿真研究;②比较不同智能优化算法(如PSO、GA、蚁群算法、RRT等)在路径规划中的性能差异;③为多目标优化问题提供算法选型和改进思路。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注算法的参数设置、适应度函数设计及路径约束处理方式,同时可参考文中提到的多种算法对比思路,拓展到其他智能优化算法的研究与改进中。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值