注意力机制最早是由神经科学家 Donald Olding Hebb 在 1949 年提出的。Hebb 观察到,大脑中的突触连接强度会随着两个神经元的活动的相互关联性而增强。他提出了“细胞之间的联结,就是心理之间的联结”的著名原则,即被称为“赫布学习规则”。

在深度学习领域,注意力机制在 2014 年由 Bahdanau 等人首次引入到神经网络机器翻译模型中,这种模型也被称为“注意力机制编码器-解码器模型”。在该模型中,通过计算 Query 和 Key 的相似性,进而计算权重以确定 Value 的权重,从而实现对输入序列中不同位置的特征进行加权处理。

注意力机制原理

注意力机制是一种模仿人类注意力机制的机制,它允许神经网络在处理序列数据时集中注意力于最相关的部分。其原理可以概括如下:

输入表示:首先,输入数据会被转换成一个表示形式,通常是一个向量序列,比如词嵌入序列或者特征向量序列。

注意力权重计算:然后,通过某种方式计算每个输入位置的注意力权重。这些权重表示了模型在当前位置上应该关注输入序列中的哪些部分。常见的计算方式包括点乘注意力、加性注意力、缩放点乘注意力等。

加权求和:计算得到的注意力权重与输入表示进行加权求和,以获得上下文向量或加权表示。这个上下文向量包含了输入序列中每个位置的信息,而且对应位置的权重与其在上下文中的重要性成正比。

输出生成:最后,使用上下文向量或加权表示作为输入,进行后续的处理,比如生成下一个单词的预测结果或者执行分类任务等。

总的来说,注意力机制允许模型动态地分配注意力,以便在不同的输入位置上学习并利用信息。这使得模型更加灵活和适应不同长度的输入序列,同时也提高了模型的性能和泛化能力。

编码器与解码器

编码器(Encoder)和解码器(Decoder)是深度学习中重要的组成部分,尤其是在序列到序列(sequence-to-sequence, Seq2Seq)模型中应用广泛,例如机器翻译、语音识别等任务。以下是它们的详细解释和原理:

编码器(Encoder)

编码器的作用是将输入序列转换为隐藏表示或者特征向量,捕捉输入序列中的信息。在自然语言处理任务中,输入序列通常是一个单词序列或者句子序列。

输入表示转换:首先,输入序列中的每个单词或者字符通常会被转换成向量表示,例如使用词嵌入(word embeddings)来表示每个词语。

逐步处理:编码器会逐步处理输入序列。对于每一个时间步(每个单词或字符),编码器会产生一个隐藏状态向量。常见的编码器结构包括循环神经网络(RNN)和长短时记忆网络(LSTM),也有基于自注意力机制的Transformer编码器。

信息聚合:随着输入序列的处理,编码器通过隐藏状态向量逐步聚合输入序列中的信息,尝试捕捉句子的语义和语法结构。

最终表示:当编码器处理完整个输入序列后,通常会得到一个最终的表示,可以是整个输入序列的汇总或者最后一个时间步的隐藏状态。这个向量通常被用作解码器的初始隐藏状态或者上下文向量。

解码器(Decoder)

解码器接受编码器生成的隐藏表示,并且将其解码为目标序列。解码器通常用于生成与输入序列不同的输出序列,例如机器翻译任务中将源语言句子翻译成目标语言句子。

初始状态:解码器的初始隐藏状态通常由编码器最后的隐藏状态或者上下文向量来初始化。

生成序列:解码器以逐步生成的方式产生输出序列。在每一个时间步,解码器会生成一个单词或者字符,并且更新自己的隐藏状态。

注意力机制:为了更好地捕捉输入序列中的信息,解码器通常使用注意力机制(attention mechanism),使其能够在生成每个输出的同时关注输入序列中不同位置的相关信息。

结束条件:解码器会一直生成输出,直到生成特殊的结束标记或者达到预定义的最大长度。
下图是一个编码器与解码器的示例。
在这里插入图片描述

Q K V的解释

  • Query(查询):表示当前位置的特征向量

用来寻找与其相关的信息。在自注意力机制中,Query用来衡量输入序列中各个位置的重要性,即决定“我关注哪里”。

  • Key(键):表示用来比较的特征向量

