←返回文章列表

Transformer:从结构到自注意力

Transformer深度学习语言模型
10 分钟-阅读

围绕 Encoder、Decoder、自注意力、位置编码、残差连接和 Mask,梳理 Transformer 的核心机制。

Transformer 是一种基于注意力机制的神经网络结构,最初用于机器翻译任务,后来成为大语言模型的重要基础。

它和循环神经网络的思路不同。RNN 按顺序处理序列,Transformer 则通过注意力机制直接建模序列中任意位置之间的关系。这让模型更适合并行计算,也更容易捕捉长距离依赖。

Transformer 的整体结构

经典 Transformer 由 Encoder 和 Decoder 两部分组成。

  • Encoder 负责理解输入序列。

  • Decoder 负责根据 Encoder 的输出生成目标序列。

机器翻译可以作为直观例子:Encoder 读取源语言句子,Decoder 逐步生成目标语言句子。

图 1:Transformer 的基本结构

flowchart TD
  A["输入序列"] --> B["Embedding"]
  B --> C["位置编码"]
  C --> D["Encoder"]
  D --> E["上下文表示"]
  E --> F["Decoder"]
  F --> G["输出序列"]

Encoder 和 Decoder 内部都由多个相似模块堆叠而成。每个模块通常包含注意力层、前馈网络、残差连接和归一化。

自注意力在解决什么问题

自注意力机制用于判断一个 token 应该关注序列中的哪些位置。

比如句子:

小明把书放进书包,因为它太重了。

这里的“它”更可能指“书”,而不是“书包”。模型需要根据上下文判断词与词之间的关系。自注意力就是用来建立这种关联的。

Q、K、V 的含义

自注意力计算中,每个输入向量会被映射成三类向量:

向量 含义 作用
Query 查询向量 当前 token 想找什么信息
Key 键向量 当前 token 能提供什么索引
Value 值向量 当前 token 真正携带的信息

计算过程可以理解为:Query 和所有 Key 计算匹配度,再用匹配度加权求和 Value。

Scaled Dot-Product Attention

自注意力的核心公式是:

Attention(Q, K, V) = softmax(QK^T / sqrt(d_k))V

其中:

  • QK^T 用来计算 Query 和 Key 的相似度。

  • sqrt(d_k) 用来缩放分数,避免数值过大。

  • softmax 把分数转换为权重。

  • 最后乘以 V,得到加权后的表示。

图 2:自注意力计算链路

flowchart TD
  A["输入向量"] --> B["生成 Q、K、V"]
  B --> C["计算 Q 与 K 的相似度"]
  C --> D["缩放并经过 softmax"]
  D --> E["对 V 加权求和"]
  E --> F["输出上下文表示"]

多头注意力为什么有用

单个注意力头只能从一个表示空间里看关系。多头注意力会并行使用多个注意力头,让模型从不同角度捕捉关联。

一个头可能更关注语法关系,另一个头可能更关注语义关系,还有的头可能关注远距离依赖。最后再把多个头的结果拼接并映射回统一维度。

位置编码补上顺序信息

Transformer 本身不会像 RNN 那样天然按顺序处理 token。为了让模型知道词在句子里的位置,需要加入位置编码。

位置编码会和词嵌入相加:

输入表示 = 词嵌入 + 位置编码

这样模型既能获得词语含义,也能知道词语所在位置。

Add & Normalize

Transformer 模块里经常出现 Add & Normalize。

Add 指残差连接。它把子层输入和子层输出相加,有助于缓解深层网络训练中的梯度问题。

Normalize 指归一化。它用于稳定数值分布,让训练过程更平稳。

输出 = LayerNorm(输入 + 子层输出)

这种结构在注意力层和前馈网络后都会出现。

Feed Forward 层负责非线性变换

注意力层主要负责信息交互,Feed Forward 层负责对每个位置的表示做进一步变换。

它通常由两个线性层和一个激活函数组成:

FFN(x) = max(0, xW1 + b1)W2 + b2

虽然结构不复杂,但它能提升模型的表达能力。

Decoder 为什么需要 Mask

Decoder 在生成文本时不能提前看到未来 token。比如生成第 3 个词时,只能使用前 1、2 个词的信息。

因此 Decoder 使用 Masked Multi-Head Attention,把未来位置遮住,避免模型偷看答案。

常见 Mask 包括:

Mask 类型 作用
Padding Mask 遮住补齐用的 padding token
Sequence Mask 遮住未来 token

Encoder 主要需要处理 padding mask;Decoder 同时需要处理 padding mask 和 sequence mask。

输出层如何生成结果

Decoder 输出的向量会经过线性层和 softmax,转换成词表上的概率分布。

Decoder 输出 -> Linear -> Softmax -> 下一个 token 概率

生成时,模型会根据概率选择下一个 token,再继续生成后续内容。

Transformer 的优缺点

维度 表现
优点 并行计算能力强,能捕捉长距离依赖,适合大规模训练
缺点 注意力计算开销随序列长度增长,对显存和算力要求较高

Transformer 的成功来自结构上的取舍:它放弃了顺序递归,换来了更强的并行能力和上下文建模能力。

Self-Attention 的简化实现

下面的示例只保留关键计算过程:

import torch
import torch.nn.functional as F

x = torch.randn(3, 4)

W_q = torch.randn(4, 4)
W_k = torch.randn(4, 4)
W_v = torch.randn(4, 4)

Q = x @ W_q
K = x @ W_k
V = x @ W_v

scores = Q @ K.T / (K.shape[-1] ** 0.5)
weights = F.softmax(scores, dim=-1)
output = weights @ V

print(output)

这段代码对应的是:生成 Q、K、V,计算注意力分数,经过 softmax 得到权重,再对 V 加权求和。

小结

Transformer 的核心是自注意力机制。它通过 Q、K、V 计算 token 之间的关联,再配合多头注意力、位置编码、残差连接、归一化、前馈网络和 Mask,完成序列建模。

理解 Transformer,不必一开始就陷入所有公式。先抓住“每个 token 根据上下文重新组织自己的表示”这条主线,后面的结构会清晰很多。

YL

我是姚磊

大模型应用开发者,关注 RAG、Agent 和产品化工程。沉淀实践中的判断、踩坑记录和可复用方法。联系我:yaolei_agent@163.com

LLM AppsRAGProductEngineering Notes