Transformer详解(二):Attention机制

article/2025/10/14 22:34:42

1.Encoder-Decoder中的attention机制

上一篇文章最后,在Encoder-Decoder框架中,输入数据的全部信息被保存在了C。而这个C很容易受到输入句子长度的影响。当句子过长时,C就有可能存不下这些信息,导致模型后续的精度下降。Attention机制对于这个问题的解决方案是在decoder阶段,每个时间点输入的C都是不一样的。而这个C,会根据当前要输出的y,去选取最适合y的上下文信息。
整体的流程如下图所示

从图上可以看出,在Decoder结构中,每一个时间点的输入都是不同的。这就是attention机制起作用的地方。对于Encoder中包含的输入内容的信息,attention机制会根据当前的输出,对Encoder中获得的输入做一个权重分配。这一点和人类的注意力也很像。当人在翻译句子中某个词的时候,肯定也会有所针对的看原句中的对应部分,而不是把原句所有词都同等看待。
下面举一个具体的翻译的例子,

Encoder模型中的h1,h2,h3,h4可以看做是输入‘我爱中国’所代表的信息。如果不做处理的话,那么c就是一个包含h1到h4全部信息的一个状态。现在对于不同的隐状态h,配以不同的权重a。这样,在输出不同的词的时候,虽然h的值都一样,但h对应的a的值是不同的。这就会导致c是不一样的。在输出每一个y的时候,输入进来的c都是不同的。
这个过程与人的注意力非常相像。以图中的翻译为例,输出的一个词 I 与中文的我关系最密切,所以h1分配的权重最大,也就是将翻译的注意力集中在h1。这里的权重a,是通过训练得来的。对于而言,是通过decoder的上一个隐状态ci和encoder的隐状态hj学习得来的。

具体到RNN模型的decoder模型来讲,在时刻i,如果要生成yi单词,我们可以得到在生成Yi之前的时刻,i-1时,隐层节点i-1时刻的输出值,而我们的目的是要计算生成Yi时输入句子中的每个词对Yi来说的注意力分配概率分布,那么可以用Target输出句子i-1时刻的隐层节点状态去和输入句子Source中每个单词对应的RNN隐层节点状态hj进行对比,即通过函数

来获得目标单词yi和每个输入单词对应的对齐可能性,这个F函数在不同论文里可能会采取不同的方法,然后函数F的输出经过Softmax进行归一化就得到了符合概率分布取值区间的注意力分配概率分布数值。

总结一下,对于encoder-decoder模型中的attention机制。

在decoder阶段,生成最后的输出时

其中,每个ci包含了对于最初输入句子中每个词的注意力分配。

这里f2表示encoder模型中的变换函数。在RNN的实例中,f2的结果就是RNN模型中的隐层状态值h。
g函数通常使用求和函数。

这里的L表示了句子的长度。
以上内容就是在Encoder-Decoder结构下的attention机制。

2. Attention机制

如果离开上面提到的Encoder-Decoder框架,单纯的讨论attention机制,会发现attention机制的核心就是从大量的信息中有选择的选择重要信息。捕获到对当前任务有用的重要的信息。
我们把输入的内容作为source,生成的目标作为target。
source可以看成由一个一个的<key,value>对组成的,target里面含有不同的query。
Attention机制的作用就是计算每一个query,在source中的值。


整个的计算过程分成两步。
第一步,计算source中的所有的key与query的相似性,并对计算得到的全部相似性做softmax归一化处理。
第二步,根据第一步中得到的权重,对value进行加权求和。
整个计算流程如下图所示

3. Self-Attention

在前面机器翻译的例子中,输入和输出的长度是不一样的。因为语言不同,所以句子长度通常不一样。在 self-attention中,我们可以认为source = target。 self-attention可以捕捉到句子里面的长依赖关系。
比如,对于句子

The animal didn't cross the street because it was too tired。

这里想要知道这个it代指的到底是什么,self-attention可以捕捉到句子中的长依赖关系。(Self-Attention 的核心是用文本中的其它词来增强目标词的语义表示,从而更好的利用上下文的信息。)将其结果可视化如下图所示。

传统的RNN,LSTM网络,如果面对长句子的话,这种距离较远的依赖关系相比之下很难捕获到,因为根据RNN/LSTM的结构,需要按顺序进行序列计算,所以距离越远,关系越难捕捉。 而self-attention是针对句子中所有词两两计算,不存在距离长短这一说。此外,self-attention相比循环网络还有另外一个优点是便于并行计算。

