2018年以前,做一个情感分析要标注1万条数据;GPT说:不用,让模型先“读完”互联网

一句话先睹为快:GPT不是Transformer架构的简单复用,而是一场以“Decoder-Only + 因果语言建模”为核心的生成式AI范式革命——它舍弃了Transformer的编码器-解码器对称结构,仅保留解码器部分,用“预测下一个词”这一极其简洁的训练目标,通过海量无标注文本的预训练+少量有标注数据的微调,回答了深度学习领域一个根本性的问题:如果模型能够通过阅读互联网上的所有文本学会“理解”语言,那我们还需要为每个任务单独标注数据吗?

你有没有想过——

如果你在2018年之前做一个情感分析模型,你需要先收集1万条标注了“正面/负面”的影评,然后训练一个专用于情感分析的模型。如果你想再做一台机器翻译系统,你需要百万级对齐的双语语料,重新训练一个翻译模型。如果你想做一个问答系统,你需要再标注一批问答对,再训练一个问答模型。

每个任务都是独立的,每个任务都需要重新标注数据、重新训练模型。

你有没有想过——

为什么不能让模型先“读懂”语言,再针对具体任务做少量微调?

这正是GPT回答的问题。

2018年,OpenAI发表了论文《Improving Language Understanding by Generative Pre-Training》。论文的核心思想极其简洁:在大规模无标注文本上预训练一个语言模型(预测下一个词),然后在具体任务上用少量有标注数据进行微调。

这个“预训练+微调”的范式,彻底改变了NLP的研究范式。

GPT的原始版本只有1.17亿参数(来源:Radford et al., 2018)——在今天看来微不足道——但它证明了“无标注预训练”的有效性。2019年,GPT-2将参数规模扩大到15亿(来源:Radford et al., 2019),展示了零样本迁移的惊人能力。2020年,GPT-3将规模推至1750亿参数(来源:Brown et al., 2020),展示了少样本学习的能力。2023年,GPT-4据估计达到1.8万亿参数(来源:GPT-4 Technical Report, OpenAI, 2023),采用MoE(混合专家)架构,并具备了多模态能力。

截至2026年8月,GPT系列模型已演进至GPT-5,持续推动着生成式AI的边界。

那么,这个“Decoder-Only + 因果语言建模”的架构到底长什么样?为什么只用“预测下一个词”就能让模型学会理解语言?我们从论文、开源实现和Hugging Face Transformers库出发,一步步拆解。

一、先打个比方:GPT的训练就像让一个学生“先读万卷书,再专攻一个细分领域”

想象你要培养一个顶尖的金融分析师

传统的有监督学习(2018年之前) 像是把一个完全不懂金融的人直接扔进华尔街——你给他一堆标注好的“买入/卖出/持有”的历史数据(训练集),让他记住这些模式,然后在新的数据上做预测。他可能能完成任务,但他并不真正“理解”金融市场。他只是在做模式匹配,而且换一个任务(比如分析公司财报)就需要重新学一遍。

GPT的“预训练+微调”范式 则是先让这个学生读完人类历史上所有的金融书籍、财报、新闻、研报(无监督预训练)。在这个过程中,他学会了金融术语、理解了市场逻辑、掌握了分析框架。然后,你只需要给他少量标注好的“买入/卖出”案例(微调),他就能立刻成为顶尖的金融分析师——因为他已经“懂”了金融,只需要学会“如何把知识应用到具体任务上”。

预训练 = 读万卷书(理解语言);微调 = 行万里路(适应任务)。

GPT就是这么工作的。

二、核心问题:GPT凭什么比“为每个任务单独训练”更聪明?

传统方法的致命伤:每个任务都是一个“新世界”

在GPT出现之前,你做NLP任务的流程是这样的:

任务需要的数据训练方式
情感分析1万条标注影评从头训练一个分类模型
机器翻译百万级双语语料从头训练一个Seq2Seq模型
问答系统数千个问答对从头训练一个QA模型
命名实体识别标注了实体的人名/地名从头训练一个NER模型

