transformer学习笔记
背景
早期自然语言处理领域的主流架构主要有 CNN、RNN 以及 RNN 的变种 LSTM、GRU。
CNN(卷积神经网络)擅长提取局部特征,并且能够并行计算。它最常用于图像处理,也可以通过一维卷积处理文本、语音、时间序列等数据。
RNN(循环神经网络)适合处理有先后顺序的序列数据。它会把上一个时间步的状态传递给下一个时间步,因此能够在一定程度上保留上下文信息。LSTM 和 GRU 在 RNN 的基础上增加了门控结构,用来缓解普通 RNN 难以学习长距离依赖的问题。
RNN 类架构主要存在以下问题:
- 难以并行计算:当前时间步依赖上一个时间步的计算结果,只能按照顺序逐步计算,无法充分发挥 GPU 的并行计算能力。LSTM 和 GRU 仍然具有这种串行依赖,并没有从根本上解决并行问题。
- 长距离依赖问题:信息经过很多时间步后会逐渐衰减,模型很难把句子前面的信息传递到很远的位置。
- 梯度消失或梯度爆炸:反向传播需要经过很长的计算链,梯度连续相乘后可能越来越小或越来越大。LSTM 和 GRU 可以缓解这个问题,但不能完全消除。
为了解决这些问题,论文《Attention Is All You Need》提出了 Transformer 架构。Transformer 不再依赖循环结构,而是使用注意力机制直接计算序列中任意两个位置之间的关系,因此能够并行处理整段文本,也更容易学习长距离依赖。
架构组成

Transformer 最初用于机器翻译,由 Encoder(编码器)和 Decoder(解码器)两部分组成:
源文本 → Embedding + 位置编码 → Encoder × N ↓目标文本 → Embedding + 位置编码 → Decoder × N → Linear → Softmax → 下一个词原始 Transformer 中 Encoder 和 Decoder 都堆叠了 6 层,词向量维度 d_model 为 512,注意力头数为 8。这些只是原论文使用的超参数,并不是 Transformer 必须采用的固定值。
每个 Encoder 层主要包含:
- 多头自注意力机制
- 残差连接与层归一化
- 前馈神经网络
- 残差连接与层归一化
每个 Decoder 层主要包含:
- 带掩码的多头自注意力机制
- 残差连接与层归一化
- Encoder-Decoder 交叉注意力
- 残差连接与层归一化
- 前馈神经网络
- 残差连接与层归一化
注意力机制
核心思想
注意力机制的核心思想是:为不同的信息分配不同的权重。
- 与当前任务关系更大的信息获得更高权重;
- 关系较小的信息获得更低权重;
- 模型根据上下文动态计算权重,而不是永远使用固定规则。
例如在句子“动物没有过马路,因为它太累了”中,模型在理解“它”时,可以让“动物”获得较高的注意力权重,从而判断“它”更可能指代“动物”。
输入处理
分词
模型不能直接处理一整段自然语言,需要先把文本切分成 Token。
Token 不一定等于一个完整的词,也可能是:
- 一个汉字;
- 一个英文单词;
- 单词的一部分;
- 标点符号;
- 特殊标记。
例如:
输入文本:Transformers are powerful.分词结果:["Transform", "ers", " are", " powerful", "."]不同模型使用的分词方式不同,常见方法有 BPE、WordPiece、SentencePiece 等。
词嵌入
分词之后,每个 Token 会通过 Embedding 层转化为一个向量,也就是词嵌入。

向量由多个维度组成,每个维度共同表达这个 Token 的语义信息。语义相近的 Token,经过训练后通常会在向量空间中更加接近。
原始 Transformer 使用 512 维向量,但不同模型可以使用不同维度,例如 768、1024、4096 等。因此“每个词都有 512 个维度”只适用于特定模型配置,并不是固定规则。
需要注意:Embedding 层最开始通常是随机初始化的,它是在模型训练过程中逐渐学习出来的。
位置编码
Transformer 会同时处理整个序列,不像 RNN 那样按照顺序逐个读取 Token。因此,仅使用词嵌入时,模型本身不知道每个 Token 的先后顺序。
例如下面两个句子包含相同的词,但含义不同:
我喜欢你你喜欢我为了让模型知道 Token 的位置,需要把位置信息加入词嵌入:
最终输入向量 = Token Embedding + Position Encoding原始 Transformer 使用正弦和余弦函数生成位置编码:
PE(pos, 2i) = sin(pos / 10000^(2i / d_model))PE(pos, 2i + 1) = cos(pos / 10000^(2i / d_model))其中:
pos表示 Token 在序列中的位置;i表示向量的维度;d_model表示模型的隐藏层维度。
除了固定的正弦、余弦位置编码,现代模型还可能使用可学习位置编码、相对位置编码、RoPE(旋转位置编码)等方法。
自注意力机制

