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$。
通过将输入特征分成多个低维子空间,模型能够在每个子空间中独立学习特征,从而提高学习效率。如果不对每个头降维,直接堆叠多个高维头会导致参数量爆炸且计算成本过高。降维后的多头注意力等效于在一个高维空间中进行多次线性变换并拼接,既保留了并行性又控制了资源消耗。
7. 大概讲一下 Transformer 的 Encoder 模块?
Transformer 的 Encoder 模块由 N 个相同的层组成(通常 N=6),每层包含两个主要子层:
- 多头自注意力机制(Multi-Head Self-Attention):用于捕捉序列内部的全局依赖关系。
- 前馈神经网络(Feed-Forward Network):对每个位置的表示进行非线性变换。
每个子层周围都有残差连接(Residual Connection)和 Layer Normalization。Encoder 的主要任务是将输入序列转换为上下文表示,供 Decoder 使用。每个 Encoder 层的输入是前一层的输出,经过多头注意力和前馈网络的处理后,输出的上下文表示能够捕捉到输入序列的全局信息和局部特征。
8. 为何在获取输入词向量之后需要对矩阵乘以 embedding size 的开方?
在获取输入词向量后乘以 $\sqrt{d_{model}}$,主要是为了确保词向量的方差适中,从而提高模型的训练稳定性。这是 Transformer 初始化策略的一部分。
通过这种方式,可以避免在训练过程中出现梯度消失或爆炸的问题。初始化的目的是让激活值的分布保持在合理的范围内,防止深层网络中的信号在传播过程中发生畸变。这一操作通常与位置编码相加前的预处理步骤相关联。
9. 简单介绍一下 Transformer 的位置编码?有什么意义和优缺点?
位置编码是 Transformer 中用于引入序列位置信息的技术。由于 Transformer 模型并不具备处理序列顺序的能力(即排列不变性),因此需要通过位置编码将位置信息嵌入到输入的词向量中。
位置编码通常使用正弦和余弦函数生成,公式为:
$$ PE_{(pos, 2i)} = \sin(pos / 10000^{2i/d_{model}}) $$
$$ PE_{(pos, 2i+1)} = \cos(pos / 10000^{2i/d_{model}}) $$
其优点在于可以处理任意长度的序列,同时保持相对位置关系。缺点是对于超出训练长度的序列,泛化能力可能受限。
10. 你还了解哪些关于位置编码的技术,各自的优缺点是什么?
除了传统的正弦余弦位置编码,还有其他几种位置编码技术:
- 学习型位置编码(Learned Positional Embedding):通过训练学习每个位置的编码。优点是灵活性高,可以直接优化;缺点是需要额外的参数,且无法外推到训练长度之外。
- 相对位置编码(Relative Positional Encoding):通过相对位置关系来编码,能够更好地捕捉上下文信息,不依赖于绝对位置。缺点是实现复杂度较高,需要修改注意力计算逻辑。
- 旋转位置编码(RoPE):通过旋转变换来表示位置,能够更好地捕捉长距离依赖关系,且在推理时具有较好的外推性。但实现较为复杂,需要特定的矩阵运算支持。
11. 简单讲一下 Transformer 中的残差结构以及意义。
Transformer 中的残差结构是将输入直接添加到输出中($x + F(x)$),以便在深层网络中传递信息。通过这种方式,模型能够更容易地学习到增量变换,减轻了梯度消失的问题。
残差连接的引入使得模型能够更深,提升了模型的性能和稳定性。它保证了即使深层网络的某些层退化,信息依然可以通过捷径流向下一层,这对于训练深度 Transformer 模型至关重要。
12. 为什么 transformer 块使用 LayerNorm 而不是 BatchNorm?LayerNorm 在 Transformer 的位置是哪里?
Transformer 中使用 LayerNorm 而不是 BatchNorm 的主要原因在于 LayerNorm 能够处理变长序列,而 BatchNorm 需要固定的 batch 大小来计算均值和方差。BatchNorm 在序列长度变化时统计量不稳定,且对 RNN 等序列模型应用困难。
LayerNorm 在每个样本内进行归一化,适合处理序列数据。在 Transformer 中,LayerNorm 通常应用在每个子层(Attention 和 FFN)的输出之后,但在残差连接之前(Pre-Norm)或之后(Post-Norm)。现代实现多采用 Pre-Norm 结构以提升训练稳定性。
13. 简答讲一下 BatchNorm 技术,以及它的优缺点。
BatchNorm 是一种用于加速神经网络训练的技术,通过对每个 batch 的输入进行归一化,减轻了内部协变量偏移的问题。优点在于加速收敛,提高模型性能,减少超参数敏感性。
缺点是对小 batch 不太有效(统计量估计不准),且在 RNN 等序列模型中难以应用(时间步之间依赖性强)。此外,BatchNorm 在推理阶段需要使用移动平均统计量,增加了部署复杂性。
14. 简单描述一下 Transformer 中的前馈神经网络?使用了什么激活函数?相关优缺点?
Transformer 中的前馈神经网络(FFN)由两个线性层组成,中间夹着一个激活函数。第一层将维度从 $d_{model}$ 扩展到 $4 \times d_{model}$,使用 ReLU 或 GELU 激活函数,第二层将维度映射回 $d_{model}$。
前馈网络的作用是对每个位置的表示进行非线性变换,增强模型的表达能力。GELU 相比 ReLU 在 Transformer 中表现更好,因为它提供了平滑的导数,有助于优化。FFN 结构简单,但在每个 Encoder 和 Decoder 层中都起到了关键的特征提取作用。
15. Encoder 端和 Decoder 端是如何进行交互的?
在 Transformer 中,Encoder 端和 Decoder 端通过交叉注意力机制(Cross-Attention)进行交互。Decoder 的每个位置的查询向量会与 Encoder 的输出(Key 和 Value)进行计算,以获取上下文信息,从而生成下一个输出。
这种交互机制使得 Decoder 能够充分利用 Encoder 的输出,提高了翻译等任务的效果。Decoder 的自注意力层负责捕捉目标序列内部的依赖,而交叉注意力层负责对齐源序列和目标序列。
16. Decoder 阶段的多头自注意力和 encoder 的多头自注意力有什么区别?
Decoder 阶段的多头自注意力与 Encoder 的多头自注意力的主要区别在于 Decoder 需要进行序列 mask 操作(Causal Mask)。这是因为在解码时,模型只能看到之前的位置,而不能访问未来的信息。
序列 mask 确保了 Decoder 在计算自注意力时不会考虑未来的信息,从而避免了信息泄露。Encoder 没有此限制,因为它是全序列输入的。此外,Decoder 还包含一层额外的 Cross-Attention 层用于与 Encoder 交互。
17. Transformer 的并行化体现在哪个地方?Decoder 端可以做并行化吗?
Transformer 的并行化主要体现在 Encoder 端和 Decoder 端的自注意力计算中。由于每个位置的计算是独立的(在 Encoder 中),因此可以并行处理,这与 RNN 的串行处理形成鲜明对比。
Decoder 端也可以进行并行化,但由于需要考虑序列 mask,因此在训练时可以并行计算所有位置,但在推理时通常是自回归的(逐个生成)。不过,在训练阶段,Decoder 的所有位置可以同时计算,只要满足因果掩码约束。
18. 简单描述一下 wordpiece model 和 byte pair encoding,有实际应用过吗?
WordPiece 模型和 Byte Pair Encoding(BPE)是两种常见的子词分割技术,用于处理词汇外的单词和减少词汇表的大小。
- WordPiece:通过贪婪地选择最佳分割点来分割单词,基于概率最大化原则。BERT 采用了此方法。
- BPE:通过合并最常见的字节对来构建词汇表,迭代次数决定了词汇表大小。GPT 系列采用了改进版 BPE。
这两种技术在实际应用中非常广泛,它们平衡了词汇表大小和覆盖度,有效解决了 OOV(Out-of-Vocabulary)问题。
19. Transformer 训练的时候学习率是如何设定的?Dropout 是如何设定的,位置在哪里?
在训练 Transformer 模型时,学习率的设定通常采用预热和衰减策略(Warmup and Decay)。在训练初期,学习率从较低的值逐渐增加到预设的目标值(Warmup),以加速模型的收敛。随着训练的进行,学习率按照 $t^{-0.5}$ 或余弦曲线衰减,以保证模型的稳定性。
Dropout 是一种正则化技术,用于防止模型过拟合。在 Transformer 中,Dropout 通常应用于多头注意力的输出和前馈网络的输出。Dropout 的设置需要根据具体任务和数据集进行调整,常见的值有 0.1 到 0.3。
在测试时,需要将 Dropout 关闭,以确保模型能够充分利用所有参数进行预测。这是因为 Dropout 在训练时会随机丢弃部分神经元,而在测试时需要模型的完整能力。
20. 引申一个关于 bert 问题,bert 的 mask 为何不学习 transformer 在 attention 处进行屏蔽 score 的技巧?
BERT 模型中的 Masked Language Model(MLM)任务中,mask 的位置是随机选择的,而不是通过学习得到的。这是因为 BERT 的目标是学习到语言的通用表示,而不是特定于某个任务的表示。通过随机 mask,BERT 能够学习到更广泛的语言模式,从而提高模型的泛化能力。
与 Transformer 中的注意力屏蔽不同,BERT 的 mask 是固定的,不参与模型的训练过程。这种设计使得 BERT 能够更好地捕捉语言的内在结构,而不是依赖于特定的任务。注意力屏蔽主要用于 Decoder 防止未来信息泄露,而 MLM 的 mask 是为了模拟预测任务。
总结
Transformer 架构通过多头注意力、位置编码和残差连接等创新设计,实现了高效的并行计算和强大的序列建模能力。理解上述 20 个问题及其背后的原理,对于掌握大模型技术栈至关重要。在实际工程中,还需结合具体的硬件环境和业务需求进行调优。