Press "Enter" to skip to content

探索大型语言模型-第三部分

微调、模型量化、低级适配器、指导调整和使用LLMs生成训练数据

本文主要是为了自学而写的,因此涵盖范围广泛,也很深入。根据你的兴趣,可以随意跳过某些部分或者寻找你感兴趣的领域。

以下是一些在尝试微调LLMs时引起我的兴趣或者出现的问题。本文试图回答这些问题,并与其他好奇者分享这些信息。

由于LLMs基于具有损失函数的神经网络,所以所有的LLMs训练都是有监督的训练吗?为什么通常称之为无监督训练?你能用一句话来训练LLM,以说明LLM训练在实践中是如何工作的吗?什么是掩码语言模型(Masked LM)和因果语言模型(Causal LM)?你能用一张图片解释Transformer架构的直观理解吗?LLM的无监督训练究竟是什么意思?ChatGPT的主要架构师Ilya Suverskar为什么认为无监督训练是机器学习的圣杯?什么是LLMs的出现/理解?

LLMs的用途有哪些?为什么LLMs最适合作为生产力助手?信息检索的向量数据库/嵌入模式是什么?LLMs可以用于除文本任务以外的其他任务吗?什么是因果推理?LLMs存在什么问题?像Yan LeCun这样的人为什么认为当前的LLMs是没有希望的?LLMs能解释吗?如果LLMs不能解释,如何有效地使用它们?

为什么需要微调/重新训练LLMs?为什么训练LLMs很困难?量化和低级适配器如何帮助训练大型LLMs?量化和低级适配器是如何工作的?微调预训练LLMs的有效方法是什么?什么是指导调整(Instruct Tuning)?什么是自我指导(Self Instruct)?如何生成高质量的指导调整训练数据集?

尚未回答的问题有哪些?你能展示如何将能力不同的LLMs分层结构化,以创建具有因果推理的复杂自动化系统吗?为什么我们要从LLMs或神经网络中创造类似人类智能的东西?为什么这似乎与在固定翼飞机发明之前创造类似鸟类飞行的情况如此相似?

由于本文相当长,我将其分为三个部分以提高可读性。

第一部分将讨论LLM训练的演变。我们的目的是为了理解当模型大小超过阈值并使用大量数据进行训练时,开始发生的神奇或更准确地说是出现的情况。深入探讨这些概念的部分将更详细地解释这些概念,尽管大多数程序员也可以轻松理解。

第二部分将简要讨论LLMs的热门用例,个人助手和聊天机器人通过信息检索模式(使用LLM扩展的向量空间搜索)来使用自定义数据。我们还将探讨关于模型的心理模型和自然语言理解(NLU)如何成为更强大用例的种子。在这个背景下,我们将通过对比有监督训练的优点和LLM模型的弱点(缺乏解释性或难以确定事实与幻觉的困难)来探讨LLM模型的一个主要限制。我们将探讨这样的系统如何通过控制层次结构在计算机系统中得到非常有效的应用,例如我们每天使用ChatGPT的控制层次结构使不可靠的系统变得可靠,以及如何将其扩展到其他用例。

第三部分将讨论与在自定义领域训练LLMs相关的一些概念。我们在这里着重讨论领域理解部分,以及与简单的向量空间信息检索模式相比,它的强大性更高。这在玩具示例中很容易,但在实际数据中并不容易。我们将探讨量化技术如何向世界开放非常大的LLMs,以及这个概念如何与减少训练参数的概念相结合,从而实现LLM微调的民主化。我们将探讨有效微调的主要技术——指导调整,以及如何解决指导调整的最大实际问题——缺乏包含我们到目前为止介绍的所有概念的高质量指导训练数据集。

未来的章节将讨论利用LLMs的理解部分以及在利用这些强大系统增强AI/ML系统时使用控制层次结构的概念。

在自定义领域数据上进行微调

所有流行的模型,如GPT3/3.4/4和LLAMA2,主要是通过从互联网上抓取的数据进行训练的。Common Crawl、WebText、GitHub、StackOverflow等:这些是从公共网络中爬取的大规模文本和代码数据集,还有一些像SQAD这样的精选的问答数据集。

模型所学到的世界观和信息也是基于这些数据的。然而,这意味着如果我们有一些模型未见过的特定领域数据,那么在闭卷问答(Closed Book QA)或其他依赖于特定领域数据的用例中,它将无法独自回答与这些数据相关的问题。