在计算注意力时起到了一种索引或者检索的作用。Key用来衡量与Query的相似程度,即决定“这里有哪些信息”。当说到"key表示用来比较的特征向量"时,它指的是在注意力机制中,Key(键)起到了一种索引或者检索的作用。具体来说,Key是来衡量Query和其他位置的相似程度,从而帮助确定哪些信息应该受到更多的关注。
在自注意力机制(Self-Attention Mechanism)和全局注意力机制(Global Attention Mechanism)中,K(Key)的作用略有不同。

自注意力机制(Self-Attention Mechanism):
在自注意力机制中,K(Key)表示用来比较的特征向量。在自注意力机制中,我们有一组输入序列 {x1, x2, …, xn},其中每个位置的特征向量被用作Query、Key和Value。当计算某个位置的注意力权重时,将使用该位置的Query向量与所有位置的Key向量进行比较,以确定该位置对其他位置的关注程度。因此,K(Key)在自注意力机制中是用来计算注意力权重的重要组成部分。
在自注意力机制中,Q、K、V都来自于同一位置的隐藏状态,这样做的目的是为了利用当前位置的信息来捕捉序列内部的依赖关系。这种设计使得模型能够根据当前位置对序列中其他位置的重要性进行动态调整。
自注意力机制的关键在于对序列中不同位置之间的关系进行建模,而每个位置的隐藏状态是反映该位置周围局部信息的最好方式。因此,Q、K、V都基于同一隐藏层的输出,确保了模型能够在每一步有效地理解序列中的上下文关系。
应用于编码器的自注意力

全局注意力机制(Global Attention Mechanism):
在全局注意力机制中,K(Key)则表示来源于另一个序列的特征向量,用来与当前序列的Query进行比较。这种情况下,我们有两个序列,分别为当前序列和另一个序列,比如翻译任务中的源语言序列和目标语言序列。在全局注意力机制中,我们使用当前序列的Query向量与另一个序列的Key向量进行比较,以计算当前序列位置对另一个序列的关注程度。
在解码器中,注意力机制的作用不仅包括捕捉输入序列的信息,还要根据当前正在生成的部分序列(Decoder的状态)来对输入序列进行对齐和生成输出。具体步骤如下:
Q、K、V的生成:
计算注意力分数:
在解码器中,Q通常是当前解码器位置的隐藏状态,用于计算与输入序列各个位置的关注程度。K通常是编码器输出的隐藏状态,代表输入序列的信息。这种设计允许解码器根据当前正在生成的部分序列来对输入序列进行动态关注。
加权求和生成输出:
使用注意力分数加权求和V向量,生成解码器当前位置的输出表示。这个输出表示通常会进一步送入生成单词的softmax层,用于预测下一个输出单词。
分配注意力的原理
为什么K是来自编码器中的隐藏状态,而Q是来自解码器中的隐藏状态呢?这主要是为了保证模型在生成输出序列时能够有效地对输入序列进行对齐和理解,同时考虑到当前解码器状态的影响。
K来自编码器的隐藏状态:编码器的目标是对输入序列进行编码,生成其隐藏表示。因此,K向量从编码器的输出中提取了输入序列的语义信息,帮助解码器理解输入序列的内容。
Q来自解码器的隐藏状态:解码器的目标是生成输出序列。因此,Q向量来自当前解码器位置的隐藏状态,它表示解码器当前生成部分序列的状态,用来计算对输入序列每个位置的注意力分布,以决定生成输出序列的下一个元素。

Value(值):表示对应于Key的真正数值

是需要被赋予的权重,或者说是需要被关注的信息。Value用来根据Query和Key的关系来加权组合,即决定“信息是什么”。在这个过程中,Value 所对应的特征向量会根据注意力权重对不同位置的真正数值信息进行加权汇总,从而得到最终的输出特征表示。

最常用的注意力分数及权重计算方式为:
Attension Score = Q × KT / √dk

其中dk是键向量的维度。

注意力权重:

Attension Weights = Softmax(Attension Score)

加权求和

Output=Attention Weights×V

对于kv缓存的区别

普通注意力机制

长序列处理:在处理长序列时,尤其是在自然语言处理中处理长句子或长文档时,每个位置的查询可能需要与序列中其他位置的键进行注意力计算。如果每次都重新计算键值对,会导致计算复杂度极高,而且可能无法在有限的资源下完成。所以,中间计算结果可以被缓存起来。

