Lazy loaded imageTransformer算法原理
2026-7-15
| 2026-7-15
字数 3721阅读时长 10 分钟
type
Post
status
Published
date
Jul 15, 2026
slug
TransformerAlgorithmPrinciple
summary
Transformer算法原理,包含 Transformer算法背景与整体架构;文本数值化、词嵌入与位置编码;自注意力机制;多头注意力机制;填充掩码与因果掩码;残差连接、层归一化与前馈神经网络;编码器、解码器与交叉注意力;Transformer的训练与推理;PyTorch代码实现。
tags
Python
机器学习
PyTorch
category
机器学习
icon
password
@ZZHow(ZZHow1024)
参考课程:
参考论文:

01_Transformer_算法背景

  1. 传统 RNN 按时间步递归计算,后一个状态依赖前一个状态,难以充分并行。
  1. 长序列经过多步信息传递,容易出现长距离依赖难以建模的问题。
  1. Transformer 不使用循环或卷积作为主体,而是以注意力机制直接建立任意两个位置之间的联系。
  1. 训练时,同一层中的所有位置可以并行计算;任意两个位置之间的信息传递路径也更短。
  • Transformer 最初用于机器翻译,采用完整的 Encoder—Decoder 架构。后来常见模型可以看成对它的不同取舍:
    • Encoder-only:侧重理解,例如 BERT。
    • Decoder-only:侧重自回归生成,例如 GPT。
    • Encoder—Decoder:适合输入到输出的序列转换,例如翻译、摘要。

02_Transformer_整体架构

Transformer Encoder—Decoder 整体架构
Transformer Encoder—Decoder 整体架构
Transformer Encoder—Decoder 整体架构
  • 完整 Transformer 由编码器解码器两部分组成:
    • 编码器读取源序列,输出包含上下文信息的 memory
    • 解码器读取已生成的目标序列,并通过交叉注意力查询编码器输出。
    • 解码器顶端经过线性层与 Softmax,得到下一个 token 的概率分布。
  • 原论文中,Encoder Layer 和 Decoder Layer 均重复堆叠 次;模型维度 ,注意力头数 ,前馈层中间维度 。这些是经典配置,不是 Transformer 的固定限制。

2.1_编码器层

每个 Encoder Layer 包含:
  1. 多头自注意力(Multi-Head Self-Attention)。
  1. 残差连接与层归一化(Add & Norm)。
  1. 逐位置前馈网络(Feed Forward Network)。
  1. 再次进行残差连接与层归一化

2.2_解码器层

每个 Decoder Layer 比编码器多一个子层:
  1. 因果掩码的多头自注意力
  1. 多头交叉注意力(查询编码器输出)。
  1. 逐位置前馈网络
  1. 每个子层外均有残差连接与层归一化

03_输入文本的数值化

3.1_Tokenize_与_Token_ID

模型不能直接处理字符串,文本需要依次经过:
假设词表为:
则“我是一条狗”可以转换为:
特殊 token 的常见作用:
  • <pad>:把同一批次中的序列补齐到相同长度。
  • <bos>:标记目标序列开始,用于启动解码。
  • <eos>:标记序列结束,推理时生成它即可停止。
  • <unk>:表示词表中不存在的 token。

3.2_词嵌入_Word_Embedding

  • One-hot 向量维度等于词表大小,既稀疏又无法表达语义相似性。词嵌入使用可训练矩阵 ,把 token ID 映射为稠密向量:
  • 其中 是词表大小。语义相近的 token 在训练后往往具有更相近的向量表示。
  • 原始 Transformer 会将词嵌入乘以 ,再与位置编码相加:

3.3_位置编码_Positional_Encoding

  • 自注意力本身只根据向量内容计算相关性,并不知道 token 的先后顺序,因此需要注入位置信息。
  • 原论文使用固定的正弦、余弦位置编码:
  • :token 在序列中的位置。
  • :向量维度索引。
  • 不同维度使用不同频率,使模型能区分绝对位置,也能学习相对距离。
  • 实际模型也常使用可学习位置嵌入或旋转位置编码,但它们不改变“向模型注入顺序信息”这一目的。

