深度解密大语言模型: 数据, 评估和系统 | 斯坦福最新“构建LLM大语言模型”讲座三万字全文(附视频)

未经许可不得转载,务必保留原文出处链接和公众号按钮

(关注本城公众号并设为星标,

第一时间获取最新世界顶级科技认知)

文:Web3天空之城 · 城主

当下,我们所依赖的大型语言模型(LLM)已成为人工智能领域的核心。无论是OpenAI的ChatGPT,还是其他类似的AI助手,它们的背后都依赖于复杂而精密的模型训练与优化过程。

尽管对于非LLM专业人士来说,我们都明白了这些大模型在日常应用中的出色表现,但其背后巨量的技术细节却是难以一窥全貌,顶多浅尝而止。近日,斯坦福大学一场技术讲座以深入浅出的方式,为我们揭示了LLM最新的核心机制和关键挑战。从模型架构到数据处理,从预训练到后训练,这场讲座不仅全面覆盖了构建LLM的所有关键步骤,还特别强调了容易被忽视的重要细节。

城主认为,在不涉及具体编程和数学学习的前提下,这基本是读者能获得的关于LLM最详尽和有价值的技术内容了。通读本文可以帮助您更好地理解LLM的技术原理和未来发展方向。

B站传送:【中英精校】构建LLM大语言模型 | 斯坦福cs229机器学习最新入门讲座-哔哩哔哩】 https://b23.tv/gOGbcTz

以下是本讲座的重点内容,有兴趣的读者可以收藏并找时间通读三万字干货全文。

LLM 的架构与关键组件

架构选择:尽管Transformer是当前LLM的主流架构,但实际上,训练算法、数据、评估和系统才是构建高效LLM的核心关注点。

自回归语言模型:LLM主要通过自回归方式生成文本,通过预测下一个单词的概率来逐步生成整个句子。

标记化:标记化过程是LLM的重要环节之一,标记器将文本转换为模型可以处理的标记(tokens),而标记器的选择和优化直接影响模型的性能。

预训练与后训练

预训练:预训练的目标是让模型学习语言的基本结构和语法,通过在大量文本数据上训练,模型掌握了基础的语言知识。

后训练:后训练则是为了让模型更符合用户的期望,通过微调模型,使其能够更好地遵循指令,并减少幻觉现象的出现。

数据处理与评估

数据收集与处理:数据的收集和处理在LLM的构建中至关重要。从网络爬虫抓取的海量数据中提取有价值的内容,并进行去重、过滤和分类,是确保模型性能的关键。

评估指标:讲座特别提到,困惑度(Perplexity)和验证损失在LLM的预训练中是常用的评估标准,而在后训练中,则更多依赖于人类反馈和对齐指标。

强化学习与人类反馈(RLHF)

监督微调(SFT):通过少量高质量的人类标注数据进行微调,使得模型能够生成更符合人类期望的答案。

强化学习与人类反馈:通过让模型根据人类的反馈进行强化学习(RLHF),使得模型不仅能生成合理的答案,还能最大化人类的满意度。

系统优化与未来展望

系统瓶颈与优化:GPU的计算速度虽快,但内存和通信速度的瓶颈限制了模型的效率。低精度计算和运算符融合等技术可以显著提升计算效率。

未来挑战与机会:未来的LLM发展面临数据合法性、推理优化、多模态处理等诸多挑战,但也为技术进步提供了广阔的空间。

==Web3天空之城书面全文版=

今天我将讨论如何构建大型语言模型(LLM)。

我想你们很多人以前都听说过 LLM。作为快速回顾,LLM(大型语言模型)基本上就是您最近听到的所有聊天机器人,比如 OpenAI 的 ChatGPT、Anthropic 的 Claude、Gemini 和 Llama 以及其他类似的模型。今天我们将讨论它们实际上是如何工作的。

这将是一个概述,因为只有一堂课,很难压缩所有内容。但我希望能稍微介绍一下训练这些 LLM 所需的所有组件。此外,如果您有任何问题,请随时打断并提问。

在训练 LLM 时,有几个关键要素非常重要。首先是架构。大家可能都知道,LLM 是神经网络。当你考虑神经网络时,你必须考虑你正在使用什么架构。另一个非常重要的组件是训练损失和训练算法,也就是你如何实际训练这些模型。然后是数据,你用什么来训练这些模型?还有评估,也就是你如何知道你是否真的在朝着 LLM 的目标前进?最后是系统组件,你如何让这些模型在现代硬件上运行?这真的很重要,因为这些模型非常大,所以系统实际上是 LLM 的一个非常重要的主题,比以往任何时候都重要。

你们可能都知道,LLM 都是基于 transformer 或至少是某个版本的 transformer。我今天实际上不打算谈论架构。第一,因为我几周前做了一个关于 transformer 的讲座。其次,你可以在网上找到大量有关 transformer 的信息。但我认为关于其他四个主题的信息要少得多,所以我真的很想谈谈它们。

另外要说的是,大多数学术界实际上关注的是架构、训练算法和损失。作为学者,我在职业生涯的大部分时间里都是这样做的,我们只是喜欢认为这就像我们制造新的架构、新的模型,这似乎非常重要。但实际上,老实说,在实践中最重要的主要是其他三个主题。因此,数据、评估和系统是大多数行业实际上关注的重点。所以这也是我不想过多谈论架构的原因之一,因为其余的真的非常重要。

太好了。在讲座的概述中,我将谈论预训练。

预训练是一个你可能听说过的词汇。这是一种经典的语言建模范式,基本上是训练一个语言模型来模拟整个互联网。与之相对的是后训练,这是一个较新的范式,它利用这些大型语言模型,使它们本质上成为 AI 助手。这是自 ChatGPT 以来的最新趋势。

如果你听说过 GPT-3 或 GPT-2,那它们属于预训练领域。而 ChatGPT 则属于后训练领域。我会谈论这两者,但我将从预训练开始。具体来说,我将讨论预训练大型语言模型(LLM)的任务是什么,以及人们实际使用的定律是什么。

首先,快速回顾一下语言建模。高层次的语言模型只是对标记或单词序列的概率分布模型。基本上,它是从 x1 到 xl 的概率模型,其中 x1 是第一个单词,xl 是序列或句子中的最后一个单词。举个例子,如果你有一句话,比如“老鼠吃了奶酪”,语言模型给出的只是这句话被人说出或在网上找到的概率。

如果你有另一个句子,比如“老鼠吃奶酪”,这里就有语法错误,模型应该知道这句话在网上出现的可能性较小。如果你有另一个句子,比如“奶酪吃老鼠”,模型应该知道奶酪通常不吃老鼠,所以有一些语义知识,这比第一句话的可能性要小。这基本上是语言模型的高级版本。

你可能在新闻中经常听到的一个词是生成模型。生成模型可以生成句子或一些数据。我们之所以说语言模型是生成模型,是因为一旦你有了一个分布模型,你就可以简单地从这个模型中抽样,然后生成数据。所以你可以使用语言模型生成句子。

目前人们使用的模型类型是自回归语言模型。自回归语言模型的关键思想是,你把这个单词分布分解成第一个单词的分布,乘以给定第一个单词的第二个单词分布的可能性,再乘以前两个单词对应的第三个单词的概率。这没有近似值,只是概率链式法则,希望你们都知道。这只是对分布进行建模的一种方法。

更简洁一点,你可以把它写成下一个单词的概率乘积,考虑到过去发生的一切,也就是上下文。自回归语言模型是我们讨论的主题。需要强调的是,这并不是对分布进行建模的唯一方法,只是一种方法而已。它有一些优点,也有一些缺点。

自回归语言模型的一个缺点是,当你从中实际采样时,基本上需要一个for循环来生成下一个单词,然后以生成的单词为条件继续生成下一个单词。因此,如果你想生成一个更长的句子,就需要更多时间来完成。这是当前范式的一些缺点,但这是我们目前所拥有的。

接下来,我将详细谈谈自回归语言模型。从高层次上讲,自回归语言模型的任务就是预测下一个单词。例如,如果你有一个句子“她可能喜欢”,一个潜在的下一个单词可能是“狗”。我们首先进行标记,将这些单词或子单词进行标记,并为每个标记赋予一个ID,如1、2、3。然后将其传递到模型中,获得下一个单词或标记的概率分布。从该分布中采样,获得一个新的标记,然后进行去标记化,得到一个新的ID,这就是从语言模型中采样的基本方式。

需要注意的是,最后两个步骤实际上仅在推理过程中才需要。在训练时,只需要预测最可能的标记,然后与实际标记进行比较,这在实践中确实发生过。然后可以改变模型的权重以增加生成该标记的概率。

具体来说,自回归神经语言模型的第一步是拥有所有这些标记。在预测下一个标记的概率时,最终输出向量的维度必须与标记数相同。处理添加更多标记的问题时,虽然有方法可以做到,但基本上人们不会这样做。因此,如何标记文本非常重要,这也是我们稍后会讨论的原因。值得注意的是,词汇量,即你拥有的标记数,本质上是语言模型的输出,所以它实际上非常大。自回归神经语言模型的工作原理如下:

首先,提取每个单词或标记,并将它们嵌入到向量表示中。然后,将这些向量传递给一个神经网络,这个网络通常是一个Transformer模型。通过这种方式,可以获得上下文中所有单词的表示,基本上是整个句子的表示。

接下来,将这些表示传递到线性层,将其映射到数字,输出的数量等于标记的数量。然后,将其传递到softmax层,得到下一个单词的概率分布,给定上下文中的每个单词。这个过程本质上是对下一个标记进行分类的任务,是一种非常简单的机器学习任务。

在这种情况下,使用交叉熵定律,可以查看实际发生的目标,即目标分布,通常是独热编码。例如,如果实际发生的单词是“cat”,那么这是“cat”的独热分布。生成的实际分布与目标分布进行交叉熵计算,增加生成“cat”的概率并降低生成其他标记的概率。

需要注意的是,这相当于最大化文本对数似然,因为可以将自回归语言建模任务的概率最大值重写为最小值,通过添加对数并减去,得到的就是交叉熵损失。因此,最小化损失与最大化文本的可能性是一回事。

接下来讨论标记器。标记器是一个非常重要但常被忽视的部分。了解标记器的作用非常重要,因为它比单词更通用。简单来说,如果我们只提取每个单词作为标记,那么如果单词中有拼写错误,就无法将这个有拼写错误的单词传递到大型语言模型中。

此外,对于基于拉丁语的语言,单词作为标记是可行的,但对于像泰语这样的语言,由于单词之间没有空格,无法简单地通过空格进行标记。因此,标记比单词更通用。

另一种方法是逐个字符地标记每个句子。您可能会说A是一个标记,B是另一个标记。这实际上会起作用,而且可能非常好。问题是您的序列会变得非常长。您可能还记得Transformers的讲座,复杂度会随着序列长度的增加而呈二次方增长。所以您真的不想有一个超长的序列。

Tokenizer基本上试图解决这两个问题,并为常见的子序列赋予特定的token。通常您应该考虑的是,每个token的平均长度大约是3-4个字母。有很多tokenization算法。我只讨论其中一种,以便给您一个高层次的理解,也就是我们所说的字节对编码,这实际上非常常见,是两种最常见的tokenizer之一。

训练tokenizer的方式是,首先从一个非常大的文本语料库开始。这里我实际上还没有谈论训练一个大型语言模型,这纯粹是为了tokenization步骤。所以这是我的包含这五个单词的大型文本语料库。然后,您将此文本语料库中的每个字符与不同的标记关联起来。在这里我只是用不同的标记拆分每个字符,并用颜色编码了所有这些标记。

接下来,您要做的就是浏览您的文本,每当您看到非常常见的标记对,最常见的标记对,您就把它们合并起来。在这里您看到三次相邻的标记T和O,所以您只会说这是一个新的标记。然后您继续,重复这一点。现在您有了TOK,TOK,发生了三次;带有E的TOK,发生了两次;还有TOKEN,发生了两次;然后是EX,也发生了两次。

如果您要在这个非常小的文本语料库上训练一个标记器,这就是您用一个像训练过的标记器一样的标记完成的方式。实际上,您在更大的文本语料库上做这件事。这是真正的标记器,我认为这是GPT-3或ChatGPT。在这里您可以看到它实际上是如何将这些单词分开的。基本上,您看到的内容与我们在前面的例子中给出的内容相同。标记成为其自己的标记。因此,标记器实际上分为两个标记,TOKEN和EIZER。

这就是关于标记器的全部内容。对此有什么问题吗?是的,所以实际上在标记器之前有一个步骤,也就是我们所说的预标记器,这正是您刚才所说的。理论上,没有理由分别处理空格和标点符号。每个空格和标点符号都可以有自己的标记,并且可以进行合并。然而,这涉及到效率问题。训练这些标记器需要很长时间,因此最好考虑每一对标记。

如果有空格,预标记器会非常特定于英语。我们不会在空格之间合并标记,这就像计算优化一样。理论上,你可以像处理其他字符一样处理空格,保留较小的标记。实际上,这并不重要,因为在大型文本语料库中,你会拥有所有内容,但通常会保留小的标记。

这样做的原因是,如果出现语法错误或拼写错误,你仍然希望能够用字符表示这些单词。例如,T-O-K-E-N是否只出现一次,还是需要多次出现以便具有不同的含义?每个标记都有自己独特的ID。

例如,"银行"这个词可能指货币银行,也可能指水边的银行。它们会具有相同的标记,但模型会根据周围的单词进行学习,将其关联起来。这是Transformer在做的事情,而不是标记器。

在标记化过程中,首先保留较小的标记。例如,从T开始,保留T,然后将标记器构建为标准数量的标记。假设没有对标记进行训练,但在数据中试图对标记进行编码,标记器如何知道用标记对其进行编码还是用T对其进行编码?

基本上,当进行标记时,也就是在标记器训练之后,实际应用标记器时,总是选择可以应用的最大标记。如果可以做标记,就不会做T,总是会做标记。虽然人们通常不会过多谈论标记器,但有很多计算优势或计算技巧可以让这些事情变得更快。

老实说,我认为很多人认为我们应该摆脱标记器,而只是逐个字符或逐字节地进行标记。正如我所说,目前存在长度问题。然而,也许在五年或十年后,我们将拥有不同的架构,这些架构不会随着序列的长度而呈二次方扩展。届时,我们可能会摆脱标记器。

那么,能否分享一下标记器的缺点?为什么人们想要摆脱标记器?

一个很好的例子是数学。如果你考虑数学,现在的数字并没有被标记。例如,327 可能有它自己的标记,这意味着当模型看到数字时,它们的理解方式与我们不同。这非常烦人,因为我们之所以能够用数学来概括,是因为我们可以单独处理每个数字,然后进行组合。基本上,如果你添加东西,它就和把每个数字单独加起来再加上你添加的单位是一样的。而模型做不到这一点,所以你必须进行特殊的标记化。

GPT-4 所做的一个重大改变就是改变了标记代码的方式。例如,在 Python 代码中,你经常会有四个开头的空格,这些空格以前处理得有点奇怪,导致模型无法真正理解如何处理代码。因此,标记器实际上很重要。

接下来,我们可以稍后再讨论标记器。现在,让我们谈谈评估。

评估 LLM(大型语言模型)通常采用的方法是困惑度。从高层次来看,它基本上就是验证损失。困惑度的细微差别在于,我们使用更易于解释的东西,即每个标记的平均损失,然后对其进行指数运算。之所以对其进行指数运算,是因为损失中有一个对数。首先,人类在对数空间中思考的能力实际上很差;其次,对数取决于对数的底数。而当你进行指数运算时,你基本上拥有词汇量单位中的所有内容。每个标记的平均值只是为了使困惑度与序列的长度无关。

因此,困惑度只是序列损失的幂平均值的 2。困惑度介于 1 和标记器词汇表的长度之间。简单来说,如果你完美地预测了每个单词的内容,那么每个单词基本上都是 1 的乘积。因此,你能拥有的最佳困惑度是 1。如果你真的不知道,你基本上可以用一除以词汇量来预测。然后你做简单的数学运算,基本上会得到词汇量大小的困惑度。

困惑度的直觉是它基本上是你的模型在犹豫的标记数量。如果你的模型是完美的,它不会犹豫,它确切地知道这个词。如果它真的不知道,那么它会在所有词汇之间犹豫。困惑度确实提高了。这是2017年至2023年间标准数据集的困惑度变化。在这5、6年里,困惑度从70个标记减少到不到10个标记。这意味着模型以前每次生成一个单词时需要在70个单词之间选择,而现在只需在不到10个单词之间选择,这显然是一个很大的进步。

困惑度实际上已不再用于学术基准测试,主要是因为它取决于所使用的标记器和评估的数据。然而,对于大型语言模型(LLM)的开发,困惑度仍然非常重要。因此,当你真正训练自己的LLM时,人们仍然会关注这种困惑度。

评估LLM的另一种常见方式(现在在学术界更常见)是采用所有经典的自然语言处理(NLP)基准。我稍后会给你几个例子,然后将所有内容汇总起来。收集尽可能多的可自动评估的基准,然后对它们进行评估。

我们称之为HELM的一个或两个这样的基准来自斯坦福大学。另一个是Hugging Face Open LLM排行榜,这可能是目前最常见的两个。在HELM中有各种类型的任务,大多是可以轻松评估的内容,例如问答。问答的好处是你通常知道真正的答案是什么,因此可以评估这些模型生成真实答案的可能性,而其他答案则不然。这基本上是评估这些模型的高级方法。

举个具体的例子,MMLU可能是LLM最常见的学术基准。这是一个包含许多领域问题和答案的集合,例如大学医学、大学物理、天文学等。问题可能包括:“在天文学中,1a型超新星的真实性是什么?”然后给出四个不同的潜在答案,询问模型哪一个更有可能。因此,有很多不同的方法可以做到这一点。你可以查看生成所有这些答案的可能性,也可以询问模型哪一个最有可能。通过不同的方式提示模型,但在高层次上,你知道哪一个是正确的,其他三个是错误的。

