自注意力机制

自注意力(Self-Attention)机制是一种特殊的注意力机制,它允许模型在处理一个序列时,考虑到序列中每个元素其他所有元素的关系。这种机制可以帮助模型更好地理解序列中的上下文信息,从而更准确地处理序列数据。 (序列数据是一种数据类型,其中的元素存在特定的顺序。每个元素都有特定的位置,且位置之间的顺序关系对于数据的含义和处理方式有重要影响)

在自注意力机制中,模型会计算序列中每个元素与其他所有元素的关联度(或称为权重)。这些权重反映了元素之间的相互关系,比如在语言模型中,它们可以反映词与词之间的语义关联度。(比如机器翻译)

1
举例:以"the 2022 Beijing Winter Games"为例,当模型处理"Games"这个词时,通过自注意力机制,它可以考虑到"2022"、"Beijing"和"Winter"这些词的信息。这样,模型就能理解到"Games"在这里并不是指一般的"游戏",而是指特定的"比赛",并且这个"比赛"是在"2022年"、在"北京"举行的那就很好的理解为是"冬季奥运会"。

如何计算权重

理解查询(Query)键(Key)和值(Value)

对于输入序列中的每个元素,我们都会计算一个查询向量、一个键向量和一个值向量。(每一个元素都有QKV三个对应的矩阵)

1
举例说明:假设你在图书馆里,你想找一本关于"如何暴富"的书。你的查询(Query)就是"如何暴富"。 图书馆的图书管理员就像是自注意力机制,他们需要根据你的查询(Query)在图书馆的大量书籍中找到相关的书。每一本书都有一个书名,这就是键(Key)。图书管理员会比较你的查询(Query)和每一本书的键(Key),也就是查询内容“如何暴富”和每一本书名进行比较,以确定哪些书与你的查询相关。 每一本书都有一些具体的信息,比如书的内容、作者等,这就是值(Value)。一旦图书管理员找到了与你的查询(Query)匹配的键(Key),他们就会给你那本书的值(Value),也就是你想要的书。

当模型处理一个词(比如“games”)时,他会生成一个查询(QUERY).然后,模型会比较这个查询和其他所有词的键,以确定那些词与当前处理的词相关。最后,模型会根据这些相关词的值来更新当前处理的词的表示。所以,当模型处理”Games”这个词时,它可能会发现”2022”、”Beijing”和”Winter”这些词的键(Key)与”Games”的查询(Query)匹配,然后,模型就会考虑这些词的值,从而理解到“Game”这里并不是指一般的”游戏“,而是指特定的比赛,并且这个比赛是在”2022年”、在”北京”举行的”冬季奥运会”。

过程说明:

img

注意力权重就是值向量

  1. 计算查询、键、值:对于输入序列中的每个元素,我们都会计算一个查询向量、一个键向量和一个值向量。这些向量是通过学习得到的权重矩阵与输入元素的线性变换得到的。 假设我们的输入序列为权重矩阵为

    image-20251024193430127

    那么对于每个元素我们有,image-20251024193506001 其中image-20251024193527578分别表示第个元素的查询、键和值向量。(从矩阵中进行线性组合(一个元素有一个向量)这个向量与矩阵相乘会获得每个矩阵的查询向量。

  2. 计算注意力分数: 对于每一对元素image-20251024193736926, 我们计算一个注意力 分数, 表示 对 的注意力程度。

  3. 注意力分数是通过查询向量 和键向量的点积, 然后再除以一个缩放因子(通常是键向量维度的平方根) 得到的: image-20251024193942105其中 image-20251024194025621是键向量的维度。

  4. 计算注意力权重: 然后, 我们通过 softmax 函数使得注意力分数转为化0和1之前的数值且和为1,进而得出注意力权重, : image-20251024194100666用自然对数

  5. 计算输出: 最后, 我们将每个元素的值向量与其对应的注意力权 重相乘, 然后求和, 得到最终的输出: image-20251024194222275这些权重会被用来组合输入的词向量,生成一个新的上下文相关的词向量。这个词向量不仅包含了当前词的信息,还包含了其上下文的信息。这样,模型就能更好地理解每个词在具体上下文中的含义。

多头注意力机制

img

在多头注意力机制中,输入数据首先会被分成多个“头”(每个头包含若干个单词,以机器翻译为主),每个“头”都有自己的查询(Query)、键(Key)和值(Value)向量。每个头都会独立地进行自注意力计算,得到自己的注意力输出,计算过程与上面描述一致,最后将这些输出$z_i$拼接在一起,形成最终的输出。

image-20251024194535797

其中,image-20251024194640002是输出权重矩阵,image-20251024194655618是拼接操作。

image-20251024194818057函数的作用是将多个向量或矩阵在某一维度上进行拼接。在多头注意力机制中,image-20251024194823304 函数用于将每个头的注意力输出向量拼接成一个大的向量。

1
2
具体来说,假设我们有h个头,每个头的注意力输出是一个d维的向量,那么通过 
textConcat函数拼接后,我们会得到一个 h*d 维的向量。这个大的向量包含了所有头的注意力输出信息。 可以让模型同时考虑到所有头的信息。因为每个头可能关注输入序列的不同部分,所以通过拼接,我们可以将这些不同的信息整合在一起,从而得到一个更全面的表示。

多头注意力机制的优点是可以让模型同时关注输入序列的不同位置,从而捕捉更丰富的信息。例如,在处理自然语言时,模型可能需要同时关注一个句子中的主语和宾语,以理解句子的含义。通过多头注意力机制,模型可以在每个头中关注句子的不同部分,从而更好地理解句子的含义。

其他说明

上下文注意力机制Contextual Attention):这种注意力机制主要是在处理自然语言处理任务时使用的,它的主要目标是根据上下文信息来理解和生成语言。在这种机制中,模型会考虑到一个词的上下文信息(即它周围的词),并根据这些信息来确定它的含义。这种机制通常在词嵌入模型(如Word2Vec或GloVe)或者是语言模型(如BERT或GPT)中使用。

编码器-解码器注意力机制(Encoder-Decoder Attention):这种注意力机制主要是在处理序列到序列(Seq2Seq)任务时使用的,如机器翻译或者是文本摘要。在这种机制中,模型会在编码阶段将输入序列编码为一个固定长度的向量,然后在解码阶段根据这个向量来生成输出序列。在生成每一个输出元素时,模型会考虑到输入序列中的所有元素,并根据它们的重要性赋予不同的权重。这种权重通常是通过计算输入和输出元素之间的相似度得到的。