transformer具体计算
为了详细说明 Transformer 模型在机器翻译中的向量计算过程,我们将从输入的英文句子 “I went to Northeastern University” 和对应的中文标注 “我去东北大学” 入手,介绍从词嵌入、注意力计算、解码器中的多头注意力到最终生成的详细步骤。为了让具体过程更具可操作性,我将向量的维度和数量缩小化,以便说明整个过程。
1. 词嵌入(Embedding)
假设我们的模型使用了词嵌入向量的维度 $ d_{\text{model}} = 4 $(简化,实际中通常是 512 或 1024),句子中的每个词通过嵌入层映射为长度为 4 的向量。以下是简化的词嵌入向量(这些向量在实际中是通过预训练或模型学习得到的):
英文句子:
- “I”: $ \mathbf{E}_{I} = [0.1, 0.3, 0.2, 0.4] $
- “went”: $ \mathbf{E}_{went} = [0.5, 0.6, 0.7, 0.8] $
- “to”: $ \mathbf{E}_{to} = [0.9, 0.1, 0.3, 0.5] $
- “Northeastern”: $ \mathbf{E}_{Northeastern} = [0.2, 0.4, 0.6, 0.8] $
- “University”: $ \mathbf{E}_{University} = [0.3, 0.2, 0.1, 0.5] $
这些向量组合成一个矩阵,表示整个句子的嵌入表示:
[
\mathbf{E}_{\text{英}} = \begin{bmatrix}
0.1 & 0.3 & 0.2 & 0.4 \
0.5 & 0.6 & 0.7 & 0.8 \
0.9 & 0.1 & 0.3 & 0.5 \
0.2 & 0.4 & 0.6 & 0.8 \
0.3 & 0.2 & 0.1 & 0.5
\end{bmatrix}
]
维度:$5 \times 4$ (5个词,每个词的嵌入维度是4)
中文句子:
- “我”: $ \mathbf{E}_{我} = [0.3, 0.1, 0.2, 0.5] $
- “去”: $ \mathbf{E}_{去} = [0.6, 0.3, 0.4, 0.7] $
- “东北大学”: $ \mathbf{E}_{东北大学} = [0.8, 0.5, 0.6, 0.9] $
中文句子嵌入为:
[
\mathbf{E}_{\text{中}} = \begin{bmatrix}
0.3 & 0.1 & 0.2 & 0.5 \
0.6 & 0.3 & 0.4 & 0.7 \
0.8 & 0.5 & 0.6 & 0.9
\end{bmatrix}
]
维度:$3 \times 4$ (3个词,每个词的嵌入维度是4)
2. 位置编码(Positional Encoding)
为了注入序列信息,加入位置编码(Positional Encoding)。假设我们的位置编码矩阵如下:
- 对于5个英文词:
[
\mathbf{P}_{\text{英}} = \begin{bmatrix}
0.1 & 0.2 & 0.3 & 0.4 \
0.2 & 0.3 & 0.4 & 0.5 \
0.3 & 0.4 & 0.5 & 0.6 \
0.4 & 0.5 & 0.6 & 0.7 \
0.5 & 0.6 & 0.7 & 0.8
\end{bmatrix}
] - 对于3个中文词:
[
\mathbf{P}_{\text{中}} = \begin{bmatrix}
0.1 & 0.2 & 0.3 & 0.4 \
0.2 & 0.3 & 0.4 & 0.5 \
0.3 & 0.4 & 0.5 & 0.6
\end{bmatrix}
]
经过位置编码后,最终的输入是词嵌入向量与位置编码的逐元素相加:
英文向量 + 位置编码:
[
\mathbf{E}{\text{英}} + \mathbf{P}{\text{英}} = \begin{bmatrix}
0.1+0.1 & 0.3+0.2 & 0.2+0.3 & 0.4+0.4 \
0.5+0.2 & 0.6+0.3 & 0.7+0.4 & 0.8+0.5 \
0.9+0.3 & 0.1+0.4 & 0.3+0.5 & 0.5+0.6 \
0.2+0.4 & 0.4+0.5 & 0.6+0.6 & 0.8+0.7 \
0.3+0.5 & 0.2+0.6 & 0.1+0.7 & 0.5+0.8
\end{bmatrix} = \begin{bmatrix}
0.2 & 0.5 & 0.5 & 0.8 \
0.7 & 0.9 & 1.1 & 1.3 \
1.2 & 0.5 & 0.8 & 1.1 \
0.6 & 0.9 & 1.2 & 1.5 \
0.8 & 0.8 & 0.8 & 1.3
\end{bmatrix}
]
中文向量 + 位置编码:
[
\mathbf{E}{\text{中}} + \mathbf{P}{\text{中}} = \begin{bmatrix}
0.3+0.1 & 0.1+0.2 & 0.2+0.3 & 0.5+0.4 \
0.6+0.2 & 0.3+0.3 & 0.4+0.4 & 0.7+0.5 \
0.8+0.3 & 0.5+0.4 & 0.6+0.5 & 0.9+0.6
\end{bmatrix} = \begin{bmatrix}
0.4 & 0.3 & 0.5 & 0.9 \
0.8 & 0.6 & 0.8 & 1.2 \
1.1 & 0.9 & 1.1 & 1.5
\end{bmatrix}
]
3. 编码器的多头自注意力机制
进入 编码器,每个词的向量会分别通过三个线性变换得到 Query (Q)、Key (K) 和 Value (V) 向量。假设每个向量的维度仍然是 4。
例如,对于“went”这个词,假设我们通过线性变换矩阵 $ W_Q $、$ W_K $、$ W_V $ 生成 Q, K, V:
[
Q{\text{went}} = W_Q \cdot \mathbf{E}{went}, \quad K{\text{went}} = W_K \cdot \mathbf{E}{went}, \quad V{\text{went}} = W_V \cdot \mathbf{E}{went}
]
假设 $ W_Q $, $ W_K $, $ W_V $ 的维度为 $ 4 \times 4 $,比如:
[
W_Q = \begin{bmatrix}
0.2 & 0.1 & 0.3 & 0.5 \
0.6 & 0.4 & 0.1 & 0.7 \
0.3 & 0.8 & 0.2 & 0.4 \
0.5 & 0.9 & 0.6 & 0.1
\end{bmatrix}
]
那么:
[
Q_{\text{went}} = W_Q \cdot [0.7, 0.9, 1.1, 1.3] = \begin{bmatrix} 0.2 & 0.1 &
0.3 & 0.5 \ 0.6 & 0.4 & 0.1 & 0.7 \ 0.3 & 0.8 & 0.2 & 0.4 \ 0.5 & 0.9 & 0.6 & 0.1 \end{bmatrix} \cdot \begin{bmatrix} 0.7 \ 0.9 \ 1.1 \ 1.3 \end{bmatrix} = \begin{bmatrix} 1.27 \ 1.84 \ 1.51 \ 1.61 \end{bmatrix}
]
通过类似的过程,可以计算出所有词的 Q, K, V。
4. 注意力计算
对于每个词,计算 Q 与所有其他词的 K 进行点积,生成注意力权重矩阵。然后用这些权重对 V 进行加权求和。
假设对于“went”,与其他词的 K 点积计算如下:
[
\text{Attention}{went} = \frac{Q{\text{went}} \cdot K_{\text{其他词}}}{\sqrt{d_k}}
]
具体注意力计算可以按照这个过程逐步实现。
整个过程需要多次矩阵乘法与注意力加权,最终解码器生成的词汇是基于这些计算生成的。
transformer具体计算