大语言模型基础知识

2024/6/17 LLM

# 一、大语言模型发展历程

大模型技术并不是一蹴而就的,大语言模型发展主要经历了统计语言模型、神经语言模型、预训练语言模型等多个发展阶段。在介绍具体的发展阶段之前,我们先来了解下什么是语言模型(Language Model, LM)。

日常生活中,人与人之间主要通过语言进行表达和交流,如果我们想要使用自然语言与计算机进行沟通,并且让计算机拥有像人类一样的阅读、理解、交流和写作的能力,应该如何实现呢?语言模型就是实现机器智能的主要技术途径之一。

具体来说,语言模型通过学习和分析人类语言使用的规律,能够在给定的上下文中,准确预测下一个词语序列出现的概率。这种概率计算过程能够帮助计算机理解人类语言,进而应用到文本生成、语音识别、机器翻译等多种任务场景中。

根据所采用技术方法的不同,语言模型主要分为以下四个发展阶段。

# 统计语言模型(Statistical Language Model, SLM)

基于统计学习方法研发的统计语言模型,兴起于 20 世纪 90 年代。统计语言模型使用马尔可夫假设来建立语言序列的预测模型,通常是根据词序列中若干个连续的上下文单词来预测下一个词的出现概率,从而实现对自然语言的理解和生成。代表模型:N-gram。

统计语言模型被广泛应用于信息检索和自然语言处理等领域,主要用来解决以信息检索,文本分类和语音识别为主的一些传统任务。但是,统计语言模型存在严重的数据稀疏问题(在构建统计语言模型时,由于训练数据中某些词或词组出现频率非常低或根本不出现,导致这些词或词组的概率估计不准确甚至为零的问题)。

# 神经语言模型(Neural Language Model, NLM)

神经语言模型使用神经网络学习自然语言的概率分布,以预测下一个词的出现概率。与传统的统计语言模型相比,神经语言模型通过学习词嵌入,能够更有效地捕捉词之间的语义和语法关系,并且通过循环神经网络(RNN)、长短时记忆网络(LSTM)和门控循环单元(GRU)等技术使得模型能够更好地捕捉长距离依赖和上下文信息,可以大范围扩展语言模型可应用的任务。代表模型:BNN-LM,word2vec。

然而,神经语言模型存在计算资源需求高、训练时间长、缺乏知识和可迁移性差等问题。

# 预训练语言模型(Pre-trained Language Model, PLM)

预训练语言模型是一种在大规模无标注文本数据上预先训练的深度学习模型,能够理解和生成自然语言文本。

早期的预训练语言模型(例如:word2vec)主要关注于学习词嵌入,以捕捉词汇间的语义关系。2017 年,谷歌提出了基于自注意力机制的 Transformer 模型,基于 Transformer 架构,以 ELMo、BERT、GPT-1 为代表的预训练语言模型在训练架构与训练数据两个方面进行了改进与创新,并确立了预训练-微调这一任务求解范式。其中,预训练阶段通过大规模无标注文本来建立模型的基础能力,微调阶段则使用有标注数据对模型进行特定任务的适配,从而更好地解决下游的自然语言处理任务。

预训练语言模型加强了语义表征的上下文感知能力,并且可以通过下游任务进行微调,能够有效提升下游任务的性能以及任务迁移能力。但是,预训练语言模型仍然存在着资源消耗大、需要监督数据微调(伦理和偏见)等问题。

# Transformer 模型

Transformer 模型是由多层的多头自注意力模块堆叠而成的神经网络模型,它是自然语言处理领域的一个里程碑式的创新。Transformer 模型的核心创新在于引入了自注意力机制,这一机制使得模型能够同时考虑输入序列中所有位置的上下文信息,捕捉长距离依赖关系,从而更好的理解和生成自然语言。

原始的 Transformer 模型由编码器和解码器两个部分构成,编码器的作用是将每个输入词元都编码成一个上下文语义相关的表示向量,解码器则基于来自编码器编码后的最后一层的输出表示以及已经由模型生成的词元序列,执行后续的序列生成任务。编码器和解码器也可以独立使用(例如,基于编码器架构的 BERT 模型和解码器架构的 GPT 模型),解码器架构还可以细分为因果解码器和前缀解码器两个变种架构。

Transformer 的模型设计对于硬件非常友好,可以通过 GPU 或者 TPU 进行加速训练,这为研发大语言模型提供了可并行优化的神经网络架构,当前主流的大语言模型都是基于 Transformer 模型进行设计的。

# 大语言模型(Large Language Model, LLM)

