self-attention计算过程
Self-Attention(自注意力)详解 + 数据示例
Self-Attention(自注意力)是注意力机制的一种特殊形式,用于计算同一序列内部元素之间的相关性。它能够捕捉序列中任意两个元素的长距离依赖关系,广泛应用于Transformer、BERT等模型。
1. Self-Attention 的计算步骤
假设我们有一个输入序列(如句子中的单词),每个单词用向量表示。Self-Attention 的计算过程如下:
输入数据示例
假设我们有 3 个单词的句子,每个单词用 4 维向量表示:
- X(输入矩阵):
[
X = \begin{bmatrix}
x_1 \ x_2 \ x_3
\end{bmatrix} = \begin{bmatrix}
1 & 0 & 1 & 0 \ 0 & 2 & 0 & 2 \ 1 & 1 & 1 & 1
\end{bmatrix}
]- (x_1 = [1, 0, 1, 0])
- (x_2 = [0, 2, 0, 2])
- (x_3 = [1, 1, 1, 1])
Step 1: 计算 Query (Q), Key (K), Value (V)
Self-Attention 通过三个权重矩阵 (W^Q, W^K, W^V) 将输入 (X) 映射到 Query、Key、Value:
[
Q = X W^Q, \quad K = X W^K, \quad V = X W^V
]
假设:
[
W^Q = \begin{bmatrix}
1 & 0 & 1 \ 1 & 0 & 0 \ 0 & 1 & 0 \ 0 & 1 & 1
\end{bmatrix}, \quad
W^K = \begin{bmatrix}
0 & 1 & 1 \ 1 & 0 & 1 \ 0 & 1 & 0 \ 1 & 0 & 0
\end{bmatrix}, \quad
W^V = \begin{bmatrix}
0 & 0 & 1 \ 1 & 1 & 0 \ 0 & 1 & 0 \ 1 & 0 & 1
\end{bmatrix}
]
计算:
[
Q = X W^Q = \begin{bmatrix}
1 & 0 & 1 & 0 \ 0 & 2 & 0 & 2 \ 1 & 1 & 1 & 1
\end{bmatrix} \begin{bmatrix}
1 & 0 & 1 \ 1 & 0 & 0 \ 0 & 1 & 0 \ 0 & 1 & 1
\end{bmatrix} = \begin{bmatrix}
1 & 0 & 1 \ 2 & 2 & 2 \ 2 & 1 & 2
\end{bmatrix}
]
[
K = X W^K = \begin{bmatrix}
0 & 1 & 1 \ 4 & 0 & 2 \ 2 & 2 & 1
\end{bmatrix}, \quad
V = X W^V = \begin{bmatrix}
0 & 1 & 1 \ 2 & 2 & 2 \ 2 & 2 & 1
\end{bmatrix}
]
Step 2: 计算注意力分数(Attention Scores)
计算 (Q) 和 (K) 的点积,得到注意力分数矩阵:
[
\text{Scores} = Q K^T = \begin{bmatrix}
1 & 0 & 1 \ 2 & 2 & 2 \ 2 & 1 & 2
\end{bmatrix} \begin{bmatrix}
0 & 4 & 2 \ 1 & 0 & 2 \ 1 & 2 & 1
\end{bmatrix} = \begin{bmatrix}
1 & 2 & 3 \ 4 & 8 & 8 \ 3 & 6 & 7
\end{bmatrix}
]
Step 3: 缩放 + Softmax 归一化
为了防止点积过大,通常除以 (\sqrt{d_k})((d_k) 是 Key 的维度,这里 (d_k=3)):
[
\text{Scaled Scores} = \frac{\text{Scores}}{\sqrt{3}} = \begin{bmatrix}
0.58 & 1.15 & 1.73 \ 2.31 & 4.62 & 4.62 \ 1.73 & 3.46 & 4.04
\end{bmatrix}
]
然后应用 Softmax 归一化(按行):
[
\text{Attention Weights} = \text{softmax}(\text{Scaled Scores}) = \begin{bmatrix}
0.20 & 0.30 & 0.50 \ 0.02 & 0.49 & 0.49 \ 0.04 & 0.24 & 0.72
\end{bmatrix}
]
Step 4: 加权求和得到输出
用 Attention Weights 对 (V) 加权求和:
[
Z = \text{Attention Weights} \cdot V = \begin{bmatrix}
0.20 & 0.30 & 0.50 \ 0.02 & 0.49 & 0.49 \ 0.04 & 0.24 & 0.72
\end{bmatrix} \begin{bmatrix}
0 & 1 & 1 \ 2 & 2 & 2 \ 2 & 2 & 1
\end{bmatrix} = \begin{bmatrix}
1.6 & 1.8 & 1.3 \ 2.0 & 2.0 & 1.5 \ 1.9 & 1.9 & 1.1
\end{bmatrix}
]
最终输出
每个单词的新表示 (Z) 包含了整个序列的信息:
[
Z = \begin{bmatrix}
z_1 \ z_2 \ z_3
\end{bmatrix} = \begin{bmatrix}
1.6 & 1.8 & 1.3 \ 2.0 & 2.0 & 1.5 \ 1.9 & 1.9 & 1.1
\end{bmatrix}
]
2. Self-Attention 的作用
- 捕捉长距离依赖:即使 (x_1) 和 (x_3) 相隔很远,Self-Attention 也能直接计算它们的相关性。
- 动态权重分配:每个单词的表示会根据其他单词动态调整(如 (z_1) 受 (x_2, x_3) 影响)。
- 并行计算:所有位置的注意力可以同时计算,适合 GPU 加速。
3. 实际应用
- Transformer:编码器和解码器均使用 Self-Attention。
- BERT/GPT:基于 Transformer 的预训练模型,依赖 Self-Attention 理解上下文。
Self-Attention 的核心思想是让模型自己决定哪些信息更重要,而不是依赖固定规则(如 RNN 的顺序计算)。