每个任务都是从零开始。模型不会因为学会了情感分析就自动懂得翻译——因为它们是不同的模型、不同的训练数据、不同的目标函数。这个世界的知识是割裂的

GPT的杀手锏:先学会“理解语言”,再学会“完成任务”

GPT把问题拆成了两步:

第一步:无监督预训练 —— 学会“理解语言”

训练目标:给定前面的词,预测下一个词。

这个任务极其简单——小学生在语文课上做的“完形填空”。但这个任务也极其强大——为了做好这个任务,模型必须学会:

  • 词的共现关系(“麦当劳”常和“汉堡”“薯条”一起出现)
  • 语法结构(“我吃苹果”是对的,“我苹果吃”是错的)
  • 语义关联(“太阳”和“温暖”有关联)
  • 世界知识(“北京是中国的首都”)

模型通过阅读海量无标注文本(维基百科、新闻、书籍、网页)学会这一切。训练目标是最大化下一个词的预测概率:

L1(U)=∑ilog⁡P(ui∣ui−k,...,ui−1)L_1(U) = \sum_i \log P(u_i | u_{i-k}, ..., u_{i-1})L1(U)=ilogP(uiuik,...,ui1)

第二步:有监督微调 —— 学会“应用到具体任务”

在预训练完成后,模型已经是一个“语言理解专家”了。接下来只需要在具体任务的有标注数据上做少量微调——模型参数只做小幅更新,主要调整输出层。

关键洞察:微调所需的有标注数据远少于从头训练——因为模型已经“懂”了语言,只需要学会“如何把这种理解应用到我的任务上”。

三、一张图看懂GPT的架构:Decoder-Only

GPT与原始Transformer最大的区别是:它只用了解码器(Decoder),舍弃了编码器(Encoder)和交叉注意力(Cross-Attention)。

输入文本 → Tokenizer → Token IDs
    ↓
┌──────────────────────────────────────────────────────────────┐
│  Token Embedding(把词变成向量)+ Positional Embedding(注入位置)│
└──────────────────────────────────────────────────────────────┘
    ↓
┌──────────────────────────────────────────────────────────────┐
│               Transformer Decoder 层 × N                     │
│  ┌────────────────────────────────────────────────────────┐  │
│  │  Masked Multi-Head Self-Attention(★因果掩码)        │  │
│  │  每个token只能看到自己和之前的token,不能偷看未来     │  │
│  └────────────────────────────────────────────────────────┘  │
│  ┌────────────────────────────────────────────────────────┐  │
│  │  Feed-Forward Network(前馈网络)                     │  │
│  └────────────────────────────────────────────────────────┘  │
│  残差连接 + Layer Normalization(Pre-LN)                    │
└──────────────────────────────────────────────────────────────┘
    ↓
LM Head → Softmax → 下一个Token的概率分布
维度原始TransformerGPT(Decoder-Only)
架构Encoder + Decoder仅Decoder
注意力双向自注意力 + 掩码自注意力仅掩码自注意力
交叉注意力有(Decoder关注Encoder输出)
训练目标Seq2Seq(翻译等)因果语言建模(预测下一个词)

为什么舍弃Encoder? 因为GPT的目标不是“理解输入序列并生成输出序列”(如翻译),而是“根据已有文本预测下一个词”——这是一个纯粹的自回归生成任务,不需要双向编码上下文。

四、核心源码拆解:GPT的“灵魂三件套”

① 因果掩码(Causal Masking)——确保AI“不能偷看未来”

这是GPT与原始Transformer最核心的区别。因果自注意力通过一个上三角掩码矩阵,确保每个Token在计算注意力时只能看到自己和之前的位置。

# 文件路径:mingpt/model.py(minGPT实现,来源:github.com/karpathy/minGPT)

