Transformer 解码器的详细推导
我们将详细推导 Transformer 解码器 的操作,包括具体的矩阵计算过程。主要涵盖以下步骤:
- 遮掩多头自注意力机制(Masked Multi-Head Self-Attention) 的计算。
- 编码器-解码器注意力机制(Encoder-Decoder Attention) 的计算。
- 残差连接和层归一化。
- 前馈神经网络(Feed-Forward Network, FFN) 的计算。
- 最终输出。
为简化计算,我们假设所有矩阵的维度较小,并使用简单的数值。
1. 解码器输入
假设解码器的输入序列 Y_input
为:
plaintext
复制代码
Y_input = [0 1] [1 0] [1 1]
这个序列有 3 个词,每个词的嵌入维度为 2。
2. 遮掩多头自注意力机制
2.1 定义投影矩阵
为了计算注意力,需要定义查询(W^Q
)、键(W^K
)、值(W^V
)的投影矩阵。为简化,我们设定:
plaintext
复制代码
W^Q = W^K = W^V = [1 0] [0 1]
2.2 计算查询、键和值
计算查询 Q
、键 K
和 值 V
:
plaintext
复制代码
Q = Y_input * W^Q K = Y_input * W^K V = Y_input * W^V
因此,
plaintext
复制代码
Q = K = V = [0 1] [1 0] [1 1]
2.3 计算未缩放的注意力得分
plaintext
复制代码
Q * K^T = [0 1] [0 1 1] [1 0] * [1 0 1] [1 1] [1 1 2]
计算结果为:
plaintext
复制代码
[1 0 1] [0 1 1] [1 1 2]
2.4 缩放并应用遮掩
我们将注意力得分缩放,假设 d_k = 2
,计算缩放后的得分:
plaintext
复制代码
Scaled Scores = [0.707 0 0.707] [0 0.707 0.707] [0.707 0.707 1.414]
接下来应用遮掩矩阵 M
:
plaintext
复制代码
M = [0 -∞ -∞] [0 0 -∞] [0 0 0]
将遮掩矩阵添加到缩放后的注意力得分中,结果为:
plaintext
复制代码
Masked Scores = [0.707 -∞ -∞ ] [0 0.707 -∞ ] [0.707 0.707 1.414]
2.5 计算注意力权重
对每一行应用 softmax 函数:
- 第一行:
[0.707, -∞, -∞]
->[1, 0, 0]
- 第二行:
[0, 0.707, -∞]
->[0.330, 0.670, 0]
- 第三行:
[0.707, 0.707, 1.414]
->[0.248, 0.248, 0.504]
得到注意力权重矩阵:
plaintext
复制代码
Attention Weights = [1 0 0 ] [0.330 0.670 0 ] [0.248 0.248 0.504]
2.6 计算注意力输出
将注意力权重与值矩阵 V
相乘:
plaintext
复制代码
Attention Output = Attention Weights * V
结果为:
plaintext
复制代码
[0 1 ] [0.670 0.330] [0.752 0.752]
3. 残差连接和层归一化
3.1 残差连接
将注意力输出与解码器输入相加:
plaintext
复制代码
Z = Attention Output + Y_input = [0 2 ] [1.670 0.330] [1.752 1.752]
3.2 层归一化
对每一行进行层归一化,结果如下:
plaintext
复制代码
LayerNorm(Z) = [-1 1 ] [ 1 -1 ] [ 0 0 ]
4. 编码器-解码器注意力机制
4.1 获取编码器输出
假设编码器的输出为:
plaintext
复制代码
X_encoder = [ 1 -1 ] [-1 1 ] [ 0 0 ]
4.2 计算查询、键和值
- 查询
Q = LayerNorm(Z) * W^Q
- 键
K = X_encoder
- 值
V = X_encoder
4.3 计算注意力得分
plaintext
复制代码
Q * K^T = [-1 1 ] [ 1 -1 0 ] [ 1 -1 ] * [-1 1 0 ] [ 0 0 ] [ 0 0 0 ]
结果为:
plaintext
复制代码
[-2 2 0] [ 2 -2 0] [ 0 0 0]
4.4 缩放并应用 softmax
我们对得分进行缩放,然后应用 softmax 得到注意力权重矩阵:
plaintext
复制代码
Attention Weights = [0.047 0.642 0.311] [0.642 0.047 0.311] [0.333 0.333 0.333]
4.5 计算注意力输出
将注意力权重与值矩阵 V
相乘,得到注意力输出:
plaintext
复制代码
Attention Output = [-0.594 0.594] [ 0.594 -0.594] [ 0 0 ]
5. 残差连接和层归一化
5.1 残差连接
将注意力输出与 LayerNorm(Z)
相加:
plaintext
复制代码
Z_ED = Attention Output + LayerNorm(Z) = [-1.594 1.594] [ 1.594 -1.594] [ 0 0 ]
5.2 层归一化
对 Z_ED
进行归一化:
plaintext
复制代码
LayerNorm(Z_ED) = [-1 1] [ 1 -1] [ 0 0]
6. 前馈神经网络(FFN)
6.1 计算 FFN 输出
应用 ReLU 激活函数:
plaintext
复制代码
FFN(x) = ReLU(x)
结果为:
plaintext
复制代码
FFN(x) = [ 0 1 ] [ 1 0 ] [ 0 0 ]
7. 残差连接和层归一化
7.1 残差连接
将 FFN 输出与输入相加:
plaintext
复制代码
Z_FFN = FFN(x) + LayerNorm(Z_ED) = [-1 2 ] [ 2 -1 ] [ 0 0 ]
7.2 层归一化
对 Z_FFN
进行归一化:
plaintext
复制代码
LayerNorm(Z_FFN) = [-1 1] [ 1 -1] [ 0 0]