Skip to content

本资料参照李宏毅老师所讲解的Transformer整理而来。

0. Transformer 架构

transformer.png

Transformer 模型的结构和原理
  • 基本概念
    • Transformer 是当前大型语言模型的基础架构之一,由谷歌团队在2017年提出 。
    • Transformer 的核心思想是基于自注意力机制(Self-Attention)来建模序列,而不采用RNN的递归结构。
    • 其衍生出两种架构,BERT 和 GPT,ChatGpt 等大模型就是基于 GPT的。
    • 其基本结构可以分为编码器(Encoder)解码器(Decoder)两个堆叠模块,不过很多语言模型(GPT系列)只用解码器部分。
  • 结构和原理介绍
    • 输入嵌入和位置编码
      • 首先,输入的序列(如一句话)经过嵌入层得到词向量表示。
      • 由于Transformer没有像RNN那样的顺序处理,自身不感知序列顺序信息,因此加入位置编码(正余弦位置编码):即生成一个和嵌入维度相同的向量,其各维按词位置n以不同频率的sin/cos函数赋值。
      • 这些位置向量加到词嵌入上,使得模型能区分第1个词还是第10个词 。
    • 多头自注意力层(Multi-Head Self-Attention)
      • 这是Transformer的核心组件。对于输入序列的一组表示,它通过“注意力”机制让每个位置的表示去参考序列中其他位置的信息
      • 具体来说,自注意力将输入X通过线性变换得到查询向量Q、键向量K、值向量V,然后计算注意力权重 Attention(Q,K,V)=softmax(QKTdk)V
      • Transformer的创新在于多头(Multi-Head):它并行执行多组独立的注意力计算(通常8或16头),每组有自己的投影矩阵Q,K,V,捕获不同子空间的相关性,然后将各头结果拼接后再线性变换。这让模型能关注不同关系特征,比如某一头专注于句法依存,另一头关注语义关联等。
    • 前馈网络(Feed-Forward Network, FFN)
      • 紧随注意力层之后,每个Transformer子层还有一个全连接前馈网络,通常包含通常包含两个线性变换层和一个在中间的非线性激活层(如ReLU) 。
      • 在自注意力捕获到全局信息之后,进行局部维度上的非线性加工与变换,帮助模型提炼更复杂的语义表示。
      • Transformer交替叠堆多头注意力和前馈网络。
    • 残差连接和层归一化
      • 每个子层(注意力或FFN)都有残差连接(input直接加到output)和层归一化操作。
      • 这保证深层网络的梯度传递稳定,并加速收敛 。
  • 整体来看,一个典型Transformer block = Multi-head Attention + Residual + Norm + FFN + Residual + Norm。Encoder由N个block叠加;Decoder类似但在注意力部分多一个跨注意力。
  • Transformer相较传统RNN的优势
  • 并行计算
    • RNN循环依赖上一步输出,无法并行处理序列。
    • 而Transformer的自注意力机制对序列中每个位置同时计算与其他位置的相关性,没有时序依赖,可以用矩阵运算并行处理整句话 。
    • 这使得训练时GPU利用率高,能够在海量数据上训练非常深的模型。
  • 长程依赖捕获
    • 注意力机制可以让每个词直接“看”其他所有词,不管距离多远都在一次注意力计算中体现。
    • 而RNN要经过许多步状态传递才能把远处信息带过来,中间可能梯度消失或信息淡化。
  • 更好的表示能力
    • 多头注意力提供了对不同关系特征的建模能力,且注意力是输入内容自适应的,加上FFN的非线性变换,整个模型具有极强表达力。
    • RNN虽然也可以堆叠层和门控,但Transformer因为摆脱了序列顺序计算限制,可以更自由地增加层数和宽度(维度),加上FeedForward层提供丰富特征组合,因而更易扩展出超高参数模型。
  • 训练稳定性
    • Transformer用了注意力+残差+正则化,使其训练较稳定。
    • 某些RNN需要小心初始化和梯度剪裁,以避免梯度消失和爆炸问题。
      • 梯度爆炸(gradient explosion):训练刚开始,Loss 一下子飙升为无穷大;
      • 梯度消失(gradient vanishing):Loss 长期不下降,模型几乎不学习。

1. 什么是Transformer?

Seq2seq model with "Self-attention"

Transformer 是一个将 Seq2seq 思想推向极致的模型。它巧妙地利用自注意力、残差连接和层归一化等技术,解决了传统模型在处理序列数据时的核心痛点,成为了现代自然语言处理领域最重要的基石之一。

