大语言模型 (LLM) 基础知识
说明:这是我的学习笔记,很多内容转自网络,请查阅文章末尾的参考资料。
目录
- 大语言模型概述
- 大语言模型训练
- 数据预处理 - 清洗
- 数据预处理 - 分词
- 大模型训练步骤
- 预训练
- 监督微调 SFT
- 人类喜好对齐
- Transformer 架构
- 自注意力机制
- BERT 双向编码器表示
- BERT 预训练
- BERT 微调
- GPT 系列
- 参考资料
大语言模型概述
大语言模型(LLM)是一种能够执行多种自然语言处理任务的机器学习模型,利用 Transformer 模型和大量数据集进行训练,具有大量参数,这些参数可以视为模型在学习过程中积累的记忆,是其知识库的一部分。
语言模型是一种数学模型,用于为自然语言中的词或词元序列分配概率。这些序列可以是句子、段落或任何文本片段。序列的概率反映了它在自然语言中出现的可能性。例如,“猫在垫子上”这个句子比“猫在帽子上”更符合英语的习惯用法。语言模型还可以预测给定前序词或词元的情况下,下一个词或词元的概率。例如,“垫子”在“猫在……上”之后出现的概率要高于“帽子”。
- 机器翻译:语言模型能够辅助文本从一种语言翻译到另一种语言,通过生成目标语言中最可能的词和词元。
- 语音识别:语言模型有助于识别和转录语音,通过预测给定声音信号后文本中最可能的词和词元。
- 文本摘要:语言模型能够帮助总结长文本,通过生成原文中最重要和最相关的词和词元。
- 问答:语言模型能够辅助回答问题,通过生成基于问题和上下文中的词和词元的最准确和最有信息量的答案。
- 文本生成:语言模型能够创造新的原创文本,通过生成给定提示或主题中词和词元后最合理和最连贯的文本。
大语言模型训练
训练大语言模型是一个复杂且耗费资源的过程。本节将解释训练大语言模型的主要步骤和可辅助达成目标的工具与技术。
首先,准备数据集。您需要一个涵盖目标领域或任务的大型且多样化的文本语料库。例如,训练代码生成模型需要不同编程语言的源代码文件集合。您可以利用现有数据集,如 Hugging Face 提供的,或通过网络抓取等方式构建自己的数据集。此外,还需要进行数据预处理,如分词、清洗和划分训练集、验证集和测试集。
其次,配置训练参数。您需要决定模型的架构、大小和超参数。您可以选择预训练模型,如GPT-3或BERT,并在自定义数据集上进行微调,或从头开始训练模型。同时,还需设置优化器、学习率、批量大小等训练过程中的参数。可以通过 Hugging Face Transformers 或 PyTorch 等库来简化这一过程。
接下来,设置训练环境。您需要配置能够处理大量数据和计算需求的强大计算资源。可以通过云服务租用GPU或TPU资源,或使用自有硬件。同时,确保安装了必要的软件,如 Python、PyTorch 等。
然后,开始微调或训练模型。将数据输入模型,根据损失函数和优化器更新模型权重。可以使用 Hugging Face Trainer 提供的训练循环,或使用 PyTorch 自定义训练循环。同时,监控训练进度,定期保存模型检查点。
最后,评估微调或训练好的模型。在验证集和测试集上测试模型性能,使用 BLEU 、ROUGE 或 F1 分数等指标根据任务类型进行性能评估。也可以通过人工评估或示例来定性评估模型输出的质量和多样性。
保存并应用微调或训练好的模型。将模型及其分词器导出到文件或存储库,如 Hugging Face Model Hub,以便分享或用于自己的应用。也可以将模型部署到 Web 服务或 API,实现跨平台访问。
这些是训练大语言模型的主要步骤。当然,在训练过程中可能会遇到如数据质量、模型大小、内存消耗、可扩展性、鲁棒性和伦理等更多细节和挑战。后续章节将深入探讨这些主题。
数据预处理 - 清洗
预处理指的是将原始文本数据转换成更适合 NLP 任务的格式的过程。预处理之所以重要,是因为它能提升文本分析的品质和效率,并降低数据的噪声和复杂度。
预处理的一些好处包括:
- 移除文本中无关或多余的信息,如标点、停用词、HTML标签等。
- 规范化文本,比如转换为小写、去除重音、展开缩写等。
- 纠正拼写和语法错误,比如使用拼写检查、语法检查或语言模型。
- 增强文本,如加入同义词、词形还原或词干提取,或使用词嵌入或词向量。
- 对文本进行结构化,比如分割成句子、段落或词元,或添加标签、标注或注解。
常见预处理步骤包括:
- 移除标点和停用词
- 转换为小写和去除重音
- 展开缩写和纠正拼写
- 词形还原和词干提取
- 使用词嵌入和词向量
数据预处理 - 分词
词元化是将文本分解成更小单元,如单词、字符或子词的过程。词元化之所以重要,是因为它是将文本转化为可由语言模型处理的数值表示形式的第一步。
词元化的好处包括:
- 减少词汇量和复杂性,提高语言模型的效率和准确性。
- 捕捉文本的语义和语法信息,如词意、词形、词序等。
- 处理文本的多样性和变异性,如不同的语言、方言、领域、体裁等。
- 使用子词单元,如n-gram、词素或字节对编码,处理罕见或未知词、拼写变体、合成词等。
词元化并不简单或直接,而是一个复杂且复杂的过程,它取决于文本数据的类型、来源和目的。不同的 NLP任务 可能需要不同的词元化方法和层次。例如,情感分析可能受益于单词级词元化,而机器翻译可能需要子词级词元化。同样,文本摘要可能需要句子级词元化,而文本生成可能需要字符级词元化。
常见词元化技术包括:
- 单词级词元化
- 字符级词元化
- 子词级词元化
你可能想知道如何为你特定的问题和数据选择合适的方法。这个问题没有确切答案,因为不同的方法可能在不同的上下文和分析目标下具有不同的优势和劣势。不过,这里有一些通用的指导原则和建议,可能会帮助你做出更好的选择:
- 了解你的数据:在应用任何预处理或词元化方法之前,首先要探索和了解你的数据。例如,了解数据的来源、类型、格式、语言、领域、体裁和质量。还要了解数据的规模、多样性和变异性。这将帮助你识别数据可能存在的问题和挑战,如噪声、错误、不一致性、模糊性等。
- 了解你的任务:在了解数据之后,也要了解你的任务。例如,了解分析的目的、目标和预期结果。还要了解任务的要求、限制和评估标准。这将帮助你定义预处理和词元化方法需要满足的标准和标准,如准确性、效率、简洁性等。
- 了解你的模型:最后,在了解数据和任务之后,还需要了解你的模型。例如,了解模型的架构、参数、输入、输出和性能。还要了解模型的假设、限制和依赖性。这将帮助你将预处理和词元化方法与模型保持一致,如兼容性、一致性、兼容性等。
遵循这些指导原则,你可以比较和评估不同的预处理和词元化方法,选择最适合你的数据、任务和模型的方法。你还可以尝试和测试不同的方法和方法组合,看它们如何影响分析的结果和质量。记住,没有一种万能解决方案,而是一个根据你的特定问题和数据而定制的灵活过程。
大模型训练步骤
不同的大模型的训练细节有所不同,例如基于 Transformer 架构的 Bert 和 gpt 就有非常显著的差别。
自编码的 Bert 模型的训练是通过在句子中随机掩盖(Mask)一个词元和预测下一句的方式进行训练,而自回归的 gpt 系列模型则通过自回归的预下一词元的方式进行训练。而 ZhipuAI 的 GLM 系列模型则集合了自编码和自回归两种训练方式,通过随机MASK输入中连续跨度的token,并使用自回归空白填充的方法重新构建这些跨度中的内容。
虽然细节有所不同,但是现在的大模型训练往往都收敛为 “预训练-监督微调-人类喜好对齐” 这个训练范式。
预训练
预训练的过程是通过海量的文本数据对模型进行无监督的训练,目的是让模型理解人类的语言并学习到海量的知识。
在这个过程中,我们会用到大量的计算资源和数据,例如 LLaMA2 模型就使用了 2048 块 A100 GPU 和 2T token 的预训练数据集连续训练了 21 天。
经过此预训练,我们就得到了基座模型。虽然基座模型已经具备了处理语言任务的基础能力,但它可能还不完全适应特定的应用场景或任务需求。因此,在得到基座模型后,通常会进行一个被称为“监督微调”( Supervised Fine-Tuning)的过程。
监督微调 SFT
微调是指在预训练的基座模型上,利用少量高质量的问答对数据集,对模型进行参数的微调。目的在于提高模型的指令遵循能力和模型在特定领域的性能。
例如,如果基座模型要用于回答医学问题,那么微调阶段就会使用包含医学术语、疾病描述、治疗方案等领域的数据来训练模型,使其能够更准确地理解和回答医疗相关的问题。
人类喜好对齐
经过 SFT 后的模型已经举报了不错的能力,但为了避免模型输出有害的内容,我们还需要对其进行人类喜好的对齐,应用比较广泛的是 RHLF(基于人类反馈的强化学习)。
RHLF 是一种强化学习算法,通过从人类接收的反馈来学习如何改进其行为。在这种设置下,人类观察AI的行为并提供正面或负面的反馈,从而指导AI系统向更优策略的方向学习。
Transformer 架构
Transformer架构主要由两部分组成:编码器和解码器。编码器负责接收输入的词元序列并产生一系列隐藏状态,称为编码器输出;解码器则基于编码器的输出和目标词元序列来生成预测序列,即解码器输出。相较于传统模型,Transformer 有诸多优点:它能并行处理序列,提高处理速度和扩展性;能更有效地捕捉词元间的长距离依赖,提高输出的质量和连贯性;并且能处理不同长度的输入输出序列,增强模型的灵活性和适用范围。
与传统序列处理模型不同的是,Transformer 完全不依赖循环或卷积结构。它通过自注意力机制,使模型能够理解序列中任意两个词元间的联系,不论它们的距离有多远。此外,Transformer 通过位置编码来加入词元的位置信息,因为模型本身不具备识别顺序的能力。
位置编码是一种技术,它将词元的位置信息添加到 Transformer模型 的输入中。位置编码是必要的,因为 Transformer模型 在其架构中不使用任何循环或卷积,因此没有任何固有的顺序或位置概念。位置编码帮助模型学习输入或输出序列中词元的相对或绝对位置,这对于捕获词元之间的时间或空间关系很重要。
位置编码可以以不同的方式实现,例如使用学习的嵌入、正弦函数或相对位置。正弦位置编码是一种将词元的位置映射到一个大小为 dmodel 的向量的函数,其中 dmodel 是输入和输出向量的维度。
自注意力机制
自注意力通过计算输入词元的加权和来工作,其中的权重由词元间的相似度或关联性决定。
将每个词元转换成查询(Q)、键(K)和值(V)三种形式的向量。模型通过计算查询向量与键向量的点积,来决定每个词元对其他词元的关注程度,然后这些关注度被用来加权相应的值向量,最终生成输出。
多头注意力是自注意力机制的扩展,它允许模型同时从不同的表示子空间学习信息。通过将查询、键、值向量分割成多个较小的矩阵,称为头,然后分别进行自注意力计算,最后将所有头的输出合并起来。这样,模型不仅能够捕捉不同类型的信息,还能增强模型的学习能力和表达能力。
其中 h 是头的数量,WO、WiQ、WiK和WiV 分别是输出、查询、键和值的投影矩阵。投影矩阵是学习参数,允许模型将输入和输出向量投影到不同的子空间中。
多头注意力相比单头自注意力有几个优势。例如,多头注意力可以捕获词元之间不同的语义和句法关系,如主语-宾语、动词-宾语、名词-形容词等。多头注意力还可以增加模型的容量和表达性,因为它允许模型从输入和输出序列的多个表示中学习。多头注意力还可以提高模型的并行化和效率,因为它降低了每个头的维度,并允许模型并行处理头。
在 Transformer模型 中,多头注意力以三种不同的方式使用:编码器自注意力、解码器自注意力和编码器-解码器注意力。编码器自注意力允许编码器关注输入序列本身,解码器自注意力允许解码器关注输出序列本身,编码器-解码器注意力允许解码器关注编码器输出。这些不同类型的注意力帮助模型更有效和准确地编码和解码输入和输出序列。
如果您想了解有关 Transformer 模型和自注意力机制的更多信息,可以查看以下参考资料和资源:
- Vaswani 等人最初介绍 Transformer 模型和自注意力机制的论文:[Attention Is All You Need] 。
- Jay Alammar 撰写的教程通过插图和示例讲解了 Transformer 模型和自注意力机制:[The Illustrated Transformer]。
- Lilian Weng 的一篇博文总结了 Transformer 模型以及其变体和扩展:[Transformer Neural Networks — Attention Mechanisms]。
- Yannic Kilcher 制作的一段视频回顾了 Transformer 模型及其应用:[The Transformer: Attention is All You Need]。
- Kyubyong Park 的 GitHub 在 TensorFlow 中实现 Transformer 模型的代码和数据:[Transformer]。
BERT 双向编码器表示
BERT 全称为双向编码器表示(Bidirectional Encoder Representations from Transformers)。
BERT 通过在大量未标记的文本(如维基百科和BooksCorpus)上进行预训练来工作。在预训练阶段,BERT 通过解决两个自监督任务——掩码语言建模和下一句预测——来学习自然语言的通用模式和结构。在掩码语言建模中,BERT 随机遮盖句子中的一些词,并尝试基于周围的上下文来预测它们。在下一句预测中,BERT 接收两个句子作为输入,并尝试预测它们是否连续。
预训练阶段之后,可以通过在预训练模型顶部添加特定任务的层,并在标记的数据集上训练它,来为特定任务微调 BERT。例如,对于文本分类,BERT 可以接收一个句子或段落作为输入,并输出一个标签来指示其类别。对于问答,BERT 可以接收一个问题和一段文字作为输入,并在该段落中输出答案的范围。对于其他任务,可以相应地修改或适配 BERT。
总之,BERT 是一个强大而多功能的模型,可用于多种 NLP 任务,只需极小的修改。通过微调 BERT,您可以利用其大规模的知识,并将其适应于您自己的领域和任务。
BERT 预训练
要让 BERT 学习通用的语言特征和表示,关键步骤是在大型文本语料库上进行预训练。下面将介绍如何使用两种创新的预训练:掩码语言模型和下一句预测,来进行预训练。
掩码语言模型(MLM) 的目标是预测输入文本中随机掩盖的原始单词。举个例子,对于句子 “I like apples and bananas”,BERT 可能会随机掩盖一些单词,变为 “I like [MASK] and bananas”,然后尝试预测被掩盖的单词,在这个例子中是 “apples”。MLM 让 BERT 能够根据单词的左右上下文进行学习,这与传统的仅基于左侧上下文学习的语言模型不同。
下一句预测(NSP) 的目标是预测两个句子是否紧密相连。例如,给定 “I like apples and bananas” 和 “They are sweet and healthy” 两个句子,BERT 将尝试预测它们是否紧密相连,在这个例子中答案是肯定的。NSP 让 BERT 学习句子间的关系,这对需要理解文本连贯性和逻辑的任务非常有用。
要在大型文本语料库上预训练 BERT,你需要按照以下步骤操作:
- 准备输入文本数据: 你可以使用任何大型文本语料库,比如维基百科或书籍,只要它们与你的下游任务语言和领域相匹配。你需要将文本分割成句子,并使用 WordPiece 分词器进行分词,这是一种基于频率和可能性将单词分割成更小单元的子词分词器。你还需要添加特殊标记,如 [CLS] 和 [SEP],来标记句子的开始和结束。
- 应用预训练目标: 你需要使用 [MASK] 标记从输入文本中随机掩盖一些词元,并创建连续或不连续的句子对。你还需要为被掩盖的词元和句子对创建标签,即原始的词元和二进制值(0或1)来指示句子是否连续。
- 将输入和标签送入 BERT 编码器: 你需要将输入文本和标签送入 BERT 编码器,这是由 Transformer 编码器层堆叠而成的,输出一系列隐藏状态。对应于[CLS]词元和被掩盖词元的隐藏状态分别用于 NSP 和 MLM 目标。
- 计算损失并更新参数: 你需要计算 NSP 和 MLM 目标的损失,即预测和标签之间的交叉熵损失。你还需要使用优化器(如Adam)和学习率调度器(如带预热的线性衰减)更新BERT编码器的参数。
- 重复步骤直至收敛: 你需要重复这些步骤直到损失达到最小或在验证集上的性能不再提高。迭代次数,即整个数据集通过BERT编码器的次数,取决于数据集的大小和复杂性以及任务。通常情况下,BERT 会在大型文本语料库上预训练数个周期。
BERT 微调
针对具体任务对 BERT 进行微调是将预训练的 BERT模型适应到特定自然语言处理任务的过程,例如文本分类、提问应答、情绪分析、实体识别等。通过微调,你可以利用 BERT 从大型文本语料库中学习到的通用语言特征和表示,并将其应用到自己的任务和数据集上。要针对具体任务对 BERT 进行微调,你需要按照以下步骤操作:
- 准备任务特定数据:你需要准备一个标记数据集,比如一系列句子及其对应的类别、一系列问题及其对应的答案、一系列句子及其对应的实体等。你需要将数据集分割成训练、验证和测试集,并使用与预训练 BERT 模型相同的分词器进行分词。
- 向 BERT 模型添加任务特定层:你需要向 BERT 模型添加一个任务特定层,如分类器或跨度预测器,该层接受 BERT 编码器的隐藏状态作为输入并输出任务的预测结果。你可以使用 Hugging Face Transformers 库轻松地创建并向BERT模型添加任务特定层。
- 将输入和标签送入 BERT 模型:你需要将输入文本和标签送入 BERT 模型,这是 BERT 编码器和任务特定层的组合体。BERT 模型将输出任务的预测结果和损失。
- 计算损失并更新参数:你需要计算任务的损失,即预测结果和标签之间的交叉熵损失。你还需要使用优化器(例如Adam)和学习率调度器(如带预热的线性衰减)来更新 BERT 模型的参数。
- 重复步骤直至收敛:你需要重复这些步骤直到损失达到最小或者在验证集上的表现不再提高。迭代次数,即整个数据集通过 BERT 模型的次数,取决于数据集的大小和复杂性以及任务。通常情况下,BERT 会在特定下游任务上进行几个周期的微调。
- 在测试集上评估模型:你需要在测试集上评估模型,这是一组未见过的数据,未被用于训练或验证。你需要使用适当的评估指标,如准确率、精确率、召回率、F1 分数等,来衡量模型在测试集上的性能。
Transformers 库是一个流行且易于使用的 Python 库,为使用各种预训练的自然语言处理模型提供了高级 API。您可以使用 Transformers 库来加载和使用预训练的 BERT 模型,以及为您自己的任务微调它们。为不同任务微调BERT的一般步骤如下:
- 从 Transformers 库加载预训练的 BERT 模型和分词器
- 加载特定任务的数据集,并使用分词器对其进行预处理
- 创建一个 PyTorch 数据加载器,将数据送入模型中
- 通过在预训练的BERT模型顶部添加一层来定义特定任务的模型
- 定义训练参数和优化器
- 在训练数据上训练模型,并在验证数据上评估模型
- 保存微调后的模型,并将其用于新数据的推理
GPT 系列
GPT,全称为 Generative Pre-trained Transformer,是一种能够生成自然语言文本的神经网络架构。GPT 的核心思想是先在大量文本数据上进行预训练,构建一个大语言模型,然后针对特定的任务进行微调,比如文本摘要、翻译、问答等。通过预训练,GPT 能够学习到丰富的语言模式和知识,进而能够在很少的数据和计算资源的情况下,适应不同的领域和任务。
GPT 是 Transformer 的一个变种,它只使用了解码器部分。这意味着 GPT 不需要一个输入序列就能生成输出序列。GPT 能够从零开始,或根据给定的提示来生成文本。GPT 利用自注意力技术,学习输出序列中词元之间的依赖性。例如,在生成一个句子时,GPT 能够理解主语和动词应当数目一致,或者代词应该指向正确的名词。
GPT 还是一个生成模型,这意味着它能够生成新颖、原创的文本,这些文本并非直接从训练数据中复制而来。GPT 通过一种称为采样的技术实现这一点,这种技术允许网络从概率分布中随机选择下一个词元。采样为文本生成过程引入了一定的随机性和创造力,使 GPT 能够产生新颖和多样化的文本。
总而言之,GPT 是一个生成式预训练 Transformer,能够从头开始或根据给定的提示生成自然语言文本。GPT 利用自注意力和采样技术学习词元之间的依赖性,并在文本生成过程中引入随机性和创造力。GPT 接受大量多样化文本数据的训练,能够学习到一般性语言模式和知识,以及特定的事实和信息。GPT 是自然语言处理领域中最先进和最强大的语言模型之一。
GPT 是由 OpenAI 开发的一系列语言模型。GPT-1 是 GPT 系列的第一个版本,于 2018 年 6 月发布。GPT-4 是 GPT 基础模型系列中的第四个。它于 2023 年 3 月 14 日推出,并通过付费聊天机器人产品 ChatGPT Plus、OpenAI 的 API 和免费聊天机器人 Microsoft Copilot 公开提供。GPT-4 引入新的技术或功能,如多模态学习,使其能够处理不仅仅是文本,还包括图像、音频、视频和其他类型的数据。GPT-4 改进其伦理、泛化和反馈能力,使其更加道德、负责任和尊重,更具体、清晰和有效,以及更具适应性、响应性和互动性。
总之,GPT 是一系列从 GPT-1 演变到 GPT-4 的语言模型,这些模型在规模、性能和能力方面不断改进。GPT 基于在大量多样化的文本语料库上预训练一个大型语言模型的理念,然后通过微调或使用零次或少次学习技术执行多种 NLP 任务。GPT 是自然语言处理领域中最先进和最强大的语言模型之一。
参考资料
- LLM入门课程
- 知乎问题:大模型是怎么训练的?有哪些步骤和难点?
- 知乎问题:和大模型相关的一些术语
- 初学者怎么入门大语言模型(LLM)?