在自注意力机制中,每个 Token 都会生成三个向量:Query、Key 和 Value。
- Query(Q):当前 Token 想要寻找什么信息;
- Key(K):当前 Token 可以被什么样的查询匹配;
- Value(V):当前 Token 真正提供的内容。
Q、K、V 并不是词向量中提前存在的三个固定部分,而是同一个输入向量分别乘以三个可学习的参数矩阵得到的:
Q = XW_QK = XW_KV = XW_V其中:
X是输入向量;W_Q、W_K、W_V是模型训练得到的参数矩阵。
计算过程
自注意力的计算可以分为以下几步:
- 使用当前 Token 的 Q 与所有 Token 的 K 做点积,得到相关性分数;
- 将分数除以
√d_k,避免数值过大导致 Softmax 梯度过小; - 通过 Softmax 把分数转化为总和为 1 的注意力权重;
- 使用注意力权重对所有 V 进行加权求和;
- 得到融合了上下文信息的新向量。
计算公式:
Attention(Q, K, V) = softmax(QKᵀ / √d_k)V其中 d_k 是 Key 向量的维度。
句子中的每个 Token 都会执行这个过程。因此,一个 Token 更新后的表示不仅包含它自身的信息,也包含它从其他 Token 中获取的上下文信息。
例如,“苹果”在下面两个句子中的含义不同:
我吃了一个苹果。苹果发布了新的电脑。通过自注意力,“苹果”可以分别关注“吃”和“电脑”等上下文信息,从而形成不同的上下文向量。
多头注意力机制
单个注意力头只能在一个表示空间中计算 Token 之间的关系。多头注意力会使用多组不同的参数矩阵,从多个角度观察同一段文本。
不同的注意力头可能分别更关注:
- 语法关系;
- 语义关系;
- 指代关系;
- 位置关系;
- 情绪信息;
- 长距离依赖。
每个注意力头独立计算:
head_i = Attention(QW_i^Q, KW_i^K, VW_i^V)然后把所有头的结果拼接起来,再通过一个线性变换进行融合:
MultiHead(Q, K, V) = Concat(head_1, ..., head_h)W_O多头不代表人为规定“某一头只能学习语法、另一头只能学习情绪”。每个头关注什么,是模型在训练过程中自动学习得到的,而且不同头之间也可能学习到重复的信息。
残差连接
残差连接会把子层的输入与子层的输出相加:
保留原始输入,同时加入当前子层计算出的新信息。
残差连接的作用:
- 减少深层网络中的信息损失;
- 让梯度能够更容易地向前传播;
- 降低深层模型的训练难度;
- 让模型在必要时可以保留原始特征。
层归一化
Layer Normalization 会对单个 Token 的隐藏向量进行归一化,使其数值分布更加稳定,然后再通过可学习参数进行缩放和平移。
简化理解可以认为:它会把向量调整到均值接近 0、方差接近 1 的分布,再由模型学习最合适的尺度。
层归一化的作用:
- 稳定中间层的数据分布;
- 改善梯度传播;
- 加快模型收敛;
- 提高深层网络训练的稳定性。
前馈神经网络
注意力层负责让不同 Token 之间交换信息,前馈神经网络(Feed Forward Network,FFN)则负责对每个 Token 的特征进行进一步加工。
同一层中的所有 Token 使用相同的 FFN 参数,但每个 Token 都是独立计算的,因此可以并行处理。
升维 + 激活函数 + 降维
通过和激活函数的组合,负责把获取的注意力机制相关的内容进行整理。
Encoder
Encoder 的作用是理解输入序列,并把输入转换为包含上下文信息的表示。
一个 Encoder 层的处理流程:
输入 ↓多头自注意力 ↓残差连接 + 层归一化 ↓前馈神经网络 ↓残差连接 + 层归一化 ↓输出在 Encoder 的自注意力中,每个 Token 通常可以关注输入序列中的所有 Token,因此能够同时利用左侧和右侧的上下文。
例如输入:
小明把书放在桌子上,因为它很重。经过多层 Encoder 后,每个 Token 的表示都会融入整句话的信息。“它”的向量可能会更多地包含“书”的信息,而“重”的向量也会与“书”建立较强的联系。
每一层 Encoder 的输出都会作为下一层 Encoder 的输入。随着层数增加,模型可以逐渐从表面词义学习到更复杂的语法、语义和上下文关系。
Decoder
Decoder 的作用是根据已经生成的内容,以及 Encoder 提供的输入信息,逐步预测下一个 Token。
一个 Decoder 层的处理流程:
已生成的目标序列 ↓带掩码的多头自注意力 ↓残差连接 + 层归一化 ↓Encoder-Decoder 交叉注意力 ↓残差连接 + 层归一化 ↓前馈神经网络 ↓残差连接 + 层归一化 ↓输出带掩码的自注意力
Decoder 在生成当前位置的 Token 时,不能提前看到未来的正确答案。
例如目标句子是:
I love machine learning当模型预测 machine 时,只能看到:
I love不能看到:
learning这种结构保证了模型只能根据过去的信息预测未来。
交叉注意力
Encoder-Decoder Attention 也叫 Cross-Attention(交叉注意力)。
在交叉注意力中:
- Q 来自 Decoder 当前层的隐藏状态;
- K 和 V 来自 Encoder 最后一层的输出。
Q = Decoder 的输出K = Encoder 的输出V = Encoder 的输出这样 Decoder 在生成目标文本时,就可以根据当前需要去关注源文本中的相关位置。
例如进行中译英时,Decoder 准备生成英文单词 apple,它可以通过交叉注意力重点关注中文输入中的“苹果”。
Padding Mask 与 Causal Mask
模型通常会把一个批次中的句子补齐到相同长度,补齐使用的特殊 Token 称为 Padding Token。
句子 A:[我, 喜欢, 学习]句子 B:[你好, PAD, PAD]Padding Token 只是为了统一张量尺寸,不包含实际语义。因此需要使用 Padding Mask,让其他 Token 不去关注这些补齐位置。
Transformer 中常见的两种 Mask:
- Padding Mask:屏蔽补齐位置;
- Causal Mask:屏蔽未来位置。
Encoder 通常使用 Padding Mask;Decoder 的自注意力通常同时使用 Padding Mask 和 Causal Mask。
三种常见 Transformer 架构
Encoder-only
只保留 Transformer 的 Encoder。
特点:
- 可以同时利用左侧和右侧上下文;
- 擅长理解整段输入;
- 常用于文本分类、信息抽取、语义匹配等任务。
代表模型:
- BERT;
- RoBERTa;
- ALBERT。
Decoder-only
只保留 Transformer 的 Decoder,主要使用带因果掩码的自注意力。
特点:
- 根据已有内容预测下一个 Token;
- 适合文本生成;
- 可以通过“预测下一个 Token”的统一目标学习多种任务。
代表模型:
- GPT 系列;
- Llama;
- Qwen;
- DeepSeek。
Decoder-only 模型没有经典 Encoder-Decoder 架构中的交叉注意力层,因为输入提示和生成内容会被放在同一个序列中处理。
Encoder-Decoder
同时使用 Encoder 和 Decoder。
特点:
- Encoder 负责理解输入;
- Decoder 根据输入生成目标序列;
- 适合输入和输出之间存在明确转换关系的任务。
代表模型:
- 原始 Transformer;
- T5;
- BART。
常见任务:
- 机器翻译;
- 文本摘要;
- 文本改写;
- 问答生成。
Transformer 的优势
- 并行计算能力强:训练时可以同时处理序列中的多个位置;
- 长距离依赖能力强:任意两个 Token 可以通过一层注意力直接建立联系;
- 扩展性好:可以通过增加参数、数据和计算量提升能力;
- 任务适应性强:可以用于文本、图像、语音、视频和多模态任务;
- 结构统一:很多任务都可以转换为序列建模问题。
Transformer 的局限
- 注意力计算开销大:标准自注意力需要计算所有 Token 两两之间的关系,时间和显存复杂度通常为
O(n²); - 长文本成本高:序列长度翻倍时,注意力矩阵的大小大约变为原来的四倍;
- 推理速度受限:自回归模型需要逐 Token 生成;
- 需要大量数据和计算资源:大型 Transformer 的训练成本很高;
- 上下文长度有限:超过模型支持的最大上下文后,需要截断、压缩或使用其他长文本方案;
- 生成结果不一定真实:模型学习的是 Token 概率分布,可能生成语言通顺但事实错误的内容。
总结
Transformer 的完整处理逻辑可以概括为:
文本 ↓分词 Tokenization ↓词嵌入 Embedding ↓加入位置信息 ↓多头注意力:让 Token 交换上下文信息 ↓残差连接与层归一化:稳定信息和梯度 ↓前馈神经网络:加工每个 Token 的特征 ↓多层堆叠:逐步提取更复杂的语义 ↓Linear + Softmax:预测 Token 概率Transformer 最关键的变化是:不再依赖 RNN 按顺序传递信息,而是通过注意力机制让序列中的不同位置直接建立联系。
其中:
- Encoder 更擅长理解输入;
- Decoder 更擅长逐步生成;
- Encoder-Decoder 适合把一种序列转换为另一种序列;
- 多头注意力从多个表示空间学习 Token 之间的关系;
- 位置编码补充序列顺序;
- 残差连接、层归一化和 FFN 共同保证深层网络能够稳定训练。
