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

- 完整 Transformer 由编码器和解码器两部分组成:
- 编码器读取源序列,输出包含上下文信息的
memory。 - 解码器读取已生成的目标序列,并通过交叉注意力查询编码器输出。
- 解码器顶端经过线性层与 Softmax,得到下一个 token 的概率分布。
- 原论文中,Encoder Layer 和 Decoder Layer 均重复堆叠 次;模型维度 ,注意力头数 ,前馈层中间维度 。这些是经典配置,不是 Transformer 的固定限制。
2.1_编码器层
每个 Encoder Layer 包含:
- 多头自注意力(Multi-Head Self-Attention)。
- 残差连接与层归一化(Add & Norm)。
- 逐位置前馈网络(Feed Forward Network)。
- 再次进行残差连接与层归一化。
2.2_解码器层
每个 Decoder Layer 比编码器多一个子层:
- 带因果掩码的多头自注意力。
- 多头交叉注意力(查询编码器输出)。
- 逐位置前馈网络。
- 每个子层外均有残差连接与层归一化。
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_缩放点积注意力
- 缩放点积自注意力的矩阵计算过程

- 完整计算公式为:
- 计算过程:
- :计算每个 Query 与所有 Key 的相似度。
- 除以 :控制点积数值范围,避免 Softmax 过早饱和、梯度过小。
- 加上掩码 :把不允许关注的位置设为 。
- Softmax:将每一行变成和为 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 中的逐位置前馈网络

- 注意力负责在 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”为例,目标序列进行右移:
- 训练流程:
- 编码器一次性处理完整源序列。
- 解码器接收右移后的完整目标序列。
- 因果掩码阻止当前位置读取未来 token。
- 每个位置同时预测下一个 token。
- 对所有非
<pad>位置计算交叉熵损失,并反向传播更新参数。
- 这种做法常称为 Teacher Forcing:训练阶段使用真实历史 token 作为解码器输入。
9.2_推理过程
- 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、输出词表映射和损失函数:
- 要构成真正的序列生成模型,还需要:
- 源语言与目标语言的 tokenizer、词表。
nn.Embedding与位置编码。- 将 Transformer 输出映射到词表大小的线性层。
- 忽略
<pad>的交叉熵损失。 - 训练循环与自回归解码循环。
12_总结
- Transformer 的核心数据流可以压缩为:
- 需要重点区分的概念:
概念 | Query 来源 | Key/Value 来源 | 主要作用 |
编码器自注意力 | 编码器输入 | 编码器输入 | 融合源序列上下文 |
解码器因果自注意力 | 解码器输入 | 解码器输入 | 只利用已生成的目标内容 |
交叉注意力 | 解码器状态 | 编码器输出 | 根据目标状态查询源序列 |
Padding Mask | — | 补齐位置 | 忽略无意义的 <pad> |
Causal Mask | — | 未来位置 | 防止训练时偷看未来答案 |
- 最后记住三点:
- 注意力权重来自 Query 与 Key 的匹配,真正被汇总的是 Value。
- 自注意力负责 token 间的信息交换,FFN 负责每个 token 内部的非线性变换。
- 训练阶段可借助因果掩码并行计算,推理阶段仍需自回归地逐 token 生成。
Transformer算法原理