这里给大家一个网站 先直观的感受下Transformer架构

TRANSFORMER EXPLAINER

2. 为什么 Transformer 是带自注意力机制的 Seq2seq 模型?

Transformer 模型用自注意力机制 完全替代了早期 Seq2seq 模型中的循环结构(如 RNN)。

  • 它的编码器 使用了多个自注意力层,每个层都能让输入序列中的每个词同时考虑其他所有词的信息。

  • 它的解码器 也使用了自注意力层,它不仅能关注到自身已经生成的词,还能通过“交叉注意力”机制,关注到编码器处理后的输入序列信息。

因此,可以说 Transformer 是对 Seq2seq 架构的一种革命性改进,它用强大的自注意力机制解决了序列处理中的核心问题,实现了更高效、更强大的序列到序列转换。

3. Encoder 的设计哲学

Transformer 革命性地抛弃了传统的循环神经网络(RNN),完全使用 自注意力机制 来构建,从而实现了并行化计算,极大地提高了训练效率。

  • Encoder 的核心作用:输入一排向量,输出另一排等长的向量,用于捕捉输入序列的特征。

  • Encoder 的详细结构解析

    1. 位置编码 (Positional Encoding):这是 Transformer 的关键设计。由于自注意力机制是并行处理的,无法感知词语的顺序。因此,需要在输入向量中加入位置信息,告诉模型每个词在序列中的位置。

    2. 多头自注意力(Multi-Head Self-Attention):这是 Encoder 的第一个子层。它不是一个单一的自注意力,而是同时运行多个“头”,每个头都从不同角度去关注序列中词语之间的关系。这种多头的并行计算能捕捉更丰富的语义信息。

    3. 残差连接 (Residual Connection):这是深度学习中一个非常重要的设计模式。在每个子层(如自注意力层或前馈网络)之后,都会将子层的输入直接加到输出上,形成“输入 + 子层输出”的新向量。这能有效解决深层网络训练中常见的梯度消失问题,让模型可以堆叠得更深。

    4. 层归一化 (Layer Normalization):残差连接后会进行层归一化。这是一种归一化方法,与批归一化(Batch Normalization)不同。

      • Batch Normalization:针对一个批次内所有样本的同一个特征维度进行归一化。

      • Layer Normalization:针对同一个样本内的所有特征维度进行归一化。老师特别提到,在 Transformer 中,层归一化的效果通常优于批归一化。

    5. 前馈网络(Feed Forward Network):这是 Encoder 的第二个子层。它是一个简单的全连接网络,用于对自注意力的输出进行非线性转换,然后再次进行残差连接和层归一化。

    6. 重复堆叠:整个 Encoder 由多个这样复杂的 Block 重复堆叠而成。老师指出,BERT 模型就是由 Transformer 的 Encoder 部分构建的。

为何是这样的设计?

  • Layer Normalization 的位置:原始 Transformer 论文中的 Layer Normalization 是放在残差连接之后。但有研究表明,将其位置稍微调整(例如放到每个 Block 的输入端),效果可能会更好

  • 选择 Layer Norm 的原因:为什么 Transformer 选择了 Layer Norm 而不是 Batch Norm?除了效果更好外,Layer Norm 不依赖于批次大小,这使得模型训练更稳定,尤其是在使用小批次时。

4. Decoder 的内部结构(与Encoder的异同)

decoder.png Transformer 的 Decoder 负责根据 Encoder 的输出,逐步生成目标序列。

  • Decoder 的两种类型

    1. Autoregressive (AT) Decoder逐字生成。这是最常见的方式,每一步的输出都作为下一步的输入,直到生成 <EOS> 结束符。

    2. Non-Autoregressive (NAT) Decoder并行生成。它能一次性生成整个序列,速度更快,但通常性能稍逊于 AT Decoder,且需要额外的机制来决定输出长度。

  • Autoregressive (AT) Decoder 的详细结构

    • 与 Encoder 的相似之处:Decoder 的基本结构与 Encoder 类似,都包含“注意力层”和“前馈网络”,并使用残差连接层归一化

    • 关键差异:Decoder 的 Block 中间多了一个 Cross Attention 层,且最前面的 Self Attention 必须是 Masked

    1. 遮蔽自注意力 (Masked Self-Attention):这是为了模拟真实推理时的逐字生成过程。在训练时,它强制模型在预测当前词时,只能看到它前面已经生成的词,而不能“偷看”后面的词。

    2. 交叉注意力 (Cross Attention):这是连接 Encoder 和 Decoder 的桥梁。它允许 Decoder 在生成每个词时,从 Encoder 的输出中抽取相关信息。Decoder 提供 Query,Encoder 提供 KeyValue,通过计算 Query 和 Key 的注意力分数,来加权求和 Encoder 的 Value,从而得到新的上下文向量。

