30秒快速回答: Transformer 是 Google 在 2017 年论文《Attention Is All You Need》中提出的神经网络架构。它用「自注意力机制」替代了传统的 RNN/LSTM,让模型能并行处理整个序列,训练速度提升数十倍。今天所有主流大模型——GPT 系列、Claude、Gemini、LLaMA、DeepSeek——都建立在 Transformer 架构之上。理解 Transformer,就理解了大模型世界的「通用语言」。


为什么 Transformer 是革命性的?

在 Transformer 之前,处理文本的主流方案是 RNN(循环神经网络)和 LSTM:

RNN 方式(串行):
「我 爱 北京 天安门」
  ↓  ↓   ↓    ↓
  h1→h2→h3  →h4    ← 必须按顺序处理,无法并行

RNN 的核心问题是:

  1. 不能并行:必须一个一个词处理,训练极慢
  2. 长距离遗忘:处理到第 100 个词时,第 1 个词的影响已经很小了
  3. 梯度消失/爆炸:深层网络训练不稳定

Transformer 用「自注意力」一举解决了这三个问题:

Transformer 方式(并行):
「我 爱 北京 天安门」
  ↓  ↓   ↓    ↓
  ┌──────────────┐
  │  自注意力层   │  ← 每个词同时看所有词,完全并行
  └──────────────┘
  ↓  ↓   ↓    ↓

自注意力机制:Transformer 的灵魂

直觉理解

想象你在读一句话:「吃了鱼,因为它饿了。」

当模型处理「它」这个词时,需要知道「它」指的是「猫」还是「鱼」。自注意力机制让「它」去「注视」句子中的每个词,发现「猫」与「它」的关联最强。

「它」对每个词的注意力权重:
  猫:  0.89  ← 最高,所以「它」指的是猫
  吃了:0.02
  鱼:  0.05
  因为:0.01
  饿了:0.03

数学原理(三步走)

自注意力本质上是三次矩阵运算:

Step 1: 每个词生成三个向量
  输入向量 x
    ├── 乘以 W_Q → Query(查询:我在找什么?)
    ├── 乘以 W_K → Key(键:我能提供什么?)
    └── 乘以 W_V → Value(值:我的实际内容是什么?)

Step 2: 计算注意力分数
  Score = Q × K^T / √d_k
  (查询与所有键的点积,除以维度平方根做缩放)

Step 3: 加权求和
  Attention = Softmax(Score) × V
  (用归一化后的分数对 Value 加权求和)

图示:一个词的完整旅程

输入: 「我 爱 AI」
  ↓ 词嵌入 (Embedding)
[0.12, -0.45, 0.78, ...]  每个词 → 512 维向量
  ↓ + 位置编码 (Positional Encoding)
[0.15, -0.42, 0.81, ...]  加上位置信息
  ↓ 自注意力 (Self-Attention)
[0.23, -0.31, 0.65, ...]  融入上下文的表示
  ↓ 前馈网络 (Feed Forward)
[0.19, -0.28, 0.71, ...]  非线性变换
  ↓ 输出
每个词的新向量中包含了整句话的信息

Encoder-Decoder:完整的 Transformer 结构

原始 Transformer 由编码器(Encoder)和解码器(Decoder)两部分组成:

        ┌──────────────────┐
        │   输出:「AI」    │
        └────────▲─────────┘
                 │
    ┌────────────┴────────────┐
    │       Decoder × N       │
    │  ┌───────────────────┐  │
    │  │ Masked Self-Attn  │  │  ← 只看已生成的词
    │  │ Cross-Attention    │  │  ← 看 Encoder 的输出
    │  │ Feed Forward      │  │
    │  └───────────────────┘  │
    └────────────▲────────────┘
                 │
    ┌────────────┴────────────┐
    │       Encoder × N       │
    │  ┌───────────────────┐  │
    │  │ Self-Attention    │  │  ← 每个词看所有词
    │  │ Feed Forward      │  │
    │  └───────────────────┘  │
    └────────────▲────────────┘
                 │
        「我 爱 AI !」