多头注意力机制(Multi-Head Attention)

多头注意力机制引入了多个注意力头,每个头都有自己独立的查询、键、值。关键点在于:

并行性:每个注意力头都独立计算自己的查询、键、值,然后并行地计算注意力权重。尽管每个头都是独立的,但它们可能会从之前计算的KV对中受益。

重复利用:在处理长序列时,不同头之间可能会共享一些计算的中间结果,如KV对。这些中间结果可以被缓存起来,以便在计算过程中重复使用,从而提高计算效率。

自注意力机制(Self-Attention)

在自注意力机制中,每个位置的查询、键、值都是基于当前位置的输入计算得到的。它们用于计算该位置与序列中其他位置的注意力权重。关键点在于:

独立性:每个位置的查询、键、值是根据当前位置的输入计算得到的,相互之间没有直接的重复利用的必要性。因此,自注意力机制在计算时并没有显式地缓存和重复使用之前计算的KV对。

实时性:每次处理一个序列时,都会重新计算每个位置的查询、键、值。这确保了模型在每次计算注意力时都能考虑到最新的输入。

求解注意力权重

点积或者Cosine相似性:在自注意力机制中,通过Q和K的点积或者Cosine相似性来度量它们之间的相似程度,从而得到它们的相关性。这种度量方法简单高效,能够很好地捕捉到Query和Key之间的关联关系。

引入额外的神经网络:有时候,直接使用QK的点积或者Cosine相似性可能无法捕捉到复杂的关联关系,特别是当输入的维度较高或者数据分布较为复杂时。因此,通过引入额外的神经网络来学习QK之间的复杂关系,可以提高模型的表达能力,使得注意力机制能够更好地捕捉到输入序列中的重要信息。

以下是几种常见的注意力权重的计算方式
在这里插入图片描述

注意力机制作用区域

  1. 计算区域

根据Attention的计算区域,可以分成以下几种:

1)Soft Attention,这是比较常见的Attention方式,对所有key求权重概率,每个key都有一个对应的权重,是一种全局的计算方式(也可以叫Global Attention)。这种方式比较理性,参考了所有key的内容,再进行加权。但是计算量可能会比较大一些。

2)Hard Attention,这种方式是直接精准定位到某个key,其余key就都不管了,相当于这个key的概率是1,其余key的概率全部是0。因此这种对齐方式要求很高,要求一步到位,如果没有正确对齐,会带来很大的影响。另一方面,因为不可导,一般需要用强化学习的方法进行训练。(或者使用gumbel softmax之类的)

3)Local Attention,这种方式其实是以上两种方式的一个折中,对一个窗口区域进行计算。先用Hard方式定位到某个地方,以这个点为中心可以得到一个窗口区域,在这个小区域内用Soft方式来算Attention。

普通的注意力机制:

在普通的注意力机制中,查询和键是来自不同的输入序列,例如在编码-解码框架中,编码器的隐藏状态作为键,解码器的隐藏状态作为查询。
该机制常用于序列到序列的任务,如机器翻译,其中需要关注输入序列中不同位置的信息以生成输出序列。

自注意力机制:

在自注意力机制中,查询、键和值都来自同一个输入序列,即自身的不同位置之间进行注意力计算。
通过自注意力机制,模型可以学习在给定序列中不同位置之间的依赖关系,并且能够更好地捕捉长距离依赖关系,因此在处理长文本、长句子等任务时效果更好。
自注意力机制的提出主要基于以下原因:

长距离依赖:传统的循环神经网络(RNN)在处理长距离依赖关系时存在梯度消失或梯度爆炸的问题,而自注意力机制能够更好地捕捉长距离依赖。

并行计算:自注意力机制可以进行并行计算,因为每个位置的注意力权重独立计算,不受序列长度的影响,因此在计算效率上有优势。

表征能力:自注意力机制能够学习到输入序列中不同位置之间的关系,使得模型能够更好地理解序列中的内部结构和语义关联。

因此,自注意力机制在自然语言处理领域得到了广泛应用,特别是在Transformer等模型中取得了显著的成功,成为了自然语言处理中的重要技术。

几种经典注意力网络

待更新

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