创建不受约束的文本作为输出时,如果模型给出的内容在语义上完全相同,但不是你期望的确切拓扑,那么如何评估模型?这是一个很好的问题,我稍后会详细讨论这个问题。在这种情况下,我们不做不受约束的事情。

因此,您评估 MMLU 的方式基本上是问第一个问题,然后查看模型生成 A 的可能性,模型生成 B、C 和 D 的可能性,然后查看哪一个最有可能,或者您可以问模型,在 A、B、C、D 中,哪一个最有可能,然后查看最有可能的下一个标记是 A、B、C 还是 D。因此,您限制模型说它只能回答这四个问题。

当您说您限制模型时,您是指您用提示来限制它,还是指整个概率分布和输出,您只比较输出,就像您只比较 A 标记一样?

在我给出的第二种情况下,您会做完全相同的事情——实际上您会同时做这两项。您会提示模型说 A、B、C 或 D,另外您会限制只查看这四个标记。在第一种情况下,您甚至不需要生成任何东西。实际上,您只是查看,鉴于它是一个语言模型,它可以给出句子的分布。您只需查看生成所有这些单词的可能性是多少,生成第二个选择的可能性是多少?您只需查看最可能的句子是否真的是真正的答案。因此,您实际上并没有从中抽样,您实际上只是使用 X1 到 XL 的 P。话虽如此,我们稍后会讨论开放式问题的评估,这实际上非常重要且具有挑战性。

之前您提到,通常不使用复杂度等指标,因为这取决于您如何进行标记化,以及一些设计选择。我想知道您是否可以就此多说几句。

那么想想困惑度。我告诉过你困惑度介于 1 和词汇量之间。现在想象一下,ChatGPT 使用一个有 10,000 个标记的标记器,但谷歌的 Gemini 使用一个有 100,000 个潜在标记的标记器。那么实际上 Gemini 的困惑度上限实际上比 ChatGPT 更差。这有道理吗?所以这只是一个想法。实际上它比这稍微复杂一点,但这就像一个一阶位,你可以看到标记器实际上很重要。

所以评估挑战有很多。我只想简单谈两个。首先,正如我所说的,有两种方法可以评估这些 MMLU。实际上,方法远不止两种,但我只举了两个例子。

事实上,很长一段时间以来,尽管这是每个人都使用的非常经典的基准,但不同的公司和组织实际上使用不同的方法来评估MMLU。结果,你会得到完全不同的结果。例如,65B的Lammas,这是Lammas系列中的第一个元模型,在Helm上的准确率为63.7,但在另一个基准上准确率为48.8。

真正的评估方式,这甚至不是在谈论提示,这实际上只是你评估模型的方式。提示是另一个问题。所以真的有很多不一致之处,这并不像看起来那么简单。

首先,我们如何确保所有这些模型都在基准上进行训练?这是一个很好的问题。训练、测试、污染,我想说,这是学术界真正重要的事情。鉴于讨论的主要是训练大型语言模型,对于公司来说,这可能并不那么重要,因为他们知道他们训练的是什么。对我们来说,我们不知道,所以对我们来说,这是一个真正的问题。

因此,有很多不同的方法可以尝试测试测试集是否真的在训练集中。Tatsu实验室的人们发现了一种巧妙的技巧,鉴于大多数在线数据集都不是随机的,你可以查看,在语言模型中,它们所做的只是预测下一个单词。你可以查看整个测试集,如果你按顺序生成所有示例,而不是按不同的顺序生成所有示例,结果会怎样。如果更有可能按顺序生成某个东西,考虑到那里没有真正的顺序,那么这意味着它可能在训练集中。这只是其中之一,还有许多其他方法可以做到这一点。

训练测试污染,同样,对于开发来说并不那么重要,但对于学术基准测试来说非常重要。

数据是另一个非常大的话题。在高层次上,人们只是说,你基本上是在整个互联网上训练大型语言模型。这是什么意思?因此,人们有时会说所有干净的互联网,这甚至定义得更少。互联网非常肮脏,实际上并不代表我们在实践中想要的东西。如果我现在下载一个随机网站,你会对里面的内容感到震惊。这绝对不是你的维基百科。所以我会简要介绍一下人们的做法。我可以回答一些问题,但数据本身就是一个巨大的话题。

首先,你需要下载整个互联网。这意味着你要使用网络爬虫爬取互联网上的每个网页或 Google 上的每个网页。目前大约有 2500 亿个网页,这些数据大约有 1PB。因此,使用网络爬虫是一个常见的做法。人们通常不会编写自己的网络爬虫,而是使用标准的网络爬虫。常见的网络爬虫每个月都会添加 Google 在互联网上发现的所有新网站,并将其放入一个大数据集中。现在,常见的爬虫中大约有 2500 亿个页面。

这些数据大约是 6GB。一旦你有了这些数据,你会发现它们是随机的网页,就像从常见的爬虫中随机获得的一样。你看到的实际上是一个 HTML 页面,虽然很难看清,但如果仔细查看,你会看到一些内容。例如,这里有一句话:“测试世界是系统 X 高性能服务器的最终来源。”但句子还没有完成。这就是随机互联网的样子。

如果你只是训练一个大型语言模型来生成这样的内容,它就没那么有用了。那么需要哪些步骤呢?首先,从 HTML 中提取文本。这是我刚刚试图通过查看正确的文本来做的事情。这其中有很多挑战,例如,提取数学内容实际上非常复杂,但对于训练大型语言模型来说非常重要。还有样板内容,很多论坛都会有相同类型的页眉、页脚,你不想在数据中重复所有这些。

接下来,你需要过滤掉不受欢迎的内容,比如不安全的工作、有害内容、个人身份信息(PII)。通常每家公司都有一个不想用来训练模型的网站黑名单,这个黑名单很长。你基本上会说,如果数据来自这些网站,我们就不会用它来训练。还有其他方法可以做到这一点,比如训练一个小模型来对 PII 进行分类,然后删除这些内容。这是一个艰巨的任务。

然后是重复数据删除。正如我所说,你可能在论坛中看到诸如页眉和页脚之类的内容,它们总是相同的。你需要删除它们。你可能还会看到很多不同的 URL,但实际上显示的是同一个网站。在处理数据时,你可能会遇到许多来自普通书籍的段落,这些段落在互联网上已经被删除了无数次。因此,你必须删除重复数据。这项任务非常具有挑战性,因为需要大规模地删除重复内容。

一旦删除了重复数据,你需要进行一些启发式过滤,尝试删除低质量的文档。这种过滤是基于规则的。例如,如果你发现某些网站的标记分布与通常的标记分布非常不同,那么它很可能是异常值。如果某个网站上的单词长度非常长,说明这个网站上可能有奇怪的事情发生。如果某个网站只有三个单词,可能不值得对其进行训练;而如果它有大约一千万个单词,那么这个页面上可能也存在一些错误。因此,有很多这样的规则需要遵循。

为什么我们不直接从数据集中过滤掉不良内容,而是将其作为监督损失?我们能不能说这是仇恨言论网站,并积极尝试惩罚它们的内容?

我们会这样做,但不是在这一步。这就是后训练的来源。预训练的想法是模拟人类说话的方式,删除所有如页眉、页脚和菜单等无关内容。你刚才的想法非常好,这正是我们稍后要做的。

下一步是基于模型的过滤。一旦你过滤了大量的数据,你需要做的是一个非常巧妙的技巧。你会把整个维基百科都拿出来,然后查看通过维基百科页面链接的所有链接。因为如果维基百科引用了某些内容,那么它很可能是高质量的网站。你会训练一个分类器来预测某个文档是否来自维基百科的这些参考资料之一,或者它是否来自随机网络。你会试着获取更多来自维基百科参考资料的内容。

接下来,你将尝试将数据分类到不同的域中。你会说,这是娱乐,这是书籍,这是代码,这是其他类型的域。然后你会尝试增加或减少某些域的权重。例如,你可能会发现,如果你在代码上训练得更多,那么你的模型在推理方面实际上会变得更好。因此,人们通常会用非常不着边际的方式说,如果你在代码上训练你的模型,实际上它有助于推理。为了增加编码分布的权重,这有助于提升一般的语言建模技能。书籍通常也是人们增加权重的另一个方面,而娱乐内容则通常会降低权重。

当然,你希望这样做,所以人们过去可能会有一些启发式的方法来实现这一点。现在我们将讨论如何更自动地完成这些流程。

在训练结束时,通常在我们看到的所有数据上进行训练后,尤其是在训练大型语言模型结束时,会在非常高质量的数据上进行训练,并降低学习率。这基本上意味着你的模型在非常高质量的数据上过度拟合。通常你会在维基百科这样的数据上过度拟合,也会在收集到的人类数据上过度拟合。