04_自注意力机制_Self-Attention

  • 自注意力要解决的问题是:对于当前位置,序列中的其他 token 各有多重要?
  • 例如处理“我喜欢打篮球”中的“打”时,模型可以给“喜欢”和“篮球”更高权重,再把所有位置的信息加权汇总,得到“打”的上下文表示。

4.1_Query、Key_与_Value

  • 输入矩阵 分别乘以三组可训练参数:
  • 可以直观理解为:
    • Query:当前 token 想查询什么信息。
    • Key:每个 token 可以用什么特征被匹配。
    • Value:匹配成功后真正被汇总的内容。
  • 在自注意力中, 来自同一序列;在交叉注意力中,它们来自不同序列。

4.2_缩放点积注意力

  • 缩放点积自注意力的矩阵计算过程
    • 缩放点积自注意力的矩阵计算过程
      缩放点积自注意力的矩阵计算过程
  • 完整计算公式为:
  • 计算过程:
      1. :计算每个 Query 与所有 Key 的相似度。
      1. 除以 :控制点积数值范围,避免 Softmax 过早饱和、梯度过小。
      1. 加上掩码 :把不允许关注的位置设为
      1. Softmax:将每一行变成和为 1 的注意力权重。
      1. 乘以 :按权重汇总各位置的信息。

4.3_矩阵形状

张量
形状
含义
长度为 的输入序列
查询向量
键向量
值向量
两两位置的注意力分数
注意力权重
汇总后的上下文表示
  • 自注意力中通常有 ;交叉注意力允许查询长度和键值长度不同。

05_多头注意力_Multi-Head_Attention

  • 多头注意力机制
    • 多头注意力机制
      多头注意力机制
  • 单头注意力只在一个表示子空间中计算相关性。多头注意力将模型维度拆成 份,每个头独立学习不同的关注模式:
  • ,常见设置是每个头 。拼接 8 个头后重新得到 512 维,再通过 融合。
  • 不同的头可能分别关注:
    • 短距离搭配。
    • 长距离依赖。
    • 主谓宾关系。
    • 实体指代。
    • 标点、边界或其他结构信息。
多头并不等于简单重复同一计算。每个头有独立的投影参数,因此可以在不同子空间中学习关系。

06_注意力掩码_Mask

  • 掩码发生在 Softmax 之前:把不允许参与注意力的位置加上 ,使其 Softmax 权重变为 0。