经过规模扩展的预训练语言模型在解决复杂任务时表现出了与小型预训练语言模型不同的行为(扩展法则),同时展现出了一些小型预训练语言模型不具备的能力特点(涌现能力),为了区别这一能力上的差异,学术界将这些大型预训练语言模型命名为大语言模型。因此,大语言模型可以理解为在海量无标注文本数据上进行预训练得到的大型预训练语言模型。

这里涉及到了两个概念,即扩展法则涌现能力

扩展法则:通过规模扩展(增加模型参数规模、数据规模、计算算力),通常会带来下游任务的模型性能提升,这种通过扩展带来的性能提升通常显著高于通过改进架构、算法等方面所带来的改进,这种现象称为扩展法则。

涌现能力: 大模型具有但小模型不具有的能力,通常被称为涌现能力。大语言模型典型的涌现能力有:上下文学习、指令遵循和逐步推理。上下文学习能力指大语言模型能够识别、理解和利用文本中前后文信息,进而能够使用少样本数据解决下游任务。指令遵循能力指大语言模型能够按照自然语言指令来执行对应的任务。逐步推理能力指大语言模型可以利用思维链提示策略加强推理性能,具体来说,大语言模型可以在提示中引入任务相关的中间推理步骤来加强复杂任务的求解,从而获得更为可靠的答案。

LLM-01.jpg

# 二、大语言模型构建过程

大语言模型的训练过程可以分为预训练指令微调与人类对齐两个阶段。

预训练是指在一个大规模、无监督的文本数据集上预先训练模型的过程,是研发大语言模型的第一个训练阶段,通过在大规模数据上进行预训练,大语言模型可以掌握较为广泛的世界知识,获得通用的语言理解与生成能力,以及解决众多下游任务的潜力。

但是由于预训练任务形式有限,经过预训练后的大语言模型更擅长于文本补全,并不适合直接解决具体的任务,为了增强模型的任务解决能力,大语言模型在预训练之后需要进行适应性微调,通常涉及两个主要步骤,即指令微调(也称为有监督微调)和对齐微调。

经历上述两个过程后,大语言模型就能够具备较好的人机交互能力,通过问答形式解决人类所提出的问题。

LLM-02.jpg

# 预训练

预训练大语言模型,需要准备大规模文本数据,并且进行严格的数据清洗,去除掉可能包含有毒有害的内容,最后将清洗后的数据进行词元化流,并且切分成批次,用于大语言模型的预训练。

# 准备数据

大语言模型的能力基础主要来源于预训练数据,收集高质量、多领域、多源化的训练数据可以帮助大语言模型更加全面地学习真实世界的语言与知识,从而提高其通用性和准确性。

# 数据来源

网页:网页中包含了丰富多样的文本内容,可以为大语言模型提供丰富的世界知识,是目前大语言模型训练语料中最主要的数据来源。使用大规模网页文本数据进行预训练,有助于大语言模型获取多样化的语言知识,并增强其自然语言理解和生成的能力。常用的网页数据集有:C4、RefinedWeb、CC-Stories。

书籍:书籍中的文本内容较为正式与详实,使用书籍数据进行预训练,能够帮助模型积累丰富的语言知识,理解语言的内在逻辑与表达习惯,提高模型捕捉文本长程依赖关系的能力。常用的书籍数据集有:BookCorpus、Project Gutenberg、arXiv Dataset、S2ORC。

代码:代码数据可以增强模型结构化语义理解与逻辑推理能力,以及生成编程语言的能力。同时,代码中的函数调用关系还有助于增强模型的工具使用与学习能力。常用代码数据集有:BigQuery、The Stack、StarCoder。

多语文本:多语言文本数据可以增强模型的多语理解与生成能力,支持跨语言理解与对话任务。多语言数据还能有效增加数据的多样性,有助于提升模型的综合性能。

# 数据预处理

收集了丰富的文本数据之后,为了确保数据的质量和效用,还需要对数据进行预处理,从而消除低质量、冗余、无关和有害的数据。

LLM-03.jpg

# 质量过滤

质量过滤的目的是为了去除原始数据集中的错误、不完整或无关的信息,提高数据的整体质量。目前,主要有两种数据清洗方法:基于启发式规则的方法和基于分类器的方法

