Build a LLM (From Scratch)

深度解析:从零构建 GPT 模型的全流程指南

基于 Sebastian Raschka 原著 | HTML5 交互版

第一章:理解大语言模型

本章介绍了大语言模型(LLMs)的基本概念,重点阐述了 Transformer 架构如何通过大规模数据集训练,从专注于特定任务的模型演变为通用的文本生成器。

核心观点: LLM 的本质是“预测下一个词”(Next-token Prediction)。尽管任务简单,但在海量数据和参数规模下,涌现出了翻译、推理等复杂能力。

Transformer 架构

悬停/点击翻转查看详情

现代 LLM 的基石。包含编码器(Encoder)和解码器(Decoder)。GPT 仅使用了 Decoder 部分,专注于生成任务。

预训练 (Pretraining)

悬停/点击翻转查看详情

第一阶段训练。在海量未标记文本上进行自监督学习,让模型理解语言结构和世界知识。产出“基座模型”。

微调 (Fine-tuning)

悬停/点击翻转查看详情

第二阶段训练。在较小的标记数据集上训练,使模型适应特定任务(如分类)或遵循指令(如聊天)。

第二章:处理文本数据

神经网络无法直接理解文本。本章详细讲解了将文本转换为模型可读数值向量的完整流程。

事实: GPT 类模型通常使用 BPE (Byte Pair Encoding) 分词器,它能在词汇表大小和处理未登录词(Unknown words)之间取得平衡。

Tokenization (分词)

悬停/点击查看

将文本拆分为更小的单元(Token)。可以是单词、字符或子词。BPE 是目前主流的子词分词算法。

Embedding (嵌入)

悬停/点击查看

将离散的 Token ID 映射为连续的向量空间。相似语义的词在向量空间中距离更近。

Positional Encoding

位置编码

由于自注意力机制不包含序列顺序信息,必须向 Embedding 中加入位置向量,让模型知道词的顺序。

第三章:编写注意力机制

这是 LLM 的核心。本章从零实现了自注意力机制,解释了模型如何理解上下文中词与词之间的关系。

核心概念: 注意力机制允许模型在生成当前词时,“回顾”输入序列中的所有其他词,并根据相关性分配不同的权重。

Self-Attention

自注意力

通过 Query(查询), Key(键), Value(值) 三个矩阵计算。公式:softmax(QK^T / √d)V。

Causal Masking

因果掩码

在 GPT(解码器)中至关重要。通过掩盖矩阵的上三角,确保模型在预测时只能“看到”过去的词,不能偷看未来。

Multi-Head Attention

多头注意力

并行运行多个自注意力机制。每个“头”可以关注输入数据的不同方面(如语法、语义、韵律等)。

第四章:从零实现 GPT 模型

本章将前面的组件组装成一个完整的 GPT 架构。构建了 Transformer Block,这是模型深度的来源。

架构细节: 现代 GPT 架构通常采用 Pre-LayerNorm(即在注意力层和前馈层之前进行归一化),这比原始 Transformer 的 Post-LayerNorm 训练更稳定。

Layer Normalization

层归一化

将层激活值标准化为均值0、方差1。有助于稳定深层神经网络的训练过程。

GELU Activation

激活函数

GPT 使用的高斯误差线性单元。相比 ReLU,它在零点附近更平滑,允许微小的负值梯度传播。

Skip Connections

残差连接

将层的输入直接加到输出上。解决了深层网络中的梯度消失问题,是训练深度模型的关键。

第五章:在无标签数据上预训练

实施训练循环。本章涵盖了损失计算、反向传播以及如何加载 OpenAI 的预训练权重以避免从头训练的巨大成本。

关键步骤: 预训练是非常昂贵的。为了教学目的,书中在小数据集上演示流程,然后通过加载 OpenAI 开源的 GPT-2 权重来获得强大的基座能力。

Cross-Entropy Loss

交叉熵损失

衡量模型预测的概率分布与实际下一个词之间的差异。训练目标是最小化这个损失。

Decoding Strategies

解码策略

控制文本生成的随机性。Temperature 控制概率分布的平滑度;Top-k 限制采样范围,避免生成离谱的词。

AdamW Optimizer

优化器

训练 LLM 的标准优化器。它是 Adam 算法的变体,改进了权重衰减(Weight Decay)的处理方式。

第六章:分类任务微调

展示了如何将生成式模型转化为分类器(例如垃圾邮件检测)。这是迁移学习的一个典型应用。

技术要点: 对于分类任务,我们需要替换模型的输出层(Output Head)。从预测 50257 个词的概率,变为预测 2 个类别(垃圾/非垃圾)的概率。

Classification Head

分类头

替换掉原来用于预测下一个 Token 的线性层。新的层输出维度等于分类任务的类别数。

Last Token Strategy

最后Token策略

由于因果注意力机制,序列中的最后一个 Token 聚合了整个句子的信息,因此通常使用最后一个 Token 的输出来做分类预测。

第七章:指令微调 (Instruction Tuning)

这是让 LLM 变成聊天机器人(如 ChatGPT)的关键步骤。通过特定的数据格式训练模型遵循人类指令。

数据格式: 通常采用 Alpaca 风格:包括 Instruction(指令)、Input(可选输入)和 Response(回答)。

Alpaca Format

Alpaca 格式

一种标准的指令微调数据结构。训练时将指令和输入作为 Prompt,要求模型预测 Response。

Loss Masking

损失掩码

训练时,通常只计算“回答”部分的损失,而忽略“指令”部分的损失。因为我们要模型学习如何回答,而不是复述问题。

LLM as a Judge

以模型评测模型

评估生成质量很难。本章使用更强大的模型(如 Llama 3)来自动评分微调后小模型的回答质量。

附录 & 高级技术

补充了 PyTorch 基础,以及更高级的训练技巧和参数高效微调方法。

LoRA

低秩自适应

Parameter-Efficient Fine-Tuning 技术。冻结原模型权重,只训练小的低秩矩阵(A和B)。大幅降低显存需求。

Automatic Differentiation

自动微分 (Autograd)

PyTorch 的核心。通过构建计算图,自动计算梯度,使得反向传播(Backpropagation)变得极其简单。

Gradient Clipping

梯度裁剪

训练技巧。限制梯度的最大范数,防止“梯度爆炸”,确保训练过程的稳定性。

原文

源链接