其他事情,比如持续的预训练以获得更长的上下文,我将跳过这些细节。但只是为了让你了解,当人们说要在互联网上训练时,这有多难。这是很多工作,我们还没有完全弄清楚。

因此,收集全球数据是实用大型语言模型的重要组成部分,有些人甚至认为这是关键。

关于数据的基本问题是,当你从 TB 级数据开始,经过所有步骤后,通常剩下的数据量是多少?完成所有数据处理步骤通常需要多大的团队?速度有多慢?比如说,你需要多少人才能做到这一点?

对于从事这项工作的人数,这是一个好问题。我实际上不太确定,但我会说,可能比从事模型预训练调整的人数还要多。所以数据处理比建模方面需要更多人力。

在 Llama 的团队中,大概有70人,其中大约15人在处理数据。你不需要那么多人,但你还需要很多计算资源,因为对于数据处理,你需要很多CPU。

正如我刚才提到的,我们实际上还没有解决预训练的数据问题,因此还有很多研究要做。首先,如何高效地处理这些事情?其次,如何平衡所有这些不同的领域?你能生成合成数据吗?这实际上是现在的一个大问题。因为我们没有足够的数据,我们稍后会讨论这个问题。你能使用多模态数据而不是文本数据吗?这如何改善你的文本性能?

有很多秘密,因为这确实是大多数预训练大型语言模型的关键。因此,对于竞争动态,这些公司通常不会谈论他们如何进行数据收集。此外,还有一个版权责任问题。他们肯定不想告诉你他们已经用书进行过训练,即使他们确实这样做了,因为如果没有,你可以起诉他们。

常见的学术基准可以回答你的问题。它开始时数据量较小,名称并不重要,但它始于大约1500亿个Token,大约有800GB的数据。现在大约有15万亿个Token,这也是模型的大小,目前最好的模型可能就是用这个数据量进行训练的。所以15万亿个Token,我猜可能比这个大两个数量级。所以是80E3千兆字节。如果我没记错的话,这大约是普通爬虫的100到1000倍的过滤。

一个非常著名的学术基准是PAL。我们可以看看他们拥有的数据分布。它包括Archive、PubMed Central,都是生物学的内容,还有维基百科、Stack Exchange、一些GitHub和一些书籍等。同样,这个数据集比较小。如果我们看看这里,这是280B。所以实际上,它要大100倍。因此,你不可能有那么多的GitHub和Wikipedia数据。

就闭源模型而言,给你一个概念,Llama 2是在2万亿个Token上进行训练的。Llama 3,15万亿个Token,这是我们目前所知的最好的模型,它经过了多少次训练,与最好的学术或最大的学术基准相同,即15万亿个Token。GPT-4,我们真的不知道,但它可能在同一个数量级,或者实际上可能在那个左右。如果泄漏属实,它可能在13左右。

接下来我们讨论缩放损失。

我们的想法是,从2020年左右开始,或者至少在很长一段时间内,人们已经能够从理论上证明,或者从2020年开始从经验上证明,训练模型的数据越多,模型越大,性能就越好。这与您在本课中看到的内容非常不同。在本课中,我们将教您有关过度拟合的知识。大型语言模型不会发生过度拟合。模型越大,性能越好。对于参加此类课程的社区来说,认识到这一点确实花了很长时间。但对于考试来说,过度拟合是存在的。

缩放损失的想法是,如果您知道更多数据和更大的模型始终会提供更好的性能,那么我们能否预测增加数据量和模型大小后,性能会提高多少?令人惊讶的是,这个方法有效。

这里有来自OpenAI的一篇非常著名的论文的三张图。在x轴上显示的是计算量,即你在训练上花费了多少计算。这里显示的是测试损失,这本质上不是困惑度,而是验证损失,即困惑度的对数。如果你把这两者放在对数刻度上,你会发现性能就像缩放定律一样,是线性的。这意味着,如果你将计算量增加一定量,你可以预测测试损失会减少多少。数据和参数也是一样。如果增加数据集大小,损失会减少一个可以预测的量。如果增加参数数量,损失也会减少一个可以预测的量。这真的很神奇,非常令人惊讶。

当你看这些类型的图时,它看起来无害,但实际上很疯狂,因为这意味着你可以预测我们在两三年内的表现如何,这取决于我们将增加多少计算量。假设这些规律成立。

这没有什么理论依据。

他们在这里使用的损失是什么?这是困惑度吗?困惑度就像损失的平方。当你增加参数的数量和总数据集的大小时,这难道不会自然而然地增加你的计算量吗?所有这些都有效吗?

是的。这是一个很好的问题。

这里的计算实际上涉及两个因素:数据和参数。我在这里展示的是,你可以增加参数的数量,但同时也需要增加数据的数量。这样,你实际上不会多次使用同一个数据集。没有人会大规模地进行迭代,至少现在还没有,因为我们还没有足够的数据。

是的,这都是相同的趋势,即增加计算量以减少损失。

我们看到了过去两年的数据吗?还是它仍然保持不变?

它仍然保持不变。我没有具体的数字可以展示,但令人惊讶的是,这个趋势仍然保持着。

有没有经验证据表明你可以达到稳定状态?

目前没有经验证据表明它会很快稳定下来。我们不知道。可能会发生,但它不需要,因为它实际上是对数尺度的。所以它并不是必须下降或稳定下来,就像数学上那样,它可以继续下降。大多数人认为它可能会在某个时候稳定下来,但我们不知道具体时间。

现在,我将更多地讨论缩放损失。为什么缩放损失真的很重要?想象一下,我给你 10,000 个 GPU,你会训练什么模型?你如何回答这个问题?这是一个假设,但这正是这些公司面临的实际问题。

旧的流程是你在大模型上调整高参数。假设我有 30 天时间,我将训练 30 个模型,每个模型一天,然后选出最好的一个作为最终的生产模型。这意味着我实际使用的模型只训练了一天。

新的流程是,你首先要找到一个扩展配方。例如,一个常见的情况是,如果你增加模型的大小,你应该降低学习率。你找到了一个缩放配方,这样你就知道,如果增加模型的大小,应该如何调整高参数。然后,你在不同大小的较小模型上调整高参数。假设我在 30 天中的三天时间里训练许多不同的模型,并对这些不同大小的小模型进行高参数调整。然后,我将拟合缩放定律,并尝试从这些较小的模型中推断出,如果我训练更长时间,哪一个会是最好的。对不起,如果我为更大的模型训练它,那么我将用27天而不是一天来训练最终的大型模型。因此,新的流程不是在你将在实践中使用的模型的实际规模上训练或进行高参数调整,而是在不同规模的较小模型上进行操作,尝试预测它们在变大后的性能。

我现在给你一个非常具体的例子。假设你在选择使用Transformer还是LSTM模型,并且你有10,000个GPU,但不确定应该使用哪一个。你可以训练不同规模的Transformer模型,在x轴上表示不同参数,y轴上表示测试结果。然后,你再训练不同规模的LSTM模型。一旦有了这些数据点,你会发现它们符合缩放定律。通过符合缩放定律,你可以预测如果有10倍以上的计算能力,LSTM的表现会如何。实际上,LSTM的线性程度略低,但你可以尝试预测最终结果。从图中可以清楚地看出,Transformer表现更好。

阅读此类缩放定律时要注意两件事:一个是缩放率,即缩放定律的斜率;另一个是截距。比如,一开始可能表现更差,但随着时间的推移会变得更好。LSTM在这两方面都表现较差。但我可以向你展示另一个例子,预测在一定规模之后,使用这种类型的模型比其他模型更好。这就是缩放定律非常有用的原因。

这些对架构中的细微差异有多敏感?一个Transformer架构与另一个Transformer架构。

你基本上必须拟合自己的曲线,并说缩放定律告诉我应该有一些对数函数。通常,例如,如果你是一名学者,现在至少这是相当新的,你想提出一个新的激活函数,这正是你要做的。你会拟合一个缩放定律,并用标准展示另一个缩放定律,比如Gelu,你会说它更好。

事实上,一旦你开始用缩放定律来思考,你会真正意识到,我们可以做出的所有架构差异,比如微小的差异,可能只是稍微改变截距,但实际上这并不重要,因为只需再训练10个小时或等待下一个GPU,这些事情都是次要的。这正是我最初告诉你人们在架构和损失上花费太多时间的原因。实际上,这些事情并不那么重要。但是,如果你使用好的数据,你将拥有比使用坏数据更好的缩放定律。所以这真的很重要。

你可以用缩放定律做的另一件非常酷的事情是,问自己如何最佳地分配训练资源。我应该训练更大的模型吗?因为我们发现训练更大的模型效果更好,但我们也发现使用更多数据效果更好。那么我应该选择哪一个呢?我应该只训练更多数据、更小的模型,还是应该用更少的数据训练更大的模型?