6.1_填充掩码_Padding_Mask

  • 同一批次中的句子通常长度不同,需要用 <pad> 补齐。填充位置不含语义,应在作为 Key/Value 时被屏蔽。
    • 在 PyTorch 的 key_padding_mask 中,布尔值 True 表示该 Key 位置需要忽略。

    6.2_因果掩码_Causal_Mask

    • 自回归生成要求第 个位置只能看到自己和之前的位置,不能偷看未来答案。对应的上三角区域需要屏蔽:
    • 训练时,因果掩码让整条目标序列仍可并行计算,同时保证每个位置只使用合法的历史信息。
    PyTorch 易错点:nn.Transformer 的布尔掩码中 True 表示“禁止参与注意力”;而 torch.nn.functional.scaled_dot_product_attention 的布尔 attn_mask 中,True 表示“允许参与注意力”。混用两套语义会产生方向完全相反的结果。

    07_Add_&_Norm_与前馈神经网络

    7.1_残差连接

    • 每个子层外包裹残差连接:
    • 残差连接保留原始信息,并为深层网络提供更直接的梯度通路。

    7.2_层归一化_Layer_Normalization

    • LayerNorm 在单个 token 的特征维度上归一化:
    • 原始 Transformer 使用 Post-Norm:
    • 许多后续模型改用 Pre-Norm:
    • Pre-Norm 往往更利于深层模型训练;阅读实现时需要先确认归一化发生在子层之前还是之后。

    7.3_逐位置前馈网络_FFN

    • Transformer 中的逐位置前馈网络
      • Transformer 中的逐位置前馈网络
        Transformer 中的逐位置前馈网络
    • 注意力负责在 token 之间交换信息,FFN 则对每个 token 独立做非线性变换:
    • 所有位置共享同一组
    • 不同位置之间互不混合,因此可以并行计算。
    • 原论文使用 ReLU,并将 维先升到 维,再降回 维。
    • 现代模型也常使用 GELU、SiLU 或门控 FFN。

    08_Encoder、Decoder_与交叉注意力

    8.1_编码器

    • 编码器中的自注意力满足:
    • 经过多层编码后,每个源 token 都得到融合全句信息的表示,统一记为 memory

    8.2_解码器

    • 解码器包含两种注意力:
      • 因果自注意力:,只读取已经出现的目标 token。
      • 交叉注意力:Query 来自解码器,Key 和 Value 来自编码器输出。
    • 因此,解码器中的每个目标位置都能按需查询整个源序列。源序列长度 与目标序列长度 可以不同,交叉注意力权重矩阵形状为

    09_Transformer_训练与推理

    9.1_训练过程

    • 以“我是一条狗”翻译为“I am a dog”为例,目标序列进行右移:
      • 训练流程:
          1. 编码器一次性处理完整源序列。
          1. 解码器接收右移后的完整目标序列。
          1. 因果掩码阻止当前位置读取未来 token。
          1. 每个位置同时预测下一个 token。
          1. 对所有非 <pad> 位置计算交叉熵损失,并反向传播更新参数。
      • 这种做法常称为 Teacher Forcing:训练阶段使用真实历史 token 作为解码器输入。

      9.2_推理过程

      • Transformer 自回归推理过程
        • Transformer 自回归推理过程
          Transformer 自回归推理过程
      • 推理时没有完整目标答案,需要逐步生成:
        • 每一步把已生成 token 重新送入解码器,预测下一个 token。
        • 生成 <eos> 或达到最大长度时停止。
        • 可以使用贪心搜索、束搜索或采样策略选择下一个 token。
        • 实际部署常缓存历史 Key/Value,避免每一步重复计算全部历史状态;这就是 KV Cache。
      • 训练能在目标序列长度维度并行,而自回归推理必须逐 token 进行,这也是大模型生成延迟的重要来源。

      10_PyTorch_实现缩放点积注意力

      • 下面用少量代码复现公式,约定布尔掩码中 True 表示禁止关注:
        • 注意:如果某一行所有位置都被屏蔽,那么该行 Softmax 可能得到 NaN。构造掩码时应确保每个有效 Query 至少能关注一个位置。

        11_PyTorch_调用多头注意力与完整_Transformer

        11.1_nn.MultiheadAttention

        11.2_nn.Transformer_最小前向传播

        • nn.Transformer 是便于理解原始架构的参考实现。下面只验证张量流,不包含分词器、Embedding、输出词表映射和损失函数:
          • 要构成真正的序列生成模型,还需要:
              1. 源语言与目标语言的 tokenizer、词表。
              1. nn.Embedding 与位置编码。
              1. 将 Transformer 输出映射到词表大小的线性层。
              1. 忽略 <pad> 的交叉熵损失。
              1. 训练循环与自回归解码循环。

          12_总结

          • Transformer 的核心数据流可以压缩为:
            • 需要重点区分的概念:
              • 概念
                Query 来源
                Key/Value 来源
                主要作用
                编码器自注意力
                编码器输入
                编码器输入
                融合源序列上下文
                解码器因果自注意力
                解码器输入
                解码器输入
                只利用已生成的目标内容
                交叉注意力
                解码器状态
                编码器输出
                根据目标状态查询源序列
                Padding Mask
                补齐位置
                忽略无意义的 <pad>
                Causal Mask
                未来位置
                防止训练时偷看未来答案
            • 最后记住三点:
                1. 注意力权重来自 Query 与 Key 的匹配,真正被汇总的是 Value
                1. 自注意力负责 token 间的信息交换FFN 负责每个 token 内部的非线性变换
                1. 训练阶段可借助因果掩码并行计算推理阶段仍需自回归地逐 token 生成
          • Python
          • 机器学习
          • PyTorch
          • 算法模板(Java版)神经网络与深度学习笔记合集
            Loading...