让我们通过一个具体的例子来详细说明自注意力机制的输出向量如何反映输入序列中每个元素的上下文信息和重要性。
示例设置
假设我们有一个简单的输入序列 X X X,包含三个词(元素),每个词表示为一个2维向量:
X = [ 1 0 0 1 1 1 ] X = \begin{bmatrix} 1 & 0 \\ 0 & 1 \\ 1 & 1 \end{bmatrix} X= 101011
我们将使用自注意力机制来计算这个序列的上下文表示。
计算查询、键和值向量
假设权重矩阵 W Q W_Q WQ、 W K W_K WK和 W V W_V WV均为单位矩阵:
W Q = W K = W V = [ 1 0 0 1 ] W_Q = W_K = W_V = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix} WQ=WK=WV=[1001]
这样,查询向量 Q Q Q、键向量 K K K和值向量 V V V都等于输入向量 X X X:
Q = X W Q = [ 1 0 0 1 1 1 ] Q = XW_Q = \begin{bmatrix} 1 & 0 \\ 0 & 1 \\ 1 & 1 \end{bmatrix} Q=XWQ= 101011
K = X W K = [ 1 0 0 1 1 1 ] K = XW_K = \begin{bmatrix} 1 & 0 \\ 0 & 1 \\ 1 & 1 \end{bmatrix} K=XWK= 101011
V = X W V = [ 1 0 0 1 1 1 ] V = XW_V = \begin{bmatrix} 1 & 0 \\ 0 & 1 \\ 1 & 1 \end{bmatrix} V=XWV= 101011
计算注意力分数
计算查询向量 Q Q Q和键向量 K K K的点积并缩放:
Q K T 2 = 1 2 [ 1 0 0 1 1 1 ] [ 1 0 1 0 1 1 ] = 1 2 [ 1 0 1 0 1 1 1 1 2 ] \frac{QK^T}{\sqrt{2}} = \frac{1}{\sqrt{2}} \begin{bmatrix} 1 & 0 \\ 0 & 1 \\ 1 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 1 \\ 0 & 1 & 1 \end{bmatrix} = \frac{1}{\sqrt{2}} \begin{bmatrix} 1 & 0 & 1 \\ 0 & 1 & 1 \\ 1 & 1 & 2 \end{bmatrix} 2QKT=21 101011 [100111]=21 101011112
应用Softmax函数
对注意力分数矩阵的每一行应用Softmax函数:
A = softmax ( Q K T 2 ) A = \text{softmax}\left(\frac{QK^T}{\sqrt{2}}\right) A=softmax(2QKT)
假设Softmax计算结果如下:
A = [ 0.4 0.2 0.4 0.2 0.4 0.4 0.3 0.3 0.4 ] A = \begin{bmatrix} 0.4 & 0.2 & 0.4 \\ 0.2 & 0.4 & 0.4 \\ 0.3 & 0.3 & 0.4 \end{bmatrix} A= 0.40.20.30.20.40.30.40.40.4
计算加权求和值矩阵
用注意力权重矩阵 A A A对值矩阵 V V V进行加权求和,得到输出向量:
Output = A V = [ 0.4 0.2 0.4 0.2 0.4 0.4 0.3 0.3 0.4 ] [ 1 0 0 1 1 1 ] = [ 0.8 0.6 0.6 0.8 0.7 0.7 ] \text{Output} = AV = \begin{bmatrix} 0.4 & 0.2 & 0.4 \\ 0.2 & 0.4 & 0.4 \\ 0.3 & 0.3 & 0.4 \end{bmatrix} \begin{bmatrix} 1 & 0 \\ 0 & 1 \\ 1 & 1 \end{bmatrix} = \begin{bmatrix} 0.8 & 0.6 \\ 0.6 & 0.8 \\ 0.7 & 0.7 \end{bmatrix} Output=AV= 0.40.20.30.20.40.30.40.40.4 101011 = 0.80.60.70.60.80.7
分析输出向量的含义
-
第一个输出向量 [ 0.8 , 0.6 ] [0.8, 0.6] [0.8,0.6]:
这个向量综合了输入序列中第一个元素与其他所有元素(包括自身)的信息。- 0.4 (自身): 表示第一个元素对自己的注意力权重。
- 0.2 (第二个元素): 表示第一个元素对第二个元素的注意力权重。
- 0.4 (第三个元素): 表示第一个元素对第三个元素的注意力权重。
加权求和计算得到的输出向量表示了第一个元素在整个输入序列中的上下文信息。具体来说:
第一个输出向量 = 0.4 ⋅ [ 1 , 0 ] + 0.2 ⋅ [ 0 , 1 ] + 0.4 ⋅ [ 1 , 1 ] = [ 0.8 , 0.6 ] \text{第一个输出向量} = 0.4 \cdot [1, 0] + 0.2 \cdot [0, 1] + 0.4 \cdot [1, 1] = [0.8, 0.6] 第一个输出向量=0.4⋅[1,0]+0.2⋅[0,1]+0.4⋅[1,1]=[0.8,0.6]
这意味着第一个输出向量不仅包含了第一个元素的原始信息,还结合了第二个和第三个元素的信息。这个向量反映了第一个元素在当前上下文中的重要性和相关性。
-
第二个输出向量 [ 0.6 , 0.8 ] [0.6, 0.8] [0.6,0.8]:
类似地,第二个输出向量综合了第二个元素与其他所有元素(包括自身)的信息。- 0.2 (第一个元素): 表示第二个元素对第一个元素的注意力权重。
- 0.4 (自身): 表示第二个元素对自己的注意力权重。
- 0.4 (第三个元素): 表示第二个元素对第三个元素的注意力权重。
加权求和计算得到的输出向量表示了第二个元素在整个输入序列中的上下文信息:
第二个输出向量 = 0.2 ⋅ [ 1 , 0 ] + 0.4 ⋅ [ 0 , 1 ] + 0.4 ⋅ [ 1 , 1 ] = [ 0.6 , 0.8 ] \text{第二个输出向量} = 0.2 \cdot [1, 0] + 0.4 \cdot [0, 1] + 0.4 \cdot [1, 1] = [0.6, 0.8] 第二个输出向量=0.2⋅[1,0]+0.4⋅[0,1]+0.4⋅[1,1]=[0.6,0.8]
-
第三个输出向量 [ 0.7 , 0.7 ] [0.7, 0.7] [0.7,0.7]:
第三个输出向量综合了第三个元素与其他所有元素(包括自身)的信息。- 0.3 (第一个元素): 表示第三个元素对第一个元素的注意力权重。
- 0.3 (第二个元素): 表示第三个元素对第二个元素的注意力权重。
- 0.4 (自身): 表示第三个元素对自己的注意力权重。
加权求和计算得到的输出向量表示了第三个元素在整个输入序列中的上下文信息:
第三个输出向量 = 0.3 ⋅ [ 1 , 0 ] + 0.3 ⋅ [ 0 , 1 ] + 0.4 ⋅ [ 1 , 1 ] = [ 0.7 , 0.7 ] \text{第三个输出向量} = 0.3 \cdot [1, 0] + 0.3 \cdot [0, 1] + 0.4 \cdot [1, 1] = [0.7, 0.7] 第三个输出向量=0.3⋅[1,0]+0.3⋅[0,1]+0.4⋅[1,1]=[0.7,0.7]
详细计算过程
-
第一个注意力权重和第一个值向量的加权求和:
0.4 ⋅ [ 1 , 0 ] = [ 0.4 ⋅ 1 , 0.4 ⋅ 0 ] = [ 0.4 , 0 ] 0.4 \cdot [1, 0] = [0.4 \cdot 1, 0.4 \cdot 0] = [0.4, 0] 0.4⋅[1,0]=[0.4⋅1,0.4⋅0]=[0.4,0] -
第二个注意力权重和第二个值向量的加权求和:
0.2 ⋅ [ 0 , 1 ] = [ 0.2 ⋅ 0 , 0.2 ⋅ 1 ] = [ 0 , 0.2 ] 0.2 \cdot [0, 1] = [0.2 \cdot 0, 0.2 \cdot 1] = [0, 0.2] 0.2⋅[0,1]=[0.2⋅0,0.2⋅1]=[0,0.2] -
第三个注意力权重和第三个值向量的加权求和:
0.4 ⋅ [ 1 , 1 ] = [ 0.4 ⋅ 1 , 0.4 ⋅ 1 ] = [ 0.4 , 0.4 ] 0.4 \cdot [1, 1] = [0.4 \cdot 1, 0.4 \cdot 1] = [0.4, 0.4] 0.4⋅[1,1]=[0.4⋅1,0.4⋅1]=[0.4,0.4] -
将上述结果相加:
[ 0.4 , 0 ] + [ 0 , 0.2 ] + [ 0.4 , 0.4 ] = [ 0.4 + 0 + 0.4 , 0 + 0.2 + 0.4 ] = [ 0.8 , 0.6 ] [0.4, 0] + [0, 0.2] + [0.4, 0.4] = [0.4 + 0 + 0.4, 0 + 0.2 + 0.4] = [0.8, 0.6] [0.4,0]+[0,0.2]+[0.4,0.4]=[0.4+0+0.4,0+0.2+0.4]=[0.8,0.6]
解释输出向量的含义
-
第一个输出向量 [ 0.8 , 0.6 ] [0.8, 0.6] [0.8,0.6]:
- 这个向量是通过加权求和得到的,每个权重反映了输入序列中对应元素对第一个输入元素的重要性。
- 0.4 0.4 0.4表示第一个输入元素对自己的权重(自身重要性)。
- 0.2 0.2 0.2表示第一个输入元素对第二个输入元素的权重。
- 0.4 0.4 0.4表示第一个输入元素对第三个输入元素的权重。
最终的输出向量不仅包含了第一个输入元素的原始信息(因为第一个元素的权重是 0.4 0.4 0.4),还结合了第二个和第三个输入元素的信息(它们的权重分别是 0.2 0.2 0.2和 0.4 0.4 0.4)。因此,这个向量综合了整个输入序列的上下文信息。
- 这个向量是通过加权求和得到的,每个权重反映了输入序列中对应元素对第一个输入元素的重要性。
分析其它输出向量
我们同样可以计算第二个和第三个输出向量:
- 第二个输出向量
[
0.6
,
0.8
]
[0.6, 0.8]
[0.6,0.8]:
- 这个向量是通过加权求和得到的,反映了第二个输入元素在整个输入序列中的重要性和相关性。
第二个输出向量 = 0.2 ⋅ [ 1 , 0 ] + 0.4 ⋅ [ 0 , 1 ] + 0.4 ⋅ [ 1 , 1 ] = [ 0.2 , 0 ] + [ 0 , 0.4 ] + [ 0.4 , 0.4 ] = [ 0.6 , 0.8 ] \text{第二个输出向量} = 0.2 \cdot [1, 0] + 0.4 \cdot [0, 1] + 0.4 \cdot [1, 1] = [0.2, 0] + [0, 0.4] + [0.4, 0.4] = [0.6, 0.8] 第二个输出向量=0.2⋅[1,0]+0.4⋅[0,1]+0.4⋅[1,1]=[0.2,0]+[0,0.4]+[0.4,0.4]=[0.6,0.8]
- 第三个输出向量
[
0.7
,
0.7
]
[0.7, 0.7]
[0.7,0.7]:
- 这个向量是通过加权求和得到的,反映了第三个输入元素在整个输入序列中的重要性和相关性。
第三个输出向量 = 0.3 ⋅ [ 1 , 0 ] + 0.3 ⋅ [ 0 , 1 ] + 0.4 ⋅ [ 1 , 1 ] = [ 0.3 , 0 ] + [ 0 , 0.3 ] + [ 0.4 , 0.4 ] = [ 0.7 , 0.7 ] \text{第三个输出向量} = 0.3 \cdot [1, 0] + 0.3 \cdot [0, 1] + 0.4 \cdot [1, 1] = [0.3, 0] + [0, 0.3] + [0.4, 0.4] = [0.7, 0.7] 第三个输出向量=0.3⋅[1,0]+0.3⋅[0,1]+0.4⋅[1,1]=[0.3,0]+[0,0.3]+[0.4,0.4]=[0.7,0.7]
总结
这些输出向量通过自注意力机制综合了输入序列中各个元素的重要信息,反映了输入序列的上下文关系。每个输出向量不仅包含了其对应输入元素的原始信息,还结合了其他元素的信息,从而在新的特征空间中更好地表达了输入序列的整体特征和依赖关系。这种上下文信息的综合对于后续任务(如机器翻译、文本生成等)至关重要。