class CausalSelfAttention(nn.Module):
    def __init__(self, config):
        # ★ 因果掩码(上三角矩阵)
        self.register_buffer("bias", torch.tril(torch.ones(config.block_size, config.block_size))
                                     .view(1, 1, config.block_size, config.block_size))
    
    def forward(self, x):
        # 1. 计算 Q、K、V
        q, k, v = self.c_attn(x).split(self.n_embd, dim=2)
        # 2. 计算注意力分数
        att = (q @ k.transpose(-2, -1)) * (1.0 / math.sqrt(k.size(-1)))
        # 3. ★ 因果掩码:将未来位置的分数设为 -inf
        att = att.masked_fill(self.bias[:, :, :T, :T] == 0, float('-inf'))
        # 4. Softmax 得到注意力权重
        att = F.softmax(att, dim=-1)
        # 5. 加权求和
        return att @ v

这段代码实现了什么?

假设模型正在处理一个序列 ["我", "爱", "中国"]

  • 处理“我”时,只能看到“我”自己
  • 处理“爱”时,只能看到“我”和“爱”
  • 处理“中国”时,只能看到“我”、“爱”和“中国”

通过masked_fill将上三角(未来位置)的注意力分数设为-inf,Softmax后这些位置的权重变成0。模型在生成第t个Token时,完全不知道第t+1个Token是什么——和人类写作一样,一个字一个字地想,不能“跳着写”。

② minGPT:300行的GPT教学实现

Andrej Karpathy的minGPT是整个AI教育史上的一个里程碑——用300行代码完整实现了一个GPT语言模型。

mingpt/
├── model.py      # ★ Transformer模型定义(~300行)
├── bpe.py        # BPE分词器
└── trainer.py    # 训练循环(PyTorch模板代码)
# 文件路径:mingpt/model.py(结构示意)

class GPT(nn.Module):
    def __init__(self, config):
        # Token Embedding + Position Embedding
        self.tok_emb = nn.Embedding(config.vocab_size, config.n_embd)
        self.pos_emb = nn.Parameter(torch.zeros(1, config.block_size, config.n_embd))
        # Transformer Decoder层堆叠
        self.blocks = nn.Sequential(*[Block(config) for _ in range(config.n_layer)])
        # Layer Norm(Pre-LN)
        self.ln_f = nn.LayerNorm(config.n_embd)
        # LM Head:将隐藏状态映射回词表
        self.lm_head = nn.Linear(config.n_embd, config.vocab_size)

设计意图:minGPT的目标不是性能最优,而是可读性最优。学习者可以在一个下午读完所有代码,真正理解“一个语言模型到底是怎么工作的”。

③ Pre-LN(Layer Norm前置)——让模型能堆到100层

GPT-2相比GPT-1的一个关键架构变化是Layer Norm前置(Pre-LN)

class Block(nn.Module):
    def forward(self, x):
        # Pre-LN:先归一化,再计算
        x = x + self.attn(self.ln1(x))   # 残差连接
        x = x + self.mlp(self.ln2(x))
        return x

Pre-LN vs Post-LN:原始Transformer采用Post-LN(Layer Norm在子层之后),GPT-2开始采用Pre-LN(Layer Norm在子层之前)。Pre-LN的优势是训练更稳定——梯度可以直接通过残差连接传播,避免了深层网络中梯度消失的问题。这让GPT-2可以堆到48层,GPT-3可以堆到96层。

五、从1.17亿到1.8万亿:规模即能力

GPT系列模型的参数规模经历了指数级增长:

模型发布时间参数量层数上下文长度
GPT-12018年6月1.17亿12512
GPT-22019年2月15亿481024
GPT-32020年5月1750亿962048
GPT-42023年3月~1.8万亿12032K+

数据来源:OpenAI GPT系列论文及技术报告

GPT-4的MoE架构:GPT-4据估计采用MoE(Mixture of Experts,混合专家)架构,包含16个专家,每个专家约1110亿参数(来源:GPT-4 Technical Report, OpenAI, 2023)。推理时,每个Token只会被路由到部分专家——这大幅降低了推理成本。

关键洞察:GPT的演进历史表明——随着参数、数据和算力的增长,模型不断涌现出新的能力。从GPT-1的“预训练+微调”到GPT-2的“零样本”,再到GPT-3的“少样本学习(In-Context Learning)”,每一次规模跃升都带来了质的飞跃。