Chinchilla 是一篇非常著名的论文,它首次展示了这一点。他们这样做的方式,我想让你稍微了解一下这些图是什么。在这里你再次看到了训练损失。在 x 轴上,你可以看到参数的数量,也就是模型的大小。这里所有这些曲线都是我们所说的 isoflops,也就是说,这条曲线上的所有模型都用相同的计算量进行训练。

你这样做的方式是改变训练的 token 数量和模型的大小,但你以这样一种方式变化,即总计算量是恒定的。因此,您所看到的所有这些具有不同颜色的曲线都代表了不同数量的经过训练的计算。然后,你从每条曲线中选取最好的一个。一旦你从每条曲线中选取最好的一个,你就可以问,你可以绘制出有多少次 flops,你在哪条曲线上,以及你实际使用了多少参数来训练该特定点。你再次将其放在对数-对数刻度上,现在你再次拟合缩放定律。

所以现在我有一些东西告诉我,如果我想训练一个 10 的 23 次方次 flops 的模型,这就是我应该使用的参数的确切数量,100B。你可以对 flops 和 token 做同样的事情。所以现在你可以预测,如果我告诉你我有一个月的计算时间,我应该训练多大的模型?拟合你的缩放定律,我告诉你。

当然,这一切看起来都很漂亮。实际上,有很多小事情,你应该计算嵌入参数吗?虽然有很多复杂性,但如果你做得好,这些事情实际上就会成立。所以 Chinchilla 团队发现的最佳参数数量是每个训练参数使用 20 个标记。因此,如果您添加一个参数,则应该在另外 20 个标记上训练您的模型。

因此,这里的一个警告是,这是最佳的训练资源。所以这告诉我,如果你有 10 的 23 次方次 flops 的计算资源,假设我有 500 万美元来训练我的最佳模型,以获得最低的损失。

在训练模型时,推理成本是一个需要考虑的重要因素。如果你使用一个较小的模型,随着时间的推移,花费会减少。因此,考虑推理成本时,有其他论文试图证明这一点。每个参数大约对应150个token,因为较小的模型在推理上花费更少。

目前,150比1大约是最好的模型的训练成本,至少在实践和生产中使用的模型是这样的。

在实践中,训练这些模型的推理成本非常高。以ChatGPT为例,目前大约有6亿人使用它,这使得推理成本非常昂贵。不过,推理可以进行大量优化,但这是另一个完整的讲座内容,这次我将跳过它。

正如我所说,缩放定律可以回答很多问题。你使用什么数据?数据混合和加权如何?使用什么架构?模型应该更宽还是更深?是为更多GPU付费还是收集更多数据?这些问题都可以通过缩放定律来回答。

Richard Sutton在2019年的著名博客文章中提到,一旦你了解缩放定律,你就会知道拥有更多计算资源会得到更好的模型。根据摩尔定律或其变体,你将始终拥有更好的计算能力。因此,唯一重要的事情是拥有可以利用计算的架构。

因此,重要的基本上是系统和数据,而不是架构上的细微差异。这也是为什么大多数研究集中在一些对行业不太重要的事情上的原因之一。在我的职业生涯中,我大部分时间都是这样的研究人员。不要把时间花在过度复杂化上。做简单的事情,做好,封存起来。这实际上是OpenAI通过ChatGPT和之前的所有GPT教给我们的。

我想给你一些简单的计算。我可能在这里偏离了一些因素,但我只是想让你了解训练这些模型的成本有多高。我举个例子,Lama3-400B,这是目前你能得到的最好的开源模型。它是在15.6个token上训练的,有4050亿个参数。现在你知道每个参数的最佳token数量大约是40个。这比Chinchilla多一点,但比这个推理最优模型要少,所以他们追求训练最优性。

计算Flops的一个简单方法是将参数数量乘以6,再乘以训练数据的数量。如果你在这里进行简单的计算,结果是3.8E25 Flops。这一点之所以重要,是因为如果你关注一些新闻,就会发现拜登有一项行政命令,基本上就是说,一旦你有1E26次Flops,那么你的模型就会受到特别审查。所以他们把这个数字减少了2倍,降到了这个数字以下,这样就不会受到特别审查。所以3.8E25 Flops,虽然我可能有点偏离,但肯定低于1E26。

参数p是参数数量,n是数据,token数量。这只是一个近似值。

我们知道他们在16,000台H100上进行了训练,也知道吞吐量。他们也这么说过。如果你进行计算,大约需要70天或2600万个GPU小时。至少这是我粗略的计算,他们实际上说他们使用了3000万个而不是2600万个GPU小时,所以也许他们遇到了一些挑战,我真的不知道。但如果你按照简单的计算,大约需要70天。

成本很难估算,但我只能说这有点像租金。比如,如果我要租用那么多台H100,租用那么多天,会怎么样?我要付多少钱?租用H100的最低成本是每小时2美元左右。因此,如果将其乘以2600万小时,则得到5200万美元。他们支付的费用可能低于这个数字,但实际上不会少很多,因为所有这些实际租用GPU的服务都赚不到那么多钱。因此,可能稍微少一点,但不会少很多。

现在,谈谈工资。我说的是50名员工,每年50万美元。是的,这可能是正确的估计,总计2500万美元。因此,如果将这些费用全部加在一起,训练这个Llama模型大约需要7500万美元。我可能错了1000万,但这是一个正确的估计。

接下来是碳排放量。很多人可能会问,成本不是唯一重要的事情。所以我做了计算,大约是4000吨二氧化碳当量。这实际上相当于从肯尼迪机场到伦敦的2000张往返机票。所以现在,碳排放实际上并不是巨大的,但它还没有那么有意义。我认为在GPT-6、GPT-7中,一旦你把它乘以100,这可能会成为一个真正的问题。现在,从宏观角度来看,这仍然不是一个问题。

下一个模型,你应该这样思考这些模型,每一代,Flops的数量基本上都会增加10倍。至少他们是这么做的,如果他们有足够的能量,如果他们能买得起足够的GPU。

现在我们讨论了预训练。我也想聊聊系统,因为现在我们知道计算非常重要。那么有一个问题是如何优化你的计算?我将把它留到最后,因为我不确定我们有多少时间。我认为这很重要,但希望我以后能谈论它。这与我们现在谈论的内容略有不同。所以我现在将转到训练后。

正如我之前所说,后训练的任务,我们需要进行后训练的原因是为了制作人工智能助手。语言建模并不是你拥有人工智能助手时真正想要的东西。例如,如果你问GPT-3,这是一个纯粹的语言模型,而不是对齐的模型,如果你问一个问题,比如,向六岁的孩子解释登月,你得到的结论是,向六岁的孩子解释万有引力理论。因为它学到的是,在互联网上,如果你有一个问题,你通常会有另一个类似问题的要点。你通常不会先问一个问题,然后再回答。这不是你想要的人工智能助手。那么我们如何进行这种对齐,即后训练并使这些模型成为助手?

这种对齐的目标基本上是让大型语言模型(LLM)遵循用户给出的指示,也许是一些设计师的愿望。因此要考虑适度。你不希望模型,比如,OpenAI绝对不希望他们的模型说出非常有害的东西。

在这里,你可以看到,当你问一个问题时,它实际上提供了一个真正的答案。这与LLM之前的情况不同。而在另一种情况下,如果你要求写一条推文描述某一部分人群是如何邪恶的,它会说它不能这样做。这就是这种一致性。

背景是,基本上你想要训练这些模型的数据就像我们知道我们想要什么一样,也就是问人类,这是一个问题,这是你想要的答案。但问题是收集这些数据非常昂贵,而且很难在网上找到它。相比之下,预训练数据不是你想要的,但有很多。

因此,我们的主要思想是简单地采用预先训练的大型语言模型,在整个互联网上进行预先训练,然后进行微调。您只需对您实际想要的数据类型稍微改变一下权重即可。希望有了它,您已经对所有互联网进行了预训练。它基本上学习或知道如何用英语说话,并且知道标准语言语法。然后,您可以用很少的数据对其进行微调。

监督微调(SFT)实际上就是我刚才所说的,即根据从人类那里收集到的期望答案对大型语言模型进行微调的想法。为什么它被称为监督微调?因为您基本上想对真实答案进行语言建模。语言建模就像下一个单词预测。这就是微调的部分。然后您想根据人类给出的期望答案进行微调。这就是我们称之为监督的原因。

那么我们如何收集这些数据?你只需让人类告诉你这是问题所在,这是您希望从这些模型中得到的答案。举个例子,我不能很好地在电脑上阅读,但我的孩子需要做一门科学。让我们读一下这个:你能写一个关于买方垄断一词的相关性的简短介绍吗?然后它说买方垄断是指市场结构,等等等等。这是人类写的。

实际上,这是Open Assistant,它是一种人类在线收集数据的方式。所以这种监督微调或对齐确实是ChatGPT的关键。这就是从GPT-3(主要是人工智能研究人员所知道的东西)到ChatGPT(基本上每个人都知道)的巨大飞跃。人类数据的问题在于收集速度非常慢且成本高昂。一个可能的解决方案是使用大型语言模型(LLM)来扩展数据收集。这正是我们一年前对Alpaca所做的。