3.1 下面将介绍self-attention的具体计算

首先,对于每一个词向量,我们创建3个向量,分别是query,key,value。
这三个向量是词向量与训练好的权重矩阵 分别相乘得到的。     

       计算自注意力的第一步就是从每个编码器的输入向量(每个单词的词向量)中生成三个向量。也就是说对于每个单词,我们创造一个查询向量、一个键向量和一个值向量。这三个向量是通过词嵌入与三个权重矩阵后相乘创建的。

       可以发现这些新向量在维度上比词嵌入向量更低。(他们的维度是64,而词嵌入和编码器的输入/输出向量的维度是512。)但实际上不强求维度更小,这只是一种基于架构上的选择,它可以使多头注意力(multiheaded attention)的大部分计算保持不变。

接下来,对于每个q而言,分别计算这个q与所有k的得分。计算公式

这里除以分母的作用是为了后面计算中有稳定的梯度。对于q1而言,经过计算后,获得了

n维句子的长度。
下一步把这些score进行softmax归一化。然后将归一化的结果与value向量相乘,获得最后的结果。

计算过程图

当遇到一个词的时候,整个的计算流程就和刚才介绍的一样。那么整个这个self-attention的作用是什么呢?其实是针对输入的句子,构建了一个attention map。假设输入句子是‘I have a dream’,整个句子作为输入,矩阵运算后,会得到一个4*4的attention map。如下图所示。

self-attention结构在Transformer结构中是非常重要的一步,这里先将其的基本过程梳理清楚。
对于Transformer结构的讲解,将在下一篇文章中详细介绍。

3.2 通过矩阵运算实现自注意力机制

在实际的应用场景,为了提高计算速度,我们采用的是矩阵的方式,直接计算出Query, Key, Value的矩阵,然后把embedding的值与三个矩阵直接相乘,把得到的新矩阵Q与K相乘,乘以一个常数,做softmax操作,最后乘上V矩阵

这种通过 query 和 key 的相似性程度来确定 value 的权重分布的方法被称为scaled dot-product attention

