【ShuQiHere】
在上一篇文章中,我们探讨了Seq2Seq模型如何在序列到序列任务中取得显著的突破,但同时也面临了一些局限性,如信息压缩和长距离依赖问题。为了解决这些问题,自注意力机制应运而生。通过引入动态关注机制,自注意力极大地提升了模型的灵活性和性能,并为更复杂的模型(如Transformer)奠定了基础。在本文中,我们将深入探讨自注意力机制的工作原理,特别是其背后的矩阵运算,并通过具体的例子来详细说明这些概念。
1. 注意力机制中的矩阵表示
在深度学习模型中,输入的文本或序列通常被转换为向量或矩阵表示,使得模型能够利用矩阵运算来处理这些数据。
1.1 输入序列的向量化
假设我们有一个简单的英文句子:“The cat is on the mat.”,我们需要将这个句子转换为向量表示。通常,通过词嵌入技术(如Word2Vec或GloVe),我们可以将每个单词转换为一个向量。例如,“cat”的词向量 (\mathbf{v}_{cat}) 可以表示为一个n维向量:
[
v
c
a
t
=
[
0.1
0.3
0.5
…
0.2
]
\mathbf{v}_{cat} = \begin{bmatrix} 0.1 \\ 0.3 \\ 0.5 \\ \dots \\ 0.2 \end{bmatrix}
vcat=
0.10.30.5…0.2
]
对句子中的每个单词进行相同的操作后,我们可以得到一个向量序列,用来表示整个句子。整个句子的向量表示可以写成一个矩阵:
[
X
=
[
v
T
h
e
v
c
a
t
v
i
s
v
o
n
v
t
h
e
v
m
a
t
]
\mathbf{X} = \begin{bmatrix} \mathbf{v}_{The} \\ \mathbf{v}_{cat} \\ \mathbf{v}_{is} \\ \mathbf{v}_{on} \\ \mathbf{v}_{the} \\ \mathbf{v}_{mat} \end{bmatrix}
X=
vThevcatvisvonvthevmat
]
假设每个词向量的维度为4,向量矩阵 (\mathbf{X}) 可以具体表示为:
[
X
=
[
0.1
0.2
0.3
0.4
0.5
0.1
0.7
0.6
0.4
0.8
0.9
0.2
0.6
0.3
0.1
0.5
0.1
0.7
0.4
0.3
0.2
0.9
0.5
0.4
]
\mathbf{X} = \begin{bmatrix} 0.1 & 0.2 & 0.3 & 0.4 \\ 0.5 & 0.1 & 0.7 & 0.6 \\ 0.4 & 0.8 & 0.9 & 0.2 \\ 0.6 & 0.3 & 0.1 & 0.5 \\ 0.1 & 0.7 & 0.4 & 0.3 \\ 0.2 & 0.9 & 0.5 & 0.4 \end{bmatrix}
X=
0.10.50.40.60.10.20.20.10.80.30.70.90.30.70.90.10.40.50.40.60.20.50.30.4
]
2. 查询、键和值的向量表示
在注意力机制中,每个输入向量(如 (\mathbf{v}_{cat}) )都会被映射成查询向量(Query)、键向量(Key)和值向量(Value)。这些向量用于计算注意力得分,并最终生成输出。
2.1 查询、键和值的计算公式
查询向量(Query)的生成公式为:
[
Q
=
X
W
Q
\mathbf{Q} = \mathbf{X} \mathbf{W}^Q
Q=XWQ
]
键向量(Key)的生成公式为:
[
K
=
X
W
K
\mathbf{K} = \mathbf{X} \mathbf{W}^K
K=XWK
]
值向量(Value)的生成公式为:
[
V
=
X
W
V
\mathbf{V} = \mathbf{X} \mathbf{W}^V
V=XWV
]
其中:
- (\mathbf{X}) 是输入词向量(如 (\mathbf{v}_{cat}))。
- (\mathbf{W}Q)、(\mathbf{W}K) 和 (\mathbf{W}^V) 是可训练的权重矩阵,用于生成查询、键和值向量。
2.2 查询、键和值的矩阵表示
假设输入序列有 (T) 个词,每个词用 (n) 维向量表示,那么输入序列可以表示为 (T \times n) 的矩阵 (\mathbf{X}):
[
X
=
[
v
T
h
e
v
c
a
t
v
i
s
…
v
m
a
t
]
\mathbf{X} = \begin{bmatrix} \mathbf{v}_{The} \\ \mathbf{v}_{cat} \\ \mathbf{v}_{is} \\ \dots \\ \mathbf{v}_{mat} \end{bmatrix}
X=
vThevcatvis…vmat
]
对于权重矩阵 (\mathbf{W}^Q)(大小为 (n \times d_k)),我们可以通过矩阵乘法生成查询矩阵 (\mathbf{Q})(大小为 (T \times d_k)):
[
Q
=
X
W
Q
\mathbf{Q} = \mathbf{X} \mathbf{W}^Q
Q=XWQ
]
例如,如果 (\mathbf{W}^Q) 的维度为 (4 \times 3),假设其具体值为:
[
W
Q
=
[
0.2
0.3
0.5
0.6
0.1
0.4
0.3
0.2
0.7
0.5
0.4
0.1
]
\mathbf{W}^Q = \begin{bmatrix} 0.2 & 0.3 & 0.5 \\ 0.6 & 0.1 & 0.4 \\ 0.3 & 0.2 & 0.7 \\ 0.5 & 0.4 & 0.1 \end{bmatrix}
WQ=
0.20.60.30.50.30.10.20.40.50.40.70.1
]
则查询矩阵 (\mathbf{Q}) 为:
[
$$
\mathbf{Q} = \mathbf{X} \mathbf{W}^Q = \begin{bmatrix}
0.1 & 0.2 & 0.3 & 0.4 \
0.5 & 0.1 & 0.7 & 0.6 \
0.4 & 0.8 & 0.9 & 0.2 \
0.6 & 0.3 & 0.1 & 0.5 \
0.1 & 0.7 & 0.4 & 0.3 \
0.2 & 0.9 & 0.5 & 0.4
\end{bmatrix}
\begin{bmatrix}
0.2 & 0.3 & 0.5 \
0.6 & 0.1 & 0.4 \
0.3 & 0.2 & 0.7 \
0.5 & 0.4 & 0.1
\end{bmatrix}
=
\begin{bmatrix}
0.41 & 0.27 & 0.38 \
0.73 & 0.52 & 0.83 \
0.73 & 0.43 & 0.71 \
0.64 & 0.46 & 0.69 \
0.52 & 0.25 & 0.44 \
0.73 & 0.47 & 0.71
\end{bmatrix}
$$
]
同样地,可以得到键矩阵 (\mathbf{K}) 和值矩阵 (\mathbf{V})。
3. 计算注意力得分(Attention Scores)
为了计算注意力得分,我们将查询矩阵 (\mathbf{Q}) 与键矩阵 (\mathbf{K}) 进行点积操作。这个点积表示查询向量与每个键向量之间的相似度:
[
Attention Scores
=
Q
⋅
K
T
\text{Attention Scores} = \mathbf{Q} \cdot \mathbf{K}^T
Attention Scores=Q⋅KT
]
假设键矩阵 (\mathbf{K}) 为:
[
K
=
[
0.2
0.1
0.7
0.6
0.9
0.4
0.3
0.8
0.5
]
\mathbf{K} = \begin{bmatrix} 0.2 & 0.1 & 0.7 \\ 0.6 & 0.9 & 0.4 \\ 0.3 & 0.8 & 0.5 \end{bmatrix}
K=
0.20.60.30.10.90.80.70.40.5
]
则注意力得分为:
[
Attention Scores
=
Q
⋅
K
T
=
[
0.41
0.27
0.38
0.73
0.52
0.83
]
⋅
[
0.2
0.6
0.3
0.1
0.9
0.8
0.7
0.4
0.5
]
T
=
[
0.41
×
0.2
+
0.27
×
0.1
+
0.38
×
0.7
0.73
×
0.6
+
0.52
×
0.9
+
0.83
×
0.4
]
=
[
0.405
0.998
]
\text{Attention Scores} = \mathbf{Q} \cdot \mathbf{K}^T = \begin{bmatrix} 0.41 & 0.27 & 0.38 \\ 0.73 & 0.52 & 0.83 \end{bmatrix} \cdot \begin{bmatrix} 0.2 & 0.6 & 0.3 \\ 0.1 & 0.9 & 0.8 \\ 0.7 & 0.4 & 0.5 \end{bmatrix}^T = \begin{bmatrix} 0.41 \times 0.2 + 0.27 \times 0.1 + 0.38 \times 0.7 \\ 0.73 \times 0.6 + 0.52 \times 0.9 + 0.83 \times 0.4 \end{bmatrix} = \begin{bmatrix} 0.405 \\ 0.998 \end{bmatrix}
Attention Scores=Q⋅KT=[0.410.730.270.520.380.83]⋅
0.20.10.70.60.90.40.30.80.5
T=[0.41×0.2+0.27×0.1+0.38×0.70.73×0.6+0.52×0.9+0.83×0.4]=[0.4050.998]
]
4. 缩放与Softmax归一化
为了防止点积结果过大导致梯度消失或爆炸,我们将其进行缩
放,并使用Softmax函数进行归一化:
[
Scaled Scores
=
Attention Scores
d
k
\text{Scaled Scores} = \frac{\text{Attention Scores}}{\sqrt{d_k}}
Scaled Scores=dkAttention Scores
]
假设 (d_k = 3),那么缩放后的得分为:
[
Scaled Scores
=
[
0.405
0.998
]
3
=
[
0.234
0.576
]
\text{Scaled Scores} = \frac{\begin{bmatrix} 0.405 \\ 0.998 \end{bmatrix}}{\sqrt{3}} = \begin{bmatrix} 0.234 \\ 0.576 \end{bmatrix}
Scaled Scores=3[0.4050.998]=[0.2340.576]
]
接下来,我们应用Softmax函数,得到注意力权重矩阵:
[
Attention Weights
=
Softmax
(
Q
⋅
K
T
d
k
)
\text{Attention Weights} = \text{Softmax}\left(\frac{\mathbf{Q} \cdot \mathbf{K}^T}{\sqrt{d_k}}\right)
Attention Weights=Softmax(dkQ⋅KT)
]
通过Softmax归一化后,得到的注意力权重矩阵为:
[
Attention Weights
=
[
0.415
0.585
]
\text{Attention Weights} = \begin{bmatrix} 0.415 \\ 0.585 \end{bmatrix}
Attention Weights=[0.4150.585]
]
5. 加权求和值向量
最后,用注意力权重矩阵对值矩阵 (\mathbf{V}) 进行加权求和,得到最终的输出:
[
Output
=
Attention Weights
⋅
V
\text{Output} = \text{Attention Weights} \cdot \mathbf{V}
Output=Attention Weights⋅V
]
假设值矩阵 (\mathbf{V}) 为:
[
V
=
[
0.1
0.2
0.3
0.4
0.5
0.6
]
\mathbf{V} = \begin{bmatrix} 0.1 & 0.2 & 0.3 \\ 0.4 & 0.5 & 0.6 \end{bmatrix}
V=[0.10.40.20.50.30.6]
]
加权求和后的输出为:
[
Output
=
[
0.415
0.585
]
⋅
[
0.1
0.2
0.3
0.4
0.5
0.6
]
=
[
0.415
×
0.1
+
0.585
×
0.4
0.415
×
0.2
+
0.585
×
0.5
0.415
×
0.3
+
0.585
×
0.6
]
=
[
0.324
0.467
0.610
]
\text{Output} = \begin{bmatrix} 0.415 \\ 0.585 \end{bmatrix} \cdot \begin{bmatrix} 0.1 & 0.2 & 0.3 \\ 0.4 & 0.5 & 0.6 \end{bmatrix} = \begin{bmatrix} 0.415 \times 0.1 + 0.585 \times 0.4 \\ 0.415 \times 0.2 + 0.585 \times 0.5 \\ 0.415 \times 0.3 + 0.585 \times 0.6 \end{bmatrix} = \begin{bmatrix} 0.324 \\ 0.467 \\ 0.610 \end{bmatrix}
Output=[0.4150.585]⋅[0.10.40.20.50.30.6]=
0.415×0.1+0.585×0.40.415×0.2+0.585×0.50.415×0.3+0.585×0.6
=
0.3240.4670.610
]
输出矩阵的大小是 (T \times d_v),其中 (d_v) 是值向量的维度。
6. 形象的理解
让我们通过书本的类比来形象地理解自注意力机制:
- 查询(Query):问题“主角做了什么?”被表示为一个向量,它与书中的每个段落(键)进行对比。
- 键(Key):每个段落的主题被表示为键向量,与查询向量进行比较。
- 值(Value):段落的内容被表示为值向量。
通过计算查询与键的相似度,注意力机制决定了哪些段落是最重要的,并将注意力集中在这些段落上,从中提取出有用的信息。
7. 自注意力的优势
自注意力机制相比传统的RNN或Seq2Seq模型具有显著的优势:
-
并行计算:由于自注意力机制不依赖于序列顺序,可以并行处理输入序列,从而大幅提高计算效率。
-
长距离依赖处理:自注意力机制通过直接计算查询与键的相似度,可以更好地捕捉输入序列中的长距离依赖关系。
-
灵活性:自注意力机制能够根据当前查询的上下文动态调整关注的内容,从而更灵活地处理不同类型的输入。
结论
在本文中,我们深入探讨了自注意力机制中的矩阵表示及其计算过程。通过这种机制,模型能够在生成每个输出时,动态地关注输入序列中的不同部分,从而实现更灵活、更精确的处理。自注意力机制的引入,不仅解决了Seq2Seq模型的诸多问题,还为更复杂的模型(如Transformer)奠定了基础。如果你有任何问题或想进一步了解,请随时与我们交流!