5. 训练与推理的实用技巧

不仅适用于 Transformer,也适用于其他 Seq2seq 模型。

  • 强制教学 (Teacher Forcing)

    • 原理:在训练时,将正确的标准答案作为 Decoder 的输入。这能加速模型学习。

    • 问题:这会导致 Exposure Bias。在测试时,Decoder 看到的是自己上一步的错误输出,这可能导致“一步错,步步错”的问题。

    • 解决方法Scheduled Sampling 技术在训练时偶尔给 Decoder 错误的输入,让它学会如何处理错误。

  • 束搜索 (Beam Search)

    • 原理:一种比贪婪解码 (Greedy Decoding) 更优的推理策略。它在每一步都会保留多个最佳候选序列,而不是只选择一个,从而尽可能地找到全局最优路径。

    • 适用性对于答案明确的、唯一的任务(如语音辨识),束搜索通常很有用;但对于需要创造力的任务(如写故事),加入随机性反而能得到更好的结果。

  • 复制机制 (Copy Mechanism)

    • 原理:让模型除了从词汇表中选词,还能直接从输入序列中复制词语到输出中。

    • 适用性:在对话摘要等任务中非常有用,可以避免模型错误地生成或遗漏专有名词。

  • 引导式注意力 (Guided Attention)

    • 原理:在一些任务(如语音合成)中,注意力权重的移动模式应该是有规律的(如由左向右)。如果模型没有学到,则会出错。

    • 作用:在训练中强制注意力遵循特定的模式,保证输出的正确性和流畅性。

  • 强化学习 (RL) 训练

    • 问题:训练时优化的损失函数(如交叉熵)与最终评估指标(如 BLEU Score)不一致。

    • 解决:将生成过程视为一个强化学习问题,直接将 BLEU Score 作为奖励 (Reward) 来进行优化。

6. Attention 和 Self-Attention的区别是什么?

Attention和Self-Attention的主要区别在于它们处理的信息来源不同:

  1. Attention:

传统的Attention机制发生在Source元素和Target的中的所有元素之间

在Encoder-Decoder框架中,输入Source和输出Target通常内容不一样, 例如在机器翻译中,Source是英文句子,Target是对应的中文句子。

Attention是通过一个查询变量Q找到V里面重要信息,K由V变换而来

  1. Self-Attention:

Self-Attention指的是Source内部元素之间或者Target内部元素之间发生的Attention机制。

相当于是Query=Key=Value,但实际上是X通过Wk、Wq、W^v线性变换得到QKV

在Transformer中,只需要在Source处进行对应的矩阵操作,用不到Target中的信息

  1. 总结区别:
  • Self-attention关键点在于规定K-Q-V三者都来源于同一个输入X,通过X找到X中的关键点
  • Self-attention比attention约束条件多了两个:
    • Q、K、V同源(都来自于同一个输入)
    • Q、K、V需要遵循attention的计算方法

7. Transformer 中的 Self-Attention 公式是什么?

Self-Attention 的核心计算公式可以用以下 LaTeX 代码表示:

Attention(Q,K,V)=softmax(QKTdk)V

其中:

  • Q (Query), K (Key), V (Value) 是通过输入序列 X 与对应的权重矩阵相乘得到的:Q=XWQ,K=XWK,V=XWV
  • dk 是 Key 向量的维度,缩放因子 dk 用于防止点积结果过大导致 softmax 梯度消失。
  • softmax 函数在 K 的序列维度上进行归一化,生成注意力权重。

8. 为什么要除以 dk

  1. 计算点积时,如果Q、K的元素值和dk 的值都很大,那么点积的结果可能会非常大,导致softmax函数的输入变得非常大。softmax函数在处理很大的输入值时,会使输出的概率分布接近0或1,这会造成梯度非常小,难以通过梯度下降有效地训练模型,即出现梯度消失问题
  2. 通过使用dk 缩放点积的结果,可以使点积的数值范围被适当控制,从而:
    • 防止softmax函数进入饱和区域
    • 保持梯度在合理范围内
    • 使训练更加稳定
  3. 这种缩放操作是基于Q和K的元素是均值为0、方差为1的随机变量的假设,此时它们点积的方差将是dk,通过除以dk 可以将方差重新归一化为1。