Encoder(编码器)的职责

  • 读入整个输入序列
  • 通过自注意力理解词与词之间的关系
  • 输出包含上下文信息的表示

Decoder(解码器)的职责

  • 逐词生成输出
  • Masked Self-Attention:生成第 N 个词时只能看到前 N-1 个词(防止「作弊」)
  • Cross-Attention:生成时参考 Encoder 的完整理解

GPT 与 BERT:Transformer 的两大分支

2018 年,OpenAI 和 Google 分别对原始 Transformer 做了不同的「截取」,形成了两大流派:

原始 Transformer
    ├── Encoder + Decoder(完整版,用于翻译)
    │
    ├── 只用 Decoder → GPT 系列
    │   特点:单向(从左到右),自回归生成
    │   擅长:文本生成、对话、代码补全
    │   代表:GPT-4o, GPT-5.6, LLaMA, DeepSeek
    │
    └── 只用 Encoder → BERT 系列
        特点:双向(同时看左右),理解型
        擅长:文本分类、命名实体识别、情感分析
        代表:BERT, RoBERTa, DeBERTa
维度 GPT(Decoder-only) BERT(Encoder-only)
阅读方向 单向(左→右) 双向(左右同时)
训练目标 预测下一个词 预测被遮住的词(MLM)
核心能力 生成 理解
代表任务 对话、写作、代码 分类、NER、问答
2026 年地位 绝对主流 垂类任务仍在使用

为什么 GPT 架构成了主流? 因为「生成」是比「理解」更通用的能力——一个会生成的模型也可以通过 prompt 来做理解任务,但理解型模型无法做生成。


实战:用 PyTorch 实现一个微型 Transformer

import torch
import torch.nn as nn
import math

class MultiHeadAttention(nn.Module):
    """多头注意力:自注意力的核心实现"""
    def __init__(self, d_model=512, n_heads=8):
        super().__init__()
        assert d_model % n_heads == 0
        self.d_model = d_model
        self.n_heads = n_heads
        self.d_k = d_model // n_heads

        # Q、K、V 的投影矩阵
        self.W_Q = nn.Linear(d_model, d_model)
        self.W_K = nn.Linear(d_model, d_model)
        self.W_V = nn.Linear(d_model, d_model)
        self.W_O = nn.Linear(d_model, d_model)

    def forward(self, x, mask=None):
        batch_size, seq_len, _ = x.shape

        # Step 1: 生成 Q、K、V
        Q = self.W_Q(x).view(batch_size, seq_len, self.n_heads, self.d_k).transpose(1, 2)
        K = self.W_K(x).view(batch_size, seq_len, self.n_heads, self.d_k).transpose(1, 2)
        V = self.W_V(x).view(batch_size, seq_len, self.n_heads, self.d_k).transpose(1, 2)

        # Step 2: 计算注意力分数
        scores = torch.matmul(Q, K.transpose(-2, -1)) / math.sqrt(self.d_k)

        if mask is not None:
            scores = scores.masked_fill(mask == 0, -1e9)

        # Step 3: Softmax + 加权求和
        attention = torch.softmax(scores, dim=-1)
        output = torch.matmul(attention, V)

        # 合并多头并投影
        output = output.transpose(1, 2).contiguous().view(batch_size, seq_len, self.d_model)
        return self.W_O(output)

class TransformerBlock(nn.Module):
    """一个 Transformer 层 = 自注意力 + 前馈网络"""
    def __init__(self, d_model=512, n_heads=8, d_ff=2048, dropout=0.1):
        super().__init__()
        self.attention = MultiHeadAttention(d_model, n_heads)
        self.norm1 = nn.LayerNorm(d_model)
        self.norm2 = nn.LayerNorm(d_model)
        self.ff = nn.Sequential(
            nn.Linear(d_model, d_ff),
            nn.ReLU(),
            nn.Linear(d_ff, d_model)
        )
        self.dropout = nn.Dropout(dropout)

    def forward(self, x, mask=None):
        # 自注意力 + 残差连接 + 层归一化
        attn_output = self.attention(x, mask)
        x = self.norm1(x + self.dropout(attn_output))

        # 前馈网络 + 残差连接 + 层归一化
        ff_output = self.ff(x)
        x = self.norm2(x + self.dropout(ff_output))
        return x

