1.1 What is an LLM?
Returning to the spam classification example, in traditional machine learning, human experts might manually extract features from email text such as the frequency of certain trigger words (for example, “prize,” “win,” “free”), the number of exclamation marks, use of all uppercase words, or the presence of suspicious links. This dataset, created based on these expert-defined features, would then be used to train the model. In contrast to traditional machine learning, deep learning does not require manual feature extraction. This means that human experts do not need to identify and select the most relevant features for a deep learning model. (However, both traditional machine learning and deep learning for spam classification still require the collection of labels, such as spam or non-spam, which need to be gathered either by an expert or users.)
回到垃圾邮件分类的例子,在传统机器学习中,人类专家可能会手动从电子邮件文本中提取特征,例如某些触发词的出现频率(如 “奖品”、“赢取”、“免费”)、感叹号的数量、全大写单词的使用情况,或可疑链接的存在。基于这些专家定义的特征创建的数据集随后将用于训练模型。
与传统机器学习不同,深度学习不需要手动提取特征。这意味着人类专家无需为深度学习模型识别和选择最相关的特征。(不过,用于垃圾邮件分类的传统机器学习和深度学习仍需要收集标签,如 “垃圾邮件” 或 “非垃圾邮件”,这些标签需要由专家或用户收集。)
1.2 Applications of LLMs
1.3 Stages of building and using LLMs
为什么我们要构建自己的大型语言模型(LLMs)?从头开始编写LLM的代码是理解其机制和局限性的绝佳实践。此外,这还能让我们掌握必要的知识,以便对现有的开源LLM架构进行预训练或微调,使其适配我们自己的领域特定数据集或任务。
注:如今大多数LLM都是使用PyTorch深度学习库实现的,我们也将使用该库。读者可在附录A中找到关于PyTorch的全面介绍。
研究表明,在建模性能方面,为特定任务或领域定制的LLM(如专为金融领域设计的BloombergGPT,以及针对医疗问答优化的LLM,详见附录B)能够超越通用型LLM(如ChatGPT提供的模型)。
使用定制化LLM具有多项优势,尤其是在数据隐私方面。例如,出于保密考虑,企业可能不愿与OpenAI等第三方LLM提供商共享敏感数据。此外,开发较小的定制化LLM可直接部署在客户设备(如笔记本电脑和智能手机)上,这正是苹果等公司目前在探索的方向。
这种本地化部署可显著降低延迟并减少服务器相关成本。此外,定制化LLM赋予开发者完全的自主权,允许他们根据需要控制模型的更新和修改。
创建LLM的一般流程包括预训练和微调。“预训练”中的“预”指的是初始阶段——在此阶段,类似LLM的模型会在大型多样化数据集上进行训练,以建立对语言的广泛理解。这个预训练后的模型将作为基础资源,通过微调进一步优化。微调是指在更狭窄的、针对特定任务或领域的数据集上对模型进行专门训练。图1.3展示了预训练和微调这一两阶段训练方法。
创建大型语言模型(LLM)的第一步是在大型文本语料库(有时称为原始文本)上对其进行训练。这里的“原始”指的是这些数据只是普通文本,不含任何标签信息。(可能会进行过滤,例如删除格式字符或未知语言的文档。)
注:具有机器学习背景的读者可能会注意到,传统机器学习模型和通过常规监督学习范式训练的深度神经网络通常需要标签信息。但大型语言模型(LLMs)的预训练阶段并非如此。在此阶段,LLMs使用自监督学习,即模型从输入数据中自行生成标签。
大型语言模型的这第一个训练阶段也被称为预训练,其目标是创建一个初始的预训练LLM,这类模型通常被称为基础模型。此类模型的一个典型例子是GPT-3模型(即ChatGPT原始模型的前身)。该模型能够完成文本补全任务——也就是说,它可以补全用户提供的未写完的句子。此外,它还具备有限的少样本学习能力,这意味着它只需基于少量示例即可学习执行新任务,而无需大量的训练数据。
在大型文本数据集上训练获得预训练大型语言模型(该模型通过训练以预测文本中的下一个词)后,我们可以在带标签的数据上进一步训练该模型,这一过程也称为微调。
大型语言模型(LLMs)的微调主要有两种最常见的类型:指令微调和分类微调。在指令微调中,带标签的数据集由指令和答案对组成,例如“翻译一段文本”的查询及其对应的正确翻译文本。在分类微调中,带标签的数据集由文本和相关的类别标签组成,例如标记为“垃圾邮件”和“非垃圾邮件”的电子邮件。
疑问-如果没有标签在训练什么
好的,我们来更全面系统地讲解一下这个问题:“如果没有标签,LLM 是怎么训练的?” ——也就是**自监督学习(self-supervised learning)**在大型语言模型中的应用。
🧠 一、机器学习的基本图式:有监督 vs. 自监督
1.1 有监督学习(Supervised Learning)
传统的监督学习是这样训练模型的:
输入(X) | 标签/目标(Y) |
---|---|
一张猫的图片 | “猫” |
一句英文:“I love cats.” | 中文翻译:“我爱猫。” |
模型需要大量 标注过的训练数据(输入 + 标签),才能学会映射关系。
1.2 自监督学习(Self-Supervised Learning)
自监督学习的关键在于:
从输入数据中“自动”构造出标签,不需要人工标注。
这种方式特别适合像文本这样天然结构丰富的数据。
📚 二、大型语言模型中的自监督学习
2.1 核心思想
给定一个完整的文本序列,把它人为地拆开成“输入 + 预测目标”。例如:
完整文本:今天我想吃一碗热腾腾的面。
我们可以让模型:
输入(Input) | 要预测的输出(Target) |
---|---|
今天我想吃一碗热腾腾的 | 面 |
你会发现,“标签”其实是从数据自身提取出来的,而不是人工注释的。
🏗 三、常见的自监督训练任务(语言建模任务)
3.1 因果语言建模(Causal Language Modeling,CLM)——GPT 类模型用的
根据前面的词预测下一个词。
训练过程示意:
- 文本序列:“我 喜欢 吃 苹果”
- 模型看到:“我” → 预测“喜欢”
- 模型看到:“我 喜欢” → 预测“吃”
- 模型看到:“我 喜欢 吃” → 预测“苹果”
🔄 这个过程可以用“滑动窗口”来理解,模型逐步往前读文本并预测下一个词。
3.2 掩码语言建模(Masked Language Modeling,MLM)——BERT 类模型用的
随机遮盖部分词语,让模型猜出来。
训练样例:
- 输入文本:“我 喜欢 [MASK] 苹果”
- 目标输出:“吃”
这样训练的模型学到的是词语之间的双向关系(前后都看)。
🧪 四、训练时到底在优化什么?
4.1 损失函数(Loss Function)
以预测下一个词为例,模型预测每个词的概率分布(softmax),真实词是“面”,目标是让这个词的概率尽可能高。
使用的损失通常是:
- 交叉熵损失(Cross Entropy Loss)
衡量预测分布和真实词的差异。
模型通过反向传播(backpropagation)调整参数,让预测越来越准。
🧰 五、为什么这种方式能学到语言能力?
这取决于语言的结构性与重复性。
-
语言有规律:语法、语义、上下文逻辑。
-
模型通过海量文本训练,学会了词的搭配、句子结构、逻辑关系等。
-
比如:
- “我喝了杯 [MASK]” → 牛奶、水、咖啡更可能
- “我写了封 [MASK]” → 信、邮件更可能
- “他昨天去了北京,今天他在 [MASK]” → 回来、天津、出差……
这种能力就是 LLM 最基础的“语言理解”和“生成”能力。
📊 六、总结图解
自监督学习过程简图
┌──────────────────────────────┐
│ 原始文本数据(没有标签) │
└──────────────────────────────┘
↓
构造预测任务(如遮盖词、预测下一个词)
↓
输入序列 → 目标词(伪标签)
↓
模型预测 + 损失函数
↓
反向传播更新参数(学习)
🧩 七、扩展理解
自监督学习不止用于语言,它也正在影响其他领域:
- 图像处理:遮住图像一部分让模型补全(如 MAE)
- 时间序列:预测未来数据点
- 音频建模:补全声音、识别缺失音节
1.4 Introducing the transformer architecture
大多数现代大型语言模型(LLMs)依赖于Transformer架构,这是一种深度神经网络架构,于2017年发表的论文《注意力就是你所需要的一切》(https://arxiv.org/abs/1706.03762)中首次提出。要理解大型语言模型,我们必须先了解最初用于机器翻译的Transformer架构——其最初用于将英语文本翻译为德语和法语。图1.4展示了Transformer架构的简化版本。
Transformer架构由两个子模块组成:编码器(encoder)和解码器(decoder)。编码器模块处理输入文本,并将其编码为一系列捕捉输入上下文信息的数值表示或向量。随后,解码器模块接收这些编码后的向量,并生成输出文本。例如,在翻译任务中,编码器会将源语言文本编码为向量,解码器则对这些向量进行解码,生成目标语言文本。编码器和解码器均由许多通过所谓的自注意力机制(self-attention mechanism)连接的层组成。
Transformer架构和大型语言模型(LLMs)的一个关键组件是自注意力机制(图中未显示),该机制使模型能够权衡序列中不同单词或标记之间的相对重要性。这种机制使模型能够捕捉输入数据中的长距离依赖关系和上下文关联,从而增强其生成连贯且符合语境的输出的能力。然而,由于其复杂性,我们将把进一步的解释推迟到第3章,在该章节中我们将逐步讨论并实现这一机制。
Transformer架构的后续变体(如BERT(Bidirectional Encoder Representations from Transformers的缩写,即双向编码器表征)和各种GPT模型(Generative Pretrained Transformers的缩写,即生成式预训练Transformer))均基于这一概念构建,旨在使该架构适应不同任务。如果感兴趣,可参考附录B获取进一步阅读建议。
BERT基于原始Transformer的编码器子模块构建,其训练方式与GPT不同。GPT旨在完成生成式任务,而BERT及其变体则专注于掩码词预测(masked word prediction)——即模型预测给定句子中被掩码或隐藏的词汇,如图1.5所示。这种独特的训练策略使BERT在文本分类任务中具备优势,包括情感预测和文档分类。截至撰写本文时,X(前身为Twitter)已将BERT应用于检测有害内容。
另一方面,GPT专注于原始Transformer架构的解码器部分,旨在完成需要生成文本的任务,包括机器翻译、文本摘要、小说创作、编写计算机代码等。
GPT模型主要被设计和训练用于执行文本补全任务,但其能力也展现出显著的多功能性。这些模型擅长执行零样本学习和少样本学习任务。零样本学习指的是在没有任何预先提供的特定示例的情况下,对完全未见过的任务进行泛化的能力。另一方面,少样本学习涉及从用户作为输入提供的极少量示例中进行学习,如图1.6所示。
如今的大型语言模型(LLMs)基于Transformer架构构建。因此,在文献中“Transformer”和“LLMs”这两个术语常被视为同义词。但需要注意的是,并非所有Transformer都是LLMs——因为Transformer架构也可用于计算机视觉领域;也不是所有LLMs都基于Transformer——部分LLMs依赖循环神经网络(RNN)或卷积神经网络(CNN)架构。这些替代方案的核心动机是提升LLMs的计算效率。不过,这些非Transformer的LLM架构能否与基于Transformer的模型性能抗衡,以及能否在实际应用中被广泛采用,仍有待观察。
为简化表述,本书中“LLM”一词特指类似GPT的基于Transformer的大型语言模型。(感兴趣的读者可在附录B中找到描述这些架构的文献参考。)
1.5 Utilizing large datasets
类似GPT和BERT的热门模型所使用的大型训练数据集代表了多样且全面的文本语料库,包含数十亿词汇,涵盖大量主题以及自然语言和计算机语言。举个具体的例子,表1.1总结了用于预训练GPT-3的数据集,该模型是第一版ChatGPT的基础模型。
表1.1列出了the number of tokens,其中“token”是模型读取的文本单位,数据集中的the number of tokens大致相当于文本中的单词和标点符号数量。第2章将讨论标记化——将文本转换为标记的过程。
主要结论是,这种训练数据集的规模和多样性使这些模型能够在各种任务中表现出色,包括语言句法、语义和上下文理解——甚至是一些需要常识的任务。
GPT-3数据集详情
表1.1展示了GPT-3使用的训练数据集。表格中“比例”列的总和为抽样数据的100%(已调整四舍五入误差)。尽管“标记数量”列中的子集总和为4990亿,但模型仅使用了3000亿标记进行训练。GPT-3论文的作者并未说明为何未使用全部4990亿标记。
作为参考,仅CommonCrawl数据集的规模就包含4100亿标记,需要约570 GB的存储空间。相比之下,后续类似GPT-3的模型(如Meta的LLaMA)已将训练范围扩展到包含Arxiv研究论文(92 GB)和StackExchange代码相关问答(78 GB)等额外数据源。
GPT-3论文的作者未公开训练数据集,但Soldaini等人于2024年发布的《Dolma:用于LLM预训练研究的三万亿标记开放语料库》(https://arxiv.org/abs/2402.00159)是一个可公开获取的类似数据集。然而,该语料库可能包含受版权保护的作品,其确切使用条款可能取决于预期用例和所在国家/地区。
这些模型的预训练特性使其在下游任务的进一步微调中具有极强的通用性,这也是它们被称为基础模型的原因。预训练大型语言模型需要大量资源,成本极高。例如,仅就云计算资源而言,GPT-3的预训练成本估计达460万美元(https://mng.bz/VxEW)。
好消息是,许多作为开源模型提供的预训练大型语言模型(LLMs)可以用作通用工具,用于撰写、提取和编辑训练数据之外的文本。此外,大型语言模型可以通过相对较小的数据集针对特定任务进行微调,这既减少了所需的计算资源,又能提升性能。
我们将实现用于预训练的代码,并将其用于教育目的的大型语言模型(LLM)预训练。所有计算均可在消费级硬件上执行。在实现预训练代码后,我们将学习如何复用公开可用的模型权重并将其加载到我们实现的架构中,这样在对LLM进行微调时就可以跳过成本高昂的预训练阶段。
1.6 A closer look at the GPT architecture
下一词预测任务是自我监督学习的一种形式,这是一种自我标记的方式。这意味着我们无需为训练数据显式收集标签,而是可以利用数据本身的结构:我们可以将句子或文档中的下一个词用作模型需要预测的标签。由于这种下一词预测任务使我们能够“即时”创建标签,因此可以使用海量未标记文本数据集来训练大型语言模型。
与我们在1.4节中讨论的原始Transformer架构相比,通用的GPT架构相对简单。从本质上讲,它只是不含编码器的解码器部分(图1.8)。由于像GPT这样的解码器风格模型通过逐词预测来生成文本,因此它们被视为自回归模型的一种。自回归模型会将先前的输出作为未来预测的输入。因此,在GPT中,每个新生成的单词都是基于其前面的序列选择的,这提高了生成文本的连贯性。
像GPT-3这样的架构也比原始的Transformer模型大得多。例如,原始Transformer将编码器和解码器模块重复了六次,而GPT-3则包含96个Transformer层,总参数达1750亿个。
GPT-3于2020年推出,以深度学习和大型语言模型开发的标准来看,这已经是相当久之前的事了。然而,像Meta的Llama模型等较新的架构仍基于相同的基础概念,仅进行了细微修改。因此,理解GPT的重要性从未减退,因此我将重点介绍GPT背后的核心架构,同时指出其他大型语言模型所采用的特定调整方法。
尽管最初专为语言翻译设计的原始Transformer模型由编码器和解码器模块组成,但GPT模型——虽然采用了更简单的仅解码器架构(旨在完成下一词预测任务)——同样能够执行翻译任务。这种能力最初出乎研究人员的意料,因为它源自一个主要针对下一词预测任务训练的模型,而该任务并非专门针对翻译设计。
模型执行其未被明确训练过的任务的能力被称为涌现行为。这种能力并非在训练过程中被显式教授,而是模型在多样化语境中接触海量多语言数据后自然产生的结果。尽管GPT模型并未针对翻译任务进行专门训练,却能够“学习”语言之间的翻译模式并执行翻译任务,这一事实彰显了这些大规模生成式语言模型的优势与能力——我们无需为每项任务使用不同的模型,即可完成多样化的任务。
1.7 Building a large language model
既然我们已经为理解大型语言模型(LLMs)奠定了基础,现在让我们从零开始编写一个模型。我们将以GPT背后的基本思想为蓝图,分三个阶段完成这项工作,如图1.9所示。
在第一阶段,我们将学习基本的数据预处理步骤,并为每个大型语言模型的核心——注意力机制编写代码。接下来,在第二阶段,我们将学习如何编写代码并预训练一个类似GPT的大型语言模型,使其能够生成新文本。我们还将介绍评估大型语言模型的基础知识,这对于开发有能力的自然语言处理系统至关重要。
从头开始预训练一个大型语言模型(LLM)是一项艰巨的任务,对于类似GPT的模型来说,需要数千到数百万美元的计算成本。因此,第二阶段的重点是使用小型数据集进行用于教育目的的训练实现。此外,我还提供了加载公开可用模型权重的代码示例。
最后,在第三阶段,我们将使用一个预训练的大型语言模型(LLM)并对其进行微调,使其能够遵循指令(例如回答查询或对文本进行分类)——这些都是许多实际应用和研究中最常见的任务。
总结
- 大型语言模型(LLMs)已经彻底改变了自然语言处理领域——该领域此前主要依赖显式的基于规则的系统和较为简单的统计方法。大型语言模型的出现引入了全新的深度学习驱动方法,推动了人类语言理解、生成和翻译等领域的进步。
- 现代大型语言模型的训练主要分为两个步骤:
- 首先,通过将句子中的下一词预测作为标签,在大规模无标注文本语料库上进行预训练。
- 然后,在较小的有标注目标数据集上进行微调,以遵循指令或执行分类任务。
- 大型语言模型基于Transformer架构,其核心思想是注意力机制——当模型逐词生成输出时,该机制使大型语言模型能够有选择地访问整个输入序列的信息。
- 原始Transformer架构包含用于解析文本的编码器和用于生成文本的解码器。
- 用于文本生成和指令遵循的大型语言模型(如GPT-3和ChatGPT)仅实现了解码器模块,从而简化了架构。
- 包含数十亿词汇的大型数据集是预训练大型语言模型的必要条件。
- 尽管类似GPT的模型的常规预训练任务是预测句子中的下一词,但这些大型语言模型展现出了涌现特性,例如具备文本分类、翻译或摘要生成等能力。
- 大型语言模型(LLM)完成预训练后,所得到的基础模型可更高效地针对各种下游任务进行微调。
- 在自定义数据集上微调后的大型语言模型,在特定任务上的表现可超越通用型大型语言模型。