9. Transformer 的 Encoder 和 Decoder 结构分别包含哪些子层?

  • Encoder结构:
    • Encoder由六个相同层堆叠而成,每层包含两个子层:
      • 多头自注意力层(Multi-Head Self-Attention):允许模型关注输入序列的不同位置
      • 前馈神经网络层(Position-wise Feed-Forward Network):由两个线性变换组成,中间有ReLU激活函数,形式为:Linear + ReLU + Dropout + Linear
    • 每个子层都使用残差连接(Residual Connection)和层归一化(Layer Normalization)
  • Decoder结构:
    • Decoder也由六个相同层堆叠而成,每层包含三个子层:
      • 带掩码的多头自注意力层(Masked Multi-Head Self-Attention):确保预测位置i时只能依赖于小于i的位置的输出
      • 多头注意力层(Multi-Head Attention):对Encoder的输出进行注意力计算,也称为Encoder-Decoder Attention
      • 前馈神经网络层(Position-wise Feed-Forward Network):与Encoder中的相同同样,每个子层都使用残差连接和层归一化

10. Encoder 端和 Decoder 端是如何进行交互的?

Encoder 端和 Decoder 端通过 Cross Self-Attention(也称为 Encoder-Decoder Attention)机制进行交互。

具体过程如下:

  • Encoder 处理输入序列,生成一系列编码表示(上下文向量)
  • 在Decoder 的第二个子层(多头注意力层)中:
    • Decoder 提供 Q(查询向量):来自 Decoder 前一层的输出
    • Encoder 提供 K 和 V(键向量和值向量):来自 Encoder 最终层的输出
    • 这允许 Decoder 的每个位置都能关注到输入序列的所有位置

这种交互机制使得Decoder能够在生成输出时,根据已生成的部分和输入序列的完整信息来决定下一个输出,从而实现序列到序列的转换。

在机器翻译等任务中,这种机制使得模型能够在生成目标语言的每个词时,关注源语言中的相关部分,实现更准确的翻译。

11. Transformer的优缺点是什么?

  1. 优点:
  • 可并行计算:不像RNN需要按序列顺序处理,Transformer可以并行处理整个序列,大大提高了训练效率
  • 解决长距离依赖问题:通过自注意力机制,模型可以直接建立序列中任意两个位置之间的联系,有效捕获长距离依赖关系
  • 独立于卷积和循环:完全依赖于attention处理全局依赖,架构更简洁
  • 性能强大:在多种NLP任务上取得了突破性的性能提升
  • 可解释性:注意力权重可以提供模型决策过程的一定解释性
  1. 缺点:
  • 输入长度固定:标准Transformer模型有固定的最大序列长度限制
  • 计算复杂度高:自注意力机制的计算复杂度是O(n²),其中n是序列长度,对于长序列计算成本高
  • 局部信息的获取不如RNN和CNN强:Transformer关注的是全局关系,而RNN在计算过程中更关注局部,对距离更加敏感
  • 位置信息需要额外编码:不像RNN天然包含序列顺序信息,Transformer需要额外的位置编码
  • 训练数据需求大:需要大量数据才能充分发挥性能
  • 预训练计算资源需求高:大型Transformer模型的预训练需要大量计算资源

12. 为什么 Transformer 中使用多头注意力机制(Multi-Head Attention)?

Transformer 使用多头注意力机制(Multi-Head Attention)的主要原因有:

  1. 增强模型的表达能力:
  • 不同的注意力头可以关注输入序列的不同方面和特征
  • 例如,某些头可能关注语法关系,而其他头可能关注语义关系
  1. 并行学习不同的表示子空间:
  • 多头机制将查询、键和值投影到不同的子空间
  • 这允许模型同时从不同的表示空间学习信息
  1. 增加注意力的稳定性:
  • 多个头的结果被合并,减少了单一注意力机制可能带来的噪声和不稳定性
  • 类似于集成学习中的"多个弱学习器组合成强学习器"的思想
  1. 捕获更丰富的上下文关系:
  • 单一注意力机制可能只能捕获一种类型的依赖关系
  • 多头机制可以同时捕获多种类型的依赖关系,如短距离和长距离依赖
  1. 提高模型的鲁棒性:
  • 即使某些头的注意力分布不理想,其他头仍可能提供有用的信息
  • 这种冗余性提高了模型的整体鲁棒性

在实践中,多头注意力通常比单头注意力表现更好,特别是在复杂的序列转换任务中。标准Transformer使用8个头(对于encoder和decoder)。

13. 为什么 Transformer 中使用 Layer Normalization 而不是Batch Normalization?

