如今,深度学习已经成为一个像编程语言一样基础且重要的工具,是每一个研发工作者绕不过的必备技能,对于科研来说仅仅了解和会使用似乎变得远远不够。不管是处于想把深度学习学好以给自己的论文赋能亦或是学一个找工作的傍身技能的想法,我也决定将这个技能树点起来。学习一项技能最好的时机是入学前,其次就是现在,抓紧时间补补基础吧。

        为什么选择Transformer是因为这是我认知范围内用的最多最好的模型了,是最可能为现在的项目/论文/工作赋能的技术,记录下学习过程。

        关于Transformer我想了解以下几件事:

  • 什么是Transformer?
  • Transformer比起经典CNN网络有何特性和特殊之处?
  • Transformer源码是如何实现的?
  • 什么是VIT?有没有面向点云的Transformer?
  • Transformer目前使用在SLAM和3DGS领域有何开源方案?目前它们有什么缺陷以及如何改进?

一、Transformer基础

        Transformer 是一种基于自注意力机制(Self-Attention)的深度学习模型架构,由 Vaswani 等人在 2017 年的论文《Attention Is All You Need》中首次提出。它彻底改变了自然语言处理(NLP)领域,取代了传统的循环神经网络(RNN)和卷积神经网络(CNN),成为机器翻译、文本生成、文本理解等任务的核心架构。其核心优势在于:

  1. 并行计算:无需按序列顺序处理数据,大幅提升训练速度。
  2. 长距离依赖建模:通过自注意力机制直接捕捉任意距离的上下文关系。
  3. 灵活扩展性:支持堆叠多层结构(如 BERT、GPT 等变体),适应不同任务需求。

二、Encoder

        Transformer 由 编码器(Encoder) 和 解码器(Decoder) 组成,二者均通过堆叠多层结构实现。

2.1 Encoder整体结构

        一个标准的 Transformer 编码器层包含两个核心子层:

  1. 多头自注意力机制(Multi-Head Self-Attention)
  2. 前馈神经网络(Feed-Forward Network, FFN)

        每个子层均通过 残差连接(Residual Connection) 和 层归一化(Layer Normalization) 进行优化。编码器的整体流程如下:

# 伪代码示例:单个编码器层的处理步骤
def encoder_layer(x):
    # 子层1:多头自注意力 + 残差 & 层归一化
    attn_output = multi_head_attention(x, x, x)  # Q=K=V=x(自注意力)
    x = layer_norm(x + attn_output)              # 残差连接 + 归一化
    
    # 子层2:前馈网络 + 残差 & 层归一化
    ffn_output = feed_forward_network(x)
    x = layer_norm(x + ffn_output)               # 残差连接 + 归一化
    return x

 2.2 Input Embedding

        论文中 N=6 ,可见仅在第一个Encoder包含了Input Embedding模块。由于计算机无法直接识别文字信息,所以一般通过查表的形式将输入的文本或符号拆成Token,并转换成固定维度的向量表示。当然除了词嵌入(Word Embedding)方法有很多种,此处仅介绍Transformer中使用的方法。

例如,将输入的每个词(或子词)转换为一个高维向量(如 512 维):

  • 词 "apple" → 向量 [0.2, -0.5, 1.3, ..., 0.7]。

2.3 Positional Encoding

        由于Transformer不包含recurrence和convolution(自注意力机制本身无法感知词序),因此为了让模型利用输入序列的顺序信息,必须注入有关序列中标记有相对或绝对位置的信息。Positional encodings和 input embedding 拥有相同的维度,通过二者相加,让模型有能力感知到每一个Token的位置。Transformer中采用正弦和余弦函数来作为Positional Encoding的方式,为每个Token的位置生成唯一编码:

        其中,pos表示Token的位置,d_model表示嵌入维度(512维),i为维度索引。

例如,输入序列 ["I", "love", "transformers"] 的嵌入向量将叠加位置编码,得到:

  • "I" → 嵌入向量 + 位置1的编码
  • "love" → 嵌入向量 + 位置2的编码
  • "transformers" → 嵌入向量 + 位置3的编码

 2.4 Multi-Head Self-Attention