我们的做法是向人类提问,或者使用人类问答数据集。我们有175个问答,并要求当时最好的模型TextEventUser03生成更多类似的问题和答案。我们收集了52,000个由LLM生成的问题和答案。

接下来,我们采用了Llama7B,这是当时最好的预训练模型,并对其进行了监督微调。这就是我们得到Alpaca7B模型的方式。这是我们收集的数据类型。

算法是用于解决问题或实现目标的一步一步的指令集。数据实际上相当不错,因为它是由基本上两代之前的LLM生成的。这真的开始了,至少对我们来说,有点像ChatGPT的学术复制。

现在,确实存在一个很大的领域,研究如何使用LLM来加快LLM的开发速度,主要是通过减少所需的人工时间和数据量。我们讨论了数据的类型以及如何收集它。监督微调(SFT)令人惊讶的一点是,你不需要那么多数据。

一篇名为Lima的论文表明,如果你将监督微调中使用的数据量从2000扩展到32000,这并没有多大帮助。在这里,数据量的增加并没有带来显著的提升。直觉上,你学到的只是如何格式化你想要的答案。

换句话说,预训练模型本质上模拟了互联网上每个用户的分布。一个用户可能会写出要点,另一个用户可能会用答案回答问题。你告诉模型的只是,应该针对某种类型的用户进行更多优化,而不是其他类型的用户。因此,你实际上并没有通过SFT教模型新的知识,只是让它针对已经在预训练数据集中看到的一种用户类型进行优化。

我知道合成数据的一个大问题是,如果你继续从相同的分布生成数据,最终你不会学习新的分布。你基本上是在玩它并引导它。你不能永远扩大规模,也不能继续从相同的分布生成并希望学到新的东西。这是一个活跃的研究领域。

您对人们如何思考这个问题以及更好的引导方式有什么想法?或者是否应该放弃这个想法,并意识到图表显示您不需要那么多数据,只需让人类生成2,000个非常好的例子?

这是一个非常好的问题。至于数据,我想说的是,它对SFT(监督微调)来说并不那么重要,但我们接下来会讨论另一件事,即数据确实很重要。

我的直觉是,即使没有那么多经验结果,你仍然可以获得一些进展。即使你使用LLM(大型语言模型)生成的纯文本,并且对三、四代LLM都这样做,我同意你可能不会有太大的进步。但对我来说,重要的是你如何在LLM中使用像人类一样的循环。

不是纯粹的LLM,也不是纯粹的人类,但也许你可以让模型生成一些新文本,然后人类进行编辑。编辑比编写整个文本要快得多。我认为,如果你有这种类型的协作,那么从某种信息理论的角度来看,你仍然可以获得额外的信息,但你仍然比使用人类要快得多。

作为一个领域,我们可能会朝着这些方向发展,即找到重要的例子并向人类提问。这是一种主动学习,只是在需要获取输入时询问人类。

这就是为什么在这里,我可能没有强调得足够多。这只是语言建模。根据所需答案对带有语言模型的LLM进行微调。所以这实际上是相同的损失。两秒钟后会有所不同,但SFT的第一步实际上是相同的损失,你只需说,好吧,我想真正专注于那种类型的数据。

所以甚至有一个问题,比如,什么是预训练?什么是后训练?因为实际上,它就像你使用的不同数据。我们通常称之为后训练的原因是我们收集数据的方式非常不同。

但为什么这2,000个例子会有如此过重的影响力呢?这就是为什么我们称之为后训练的另一个原因是我们使用不同类型的超参数。

在预训练结束时,你的学习率基本上是零。在这里,你要把学习率提高到1e-5。所以,你给它们的权重实际上是不同的。好的,后训练的第二步或第二部分是我们所说的从人类反馈中进行强化学习(RLHF)。

你们中的一些人可能听说过这个概念。SFT(监督微调)存在一个问题,即它进行的是行为克隆,这意味着你只是试图模仿人类会说的话。这有很多问题。

首先,你受到人类能力的束缚。就像人类一样,人类不会总是产生他们认为最好的东西。如果你让我写一本书,我可能会喜欢你的书,但我绝对不会写出我想读的书。因此,你将受到人类生成事物能力的限制,即使人类可能更善于区分事物。这是一个问题。

第二个问题是幻觉现象。如果你听说过这个词,它指的是模型可能会产生虚假信息。幻觉可能来自监督微调,即使你对正确的数据进行监督微调。原因是,SFT 基本上是使用很少的数据,而它使用的数据并不足以让模型学到任何新东西。那么,如果人类给出了模型不知道是正确的答案怎么办?从模型的角度来看,人类基本上是在告诉模型生成看似合理的东西,但实际上模型不知道它是否真实。

举一个具体的例子,如果我们回到买方垄断的例子,你能写一些关于买方垄断的内容吗?想象一下,一个人写了一本关于这种书的参考书目,那本书可能存在,也可能是一个正确的参考书目。但如果 LLM(大型语言模型)在预训练期间从未见过这个参考书目怎么办?那么它就不知道这是一个正确的参考书目。所以你真正告诉模型的是生成或编造一些听起来合理的参考书目,而不是真正告诉它在预训练期间看到的真实参考书目。因此,幻觉可能是由 SFT 引起的。这是第二个问题。

第三个问题是生成理想答案的成本非常高。这又回到了你的问题,像人类一样写出整个答案实际上非常昂贵。这就是 RLHF 的作用所在。我们的想法是,我们不会克隆人类的行为,而是要最大化人类的偏好。

我们这样做的方式是,对于每条指令,你都会要求模型生成两个答案,通常使用一个相当不错的模型。所以通常你在这里不使用 LLM,而是使用一个已经通过 SFT 微调过的 LLM 来给出相当不错的答案。首先,您需要询问标注者这两个答案中哪一个更好,然后选择首选的那个。接下来,使用不同类型的算法进行讨论。您只需微调模型,使其生成更多绿色而不是红色的内容,从而产生更多优质的结果。

现在的问题是如何实现这一点?我们将讨论两种主要在社区中使用的方法。第一种方法是使用强化学习的概念。希望大家都了解强化学习。当考虑使用强化学习时,一个重要的问题是我们正在优化的奖励是什么。在这种情况下,我能想到两个选项。

第一个选项是比较基线生成的输出和模型生成的输出,然后让人类评判哪一个更好,并将此作为奖励。如果模型的输出比基线好,则加一分,否则减一分。这种二元奖励的问题在于信息非常稀疏,无法提供足够的反馈。也许答案稍微好一点,也许好很多,但你无法确切知道它有多好。

第二个选项是训练一个所谓的奖励模型,它实际上是一个分类器。使用机器学习来分类两个输出,从人类偏好的角度评估哪个更好。虽然这有点抽象,但基本上你需要做的是训练一个奖励模型 R,它是一个大型分类器。你将输入和实际输出提供给这个奖励模型,并对其进行指数运算,这就是大家熟悉的 softmax 损失。然后你将指数奖励除以第一个输出和第二个输出的指数值。

训练这个奖励模型的目的是能够分类一个输出比另一个输出好多少。换句话说,你的奖励模型将输出一些奖励,这些奖励将用作 softmax 的对数。如果 softmax 中的对数值较高,这意味着该输出更好。这就是我们所说的 Bradley-Terry 模型。

这个模型会一次性获取所有输入和输出,并给出一个数字。通过训练这个奖励模型来适应人类对绿色和红色的偏好,你可以判断人类更喜欢红色还是绿色,但不是使用二进制奖励,而是使用 softmax 的 logits。Logits 的特点是它们是连续的。因此,如果你的奖励模型显示它有很高的 logits,那么在某种程度上,人类会更喜欢这个答案而不是其他答案。正如我刚才所说,连续信息更好。这就是人们在实践中使用的,或者至少曾经在实践中使用过的。

稍后我会介绍另一种算法。基本上,你最后要做的就是尝试只使用你所了解的强化学习。现在我们知道我们有了奖励,你采样的是从你的大型语言模型中生成的,然后只需使用一些正则化项。我们做这个正则化项的原因是为了避免过度优化。因此,这种奖励模型可能并不真正具有代表性,可能无法完美地模拟人类的偏好。因此,你不想将这个东西最大化到无穷大。

你可以使用 PPO(近端策略优化)来实现,这是一种常见的强化学习算法。这里有一点需要注意,因为这对以后很重要,那就是当我们使用最大似然时,大型语言模型实际上是强化学习的策略。它不再最大化最大似然,这意味着你不再对任何分布进行建模。这很重要的原因是,经过这种 PPO 的模型实际上不会为你提供有意义的文本可能性,因为你优化它们所做的基本上只是优化以生成最可能的东西,而不是优化建模,比如人类可能说的所有答案。换句话说,这里没有任何东西可以激励模型不给出一个可能的生成。这里没有任何东西表明如果你有一个带有某种熵的分布,那它就是好的。