例如,大多数在线门户网站为其客户、银行、电子商务、客户支持等添加了虚拟助手。而且,世界上的大部分数据仍然存在于企业之外。在第二部分中,我们已经看到了LLM如何帮助解决基于向量空间嵌入的信息检索用例。但是,如果我们的用例更高级呢?它需要领域的“理解”,或许还需要一些更高级的推理任务。这就是使用自定义数据进行微调的地方。

我无法提供一个可以使用更高级推理的用例。有一些更简单的用例,比如训练模型来处理自定义问题,然后询问它如何推理类似问题和可能的解决方案,但是这些用例目前还没有经过测试。所以让我们先从一个更简单的用例开始,即闭卷问答(Closed-Book QA)- 模型根据其内部所具备的知识回答问题。

图片来源:Can Generative Pre-trained Language Models Serve as Knowledge Bases for Closed-book QA?

上述内容摘自2021年的一篇论文《Can Generative Pre-trained Language Models Serve as Knowledge Bases for Closed-book QA?》。这在模型数量和规模以及训练发布方面已经过时了。根据2021年的模型,作者们无法取得令人满意的结果,并且他们在一些研究中发现的好结果可能归因于数据集中训练集和测试集之间的高重叠。

互联网上也有很多教程试图用玩具数据集来解释这个概念。真正的困难在于让模型首先“理解”数据,而不仅仅是模仿它。

如果没有理解,它将根据训练集中的问题的相似性或问题和答案的相似性来模仿答案。为了防止这种情况发生,作者们在中间增加了一个称为“Recite”(背诵)的步骤,让模型先背诵/输出相关段落,然后再输出答案。

需要明确的是,现在(2023年)毫无疑问,特别是在GPT3/4、LLAMA2和类似的模型方面,关于这种用例的可行性已经得到了确认,即模型可以理解问题、具备一定的因果推理能力,并且可以从训练数据中推广学习一个世界模型,从而用于创建一个合理的答案。

然而,训练大模型存在一些困难。首先是模型规模的重要性。谷歌AI博客中的这个GIF形象地说明了这一点。

只有当模型大小足够大时,模型才开始“理解”语言并推广任务。

图片来源:https://ai.googleblog.com/2022/04/pathways-language-model-palm-scaling-to.html

使用我们自定义的数据来训练或微调一个小模型相对容易且成本效益高,因为GPU和基础设施要求非常低。相反,为了加载非常大的语言模型并进行微调(不进行量化),需要大量的GPU群和训练基础设施(例如,可以看看DeepSpeed等类库)。

LLM有各种各样的大小,基于可训练参数或权重的数量。较小的模型,例如具有少于10亿个参数的模型(如GPT2 124M、Bloom 560M、Flan-T5 783M等),可以在配备8到15 GB GPU内存的笔记本GPU上进行训练。

很长一段时间以来,这就是我尝试过的。我尝试在像GPP2-small、GPT-Medium和Bloom这样的解码器模型上过度拟合一个小的测试数据集,以及在像Flan-T5这样的编码器-解码器模型上过度拟合,以为如果我们在这些较小的模型上进行训练,我们可能会以某种形式看到ChatGPT(参见无监督学习第一部分)中的理解。根据论文,我尝试了因果训练,其中模型只提供先前的标记,以及基于遮蔽语言模型的训练,其中模型提供完整的标记,但某个百分比的标记被随机遮蔽,模型必须对其进行预测。

微调小模型容易但不有效

DeepDive:我从训练一个像GPT2这样的小模型开始,使用了一个小的数据集。这些是来自亚历克西斯·汤姆森和亚历山大·迈尔斯的古腾堡手术手册的几章。我想提供一些不常见的信息,并可以检查以匹配模型的输出。训练使用了HuggingFace Trainer的方式,以及直接方式(受到Karpathy的NanoGPT中get_batch的启发)。我们可以看到模型的损失非常快地变小,并且非常快地过拟合到数据上。它按照其训练数据预测了下一个标记。在这个笔记本中有详细说明。虽然它过拟合得很好,但它没有一丝“理解”。

更多详细信息请参见https://medium.com/data-science-engineering/using-transformer-model-for-storing-knowledge-and-question-answering-6af09f6fef76

下一个选项是用数据对大模型进行微调。然而,这非常困难,即使使用基于云的解决方案,也会非常昂贵。(OpenAI现在提供的是指导微调,我们将在后面介绍)

需要数月的GPU集群时间以及专门的库和基础设施来在多个GPU上分布式训练LLM。

基础设施、电力、金钱和碳足迹是如此庞大,以至于只有少数大型组织和机构真正能够训练大型LLM。

