Transformer 核心原理与面试问题详解
本文总结了 Transformer 架构的 20 个核心面试问题,涵盖多头注意力机制、位置编码、LayerNorm、训练策略及 BERT 关联知识点。内容涉及 Q/K 权重矩阵设计、Attention 缩放因子计算、Padding Mask 操作、残差连接意义、Encoder-Decoder 交互机制以及 WordPiece/BPE 分词技术。
1. Transformer 为何使用多头注意力机制?
使用单个注意力头的模型在处理复杂输入时可能会受到限制,因为它只能关注输入序列中的某一方面信息。而多头注意力机制(Multi-Head Attention)通过将输入特征分成多个子空间,使得每个头可以独立学习不同的特征表示。
例如,在处理句子时,一个头可能专注于语法结构,而另一个则可能关注语义关系或指代消解。这种多样性使得模型能够从多个角度理解输入,从而提升整体性能。多头注意力允许模型联合关注来自不同表示子空间的不同位置的信息。
2. Transformer 为什么 Q 和 K 使用不同的权重矩阵生成?
在 Transformer 中,Q(查询)和 K(键)使用不同的权重矩阵 $W^Q$ 和 $W^K$ 生成是为了打破对称性,使得模型能够学习到更复杂的关系。具体来说,Q 和 K 的点积计算相似度时,使用不同的权重矩阵可以使得模型在计算注意力时考虑到不同的上下文信息。
例如,在句子'我爱自然语言处理'中,'爱'对'自然'的关注程度可能与'自然'对'爱'的关注程度不同。通过使用不同的权重矩阵,模型能够捕捉到这种不对称的关系,从而提高注意力机制的灵活性和表达能力。如果 Q 和 K 使用相同的权重,模型将难以区分查询意图和键值匹配的差异。
3. Transformer 计算 attention 时为何选择点乘而不是加法?
在计算注意力分数时,使用点乘而不是加法的主要原因在于点乘能够更有效地捕捉向量之间的相似性。点乘的结果与向量的方向和大小相关,能够反映出两个向量之间的相关性。而加法则无法提供这种信息。
计算复杂度对比:
- 点乘的计算复杂度为 O(d_k),其中 d_k 是向量维度。
- 加法的复杂度为 O(1)。 虽然加法在单次操作上更快,但点乘在高维空间中能更好地衡量方向一致性。在 Transformer 中,点乘配合缩放因子(Scaled Dot-Product Attention)被证明效果更佳,尤其是在处理大规模数据时,点乘结合 Softmax 能产生更清晰的注意力分布。
4. 为什么在进行 softmax 之前需要对 attention 进行 scaled?
在计算注意力分数时,使用点积后除以 $\sqrt{d_k}$(其中 $d_k$ 是键的维度)是为了防止点积结果过大,导致 softmax 函数的梯度消失问题。
随着维度的增加,点积的方差会增大。假设向量元素均值为 0,方差为 1,那么点积结果的方差约为 $d_k$。当 $d_k$ 很大时,点积结果会非常大,导致 Softmax 函数进入饱和区,梯度变得极小,阻碍模型训练。通过除以 $\sqrt{d_k}$,可以将方差重新标准化为 1,保持梯度的有效性。
公式推导简述: $$ \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V $$
5. 在计算 attention score 的时候如何对 padding 做 mask 操作?
在处理变长序列时,通常需要对填充部分进行 mask 操作,以确保模型只关注有效的输入数据。在计算注意力分数时,使用 mask 将填充位置的注意力分数设置为一个极大的负数(如 -1e9),这样在经过 softmax 后,这些位置的权重将接近于零。
例如,假设输入序列为'我 爱 自然 语言 处理',对应的 mask 为 [0, 0, 0, 0, 0, 1, 1](1 表示 padding)。在计算注意力分数时,将填充部分的分数替换为 -1e9,确保模型在计算时忽略这些填充位置。这通常通过 torch.where 或类似的掩码逻辑实现。
6. 为什么在进行多头注意力的时候需要对每个 head 进行降维?
在多头注意力机制中,对每个头进行降维的主要原因是为了降低计算复杂度,同时保持模型的表达能力。假设总维度为 $d_{model}$,如果有 $h$ 个头,每个头的维度通常为 $d_k = d_{model} / h$。
通过将输入特征分成多个低维子空间,模型能够在每个子空间中独立学习特征,从而提高学习效率。如果不对每个头降维,直接堆叠多个高维头会导致参数量爆炸且计算成本过高。降维后的多头注意力等效于在一个高维空间中进行多次线性变换并拼接,既保留了并行性又控制了资源消耗。