Transformer 使用 Layer Normalization(LN) 而不是 Batch Normalization(BN) 的原因主要有:

  1. 序列长度不一致问题:
  • NLP任务中,不同样本的序列长度通常不同
  • BN需要在批次维度上计算统计量,当序列长度不一致时,这变得复杂且不稳定
  • LN对每个样本独立进行归一化,不受序列长度差异影响
  1. 批量大小限制:
  • 由于Transformer模型较大,训练时通常只能使用较小的批量大小
  • BN在小批量上的统计估计不准确,性能会下降
  • LN不依赖批量统计,对批量大小不敏感
  1. 序列特性考虑:
  • NLP中认为句子长短不一,且各batch之间的信息没有什么关系
  • LN只考虑句子内信息的归一化,更适合NLP任务特性
  1. 位置不变性:
  • LN对序列中的所有位置应用相同的归一化参数
  • 这与Transformer处理序列的方式更加一致
  1. 训练稳定性:
  • 实践表明,在Transformer架构中,LN提供了更好的训练稳定性
  • 特别是在深层网络中,LN有助于缓解梯度消失/爆炸问题

总结来说,BN和LN的主要区别在于归一化的维度不同:BN是对一批样本的同一维度特征做归一化,而LN是对单个样本的所有维度特征做归一化。在Transformer这类处理变长序列的模型中,LN更为适合。

14. Transformer中的自注意力计算复杂度是多少?有哪些方法可以降低复杂度?

标准自注意力的计算复杂度:

  • 时间复杂度:O(n²·d),其中n是序列长度,d是表示维度
  • 空间复杂度:O(n²),主要来自于注意力矩阵的存储

降低复杂度的方法:

  1. 稀疏注意力(Sparse Attention):
  • 不计算所有位置对之间的注意力,而是选择性地计算部分位置对
  • 例如,局部注意力只计算相邻位置的注意力
  • 代表工作:Sparse Transformer、Longformer
  1. 低秩近似(Low-Rank Approximation):
  • 使用低秩矩阵近似完整的注意力矩阵
  • 可以将复杂度降低到O(n·r),其中r是秩的大小
  • 代表工作:Linformer
  1. 核方法(Kernel Methods):
  • 使用核函数近似softmax操作
  • 避免显式计算完整的注意力矩阵
  • 代表工作:Performer、Linear Transformer
  1. 局部敏感哈希(Locality-Sensitive Hashing):
  • 使用哈希技术将相似的查询和键分组
  • 只在相同哈希桶内计算注意力
  • 代表工作:Reformer
  1. 滑动窗口注意力(Sliding Window Attention):
  • 每个位置只关注固定窗口内的其他位置
  • 复杂度降低到O(n·w),其中w是窗口大小
  • 代表工作:Longformer、Big Bird
  1. 分块注意力(Blocked Attention):
  • 将序列分成固定大小的块,先计算块内注意力,再计算块间注意力
  • 代表工作:Big Bird、ETC
  1. 递归方法(Recursive Methods):
  • 使用递归结构处理长序列
  • 代表工作:Transformer-XL、Compressive Transformer
  1. 线性注意力(Linear Attention):
  • 重写注意力计算公式,使复杂度变为线性
  • 代表工作:Linear Transformer、Performer

这些方法各有优缺点,选择哪种方法取决于具体应用场景、序列长度和计算资源限制。最新的研究持续探索更高效的注意力机制,以处理更长的序列。

15. 什么是Transformer中的多头注意力(Multi-Head Attention)?它是如何计算的?

Transformer 中,注意力机制(Attention)是用来衡量一个序列中不同位置之间的相关性。

多头注意力(Multi-Head Attention, MHA) 的核心思想是:
不是只用一个注意力函数,而是用 多个注意力头(Heads) 并行去计算,然后把结果拼接起来。

这样做的好处是:

  1. 每个头可以关注输入序列的不同子空间(不同特征)。

  2. 模型可以并行学习多种关系,例如:句法关系、语义关系、长距离依赖等。

假设输入是一个长度为 n,维度为 dmodel的序列矩阵:

XRn×dmodel

1. 线性映射生成 Q,K,V

通过可学习的矩阵,把输入 X 映射为 Query (Q)Key (K)Value (V)

Q=XWQ,K=XWK,V=XWV

其中:

WQ,WK,WVRdmodel×dk

2. 缩放点积注意力 (Scaled Dot-Product Attention)

单个注意力头的计算公式为:

Attention(Q,K,V)=softmax(QKdk)V

这里 dk 是缩放因子,防止点积过大导致梯度不稳定。

