注意力机制的详细解释
注意力机制可以描述为将查询(query)和一组键-值对(key-value pairs)映射到一个输出,其中查询、键、值和输出都是向量。输出是值的加权和,每个值的权重是通过查询与相应键的兼容性函数计算得到的。
缩放点积注意力机制(Scaled Dot-Product Attention)
图2的左侧部分展示了缩放点积注意力机制的工作流程。具体步骤如下:
-
查询(Query)、键(Key)、值(Value)矩阵:
- 输入包含查询矩阵 Q Q Q、键矩阵 K K K和值矩阵 V V V。
-
计算注意力分数(Attention Scores):
- 使用点积计算查询和键之间的相似度,得到注意力分数矩阵:
Attention Scores = Q K T \text{Attention Scores} = QK^T Attention Scores=QKT
- 使用点积计算查询和键之间的相似度,得到注意力分数矩阵:
-
缩放(Scaling):
- 对注意力分数进行缩放,避免数值过大导致Softmax函数的梯度过小:
Scaled Scores = Q K T d k \text{Scaled Scores} = \frac{QK^T}{\sqrt{d_k}} Scaled Scores=dkQKT
其中 d k d_k dk是键向量的维度。
- 对注意力分数进行缩放,避免数值过大导致Softmax函数的梯度过小:
-
掩码(Masking,选项):
- 对未来位置进行掩码,确保生成当前输出时不会看到未来的信息。这一步在训练自回归模型时尤其重要。
-
Softmax归一化:
- 使用Softmax函数将缩放后的注意力分数转换为权重:
Attention Weights = softmax ( Q K T d k ) \text{Attention Weights} = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right) Attention Weights=softmax(dkQKT)
- 使用Softmax函数将缩放后的注意力分数转换为权重:
-
加权求和:
- 使用注意力权重对值进行加权求和,得到最终的注意力输出:
Attention Output = Attention Weights ⋅ V \text{Attention Output} = \text{Attention Weights} \cdot V Attention Output=Attention Weights⋅V
- 使用注意力权重对值进行加权求和,得到最终的注意力输出:
多头注意力机制(Multi-Head Attention)
图2的右侧部分展示了多头注意力机制的工作流程。具体步骤如下:
-
线性变换:
- 对输入的查询、键和值分别进行线性变换,得到多个不同的头。这些线性变换使用不同的权重矩阵:
Q i = Q W i Q , K i = K W i K , V i = V W i V Q_i = QW_i^Q, \quad K_i = KW_i^K, \quad V_i = VW_i^V Qi=QWiQ,Ki=KWiK,Vi=VWiV
其中 i i i表示第 i i i个头, W i Q W_i^Q WiQ、 W i K W_i^K WiK和 W i V W_i^V WiV是不同的权重矩阵。
- 对输入的查询、键和值分别进行线性变换,得到多个不同的头。这些线性变换使用不同的权重矩阵:
-
并行计算多个注意力头:
- 对每个头独立计算缩放点积注意力。每个头的计算过程与上述缩放点积注意力相同。
-
拼接和线性变换:
- 将所有头的输出拼接在一起,然后通过一个线性变换生成最终的输出:
Multi-Head Output = Concat ( head 1 , head 2 , … , head h ) W O \text{Multi-Head Output} = \text{Concat}(\text{head}_1, \text{head}_2, \ldots, \text{head}_h)W^O Multi-Head Output=Concat(head1,head2,…,headh)WO
其中 W O W^O WO是输出的线性变换矩阵。
- 将所有头的输出拼接在一起,然后通过一个线性变换生成最终的输出:
具体示例
假设我们有一个简单的示例,输入序列为:
Input Sequence
=
[
23.1
24.3
22.8
23.5
]
\text{Input Sequence} = \begin{bmatrix} 23.1 & 24.3 & 22.8 & 23.5 \end{bmatrix}
Input Sequence=[23.124.322.823.5]
我们将展示如何通过缩放点积注意力机制和多头注意力机制处理这个输入序列。
缩放点积注意力机制示例
假设查询、键和值矩阵如下:
Q = [ 1 0 0 1 ] , K = [ 1 0 0 1 ] , V = [ 23.1 24.3 22.8 23.5 ] Q = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix}, \quad K = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix}, \quad V = \begin{bmatrix} 23.1 & 24.3 \\ 22.8 & 23.5 \end{bmatrix} Q=[1001],K=[1001],V=[23.122.824.323.5]
计算注意力分数:
Scores = Q K T = [ 1 0 0 1 ] [ 1 0 0 1 ] T = [ 1 0 0 1 ] \text{Scores} = QK^T = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix}^T = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix} Scores=QKT=[1001][1001]T=[1001]
缩放:
Scaled Scores = 1 2 [ 1 0 0 1 ] \text{Scaled Scores} = \frac{1}{\sqrt{2}} \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix} Scaled Scores=21[1001]
Softmax归一化:
Attention Weights = softmax ( [ 1 2 0 0 1 2 ] ) = [ 1 0 0 1 ] \text{Attention Weights} = \text{softmax}\left(\begin{bmatrix} \frac{1}{\sqrt{2}} & 0 \\ 0 & \frac{1}{\sqrt{2}} \end{bmatrix}\right) = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix} Attention Weights=softmax([210021])=[1001]
加权求和:
Attention Output = [ 1 0 0 1 ] [ 23.1 24.3 22.8 23.5 ] = [ 23.1 24.3 22.8 23.5 ] \text{Attention Output} = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix} \begin{bmatrix} 23.1 & 24.3 \\ 22.8 & 23.5 \end{bmatrix} = \begin{bmatrix} 23.1 & 24.3 \\ 22.8 & 23.5 \end{bmatrix} Attention Output=[1001][23.122.824.323.5]=[23.122.824.323.5]
多头注意力机制示例
假设我们有两个头,每个头的权重矩阵如下:
W 1 Q = W 1 K = W 1 V = [ 0.5 0.5 0.5 0.5 ] , W 2 Q = W 2 K = W 2 V = [ 0.3 0.7 0.7 0.3 ] W_1^Q = W_1^K = W_1^V = \begin{bmatrix} 0.5 & 0.5 \\ 0.5 & 0.5 \end{bmatrix}, \quad W_2^Q = W_2^K = W_2^V = \begin{bmatrix} 0.3 & 0.7 \\ 0.7 & 0.3 \end{bmatrix} W1Q=W1K=W1V=[0.50.50.50.5],W2Q=W2K=W2V=[0.30.70.70.3]
计算第一个头的查询、键和值矩阵:
Q 1 = Q W 1 Q , K 1 = K W 1 K , V 1 = V W 1 V Q_1 = QW_1^Q, \quad K_1 = KW_1^K, \quad V_1 = VW_1^V Q1=QW1Q,K1=KW1K,V1=VW1V
Q 1 = [ 1 0 0 1 ] [ 0.5 0.5 0.5 0.5 ] = [ 0.5 0.5 0.5 0.5 ] Q_1 = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix} \begin{bmatrix} 0.5 & 0.5 \\ 0.5 & 0.5 \end{bmatrix} = \begin{bmatrix} 0.5 & 0.5 \\ 0.5 & 0.5 \end{bmatrix} Q1=[1001][0.50.50.50.5]=[0.50.50.50.5]
K 1 = [ 1 0 0 1 ] [ 0.5 0.5 0.5 0.5 ] = [ 0.5 0.5 0.5 0.5 ] K_1 = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix} \begin{bmatrix} 0.5 & 0.5 \\ 0.5 & 0.5 \end{bmatrix} = \begin{bmatrix} 0.5 & 0.5 \\ 0.5 & 0.5 \end{bmatrix} K1=[1001][0.50.50.50.5]=[0.50.50.50.5]
V 1 = [ 23.1 24.3 22.8 23.5 ] [ 0.5 0.5 0.5 0.5 ] = [ 23.1 24.3 22.8 23.5 ] [ 0.5 0.5 ] = [ 23.7 23.15 ] V_1 = \begin{bmatrix} 23.1 & 24.3 \\ 22.8 & 23.5 \end{bmatrix} \begin{bmatrix} 0.5 & 0.5 \\ 0.5 & 0.5 \end{bmatrix} = \begin{bmatrix} 23.1 & 24.3 \\ 22.8 & 23.5 \end{bmatrix} \begin{bmatrix} 0.5 \\ 0.5 \end{bmatrix} = \begin{bmatrix} 23.7 \\ 23.15 \end{bmatrix} V1=[23.122.824.323.5][0.50.50.50.5]=[23.122.824.323.5][0.50.5]=[23.723.15]
计算注意力分数:
Scores 1 = Q 1 K 1 T = [ 0.5 0.5 0.5 0.5 ] [ 0.5 0.5 0.5 0.5 ] T = [ 0.5 0.5 0.5 0.5 ] \text{Scores}_1 = Q_1 K_1^T = \begin{bmatrix} 0.5 & 0.5 \\ 0.5 & 0.5 \end{bmatrix} \begin{bmatrix} 0.5 & 0.5 \\ 0.5 & 0.5 \end{bmatrix}^T = \begin{bmatrix} 0.5 & 0.5 \\ 0.5 & 0.5 \end{bmatrix} Scores1=Q1K1T=[0.50.50.50.5][0.50.50.50.5]T=[0.50.50.50.5]
缩放并归一化:
Scaled Scores 1 = 1 2 [ 0.5 0.5 0.5 0.5 ] , Attention Weights 1 = softmax ( [ 0.5 2 0.5 2 0.5 2 0.5 2 ] ) \text{Scaled Scores}_1 = \frac{1}{\sqrt{2}} \begin{bmatrix} 0.5 & 0.5 \\ 0.5 & 0.5 \end{bmatrix}, \quad \text{Attention Weights}_1 = \text{softmax}\left(\begin{bmatrix} \frac{0.5}{\sqrt{2}} & \frac{0.5}{\sqrt{2}} \\ \frac{0.5}{\sqrt{ 2}} & \frac{0.5}{\sqrt{2}} \end{bmatrix}\right) Scaled Scores1=21[0.50.50.50.5],Attention Weights1=softmax([20.520.520.520.5])
= [ 0.5 0.5 0.5 0.5 ] = \begin{bmatrix} 0.5 & 0.5 \\ 0.5 & 0.5 \end{bmatrix} =[0.50.50.50.5]
加权求和:
Attention Output 1 = Attention Weights 1 ⋅ V 1 = [ 0.5 0.5 0.5 0.5 ] [ 23.7 23.15 ] = [ 23.425 23.425 ] \text{Attention Output}_1 = \text{Attention Weights}_1 \cdot V_1 = \begin{bmatrix} 0.5 & 0.5 \\ 0.5 & 0.5 \end{bmatrix} \begin{bmatrix} 23.7 \\ 23.15 \end{bmatrix} = \begin{bmatrix} 23.425 \\ 23.425 \end{bmatrix} Attention Output1=Attention Weights1⋅V1=[0.50.50.50.5][23.723.15]=[23.42523.425]
类似地计算第二个头的输出,并将两个头的输出拼接在一起:
Multi-Head Output = Concat ( Attention Output 1 , Attention Output 2 ) \text{Multi-Head Output} = \text{Concat}(\text{Attention Output}_1, \text{Attention Output}_2) Multi-Head Output=Concat(Attention Output1,Attention Output2)
总结
通过详细解释和具体示例,我们展示了缩放点积注意力机制和多头注意力机制的工作原理。注意力机制通过查询与键的相似度计算注意力权重,并使用这些权重对值进行加权求和,从而捕捉输入数据中的重要信息。多头注意力机制通过并行计算多个注意力头,增强了模型捕捉不同子空间信息的能力,使得Transformer模型能够更好地处理复杂的序列数据。