2.4.1 Self-Attention

        自注意力可以描述为根据Q(query)和一组K-V(key-value)到output的一组映射,其中Q、K、V和output都是向量,其目的是希望通过计算输入序列中每个位置与其他位置的关联权重,动态聚合全局上下文信息。

        首先,先得到每一个Token对应的QKV:

        其中,X为上文计算的Token的嵌入矩阵,也就是Input Embedding + positional Encoding 的结果。W^Q,W^K,W^V为待学习的权重矩阵。此Token与其他位置Token的关联程度由注意力分数(Attention Score)衡量:

        其中,d_k为 Key 的维度,用于缩放以防止梯度爆炸,对应了论文中的scaled Dot-Product(Q*K)。再对注意力分数按行(每个 Query)进行 Softmax(或者其他归一化操作,例如ReLU),得到注意力权重(概率分布)softmax(Attention Scores)。

     在解码器(如机器翻译、文本生成)中,模型需要以 自回归 方式生成序列,即生成第 t 个词时,只能依赖已生成的 1~(t-1) 位置的词,不能看到未来的词(t+1 及之后的位置)。若不加 Mask,模型在训练时会“作弊”(提前看到未来信息),导致推理时性能下降。使得a1只能看到a1,a2只能看到a1和a2,a3只能看到a1、a2、a3.

        在计算 QK^T 的注意力分数后,将未来位置的分数覆盖为一个极小的值(如 -1e9),使得经过 Softmax 后,未来位置的权重趋近于零。

        最后用注意力权重softmax(Attention Scores)对 Value 加权求和,得到每个位置的最终表示。也就是哪个Attention结果比较大,谁就更接近哪个的V输出,QK也只是为了算一个权重。

示例:Self-Attention 的直观理解

假设输入句子为 “猫 追逐 老鼠”,三个词对应的嵌入向量为 x1​,x2​,x3​。

  1. 生成 Q/K/V

    Q1​(“猫”的 Query)会与 K1,K2,K3(所有 Key)计算相似度。
  2. 注意力权重

    “猫”(x1​)可能与“追逐”(x2​)和“老鼠”(x3​)有较高权重。
  3. 输出表示

    “猫”的新表示 = 0.6·V2​(“追逐”) + 0.3·V3​(“老鼠”) + 0.1·V1​(自身)。 

        那么,将上述过程通过矩阵乘法整合起来,可以得到以下形式: 

2.4.2 Multi-Head Attention 

         Transformer的研究人员发现,将单个注意力机制中的结果,将Q、K和V使用不同的学习线性投影到不同的 dq、dk 和 dv 维度,会得到更好的效果。Transformer将 Self-Attention 拆分为多个独立的“头”,每个头在不同的子空间中学习不同的注意力模式,最后合并结果以增强表达能力。也就是每一个Token将不止有一套QKV(dk = dv = dmodel/h = 64,h=8),然后,对每一个QKV并行执行 attention 函数,产生 dv 维度的output。这些值被连接起来并再次投影,从而得到最终值,如下图所示。

        实现步骤

  1. 拆分 Q/K/V
    将 Q、K、V 按头的数量拆分为多组子向量:

    head_i=Attention(Q \cdot W_i^Q, K \cdot W_i^K,V \cdot W_i^V).每个头有自己的权重矩阵 W_i^Q, W_i^K, W_i^V​。
  2. 独立计算每个头的注意力
    每个头独立计算 Self-Attention,生成不同的注意力输出。

  3. 拼接与线性变换
    将所有头的输出拼接后,通过线性层 WO融合:

    MultiHead(Q,K,V)=Concat(head_1,head_2,...,head_h) \cdot W^O

示例:Multi-Head 的直观理解

继续以句子 “猫 追逐 老鼠” 为例,假设使用 2 个头

  • 头1:关注 动作关系

    • “追逐”的 Query 可能更关注“猫”和“老鼠”的 Key。

    • 输出:捕捉“谁在追逐”和“追逐谁”的信息。

  • 头2:关注 指代关系

    • “它”的 Query(假设句子中有代词)可能关联“猫”或“老鼠”。

    • 输出:明确代词的指代对象。