3. 多头并行计算

假设有 h 个头,每个头都有自己的参数矩阵 WiQ,WiK,WiV
则第 i 个头的输出为:

headi=Attention(QWiQ,KWiK,VWiV)

4. 拼接并线性变换

把所有头的输出拼接起来,再做一次线性映射:

MultiHead(Q,K,V)=Concat(head1,,headh)WO

其中:

WORhdv×dmodel

  • 多头注意力的核心公式

MultiHead(Q,K,V)=Concat(head1,,headh)WO

headi=Attention(QWiQ,KWiK,VWiV)headi=Attention(QWiQ,KWiK,VWiV)

  • 作用

    • 并行捕捉不同特征子空间的依赖关系

    • 提升模型的表达能力

    • 稳定训练

16. Transformer 的训练和推理阶段有什么区别?

Transformer在训练和推理阶段有几个关键区别:

  1. 解码过程:
  • 训练阶段:
    • 采用"教师强制(Teacher Forcing)"方式
    • Decoder一次性接收完整的目标序列作为输入
    • 所有位置的输出可以并行计算
    • 使用序列掩码(Sequence Mask)确保每个位置只能看到之前的位置
  • 推理阶段:
    • 采用自回归(Autoregressive)方式
    • Decoder每次只生成一个新token
    • 生成过程是顺序的,不能并行
    • 每生成一个新token,都会将其添加到已生成序列中,然后预测下一个token
  1. 注意力计算:
  • 训练阶段:
    • Encoder的自注意力可以完全并行计算
    • Decoder的自注意力也可以并行计算(但有序列掩码限制)
    • 计算效率高
  • 推理阶段:
    • Encoder的自注意力仍然可以并行计算
    • Decoder的自注意力需要逐步计算
    • 可以使用缓存(KV Cache)存储之前计算的键值对,避免重复计算
  1. 批处理:
  • 训练阶段:
    • 可以高效地处理大批量数据
    • 所有样本的长度通过填充统一
  • 推理阶段:
    • 通常批量大小较小,甚至为1
    • 生成长度可能不固定,取决于停止条件
  1. 计算效率:
  • 训练阶段:
    • 高度并行化,GPU利用率高
    • 固定的计算图,可以优化
  • 推理阶段:
    • 顺序生成导致GPU利用率较低
    • 动态计算图,优化空间有限
  1. 内存使用:
  • 训练阶段:
    • 需要存储完整的计算图和梯度
    • 内存需求高
  • 推理阶段:
    • 不需要存储梯度
    • 可以使用KV缓存优化
    • 内存需求相对较低
  1. 停止条件:
  • 训练阶段:
    • 处理固定长度的目标序列
    • 长度由训练数据决定
  • 推理阶段:
    • 使用特殊的结束符号(EOS)或最大长度限制
    • 生成过程动态决定何时停止

这些区别导致Transformer在训练时可以高效并行,而在推理时则面临效率挑战,这也是为什么许多研究致力于提高Transformer推理效率的原因。

17. Transformer 中的残差连接 (Residual Connection) 和层归一化 (Layer Normalization) 的作用是什么?

1. 残差连接 (Residual Connection)

在 Transformer 中,每个子层(比如 多头注意力前馈网络 FFN)的输入 x 和输出 Sublayer(x) 会进行残差连接:

y=x+Sublayer(x)

作用:
  1. 缓解梯度消失/梯度爆炸

    • 残差让梯度可以绕过非线性层,直接传递到前面层,使得深层网络也能训练。
  2. 信息保留

    • 输入信息不会在经过子层时完全丢失,而是保留到下一层,保证模型在学习新特征的同时保留原始特征。
  3. 加速收敛

    • 避免“退化问题”(网络层数增加反而性能下降),提升优化效率。

2. 层归一化 (Layer Normalization, LN)

LayerNorm 是在 每个样本的特征维度上做归一化。
假设某一层输入向量为x=(x1,x2,,xd),则 LayerNorm 的计算为:

μ=1di=1dxi,σ2=1di=1d(xiμ)2

LayerNorm(x)=γxμσ2+ϵ+β

其中 γ,β 是可学习参数,用来恢复缩放和平移。

作用:
  1. 稳定训练过程

    • 保证不同层输入分布比较稳定,避免梯度不稳定。
  2. 加快收敛

    • 减少了对学习率的敏感性。
  3. 提升泛化能力

    • 归一化让模型对输入分布的变化更鲁棒。

3. 残差 + 层归一化在 Transformer 中的结合

在 Transformer 的标准实现(Vaswani 等人的原始论文)中,每个子层结构为:

Output=LayerNorm(x+Sublayer(x))

这就是所谓的 “Add & Norm”

作用:
  • 残差保证了信息传递和梯度流动

  • LayerNorm 保证了数值稳定和训练收敛

  • 两者结合让模型既能学到复杂特征,又能避免训练不稳定

总结

  • 残差连接:让输入信息和梯度直接传递,缓解深层网络训练困难。

  • 层归一化:保持数值稳定,提升收敛速度和泛化能力。

  • Add & Norm 是 Transformer 稳定高效训练的关键设计。

18. Transformer中为什么使用Q、K、V三个矩阵,而不是直接使用自身进行注意力计算?

1. 直接使用输入做注意力会有局限性

假设输入是矩阵

XRn×dmodel

如果直接用 X 来计算注意力:

Attention(X,X,X)=softmax(XXd)X

这样每个 token 之间的相关性只来自 原始 embedding 空间,模型无法根据任务灵活地选择不同的“视角”去建模。

2. Q、K、V 提供了不同的角色

通过可学习的投影矩阵 WQ,WK,WV,输入 X 被映射成三个不同的表示:

Q=XWQ,K=XWK,V=XWV

各自的作用:
  • Query (Q):表示“我要找什么信息”

  • Key (K):表示“我能提供什么信息”

  • Value (V):表示“实际要传递的信息内容”

注意力分数的计算:

Score(Q,K)=QKdk

然后用这个分数加权 Value:

Attention(Q,K,V)=softmax(Score(Q,K))V

这样,模型可以灵活地“问—答—取值”:

  • Q 提问

  • K 回答是否相关

  • V 提供真正的信息

3. 可学习的子空间投影

  • WQ,WK,WV 都是 可学习参数

  • 它们把输入映射到不同的 子空间,让不同的注意力头能学习到不同的特征关系。

如果没有 Q、K、V 的投影,所有注意力只能在原始 embedding 空间中学习,表达能力会大打折扣。

4. 多头注意力的基础

在 Multi-Head Attention 中,每个头都有不同的 WQ,WK,WV
这样:

  • Head1 可能专注于 语法关系(如主谓一致)

  • Head2 可能专注于 语义关系(如同义替换)

  • Head3 可能专注于 长距离依赖

这种灵活性就是由 Q、K、V 提供的。

总结

Transformer 使用 Q、K、V 的原因是:

  1. 解耦角色:Query 表示“查找需求”,Key 表示“可匹配特征”,Value 表示“携带信息”。

  2. 增强表达能力:通过投影到不同子空间,让模型能灵活捕捉不同的关系。

  3. 支持多头机制:不同头通过不同的 Q、K、V 投影来关注不同的特征。

  4. 避免局限性:直接用输入X计算会限制模型只能在原始 embedding 空间建模,缺乏灵活性。

19. Transformer 中的位置编码 (Positional Encoding) 有什么作用?如何实现的?

1. 位置编码的作用

在 Transformer 中,输入序列被表示为一组向量

X=[x1,x2,,xn],xiRdmodel

注意力机制本身是 对输入顺序无感的,因为计算

Attention(Q,K,V)=softmax(QKdk)V

只依赖向量之间的相似度,而不包含位置信息。

如果没有位置编码,Transformer 就无法区分

  • “I love you” 和 “You love I”
    因为它们的词向量集合是一样的。

所以 位置编码的作用就是显式注入序列顺序的信息

2. 位置编码的实现方式

(1)固定位置编码(Sinusoidal Positional Encoding)

Vaswani 等人在《Attention is All You Need》中提出了 正弦余弦函数编码

PE(pos,2i)=sin(pos100002i/dmodel)

PE(pos,2i+1)=cos(pos100002i/dmodel)

其中:

  • pos 表示位置(0,1,2,...,n)

  • i 表示维度索引

  • model 是模型的维度

特点:
  1. 不需要学习参数

  2. 任意长度的序列都能编码(具有外推性)

  3. 不同位置的编码有规律性,便于模型学习相对位置信息

(2)可学习的位置编码(Learnable Positional Embedding)

另一种方法是把位置当成一个“单词”,给每个位置学习一个可训练向量:

PE=Embedding(pos)

这样位置编码和词向量一样,作为参数参与训练。

特点:
  1. 灵活,能更好适配具体任务

  2. 但外推性差(超过训练长度的序列可能无法泛化)

3. 使用方式

最终输入 Transformer 的向量是:

zi=xi+PEpos

也就是 词向量 + 位置编码 相加,得到既包含语义信息,又包含位置信息的表示。

