《从零构建大模型》——从头实现GPT模型进行文本生成

总览

本章的核心目标是将第三章实现的注意力机制,扩展为一个完整、可运行的 GPT 类模型,并最终实现文本生成功能。整体逐层递进的知识脉络如下:

词嵌入→Transformer Block(多个堆叠)→输出层→文本生成

其中 Transformer Block 内部又包含四大关键组件:

  1. 层归一化(LayerNorm)------ 稳定训练
  2. 前馈网络(Feed Forward + GELU)------ 增加非线性表达能力
  3. 快捷连接(Shortcut Connection)------ 解决梯度消失
  4. 多头注意力(承接第三章)------ 捕捉上下文关系

最终,通过**自回归解码(贪心生成)**的方式,让训练好(或未训练)的模型逐词生成文本。

知识点详解

1.GPT整体架构设计

GPT 的整体结构可以概括为"配置字典 + 堆叠模块":

python 复制代码
GPT_CONFIG_124M = {
    "vocab_size": 50257,
    "context_length": 1024,
    "emb_dim": 768,
    "n_heads": 12,
    "n_layers": 12,
    "drop_rate": 0.1,
    "qkv_bias": False
}

关键点:

  • vocab_size:词表大小(决定输出层维度)
  • context_length:模型能处理的最大上下文长度
  • emb_dim:每个 token 的嵌入维度
  • n_layers:Transformer Block 堆叠的层数(越多,模型越深)

架构本质是:词嵌入 + 位置嵌入 → N 个相同结构的 TransformerBlock → 最终 LayerNorm → 线性输出层(映射到词表维度)

2.层归一化LayerNorm

作用:将每一层的输出归一化为均值 0、方差 1,防止梯度爆炸/消失,加速收敛。

公式:

x^i = xi−μ σ2+ϵ \hat{x}_i = \frac{x_i - \mu}{\sqrt{\sigma^2 + \epsilon}} x^i=σ2+ϵ xi−μ

yi=γ x^i +β y_i = \gamma \hat{x}_i + \beta yi=γx^i+β

其中:

  • μ,σ2\mu, \sigma^2 μ,σ2:该层输入在特征维度上的均值和方差
  • ϵ\epsilon ϵ:极小值,防止除零
  • γ,β\gamma, \beta γ,β:可学习的缩放和偏移参数

注意 :与 BatchNorm 不同,LayerNorm 是对每个样本的特征维度进行归一化,而不是对整个批次,因此更适合 NLP 中序列长度可变的场景。

3.前馈网络与GELU激活函数

前馈网络(FeedForward)结构:

FFN(x)=GELU(xW1+b1)W2+b2\text{FFN}(x) = \text{GELU}(xW_1 + b_1)W_2 + b_2 FFN(x)=GELU(xW1+b1)W2+b2

通常设计为"扩展-压缩"结构:先将维度扩大 4 倍,再压缩回原维度,增强模型的非线性表达能力。

GELU 激活函数公式(近似形式):

GELU(x)≈0.5x(1+tanh⁡ 2/π (x+0.044715x3) )\text{GELU}(x) \approx 0.5x\left(1 + \tanh\left\\sqrt{2/\\pi}\\left(x + 0.044715x\^3\\right)\\right\right) GELU(x)≈0.5x(1+tanh2/π (x+0.044715x3))

相比传统 ReLU,GELU 曲线更平滑,在负值区域也保留了少量梯度,在 Transformer 类模型中表现更优。

4.残差连接

核心思想:将输入直接加到子层输出上,形成"跳跃路径":

output=x+SubLayer(x)

为什么重要

  • 在深层网络中,反向传播时梯度容易随层数增加而衰减(梯度消失)
  • 残差连接为梯度提供了一条"直达通道",即使中间层梯度很小,梯度依然可以通过加法直接传回浅层
  • 这是 ResNet 思想在 Transformer 中的应用

5.Transformer Block组装

将前面所有组件按固定顺序拼接,形成一个完整的 Block:

text 复制代码
输入 x
  ├─→ LayerNorm → 多头注意力 → Dropout ──┐
  │                                      +(残差相加)
  └──────────────────────────────────────┘
  ├─→ LayerNorm → 前馈网络 → Dropout ────┐
  │                                      +(残差相加)
  └──────────────────────────────────────┘
输出

结构特点 :这是"Pre-LayerNorm"结构(先归一化再进入子层),比原始 Transformer 的"Post-LayerNorm"训练更稳定。每个 Block 都包含两次残差连接(分别包裹注意力层和前馈层)。

6.完整GPT模型

组装逻辑:

最终输出的是形状为 (batch, seq_len, vocab_size)logits(每个位置对词表中每个词的预测得分,尚未做 softmax)。

7.文本生成

生成过程是**自回归(Autoregressive)**的,核心循环逻辑:

python 复制代码
def generate_text_simple(model, idx, max_new_tokens, context_size):
    for _ in range(max_new_tokens):
        idx_cond = idx[:, -context_size:]      # 截取上下文窗口
        logits = model(idx_cond)               # 前向传播
        logits = logits[:, -1, :]              # 只取最后一个位置
        probas = torch.softmax(logits, dim=-1) # 转为概率分布
        idx_next = torch.argmax(probas, dim=-1, keepdim=True)  # 贪心解码
        idx = torch.cat((idx, idx_next), dim=1) # 拼接进序列
    return idx

关键机制解释

  • 每次只用最后一个 token 位置的输出来预测下一个词
  • 使用 argmax 做贪心搜索(每步都选概率最大的词,非最优但最简单)
  • 生成的新 token 会被拼接回输入序列,作为下一步预测的上下文(这就是"自回归"的含义)
  • 由于此时模型尚未训练,生成结果通常是语法混乱、无意义的文本------这也为第五章"训练 GPT 模型"埋下伏笔

总结

本章完成了从"注意力机制的零件"到"完整可运行模型"的关键跨越,核心收获可以归纳为三点:

组件 解决的问题
LayerNorm 稳定每层输出分布,加速训练收敛
GELU + FeedForward 增强模型非线性表达能力
残差连接 缓解深层网络梯度消失问题

逻辑链条 :嵌入层负责"输入编码",Transformer Block(注意力+前馈+归一化+残差)负责"特征提取与上下文融合",输出层负责"预测下一词",而生成函数则通过循环调用模型+贪心采样实现了逐词续写文本的能力。

⚠️ 需要特别注意的是:本章构建的模型权重是随机初始化的 ,因此生成的文本在语义上毫无意义。这正是为了引出后续章节的核心任务------如何通过预训练让这个"空壳"模型学会语言规律

相关推荐
武子康2 小时前
模型发布可以按天看,生产默认模型不能按天切:一套可回退的 30 天验收流程
人工智能·llm·agent
京东云开发者2 小时前
实测 9 款 AI 架构图工具:从 Mermaid 美化到 GPT-Image2,一份选型清单
gpt·ai编程·笔记测评
m沐沐3 小时前
【机器学习】DBSCAN聚类算法——原理、参数调优与实战
人工智能·python·深度学习·算法·机器学习·聚类·dbscan
手写码匠3 小时前
华为云征文|DeepSeek-R1 智能问数 Agent 实战:Flexus X 实例 + Dify 构建企业级 Text-to-SQL 查询助手
人工智能·深度学习·算法·aigc
CodeLinghu3 小时前
LangSmith Evaluate实战评估Agent
人工智能·python·语言模型·llm
donoot4 小时前
《大话文渊慧典》:六
人工智能·深度学习·aigc·ppstructure·文渊慧典·大话系列
过期的秋刀鱼!4 小时前
学习曲线-过拟合和欠拟合要做什么以及原因
人工智能·python·深度学习·算法·机器学习·模型评估
用户3126874877204 小时前
AI Agent 开发实战(九):Grill Me 反问式规划
llm·ai编程
武子康5 小时前
2026 年 7 月 AI 模型发布复盘:真正被比较的是整套工作系统
人工智能·llm·agent