探秘Transformer系列之(10)--- 自注意力
探秘Transformer系列之(10)--- 自注意力目录
[*]探秘Transformer系列之(10)--- 自注意力
[*]0x00 概述
[*]0x01 原理
[*]1.1 设计思路
[*]1.2 输入
[*]1.3 QKV解析
[*]心理学角度
[*]数据库角度
[*]seq2seq角度
[*]重构词向量角度
[*]相互操作
[*]提取特征
[*]加权求和
[*]1.4 小结
[*]0x02 实现
[*]2.1 权重矩阵
[*]2.2 计算过程
[*]2.3 点积注意力函数
[*]方案选择
[*]解读
[*]2.4softmax
[*]定义
[*]算法
[*]必要性
[*]缺点
[*]改进
[*]Log-Softmax
[*]Hierarchical Softmax(H-Softmax)
[*]adaptive softmax
[*]2.5 缩放
[*]结论
[*]问题推导
[*]方差变大
[*]元素间差值变大
[*]softmax退化
[*]梯度消失
[*]如何降低方差?
[*]熵的作用
[*]2.6 小结
[*]0x03 实现
[*]3.1 哈佛代码
[*]输入&输出
[*]图例&代码
[*]再分析注意力
[*]3.2 llama3
[*]0x04 优化
[*]4.1 优化策略
[*]从序列角度优化
[*]从多头角度优化
[*]从软硬件层面优化 MHA
[*]从其它角度优化
[*]4.2 案例
[*]注意力权重细化
[*]线性注意力
[*]PolaFormer
[*]研究背景
[*]思路
[*]MiniMax-01
[*]模型架构
[*]Lightning Attention
[*]Hybrid-lightning
[*]Transformer²
[*]研究背景
[*]自适应性
[*]SVD
[*]研究动机
[*]思路
[*]奇异值微调(SVF)
[*]自适应性
[*]Titans
[*]研究背景和动机
[*]核心创新
[*]Titans架构
[*]长期记忆
[*]融合记忆
[*]SANA
[*]0xFF 参考
0x00 概述
Transformer的核心所在或者说与其他架构的关键区别之处是自注意力机制,其允许模型在处理一个句子时,考虑句子中每个单词与其他所有单词的依赖关系,并使用这些信息来捕捉句子的内部结构和表示,最终计算单词之间的关联度(权重)。我们可以把自注意力机制分为三个阶段:
[*]输入:从前文我们可以了解到,注意力机制接受查询(query)、键(key)和值(value)三个输入,但是对于自注意力来说,只有一个输入序列,Q、K、V都是来自于这个序列。这个输入序列是一个向量列表,且向量之间有一定的关系。以机器翻译为例,输入序列就是源语句或者目标语句,语句中每个token对应一个向量。
[*]计算:自注意力机制会计算序列中每个向量与序列中其他向量的关系(也就是每个单词与句子中所有单词的关系),使得序列中的每个token都能感知其他token。针对当前向量,自注意力机制会接受计算查询(当前token)与所有键(感兴趣的token)的点积,应用Softmax函数在点积上以获取权重,并使用权重对所有与之关联的值进行加权平均。这样就可以把对其他单词的“理解”融入到当前处理的单词中。
[*]输出:一个序列,比如一个向量列表,但是列表之中所有向量都考虑了其上下文关系,是蕴含了序列内部关系的全局特征表示。
具体如下图所示。
0x01 原理
1.1 设计思路
自注意力并非Transformer首创,但之前在其他模型上效果不甚理想。所以我们好奇为什么Transformer依然使用自注意力呢,论文是这样解释其设计思路:
Motivating our use of self-attention we consider three desiderata. One is the total computational complexity per layer. Another is the amount of computation that can be parallelized, as measured by the minimum number of sequential operations required. The third is the path length between long-range dependencies in the network.
三个考虑因素我们具体解析如下。
[*]每层的总计算复杂度。Transformer的自注意力使用了缩放点积注意力评分函数,相比于加性注意力减少了计算量,效果也是相似的。
[*]并行计算。自注意力是可以并行化计算的,并行化计算量可以用所需的序列操作的最小数目来衡量。
[*]网络中长距离依赖关系之间的路径长度。RNN捕捉词与词之间关系需要把句子从头看到尾,CNN需要层叠多个卷积层才能捕捉词与词之间关系,而自注意力是完全并行的,每个词可以直接关联。
虽然有若干优势,但是知易行难,Transformer如何做到?我们接下来一步一步进行分析。
1.2 输入
从宏观角度来说,Transformer只有一个输入序列,由这个序列派生出来Q、K和V。具体如下图所示。
从微观角度看,以编码器为例,自注意力的Q、K、V的来源有两种:
[*]第一个编码器层的QKV由输向量x组成的矩阵X进行线性变化而来,线性变化就是用\(W^Q,W^K,W^V\)进行矩阵乘法。
[*]后续编码器层的QKV由上一个编码器层的输出经过线性变化而来。
我们接下来以第一个编码器层为例,从源序列中的单个词开始来跟踪它们在 Transformer 中的路径。为了解释和可视化,我们暂时不用关心细节,只跟踪每个词对应的"行"。
假如我们进行英译中,输入中文:我爱你。假定模型维度为d,输入序列长度为L。源序列首先通过嵌入和位置编码层,该层为序列中的每个单词生成嵌入向量,这些嵌入向量构成的矩阵就是X。
输入序列接下来会通过三个矩阵\(\mathbf{W}^K \in \mathbb{R}^{d \times d_k}\),\(\mathbf{W}^Q \in \mathbb{R}^{d \times d_q}\),\(\mathbf{W}^V \in \mathbb{R}^{d \times d_v}\)进行转换。具体来说,输入序列的每一个元素\(x_i \in \mathbb{R}^{d}\)会分别乘以这三个矩阵,得到
\
把L个\(q_i\)对堆叠起来就得到矩阵\(\mathbf{Q} \in \mathbb{R}^{L \times d_q}\),类似可以得到矩阵\(\mathbf{K} \in \mathbb{R}^{L \times d_k}\),\(\mathbf{V} \in \mathbb{R}^{L \times d_v}\)。或者直接用矩阵形式表达:
\[\mathbf{Q} = \mathbf{X}\mathbf{W}^Q \\\mathbf{K} = \mathbf{X}\mathbf{W}^K \\\mathbf{V} = \mathbf{X}\mathbf{W}^V\]
这个三个独立的矩阵Q、K、V会被用来计算注意力得分。这些矩阵的每一 "行 "都是一个向量,对应于源序列中的一个词。每个这样的"行"都是通过一系列的诸如嵌入、位置编码和线性变换等转换,从其相应的源词中产生。而所有这些的转换都是可训练的操作。这意味着在这些操作中使用的权重不是预先确定的,而是利用反向传播机制进行学习得到的。
1.3 QKV解析
自注意力机制中第一步就是用Token来生成查询向量、键向量和值向量,也就是用到了query,key,value(各种相关论文、网址之中也缩写为q、k、v)这三个概念。Query向量代表当前正在处理的token或位置,它表示模型需要“查询”的信息。Key向量代表序列中每个token的唯一标识,用于与Query进行比较。Value向量包含序列中每个token的实际内容或特征,它对生成当前token的输出有贡献。
要理解LLM的底层实现原理,就必须要了解Transformers Block里面的QKV矩阵,因为前沿的大模型研究工作很大一部分就是着QKV矩阵去做的,比如注意力、量化、低秩压缩等等,目标是在保证效果不变坏的前提下,进行对性能和存储的极致压缩。其本质原因是因为QKV权重占比着大语言模型50%以上的权重比例,在推理过程中,QKV存储量还会随着上下文长度的增长而线性增长,计算量也平方增加。可以说,query,key,value对于Transformers 和自注意力机制至关重要。
相信大家一直都有个疑问,为什么要取QKV这些名字?这一套思想到底怎么去理解?之前篇幅中介绍过QKV,但是始终没有深入,本篇会进行详细分析。因为深度学习其实是带有实践性质的科学,尚未找到确切的理论分析。所以接下来我们从不同理解的角度来阐释,希望读者能够从其中对QKV有所理解。
心理学角度
有研究人员发现,注意力机制可以追溯到美国心理学之父威廉·詹姆斯在19世纪90年代提出的非自主性提示(nonvolitional cue)、自主性提示(volitional cue)和感官输入(Sensory inputs)这几个概念。而这三个概念就分别可以对应到Key张量,Query张量和与Key有对应关系的Value张量,然后由这三者构建了注意力机制。
我们用个通俗例子来分析下。本来你去买盐(带有目的性的关注度,即自主性提示),结果你到了商店,发现了变形金刚,你注意力都被变形金刚(下意识的关注度,即非自主性提示)吸引了。我们可以得到:
[*]Key:一系列物品(盐和变形金刚)。
[*]Value:这一系列物品对人下意识的吸引力(在你下意识中,变形金刚的吸引力肯定比盐要高)。
[*]Query:你想要的物品(盐)。
注意力作用就是让盐(目标物品)所对应的权重值变高。这样使用该'权重向量’乘‘key’后,即使目标物品“下意识的吸引力(即key)”不够高,但是因为目标物品对应的权重高,其他物品对应的权重小,故选择到目标物品的可能性也会变大。
数据库角度
query,key,value的名称也暗示了整个注意力计算的思路,因此我们从搜索领域的业务来看Q、K、V可能更好理解。我们把注意力机制看作是一种模糊寻址,或者说是一个模糊的、可微分的、向量化的数据库(或者字典)查找机制。Q、K、V这三者的关系就是:找到与现有数据(Query)相似或者相关的数据(Key)所对应的内容(Value)。其具体特点如下:
[*]Key和Value是数据库的组件。
[*]数据库中每个元素由地址Key和值Value组成(一个数据对)。或者说,Key这个地址里面就存放了Value。
[*]Key是地址,就是要查找的位置。该地址总结了地址中Value的特征,或者说Key可以体现Value上的语义信息。
[*]Value是与地址Key相关联的值,是表征语义的真实数据,是对外提供的使用者所需的内容。
[*]Query是查询信息,是任务相关的变量。假设当前有个Key=Query的查询,该查询会通过Query和存储器内所有元素Key的地址进行相似性比较来寻址,其目的是取出数据库中对应的Value值。自注意力机制中这种Q和K一问一答的形式,问的就是Q和K两个词之间的紧密程度。直观地说,Key是Query(我们正在寻找什么)和Value(我们将实际获得什么)之间的桥梁。
[*]普通的字典查找是精确匹配,即依据匹配的键来返回其对应的值,而且只从存储内容里面找出一条内容。而注意力机制是向量化+模糊匹配+合并的组合使用。其会根据Query和Key的相似性来计算每个Key的相似度或者匹配程度(即注意力权重)。然后从每个Key地址都会取出Value,并依据匹配程度对这些value做加权求和,这个相似度得分决定了相应Value在最终输出中的权重。
用通俗例子来讲解,假如我们在淘宝上进搜索”李宁鞋“,Query(Q)就是你在搜索栏输入的查询内容。Key(K)就是在页面上返回的商品描述、标题,其实就是数据库中与候选商品相关的关键字。Value(V)就是李宁商品本身。注意力机制就是这个查询过程,即注意力是把你要查询的Q与淘宝数据库中的K进行比较,计算出这些K与Q的相似度,最终返回相似度最高的若干商品V。流程如下:
[*]用Query与数据库内所有Keys进行计算相似度(查询的相关性,即你有多大概率是我要查的东西)。
[*]得到相似度之后,对结果进行排序。
[*]基于相似度排序结果,得到需要获取的商品ID
[*]依据商品ID来获取对应的Values。
因此,自注意力机制中的QKV思想,本质是一个具有全局语义整合功能的数据库。数据对就是数据库的元素,Q就是任务相关的查询向量。
下图从数据库角度展示了自注意力的细节。
seq2seq角度
让我们回到具体任务上来分析,可能会更加清晰一点。比如在机器翻译任务中,query可以定义成解码器中某一步的隐状态,即对上一个词的预测输出。key是编码器中每个时间步的隐状态,我们用每一个query对所有key都做一个对齐,于是解码器的每一步都会得到一个不一样的对齐向量。或者说,编码器的编码序列(Encoded sequence)提供key和value 。Hidden state of Decoder 提供query 。这就好比解码器要去编码器的编码序列那里查字典一样。
重构词向量角度
前面我们从数据库角度来看到如何寻址获取讯息,其最终目的是输出一个新向量。在新的向量中,每一个维度的数值都是由几个词向量在这一维度的数值加权求和得来的。因此,自注意力机制的核心是重构词向量(查询+聚合),每个输入单词的编码输出都会通过注意力机制引入其余单词的编码信息。
相互操作
人类在读一篇文章时,为了理解一句话的意思,你不仅会关注这句话本身,还会回看上下文中相关的其他句子或词语。我们还是以之前两个句子为例进行解释。
[*]Several distributor transformers had fallen from the poles, and secondary wires were down.
[*]Transformer models have emerged as the most widely used architecture in applications such as natural language processing and image classification.
如何才能对“Transformer”这个多义词进行语义区分?我们必须考虑单词的上下文才能更好的把单词的语义识别出来,即不仅仅要考虑到词本身,还要考虑其他词对这个词的影响,也就是语境的影响。比如第一个句子的“pole”、”fallen”和“wires”这几个邻近单词暗示了“Transformer”和物理环境相关。第二个句子的“model”和“natural language processing and image classification”则直接告诉我们此处的“Transformer”是深度学习相关概念。最终我们通过上下文语境(句子中的其他词)可以推断“Transformer”的准确含义。
原理我们知道,但是如何实践?如何通过句子中的其它词来推断?人类可以知道哪些词提供了上下文,但计算机却毫无头绪,因为计算机只处理数字。解决方案就是注意力机制在Transformer中所模拟的过程。
Transformer 通过点积这个提取特征的操作将输入序列中的每个词与其他词关联起来,也就是词之间进行互相操作。然后通过加权求和把这些词加起来,最终可以捕捉到某个特定的词和句子中其他每个词之间的一些互动。于是修改后的词如下:
[*]transformer 1 = 0.7 transformer + 0.1 pole + 0.1 fallen + 0.1 wires
[*]transformer 2 = 0.6 transformer + 0.1 language+ 0.1 image + 0.2 model
最终两个transformer单词就通过和句子中其它单词的操作完成了对本身语义的重构。
我们接下来具体看看提取特征和加权求和这两个操作。
提取特征
K提取的特征是如何获得的呢?根据自注意力的思想和人脑的机制,我们需要先看过所有项才能准确地定义某一个项。因此,对于每一个查询语句Q,注意力机制会:
[*]用这个Query和每个Key通过内积的方式来计算出相似度或者相关性,以此来决定哪个元素会对目标元素造成多少影响(即Key和Query会得出对齐系数)。Key与Query越相似或者说越相关,Value的影响力就越大,越应该承担更多的对输入的预测。
[*]然后注意力机制会对点积结果进行一个softmax操作,使得所有value的权重总和为1。这是为了保证所有源元素贡献的特征总量保持一定。如果有多个key都与query高度相似,那么它们各自的通道都会只打开一部分(好像“注意力分散在这几个源元素上”)。从这个角度来看,可以理解为输出是在value之间根据key-query的相似度进行内插值的结果。很明显,这个输出表征携带了其它单词的信息。
[*]最后得到的矩阵 Y ,就是输入矩阵 X融合了上下文信息得到的在隐空间的语义矩阵,每一行代表一个token。
如果是训练过程,则在拿到Y之后,模型会通过损失函数进行计算,最终经过反向传播后,Q就能逐渐学习到V的特征。这个机制让模型可以基于相同的注意力机制学习到不同的行为,并且能够捕获序列内各种范围的依赖关系。
加权求和
让我们通过一个真实例子来理解加权求和操作。
我们希望了解郁达夫(Query),但是因为人的精力有限,所以需要把有限的精力集中在重点信息上,这样可以用更少的资源快速获取最有用的信息,效果更好。图书馆(Source)里面有很多书(Value),我们看书就相当于获取其书中的详细信息(Value)。为了提升效率,我们给每本书做了编号和信息摘要(Key)。于是我们可以通过Key搜索出来很多书,比如《薄奠》,《沉沦》,《迟桂花》,《春风沉醉的晚上》,《归航》等等,也能搜出来《大众文艺》(郁达夫曾任主编)。
通过将Query与Key中携带的信息摘要相比较,我们可以知道它们的相关程度有多高。相关性越高的书,其权重越大。前面几本书的权重就高,需要分配更多的注意力来重点看,《大众文艺》的权重就显然要略低,大致浏览即可。
假如我们一共要花费11小时在了解郁达夫上。我们会分别花费2小时在《薄奠》,《沉沦》,《迟桂花》,《春风沉醉的晚上》,《归航》,花费1小时在《大众文艺》上。我们把时间归一化成和为1的概率值,得到,所以郁达夫 = 0.18《薄奠》+ 0.18《沉沦》+ 0.18《迟桂花》+ 0.18《春风沉醉的晚上》+0.18《归航》+0.09《大众文艺》。最终得到的信息是所有书籍内容按照权重综合起来的结果。这样当我们全部看完以上几本书后,就对郁达夫有一个全面的了解,就是加权求和。
注意力机制本质就是使用 Q 和 K 来计算出“注意力权重“,然后利用注意力权重对V进行加权求和。从机制上看,注意力机制聚焦的过程体现在权重系数上,权重越大表示投射更多的注意力在对应的值上,即权重代表了信息的重要性。注意力机制可以被解释为将多个局部信息源路由到一个局部表征的全局树结构中。在这个例子中,我们计算相关性就相当于注意力机制中的 \(QK^T\) ,归一化就是softmax操作,然后通过加权求和取得最后的阅读量/特征向量。
Elhage重构了注意力头的表达形式(仍然等价于vanilla Transformer的设计),重构的表示可以表达为如下公式,可以看出来相互操作、提取特征和加权求和的特点。
1.4 小结
我们以”我吃了一个苹果“为例来看看自注意力的流程。
[*]首先确定哪个目标token来作自注意力机制,这个目标token是”一个“,即让”一个“来判断它和其他三个词之间的关系
[*]”一个“会对”我吃了一个苹果“这句话中所有token都做一遍点积,然后做softmax操作做归一化,生成权重。
[*]用权重和V向量相乘,得到加权之后的向量,即”一个“可以用0.2 * 我 、0.1 * 吃了、 0.5 * 一个和 0.3 * 苹果 来组合表示。所以”一个“的带有词关联性的表示为:\(一个 = 0.2 \times 我 + 0.1 \times 吃了 + 0.5 \times 一个 + 0.3 \times 苹果\)。在新的向量中,每一个维度的数值都是由几个词向量在这一维度的数值加权求和得来的,这个新的向量就是"一个"词向量经过注意力机制加权求和之后的表示,该词具备词关联性。
[*]解码输出”an“。
可以看出,“一个”在全句中,除了自己之外,与“苹果”关联度最大,其次是“我”。所以“一个”这个词也可以理解为“我-一个-苹果”。这便把“一个”在这句话中的本质通过“变形”给体现出来了。“一个”本身并没有变,而是通过“变形”展示出了另外一种变体状态“我-一个-苹果”。外在没变,灵魂变了。
可以看到,自注意力机制是一种动态的、数据驱动的变换,是对输入向量空间的一种动态变换。这种变换不是固定的,而是依赖于输入数据的内容来决定的。因此,注意力的本质思想可以改写为如下公式:通过计算相似性得出权重最后加权求和。
\
0x02 实现
2.1 权重矩阵
现在的神经网络很少有将 Word Embedding 直接参与一些网络结构的计算,一般都会先做一个线性变换。实际上,Transformer是把每个 token 的 Embedding 向量x分别乘以三个不同的权重矩阵\(W^T,W^Q,W^V\),作三次线性投影(或称为线性变换),派生出Q、K、V三个矩阵(注意,这里提到的“权重”,是指神经网络中的连接权重,与Attention中token之间的语义关联权重不是一个意思)。而且,每个Transformer block都有自己的\(W^T,W^Q,W^V\)。
这三个权重矩阵是在模型训练过程中通过反向传播训练出来的。在训练阶段,模型会对这三个权重矩阵进行随机初始化。在模型的执行阶段(预测阶段),这三个矩阵是固定的,即 Transformer 神经网络架构中固定的节点连接权重,是早就被预先训练好的了(Pre-Trained)。\(W^T,W^Q,W^V\)这三个矩阵实际上是模型学会的分配Q,K,V的逻辑。
https://img2024.cnblogs.com/blog/1850883/202503/1850883-20250304231826016-1635537392.jpg
为什么要引入权重矩阵?或者说,为什么不直接使用 X 而要对其进行线性变换?为何要从一个序列中的每一个 token 的 Embedding 派生出三个向量Q、K、V(即查询向量、键向量和值向量)呢?主要可以从如下方面进行思考。
首先看看直接使用embedding的缺点。
[*]输入的 Embedding 其实只做了一次线性变换,特征提取能力或者表示学习的能力及其有限。
[*]一个点积操作中没有什么可以学的参数。为了识别不一样的模式,我们希望有不一样的计算相似度的办法以及更多的参数。
[*]如果直接对原始的embedding做自注意力操作,则计算的相似度结果是个对称矩阵,对角向上的值一定是最大的。因为每个字/词必定最关心自己,这样背离了自注意力操作的初衷。
[*]\(Q*K^T\)大概率会得到一个类似单位矩阵的attention矩阵,这样self-attention就退化成一个point-wise线性映射,捕捉注意力的能力就会受限,i,j 位置之间的前后向注意力就会变得一样。而我们一般期望两个token在一句话中先后顺序也能反映一定的不同信息。对于两个词语,A对于B的重要性,不一定等同于B对A的重要性。比如:”A爱B“和”B爱A“的程度不一定一样。
[*]这个对称矩阵的对角线上的值大概率是本行最大的,这样 softmax 后对角线上的注意力一定是本行最大,也就是不论任何位置任何搭配,每个token的注意力几乎全在自己身上,这样违背了Transformer用自注意力机制捕捉上下文信息的初衷。
我们再看看使用权重矩阵的优势所在。
[*]匹配。\(\alpha_{ij}\)要通过计算\(ℎ_i\)和\(s_j\)之间的关系得到,一个最简单的办法就是把这两个矩阵直接相乘。但是这样可能会有问题:两个矩阵可能形状不匹配,没法直接做矩阵乘法。而给这两个矩阵分别左乘一个矩阵\(W^K\)和\(W^Q\)就可以解决上述两个问题。
[*]可学习。在注意力机制中,每一个单词的query, key, value应该不仅仅只和该单词本身有关,而应该是和对应任务相关。每个单词的query, key, value不应该是人工指定的,而应该是可学习的。因此,我们可以用可学习的参数来描述从词嵌入到query, key, value的变换过程。这样经过大量训练之后,每个元素都会找到完成各自任务所需的最合适的query、key和value。这些相关的训练参数就在三个权重矩阵中。
[*]增加拟合能力。三个权重矩阵都是可训练的,这增加了模型可学习的参数量,扩展了特征空间,增加了模型的拟合能力。
[*]信息交换。我们指定输入矩阵X的第 i 行表示第 i 个时刻的输入 \(x_i\)。对于此矩阵中的向量来说,权重矩阵\(W^T,W^Q,W^V\)在整体运行过程中是共享的。即,不同的\(x_i\) 共享了同一个\(W^T,W^Q,W^V\),通过这个操作,\(x_1\)和\(x_2\)已经发生了某种程度上的信息交换。也就是说,单词和单词通过共享权值已经相互发生了一定程度的信息交换。
另外,也许读者会问,既然K和Q都是一样维度,为什么不合用一个权重矩阵呢?或者说,为何要使用三个不同的权重矩阵?使用不同的权重矩阵生成的主要原因是:为了提供更灵活的模型表示能力和捕捉数据中的复杂依赖关系。其实,此处也回答了为何要区分Q、K和V。
[*]增加表达能力。加入了不同的线性变换相当于对 x 做了不同的投影,将向量 x 投影到不同空间,这意味着Q和K可以在不同的语义空间中进行表达,有助于模型捕捉更丰富的语义信息和依赖关系。
[*]区分不同角色或者说角色分离:在自注意力机制中,Q、K和V扮演着不同的角色。Q代表了我们要查询的信息或者说当前位置希望获得的信息,K代表了我们用来与Q匹配的键或者说序列中各位置能提供的信息,而V代表了一旦找到匹配,我们要提取的值或者说应该从各位置获取的实际内容。使用不同的权重矩阵能够更好地区分这些不同的角色,使用不同的权重矩阵为Q和K提供了能力去捕捉不同的依赖关系,增强了模型对输入数据的理解。提高模型的效果。
[*]增加灵活性。如果Q和K使用相同的权重矩阵,则其结果和使用X自身进行点乘的结果相同,那么它们之间的关系会被严格限制在一个固定的模式中,这限制了模型的灵活性。而直接从Q得到V会忽略了通过K来确定相关性的重要性,也减少了模型处理信息的灵活性。
[*]并行处理。Transformer模型的设计允许在处理序列时进行高效的并行计算。Q、K、V的独立使得模型可以同时计算整个序列中所有位置的注意力分数,这大大提高了计算效率。
总的来说,虽然在某些情况下使用相同的值进行自身的点乘(或者共享权重矩阵)可能也能工作得很好,但使用不同的权重矩阵为Q和K提供了更大的灵活性和表示能力,有助于提升模型性能和泛化能力。
我们再用三个权重矩阵来细化注意力公式如下。
2.2 计算过程
缩放点积注意力(Scaled Dot-Product Attention)模块的公式如下:
此公式中,\(d_k\)是向量的维度,且\(d_k=d_q=d_v\),如果只设置了一个头,\(d_k\)那就是模型的维度\(d_{model}\),如果设置了8个头,则\(d_k=d_{model}/8\),且如果模型的维度是512维,则\(\sqrt{d_k}\) 即等于8。Q和K的维度均是\((L,d_k)\),V的维度是\((L,d_v)\),其中L是输入序列长度。\(softmax(QK^T)\)的维度是\((L,L)\),\(Attention(Q,K,V)\)的输出维度是\((L,d_v)\)。
我们梳理下计算过程如下(对应上图中从下到上的顺序):
[*]输入。Q、K、V是把输入映射成高维空间的点,它们之间的关系通过后续的变换来捕捉。
[*]计算分数(score function)。Query和所有的Key进行相似度计算,得到注意力分数(查询的相关性)。计算公式为\(s_i = a(q, k_i)\)。也就是Q 矩阵和 K矩阵的转置之间做矩阵乘法(即点积)。这一步是计算在高维空间中度量向量之间的相似性。
[*]缩放。对得分矩阵scores进行缩放,即将其除以向量维度的平方根\(\sqrt{d_k}\)。
[*]掩码。若存在掩码矩阵,则将掩码矩阵中值为True的位置对应的得分矩阵元素置为负无穷。这是由于在整个模型的运行过程中,可能需要根据实际情况来忽略掉一些输入。我们将在下一篇进行详细解释。
[*]归一化(alignment function)。对点积结果进行归一化,即使用softmax操作将权值进行归一化,这样可以更加突出重要的权重。计算公式为\(a = softmax(s_i)\)。这一步是将实数域的分数映射到概率分布上。
[*]生成结果(context vector function)。使用a对Value进行加权平均的线性变换,可以理解为输出y是在value之间根据key-query的相似度进行内插值。计算公式为\(Attention\ Value=\sum_ia_iv_i\)
从泛函分析的角度来看,Attention机制中的相关性计算和加权求和步骤可以看作是对输入向量空间的一种动态变换。这种变换不是固定的,而是依赖于输入数据的内容来决定的。
我们接下来对上面过程中的一些重点进行详细梳理。
2.3 点积注意力函数
Transformer论文使用了乘法函数或者说点积注意力函数来计算相似度。从抽象代数的角度来看,注意力机制更像是一个关系运算:用两个元素之间的关系(比如相似度)来决两个元素是否属于同一个类。分类之后才会基于输入元素之间的相似性进行加权组合。
方案选择
如下所示,常见的相似度计算有点积(相乘)和相加。
\ \\sim(q,k)=w^T\ [拼接相似度] \\sim(q,k)=\frac{q^Tk}{||q||\ ||k||}\ [余弦相似度]\]
其中拼接相似度是将两个向量拼接起来,然后利用一个可以学习的权重
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]