class MiniGPT(nn.Module):
    """一个极简的 GPT 风格 Transformer"""
    def __init__(self, vocab_size=10000, d_model=512, n_heads=8,
                 n_layers=6, max_len=1024):
        super().__init__()
        self.token_embedding = nn.Embedding(vocab_size, d_model)
        self.position_embedding = nn.Embedding(max_len, d_model)

        self.blocks = nn.ModuleList([
            TransformerBlock(d_model, n_heads) for _ in range(n_layers)
        ])
        self.ln_final = nn.LayerNorm(d_model)
        self.lm_head = nn.Linear(d_model, vocab_size)  # 预测下一个词

    def forward(self, token_ids):
        batch_size, seq_len = token_ids.shape

        # Token 嵌入 + 位置嵌入
        positions = torch.arange(seq_len, device=token_ids.device).unsqueeze(0)
        x = self.token_embedding(token_ids) + self.position_embedding(positions)

        # GPT 的因果掩码(每个位置只能看到之前的 Token)
        mask = torch.tril(torch.ones(seq_len, seq_len)).view(1, 1, seq_len, seq_len)

        for block in self.blocks:
            x = block(x, mask)

        x = self.ln_final(x)
        return self.lm_head(x)  # [batch, seq_len, vocab_size]

# 使用示例
model = MiniGPT(vocab_size=10000)
dummy_input = torch.randint(0, 10000, (2, 128))  # batch=2, seq_len=128
output = model(dummy_input)
print(f"输入形状: {dummy_input.shape}")   # [2, 128]
print(f"输出形状: {output.shape}")        # [2, 128, 10000]
print(f"参数量: {sum(p.numel() for p in model.parameters()) / 1e6:.1f}M")

输出:

输入形状: torch.Size([2, 128])
输出形状: torch.Size([2, 128, 10000])
参数量: 20.7M

输出的 [2, 128, 10000] 表示:对于 batch 中的 2 个样本,每个样本的 128 个位置,模型预测了词汇表中 10000 个词的概率分布——即「下一个词最可能是什么」。


为什么 Transformer 能 Scale?

Transformer 的成功不仅在于结构巧妙,更在于它天然适合大规模并行训练:

特性 RNN/LSTM Transformer
并行度 串行(O(n) 时间步) 完全并行(O(1) 时间步)
长距离依赖 通过隐藏状态传递(衰减) 直接注意力连接(无衰减)
显存效率 高(只需存当前状态) 低(需存注意力矩阵 O(n²))
扩展性 差(深层难训练) 极好(已验证至数千层)

Transformer 的 O(n²) 注意力计算是主要瓶颈,这也是 FlashAttention、稀疏注意力、Mamba(状态空间模型)等后续优化试图解决的问题。


常见问题

Q: Transformer 和 GPT 是一个东西吗?

不是。Transformer 是架构(图纸),GPT 是基于 Transformer 的一种具体实现(Decoder-only)。就像「内燃机」和「某款汽车」的关系。

Q: 位置编码为什么必要?

Transformer 的注意力机制不关心词的顺序——「A B C」和「C B A」对它来说是一样的输入集合。位置编码给每个词注入位置信息,让模型知道「谁在前谁在后」。

Q: 为什么现在主流都是 Decoder-only?

从工程角度看:Decoder-only 结构更简单(少一半参数)、训练更稳定(单向注意力的梯度流更好)、且 Scaling Law 验证充分。从能力角度看:生成能力可以覆盖理解任务,但反过来不行。

Q: Transformer 会被替代吗?

2026 年,Mamba、RWKV 等线性注意力架构在长序列场景下展现了优势,但在通用能力上仍未超越 Transformer。短期内,Transformer + 混合架构(如 Jamba:Transformer + Mamba)是更现实的方向。


下一步建议: 把本文中的 MiniGPT 代码复制到 Colab 运行,尝试改 n_layersn_heads 参数,观察参数量的变化。然后阅读原始论文《Attention Is All You Need》——只有 15 页,但奠定了整个大模型时代的基础。