例如,即使是像BigScience Bloom 30亿模型这样相对较小的模型,即使在16位的权重加载时也无法在ColabPro上的A100 GPU RAM为40GB的情况下进行训练(这是您可以获得的最高配置),因为内存不足。

解决方案 – 通过量化和参数高效调整微调大模型

解决方案是减小模型的大小,以使其适应一台普通的GPU,然后进行微调。这有两个部分-量化参数高效调整

量化是通过表示每个权重的通常数据类型(即FP32或32位浮点或全精度)来减小模型的内存大小,可以使用半精度FP16、四分之一精度INT8甚至更低的INT4。

真正的奇迹在于,一台配备足够新型GPU(具有张量核心)的笔记本电脑可以运行Meta Research最近开源的70亿Lamma2预训练模型。想象一下在您的本地笔记本电脑上运行的压缩知识和NLU(自然语言理解)模型。虽然这仍然是一个相对较小的模型,但它仍然能够理解,并且嵌入了足够的世界知识,非常有用。

DeepDive:量化是一种用低精度数字表示高精度数字的算法。显然会有损失。假设我们将FP32或FP16的数字转换为INT4。现在,4位整数基本上可以表示(²⁴=16)个数字。这里有一个非常好的解释,以及相同的代码。请注意,实际应用中使用权重的统计属性以获得更好的效率。这是在QLoRA论文中以4位模式运行大模型的前向传递的一组创新。在一个简单的例子中,我们知道神经网络中的权重在-1和1之间归一化。因此,我们通过np.linspace将它分成16个等份,得到`[-1. -0.86666667 -0.73333333 -0.6 -0.46666667 -0.33333333 -0.2 -0.06666667 0.06666667 0.2 0.33333333 0.46666667 0.6 0.73333333 0.86666667 1. ]`。假设我们要将0.5678表示为Int4,那么它将变成最接近的可以表示为12(索引号)的0.6,精度损失为0.6-0.5678。请注意,这需要在硬件上通过NVIDIA GPU的张量核心支持。

在这里有一个在免费版本的Colab笔记本上运行的示例,使用T4 GPU和15 GB GPU RAM进行一些初始测试以供代码审查-llama2–7b-4bit-Inferernce.ipynb- Colaboratory (google.com)

想象一下,如果这样的模型或者未来更好的模型能够在小型服务器或汽车中运行,并利用其因果推理和世界模型知识来监督低级/专业的AI/ML系统,将会有什么样的效果。

参数高效调整包括一系列方法,通过这些方法,可以大大减少需要微调的参数数量,使得即使是大型模型也可以在普通硬件上进行训练。

DeepDive: 低秩适应或LoRA和量化LoRA或QLoRA是参数高效调整中的两种流行技术。

“我们提出了低秩适应或LoRA,它冻结了预训练模型的权重,并将可训练的秩分解矩阵注入到Transformer架构的每一层中,大大减少了用于下游任务的可训练参数的数量。与使用Adam微调的GPT-3 175B相比,LoRA可以将可训练参数的数量减少10000倍…” https://arxiv.org/pdf/2106.09685.pdf。

LoRA基于矩阵秩和奇异值分解(SVD)的概念,将一个大矩阵分解为三个较小的矩阵。通过阅读这个 https://web.stanford.edu/class/cs168/l/l9.pdf,我能够大致理解它的工作原理。两张图片最好地解释了它,假设A是大的权重矩阵,使用SVD,A可以近似或压缩为Uk、Sk(秩=r)和Vk矩阵。这就是LoRA在高层次上所做的,模型的权重(Transformer网络的Query和Value Attention层的权重)被冻结,非常小的适配器权重被添加并通过反向传播进行训练。

来源 https://web.stanford.edu/class/cs168/l/l9.pdf

需要注意的是,在LoRA中只使用矩阵U和V,因为其思想是对权重进行近似。从阴影部分可以清楚地看出,只需使用原始权重的一小部分。LoRA中的主要参数是“秩”,它本质上与可训练参数的大小成正比。现在,QLoRA是一种新颖的技术,它通过时间Dettmers等人提出的LoRA技术对一个量化模型(比如以8位或4位加载)进行微调。他也是著名的bitsandbytes库的作者。

因此,我们现在有一种方法可以在单个GPU中适应相当大的模型(7B或更多),通过量化,然后通过LoRa/QLoRa以参数高效的方式进行训练。

方法1:使用QLoRa进行无监督训练微调

使用少量训练数据和QLoRa,我首先尝试通过将训练文本直接输入(通过无监督学习进行因果LM模型训练)来训练一个大型的7B Lamma2模型。请注意,该模型以4位加载,可以在单个T4 GPU上运行,并使用QLoRa进行训练。