4. 总结一下

  • 作用:在无顺序感的注意力机制中引入位置信息

  • 实现

    1. 正弦余弦位置编码(固定,不需训练,能泛化到长序列)

    2. 可学习的位置编码(参数化,更灵活,但泛化性差)

  • 结合方式:将位置编码与词向量逐元素相加

20. Transformer中的前馈神经网络(Feed-Forward Network)有什么作用?

1. FFN 的定义

在 Transformer 中,每个位置(token)经过多头注意力后,会再通过一个 位置前馈神经网络 (Position-wise Feed-Forward Network, FFN)

FFN(x)=max(0,xW1+b1)W2+b2

其中:

  • xRdmodel:单个位置的向量表示

  • W1Rdmodel×dff,通常 dffdmodel(比如 512 → 2048 → 512)

  • 激活函数通常是 ReLUGELU

注意:这个 FFN 是 逐位置 (position-wise) 独立计算 的,也就是说,不同 token 各自通过同一个 FFN 变换,不会互相影响。

2. FFN 的作用

  1. 提升特征表达能力

    • 多头注意力负责建模 不同 token 之间的依赖关系,但每个 token 自身的特征变换能力有限。

    • FFN 通过非线性变换,增强了每个 token 的表示能力,使模型能学习更复杂的模式。

  2. 增加模型的深度和非线性

    • 单纯的注意力是线性加权求和,不够强大。

    • 加上 FFN(带激活函数)后,模型才具备深层非线性网络的表达力。

  3. 扩展维度 (Projection & Bottleneck)

    • FFN 通常会先把维度扩展到更高的 dff,再压缩回来。

    • 这样可以提供更大的“计算空间”,类似 CNN 中的 1x1 卷积瓶颈结构。

  4. 位置独立的特征变换

    • 注意力机制处理的是“跨位置的交互”,FFN 处理的是“单位置的特征映射”。

    • 两者结合,就能同时学习 全局依赖局部特征变换

3. 在 Transformer 中的位置

每个 Encoder / Decoder Layer 里,结构是:

Output=LayerNorm(x+FFN(x))

也就是在 多头注意力之后,再接一个 FFN,形成 Attention + FFN 的模块,层层堆叠。

4. 总结

  • FFN 公式

    FFN(x)=max(0,xW1+b1)W2+b2

  • 作用

    1. 增强 token 表示的非线性和表达力

    2. 提供更大维度的计算空间(Projection + Bottleneck)

    3. 补充注意力机制的不足(注意力关注“跨 token”,FFN 关注“单 token”)

  • 设计理念:和多头注意力互补,使模型既能学习全局关系,也能学习局部特征

21. Transformer的解码搜索策略是什么?为什么需要它?

Transformer 是自回归生成模型,即:一步步生成下一个 token,每一步都依赖前面的上下文输出。每一步生成时,会有很多个候选词,解码策略决定了选择哪一个token 最好

解码策略对比

  • Greedy Search 贪婪搜索
    • 每一步只选取概率最高的词
    • 快速,简单
    • 容易局部最优而不是全局最优,容易输出模版化内容
  • Beam Search 集束搜索
    • 定义
      • 是一种启发式宽度优先搜索策略,目的是在保证计算效率的前提下,找到可能性最高的输出序列,精度和效率介于贪婪和穷举之间
    • 原理
      • 设置Beam Width(束宽度)= k:每一步保留 k 个累计概率最优的候选序列作为路径,其余全部剪枝
      • 下一步对现有的k个路径扩展新的token,此时有k x V个候选,再从中选新的 top-k,做为新的k个路径,然后再次扩展。
      • 时间复杂度O(k V L) 空间复杂度O(k L)
        • k:束宽度 V:候选token L:最大路径长度
    • 可以探索更多组合,质量通常优于greedy
    • 计算开销大,多样性低
  • Top-k Sampling(限制采样)
    • 每步随机从 top-k 个高概率词中采样
    • 使生成回答具有一定的创意,并且可以降低幻觉
  • Top-p Sampling
    • 不固定个数,而是只采样概率达到 p(如0.9)的词
    • 更加动态和灵活

解码策略种类

  • 确定性解码
    • Greedy、Beam Search
    • 可复现
    • 适合翻译、摘要
    • 优点是稳定、高质量
    • 缺点是乏味、模板化
  • 随机性解码
    • Top-k Sampling、Top-p Sampling
    • 不可复现
    • 适合写作、对话
    • 优点是多样、有创意
    • 缺点是有幻觉、会偏离主题