PPO 正是 ChatGPT 最初所做的。在他们的博客文章中,他们有第一步,进行监督微调,现在你们都知道了。第二步,根据人类偏好训练奖励模型。第三步,执行 PPO 多个步骤,这就是你看到这个蓝色箭头的地方。你继续用 PPO 训练模型一次,收集新数据,继续。这正是 ChatGPT 所做的,也是 GPT-3 和 ChatGPT 之间的重大突破。

需要注意的一点是,PPO 面临许多挑战。强化学习在理论上非常好,但在实践中,任何曾经使用过强化学习的人都知道它很复杂。有很多事情,比如推出、外循环、剪辑等,导致过程非常复杂。这是用于语言模型(LM)设置的理想化近端策略优化(PPO)。这比我们之前预期的要复杂得多。实际上,它要复杂得多。我们必须实现它,但我不会详细介绍。基本上,当你实现这种类型的PPO算法时,你必须考虑很多因素。到处都有剪辑,复杂性很高,而且文档记录不完善。

所有这些都表明,我们需要一种新的方法。大约一年前,斯坦福大学提出了一种新方法,叫做直接偏好优化(DPO),本质上是PPO的简化。他们的思路是,不使用强化学习,而是最大化生成你喜欢的东西的概率,并最小化你不喜欢的东西的概率。

如果你考虑人类的偏好,红色和绿色会最大化绿色,最小化红色。所以损失实际上是模型在给定输入情况下生成人类喜欢的东西的可能性。你试图做的基本上是最大化生成你喜欢的东西的可能性,最小化你不喜欢的东西的可能性。其他所有术语在这里都不太重要,理解起来并不复杂。但在高层次上,它实际上只是最大化你喜欢的东西,最小化其他的东西。

有一点需要注意,实际上所有其余的选择在某些假设下,PPO的全局最小值和DPO的全局最小值基本上是等价的。所以从数学上来说,这是正确的做法。我不会进行推导,但这是正确的做法。

PPO的情况完全不同。使用PPO,你需要收集人类偏好,然后训练具有最大似然的奖励模型,再使用强化学习。现在你所做的基本上就是最大似然,简单多了。

他们为什么从这个奖励模型开始?是什么促使他们这样做?

我认为这是一个很好的问题。我真的不知道。我可以告诉你的是,在OpenAI,最初做ChatGPT的人是真正编写PPO的人。我认为他们就像很多强化学习的人一样,对他们来说这是非常直观的。

还有一些额外的潜在好处。例如,如果你使用奖励模型,强化学习的妙处在于,你可以将未标记的数据与奖励模型一起使用。在这里,你只能使用标记数据来执行DPO。

对于PPO,首先需要训练奖励模型,然后可以使用未标记的数据,奖励模型会标记这些未标记的数据。因此,还有额外的潜力,可能会有潜在的改进。然而,实际上并没有。

我认为,这个团队中有很多强化学习专家,包括PPO的主要作者乔治·霍尔曼。PPO比DPO简单得多,而且表现也很好。所以现在这是人们使用的标准,至少在开源社区中是这样。我相信这实际上也是行业标准。这被称为DPO。

收益方面,左边的都是这些文件。这是一项总结任务。我想向你展示的是,预先训练的模型还不错,而且它们会随着规模的扩大而改进。如果进行监督微调,会有更多的改进。如果使用带有人工反馈的RLHF进行PPO或类似操作,会得到比人类更好的性能,这取决于基准。这是人类的参考总结。

同样,这是我们在Alpaca Farm的一篇论文中看到的,评估并不是太重要,但基本上你看到预先训练的模型,然后跳转到SFG,再跳转到PPO-DPO,PPO-DPO具有完全相同的性能。所以基本上,RLHF有帮助。这就是结论,DPO很简单。

关于数据的收集方式,第一个想法就是使用人类,正如我们已经讨论过的。对于人类应该标记什么的指导方针非常复杂,而且真的不是那么容易。实际上,如果你做过一些标记,你会发现它非常复杂。

比如,如果我放大这个问题,告诉我关于自动驾驶汽车的事情。你读到过,自动驾驶汽车是能够检测周围环境的车辆,等等。自动驾驶汽车是配备传感器的汽车,等等,无需驾驶员即可导航。两者似乎都还不错。比如,哪一个更好?乍一看,这实际上很难说。

结果,人类的问题是,你会开始优化很多高级功能。例如,第二个更长。我可以向你保证,大多数人会选择第二个。尽管也许第一个更好,我不知道,我还没有仔细读过。所以人类面临的挑战是,首先,速度慢,成本高。其次,正如我刚才提到的,很难专注于重要的事情,比如正确性。人们通常会关注一些不太重要的东西,比如形式、长度。因此,我在这里展示的是,当你进行RLHF(强化学习与人类反馈)时,RLHF的次数越多,模型的输出就越长。如果你曾经对ChatGPT回答的超长句子感到恼火,这是因为RLHF的影响。

注释者的分布转变是一个重要因素。你使用的注释者的分布非常重要。你必须思考,我们希望在这些模型中代表的人类是什么样的?另一个问题是众包道德。通常,很多标签工作报酬不高,执行这些任务的人必须经历大量有毒数据,因为你希望模型避免输出有毒数据。众包道德也是一个重要问题。

人类数据面临诸多挑战。去年我们做了与Alpaca类似的工作,认为人类面临挑战,也许我们可以用LLM(大型语言模型)来代替他们。我们所做的只是简单地替换人类的偏好为LLM的偏好。

在这个图中,X轴表示我们为收集人类数据所付出的代价。收集1000个示例大约需要300美元,这是在Mechanical Turkers上进行的,通常比其他一些公司便宜。Y轴表示与其他人类的协议一致性。实际上,标记确实非常复杂。在二元任务中,人类只有大约66%的时间与自己意见一致。这并不是说人类表现不好,因为我们是这篇论文的五位主要作者,我们尝试自己标记这些数据,但准确率只有67%或68%,尽管我们花了三个小时讨论如何标记。这真的很复杂,不是一件容易的事。

我展示了许多不同的模型。基本上你会发现模型要便宜得多,而且它们实际上可以比人类本身与人类模式的一致性更高。原因是人类有很多变体,而模型没有变体,所以它们可能有点偏见,但变体较少,因此效果出奇地好。现在这已经成为开源社区的标准。我认为即使在工业界,很多人也会同时使用人类和LLM来改进所有HF数据的收集。

这是去年的论文,但老实说,现在更像是LLM围绕这个协议,而这个成本大约比人类便宜50倍,而且与人类达成的协议比人类本身更好。因此,这让我们开始评估训练后的效果。这又回到了你在讲座开始时提出的问题:你如何评估像ChatGPT这样的模型?

ChatGPT可以给出的答案基本上是无限的,而且并不是说它只有一个正确答案。有很多答案同样好,所以存在很多挑战。首先,你不能使用验证损失,因为一种方法可能使用PPO,另一种方法可能使用DPO,验证损失是不可比的。其次,你不能使用困惑度。这是我之前告诉你的,这些模型没有经过校准,它们没有给出分布,它们只是针对一件事进行优化。因此,一旦对齐,你就不能使用困惑度来实际评估这些类型的模型。

第三,人类可能会向这些模型提出各种各样的问题,包括生成、开放式问答、一些问答、一些总结等等。所以你必须涵盖很多内容。这些任务真的是开放式的,所以很难实现自动化。这就是你之前提到的。所以我们的想法是,我们不是试图想出真正容易实现自动化的基准,而是要问用户在实践中实际向这些模型提出的问题。我们只是要让注释者说出这两个模型中哪一个更好,比如哪个输出更好。所以你基本上和所有HF的数据做同样的事情,但现在你用它来进行评估。

我不确定我是否理解你的意思,比如,你不能使用困惑度而不校准它,比如,LLM仍在进行下一个标记预测,但是,为什么不能使用困惑度?

想想,进行PPO之后的最佳解决方案基本上是一个模型,它给你一个增量,基本上是说只有一个句子可以针对该问题生成。所以现在如果你将它用在语义上稍微不同的东西上,它实际上会给出该答案的可能性为零。实际上,情况并没有那么极端,因为正如你所说,它仍然是一种分布,但它只是向你展示了困惑度存在一个根本问题。一旦这些模型不再是LLM,它们就不会再被训练,至少对于PPO来说,它们就不会再被训练去做最大似然法了,它们被训练成策略。

所以可能最常见的或者最受信任的基准是我们所说的聊天机器人竞技场,基本上是上网,让互联网上的随机用户盲目地与两个聊天机器人交谈,只需问很多问题,看看两个答案,然后评价哪一个更好。你要对数十万用户进行这样的测试,然后你就会得到实际的偏好,然后得到模型的排名。您现在可以进入聊天机器人领域,与这些模型进行实际互动。

需要强调的是,虽然想要做这些事情的人通常更像是技术驱动的,或者对技术比较通晓,所以你会问很多技术方面的问题,讨论软件错误、AI工具的使用等。