基于启发式规则的方法:通过精心设计的规则来针对地识别和剔除低质量的文本数据,不同类型的文本数据往往需要设计不同的清洗规则。常见的过滤策略有语种过滤、统计过滤和关键词过滤。

  1. 基于语种的过滤:过滤掉其他语言的文本数据,用于训练特定语言的大语言模型。

  2. 基于简单统计指标的过滤:通过分析语料中标点符号分布、符号与单词比率、句子长度等特征,构建相应的规则或阙值,来衡量文本质量,从而过滤低质量的数据。

  3. 基于关键词的过滤:基于要过滤的文本构建关键词集合,然后结合关键词集合,对语料中的重复文本或者一些具有攻击性、冒犯性的文本信息进行扫描过滤。

基于分类器的方法:训练用于识别数据质量的文本分类器,然后利用这个训练好的文本分类器,进行预训练语料的清洗。

总的来说,两种方法各有优劣,基于启发式规则的方法,过滤效率高,计算资源消耗较低。基于分类器的方法,过滤精确度高,需要消耗更多的计算资源。为了平衡过滤的效率与准确性,可以针对具体的数据集合灵活组合过滤策略。例如,可以先使用启发式规则对数据集进行初步筛选,排除不符合要求的数据,然后再采用分类器方法进一步精细过滤,确保最终筛选出的语料具有较好的文本质量。

# 敏感内容过滤

敏感内容过滤的目的是为了去除数据集中包含的非法、有毒或隐私内容的信息。

如果预训练数据中包含有毒内容,模型则可能会产生侮辱性、攻击性或其他有害的输出。过滤有毒内容,可以使用基于分类器的过滤方法,精确过滤含有有毒内容的文本。

如果训练数据中包含隐私内容,模型在输出中可能会泄露个人信息(邮箱地址、IP 地址、电话号码等)。过滤隐私内容,可以使用关键字识别的启发式规则过滤方法,检测和删除数据集中的隐私内容。

# 数据去重

由于大语言模型具有强大的参数量和学习记忆能力,很容易习得训练数据中的重复模式,从而引发模型训练过程不稳定甚至崩溃的问题,同时也使得模型可能在生成结果时频繁输出重复数据,影响模型的性能。

一般来说,可以在句子级别、文档级别数据集级别等多种粒度上对数据集进行去重。句子级别上,可以删除包含重复单词和短语的低质量句子。文档级别上,可以通过相关算法计算出文档的重叠比率,进而检测和删除包含相似内容的重复文档。数据集级别上,通常采用多阶段、多粒度的方式来实现高效的去重,首先针对数据集在文档级别进行去重,然后,可以进一步在句子级别实现更为精细的去重。

# 词元化(分词)

词元化是数据预处理中的一个关键步骤,目的是将文本数据切分成小的、有意义的、模型可识别的单元(词元),作为大语言模型的输入数据。主要有三种词元化方法:BPE 分词、WordPiece 分词和 Unigram 分词。对于大语言模型而言,选择合适的词元化方法能够显著影响模型的训练效率和最终性能。同时,针对大语言模型的某些特定能力,可以专门设计和训练定制化的分词器。

# 数据调度

完成数据预处理之后,需要设计合适的调度策略来安排这些多来源的数据,进而用于训练大语言模型。数据调度主要关注两个方面:各个数据源的混合比例(数据混合)和各数据源用于训练的顺序(数据课程)。

数据混合:不同数据源与大语言模型学习具备的能力具有紧密的联系,在预训练期间,将根据设置的数据混合比例从不同数据源中采样数据,数据源的权重越大,从中选择的数据就越多。

数据课程:按照特定的顺序安排预训练数据进行模型的训练。例如,从简单/通用的数据开始,逐渐引入更具挑战性/专业化的数据。

# 准备预训练

模型的预训练过程涉及到大量需要深入探索的经验性技术,需要考虑各种实施细节,那么该如何进行大语言模型的预训练呢?

# 预训练任务

在进行模型的大规模预训练时,需要设计合适的自监督预训练任务,使得模型能够从海量无标注数据中学习到广泛的语义知识与世界知识。目前,常用的预训练任务主要分为三类:语言建模、去噪自编码和混合去噪器。

语言建模任务是目前大部分大语言模型广泛采用的预训练任务,经常被应用于训练基于解码器的大语言模型。该任务的目标是估计给定文本序列中下一个词或词元的概率。

去噪自编码是另一种常见的语言模型预训练任务,该任务的核心在于在输入数据中引入“噪声”,然后让模型学习恢复原始数据。与语言建模相比,去噪自编码任务的实现更为复杂,目前完全使用去噪自编码进行预训练的大语言模型还较为有限。

混合去噪器任务是结合了上述两种方法的变体,它将语言建模和去噪自编码的目标均视为不同类型的去噪任务,进而对预训练任务进行统一建模,来增强模型的理解和生成能力。

