深度解析:从零构建 GPT 模型的全流程指南
基于 Sebastian Raschka 原著 | HTML5 交互版
本章介绍了大语言模型(LLMs)的基本概念,重点阐述了 Transformer 架构如何通过大规模数据集训练,从专注于特定任务的模型演变为通用的文本生成器。
现代 LLM 的基石。包含编码器(Encoder)和解码器(Decoder)。GPT 仅使用了 Decoder 部分,专注于生成任务。
第一阶段训练。在海量未标记文本上进行自监督学习,让模型理解语言结构和世界知识。产出“基座模型”。
第二阶段训练。在较小的标记数据集上训练,使模型适应特定任务(如分类)或遵循指令(如聊天)。
神经网络无法直接理解文本。本章详细讲解了将文本转换为模型可读数值向量的完整流程。
将文本拆分为更小的单元(Token)。可以是单词、字符或子词。BPE 是目前主流的子词分词算法。
将离散的 Token ID 映射为连续的向量空间。相似语义的词在向量空间中距离更近。
由于自注意力机制不包含序列顺序信息,必须向 Embedding 中加入位置向量,让模型知道词的顺序。
这是 LLM 的核心。本章从零实现了自注意力机制,解释了模型如何理解上下文中词与词之间的关系。
通过 Query(查询), Key(键), Value(值) 三个矩阵计算。公式:softmax(QK^T / √d)V。
在 GPT(解码器)中至关重要。通过掩盖矩阵的上三角,确保模型在预测时只能“看到”过去的词,不能偷看未来。
并行运行多个自注意力机制。每个“头”可以关注输入数据的不同方面(如语法、语义、韵律等)。
本章将前面的组件组装成一个完整的 GPT 架构。构建了 Transformer Block,这是模型深度的来源。
将层激活值标准化为均值0、方差1。有助于稳定深层神经网络的训练过程。
GPT 使用的高斯误差线性单元。相比 ReLU,它在零点附近更平滑,允许微小的负值梯度传播。
将层的输入直接加到输出上。解决了深层网络中的梯度消失问题,是训练深度模型的关键。
实施训练循环。本章涵盖了损失计算、反向传播以及如何加载 OpenAI 的预训练权重以避免从头训练的巨大成本。
衡量模型预测的概率分布与实际下一个词之间的差异。训练目标是最小化这个损失。
控制文本生成的随机性。Temperature 控制概率分布的平滑度;Top-k 限制采样范围,避免生成离谱的词。
训练 LLM 的标准优化器。它是 Adam 算法的变体,改进了权重衰减(Weight Decay)的处理方式。
展示了如何将生成式模型转化为分类器(例如垃圾邮件检测)。这是迁移学习的一个典型应用。
替换掉原来用于预测下一个 Token 的线性层。新的层输出维度等于分类任务的类别数。
由于因果注意力机制,序列中的最后一个 Token 聚合了整个句子的信息,因此通常使用最后一个 Token 的输出来做分类预测。
这是让 LLM 变成聊天机器人(如 ChatGPT)的关键步骤。通过特定的数据格式训练模型遵循人类指令。
一种标准的指令微调数据结构。训练时将指令和输入作为 Prompt,要求模型预测 Response。
训练时,通常只计算“回答”部分的损失,而忽略“指令”部分的损失。因为我们要模型学习如何回答,而不是复述问题。
评估生成质量很难。本章使用更强大的模型(如 Llama 3)来自动评分微调后小模型的回答质量。
补充了 PyTorch 基础,以及更高级的训练技巧和参数高效微调方法。
Parameter-Efficient Fine-Tuning 技术。冻结原模型权重,只训练小的低秩矩阵(A和B)。大幅降低显存需求。
PyTorch 的核心。通过构建计算图,自动计算梯度,使得反向传播(Backpropagation)变得极其简单。
训练技巧。限制梯度的最大范数,防止“梯度爆炸”,确保训练过程的稳定性。