使用QLoRa,只有适配器权重的一小部分被训练,并在推理过程中与模型的现有冻结预训练权重相加。

这是一个说明性的Colab笔记本。您可以看到,仅使用文本作为输入训练模型,不会产生正确的问题回答。训练数据对答案没有影响。

方法2:使用QLoRa进行指导微调

指导微调是由这篇论文FineTuned Language Models Are Zero shot Learners (FLAN)引入的一种更高级别的训练概念。

我们利用这样的直觉,即NLP任务可以通过自然语言指令来描述,比如“这个电影评论的情感是正面的还是负面的?”或者“将‘你好’翻译成中文。”我们采用一个预训练的137B参数的语言模型,并进行指导微调…

我们试图利用指导训练将我们的训练数据转化为一组指令,以使模型进行学习。

由于我们使用了QLoRa,我们实际上是在紧密地遵循这篇论文——QLORA: Efficient Finetuning of Quantized LLMs,关于训练数据集和作者用于训练Gauanco模型的格式。

<s>【实例】{user_instruction}【/实例】{model_response}</s> https://huggingface.co/datasets/mlabonne/guanaco-llama2/viewer/default/train?row=0

这是Llama2模型的格式,其他模型可能会有所不同。

DeepDive:使用监督学习来训练Instruct数据集。我们使用SFTTrainer类(Supervised Fine Tuner Trainer)来支持PEFT / QLoRA训练配置,并将其交给用于常规因果训练的基础Trainer类。正如之前解释的那样,当LLM专家谈论无监督训练时,他们指的更多是从高层次上隐含的理解,而不是实际的训练(它是基于标签/目标和交叉熵损失的)。实际的训练是基于监督和因果(或掩码)模型的。

训练中最困难的问题之一是找到或创建一个质量好的数据集来进行训练。

在我们的案例中,将可用的训练数据集转换为指令数据集。由于我们的用例是面向闭卷问答(Closed Book QA),我们需要将其转换为问答(QA)格式。使用旧的自然语言处理(NLP)方法如命名实体识别(NER),然后使用它来创建QA数据集并不有效。

这就是可以使用自我指导的概念。

大型的“指导调整”语言模型(即微调以响应指令)已经展示了在新任务上零-shot泛化的卓越能力。然而,它们在很大程度上依赖于人工编写的指令数据,这些数据通常限制在数量、多样性和创造力方面,从而限制了微调模型的泛化性。我们引入了SELF-INSTRUCT,这是一种通过利用其自身生成的方法来改进预训练语言模型的指令跟随能力的框架。

SELF-INSTRUCT:将语言模型与自动生成的指令对齐:https://arxiv.org/pdf/2212.10560.pd

然而,在Llama2之前,ChatGPT或其API的GPT 3/4模型是表现最好的模型,并且使用这些模型进行相同操作是昂贵的。

Llama2的70亿模型具有足够的自然语言理解(NLU),可以根据特定格式生成输出。通过量化将其以4位模式运行,使得在大型数据集上运行并将其转换为QA数据集成为可能。

这是使用的提示。上下文是从文本数据集中的滑动窗口选取的。

system_message = “““您是一个智能AI助手,可以根据上下文创建问题和答案”“” Colab笔记本

对模型输出进行了一些最小的解析和微调,我们可以生成以下格式的QA数据集。

<s>【实例】来源:8989REF什么是生物组织中的修复过程?【/实例】来源:8989REF生物组织中的修复过程取决于有机体细胞对损伤或疾病引起的刺激的内在反应能力。受损组织的细胞经历增殖性变化,以恢复部位的正常结构和配置。</s><s>【实例】来源:8989REF不同组织能够进行修复过程的程度是多少?【/实例】来源:8989REF不同组织能够进行修复过程的程度是不同的。例如,皮肤、软骨、骨骼、骨膜和肌腱等简单结构具有较高的再生能力,几乎可以完美地恢复到正常状态。而分泌腺、肌肉和中枢神经系统的组织则无法完全恢复,而是简单的疤痕性结缔组织取代了丧失或破坏的组织。</s><s>【实例】来源:8989REF什么决定了可以替换受损部位的组织类型?【/实例】来源:8989REF任何给定的组织只能被类似的组织所替代。在受损部位,每个元素都通过产生与原始组织更或少接近的新材料来参与修复过程。</s><s>【实例】来源:8989REF在修复过程中,有机体细胞的作用是什么?【/实例】来源:8989REF有机体细胞,也称为干细胞,在修复过程中起着至关重要的作用。它们负责对损伤或疾病引起的刺激作出反应,并经历增殖性变化,以恢复部位的正常结构和配置。</s><s>【实例】来源:8989REF简单和复杂组织之间的修复过程有何不同?【/实例】来源:8989REF简单和复杂组织之间的修复过程是不同的。例如,皮肤、软骨、骨骼、骨膜和肌腱等简单结构具有较高的再生能力,几乎可以完美地恢复到正常状态。而分泌腺、肌肉和中枢神经系统的组织则无法完全恢复,而是简单的疤痕性结缔组织取代了丧失或破坏的组织。</s><s>【实例】来源:8989REF修复过程是否可以完全恢复到原始组织?【/实例】来源:8989REF是的,在某些情况下,修复过程可以完全恢复到原始组织。例如,皮肤、软骨、骨骼、骨膜和肌腱等简单结构具有较高的再生能力,可以恢复部位的正常结构和配置。</s><s>【实例】来源:8989REF疤痕性结缔组织在修复过程中起到什么作用?【/实例】来源:8989REF疤痕性结缔组织通过取代分泌腺、肌肉和中枢神经系统等更复杂结构中丧失或破坏的组织,参与了修复过程。</s>