最终,两个头的输出拼接后,模型能同时捕捉语法和语义信息。

            为什么需要 Multi-Head?

    1. 多样化特征学习
      不同头可以关注不同模式(如语法结构、语义关联、长距离依赖)。

    2. 模型容量提升
      多头相当于多个独立的特征提取器,增强表达能力。

    3. 鲁棒性
      即使某些头的注意力失败,其他头仍可提供有效信息。

    2.5 Add & Norm

            在 Transformer 模型中,Add & Norm 层( Residual Connection 与 Layer Normalization )是每个子层(如self-attention、feed forawrd)后的核心组件,其作用是 增强模型训练的稳定性并加速收敛。以下从组成、原理到具体示例逐步解析其工作机制。

    2.5.1 Residual Connection

            将子层(如自注意力或前馈网络)的输入与其输出直接相加,公式如下:

    Output_{Add} = x+Sublayer(x)

            其中,x代表子层的输入,Sublayer(x)代表子层的输出(如self-attention、feed forawrd的输出结果)。Residual Connection具有两个作用,一是缓解梯度消失:深层网络中,梯度通过加法操作直接传递,避免因链式求导导致的梯度衰减。二是保留原始信息:即使子层学习到微小的调整(如 Sublayer(x)≈0),输入 x 的信息仍能有效保留。

    残差连接在 Transformer 与残差神经网络(ResNet)中的对比

            残差连接(Residual Connection)是一种通用的深度学习技术,其核心思想是通过 跳跃连接(Skip Connection) 将输入直接传递到深层网络的输出端,以解决梯度消失和网络退化问题。尽管 Transformer 和 ResNet 都使用了残差连接,但它们在具体实现、结构位置和应用场景上存在显著差异。以下从多个维度详细对比两者的异同:


    1. 核心思想

    • 共同点
      两者均通过 输入 + 变换后的输出 保留原始信息,缓解梯度消失,帮助深层网络训练。

    • 差异

      • ResNet:主要解决图像任务中极深卷积网络的退化问题(层数增加,准确率反而下降)。

      • Transformer:解决序列建模中多层自注意力和前馈网络的信息传递稳定性问题。


    2. 结构位置与实现方式

    对比项 残差神经网络(ResNet) Transformer 的残差连接
    连接位置 跨越多层(如两个卷积层后)的残差块内 每个子层(自注意力、前馈网络)后直接应用
    典型结构 输出 = 卷积块(输入) + 输入 输出 = LayerNorm(输入 + 子层(输入))
    归一化位置 残差相加后接批归一化(BatchNorm) 残差相加后接层归一化(LayerNorm)
    跳跃连接处理 输入与输出维度不同时,使用 1x1 卷积调整维度 输入与输出维度始终一致,直接相加
    示例结构

    ResNet Block

    Transformer Add&Norm


    3. 归一化方法的差异

    (1) ResNet:批归一化(BatchNorm)

    • 操作:对同一批次中所有样本的 同一特征通道 进行归一化。

      BN(x) = \gamma \cdot \frac{x-\mu_{batch} }{\sqrt{\sigma^2_{batch} +\varepsilon }}+\beta
    • 适用场景:图像数据,特征维度稳定(如 RGB 通道),且批次较大。

    • 问题:对变长序列(如 NLP 任务)的填充位置敏感,导致噪声。

    (2) Transformer:层归一化(LayerNorm)

    • 操作:对 单个样本的所有特征维度 进行归一化。

      LN(x) = \gamma \cdot \frac{x-\mu_{features} }{\sqrt{\sigma^2_{features} +\varepsilon }}+\beta
    • 适用场景:序列数据,避免填充位置干扰,与批次大小无关。


    4. 残差连接的作用对比

    任务需求 ResNet Transformer
    核心挑战 训练极深卷积网络(如 100+ 层)时梯度消失和退化 多层自注意力/前馈网络的信息传递稳定性
    信息保留 保留低频特征(如物体轮廓),增强高频细节学习 保留原始词向量信息,增强上下文动态调整能力
    典型应用 图像分类、目标检测 机器翻译、文本生成

    2.5.2 Layer Normalization

            对残差连接的输出进行标准化处理,调整数据分布,公式如下:

    Output_{Norm} = LayerNorm(Output_{Add}) 

    \mu = \frac{1}{d}\sum_{i=1}^{d} x_i  \sigma^2 = \frac{1}{d}\sum_{i=1}^{d} (x_i-\mu)^2

            d: 特征维度(如 512)。通过可学习参数 γ 和 β 恢复表达能力:

    y = \gamma \cdot \frac{x-\mu }{\sqrt{\sigma^2 + \varepsilon }}+\beta

            其中,\varepsilon: 防止除零的小常数(如 1e-5)。Layer Normalization具有三个作用,一是稳定数据分布:标准化操作使每层的输入近似服从均值为 0、方差为 1 的分布,缓解训练过程中数据分布漂移(Internal Covariate Shift)。二是加速收敛:归一化后的数据更利于优化器(如 Adam)调整参数,减少对学习率的敏感度。三是增强泛化能力:与批归一化(BatchNorm)不同,层归一化不依赖批次大小,更适合变长序列任务(如 NLP)。

    2.6 Feed Forward

            在 Transformer 模型中,Feed Forward 层(前馈神经网络层,简称 FFN) 是每个编码器和解码器层的核心组件之一,位于自注意力机制(Self-Attention)之后。它的核心作用是通过 非线性变换增强模型的表达能力,并对每个位置的表示进行独立处理。以下从结构、功能到具体示例逐步解析其设计原理。

            FFN 由两个线性变换层和一个激活函数组成,数学公式如下:

    • 输入:自注意力层的输出(形状为 [序列长度 × 嵌入维度],如 [n × 512])。

    • 参数(以原始论文为例):

      • 第一层:将输入维度(如 512)扩展到更高维度(如 2048),权重矩阵 W1∈512×2048。

      • 激活函数:ReLU(过滤负值,增强非线性)。

      • 第二层:将维度压缩回原始大小(如 512),权重矩阵 W2∈2048×512

    • 输出:与输入同维度的新表示,传递给下一层或输出。

    Feed Forward 层的作用

    (1) 引入非线性表达能力

    • 自注意力的局限性:自注意力机制本质是线性操作的加权求和(点积 + Softmax),缺乏非线性变换能力。

    • FFN 的补充:通过 ReLU 激活函数和两次线性变换,FFN 能够学习复杂的非线性模式,增强模型对特征组合的建模能力。

    (2) 位置独立的特征提取

    • 局部与全局的平衡

      • 自注意力关注序列中 全局依赖(如长距离词间关系)。

      • FFN 对每个位置独立处理,聚焦 局部特征(如词本身的语义组合)。

    • 示例
      在句子“The cat sat on the mat”中:

      • 自注意力可能让“sat”关注到“cat”和“mat”;

      • FFN 则对“sat”本身的表示进行变换,提取更丰富的动词特征(如时态、动作强度)。

    (3) 维度扩展与信息深化

    • 维度扩展:中间层维度(如 2048)远大于输入维度(如 512),形成一个“瓶颈”结构,迫使模型压缩和扩展信息,学习更抽象的特征。

    • 信息融合:通过扩展维度,FFN 可以融合多组注意力头的信息(例如,将多个注意力头捕捉的语法、语义特征组合)。

    三、Decoder

    3.1 Decoder整体结构

    3.2 Masked Self-Attention

    • Mask 的作用:在计算 QK^T 的注意力分数后,将未来位置的分数覆盖为一个极小的值(如 -1e9),使得经过 Softmax 后,未来位置的权重趋近于零。

    • 实现方式
      使用 上三角掩码矩阵(Upper Triangular Mask),形状为 [序列长度 × 序列长度],例如:

    • # 序列长度为 4 的掩码矩阵
      mask = [
        [0, -1e9, -1e9, -1e9],  # 第1个位置只能看到自己
        [0, 0, -1e9, -1e9],     # 第2个位置能看到前2个位置
        [0, 0, 0, -1e9],        # 第3个位置能看到前3个位置
        [0, 0, 0, 0]            # 第4个位置能看到全部
      ]

            假设生成句子 "I love NLP"

    • 生成第3个词 "NLP" 时,模型只能关注前两个词 "I" 和 "love",而无法看到自身(未来的 "NLP" 及其后的词)。确保通过 Mask 确保训练和推理行为一致。

    AT自回归与NAT非自回归的区别

            在自然语言处理中,AT(自回归解码器,Autoregressive Decoder) 和 NAT(非自回归解码器,Non-Autoregressive Decoder) 是两种不同的序列生成机制,主要区别在于生成目标序列时的依赖关系和效率。以下是它们的核心区别、作用以及 Transformer 模型的选择:


    1. AT(自回归解码器)

    特点

    • 生成方式:逐词(token-by-token)生成序列,每一步的生成依赖于之前已生成的词。

    • 依赖关系:严格遵循顺序,当前词 yt 的生成基于前 t−1 个词 y1:t−1​。

    • 数学表示

       
      • x 是输入序列(如源语言句子),y1:T是目标序列。

    作用

    • 高质量生成:通过逐步依赖上下文,生成的文本连贯性强,适用于对质量要求高的任务(如文本生成、翻译)。

    • 应用场景:机器翻译、文本摘要、对话生成等。

    优点

    • 生成结果自然流畅,语义一致性高。

    • 通过掩码自注意力(Masked Self-Attention)防止信息泄露。

    缺点

    • 无法并行生成:生成长度为 T的序列需要 T 步计算,速度慢。

    • 错误传播:若某一步生成错误,后续步骤会受其影响。

    示例:生成句子 "I love NLP" 时,AT 的流程为:
    [START] → "I" → "I love" → "I love NLP" → [END]


    2. NAT(非自回归解码器)

    特点

    • 生成方式:一次性生成全部词,所有位置的词并行生成。

    • 依赖关系:词与词之间无显式依赖,或仅依赖输入序列。

    • 数学表示

    作用

    • 高效生成:所有词并行计算,速度极快,适用于实时性要求高的任务(如语音合成、实时翻译)。

    • 应用场景:语音识别、低延迟翻译、语音合成等。

    优点

    • 极速推理:生成时间与序列长度无关(理想情况下仅需一步)。

    • 避免错误传播:各词独立生成,局部错误不影响全局。

    缺点

    • 生成质量较低:缺乏词间依赖,易导致重复、不连贯(如 "I love love NLP")。

    • 需要额外机制:需解决目标序列长度预测(如 Fertility Predictor)和多模态分布问题(如通过迭代细化)。

    示例:生成句子 "I love NLP" 时,NAT 的流程为:
    输入 x → 直接预测 [I, love, NLP, END]


    3. AT 与 NAT 的对比

    维度 AT(自回归) NAT(非自回归)
    生成方式 逐词生成,依赖历史输出 并行生成,无历史依赖
    速度 慢(时间与序列长度成正比) 极快(时间与序列长度无关)
    质量 高(依赖上下文,连贯性好) 低(易重复、不连贯)
    训练目标 最大似然估计(MLE) 需额外目标(如知识蒸馏、对比学习)
    典型模型 Transformer、GPT、BERT NAT with Fertility、Flow-Transformer

    4. Transformer 中的解码器类型

    • 原始 Transformer:采用 自回归解码器(AT),用于机器翻译等任务。

      • 解码时使用 掩码自注意力,确保生成当前词时仅能看到左侧已生成词。

      • 生成流程示例(翻译任务):
        输入法语句子 → 编码器输出 → 解码器逐词生成英语翻译。

    • 非自回归变体:后续研究提出 NAT 版本的 Transformer(如 NAT with Fertility),通过预测目标序列长度并并行生成词,但需额外设计(如迭代细化、重排序)来提升质量。


    5. 实际应用中的选择

    • 选择 AT
      需要高生成质量的任务(如文本生成、对话系统、文学翻译)。
      例如:GPT-3 生成文章、Google 翻译的高质量模式。

    • 选择 NAT
      对速度要求极高且可容忍小幅质量下降的任务(如实时语音翻译、语音合成)。
      例如:同声传译工具、TTS(文本到语音)系统。


    6. 混合方法(AT + NAT)

    为结合两者的优势,一些模型采用混合策略:

    • 部分自回归:分块生成(如先生成段落大纲,再并行填充细节)。

    • 迭代式 NAT:通过多轮迭代逐步修正生成结果(如 Insertion Transformer)。


    总结

    • AT 以速度换质量,NAT 以质量换速度,二者各有适用场景。

    • 原始 Transformer 使用自回归解码器,但后续研究扩展了非自回归变体以满足不同需求。

    • 选择时需权衡任务对 质量、速度、计算资源 的要求。

    3.3 Cross-Attention

            在Transformer模型中,交叉注意力(Cross Attention)模块是解码器(Decoder)的核心组件之一,主要用于连接编码器和解码器,使解码器在生成目标序列时能够动态地关注编码器输出的源序列信息。

    • Query(查询):来自解码器上一层的输出(即已生成的目标序列的中间表示)。

    • Key 和 Value:来自编码器的最终输出(即源序列的编码表示)。

            假设将中文句子“猫追逐老鼠”翻译为英文“The cat chased the mouse”:

    1. 编码器输出:中文句子的上下文表示(每个词对应一个向量)。
    2. 解码器生成“chased”时
    • Query:解码器当前处理位置(对应“chased”)的中间表示。
    • Key 和 Value:编码器输出的中文词向量(“猫”“追逐”“老鼠”)。
    • 交叉注意力权重:模型可能为“追逐”分配高权重,为“猫”和“老鼠”分配中等权重。
    • 输出:加权后的中文上下文信息,帮助解码器正确生成“chased”。

     四、训练

             Transformer 的训练过程通过 监督学习 实现,目标是调整模型参数,使其能够将输入序列(如源语言句子)映射到目标序列(如目标语言句子)。以下从数据准备、前向传播、损失计算、反向传播到优化策略,逐步解析其训练原理。

    4.1 损失计算(交叉熵损失)

    • 目标:最小化预测分布与真实标签的差异。

    • 公式

    yt(b)​:批次 b 中第 t 个位置的真实词索引。

    对填充位置(Padding)的损失进行掩码,不计入计算。

    4.2 反向传播与参数更新

    梯度计算
    通过链式法则计算损失对模型参数的梯度,例如:

    优化器
    使用 Adam 优化器,结合动态学习率调整(如 Warmup 策略):

    m^t​,v^t​:梯度的一阶和二阶动量估计。

    训练中的关键技术

    一、关键训练技术

    1. 教师强制(Teacher Forcing)

    • 方法:训练时解码器的输入使用真实目标序列(而非模型自身生成的结果),避免错误累积。

    • 示例
      生成第 t 个词时,输入为真实的前 t−1个词,而非模型预测的词。

    2. 学习率调度(Learning Rate Scheduling)

    • Warmup:初始阶段逐步增大学习率,避免梯度不稳定。
      例如,前 4000 步线性增加学习率至峰值,之后按倒数平方根衰减。

    • 公式

    3. 正则化

    • Dropout
      在注意力权重、FFN 输出等位置随机置零,防止过拟合。

    • 标签平滑(Label Smoothing)
      将真实标签的 one-hot 分布替换为平滑分布(如 0.1 概率分配给其他词),增强鲁棒性。

    4. 混合精度训练

    • 原理:使用 FP16 和 FP32 混合精度计算,加速训练并减少显存占用。

    • 实现

      • 前向传播和梯度计算用 FP16。

      • 参数更新用 FP32 维护主副本。

    二、训练示例:机器翻译

    以英译中任务为例:

    1. 输入序列(英文):["The", "cat", "sat", "on", "the", "mat"]

    2. 目标序列(中文):["猫", "坐在", "垫子", "上"]

    3. 步骤

    • 编码器将英文句子编码为上下文向量。
    • 解码器逐词生成中文,初始输入为 [START]
    • 生成“猫”时,交叉注意力关注英文词 "cat"
    • 生成“坐在”时,交叉注意力关注 "sat" 和 "on"
    • 损失计算时,惩罚预测与 ["猫", "坐在", "垫子", "上"] 的偏差。

    三、Transformer 训练的优势与挑战

    优势 挑战
    并行计算(自注意力机制) 显存占用高(序列长度平方复杂度)
    长距离依赖建模 需要大量训练数据
    可扩展性(堆叠多层) 超参数调优复杂(如头数、层数)
    泛化能力强(多头注意力) 训练时间较长

     参考文献

    Transformer之Encoder_transformer encoder-CSDN博客

    【LLM|BLOG】挑战极限!一次搞懂Transformer Encoder的所有秘密!

    一文彻底搞懂Transformer - Input(输入)_input embedding-CSDN博客

    How positional encoding works in transformers?

    台大李宏毅21年机器学习课程 self-attention和transformer_哔哩哔哩_bilibili

    2025最新修订版!跟着台大李宏毅大佬一小时吃透Transformer架构,深入浅出解构注意力机制!_哔哩哔哩_bilibili

    更多推荐