【深度学习】注意力机制与自注意力机制详解
深度学习中的注意力机制/自注意力机制详解
- 1. 注意力机制的通俗理解
- 2. 注意力和自注意力机制的区别
- 3. 自注意力机制原理与计算流程
- 3.1 引入自注意力机制的目的与思想
- 3.2 从向量角度理解 [R1]
- 3.3 从Self-Attention核心公式理解 [R3]
- 4. 多头自注意力机制(Multi-head Self-attention)
- 5. 总结
- 6. 扩展内容
- 6.1 为什么提出Transformer:Attention is all you need ?
- 6.2 Self-Attention v.s. CNN / v.s. RNN [R1][R7][R8]
- 参考链接
1. 注意力机制的通俗理解
当人类观察事物时,往往会选择性地关注较为重要的信息,这种现象称为注意力机制。通过持续聚焦于关键位置以获取更多有价值的信息,同时忽略无关的干扰,视觉注意力机制显著提升了我们处理信息的效率与准确性。类似地,深度学习中的注意力机制模仿了这种过程,帮助模型从大量数据中筛选出关键信息,减少对不重要内容的关注,从而提高模型的性能和决策能力。
比如这张图片,大多数人可能会更容易把目光集中在那只可爱的小猪身上,其次才会注意到钢琴或背景。
2. 注意力和自注意力机制的区别
注意力机制: 发生在目标元素(输出)与源元素(输入)之间。
自注意力机制: 不同于输入与输出之间的注意力机制,自注意力机制是在输入序列内部元素之间,或者输出序列内部元素之间的相互作用。
区别在于,注意力机制的查询和键来自不同的来源。例如,在中译英模型中,查询是中文单词的特征,而键是英文单词的特征。而自注意力机制的查询和键则来自同一组元素,即查询和键都是中文特征,彼此之间进行注意力计算。这可以理解为,同一句话中的词元或同一张图像中的不同patch之间的相互作用。因此,自注意力机制(Self-Attention)也被称为内部注意力机制(Intra-Attention)。
总结来说,注意力机制和自注意力机制的区别仅在于处理的对象不同,计算过程相同,暂且理解到这,其他可等理解全文后再思考。接下来,我们以自注意力机制为例进行详细分析。
3. 自注意力机制原理与计算流程
在深度学习中,注意力机制(Attention Mechanism)是一种能够自动聚焦于输入数据中最相关部分的技术,最早应用于自然语言处理(NLP)领域,但现在已广泛应用于各种任务,如计算机视觉、时间序列分析等。注意力机制的核心思想是,不再对输入序列中的每个元素赋予相同的权重,而是根据上下文信息为不同元素分配不同的权重,以实现信息的动态选择。
3.1 引入自注意力机制的目的与思想
神经网络在处理大小不一的向量输入时,不同向量之间往往存在一定的关系。然而,在实际训练过程中,这些关系难以充分体现,导致模型的效果不佳。例如,在机器翻译(序列到序列的问题,机器自动决定标签数量)、词性标注(一个向量对应一个标签)、语义分析(多个向量对应一个标签)等自然语言处理任务中,模型无法充分利用输入之间的依赖关系。
为了解决全连接神经网络无法有效捕捉多个相关输入之间关联性的问题,自注意力机制提供了一种有效的方法。自注意力机制的核心思想是让模型关注输入序列中不同元素之间的相关性,通过计算每个元素与其他所有元素之间的相关性(注意力权重),将输入序列进行加权求和,从而得到新的表示。这种表示不仅包含了序列中所有元素的信息,还能够突出与当前元素关联的重要部分。
比如我们在理解句子时,当遇到“eating”这个词时,自然会预期下文可能会提到与食物相关的词汇。而句中其他词汇,虽然可能也与食物有关,但它们与“eating”的直接关联性较低,注意力机制能有效捕捉这种重要的关联性。
所以,深度学习中的注意力机制可以理解为一组重要性权重的集合。为了预测或推断某个元素,例如图像中的一个像素或句子中的一个词,注意力机制通过估计该元素与其他元素的相关性来赋予不同的权重。相关性越强,权重越大,模型就越会依赖这些元素进行预测或推断。通过这种加权汇总的方式,注意力机制帮助模型更有效地理解和处理复杂的数据结构。
3.2 从向量角度理解 [R1]
目标: 针对 a 1 - a 4 a_1\text{-}a_4 a1-a4(可能是输入也可以作为中间层的输入)进行变换,使得变换得到的 b 1 - b 4 b_1\text{-}b_4 b1-b4 都会考虑整个输入序列。
所以 b 1 b_1 b1 相当于包含 a 1 a_1 a1 对其他所有输入相关程度的 a 1 a_1 a1, b 2 b_2 b2 、 b 3 b_3 b3 、 b 4 b_4 b4 同理,那么如何求解 b 1 - b 4 b_1\text{-}b_4 b1-b4 呢?
计算流程
首先,计算相关程度,较为常用的就是左边的点乘(内积),内积物理意义上是投影的含义,可代表相关性 [R2]。
为方便理解,这里我们做一个假设:对 a 1 - a 4 a_1\text{-}a_4 a1-a4 均采取一种线性变换,将每个输入变成3个输入去代表它们进行运算,即
q
1
=
W
q
a
1
k
1
=
W
k
a
1
v
1
=
W
v
a
1
q
2
=
W
q
a
2
k
2
=
W
k
a
2
v
2
=
W
v
a
2
q
3
=
W
q
a
3
k
3
=
W
k
a
3
v
3
=
W
v
a
3
q^{1}=W^{q}a^{1} \ \ \ \ \ \ k^{1}=W^{k}a^{1} \ \ \ \ \ \ v^{1}=W^{v}a^{1}\\q^{2}=W^{q}a^{2} \ \ \ \ \ \ k^{2}=W^{k}a^{2} \ \ \ \ \ \ v^{2}=W^{v}a^{2}\\q^{3}=W^{q}a^{3} \ \ \ \ \ \ k^{3}=W^{k}a^{3} \ \ \ \ \ \ v^{3}=W^{v}a^{3}
q1=Wqa1 k1=Wka1 v1=Wva1q2=Wqa2 k2=Wka2 v2=Wva2q3=Wqa3 k3=Wka3 v3=Wva3
可暂且认为
W
q
W^{q}
Wq、
W
k
W^{k}
Wk、
W
v
W^{v}
Wv 是单位矩阵,即目前
q
i
q^{i}
qi、
k
i
k^{i}
ki、
v
i
v^{i}
vi 均等于
a
i
a^{i}
ai,只是我们求解
a
i
a^{i}
ai 与其他相关性时是用
q
i
q^{i}
qi 与其他的
k
i
k^{i}
ki 点乘,便于区分目标/任务。
计算 a 1 a^{1} a1 和 a 1 a^{1} a1 自身以及 a 2 a^{2} a2 、 a 3 a^{3} a3、 a 4 a^{4} a4的关联性,得到 a 1 , 1 a_{1,1} a1,1 , a 1 , 2 a_{1,2} a1,2 、 a 1 , 3 a_{1,3} a1,3、 a 1 , 4 a_{1,4} a1,4。
得到关联性向量之后,再经过softmax处理,得到attention scores。一方面,可以进行归一化,将原始计算分值整理成所有元素权重之和为1的概率分布;另一方面,通过softmax的内在机制更加突出重要元素的权重;某个值的权重越大,表示相似度越高。
基于attention scores抽取信息,将关联性向量 a 1 , 1 ′ a_{1,1}^{\prime} a1,1′ , a 1 , 2 ′ a_{1,2}^{\prime} a1,2′ 、 a 1 , 3 ′ a_{1,3}^{\prime} a1,3′、 a 1 , 4 ′ a_{1,4}^{\prime} a1,4′ 乘上对应的value: v 1 - v 4 v_1\text{-}v_4 v1-v4,然后结果相加得到 b 1 b^1 b1。
b 2 b^{2} b2、 b 3 b^{3} b3、 b 4 b^{4} b4 同理。
依次计算 b 2 b^{2} b2、 b 3 b^{3} b3、 b 4 b^{4} b4。所以哪个关联性更大,得到的结果也就越接近那个关联性数据(比如 a 1 , 1 ′ a_{1,1}^{\prime} a1,1′ 最大,得到的 b 1 b^1 b1 也就最接近 v 1 v^1 v1,或者说 b 1 b^1 b1 的主要构成是由 v 1 v^1 v1 构成)。
总流程(矩阵角度理解):
因此,最终相当于将输入 I \text{I} I 变成了 O \text{O} O, O \text{O} O包含了不同输入向量之前的相关性信息,也就是赋予了注意力功能。
在这里我们可以发现,整个过程中并没有涉及到神经网络学习的部分。其实,这和我们一开始提到的 W q W^{q} Wq、 W k W^{k} Wk、 W v W^{v} Wv 有关。起初,我们为了便于理解,假设它们是单位矩阵,而实际上这些权重矩阵是需要通过训练学习的,以增强自注意力机制的拟合能力,从而帮助网络朝着最优目标函数的方向优化。
3.3 从Self-Attention核心公式理解 [R3]
这里是第二种推导过程,实际上与上面的推导完全相同,只是换了一种基于矩阵的理解方式,供参考。
Transformer中的自注意力机制(Self-Attention)是模型的核心组件之一,主要用于捕捉序列数据中的依赖关系,使模型在处理长距离依赖问题时更加高效。Self-Attention机制的核心公式为:
A
t
t
e
n
t
i
o
n
(
Q
,
K
,
V
)
=
S
o
f
t
m
a
x
(
Q
K
⊤
d
k
)
V
Attention(Q,K,V)=Softmax(\frac{QK^\top}{\sqrt{d_k}})V
Attention(Q,K,V)=Softmax(dkQK⊤)V
公式中的 Q Q Q、 K K K 和 V V V 分别代表 Query、Key 和 Value。仅从公式来看,难以直观理解 Attention 的具体作用。下面将通过 Transformer 中的 Self-Attention 机制,进一步介绍 Attention 背后的原理。
1 向量点乘
我们先从 S o f t m a x ( X X ⊤ ) X Softmax(\mathbf{X}\mathbf{X}^\top)\mathbf{X} Softmax(XX⊤)X这样一个公式开始。
首先需要复习一下向量点乘(Dot Product)的概念。对于两个行向量
x
=
[
x
0
,
x
1
,
⋯
,
x
n
]
\mathbf{x}=[x_0,x_1,\cdots,x_n]
x=[x0,x1,⋯,xn] 和
y
=
[
y
0
,
y
1
,
⋯
,
y
n
]
\mathbf{y}=[y_0,y_1,\cdots,y_n]
y=[y0,y1,⋯,yn] :
x
⋅
y
=
x
0
y
0
+
x
1
y
1
+
⋯
+
x
n
y
n
\mathbf{x}\cdot\mathbf{y}=x_0y_0+x_1y_1+\cdots+x_ny_n
x⋅y=x0y0+x1y1+⋯+xnyn
向量点乘的几何意义是向量
x
\mathbf{x}
x 在向量
y
\mathbf{y}
y 方向上的投影。通过再与向量
y
\mathbf{y}
y 相乘,可以衡量两个向量的相似度。点乘结果越大,表示两个向量越相似。设一个矩阵
X
\mathbf{X}
X 由
n
n
n 个行向量组成,例如,可以将某个行向量
x
i
\mathbf{x}_i
xi 理解为某个词的词向量,这样由
n
n
n 个行向量构成一个
n
×
n
n \times n
n×n 的方阵:
X
=
[
x
0
x
1
⋮
x
n
]
∈
R
n
×
n
\mathbf{X}=\begin{bmatrix}\mathbf{x}_0\\\mathbf{x}_1\\\vdots\\\mathbf{x}_n\end{bmatrix}\in \mathbb{R}^{n\times n}
X=
x0x1⋮xn
∈Rn×n
则:
X
⊤
=
[
x
0
⊤
x
1
⊤
⋯
x
n
⊤
]
\mathbf{X}^\top=\begin{bmatrix}\mathbf{x}_0^\top&\mathbf{x}_1^\top&\cdots&\mathbf{x}_n^\top\end{bmatrix}
X⊤=[x0⊤x1⊤⋯xn⊤]
矩阵
X
\mathbf{X}
X 与矩阵的转置
X
⊤
\mathbf{X}^\top
X⊤ 相乘,
X
\mathbf{X}
X 中的每一行与
X
⊤
\mathbf{X}^\top
X⊤ 的每一列相乘得到目标矩阵的一个元素,
X
X
⊤
\mathbf{X}\mathbf{X}^\top
XX⊤ 可表示为:
X
X
⊤
=
[
x
0
⋅
x
0
x
0
⋅
x
1
⋯
x
0
⋅
x
n
x
1
⋅
x
0
x
1
⋅
x
1
⋯
x
1
⋅
x
n
⋮
x
n
⋅
x
0
x
n
⋅
x
1
⋯
x
n
⋅
x
n
]
\mathbf{X}\mathbf{X}^\top=\begin{bmatrix}\mathbf{x}_0\cdot\mathbf{x}_0&\mathbf{x}_0\cdot\mathbf{x}_1&\cdots&\mathbf{x}_0\cdot\mathbf{x}_n\\\mathbf{x}_1\cdot\mathbf{x}_0&\mathbf{x}_1\cdot\mathbf{x}_1&\cdots&\mathbf{x}_1\cdot\mathbf{x}_n\\\vdots\\\mathbf{x}_n\cdot\mathbf{x}_0&\mathbf{x}_n\cdot\mathbf{x}_1&\cdots&\mathbf{x}_n\cdot\mathbf{x}_n\end{bmatrix}
XX⊤=
x0⋅x0x1⋅x0⋮xn⋅x0x0⋅x1x1⋅x1xn⋅x1⋯⋯⋯x0⋅xnx1⋅xnxn⋅xn
以 X X ⊤ \mathbf{X}\mathbf{X}^\top XX⊤ 中的第一行第一列元素为例,它实际上是向量 x 0 \mathbf{x}_0 x0 与自身的点乘,表示 x 0 \mathbf{x}_0 x0 与自身的相似度。同理,第一行第二列的元素则表示 x 0 \mathbf{x}_0 x0 与 x 1 \mathbf{x}_1 x1 之间的相似度。
以词向量矩阵为例,该矩阵的每一行为一个词的词向量。将该矩阵与其转置相乘后,生成的目标矩阵实际上表示每个词的词向量与所有其他词的词向量之间的相似度。
如果在此基础上引入 Softmax 操作,即计算 S o f t m a x ( X X ⊤ ) Softmax(\mathbf{X}\mathbf{X}^\top) Softmax(XX⊤),Softmax 的作用是对向量进行归一化。因此,这一步相当于对相似度进行归一化,得到一个归一化后的权重矩阵。矩阵中的某个值越大,意味着对应的词与其他词之间的相似度越高。
在此基础上,进一步计算 S o f t m a x ( X X ⊤ ) X Softmax(\mathbf{X}\mathbf{X}^\top)\mathbf{X} Softmax(XX⊤)X,将得到的归一化权重矩阵与词向量矩阵相乘。在这个过程中,权重矩阵中的每一行与词向量矩阵的一列相乘,而词向量矩阵的一列实际上表示了不同词的某一维度。通过这样的矩阵相乘,相当于执行一个加权求和的过程,从而得到的新表示是经过加权求和后的结果词向量,而权重矩阵则是通过相似度和归一化计算得到的。
2 Self-Attention中的 Q Q Q、 K K K、 V V V
注意力Attention机制的最核心的公式为:
S
o
f
t
m
a
x
(
Q
K
⊤
d
k
)
V
Softmax(\frac{QK^\top}{\sqrt{d_k}})V
Softmax(dkQK⊤)V,与我们刚才分析的
S
o
f
t
m
a
x
(
X
X
⊤
)
X
Softmax(\mathbf{X}\mathbf{X}^\top)\mathbf{X}
Softmax(XX⊤)X 有几分相似。Transformer [R4] 论文中将这个Attention公式描述为:Scaled Dot-Product Attention。其中,
Q
Q
Q 为 Query、
K
K
K 为 Key、
V
V
V 为 Value。
Q
Q
Q、
K
K
K、
V
V
V是从哪儿来的呢?
Q
Q
Q、
K
K
K、
V
V
V 其实都是从同样的输入矩阵
X
X
X 线性变换而来的。我们可以简单理解成:
Q
=
X
W
Q
K
=
X
W
K
V
=
X
W
V
Q=XW^Q\\K=XW^K\\V=XW^V
Q=XWQK=XWKV=XWV
其中, W Q W^Q WQ, W K W^K WK 和 W V W^V WV 是三个可训练的参数矩阵。输入矩阵 X X X 分别与 W Q W^Q WQ, W K W^K WK 和 W V W^V WV 相乘,生成 Q Q Q、 K K K 和 V V V,相当于经历了一次线性变换。Attention不直接使用 X X X,而是使用经过矩阵乘法生成的这三个矩阵,因为使用三个可训练的参数矩阵,可增强模型的拟合能力。
3 Self-Attention计算流程
下面这张图是Transformer论文中描述Attention计算过程的示意图。
在这张图中, Q Q Q 与 K ⊤ K^\top K⊤ 通过矩阵乘法(MatMul)计算得到了相似度矩阵。接着,对相似度矩阵的每个元素除以 d k \sqrt{d_k} dk,其中 d k d_k dk 是 K K K 的维度大小,这样得到了注意力得分(Attention Score)。这个除法操作被称为“缩放”(Scale)。当 d k d_k dk 很大时, Q K ⊤ QK^\top QK⊤ 的乘法结果的方差会增大,通过缩放可以减小方差,从而使训练过程中的梯度更新更加稳定。
因此,Self-Attention的计算过程如下:
第一步:
X
X
X 与
W
W
W 进行矩阵乘法,生成
Q
Q
Q、
K
K
K 和
V
V
V。
第二步: 进行
Q
K
T
QK^T
QKT 计算,得到相似度,如下图所示。
第三步: 将刚得到的相似度矩阵除以 d k \sqrt{d_k} dk 后,再进行 Softmax 操作。经过 Softmax 的归一化处理后,每个值变成一个大于 0 且小于 1 的权重系数(注意力得分,Attention Score),且每行的总和为 1,从而形成一个权重矩阵。
第四步: 使用刚得到的权重矩阵,与 V V V 相乘,计算加权求和。
上图中权重矩阵的第 1 行表示单词 1 与其他所有单词的权重系数。最终,单词 1 的输出 Z 1 Z_1 Z1 等于所有单词 i i i 的值 V i V_i Vi 根据权重系数加权求和,如下图所示:
4. 多头自注意力机制(Multi-head Self-attention)
个人理解是,在自注意力机制的基础上,增加可训练的线性变换(即矩阵相乘),以提高模型的拟合能力,从而更细致、完美、平滑地实现所需的功能。这类似于机器学习和深度学习的基本原理,通过增加神经元或隐藏层来提升拟合能力。更多信息请参考文末链接 [R2][R3]。
5. 总结
注意力机制的计算流程:
计算相关性: 在第一阶段,计算 Query 与不同 Key 之间的相关性,从而生成不同 Value 的权重系数。
归一化处理: 第二阶段对第一阶段的输出进行归一化,将数值范围映射到 0 和 1 之间。
加权求和: 根据权重系数对 Value 进行加权求和,最终得到注意力数值。
在计算相似性或相关性时,常用的方法包括点积、余弦相似性和多层感知机(MLP)网络。由于产生方法的不同,第一阶段得分的取值范围也有所区别。第二阶段引入类似 SoftMax 的计算方式对第一阶段得分进行转换:一方面,进行归一化,将原始计算值整理为所有元素权重之和为 1 的概率分布;另一方面,Softmax 的机制进一步突出重要元素的权重。
注意力机制的主要优势:
a. 提升模型的表达能力: 通过动态分配权重,注意力机制可以捕捉输入数据中长距离依赖关系以及重要的特征。
b. 并行化计算: 尤其在Transformer中,自注意力机制相比传统的RNN模型具备良好的并行化特性,可以加速训练过程。
c. 适用范围广泛: 从自然语言处理扩展到图像处理、语音识别等众多领域,表现出了很强的通用性。
缺点:
注意力机制未能反映词汇在句子中的位置关系(或向量在序列中的位置关系)。为了克服这一问题,可以引入位置编码(positional encoding)。
还有一篇博文 [R4] 从主观和客观的角度进行了分析,我个人认为这篇博文也有助于理解相关内容,非常值得参考和学习。
6. 扩展内容
6.1 为什么提出Transformer:Attention is all you need ?
传统的循环神经网络(RNN)和编码器-解码器架构存在一些缺陷:
无法实现并行计算: RNN的计算过程是顺序的,这导致了计算效率低下。
长文本输入导致信息丢失: 在处理长序列时,RNN容易忘记早期的信息,造成上下文的丢失。
因此,作者摒弃了RNN,提出了一种新的Transformer架构,该架构完全依赖于注意力机制,从而避免了上述问题 [R5][R6]。
在 [R5] 引言部分,作者提到传统RNN计算难以并行。然而,在常见的AI算法中,卷积神经网络(CNN)是一种经典的并行计算算法。人们使用CNN的目的是减少顺序计算带来的开销,将计算转化为并行计算。然而,卷积也存在一个缺点:卷积核一次只能处理局部范围内的数据,这使得在处理长文本时,卷积无法捕捉到卷积核之外的数据之间的关系。因此,尽管卷积能够有效地进行并行计算,但在处理序列数据(如文本)时,其效果并不理想。卷积之所以能够良好地完成并行计算,是因为每个卷积核在输入特征图上独立运算,每个卷积核输出一个通道,代表输入数据的某种特征。
那么,是否可以模仿卷积的这种特性,设计一种机制来实现多个卷积核独立计算的效果呢?
当然可以。为此,作者提出了多头注意力机制(Multi-Head Attention),其作用与多个卷积核类似。每个“头”实际上是一个独立的注意力小网络,它们可以独立学习输入数据的某种特征。这样一来,多个“头”之间就能够并行计算,从而提高了模型的效率和表达能力。
6.2 Self-Attention v.s. CNN / v.s. RNN [R1][R7][R8]
CNN是Self-Attention的特例,Self-Attention是复杂化的CNN。数据集少时CNN效果更好,数据集多时Self-Attention更好。
RNN长文本输入导致信息丢失;RNN不能并行处理,Self-Attention可以,更有效率。
参考链接
[R1] 台大李宏毅自注意力机制和Transformer详解!
[R2] 匹配追踪MP和正交匹配追踪OMP
[R3] Transformer-鲁老师
[R4] 关于Attention的超详细讲解
[R5] Attention Is All You Need
[R6]《Attention is all you need》通俗解读,彻底理解版:part1
[R7] On the Relationship between Self-Attention and Convolutional Layers
[R8] Transformers are RNNs: Fast Autoregressive Transformers with Linear Attention
[R9] 注意力机制到底在做什么,Q/K/V怎么来的?一文读懂Attention注意力机制
[R10] 注意力机制、自注意力机制、多头注意力机制、通道注意力机制、空间注意力机制超详细讲解
END
2024年9月24日