六、推理过程:从概率到文本

模型输出的只是概率分布(Logits),如何变成流畅的文本?这是一个“解码”的艺术。

输入 Prompt → Tokenizer → input_ids
    ↓
model.generate() 循环:
    ├── 前向传播 → 下一个Token的概率分布
    ├── 应用解码策略(Greedy / Beam Search / Top-k / Top-p)
    ├── 选择下一个Token
    ├── 将Token追加到序列
    └── 判断是否停止(达到max_length / 遇到EOS)
    ↓
输出 Token IDs → Tokenizer.decode() → 文本

常见解码策略

策略原理特点
Greedy每步选概率最高的Token最快,但容易重复
Beam Search维护K条候选序列质量更高,计算量大
Top-k Sampling从概率最高的k个Token中采样平衡多样性和质量
Top-p (Nucleus)从累积概率达p的最小集合中采样动态调整候选集

在Hugging Face Transformers中:

outputs = model.generate(
    input_ids,
    max_length=100,
    do_sample=True,       # 启用采样
    temperature=0.8,      # 控制随机性(越低越确定)
    top_k=50,            # Top-k
    top_p=0.95,          # Top-p (Nucleus)
    repetition_penalty=1.2,  # 防止重复
)

七、避坑指南:3个让GPT新手崩溃的陷阱

陷阱1:OOM(显存不足)

现象:加载大模型或处理长序列时显存溢出。

解决

  • 使用更小的模型(gpt2 而不是 gpt2-xl
  • 减小 max_lengthbatch_size
  • 启用梯度检查点
  • 使用混合精度(FP16/BF16)

陷阱2:生成文本重复

现象:模型陷入重复循环,不断输出相同内容。

原因:Greedy解码容易导致重复;模型的生成概率分布过于“尖锐”。

解决

outputs = model.generate(
    input_ids,
    repetition_penalty=1.2,   # 惩罚已生成的Token
    do_sample=True,            # 开启采样
    temperature=0.8,           # 增加随机性
)

陷阱3:Tokenizer不匹配

现象:加载预训练模型时报错,或生成的文本乱码。

原因:不同模型使用不同的Tokenizer,词表不匹配。

解决:始终使用与模型配套的Tokenizer:

# ✅ 正确
from transformers import AutoTokenizer, AutoModelForCausalLM
tokenizer = AutoTokenizer.from_pretrained("gpt2")
model = AutoModelForCausalLM.from_pretrained("gpt2")

# ❌ 错误:混用不同模型的Tokenizer和Model
# tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
# model = AutoModelForCausalLM.from_pretrained("gpt2")

写在最后

GPT的本质,不是一种“模型架构”,而是一种“学习范式”——用“预测下一个词”这个极其简单的训练目标,让模型从海量文本中自动学习语言的统计规律、语法结构、语义关联,甚至世界知识。

它回答了一个根本性的问题:如果模型能够通过阅读互联网上的所有文本学会“理解”语言,那我们还需要为每个任务单独标注数据吗?

GPT的答案是:不需要。

从2018年1.17亿参数的GPT-1,到2023年1.8万亿参数的GPT-4,这个“预训练+微调”的范式已经彻底改变了AI的发展轨迹。截至2026年8月,GPT系列模型已演进至GPT-5,持续推动着生成式AI的边界。

如果你想知道“大语言模型到底是怎么工作的”,从读懂mingpt/model.py那300行代码开始。

关注我们,获取更多AI技术深度解读和工程实践案例。

如您所在的企业正面临AI技术选型、大模型应用落地或系统架构设计的挑战,欢迎进一步沟通。我们可提供针对贵企业具体场景的定制化方案和现场调研服务。

数据来源:OpenAI GPT系列论文(Radford et al., 2018;Radford et al., 2019;Brown et al., 2020)、GPT-4 Technical Report(OpenAI, 2023)、minGPT与nanoGPT开源实现(github.com/karpathy)、Hugging Face Transformers文档(截至2026年8月)

Logo

AtomGit AI 社区提供模型库、数据集、Agent、Token等资源

更多推荐