# 训练优化设置

选择合适的训练优化设置,可以稳定模型的训练过程,提高模型预训练的稳定性和吞吐量。常用的模型训练优化设置有动态调整训练批次大小策略、学习率调整策略、优化器选择和稳定优化技术(梯度裁剪、训练恢复等)等。

# 高效训练技术

随着模型参数规模与数据规模的不断扩展,高效的模型训练技术,对于提高大语言模型的训练效率、降低资源消耗以及提高模型质量至关重要。常见的高效训练技术有 3D 并行训练、激活重计算和混合精度训练。

综合运用这些策略,不仅可以提高模型训练的稳定性和效率,缩短训练周期,还能在资源有限的情况下训练出更大、更复杂的模型,进而提升最终模型的性能。

# 指令微调

指令微调是指使用自然语言形式的数据对预训练后的大语言模型进行参数微调,它是增强和激活大语言模型特定能力的重要方法之一。通过使用任务输入与输出的配对数据进行模型训练,可以使语言模型掌握通过问答形式进行任务求解的能力和较强的指令遵循能力,并且能够无需下游任务的训练样本或者示例就可以解决训练中未见过的任务。

# 构建指令数据

构建格式化指令数据是强化大语言模型特定功能的关键步骤,一个经过格式化的指令数据通常包括任务描述(也称为指令)、任务输入-任务输出以及可选的示例。目前,主要有三种构建格式化指令数据的方法:基于现有的自然语言处理任务数据集构建、基于日常对话数据构建和基于合成数据构建

基于现有的自然语言处理任务数据集构建:在开源的自然语言处理任务数据集合上,为数据添加人工编写的任务描述信息,扩充原始的任务数据集,从而得到可以用于指令微调的自然语言处理任务数据集。经过自然语言处理指令数据微调后,大语言模型可以学习到指令遵循的能力,进而能够解决其他未见过的自然语言处理任务。常用的自然语言处理任务数据集:P3、FLAN。

基于日常对话数据构建:将用户在日常对话中的实际需求作为任务描述(例如用户提交给 OpenAI API 的查询)和由人类标注员回答或者语言模型所生成的输出进行配对,构建指令数据。大语言模型能够从这些源自于真实应用场景、采用自然语言形式进行表达的任务描述中学习到指令遵循的能力,常用的日常对话数据集:ShareGPT、OpenAssistant、Dolly。

基于合成数据构建:借助已有的高质量指令数据作为上下文学习示例输入到大语言模型,然后运用自然语言处理技术生成新的、多样化的任务描述及对应的输入-输出数据。常用的合成数据集:Self-Instruct-52K、Alpaca-52K。

# 优化设置和数据组织策略

指令微调中的优化器设置、稳定优化技术(梯度裁剪)和训练技术(3D 并行训练)都与预训练阶段保持一致,可以完全沿用。除了这些优化参数的设置,指令微调过程中还需要考虑一定的数据组织形式, 从而使得模型获得更好的微调效果,一般有三种常用的数据组织策略:平衡数据分布、多阶段指令数据微调和结合预训练数据与指令微调数据。

# 高效模型微调

由于大语言模型参数量巨大, 进行全参数微调,需要消耗较多的算力资源,在资源有限或追求效率的情况下,可以进行参数高效微调(也称为轻量化微调)。参数高效微调可以减少需要训练的模型参数量,同时保证微调后的模型性能能够与全量微调的表现相媲美。

低稚适配(LoRA)微调方法:在预训练模型的参数矩阵上添加低秩分解矩阵来近似每层的参数更新,从而减少适配下游任务所需要训练的参数,与全参数微调相比,LoRA 微调在保证模型效果的同时,能够显著降低模型训练的成本。

# 人类对齐

经过大规模的预训练和有监督指令微调,大语言模型已经具备了解决各种任务的通用能力和指令遵循能力,但是还需要将大语言模型与人类的期望、需求以及价值观对齐,防止模型生成有偏见的、虚假的以及事实错误的文本内容。

现有的对齐目标一般聚焦于三个方面:有用性(大语言模型应能够提供有用的信息,正确理解上下文,准确完成任务)、诚实性(模型的输出应具备真实性和客观性,不应夸大或歪曲事实,避免产生误导性陈述)和无害性(大语言模型应避免生成可能引发潜在负面影响或危害的内容)。

# 基于人类反馈的强化学习算法(RLHF)

