大语言模型的一大显著特点便是其规模之 巨大:拥有数百万到数十亿个参数。相比之下,使用传统的机器学习或统计方法,凭借一个仅包含两个参数的小模型,就能以超过 90% 的分类准确率对鸢尾花数据集进行分类。尽管与传统方法相比,大语言模型的规模庞大,但它们并不一定是 黑箱 模型。
《从零构建大模型》一书将指导我们如何一步步地构建一个大语言模型,最终,我们将深入理解像 ChatGPT 这样的大语言模型的底层运作原理。它涵盖了构建大语言模型的整个过程:从数据集的处理到模型架构的实现,再到无标签数据的预训练,以及针对特定任务的微调。
什么是大语言模型
近年来,OpenAI 推出的 ChatGPT 等大语言模型作为深度神经网络模型的代表,为自然语言处理(natural language processing, NLP)领域带来了革命性的变化。在大语言模型出现之前,传统方法(如手工规则或简单模型)在垃圾邮件检测、简单模式识别等分类任务中表现优异。但是这些传统方法在需要具备复杂的理解和生成能力的语言任务中通常表现不佳。
大语言模型在理解、生成和解释人类语言方面拥有出色的能力。这里的 理解 是指它们能够处理和生成看似连贯且符合语境的文本,而这并不意味着它们真的拥有像人类一样的意识或理解能力。
深度学习(deep learning)是机器学习(machine learning)和人工智能(artificial intelligence, AI)领域的一个重要分支,主要聚焦于神经网络的研究。深度学习的发展使得大语言模型能够利用海量的文本数据进行训练,从而相比于以往的方法能够捕获更深层次的上下文信息和人类语言的细微之处。因此,大语言模型在文本翻译、情感分析、问答等各类自然语言处理任务中都有显著的性能提升。
现代大语言模型与早期自然语言处理模型之间的另一个重要区别在于,早期自然语言处理模型通常是为特定任务(如文本分类,语言翻译等)而设计的。尽管这些早期自然语言处理模型在其特定应用中表现卓越,但大语言模型在各种自然语言处理任务中展现了更广泛的能力。
以 Transformer 架构为核心,使用大型数据集来训练大语言模型,已经从根本上变革了自然语言处理领域,为机器理解并与人类语言互动提供了更强大的工具。
大语言模型是一种用于理解、生成和响应类似人类语言文本的神经网络。这类模型属于深度神经网络(deep neural network),通过大规模文本数据训练而成,其训练资料甚至可能涵盖了互联网上大部分公开的文本。大语言模型 中的 大 字,既体现了模型训练时所依赖的庞大数据集,也反映了模型本身庞大的参数规模。这类模型通常拥有数百亿甚至数千亿个参数(parameter),这些参数是神经网络中的可调整权重,在训练过程中不断被优化,以预测文本序列中的下一个词。下一单词预测(next-word prediction)任务合理地利用了语言本身具有顺序这一特性来训练模型,使得模型能够理解文本中的上下文、结构和各种关系。这项任务本身非常简单,因此许多研究人员对其能够孕育出如此强大的模型深感惊讶。
大语言模型采用了一种名为 Transformer 的架构,这种架构允许模型在进行预测时有选择地关注输入文本的不同部分,从而使得它们特别擅长应对人类语言的细微差别和复杂性。
由于大语言模型能够生成文本,因此它们通常也被归类为生成式人工智能(generative artificial intelligence,简称 generative AI 或 GenAI)。下图展示了大语言模型在人工智能领域所处的位置:
- 实现人工智能的算法是机器学习领域的重点研究内容。具体而言,机器学习涉及开发能够从数据中学习的算法。无须明确编程,这些算法就能基于数据做出预测或决策
- 深度学习是机器学习的一个分支,它主要利用 3 层及以上的神经网络(深度神经网络)来建模数据中的复杂模式和抽象特征,而传统的机器学习往往需要人工进行特征提取,这意味着人类专家需要为模型识别和挑选出最相关的特征。深度学习并不依赖人工提取的特征,这意味着不再需要由人类专家为模型
识别和选择最相关的特征。但传统的机器学习和深度学习仍然需要收集标签 - 尽管人工智能领域现在由机器学习和深度学习所主导,但该领域也涉及其他方法,比如基于规则的系统、遗传算法、专家系统、模糊逻辑或符号推理
大语言模型的应用
大语言模型在解析和理解非结构化文本数据方面的能力非常强,因此它们在许多领域得到了广泛应用。如今,大语言模型已被应用于机器翻译、文本生成、情感分析、文本摘要、内容创作等多种任务。此外,大语言模型还可以为复杂的聊天机器人和虚拟助手提供支持。
简而言之,大语言模型在几乎所有需要解析和生成文本的任务的自动化处理中都具有重要价值。随着我们不断创新和探索这些模型的使用方法,它们有潜力重塑我们与科技的关系,使其变得更具互动性、更为直观且更易使用。
构建和使用大语言模型的各个阶段
从零开始构建大语言模型不仅是一次深入了解模型机制和局限性的绝佳机会,还为我们提供了预训练和微调开源大语言模型,使其适应特定领域的数据集或任务的必要知识。如今大多数大语言模型是使用 PyTorch 深度学习库实现的,我们也将使用该库。
针对特定领域或任务量身打造的大语言模型在性能上往往优于 ChatGPT 等为多种应用场景而设计的通用大语言模型:
- 使用定制的大语言模型具有多个优势,尤其是在数据隐私方面。例如出于机密性考虑,公司可能不愿将敏感数据共享给像 OpenAI 这样的第三方大语言模型提供商
- 另外,如果开发较小的定制的大语言模型,那么就可以将其直接部署到客户设备上(苹果公司等企业正在探索的方向),本地部署可以显著减少延迟并降低与服务器相关的成本
- 此外,定制的大语言模型使开发者拥有完全的自主权,能够根据需要控制模型的更新和修改
大语言模型的构建通常包括预训练(pre-training)和微调(fine-tuning)两个阶段。大语言模型的预训练目标是在大量无标注的文本语料库(原始文本)上进行下一单词预测。预训练完成后,可以使用较小的带标注的数据集对大语言模型进行微调。如下展示了由 预训练 和 微调 组成的两阶段训练方法:
创建大语言模型的第一步是在大量文本数据上进行训练,这些数据也被称作 原始文本(raw text)。原始指的是这些数据只是普通的文本,没有附加任何标注信息。在此阶段,大语言模型使用自监督学习,模型从输入数据中生成自己的标签。预训练是大语言模型的第一个训练阶段,预训练后的大语言模型通常称为 基础模型(foundation model)。
通过在无标注数据集上训练获得预训练的大语言模型后,我们可以在带标注的数据集上进一步训练这个模型,这一步称为微调。微调大语言模型最流行的两种方法是指令微调和分类任务微调:
- 在
指令微调(instruction fine-tuning)中,标注数据集由指令−答案对组成 - 在
分类任务微调(classification fine-tuning)中,标注数据集由文本及其类别标签
Transformer 架构介绍
大部分的现代大语言模型基于 Transformer 架构,这是一种深度神经网络架构,该架构是在谷歌于 2017 年发表的论文 Attention Is All You Need 中首次提出的。Transformer 最初是为机器翻译任务(比如将英文翻译成德语和法语)开发的。Transformer 架构的一个简化版本如图(以机器翻译为例):
Transformer架构由两个子模块构成:编码器和解码器
- 编码器(encoder)模块负责处理输入文本,将其编码为一系列数值表示或向量,以捕捉输入的上下文信息(解析文本)
- 解码器(decoder)模块接收这些编码向量,并据此生成输出文本(生成文本)
编码器和解码器都是由多层组成,这些层通过自注意力机制连接。Transformer 和大语言模型的一大关键组件是 自注意力机制(self-attention mechanism),它允许模型衡量序列中不同单词或词元之间的相对重要性。这一机制使得模型能够捕捉到输入数据中长距离的依赖和上下文关系,从而提升其生成连贯且上下文相关的输出的能力。
为了适应不同类型的下游任务,Transformer 的后续变体,如 BERT(Bidirectional Encoder Representations from Transformer,双向编码预训练 Transformer)和各种 GPT(Generative Pretrained Transformer,生成式预训练 Transformer)模型,都基于这一理念构建。
BERT 基于原始 Transformer 的编码器模块构建,其训练方法与 GPT 不同。GPT 主要用于生成任务,而 BERT 及其变体专注于 掩码预测(masked word prediction),即预测给定句子中被掩码的词。这种独特的训练策略使 BERT 在情感预测、文档分类等文本分类任务中具有优势(例如 Twittter 在检测有害内容时使用的是 BERT)。
GPT 则侧重于原始 Transformer 架构的解码器部分,主要用于处理生成文本的任务,包括机器翻译、文本摘要、小说写作、代码编写等。GPT 模型主要被设计和训练用于文本补全(text completion)任务,但它们表现出了出色的可扩展性。这些模型擅长执行零样本学习任务和少样本学习任务:
- 零样本学习(zero-shot learning)是指在没有任何特定示例的情况下,泛化到从未见过的任务
- 而少样本学习(few-shot learning)是指从用户提供的少量示例中进行学习
当今的大语言模型大多基于 Transformer 架构,因此,Transformer 和大语言模型在文献中常常被作为同义词使用。但是:
- 并非所有的 Transformer 都是大语言模型,因为 Transformer 也可用于计算机视觉领域
- 并非所有的大语言模型都基于 Transformer 架构,因为还存在基于循环和卷积架构的大语言模型
为简便起见,我们还是使用 大语言模型 一词来指代类似于 GPT 的基于 Transformer 的大语言模型。
利用大型数据集
主流的 GPT、BERT 等模型所使用的训练数据集涵盖了多样而全面的文本语料库。这些语料库包含数十亿词汇,涉及广泛的主题,囊括自然语言与计算机语言。如下总结了用于预训练 GPT-3 的数据集,GPT-3 被视作第一代 ChatGPT 的基础模型。
词元(token)是模型读取文本的基本单位,数据集中的词元数量大致等同于文本中的单词和标点符号的数量。训练数据集的庞大规模和丰富多样性使得这些模型在包括语言语法、语义、上下文,甚至一些需要通用知识的任务上都拥有了良好表现。
预训练大语言模型需要大量资源,成本极其高昂。但是许多预训练的大语言模型是开源模型,可以作为通用工具,用于写作、摘要和编辑那些未包含在训练数据中的文本。同时,这些大语言模型可以使用相对较小的数据集对特定任务进行微调,这不仅减少了模型所需的计算资源,还提升了它们在特定任务上的性能。
深入剖析 GPT 架构
GPT 最初是由 OpenAI 的 Radford 等人在论文 Improving Language Understanding by Generative Pre-Training 中提出的。GPT-3 是该模型的扩展版本,它拥有更多的参数,并在更大的数据集上进行了训练。此外,ChatGPT 中提供的原始模型是通过使用 OpenAI 的 InstructGPT 论文中的方法,在一个大型指令数据集上微调 GPT-3 而创建的。
GPT 模型仅在相对简单的 下一单词预测任务 上进行了预训练,下一单词预测任务采用的是自监督学习(self-supervised learning)模式,这是一种自我标记的方法。这意味着我们不需要专门为训练数据收集标签,而是可以利用数据本身的结构。即我们可以使用句子或文档中的下一个词作为模型的预测标签,由于该任务允许 动态 创建标签,因此我们可以利用大量的无标注文本数据集来训练大语言模型。
与原始 Transformer 架构相比,GPT 的通用架构更为简洁。本质上,它只包含解码器部分,并不包含编码器。由于像 GPT 这样的解码器模型是通过逐词预测生成文本(被设计为单向的从左到右处理),因此它们被认为是一种自回归模型(autoregressive model),自回归模型将之前的输出作为未来预测的输入。因此,在 GPT 中,每个新单词都是根据它之前的序列来选择的,这提高了最终文本的一致性。
GPT-3 等架构的规模远超原始 Transformer 模型。例如,原始的 Transformer 模型将编码器模块和解码器模块重复了 6 次,而 GPT-3 总共有 96 层Transformer和 1750 亿个参数。
虽然原始的 Transformer 模型(包含编码器模块和解码器模块)专门为语言翻译而设计,但 GPT 模型采用了更大且更简单的纯解码器架构,旨在预测下一个词,并且它们也能执行翻译任务。这种能力起初让研究人员颇为意外,因为其来自一个主要在下一单词预测任务上训练的模型,而这项任务并没有特别针对翻译。
模型能够完成未经明确训练的任务的能力称为涌现(emergence)。这种能力并非模型在训练期间被明确教授所得,而是其广泛接触大量多语言数据和各种上下文的自然结果。即使没有经过专门的翻译任务训练,GPT模型也能够 学会 不同语言间的翻译模式并执行翻译任务。这充分体现了这类大规模生成式语言模型的优势和能力。因此,无须针对不同的任务使用不同的模型,我们便可执行多种任务。
构建大语言模型
我们将从零开始,一步步构建自己的模型,我们将以 GPT 的核心原理为指导,按照如下路线图,分 3 个阶段来逐步实现这一目标:
- 在第一阶段,我们将学习数据预处理的基本流程,并着手实现大语言模型的核心组件:注意力机制
- 在第二阶段,我们将学习如何编写代码并预训练一个能够生成新文本的类 GPT 大语言模型
- 在第三阶段,我们将对一个预训练后的大语言模型进行微调,使其能够执行回答查询、文本分类等任务,这是许多真实应用程序和研究中常见的需求