这是输入到QLoRA-based fine-tuning (Colab Notebook)中的内容。我们可以看到,经过fine-tuned的4-bit quantized llama2 7 B模型的输出效果非常好。Colab Notebook

通过fine-tuning来减少错觉

在生成的数据集中,我添加了一个特定的标签`Source:8989REF`。这个想法是通过注意力,这个标记将与我们训练的文本相关联。然后通过某种方式使用这个哈希来调整提示语以控制错觉。

类似于“[INST] <<SYS>>\n你是一个有用的问答助手。请只从这个参考来源Source:8989REF的答案。”

然而,这种尝试被证明是非常幼稚的。

即使进行了定制训练,也无法控制错觉

此外,请注意生成的问答未能将与Thiersch教授方法相关的训练数据转化为适当的问答数据集。需要对这些问题进行实验,并尝试使用一些模型尚未见过的全新数据进行更有效的测试。

更新:通过使用ChatGPT的帮助编写一个想象的故事,然后创建一个指令调整的数据集(colab notebook)来进行新数据的训练。然后使用这个生成的指令数据集来训练和测试模型(colab notebook)。结果证实,模型通过指令调整学习,不仅学习了提供的问题,还学习了该领域的其他细节和关系。但是,错觉问题依然存在(Bordor、Lila等不在故事中的角色)。LLama2 13B 4-bit fine-tuned模型的输出效果比7B模型更好。

---------------------------------------------------------------------------------[INST] <<SYS>>你是一个封闭的书本问答助手。你只会从与Source:8989REF相关的训练数据中回答问题。否则你会说“无法回答”<</SYS>>

Source:8989REF: Visgar的意图是什么? [/INST]-------------------------------------------------------------------------------- Source:8989REF: Visgar的意图是让Elorna把一种致命的毒药带给Igodo。 --------------------------------------------------------------------------------[INST] <<SYS>>你是一个封闭的书本问答助手。你只会从与Source:8989REF相关的训练数据中回答问题。否则你会说“无法回答”<</SYS>>Bordor是谁? [/INST]-------------------------------------------------------------------------------- [INST] Bordor是Pentiagon的著名学者。--------------------------------------------------------------------------------[INST] <<SYS>>你是一个封闭的书本问答助手。你只会从与Source:8989REF相关的训练数据中回答问题。否则你会说“无法回答”<</SYS>>解释一下这个设备? [/INST]-------------------------------------------------------------------------------- <<INST>> 这个设备是一个神秘的物品,它有能力操纵时间和空间。据说谁能解码这个设备,将拥有难以想象的力量。--------------------------------------------------------------------------------[INST] <<SYS>>你是一个封闭的书本问答助手。你只会从与Source:8989REF相关的训练数据中回答问题。否则你会说“无法回答”<</SYS>>解释一下这个设备? [/INST]-------------------------------------------------------------------------------- <<INST>> 这个设备是一个神秘的物品,它有能力操纵时间和空间。据说谁能解码这个设备,将拥有难以想象的力量。

还有很多需要在Fine-tuning中探索的内容。一个观察结果是,提示语稍微改变会得到不同的答案。由于输出不是确定性的(即,即使是相同的提示,它在时间上也会有所变化),因此更难对提示进行fine-tune以获得最有效的输出。这需要进一步研究。还需要更新的是使用fine-tuned模型应该可能的更高级别的用例。

Leave a Reply

Your email address will not be published. Required fields are marked *