← Back to blog

从零训练一个LLM的全流程

#llm

三个主要阶段,涵盖了数据处理、架构编写、预训练以及两种微调方式。以下是整个全流程的详细总结:

第一阶段:构建LLM架构与数据准备:在这个阶段,目标是从头实现模型所需的所有底层代码,使其能够接受文本输入并具备生成文本的架构基础。

  • 第1步:数据准备与采样 (Data Preparation)。由于神经网络无法直接处理文本,需要先对数据进行处理。首先通过BPE(字节对编码)分词器将文本切割成词元(Tokens),并转换为对应的词元ID。接着,将词元ID转换为词元嵌入向量(Token Embeddings),并加入位置嵌入(Positional Embeddings)以保留词序信息。最后,使用滑动窗口的方法对文本进行采样,构建用于“预测下一个词”任务的输入与目标数据对。
  • 第2步:编写注意力机制 (Attention Mechanism)。注意力机制是Transformer架构的核心。流程从最简单的自注意力机制开始,引入查询(Query)、键(Key)和值(Value)的可训练权重矩阵。为了适用于文本生成的任务,必须加入因果注意力掩码(Causal Attention Mask),以隐藏未来的词元,确保模型只能根据过去的词来预测下一个词。为了防止过拟合加入Dropout掩码后,进一步将其扩展为多头注意力机制(Multi-head Attention),使得模型能并行关注输入数据的不同特征。
  • 第3步:实现完整的GPT架构 (LLM Architecture)。将注意力机制与其他的深度学习组件组装起来。这包括层归一化(Layer Normalization)以稳定训练、引入带有GELU激活函数的前馈神经网络,以及添加有助于深层网络梯度传播的捷径连接(Shortcut Connections)。将这些组件组合成一个Transformer块,并多次堆叠,最终构建出一个完整的类GPT模型架构。

第二阶段:在无标签数据上进行预训练 (Pretraining):在这个阶段,模型将学习语言的规律,从一个随机初始化的网络变成一个能生成连贯文本的基础模型(Foundation Model)。

  • 第4步:实施预训练与评估 (Pretraining)。通过自监督学习,模型在大规模无标签文本上进行训练,训练目标是使其能够准确预测序列中的下一个词。在这个过程中,通过计算交叉熵损失(Cross Entropy Loss)来持续监控模型在训练集和验证集上的表现。
  • 第5步:文本解码策略与权重加载。为了控制模型生成文本的多样性和创造性,避免输出固定死板的文字,流程中引入了温度缩放(Temperature Scaling)和Top-k采样(Top-k Sampling)等解码策略。

第三阶段:针对特定任务进行微调 (Fine-tuning):得到预训练的基础模型后,模型仅具备基本的文本续写能力。需要通过微调让它适应特定任务。书中展示了两种最常见的微调范式:

  • 第6步:分类微调 (Classification Fine-tuning)。通过微调让模型学会对文本进行分类(例如识别垃圾短信)。这需要修改模型架构,将模型原本用于预测庞大词汇表中下一个词的输出层,替换为一个节点数极少的新输出层(例如针对“垃圾”和“非垃圾”两个类别仅设置两个节点)。模型在带有真实标签的数据集上训练后,只能输出这几个特定类别的预测结果。
  • 第7步:指令遵循微调 (Instruction Fine-tuning)。为了让模型能够像ChatGPT一样理解并响应人类的具体要求(如“请把这句话改成被动语态”),需要进行监督指令微调。这要求使用包含“指令-输入-输出”结构的数据集(例如Alpaca格式)。在处理批次数据时,会使用特殊的占位符(如 -100)来掩蔽填充词元和指令本身,确保模型在计算损失时完全聚焦于如何生成正确的响应内容。
  • 第8步:模型评估与高效微调。对于指令微调后的模型,可以通过调用另一个能力更强的外部LLM(例如本地运行的Llama 3)对生成的响应进行打分和自动化评估。高效fine-tuning,比如LoRA(低秩自适应)技术,通过仅更新模型中极少量的参数(插入A、B小矩阵),实现参数高效微调,大幅降低普通人在消费级硬件上微调大模型的成本。