A(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V

Q,K,V的大小为[batch_size ,seq_length ,hidden_size].

3.3 Self-Attention知识点

3.3.1 Self-Attention 的时间复杂度是怎么计算的?

Self-Attention 时间复杂度:O(n^2\cdot d) ,这里,n 是序列的长度,d 是 embedding 的维度,不考虑 batch 维。

Self-Attention 包括三个步骤:相似度计算,softmax 和加权平均。

它们分别的时间复杂度是:

相似度计算 可以看作大小为(n,d)和(d,n)的两个矩阵相乘:(n,d)\ast (d,n)=O(n^2\cdot d) ,得到一个(n,n)的矩阵。

softmax 就是直接计算了,时间复杂度为O(n^2)

加权平均 可以看作大小为(n,n)和(n,d)的两个矩阵相乘:(n,n)\ast (n,d)=O(n^2\cdot d) ,得到一个(n,d)的矩阵。

因此,Self-Attention 的时间复杂度是O(n^2\cdot d)

这里再提一下 Tansformer 中的 Multi-Head Attention,多头 Attention,简单来说就是多个 Self-Attention 的组合,它的作用类似于 CNN 中的多核

多头的实现不是循环的计算每个头,而是通过 transposes and reshapes,用矩阵乘法来完成的。

In practice, the multi-headed attention are done with transposes and reshapes rather than actual separate tensors. —— 来自 google BERT 源代码注释

Transformer/BERT 中把 d ,也就是 hidden_size/embedding_size 这个维度做了 reshape 拆分,可以去看 Google 的 TF 源码或者上面的 pytorch 源码:

hidden_size (d) = num_attention_heads (m) * attention_head_size (a),也即 d=m*a。

并将 num_attention_heads 维度 transpose 到前面,使得 Q 和 K 的维度都是 (m,n,a),这里不考虑 batch 维度。

这样点积可以看作大小为 (m,n,a) 和 (m,a,n) 的两个张量相乘,得到一个 (m,n,n) 的矩阵,其实就相当于 m 个头,时间复杂度是O(n^2 \cdot m^2 \cdot a)=O(n^2 \cdot d \cdot m)

张量乘法时间复杂度分析参见:矩阵、张量乘法的时间复杂度分析 [1]。

因此 Multi-Head Attention 时间复杂度就是O(n^2 \cdot d \cdot m) ,而实际上,张量乘法可以加速,因此实际复杂度会更低一些。

3.3.2. 不考虑多头的原因,self-attention中词向量不乘QKV参数矩阵,会怎么样?

对于 Attention 机制,都可以用统一的 query/key/value 模式去解释,而对于  self-attention,一般会说它的 q=k=v,这里的相等实际上是指它们来自同一个基础向量,而在实际计算时,它们是不一样的,因为这三者都是乘了 QKV 参数矩阵的。那如果不乘,每个词对应的 q,k,v 就是完全一样的。

在 self-attention 中,sequence 中的每个词都会和 sequence 中的每个词做点积去计算相似度,也包括这个词本身。

在相同量级的情况下,qi 与 ki 点积的值会是最大的(可以从“两数和相同的情况下,两数相等对应的积最大”类比过来)。

那在 softmax 后的加权平均中,该词本身所占的比重将会是最大的,使得其他词的比重很少,无法有效利用上下文信息来增强当前词的语义表示。

而乘以 QKV 参数矩阵,会使得每个词的 q,k,v 都不一样,能很大程度上减轻上述的影响。

当然,QKV 参数矩阵也使得多头,类似于 CNN 中的多核,去捕捉更丰富的特征/信息成为可能。

3.3.3. 在常规 attention 中,一般有 k=v,那 self-attention 可以嘛?

self-attention 实际只是 attention 中的一种特殊情况,因此 k=v 是没有问题的,也即 K,V 参数矩阵相同。

扩展到 Multi-Head Attention 中,乘以 Q、K 参数矩阵之后,其实就已经保证了多头之间的差异性了,在 q 和 k 点积 +softmax 得到相似度之后,从常规 attention 的角度,觉得再去乘以和 k 相等的 v 会更合理一些。

在 Transformer / BERT 中,完全独立的 QKV 参数矩阵,可以扩大模型的容量和表达能力。

但采用 Q,K=V 这样的参数模式,我认为也是没有问题的,也能减少模型的参数,又不影响多头的实现。

当然,上述想法并没有做过实验,为个人观点,仅供参考。
 

 

参考文献

[1]完全图解RNN、RNN变体、Seq2Seq、Attention机制
[2]深度学习中的注意力模型(2017版)
[3]详解Transformer (Attention Is All You Need)
[4]The Illustrated Transformer
[5]Visualizing A Neural Machine Translation Model


http://chatgpt.dhexx.cn/article/0V6uwp14.shtml

相关文章

attention模型

以机器翻译为例说明&#xff1a; 普通的RNN机器翻译模型: 次结构弱点在于当target句子太长时&#xff0c;前面encoder学习到的embedding vector(红边框)可能会被后面的decoder遗忘。因此改进版本如下: 这样&#xff0c;每次在输入target的word的时候&#xff0c;除了可以看到…

【深度学习】Self-Attention 原理与代码实现

1.Self-Attention 结构 在计算的时候需要用到矩阵Q(查询),K(键值),V(值)。在实际中&#xff0c;Self-Attention 接收的是输入(单词的表示向量x组成的矩阵X) 或者上一个 Encoder block 的输出。而Q,K,V正是通过 Self-Attention 的输入进行线性变换得到的。 2. Q, K, V 的计算 S…

Self -Attention、Multi-Head Attention、Cross-Attention

Self -Attention Transformer结构图 上图是论文中 Transformer 的内部结构图&#xff0c;左侧为 Encoder block&#xff0c;右侧为 Decoder block。红色圈中的部分为 Multi-Head Attention&#xff0c;是由多个 Self-Attention组成的&#xff0c;可以看到 Encoder block 包含一…

Attention Rollout

问题陈述 从图1a中的原始attention可以看出&#xff0c;只有在最开始的几层&#xff0c;不同位置的attention模式有一些区别&#xff0c;但是更高层中的attention权重更加一致。这表示随着模型层数的增加&#xff0c;嵌入的内容变得更加情境化&#xff0c;可能都带有类似的信息…

Attention可视化

Attention matrix&#xff1a; https://github.com/rockingdingo/deepnlp/blob/r0.1.6/deepnlp/textsum/eval.py plot_attention(data, X_labelNone, Y_labelNone)函数 #!/usr/bin/python # -*- coding:utf-8 -*-""" Evaluation Method for summarization tas…

Attention机制

文章目录 一、Attention机制是什么&#xff1f;二、推荐论文与链接三、self-attention 一、Attention机制是什么&#xff1f; Attention机制最早在视觉领域提出&#xff0c;九几年就被提出来的思想&#xff0c;真正火起来应该算是2014年Google Mind发表了《Recurrent Models o…

Attention详解

1.背景知识 Seq2Seq模型&#xff1a;使用两个RNN&#xff0c;一个作为编码器&#xff0c;一个作为解码器。 编码器&#xff1a;将输入数据编码成一个特征向量。 解码器&#xff1a;将特征向量解码成预测结果。 缺点&#xff1a;只将编码器的最后一个节点的结果进行了输出&am…

浅析NLP中的Attention技术

Attention&#xff08;注意力机制&#xff09;在NLP、图像领域被广泛采用&#xff0c;其显而易见的优点包括&#xff1a; &#xff08;1&#xff09;从context中捕捉关键信息&#xff1b; &#xff08;2&#xff09;良好的可视性和可解释性。 我们常用QKV模型来理解Attention&…

Attention 机制

文章目录 Attention 的本质是什么Attention 的3大优点Attention 的原理Attention 的 N 种类型 转载来源&#xff1a;https://easyai.tech/ai-definition/attention/ Attention 正在被越来越广泛的得到应用。尤其是 BERT 火爆了之后。 Attention 到底有什么特别之处&#xff1f…

详解Transformer中Self-Attention以及Multi-Head Attention

原文名称&#xff1a;Attention Is All You Need 原文链接&#xff1a;https://arxiv.org/abs/1706.03762 如果不想看文章的可以看下我在b站上录的视频&#xff1a;https://b23.tv/gucpvt 最近Transformer在CV领域很火&#xff0c;Transformer是2017年Google在Computation an…

Attention 一综述

近年来&#xff0c;注意力&#xff08;Attention&#xff09;机制被广泛应用到基于深度学习的自然语言处理(NLP)各个任务中。随着注意力机制的深入研究&#xff0c;各式各样的attention被研究者们提出&#xff0c;如单个、多个、交互式等等。去年6月&#xff0c;google机器翻译…

从Attention到Bert——1 Attention解读

下一篇从Attention到Bert——2 transformer解读 文章目录 1 Attention的发展历史2015-2017年 2 Attention的原理3 Multi-Head Attention4 Self-Attention为什么需要self-attention什么是self-attention 5 Position Embedding 最早&#xff0c;attention诞生于CV领域&#xff0…

Attention UNet

Attention UNet论文解析 - 知乎Attention UNet论文地址&#xff1a; https://arxiv.org/pdf/1804.03999.pdf 代码地址&#xff1a; https://github.com/ozan-oktay/Attention-Gated-NetworksAttention UNet在UNet中引入注意力机制&#xff0c;在对编码器每个分辨率上的特征与解…

attention

文章目录 Attention基本的Attention原理参考 Hierarchical Attention原理实践参考 Self Attentionother Attention Attention Attention是一种机制&#xff0c;可以应用到许多不同的模型中&#xff0c;像CNN、RNN、seq2seq等。Attention通过权重给模型赋予了区分辨别的能力&am…

史上最小白之Attention详解

1.前言 在自然语言处理领域&#xff0c;近几年最火的是什么&#xff1f;是BERT&#xff01;谷歌团队2018提出的用于生成词向量的BERT算法在NLP的11项任务中取得了非常出色的效果&#xff0c;堪称2018年深度学习领域最振奋人心的消息。而BERT算法又是基于Transformer&#xff0…

一文看懂 Attention(本质原理+3大优点+5大类型)

Attention 正在被越来越广泛的得到应用。尤其是 BERT 火爆了之后。 Attention 到底有什么特别之处&#xff1f;他的原理和本质是什么&#xff1f;Attention都有哪些类型&#xff1f;本文将详细讲解Attention的方方面面。 Attention 的本质是什么 Attention&#xff08;注意力&a…

史上最直白之Attention详解(原理+代码)

目录 为什么要了解Attention机制Attention 的直观理解图解深度学习中的Attention机制总结 为什么要了解Attention机制 在自然语言处理领域&#xff0c;近几年最火的是什么&#xff1f;是BERT&#xff01;谷歌团队2018提出的用于生成词向量的BERT算法在NLP的11项任务中取得了非常…

关于Attention的超详细讲解

文章目录 一、动物的视觉注意力二、快速理解Attention思想三、从Encoder-Decoder框架中理解为什么要有Attention机制四、Attention思想步骤五、Self-Attention5.1 Self-Attention的计算步骤5.2 根据代码进一步理解Q、K、V5.3 再来一个例子理解 六、缩放点积中为什么要除以根号d…