另一个问题是成本和速度。如果你真的想在开发过程中使用这样的工具,那将非常昂贵,因为你基本上需要付钱给很多人来做这件事。所以一个简单的想法是,只使用语言模型(LM)而不是人类。

每条指令的步骤都会根据一些基线和你想要评估的模型生成输出。想象一下我正在比较 ChatGPT 和 Mistral 的答案。我只是问一个模型,再问另一个模型,哪一个更好,然后取平均值。是的,我问过 GPT-4 哪一个更好。我对整个分布、基准或数据集取平均值,这给了我一个胜率,即一个模型与另一个模型相比的胜率,现在你可以对模型进行排名了。这是 Alpaca 评估,排行榜。

这样做的好处是,我们展示了与 ChatBot Arena 的相关性为 98%,与人类的相关性非常高。与其他基准的相关性比较,运行时间不到三分钟,成本不到10美元,非常便宜。

不过也有缺点。其中之一是虚假相关。正如我们之前看到的,语言模型更喜欢较长的输出。实际上,人类也喜欢较长的输出,但问题在于,一旦使用语言模型,一旦存在偏见,你就会继续优化它。人类在某个时候会拒绝过长的答案,但如果语言模型有这种偏见,并且它们为此接受过训练,它们将继续喜欢较长的输出。所以,在这里我们看到,偏好只是表明人类和模型更喜欢较长的输出。

这是初始Llama评估数据集基准的另一个视图。当我们对 GPT-4 进行排名时,如果我们比较标准 GPT-4,它会得到 50% 的定义,因为我们正在比较 GPT-4 与 GPT-4。但是,如果我们要求 GPT-4 稍微详细一些,只需在提示中说在答案中要详细一些,那么它的响铃率为 64.4%。差异确实很大。

如果我们要求模型简洁,它的表现可能只有20%。因此,根据您要求的简洁或详细程度,结果会有很大差异。这非常令人烦恼。

一个可能的解决方案是使用回归分析。虽然我不会详细介绍,但基本上是使用因果推理工具来控制文本长度。现在,实际上长度并不那么重要。如果您要求详细,仍然会有一些收益,但收益会少得多。

这就是关于训练后的全部内容。接下来的八分钟里,我可能会谈论系统或回答问题。

回到训练后,我们如何使用少量微调数据调整参数并对模型产生如此大的影响?您之前提到过,有一组不同的超参数。我们是只改变部分权重、后续权重,还是所有权重?实际情况如何?

是的,我粗略地浏览了所有这些。你需要改变所有的权重。实际上,行业会改变所有的权重。在开源领域,你可能听说过LoRa,它基本上只会改变一些权重,或者更具体地说,它会给每一层的输出添加一些差异。但在行业中,你需要微调所有的权重。

关于数据的其他方面,实际上在最后一步,allHF,你通常会收集比SFT多得多的数据。如果SFT是5,000、10,000,也许50,000,allHF的数据量可能接近100万,数量级上更大,但仍然比预训练少得多。预训练涉及15万亿个token,这甚至不算什么。

然而,你对权重的影响很大。因为你这样做——你必须认为你这样做的方式是使用不同的学习率。但同时,你只能这样做。想象一下,如果我训练——即使我只训练一个句子,但一遍又一遍,在某个时候,我的模型只会生成那个句子,即使它只是一个句子而不是15万亿个标记。所以如果你使用足够大的学习率,并且持续足够长的时间,你基本上会过度拟合那个句子。

关键是,数据不是id——它不像你混合了一些训练后数据和一些训练前数据。你进行预训练,然后你只需开始微调——仅在训练后。所以另一种方式——也许另一种观点是,预训练只是你的模型的初始化。一旦你这样看待它,就会发现这只是权重的初始化,所以没有什么特别的。比如,你不需要记住你之前已经对大量数据进行过训练。唯一重要的是,您进行了初始化,现在我实际上训练了一个模型。

在某种程度上,有一个属性标记。你有你的权重,这是我的初始化。现在我正在训练那个。这能回答你的问题吗?

但是你刚才说了一些东西,它几乎相当于多次重新运行微调数据。这是否真的是为了提供更多的偏好而实际发生的事情?

嗯,我现在实际上不知道他们在行业中是如何做的。当我们做Llama时,我们必须做三个时代。所以你确实对它运行了三次。但是,即使你运行它的次数,实际上也不重要。唯一重要的是有效学习率,这才是最重要的。

我想我有五分钟。我可能会尝试给出一个高层次的概述,至少从系统技巧之一开始。正如我们所说,对于每个人来说,系统瓶颈都是很抱歉的,计算是一个巨大的瓶颈。你可能会问的一个问题是,为什么不买更多的GPU?

GPU很贵,但也很稀缺。即使你现在有1000万美元,你也买不到最好的GPU。还有一些物理限制。当你有多个GPU时,你必须在它们之间进行通信,这需要时间。所以,仅仅购买更多的GPU并不是那么容易。因此,考虑如何分配资源以及如何优化你的管道真的很重要。

系统方面,GPU 101。对不起,我讲得快一点。我希望你们中的一些人至少能跟上。GPU基本上是针对吞吐量进行优化的,CPU是针对延迟进行优化的。因此,对于GPU,你必须这样思考:一个命令可以同时在多个内核上运行,处理不同类型的数据。这就是你看到的GPU,有很多不同的核心。我们称它们为流式多处理器,这与通常的CPU架构非常不同。所以,想想GPU的高吞吐量、并行化。GPU针对快速矩阵乘法进行了优化。每次在 GPU 上进行操作时,如果能使用矩阵乘法,速度会比其他方法快 10 倍。这有点令人烦恼,因为这意味着我们在矩阵乘法方面遇到了瓶颈。

需要注意的是,GPU 的计算速度改进比内存和通信速度更快。因此,现在 GPU 通常很难保持同步,发送给 GPU 的数据实际上很难跟上进程。如果只是运行普通代码而不优化,大多数 GPU 实际上会处于空闲状态。这种通信瓶颈会随着时间的推移而持续存在。

另一个需要了解的是,GPU 存在内存层次结构。这与 CPU 类似,离核心越近,内存越少但速度越快;离核心越远,内存越多但速度越慢。

人们通常关注的指标是模型的浮点数利用率。GPU 可以运行的理论最大值是多少,每秒可以使用的浮点数是多少,观察到的吞吐量除以这个理论最大值。一般来说,如果达到 50%,就已经很不错了。例如,Facebook 的 Lima 项目浮点数利用率大约是 45%。这意味着数据传输速度不够快,即使对于大公司也是如此。

一个简单的技巧是使用低精度。将浮点数置于低精度,发送到 GPU 的位数就会减少,通信速度更快,内存消耗更低,一切都会变得更快。对于深度学习来说,小数精度并不那么重要。例如,在进行矩阵乘法或 SGD 时,已经存在太多噪音,更新 0.01 或 0.015 并不会有太大影响。

因此,不再使用每个浮点数 32 位或 64 位,而是使用 16 位进行矩阵乘法。对于训练,可以使用一种称为自动混合精度的方法,即某些内容使用 32 位,其他内容使用 16 位。一般来说,模型的权重以 32 位存储,但在计算之前,将所有内容转换为 16 位,这样可以非常快速地进行计算,最后以 32 位更新权重。你之所以使用32位进行所有更新,是因为你认为即使学习率非常小,你仍然希望能够对权重产生影响。因此,所有计算都是用16位完成的,但权重实际上存储在32位中。这是人们做事的标准方式。

接下来,我将谈论运算符融合,因为我认为这非常酷。正如我刚才所说,通信非常慢。实际上,每次使用PyTorch时,它基本上都会将变量移动到GPU的全局内存中。

当你有这样的内容时,比如x点余弦等于x1,然后你执行x1点余弦,后台发生的事情是,你获取x,即数据,将其发送到GPU的实际处理器,应用余弦,然后将其发送回GPU的主内存。然后你看到下一行,你把它送回GPU处理器,应用另一个余弦,然后再把它送回来。

另一种看待这个问题的方式是,你从DRAM(GPU中的全局内存)出发,然后把它送到计算中,每行都把它送回来。这是一种幼稚的做法,似乎非常浪费。因此,运算符融合的简单想法就是进行所有计算,然后只进行一次通信,把结果送回来。这正是融合内核的本质。

如果你想让在PyTorch中的计算速度更快,只需在你的模型上应用torch.compile。这将使你的模型速度提高大约两倍。它所做的只是重写你的代码,比如你的PyTorch代码,基本上在CUDA中使用C++,只进行一次通信,然后执行所有操作,再把结果送回来。

我没有时间详细谈论平铺。平铺很重要,并行化也很重要,专家的混合也很重要。展望未来,还有很多事情我们还没有谈到。我们还没有谈到架构,也没有谈到推理。LLM还有许多其他重要的事情。

可以说,ChatGPT最大的创新之处在于它有一个简单的UI来使用它。多模态,你可能遇到的所有误用是什么。事实上,互联网上可能没有足够的数据来训练所有这些模型。数据收集的合法性也是一个问题。