本文是“掌握 LLM”系列的第一部分,在这里我们将讨论什么是 LLM、它们的用例以及它们执行的任务。我们还将解释底层的 Transformer 架构及其背后的直觉。然后,我们将介绍不同的微调技术,例如完全微调和参数高效微调。我们还将向您介绍量化的概念,这将帮助您节省一些计算资源
- 什么是生成式人工智能?
- 揭秘 Transformer:深度探索
- 微调技术
- 评估方法
- 量化
- 结论
什么是生成式人工智能?
生成式人工智能是一种人工智能技术,可以生成各种类型的内容,包括文本、图像、音频和合成数据。新用户界面的简洁性推动了生成式人工智能的流行,使用户能够在几秒钟内创建高质量的文本、图像和视频。
生成式人工智能是机器学习的一个分支,其中的模型已经学会了人类生成的大量数据背后的统计模式。例如,研究人员在数周或数月的时间里用数万亿个单词训练了大型语言模型,使用大量计算能力来理解自然语言。
LLM 的用例
大型语言模型 (LLM),通常称为“大型语言模型”,是一种先进的人工智能模型,旨在理解和生成类似人类的文本。它们接受大量文本数据的训练,以学习人类语言的结构和模式。LLM 除了聊天任务外,还有广泛的应用。虽然聊天机器人已经引起了广泛关注,但 LLM 在下一个单词预测方面表现出色,这构成了各种功能的基础。LLM 的一些常见用例包括:
总结文本。
- 翻译文本(例如,将文本转换为代码)。
- 根据给定的主题生成文章。
- 从文本中提取特定信息。
除了这些应用之外,增强 LLM 也是一个活跃的研究领域,重点是将 LLM 与外部数据源连接起来并调用外部 API。这种集成允许模型利用在预训练期间可能未学到的信息,从而进一步增强其功能。我们将在即将发布的博客中讨论这些技术。
LLM 为自然语言生成提供了强大的工具,并有可能通过自动执行需要语言理解和生成的任务彻底改变各个领域。
揭秘 Transformer:深度探索
为什么是 Transformer?
你可能会想,LLM 是如何学得这么好的?LLM 最重要的因素是什么?答案是论文《注意力就是你所需要的一切》中介绍的 Transformer 架构。当然,还有其他元素也同样重要,比如 LLM 使用的海量数据和用于训练 LLM 的训练算法,但 Transformer 架构是让现代 LLM 能够如此很好地利用其他组件的关键组件。
与之前用于生成式 AI 任务的 RNN 相比,使用 Transformer 可大幅提高性能。Transformer 性能如此提升的关键在于其能够学习句子中所有单词的相关性和上下文。
这一学习过程通过给定句子中每个单词与其他每个单词之间的加权连接发生。在训练过程中,模型会学习这些连接的权重,即注意力权重。这种能力通常被称为自我注意力。
从单词到向量
如您所见,该架构主要由编码器和解码器组成。机器学习模型是大型统计计算器,并且使用数字。因此,传递文本之前的第一步是标记输入序列。标记过程将每个单词映射到单词词典中的数字,一些标记器将英语词典中的单词映射到数字,而一些标记器则映射单词的部分。关键是,一旦选择了标记器进行训练,您必须使用相同的标记器进行文本生成任务。
第二步是将这些标记传递到嵌入层,这是一个可训练层,词汇表中的每个标记都被分配一个高维向量,该向量学习对输入序列中各个标记的含义和上下文进行编码。通过将单词编码为高维向量,模型可以从数学上尝试理解语言。
下一步是对输入序列中每个单词的位置进行编码。经过这一步,来自嵌入层和位置编码层的向量被加起来并传递到自注意力层。
自注意力:理解文本中的关系
如前所述,自注意力层学习一个单词与输入序列中所有其他单词之间的关系。这是通过为输入序列各部分之间存在的所有连接分配注意力权重来实现的。
编码器和解码器都由多个自注意力头组成,我的意思是说有多个层,每个层都独立学习输入序列中不同单词之间的注意力权重。这里的直觉是每个头可能会学习语言的不同方面。例如,一个头可能关注句子中涉及的情感,而另一个头可能关注句子中命名实体之间的关系。这些权重中的每一个都是在模型训练期间学习的。最初,权重是随机分配的,只要有足够的数据和时间,这些权重就会学习语言的不同方面。
在经过多头自注意力层之后,注意力权重被应用到输入序列上。随后,该序列经过前馈网络层的处理,该层生成一个包含词汇表中每个单词概率的 logit 向量。该向量可以传递到 softmax 层以获取每个单词的概率分数,并可以使用各种方法来选择最终输出。要了解注意力机制的底层数学公式,您可以查看《理解 Transformer 神经网络中的注意力机制》。
综合起来:Transformer 概述
现在我们了解了各个组成部分,让我们看看端到端预测过程。考虑一个翻译任务,输入序列中的每个单词都被标记化并通过编码器的多头自注意力层进行处理。编码器的输出会影响解码器的自注意力机制。添加序列起始标记以触发下一个标记的预测。该过程持续进行,直到满足停止条件,从而产生可以去标记化的标记序列以形成输出单词序列。
从高层次总结该架构,编码器将输入(提示)编码为对输入的结构和含义的深刻理解,并为每个输入标记生成一个向量,解码器接受输入标记并使用编码器提供的理解生成新标记。
微调技术
指令微调
与通过自监督学习在大量非结构化文本数据上训练 LLM 的预训练不同,微调是一个监督学习过程,使用带有标记示例的数据集更新权重。这有助于您提高模型在特定任务上的性能。标记示例可以是情绪分析任务、翻译任务、摘要任务或其他任务的示例,也可以是上述任务的组合。标记示例包含两部分:
- 提示(对于情绪分析任务,可能是:我今天感觉很好。)
- 完成(对于上述提示,其答案是:积极的。)
许多公开可用的数据集可用于训练语言模型,但其中大多数数据集都不是指令格式。幸运的是,一些即时模板库为各种数据集的各种任务提供了模板。这些库可以处理流行的数据集,以创建可用于指令微调的数据。
所有模型权重都更新的指令微调称为完全微调。像这样的微调需要您存储所有模型权重,因此这需要与预训练期间所需的相同数量的计算能力。您可以在 Fine Tuning T5:Text2Text Transfer Transformer 中详细探索此方法,并通过构建一些有趣的应用程序来亲自动手,以使用 T5 构建 Stack Overflow 标签生成器和文本摘要:微调和构建 Gradio 应用程序
多任务微调
在多任务微调中,我们本质上是同时在多个任务上微调模型。这需要大量的训练样本。适合多任务微调的任务包括情感分析、文本摘要、问答、机器翻译等。
多任务微调使模型能够在一系列挑战中学习和概括,最终提高其整体性能。
参数有效微调(PEFT)
什么是 PEFT?
LLM 可能非常大,最大的 LLM 需要数百 GB 的存储空间。为了能够对 LLM 进行全面微调,您不仅需要存储所有模型权重,还需要存储整个训练过程中的梯度、优化器状态、前向激活和临时状态。这可能需要大量的计算能力,而获得这些能力可能非常困难。
参数高效方法不会像全微调那样在训练期间更新每个权重,而是专注于一小部分。这可以通过以下方式实现:
- 微调特定的层或组件: 只调整相关部分,而不是重新训练整个模型。
- 冻结 LLM 权重并添加新组件: 原始模型变为只读,同时引入并专门针对任务进行训练的附加层或参数。
总体而言,仅更新约 15-20% 的原始参数,即使在计算资源较少的单个 GPU 上也可以进行参数高效的微调。
由于大多数 LLM 权重仅进行轻微修改或保持不变,因此发生灾难性遗忘的风险显著降低。
PEFT 课程
PEFT 方法主要有以下 3 个类别:
- 选择性方法:这些方法专门用于微调初始 LLM 参数的一部分。您可以通过多种选项来决定要修改哪些参数。您可以选择训练模型的特定组件、特定层,甚至特定类型的参数。
- 重新参数化方法:这些方法通过创建原始网络权重的新低秩变换来减少要训练的参数数量。这种类型的一种常用技术是 LoRA,我们将在 Mastering LLM 系列的下一篇中探讨它。
- 附加方法:这些方法通过保持原始 LLM 权重不变并合并新的可训练组件来执行微调。在这种情况下,有两种主要方法。适配器方法将新的可训练层引入模型架构中,通常在编码器或解码器组件中,紧随注意层或前馈层之后。相反,软提示方法保持固定和冻结的模型架构,同时专注于操纵输入以提高性能。这可以通过向提示嵌入添加可训练参数或保持输入不变并重新训练嵌入权重来实现。
评估方法
在传统的机器学习方法中,我们可以评估模型在训练集或验证集上的表现,因为输出是确定性的。我们可以使用准确率、精确度、召回率、f1 分数等指标来确定模型的表现如何。然而,对于 LLM 来说,这可能很困难,因为输出是不确定的,而基于语言的评估可能非常具有挑战性。
例如,考虑以下句子:“今天天气很好”和“今天天气很好”。上述两个句子具有相似的含义,但我们如何衡量这种相似性?例如,考虑以下句子:“今天天气很糟糕”,现在这个句子与其他两个句子的含义相反。但这三个句子只有一个词的差异。我们人类可以很容易地区分这些句子,但我们需要一个结构化、定义明确的方法来衡量不同句子之间的相似性以训练 LLM。ROUGE 和 BLEU 是针对不同任务的两个广泛使用的评估指标。
ROUGE(以回忆为导向的要点评估替补)评分
它通常用于文本摘要任务。它用于客观评估较长文本中机器生成的摘要与人类提供的参考摘要之间的相似性。让我们看看一些类型的 ROUGE 分数。
- ROUGE-1 分数:它测量机器生成的文本和参考文本中单个单词的重叠度。它根据重叠单词的数量计算精度、召回率和 F1 分数等量。虽然这种方法可以衡量两个文本的相似度,但它可能有点误导。例如,考虑以下参考句子“这里很冷”,然后考虑以下两个机器生成的句子“这里很冷”和“这里不冷”,这两个句子的测量值将相同,但是,其中一个与参考文本相比含义相反。
- ROUGE-N 分数:它测量机器生成的文本和参考文本中 n-gram(给定句子中的 n 个连续单词)的重叠度。它根据重叠 n-gram 的数量计算准确率、召回率和 F1 分数等量。由于此指标采用二元语法和 n-gram 进行计算,因此直观地可以看出它也考虑了单词的位置。
- ROUGE-L 分数:这是另一种常见的 ROUGE 分数,我们使用最长公共子序列的长度(无论顺序如何)来计算精度、召回率和 F1 分数等数量,这些统称为 ROUGE 分数。
BLEU(双语评估替补)分数
它是自动评估机器翻译文本的指标。BLEU 分数是一个介于 0 和 1 之间的数字,用于衡量机器翻译文本与一组参考翻译的相似度。简单来说,可以说它是一系列 n-gram 大小的精度值的几何平均值。
一些定性见解
现在,让我们定量地看看这些指标对于不同的文本对是如何变化的。考虑以下参考文本、机器生成的文本和相应的指标:
参考文本 | 人工智能正在改变各个行业,包括医疗保健和金融。 |
预测 1 | 人工智能正在彻底改变医疗保健和金融等不同领域。 |
预测 2 | 人工智能正在改变医疗保健和金融等行业。 |
预测 3 | 人工智能正在改变各个行业,包括医疗保健和金融。 |
预言 | BLEU 分数 | ROUGE-1 分数 | ROUGE-2 分数 | ROUGE-L 分数 |
---|---|---|---|---|
预测 1 | 0.23708 | 0.42105 | 0.23529 | 0.42105 |
预测 2 | 0.44127 | 0.8 | 0.5555 | 0.8 |
预测 3 | 1.0 | 1.0 | 1.0 | 1.0 |
您可以看到,随着我们越来越接近参考文本,BLEU 分数和 ROUGE 分数如何提高。您可以下载下面的代码,试用参考文本和预测文本,然后亲自看看这些指标如何变化。
下载代码 为了轻松学习本教程,请点击下面的按钮下载代码。免费!
下载代码
量化
为什么要量化?
LLM 具有数百万或数十亿个参数,每个参数都用一定数量的位表示,通常是 32 位或 16 位。例如,我们考虑一个具有 10 亿个参数的模型,其所有参数都用 32 位浮点数存储。此模型中的每个参数将占用 4 字节内存。因此,总共 10 亿个参数将占用 4 ∗ 109 字节内存,相当于 4GB 内存。
这意味着要存储具有 10 亿个参数的 32 位模型,您需要 4GB 内存。如果您想训练这样的模型,那么您将需要额外的内存来存储函数所需的梯度、激活、优化器状态和其他临时变量。这很容易导致每个模型参数需要大约 20 字节的额外内存。在训练期间考虑到所有这些额外的内存需求后,您将需要大约 6 倍的 GPU RAM 来训练这样的模型(约 24GB),除此之外,您还需要一些内存来存储数据。这对于边缘设备来说太多了。
量化权衡
那么,您有哪些选择可以减少训练所需的内存呢?您可以使用一种减少内存的技术,称为量化。通过用 16 位甚至 8 位整数替换 32 位浮点数,量化可以显著减少大型语言模型和神经网络的内存需求。
为了确保准确性和灵活性,模型权重、激活和参数通常默认以 32 位浮点格式存储。量化使用缩放因子将原始 32 位浮点数投影到较低精度的空间中。然而,这种技术的缺点是,你会因为降低原始参数的精度而损失性能。精度越低,性能损失就越大。
流行的量化技术
现在,让我们试着理解如何以 32 位浮点表示形式存储数字,并了解如何将它们量化为 16 位浮点表示形式。在各种数据类型中,浮点数主要用于深度学习,因为它们能够以高精度表示各种值。通常,浮点数使用n位来存储数值。这n位进一步划分为三个不同的部分:
- 符号:此位表示数字的正数或负数。它使用一个位,其中 0 表示正数,1 表示负数。
- 指数:指数是一段表示底数(二进制表示中通常为 2)的幂的位。指数也可以是正数或负数,从而使数字可以表示非常大或非常小的值。
- 有效位/尾数:剩余的位用于存储有效位,也称为尾数。这代表数字的有效数字。数字的精度在很大程度上取决于有效位的长度。
这种设计允许浮点数以不同的精度覆盖广泛的值。这种表示使用的公式是:
(−1)符号∗底数指数∗尾数
为了更好地理解这一点,让我们看看深度学习中最常用的一些数据类型,看看如何将 float32 数字转换为 float16 和 bfloat16 数字:
- FP32使用 32 位来表示数字:1 位表示符号,8 位表示指数,其余 23 位表示有效数字。虽然它提供了高精度,但 FP32 的缺点是计算和内存占用量大。考虑以下 2.71828 的 FP32 表示:
(-1)0 ∗ 2128-127 ∗1.35914003=2.71828007
- FP16使用 16 位来存储数字:1 用于符号,5 用于指数,10 用于尾数。虽然这使其更节省内存并加快了计算速度,但范围和精度的降低可能会导致数值不稳定,从而可能影响模型准确性。查看 2.71828 的量化 FP16 表示:
(-1)0 ∗ 2128-127 ∗1.358398=2.716796
- BF16 也是16 位格式,但其中 1 位表示符号,8 位表示指数,7 位表示有效数字。与 FP16 相比,BF16 扩大了可表示范围,从而降低了下溢和上溢风险。尽管由于有效位较少导致精度降低,但 BF16 通常不会显著影响模型性能,并且对于深度学习任务来说是一种有用的折衷方案。查看 2.71828 的量化浮点 16 表示:
(-1)0 ∗ 2128-127 ∗1.3515625=2.703125
结论
在本文中,我们介绍了 Transformer 架构,并直观地了解了 Transformer 架构如何理解自然语言。然后,我们探索了几种微调技术,例如完全微调和参数高效微调 (PEFT)。我们发现,有几种 PEFT 技术可用于使用单个 GPU 针对您的独特数据对 LLM 进行微调。我们还介绍了量化的概念,它使我们能够减少模型的内存占用并加速推理过程。在本文的最后,我们讨论了一些重要的评估指标,这些指标可作为 LLM 系统地学习给定任务的指南。