transformer学习笔记

3789 字
19 分钟
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 层主要包含:

  1. 多头自注意力机制
  2. 残差连接与层归一化
  3. 前馈神经网络
  4. 残差连接与层归一化

每个 Decoder 层主要包含:

  1. 带掩码的多头自注意力机制
  2. 残差连接与层归一化
  3. Encoder-Decoder 交叉注意力
  4. 残差连接与层归一化
  5. 前馈神经网络
  6. 残差连接与层归一化

注意力机制#

核心思想#

注意力机制的核心思想是:为不同的信息分配不同的权重。

  • 与当前任务关系更大的信息获得更高权重;
  • 关系较小的信息获得更低权重;
  • 模型根据上下文动态计算权重,而不是永远使用固定规则。

例如在句子“动物没有过马路,因为它太累了”中,模型在理解“它”时,可以让“动物”获得较高的注意力权重,从而判断“它”更可能指代“动物”。

输入处理#

分词#

模型不能直接处理一整段自然语言,需要先把文本切分成 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_Q
K = XW_K
V = XW_V

其中:

  • X 是输入向量;
  • W_QW_KW_V 是模型训练得到的参数矩阵。

计算过程#

自注意力的计算可以分为以下几步:

  1. 使用当前 Token 的 Q 与所有 Token 的 K 做点积,得到相关性分数;
  2. 将分数除以 √d_k,避免数值过大导致 Softmax 梯度过小;
  3. 通过 Softmax 把分数转化为总和为 1 的注意力权重;
  4. 使用注意力权重对所有 V 进行加权求和;
  5. 得到融合了上下文信息的新向量。

计算公式:

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 共同保证深层网络能够稳定训练。
transformer学习笔记
https://putao.ink/posts/agentstudy/transformer学习笔记/
作者
葡萄成熟时
发布于
2026-07-31
许可协议
CC BY-NC-SA 4.0

文章目录