由于对齐标准难以通过形式化的优化目标进行建模,因此研究人员提出了基于人类反馈的强化学习,对大语言模型的行为进行指导。RLHF 使用收集到的人类反馈数据来指导大语言模型进行微调,从而使大语言模型在多个标准上实现与人类对齐,当前,RLHF 是实现人类对齐的主要技术途径之一。

RLHF 算法系统主要包括三个关键组成部分:需要与人类价值观对齐的模型、 基于人类反馈数据学习的奖励模型以及用于训练大语言模型的强化学习算法。RLHF 首先需要收集人类对于不同模型输出的偏好,然后使用收集到的人类反馈数据训练奖励模型, 最后基于奖励模型使用强化学习算法微调大语言模型。

# 三、大语言模型使用

# 低资源部署策略

由于大模型的参数量巨大,在解码(大语言模型针对输入内容逐个单词生成输出内容,这个过程称为解码)阶段需要占用大量的显存资源,因此在实际应用中的部署代价非常高。为了能够在资源有限的环境中使用大语言模型,通过使用模型压缩方法,能够显著减少大语言模型的显存资源占用和解码延迟。下面介绍三种常见的模型压缩方法:模型量化、模型蒸馏和模型剪枝。

模型量化:量化通常是指从浮点数到整数的映射过程。模型量化方法主要分为两大类,即量化感知训练和训练后量化,训练后量化方法会消耗更少的算力,在实践中应用更为广泛。目前比较常用的是 8 比特整数量化,即 INT8 量化,大多数情况下,INT8 权重量化可以在不显著影响模型性能的情况下,有效地减小显存占用。

模型蒸馏:将大型、复杂的模型(称为教师模型)迁移到小型、简单的模型(称为学生模型)上,从而实现复杂模型的压缩,同时尽量保持教师模型的性能。一般来说,通常会使用教师模型的输出传递模型知识,来训练学生模型。

模型剪枝:在尽可能不损失模型性能的情况下,减少模型的参数数量,从而降低模型的显存需求以及算力开销。

# 提示学习

如何有效地使用大语言模型解决实际任务,目前常用的方法是设计合适的提示(Prompt),通过自然语言接口与大语言模型进行交互。

# 基础提示

针对特定任务设计合适的任务提示,这一过程被称为“提示工程”,设计合适的任务提示需要考虑四个关键要素,即任务描述、 输入数据、上下文信息和提示策略。

任务描述指示了大语言模型应当遵循的具体指令,一个明确的任务描述应该简洁明了,直接告诉模型做什么。

输入数据指用户可以直接使用自然语言描述输入数据的内容,以便模型可以直接处理。

上下文信息指针对某些特定任务,能够以上下文信息的形式引入外部信息作为大语言模型的输入,使模型能够做出更加精准和符合情境的响应。

提示策略指如何组织上述元素来构建最终的提示,以最优方式激发模型的潜能。

# 上下文学习

上下文学习(ICL)使用任务描述与示例所组成的自然语言文本作为提示,能够引导大语言模型更好地解决未见过的任务。目前,上下文学习已经成为使用大语言模型解决下游任务的一种主流途径。

# 思维链提示

思维链提示(CoT)是一种高级提示策略,与上下文学习方法仅使用 ⟨ 输入,输出 ⟩ 二元组来构造提示不同,思维链提示使用 ⟨ 输入,思维链,输出 ⟩ 三元组来构造提示,进一步融合了中间的推理步骤加入到提示中,指导模型解决复杂的推理任务。

# 智能体

智能体(Agent)是一个具备环境感知、决策制定及动作执行能力的自主算法系统,包含三个基本组件:记忆组件、规划组件和执行组件,通过这些组件共同协作,智能体能够有效地感知环境、制定决策并执行规划的动作,进而完成相应任务。

记忆组件用于存储智能体与环境的历史交互记录,这些信息可以是文本、图像、声音等多种形式,记忆功能使得智能体能够基于过往经验优化未来的决策,实现所谓的“学习”效果。

规划组件负责基于当前目标和记忆中的信息,同时生成多个候选方案,并从中选择一个最佳方案用于执行。这种方法有助于提高问题解决的效率和效果,提高智能体对复杂环境的适应性和操作的可靠性。

执行组件负责执行由规划组件制定的任务解决方案。通过设置执行组件,智能体可以与外界环境进行交互,并获得实际的执行效果反馈。

虽然大语言模型智能体在自主解决复杂任务方面展现出了巨大的潜力,但是它们在实际应用中仍然面临着诸如计算资源耗费大、复杂工具使用难、真实世界使用差异等许多技术挑战。