大语言模型工作原理-全-
大语言模型工作原理(全)
原文:
zh.annas-archive.org/md5/30a69bc879fc5cd219515d046eed844c
译者:飞龙
第一章:整体图景:什么是 LLMs?
本章涵盖
-
生成式预训练变换器和大型语言模型是什么
-
以通俗易懂的语言解释 LLMs 的工作原理
-
人类和机器如何不同地表示语言
-
为什么像 ChatGPT 这样的工具表现如此出色
-
理解使用 LLMs 的局限性和担忧
机器学习(ML)、深度学习(DL)和人工智能(AI)等术语的炒作已经达到了历史最高水平。这些术语最初对公众的曝光很大程度上是由一个名为 ChatGPT 的产品驱动的,这是一种由 OpenAI 公司构建的生成式 AI。现在,我们可以在日常新闻中看到来自 Google 的 Gemini、来自 Microsoft 的 Copilot、来自 Meta 的 Llama、来自 Anthropic 的 Claude 以及像 DeepSeek 这样的新来者等生成式 AI 产品。似乎一夜之间,计算机说话、学习和执行复杂任务的能力有了巨大的飞跃。新的生成式 AI 公司正在形成,现有公司也在公开投资数十亿美元进入这个领域。这个领域的科技正在以令人疯狂的速度发展。
本书旨在通过揭示 ChatGPT 及相关技术工作原理背后的神秘面纱,帮助您理解这个新世界。我们将涵盖理解其内部工作原理以及组件(数据和算法)如何堆叠在一起以创建我们使用的工具所需的知识。我们还将讨论这种技术如何成为更广泛系统的基石,以及在其他情况下,基于大型语言模型(LLMs)的系统可能不是最佳选择的各种案例。
阅读本书后,您将了解生成式 AI 如 ChatGPT 真正是什么,它能做什么,不能做什么,以及它局限性的“为什么”。有了这些知识,您将成为这个技术家族更有效的消费者,无论是作为用户、软件开发者,还是决定是否以及如何将其纳入产品或运营的组织中的业务决策者。这个基础也将作为深入研究该领域的跳板,提供知识,让您能够深入理解研究和其他作品。
1.1 上下文中的生成式 AI
首先,当我们谈论 LLMs、GPTs 以及依赖它们的各种工具时,我们需要更具体地了解我们讨论的内容。ChatGPT 中的 GPT 代表生成式预训练变换器。这些词在 ChatGPT 的上下文中都有特定的含义。我们将在未来的章节中讨论预训练和变换器的含义,但在这里,我们先讨论一下在这个上下文中生成式的含义。
类似于 ChatGPT 的 AI 聊天机器人是生成式 AI 的一种形式。广义上,生成式 AI 是能够根据过去观察到的数据以及受人们认为令人愉悦和准确输出影响的软件,生成或创建各种媒体(例如,文本、图像、音频和视频)。例如,如果 ChatGPT 被提示“写一首关于松树上雪的俳句”,它将使用所有关于俳句、雪、松树和其他诗歌形式的训练数据来生成一个新颖的俳句,如图 1.1 所示。
图 1.1 ChatGPT 生成的一个简单的俳句
基本上,这些系统是生成新输出的机器学习模型,因此生成式 AI 是一个恰当的描述。一些可能的输入和输出在图 1.2 中得到了展示。虽然 ChatGPT 主要处理文本作为输入和输出,但它也支持更多实验性的不同数据类型,如音频和图像。然而,根据我们的定义,你可以想象许多不同类型的算法和任务都符合生成式 AI 的描述。
图 1.2 生成式 AI 接收一些输入(数字、文本、图像)并产生新的输出(通常是文本或图像)。输入或输出选项的任何组合都是可能的,输出的性质取决于算法训练的目标。它可能是添加细节、缩短内容、推断缺失的部分等等。
深入一层,ChatGPT 处理的是人类文本,因此也可以公平地称其为人类语言模型——如果你是一个在被称为“自然语言处理”(NLP)领域的酷炫人士,你可能会称其为“语言模型”。NLP 领域与计算机科学和语言学相交,探索帮助计算机理解、操作和创建人类语言的技术。NLP 领域的早期努力出现在 20 世纪 40 年代,当时研究人员希望构建能够自动在不同语言之间进行翻译的机器。因此,NLP 和语言模型已经存在很长时间了。那么,是什么让新的生成式 AI 工具与众不同呢?最显著的区别是,ChatGPT 和类似的算法比人们历史上构建的规模要大得多,并且是在更大的数据量上训练的。
因此,“大型语言模型”(LLMs)这个名字被广泛用来描述 GPT 和类似类型的机器学习模型。GPT 描述的是由 OpenAI 开发的一种特定类型的 LLM,其他公司使用类似的技术来构建自己的 LLMs 和 AI 聊天机器人。更广泛地说,LLMs 是在大量语言数据上训练的机器学习模型。
这些关系的图示可以在图 1.3 中看到。ChatGPT、Copilot、Claude 和 Gemini 是一些通过文本操作的产品,它们使用 LLMs 构建。LLMs 使用来自 AI 和 NLP 的技术。LLM 的主要组件是一个转换器,我们将在第三章中详细解释。
图 1.3:你将熟悉的各种术语及其相互关系的高级图示。生成式人工智能是对功能性的描述:生成内容并使用 AI 技术实现该目标的功能。
注意,视觉和语言并不是生成式人工智能的唯一选择。音频生成(例如,当你的 GPS 说出街道名称时的文本到语音),玩像国际象棋这样的棋类游戏,甚至蛋白质折叠都使用了生成式人工智能。这本书将主要关注文本和语言,因为这些都是 GPTs 和 LLMs 使用的主要数据类型。
正如名称“大型”所暗示的,这些模型并不小。ChatGPT 据传言[1]包含 1.76 万亿个参数,这些参数用于决定其行为方式。每个参数通常存储为一个使用 4 个字节进行存储的浮点数(带有小数点的数字)。这意味着模型本身需要 7 个太字节来在内存中存储。这个大小比大多数人的电脑能放入 RAM 中的大小都要大,更不用说在拥有 80GB 内存的最强大的图形处理单元(GPU)内部了。GPU 是专门的硬件组件,擅长执行使 LLMs 成为可能的各种数学运算。目前,制作 LLMs 需要许多 GPU,因此我们已经在讨论多个机器上的大量计算基础设施和复杂性,以构建一个 LLM。相比之下,大多数常规语言模型在大多数情况下不会超过 2GB——超过 5,000更小,在考虑在更标准的硬件上构建和使用此类模型时,这是一个更加合理的尺寸。
优化 LLMs
许多研究人员正在探索让大型语言模型(LLMs)消耗更少内存的方法。有时,这包括使用名为“混合精度”的方法,该方法需要少于 4 个字节来存储一个参数的技术[2]。这种方法使用 2 个字节或更少的存储空间来存储一些 LLM 参数,并在精度和内存效率之间做出权衡。最终,对精度的影响通常是可以忽略不计的。这种优化是研究人员为了使 LLMs 更加资源高效而做出的许多优化之一。
GPU 替代方案
虽然 GPU 目前是训练 LLM 最常用的硬件,但并非唯一的选择。越来越多的公司正在开发专门用于训练机器学习模型的专用硬件,这些硬件提供了训练机器学习模型的一般优势。例如,2018 年,谷歌将其 Tensor Processing Unit (TPU) [3]作为谷歌云平台(GCP)的一部分向公众开放。虽然 TPU 的算力通常低于 GPU,但它们的专用架构使它们在特定的机器学习任务上比 GPU 表现更好。
1.2 你将学到什么
在整本书中,我们将解释 LLM 是如何工作的,并为你提供理解它们所需的词汇。阅读完毕后,你将对 LLM 是什么以及其操作中的关键步骤有一个对话式的理解。此外,你将对 LLM 合理能做什么有一些看法,特别是与部署或使用 LLM 相关的考虑。我们将讨论 LLM 的基本限制的显著点,并提供如何绕过它们或何时应完全避免使用 LLM 以及更广泛的生成式 AI 的建议。
请记住,如何将变压器组合起来构建 ChatGPT、Claude 或 Gemini 的细节是微妙的,本书主要关注这些系统共有的特点。实际上,我们无法了解这些 LLM 之间的一些实际差异,因为尽管商业 LLM 提供商已经分享了他们模型的大量信息,但他们没有分享一些信息,这些信息可能被认为是商业机密。
由于基于 Transformer 的 LLM 将对世界产生的影响,我们故意将本书的受众范围扩大。所有背景的程序员、高管、经理、销售人员、艺术家、作家、出版商以及许多其他人在未来几年内将不得不与 LLM 互动或他们的工作将受到 LLM 的影响。因此,我们假设你,亲爱的读者,有最少的编码背景,但熟悉编码的基本结构:逻辑、函数,甚至可能是一些数据结构。你也不必是数学家;我们将展示一些有助于理解 LLM 工作原理的数学知识,但在构建对 LLM 工作原理的理解时,这些知识将是可选的。
这种方法意味着本书中将展示的代码非常少。如果你想直接进入构建和使用 LLM,Manning 目录中的其他书籍,如 Sebastian Raschka 的《从零开始构建大型语言模型》(2024)或 Edward Raff 的《深度学习内部》(2022),将补充这里所展示的内容。然而,如果你想了解你使用的 LLM 为什么会有不寻常的输出,你的团队如何可能使用 LLM,或者在哪里避免使用 LLM,或者如果你有一个对机器学习背景了解有限的同事需要具备对话能力,这本书就是你和你同事需要的。
尤其是本书的第一部分专注于 LLM 做什么:它们的输入和输出,将输入转换为输出,以及我们如何约束这些输出的性质。在第二部分,我们将关注人类做什么:人们如何与技术互动,以及使用生成式 AI 会带来哪些风险。同样,我们还将讨论在使用和构建 LLM 时出现的某些伦理考量。
训练 LLM 是昂贵的
对于大多数人来说,训练一个 LLM 并不现实;这至少是一个的投资,而与 OpenAI 竞争可能需要 10 亿美元。与此同时,用于训练 LLM 的资源正在不断演变。因此,我们不是带你了解今天训练 LLM 的样子,而是关注那些具有更长保质期的内容——我们认为这些知识在未来几年内仍然有效,而不是那些可能几个月后就过时的示例代码。
1.3 介绍 LLM 的工作原理
生成式人工智能(GAI 或 GenAI)正准备改变我们生产和交互信息的方式。2022 年 11 月 ChatGPT 的推出凸显了现代 AI 的能力,并吸引了世界上很大一部分人的兴趣。目前,你可以在 chat.openai.com/
上免费注册尝试。
如果你输入文本提示“用两句话总结以下文本”,然后跟上是本章的所有介绍性文本,你将得到类似以下的内容。
“近期人工智能领域,尤其是像 OpenAI 的 ChatGPT 这样的大型语言模型(LLM)的关注度激增,凸显了它们在自然语言处理方面的巨大能力。本书旨在向读者提供对 LLM 的对话式理解,包括它们的操作复杂性、潜在应用、局限性以及使用它们时涉及的伦理考量,同时假设读者对编码概念有基本的了解,并具备最少的数学背景。这相当令人印象深刻,对于普通观众来说,这种能力可能似乎是从天而降。”
当你访问 OpenAI 的网站并注册 ChatGPT 时,你可能注意到一个类似于图 1.4 中所示的选择项。正如 GPT-4 这个名字所暗示的,截至本文写作时,Open AI 正在开发其第四代 GPT 模型。像 GPT-4 这样的 LLM 是机器学习研究中一个确立的领域,它旨在创建能够综合和反应信息并产生看似由人类生成的输出的算法。这种能力解锁了人与人之间机器互动的几个领域,这些领域以前仅存在于科幻小说中。ChatGPT 中编码的语言表示的强大能力使得对话、指令遵循、摘要生成、问答、内容创作以及更多应用成为可能。实际上,许多可能的应用技术可能尚未存在,因为我们的直觉反应是思考我们当前的问题,而不是可能存在的新能力或产品。
图 1.4 当你注册 OpenAI 的 ChatGPT 时,你有两个选择:你可以免费使用的 GPT-3.5 模型,或者需要付费的 GPT-4 模型。
对你,即读者来说,关键因素是这项技术并非凭空出现,而是过去十年中机器学习逐年显著进步的结果。因此,我们已经对 LLM 的工作方式和它们可能失败的方式有了相当的了解。
我们假设有一个最小的背景,这样你就可以把这本书给你的朋友和家人。(其中一位作者希望他们能将这本书送给他们的母亲,尽管她不知道他们的确切工作是什么,但她为他们感到非常自豪。)因此,在我们深入之前,我们需要填补一个可能很大的背景差距。第一章旨在为你提供这个背景,以便下一章可以开始回答这个问题:电脑究竟是如何总结这本书的引言的?
1.4 什么才是真正的智能?
从营销角度来看,“人工智能”是一个很好的名字,尽管它最初被用作一个整个学术研究领域的名称。这种做法导致了一个微妙的问题,给人们造成了关于 AI 工作方式的错误心理模型。我们将尽力避免强化这种模型。为了解释原因,我们将讨论为什么“人工智能”不是一个很好的名字。我们可以通过考虑一个简单的问题来轻松证明这一点:什么是智能?
你可能会认为像智商测试这样的东西可以帮助我们回答那个问题。智商测试与许多结果有很强的相关性,如学校表现,但它们并没有给我们一个客观的智能定义。研究表明,一些自然(遗传)和环境因素会影响一个人的智商。我们也应该怀疑,我们能否将智能简化为一个如此简单的数字——毕竟,我们经常批评人们只是“书本上的聪明”,而不是“街头上的聪明”。即使我们知道了智能是什么,什么会使其变得人工化?智能有制造的风味和食品色素吗?
事实上,智商测试衡量的是你执行有限能力的能力,主要是时间限制下的某些特定类型的逻辑谜题,但它们并不能帮助我们理解智能的根本性质。事实是,对智能的理解并不完美。
人工智能领域长期以来一直在尝试让计算机,这些是僵化、确定性、遵循规则的机器,执行人类可以执行但无法给出精确定义或指令的具体任务。例如,如果我们想让计算机数到 1000 并打印出所有能被 5 整除的数字,我们可以编写详细的指令,几乎任何程序员都可以将其转换为代码。但如果我们要求你编写一个尝试检测任意图片中是否有猫的程序,那将是一个完全不同的挑战。你需要以某种方式精确地定义什么是猫,然后是检测猫的所有细节。我们如何编写代码来找到和区分猫胡须和狗胡须?当猫没有胡须时,我们如何成功地识别它?归根结底,这并不容易做到。
然而,由于人工智能和机器学习专注于这些难以界定的任务,即人类可以执行的任务,因此使用类比来描述人工智能和机器学习算法变得特别常见。为了让计算机检测到猫,我们提供了成千上万张是猫和不是猫的图片示例。然后我们运行许多算法之一,这些算法具有一个特定、详细、数学化的过程,用于区分猫和其他物体。但在技术术语中,我们称这个过程为学习。当模型在新的图像中未能检测到猫,因为它是一只狮子,而狮子不在原始的猫的列表中时,我们经常说模型没有理解狮子。
事实上,每当我们要向朋友解释某事时,我们通常会使用我们双方都熟悉的共同概念进行类比。因为人工智能和机器学习广泛关注复制人类执行任务的能力,所以这些类比经常使用暗示人类直接认知功能的语言。随着大型语言模型(LLMs)展示出接近人类所能做到的能力,这些类比变得比有帮助更麻烦,因为人们过于深入地解读它们,并开始相信它们意味着比实际更多的东西。
因此,我们将谨慎使用类比,并提醒读者不要过度追随任何类比。一些术语,如学习,是值得理解的术语,但我们希望您对它们可能意味着什么保持警惕。在某些情况下,这本书中的类比仍然是有帮助的,但我们将尝试明确解释如何解释这些类比的范围。
1.5 人类与机器如何不同地表示语言
表示语言意味着什么?我们人类在出生后不久通过与周围的人和世界的互动,隐式地开始学习如何表示语言。我们通过正规教育来发展对语言及其使用的组成部分、底层结构和规则的理解。我们对语言的内部表示已经被广泛研究。虽然已经发现了某些语言定律,但许多仍然有待辩论。ChatGPT 对语言的内部表示基于这些知识的一部分。它是通过使用人工神经网络的概念实现的,也称为深度学习(另一个危险的类比),这些是模仿人类大脑结构的数据结构和算法的组合。然而,我们对心智工作方式的了解是不完整的。虽然为 LLMs 提供动力的神经网络只是人类大脑结构的简化,但它们的强大之处在于它们能够以有用的方式捕捉和编码语言,以生成语言并与人们互动。
注意 大脑结构的抽象在许多领域都已被证明是有用的。神经网络在语言、视觉、学习和模式识别方面取得了惊人的进步。神经机器学习算法的进步、数字数据的极端增长以及如 GPU 等计算机硬件的爆炸性增长,共同导致了今天 ChatGPT 成为可能的技术进步。
从这次讨论中,我们需要关注的关键细节是,作为人类,你天生就理解你随着时间的推移所学习的语言。你的学习和语言使用是互动的。通过进化,我们似乎都有相对一致的学习和相互沟通的方式。要了解更多关于这个概念的信息,可以查阅语言学家诺姆·乔姆斯基提出的普遍语法理论。与人类不同,LLMs 通过静态过程学习语言表示。当你与 Claude 或 ChatGPT 进行对话时,它机械地参与与你进行的对话,尽管它以前从未参与过任何对话。
LLM 学习的语言表示可能质量很高,但并非没有错误。它是可操纵的,我们可以以特定方式改变 LLMs 的行为,以限制它们所了解的内容或它们产生的结果。理解 LLMs 通过从示例中推断出的关系来表示语言,有助于我们保持现实的期望。如果你打算使用 LLM,如果它出错,会有多危险?你如何与语言表示一起工作来构建产品或避免不良结果?这些问题是我们将在本书中讨论的一些高级问题。
1.6 生成式预训练转换器和朋友们
“生成式预训练转换器”这个术语是由 OpenAI 发明的,用于描述他们在 2018 年引入的一种新型模型,该模型包含一种称为转换器的神经网络组件。虽然原始的 GPT 模型(GPT-1)不再使用,但预训练和转换器的核心思想已成为最近生成式 AI 革命以及 Claude、Gemini、Llama 和 Copilot 等工具的核心支柱。
认识到这些基于 GPT 的人工智能工具只是 LLMs(大型语言模型)算法研究和应用广泛领域的一个例子,这一点同样至关重要。除了 ChatGPT 的发布,我们还观察到 LLMs 的惊人增长。一些 LLMs,如 EleutherAI 和 BigScience Research Workshop 发布的 LLMs,对公众免费开放,以推进研究和探索应用。正如我们提到的,Meta、Microsoft 和 Google 等公司已经发布了具有更严格许可条款的其他 LLMs。任何人都可以使用的公开 LLMs,有时被称为基础模型,已经创造了一个充满活力的研究、爱好者和公司社区,他们正在探索 LLMs 和生成式 AI 的应用、局限性和机遇。本书中教授的概念几乎普遍适用于所有 LLMs。这些 LLMs 都使用与 ChatGPT 中找到的结构相似,如果不是完全相同的方式来产生输出。
对于一本书来说,似乎不可能包含适用于许多模型的通用总结。然而,由于以下几个原因,这是可能的,其中最重要的一个原因是,我们不会深入到足以从零开始自己编写 LLM 代码的程度。自然地,ChatGPT 和其他商业 LLMs 的部分仍然属于商业机密。因此,我们的范围和描述有意地概括了今天所有生成型 LLMs 最常见方面。
我们可以给出这样一个广泛适用的总结的第二个原因是 LLMs(大型语言模型)的本质。虽然确实可以对它们的建设和运行方式进行调整,但该领域的学者们一致发现,最重要的细节如下:
-
模型有多大,你能否使其更大?
-
构建模型所使用的数据量有多少,你能否获得更多?
对于那些认为自己拥有重要见解或设计,能够实质性改进这些 LLMs 的工作和运行方式的学者来说,这些点可能会令人沮丧,因为在许多情况下,通过“使其更大”或构建一个拥有更多数据或更多参数的模型,同样可以轻易地获得相同的改进。增加模型和数据集的大小是围绕使用和构建 LLMs 的许多伦理问题中的一个关键组成部分,我们将在第九章中讨论。
1.7 为什么 LLMs 表现如此出色
我们将在接下来的章节中讨论 LLMs 的工作细节,但在这里也值得分享一个通过研究机器学习算法所学到的重要教训。多年来,从你的算法中获得更好的性能,无论你试图完成什么任务,通常意味着你需要巧妙地设计你的算法。你会研究你的问题、数据以及数学,并试图推导出关于世界的有价值真理,然后将其编码到你的算法中。如果你做得好,你的性能会提高,你需要的数据会更少,世界上的所有事情都会变得很好。你可能听说过的许多经典深度学习算法,如卷积神经网络(CNNs)和长短期记忆(LSTM)网络,在高度上,是人们深思熟虑和巧妙设计的成果。甚至更简单的“浅层”机器学习算法,如不依赖神经网络或深度学习的 XGBoost,也是通过巧妙的算法设计创建的。
LLMs 展示了一个更近期的趋势。它们不是在算法上变得聪明,而是保持简单,实现一个天真的算法,该算法简单地捕捉信息片段之间的关系。在许多方面,LLMs 在算法中强制嵌入的世界观更少。从根本上说,这提供了更多的灵活性。如果你告诉我相反的方法是人们改进算法的方式,这怎么会是一个好主意?区别在于 LLMs 和类似的技术只是更大,大得多。它们在更多的数据上训练,并且有更大的能力捕捉更多句子中更多单词之间的关系;这种蛮力方法似乎在性能上超过了经典的 ML 方法。这个想法在图 1.5 中得到了说明。
图 1.5 如果算法的聪明程度取决于你编码到设计中的信息量,那么旧技术通常通过比前辈更聪明来提高性能。正如圆圈的大小所反映的,LLMs 主要选择了一种“更愚蠢”的方法,即使用更多的数据和参数,并对算法可以学习的内容施加最小的限制。
正如我们已经指出的,并不是每个指标都表明“更大”就是更好。这些模型目前部署起来是一个物流和计算上的挑战。许多现实世界的限制,包括响应时间、功耗、电池消耗和可维护性,都受到了负面影响。因此,LLMs 的“性能”只是一种狭义的定义。
然而,关于“做大”比“聪明”更有价值的教训是值得考虑的。有时,在设计机器学习解决方案时,即使你使用 LLM,最好的答案可能是“让我们去获取更多的数据。”
1.8 LLMs 在行动中:好的、坏的、和可怕的
在整本书中,我们将提供 LLMs 可能失败的一些例子,通常以滑稽或愚蠢的方式。这些例子的目的并不是说 LLMs 无法执行任务。通过改变输入、设置或随机运气,你通常可以使 LLMs 工作得更好。
这些例子的目的是向您展示 LLMs 如何失败,通常是在一些非常简单的事情上,以至于孩子都能做得更好。当你阅读这本书并亲自与 LLMs 互动时,这些例子应该让你停下来,并引导你思考,“如果我使用 ChatGPT 来完成一项艰巨的任务,但它却在简单的事情上失败了,我是不是在为自己设置失败?”答案可能经常是肯定的!安全地使用 LLMs 需要一定程度的对输出的怀疑或质疑,需要验证和验证正确性,以及相应地适应的能力。如果你使用 LLM 来完成你自己无法完成的任务,你可能会暴露自己于无法亲自验证的错误结果。随着我们在书中讨论如何更广泛地使用 LLMs,我们将不断将这一点以及如何处理它融入到对话中。
很容易想象,当 LLMs(大型语言模型)工作正常时,它们可能会以许多方式让我们的生活变得更轻松——比如回答你的所有电子邮件、总结长篇文档,以及解释新概念。然而,对于很多人来说,事情可能出错并迅速变得危险的情况并不那么自然。
有些人可能会争辩说,如果有人足够聪明,能够想出如何欺骗 LLM,他们可能从其他来源获取他们想要的任何危险信息。这可能确实如此,但与此同时,这也未能考虑到 LLM 和生成式 AI 工具中自动化的规模。没有哪种 AI 或 ML 算法是完美的,如果成千上万的人提出问题,LLM 可能会在 0.01%的时间内产生危险的反应。ChatGPT 拥有超过 1 亿用户[5],这意味着可能会有 10,000 次危险的反应。当考虑到恶意行为者可能开始自动化的情况时,这个问题变得更加严重。我们将在本书的第二部分进一步讨论这个问题。
我们期待您加入我们,共同探索大型语言模型(LLMs)的工作原理。最终,您将详细了解在您的商业或日常生活中运用 LLMs 革命性功能时需要考虑的许多事项。
摘要
-
大型语言模型(LLMs)的设计灵感来源于对人类大脑功能和对语言学习的不完整理解。这被用作设计的灵感,但这并不意味着模型具有与人类相同的或相似的能力和弱点。
-
人类语言必须转换为 LLM(大型语言模型)的内部表示,并从其内部表示转换回人类语言。这种表示的形成方式将改变 LLM 的学习内容,并影响您使用 LLM 构建解决方案的方式。
第二章:标记化器:大型语言模型如何看待世界
本章涵盖
-
从句子中创建标记
-
通过规范化控制词汇量
-
避免标记化中的风险
-
用于消除歧义的标记化策略
如第一章所述,在人工智能的世界里,找到与人类学习相关的类比来解释机器“学习”通常很有帮助。你如何阅读和理解句子是一个复杂的过程,随着年龄的增长而变化,涉及多个顺序和并发的认知过程[1]。然而,大型语言模型(LLMs)使用的处理过程比人类认知过程简单。它们使用基于神经网络的算法来捕捉大量数据中单词之间的关系,然后使用这些关于关系的信息来解释和生成句子。
我们关于这些算法如何工作的讨论将从它们的输入开始:文本句子。在本章中,我们探讨 LLM 如何处理这些句子,使其成为模型的输入。正如语言对于你的思考和信息处理至关重要一样,LLM 的输入对于影响 LLM 可以执行的概念和任务类型至关重要。
2.1 标记作为数值表示
虽然看起来很明显 LLMs 应该处理句子,但要完全理解,我们必须更加具体。当我们讨论 LLM 的工作原理时,你会看到文本句子对于驱动 LLM 的神经网络算法来说是不自然的,因为神经网络本质上使用数字来完成它们的工作。如图 2.1 所示,LLM 使用的算法必须将人类文本转换为数值表示,然后才能对其进行处理。“标记”是 LLM 用来将文本分解成可以编码为数字的片段的表示。
图 2.1 为了理解文本,LLM 必须将文本分解成标记。每个唯一的标记都与一个与之关联的数值标识符相关联。
你可以将标记视为 LLM 处理的最小文本单元——如果你愿意,可以将其视为“原子”,所有其他事物都是由它构建的最小部分。那么文本的原子是什么?考虑一下:当你阅读这本书时,你的大脑使用什么最小的构建块来处理意义?两个自然的答案就是字母和单词。将字母定义为原子很有诱惑力,因为单词是由字母组成的,但你是否真的有意识地阅读每个单词中的每个字母?对大多数人来说,答案是“不”。(如果你像本书的一位合著者一样患有阅读障碍,这个问题可能很奇怪。但认知处理是复杂的,并且尚未完全理解;请对我们使用的类比表示理解!)你关注的是更突出的单词和词根。在 fbct 中,yoy cn probbly unrestand ths sentnce ever through we diddt sue th ryght cpellng or l3ttrs。人们无意识地使用单词的部分来处理文本,而 LLM 正是基于这个原理构建的。
在本章中,你将学习将文本转换为分词的过程。首先,我们将更详细地讨论分词;然后,我们将讨论用于决定句子如何转换为分词的程序。
2.2 语言模型只看到分词
到成年时,大多数讲英语的人大约知道 30,000 个单词[2]。最初为 ChatGPT 提供动力的 LLM GPT-3 拥有 50,257 个分词的词汇量[3]。这些分词不是单词,而是称为子词的单词的一部分,这种表示介于单词和字母之间。直观地说,一个分词捕捉了语言的最小有意义的语义单元。例如,单词schoolhouse
通常会分解成两个分词,school
和house
,单词thoughtful
会分解成thought
和ful
。这对于识别常用单词和拥有子词来解释我们以前从未见过的单词是有用的。人们经常使用类似的技术,称为语义分解,来理解他们以前从未见过的单词。我们直观地将新单词分解成组成部分,根据我们已知的单词来理解其含义。
特征工程是将你的数据转换为对算法和你要解决的问题更方便的形式的过程。为了构建一个可以检测给定文本语言的算法,你可以编写代码,以文本作为输入,输出每个字符出现的百分比。例如,如果é
在一个文档中出现的频率很高,那么你就有了一个很好的特征来表明该文档更有可能是西班牙语或法语,而不是俄语或中文。良好的特征工程涉及思考你的模型是如何工作的,你想要实现什么,以及如何为模型和目标组合准备你的数据。
分词是 LLM(大型语言模型)的特征工程;它至关重要,因为分词是模型唯一与之交互的信息。分词被视为独立的、抽象的事物,它们本身并不具有内在联系。关系是通过观察数据来学习的。
回顾图 2.1,很明显,Dis
和dis
的分词是相关的,唯一的区别是其中一个以大写D
开头。然而,你可以看到模型将标识符分配给
Dis
,将标识符分配给
dis
。也就是说,模型本身并不认为代表Dis
和dis
的分词之间存在任何联系,即使我们作为人类,看到的是明显的联系。模型甚至不看到Dis
或dis
。为了使 LLM 处理分词,我们必须将这些分词转换为数字,这样模型才能看到数字和
。重要的是,模型没有直接的方式来知道这些分词是相关的。
标记是从子词到唯一数字表示的映射。反过来,标记化是将全文字符串转换为标记序列的过程。如果你之前使用过机器学习库(特别是任何自然语言处理[NLP]工具),你可能熟悉一些简单的标记化形式。例如,简单的标记化过程通过基于空格分割文本来将文本分解成标记。然而,这种方法限制了我们的能力来创建子词或处理不使用空格来分隔单词的语言,例如中文。
2.2.1 标记化过程
标记化遵循的通用过程如图 2.2 所示,包含四个关键步骤:
-
接收要处理的文本——这意味着从用户、互联网或任何其他来源获取文本输入作为
字符串
数据类型(一组字母、数字或符号)。这是你想要文本的来源。 -
转换字符串——这通常涉及以某种有用的方式更改字符串,例如将大写字符转换为小写。这也可能是出于安全原因(例如,文本来自用户,我们需要删除任何可能看起来像恶意输入的东西)或消除文本中的不相关变化,以帮助算法更好地学习。这个过程被称为规范化。
-
将字符串分解成标记——一旦有字符串可用,就需要将其分离成一系列离散的子字符串;这些是较大字符串中找到的标记。这被称为分割。
-
将每个标记映射到唯一的标识符——唯一的标识符通常是整数,它产生 LLM 可以理解的输出。
图 2.2 通常,标记化涉及处理输入以生成标记的数字标识符。
这个过程的开始和结束部分几乎没有选择或不同行为的余地。首先,你需要输入来处理;最后,你需要为每个标记存储和检索与该标记关联的信息的数字标识符。中间的两个步骤,规范化和分割,是你可以选择发生什么的地方。
标记化过程的最后一步是构建词汇表。模型的词汇表是在训练过程中看到的独特标记的总数,当我们向算法提供学习数据时。几乎总是需要大量的数据来构建包含许多独特标记的丰富词汇表。
为模型选择词汇涉及一系列权衡:词汇量越大,您的模型可以成功处理的信息就越多。考虑一个可能只有几十个单词词汇量的一岁孩子。这个孩子不会是一个非常有效的沟通者(但那没关系;他们有足够的时间去学习)。因此,更广泛的词汇量不仅有助于模型理解更多事物,而且还会使模型更大。如果您有一个词汇量太大,您可能会因为使用它所需的计算量而使模型变慢,或者模型可能会消耗过多的内存或磁盘存储,这使得将其转移到其他机器或作为软件应用的一部分变得更加困难。
您通过处理训练数据并识别标记来构建模型的词汇。每次您看到一个新的标记时,您都会根据您看到的唯一标记的数量给它一个唯一的标识符。这个过程通常就像存储一个设置为0
的计数器并在每次找到新标记时递增它一样简单。一旦这个过程完成,您就拥有了一个实际上是一个编码器的分词器。分词器可以接收文本作为输入,并返回该文本的数值编码,LLM 算法可以使用它作为其输出。
2.2.2 在分词中控制词汇量
GPT-NeoX,一个公开可用的 LLM,在磁盘上存储其词汇需要大约 10 GB。这是一大批数据,已经足够大,从数据存储和计算的角度来看,使得许多实际应用案例变得具有挑战性。它如此之大,以至于存储在 micro-SD 卡上会非常慢,使得在手机或某些游戏机上使用它成为一个重大的挑战。它足够大,以至于不能实时流式传输,必须下载并加载到处理器的 RAM 中才能进行分词。然而,词汇量必须足够大,以表示模型在训练和使用过程中将遇到的全部单词和子单词。假设模型遇到一个不在其词汇表中的单词,并且无法通过其词汇表中的子单词组合来表示。在这种情况下,模型无法捕捉到该段文本的信息。因此,权衡词汇量大小与模型需要解释广泛内容的需求至关重要。在 NLP 中,这通常被称为词汇表外问题,当我们遇到无法使用模型可用的标记表示的单词时。
词汇量是影响大型语言模型(LLM)大小的一个因素,因此讨论控制词汇量的方法和权衡至关重要。在本节中,我们将描述如何改变分词过程的行为来影响词汇量,并影响模型的能力和准确性。
图 2.3 常见的归一化过程通常涉及将文本转换为删除大写字母和标点符号。
在图 2.3 中,我们关注第二个转换步骤,归一化,它将大写字母“H”和“W”转换为小写并删除标点符号。这些常见的归一化步骤起源于经典 NLP 管道,并且在今天的一些现代深度学习方法中仍然有时会执行。它们具有立即期望的效果,即减少词汇量的大小。不再需要将“Hello”和“hello”作为两个不同的标记来表示,它们被映射到一个唯一的标记。这种映射产生了巨大的差异,因为每个以大写字母开头的句子都会潜在地重复词汇库中带有大写版本的那个词。这种归一化还可以帮助解决各种拼写错误和误拼。
例如,在撰写这本书的过程中,我们输入了“LLMs”、“LLms”和“llms”,并犯了许多其他的大小写混合错误。将每个变体中的每个字符都转换为小写,可以将所有这些错误都解决成单一、简单的形式,因此我们得到一个更小的词汇量并减少了歧义。
然而,将文本转换为小写并不总是能减少歧义。考虑“Bill”和“bill”这两个例子。在第一种情况下,首字母大写对于理解“Bill”可能是某人的名字,而“bill”更有可能是货币单位(或其他“bill”的定义)至关重要。首字母大写不仅对于理解文本的意义至关重要,而且对于理解文本中的错误也非常重要。再次考虑一下,在这本书中我们如何错误地大写“LLMs”的所有各种方式。一个高质量的 AI 算法能够识别我们犯的拼写错误并纠正它!ChatGPT 能够做到这一点,因此模型中需要使用大写字母。因此,在词汇量大小和潜在模型准确性之间有一个重要的权衡需要考虑。
在经典 NLP 以及甚至不是那么老的深度学习模型如 BERT(ChatGPT 所使用的 LLMs 的前身)中,算法识别错误并修复它们的能力在专门为此目的设计的解决方案之外极为有限。因此,许多原本用于构建鲁棒的归一化步骤的工作现在已经被 LLMs 所摒弃。更广泛的词汇量是可取的,以产生更强大的模型,这些模型可以学会理解错误。
2.2.3 详细说明分词
在分词过程中的归一化和分割步骤在很大程度上决定了词汇量的大小。在图 2.4 中,我们展示了分词的最直接策略之一。这个策略遵循一个简单的规则:每当在文本中看到空格时,将较长的字符串分割成那些标记。在“hello world”的情况下,在 Python 中调用hello world.split( )
就足够简单了。这是一个合理的做法;这是我们人类阅读句子的方式。但它也增加了一些微妙的复杂性。
图 2.4 分割过程将规范化文本分解成单词或标记,以便每个都可以独立处理。
当你的文本中有标点符号时会发生什么?如果我们使用我们的空白规则将字符串“hello, world”转换为 [hello,, world]
,我们会遇到与大小写类似的问题。我们最终会得到两个代表同一概念的独立标记:hello
和 hello,
。传统的做法通常是通过删除并开发更复杂的规则来分割字符串为标记来解决这个问题。虽然这是朝着减少词汇量正确方向迈出的一步,但手动指定标记化规则并没有解决其他问题。例如,基于规则的标记化策略对于像中文这样的不使用空格分隔单词的语言来说是一个巨大的挑战。
使用字节对编码识别子词
LLMs(大型语言模型)的一般主题是通过手动进行更少的特征工程,让算法来做繁重的工作。因此,通常使用一种名为 字节对编码(BPE)的算法来将字符串分解成标记。字节对编码是一种将单词分解成常见的子词字符序列的算法。如今,BPE 通常使用自定义的分割器,并且几乎不需要进行规范化。
注意:通过实验,我们发现许多类似 ChatGPT 的产品会移除一些不打印的 Unicode 字符(Unicode 很奇怪),但除此之外,它们基本上会以原样接受你的文本。大多数先前的语言模型确实使用了各种形式的规范化,我们认为如何更好地为 LLMs 规范化文本是一个好且开放的问题。
由于找到最有效的子词集是一个计算成本很高的任务,BPE 使用启发式方法来简化这个过程。它首先将单个字母视为标记,然后找到出现频率最高的相邻字母对,并将它们组合成子词标记。该算法重复这个过程多次,继续使用子词标记,直到达到某个阈值,词汇表“足够小”。例如,在第一次遍历中,BPE 算法检查英语中使用的单个字母的频率,并发现字母i
、“n”和“g”经常出现在一起。在第一次遍历中,BPE 可能观察到“n”和“g”一起出现的频率比i
和“n”一起出现的频率更高,因此它将生成标记 i
和 ng
。在随后的遍历中,它可能根据该字母组合的频率与ng
与其他字母或子词一起出现的频率相比,将这些标记组合成 ing
。一旦 BPE 达到其停止点,它将识别出诸如“eating”和“drinking”这样的单词作为频繁出现的组合。它还可能将ing
作为后缀捕获,以便以该子词结尾的其他单词也可以表示为标记。当算法完成时,我们最终得到捕获完整单词和其他捕获子词的标记。这个过程在图 2.5 中以高层次展示。
图 2.5 创建标记的简化字节对编码算法:首先,找到出现频率最高的字符对“ng”。接下来,将所有“ng”实例替换为占位符标记“T”,并将“ng”添加到词汇表中。重复此过程,直到没有剩余的常见字节对。
注意:运行 BPE 算法创建词汇表非常昂贵,因为它必须多次读取输入数据来计算字母的最频繁组合。虽然大型语言模型在超过 5 亿甚至 10 亿页的文本上进行了训练,但它们的标记器通常使用该数据的一个非常小的子集创建。通常,标记器使用一个比小说还要小的文本集合进行训练。
BPE 过程一开始可能看起来很奇怪,但你可以将其视为识别语料库中常见字符串的一种方式。例如,BPE 几乎总是学会将New York
表示为一个标记,这在文本中纽约州和纽约市频繁出现时很有用。将整个概念表示为一个单独的标记使得使用这类信息变得更容易。确实,大多数常见单词将变成唯一的标记,而罕见单词则希望被捕获为子词的组合。例如,loquacious
将被 GPT-4 分词为lo
、qu
和acious
。这种方法之所以成功,是因为acious
是拉丁语后缀,表示倾向/倾向性,这使得模型更容易正确处理不寻常的单词。它也是一个失败案例,因为拉丁语前缀“loqu
”被拆分为两个标记而不是一个,这使得学习变得更加困难。
在使用 BPE(字节对编码)创建词汇表之后,模型作者出于各种原因手动添加额外的标记,例如对特定知识领域重要的单词。正如我们将在下一节讨论的,在某些领域,拥有正确的标记通过捕捉细微的意义具有显著的影响。因此,作者通常会确保必要的标记被包含在内。模型作者还会添加特殊的标记,这些标记不直接表示词的部分,但为模型提供辅助信息。这类标记的一些常见例子包括“未知”标记(通常表示为 [UNK]
),当分词器无法正确处理符号时使用,以及系统标记 [SYSTM]
,用于区分模型的内置提示和用户输入的数据,以及其他类型的风格标记。接受文本和图像输入的多模态模型使用独特的标记来告知模型输入流何时在代表文本数据的字节和代表图像数据的字节之间切换。
OpenAI 在开发 ChatGPT 时决定使用 BPE 将文本编码成标记,并已将他们的分词器作为开源包tiktoken
(github.com/openai/tiktoken
)发布。尽管如此,还有其他几种自动生成标记的算法和实现,包括谷歌开发的 WordPiece 和 SentencePiece 算法[4]。这些算法各有不同的权衡。例如,WordPiece 在构建分词器词汇表时,使用不同的技术来计数候选子词的频率。SentencePiece 中实现的一种算法处理整个句子,在计算标记时保留空白字符,这可能在构建处理多种语言的模型时提高输出质量。然而,BPE 是最广泛使用的算法。例如,它现在被谷歌最近的大型语言模型(LLMs)独家使用。
无论选择哪种算法,分词器的词汇表大小都是一个关键模型参数,由负责训练和增强分词器的数据科学家或工程师确定。以下几节将深入探讨词汇表大小和其他在分词器开发过程中做出的决策。
2.2.4 分词的风险
如第一章所述,本书不会过多涉及编码。目标是让你对 LLMs(大型语言模型)的工作原理有一个合理的理解,并消除一些神秘感,以便你能够专注于 LLMs 如何应用于你的工作。分词是拼图的第一块。这是一种简单但有效的策略,用于生成 LLMs 的输入。你已经了解到词汇表的大小在模型的可部署性中起着重要作用,认识到在识别细微差别与制作词汇表相关的无必要冗余之间的权衡,了解到分词过程如何影响词汇表的大小,以及如何使用 BPE(字节对编码)自动化标记选择过程。
在分词时所做的选择会影响 LLMs 今天能做什么,并将在未来影响它们。这些选择涉及一些需要了解的大挑战。为了进一步探讨这个话题,BPE 的两个显著但细微的细节值得分享一些关注点:句子长度与标记计数之间的关系,以及 LLMs 可能被具有相同二进制编码但外观不同的字符(称为同形异义字)所混淆的潜在可能性。
句子越长并不意味着标记越多
BPE 的一个不直观的方面是,句子越长并不意味着标记越多。为了理解为什么,请看图 2.6,其中我们展示了 GPT-3 对两个不同字符串的真正分词。字符串“I’m running”比字符串“I’m runnin”多一个字符,但它少一个标记!如果你不相信,你可以在platform.openai.com/tokenizer
尝试对不同的字符串进行分词。
图 2.6 分词两个不同的句子
这种差异发生是因为 BPE(字节对编码)在寻找任何输入的最小标记集时是贪婪的。在这个特定案例中,字符串“running”在我们的训练数据中出现的频率足够高,以至于它得到了自己的标记。在“g”缺失的情况下,我们的词汇表中没有“runnin”的标记,因为这种变化可能在我们训练数据中很少出现。因此,“runnin”需要被分解成至少两个标记,给我们run
和nin
。
分词器实现的这种细微差别是软件漏洞的沃土。不同的分词器可能会对如何分词相同的字符串提供不同的答案。在设计单元测试和基础设施时,这个因素需要牢记在心,以避免在升级或转换可能导致新差异的分词器实现时迷失方向或感到困惑。它也可能影响 LLM 的评估,因为许多模型对添加的空白空间非常敏感,不一致的分词可能会无意中导致比较不是“苹果对苹果”。
同形异义字符会引起混淆
当开发者处理多种人类语言或考虑处理外部提供数据的安全性影响时,同形异义字符可能会成为一个问题。当输入来自任意用户时,有时可能是恶意的,并试图诱使你的模型表现出不良行为。对 LLM 进行的一种可能的攻击方式就是使用同形异义字符攻击。
当两个或更多字符具有不同的字节编码,但在屏幕上渲染时看起来相同,这就是同形异义字符。一个例子是大多数西欧语言中使用的拉丁字母“H”和整个东欧和中亚地区使用的西里尔字母“H”。
BPE 会将使用不同字节编码的同形异义字符编码成不同的标记。因此,同形异义字符可能会增加文本中的标记数量,改变 LLM 解析信息的方式,并增加你的计算成本。一个有趣的同形异义字符例子是 Unicode 字符 U+200B,也称为“零宽空格”。这个字符在排版中使用,占据空间,但不会打印任何内容,显示任何内容,或改变文档的渲染方式。
零宽空格是 Unicode 规范中存在许多奇怪且有趣的事物之一,可能会给你带来麻烦。因此,许多服务都采用规范化步骤来删除这些奇怪字符,并将同形异义字符替换为规范表示(即,任何看起来像a
的字符都必须编码为a
)。例如,OpenAI 当前的分词器接口会删除同形异义字符。如果你想在你的硬件或用户的设备上部署 LLM,你必须考虑同形异义字符。
2.3 分词和 LLM 能力
如果我们只关心 LLM 产生高质量类似人类文本的能力,那么你分词文本的具体细节并不像构建这些模型所使用的数据和计算那样重要。如果你在模型中投入足够的计算能力和规模,它们最终会找到有用的表示,无论这些表示的构建块是什么。但有时,分词会极大地影响 LLM 的能力。在本节中,我们将介绍一些例子。
可能是以下例子与你的工作或你希望用 LLM 做什么不直接相关;这完全没问题;这些例子的目的不是让你放弃使用 LLM。相反,目标是帮助你了解 LLM 学习的范围受所选表示的限制,并且可能没有方法绕过这些担忧而不进行大量工程工作。如果你开始用 LLM 构建应用程序并发现重大困难,考虑令牌化如何成为你目标的一个因素。如果令牌化确实是问题所在,那么你几乎无法解决这个问题,因此最好考虑其他方法,例如手动通过对你应用重要的令牌来增强词汇表。
2.3.1 LLMs 在单词游戏中表现不佳
用户经常喜欢让 LLM 解决单词谜题或执行涉及单词游戏的任务。例如,图 2.7 展示了一个单词游戏,正确答案取决于单词的确切字母序列和单词中的字母数量。
图 2.7 令牌化方法意味着 ChatGPT 实际上无法“看到”单个字符或单词长度。如果你提出需要识别子字符并独特地改变它们的问题,ChatGPT 开始失败。正确的中间字符是“a”,但 ChatGPT 坚持认为字母是“e”。ChatGPT 看到的是三个令牌,分别代表P
、ine
和apple
。
玩单词游戏可能不是你应用中关心的事情,但单词游戏失败的原因可能对你的问题非常明显。尽管许多这样的例子在科学或商业上并不重要,但它们揭示了这些模型操作中的显著故障。它们可能在更实际的应用中发挥作用,例如当模型难以写出包含押韵或谐音的诗歌时。
例如,假设你想构建一个回答用户处方药问题的应用程序。药物通常有更长、更令人困惑的名称,人们难以记住或拼错,而且由于 LLM 不理解字母,它可能会将一种药物的名称与另一种药物的长而奇怪的名称混淆。
由于药物名称不常见,即使有轻微的拼写错误,它们也会以不同的方式进行令牌化。例如,在 GPT-3 中,“Amoxicillin”和容易拼错的“Amoxicillan”没有共享任何公共令牌!这导致 LLM 响应错误的概率大大增加,风险本质上更高,因此对 LLM 应用进行彻底测试、极端小心地进行工程处理或可能完全避免变得尤为重要。
2.3.2 LLMs 在数学上面临挑战
分词对涉及形式符号推理的任务有显著影响,包括数学和玩棋类游戏。数学和棋类游戏都是由 LLM 作为符号推理问题实现的,其中单个标记具有特定的规则,这些规则控制着它们与其他标记交互和意义。例如,包含每个数字单独标记的模型在算术运算上往往比不包含这些标记的模型表现更好。这是因为数字 123456 在 GPT-3 中将成为两个标记 [, ]
,这是基于这些标记在分词器原始训练数据中的频率。这使得模型处理该数字中的单个数字变得更加困难。一些系统开发者通过在所有数字之间插入空格来规范化数字,例如 1 2 3 4 5 6,这会创建一个新的输出,包含六个标记,每个数字一个。
这种数学能力差异在图 2.8 中得到了很好的体现,该图显示了整个训练过程中的算术计算性能。顶部曲线是一个典型的 BPE 分词器,而底部曲线,显示了更好的性能,是经过修改的相同分词器,它对数字进行了数字级别的分词。
图 2.8 比较了两个大型语言模型(LLM)随时间学习进行算术计算的方式。时间显示在 x 轴上。上曲线是一个典型的 BPE 分词器,而下曲线是经过修改的相同分词器,它使用代表单个数字的标记。y 轴描述了 LLM 准确执行任务的能力,其中数字越小表示错误越少。底线是,使用数字级别分词的 LLM 可以更好地、更快地学习数学。
2.3.3 LLMs 和语言公平性
大多数 LLM 分词器可以表示 Unicode 覆盖范围内的任何符号,这包括世界上大多数字母表中的字符。然而,这些分词器在表示特定语言的文本方面的效率差异很大,尤其是在分词器通常针对不同语言的较小文本资源集合进行训练的情况下。这可能导致基于 LLM 的商业服务存在重大不公平性 [5],因为训练集中罕见的语言的单词分词默认为更细粒度的子词集合,从而导致标记使用量增加。像 OpenAI 和 Anthropic 这样的商业 LLM 提供商通常按每个标记向客户收费,通常每个输入到 LLM 并由 LLM 生成的标记的费用是几分之一美分。当考虑到高使用量的商业应用可能每天处理数千万个标记时,这些成本就会累积起来。
LLM 完成请求所需的时间和用户每 token 收取的费用直接取决于分词器。因此,使用分词器更有效地表示的语言在经济上会得到激励,而那些表示效率不高的语言则不会。以英语为基准,研究人员发现,使用 ChatGPT 和 GPT-4 回答德语或意大利语用户查询的成本大约高出 50%。与英语差异更大的语言可能会产生更大的费用:Tumbuka 和保加利亚语的成本超过两倍,而藏语、奥里亚语、桑塔尔语和掸语的处理成本是英语的 12 倍以上。
2.4 检查你的理解
-
你预计以下单词或短语会如何被分词?试着自己分解它们,然后通过实际的 LLM 分词器,如
platform.openai.com/tokenizer
进行测试:-
backstopped
-
大型语言模型
-
学校
-
你如何处理句子以理解它们是一个复杂的过程,这个过程会随着年龄的增长而变化,并涉及多个顺序和并发认知过程
-
-
你认为大写字母与小写字母在每个先前的例子中有多重要?试着用不同的格式重新提交它们。
-
让我们通过一个密码来模拟 LLM 如何思考数学,其中每个英语字母对应一个数字。例如,
,
,
,和
,因此我们会用 WAIT 来表示
。知道这个事实以及
,你能弄清楚
代表什么吗?
-
由于 token 是 LLM 运作的基本单元,为什么使用分词器表示效率较低的语言成本更高在技术上是有意义的?
-
使用大型语言模型(LLM)向说不同语言的人收取相同服务的不同费用是否是一个道德问题?你会认为这是一种歧视吗?
2.5 上下文中的分词
本章讨论的分词细节是 LLM 的基础构建块,决定了它们可以有效地表示的输入和产生的输出。分词是 LLM(如 ChatGPT)在开发有效文本表示中的关键组成部分,以便在训练过程中处理大量信息时,可以学习 token 之间的关系,解释用户输入并产生我们习惯的高质量响应。LLM 的潜力受限于或由其采用的分词策略和词汇表决定,以及我们在以下章节中探讨的所有其他特征。
摘要
-
标记化是 LLM 通过将句子转换为标记来理解文本的基本过程。
-
标记是文本中最小的信息单位,代表内容。有时,它们对应于完整的单词,但通常,它们代表单词或子单词的部分。
-
标记化(Tokenization)涉及将文本规范化成标准表示,这可能包括将字符转换为小写或转换 Unicode 字符的字节编码,以便可见的相同字符使用相同的编码。
-
标记化还涉及分割,即将文本分割成单词或子单词。例如字节对编码(BPE)这样的算法提供了一种机制,可以根据训练数据集中字母组合的统计出现频率自动学习如何有效地分割文本。
-
构建标记化器的结果被称为词汇表,这是标记化器可以用来表示其处理过的文本的唯一单词和子单词标记集合。
-
标记化器的词汇表大小会影响 LLM 准确表示数据的能力,以及理解和预测文本所需的存储和计算资源。
-
在 LLM 内部,标记(tokens)是用数字来表示的。因此,没有理解标记之间关系的能力,例如前缀和后缀之间的关系,或者两个标记共享一组相似的字母的事实。
-
为了支持特定的知识领域,自动训练的标记化器可能被增强以提供对其应用重要的标记。
-
不理解单个字母或数字的标记化器在算术运算或简单的文字游戏中会遇到问题。
第三章:种变换器:输入如何变成输出
本章涵盖
-
将标记转换为向量
-
变换器,它们的类型及其作用
-
将向量转换回标记
-
创建文本生成循环
在第二章中,我们看到了大型语言模型(LLMs)如何将文本视为称为标记的基本单元。现在,是时候讨论 LLMs 对它们看到的标记做了什么。LLMs 生成文本的过程与人类形成连贯句子的方式明显不同。当 LLM 运行时,它正在处理标记,但同时又不能像人类那样操纵标记,因为 LLM 不理解每个标记所代表的字母的结构和关系。
例如,英语使用者知道“magic”、“magical”和“magician”这些词都是相关的。我们可以理解,包含这些词的句子都与同一主题相关,因为这些词有一个共同的词根。然而,操作于代表这些词的整数标记的 LLMs,如果不能进行额外的工作来建立这些联系,就无法理解标记之间的关系。
因此,LLMs 遵循机器学习和深度学习中的长期历史,执行一种循环转换。首先,标记被转换为深度学习算法可以处理的数字形式。然后,LLM 将这种数字表示转换回新的标记。这个周期会迭代重复,这与人类的工作方式不可比。如果你的同事在每说一句话之间都要拿出计算器来解决几个数学问题,你会感到非常担忧。
然而,这个过程确实是 LLMs 生成输出的方式。在本章中,我们将分两个阶段来介绍这个过程。首先,我们将从高层次上回顾整个过程,以介绍基本概念并构建 LLMs 生成文本的心理模型。接下来,这个模型将作为深入讨论 LLMs 使用的组件的细节和设计选择的脚手架,这些组件用于捕捉单词和语言之间的关系,并最终生成我们熟悉的输出。
3.1 变换器模型
你今天遇到的许多大型语言模型(LLMs)使用一种称为变换器的软件架构来解释标记并生成输出。这种架构由一系列算法和数据结构组成,通过将信息表示为神经网络中的数字来存储信息。在核心上,变换器是序列预测算法。虽然通常描述它们为“推理”或“理解”语言,但它们实际上所做的只是预测标记。变换器提供了三种不同的标记预测方法。虽然我们专注于著名的 GPT 架构(更正式地称为仅解码器模型),但也值得介绍仅编码器和编码器-解码器模型:
-
仅编码模型—这些模型被设计用来创建可用于执行任务的认知表示——也就是说,将输入编码成对算法更有用的数值表示。最好的思考方式是,它们将文本处理成机器学习算法更容易使用的形式。它们在科学研究中被广泛使用。著名的例子包括 BERT 和 RoBERTa。
-
仅解码器模型—这些模型被设计用来生成文本。最好的思考方式是,它们接受部分撰写的文档,然后通过预测下一个标记来生成该文档的可能续篇。著名的例子包括 OpenAI 的 GPT 和 Google 的 Gemini。
-
编码-解码模型—这些模型也被设计用来生成文本。与仅解码器模型不同,它们接受整段文本并创建相应的段落,而不是继续现有的段落。由于它们训练成本更高,且使用起来有时更具挑战性,因此它们不如仅解码器模型受欢迎。对于具有明确定义的输入和输出序列的任务,编码-解码模型往往优于仅解码器模型。例如,它们在翻译和摘要任务上比仅解码器模型表现得更好。著名的例子包括 T5 和为 Google Translate 提供动力的算法。
不论使用哪种类型的 Transformer,模型的基本组件都是由三个基本层构建的,只是内部排列方式不同。一个合理的类比是汽油车引擎:它们都工作得类似,并且具有相同的一般组件。这些组件(即层)如何在引擎(即 Transformer)内部组合在一起,会引发各种性能权衡。
神经网络层究竟是什么?
大型语言模型(LLMs)是我们现在称之为 神经网络 的数百种算法之一。然而,这种说法在几个方面都是不准确的。首先,构成当前神经网络方法的内容非常广泛,以至于提到“基于神经网络的方案”并不能给读者提供太多关于具体方法的详细信息。其次,名称中的 神经 部分与神经科学或大脑的工作方式几乎没有关系。有时,可能会有一种直观的“嘿,大脑有点这样做;我们能否模仿这种行为并从中得到一些有用的东西?”这样的灵感,但对于大多数当前的方法来说并不是这样。第三,神经网络更多地描述了一种关于组装数据结构的标准协议,而不是特定的算法。想想建造一栋房子:你使用两英寸乘四英寸的木材、石膏板,以及许多关于橱柜、油漆和设计选择的选项来组装成一座家园。每座房子看起来都是独一无二的,但也很熟悉:它们都是以预期的方式组装的。“层”是神经网络中最小的组件,但你可以用不同的方式使用许多类型的层。变换器是组装成更大网络的多块组件之一。
3.1.1 变换器模型的层级
图 3.1 描述了变换器模型的基本组件:生成能够承载更多意义的标记表示的 嵌入层;基于单词关系的 变换器层;以及将变换器内部使用的数值表示转换为人类可读的单词的 输出层。
图 3.1 变换器模型的基本组件,包括嵌入层、多个变换器层和输出层
让我们详细看看这些层级:
-
嵌入层——嵌入层将原始标记作为输入,并将它们映射到能够捕捉每个标记意义的表示。例如,在第二章中,我们讨论了标记如何表示概念,但单个标记之间没有任何关系。考虑一下“狗”和“狼”这两个词。根据我们对语言的理解,我们知道这些术语是相关的,但我们需要一种方法来捕捉这种关系在神经网络中。这正是嵌入层所做的。它捕捉每个标记的信息,这些信息编码了其意义,并允许我们表达其与其他标记的概念关系。因此,我们可以捕捉到“狗”和“狼”这两个标记的表示比“红色”和“法国”这两个标记的表示更相似的想法。你可以把嵌入层看作是模型中处理页面上的单词并将它们映射到你头脑中的抽象概念表示的部分。
-
Transformer 层—在语言模型中,大部分计算都是在 Transformer 层中进行的:它们捕捉嵌入层创建的单词之间的关系,并完成大部分实际工作以获得输出。虽然 LLMs 通常只有一个嵌入层和一个输出层,但它们有许多 Transformer 层。更强大的模型有更多的 Transformer 层。
将 Transformer 层描述为模型的“思考”部分很有诱惑力。这个定义错误地暗示了 Transformer 层(或由它们构建的更大模型)可以思考,但像人类一样思考是自我反思的,并且持续时间和努力程度是变化的。你可以思考几秒钟或几个月,这取决于完成任务所需的努力。Transformer 总是以相同的努力重复相同的流程。没有自我反思,也没有改变 Transformer 层的心理状态。因此,想象一个更好的 Transformer 层的方式是一组模糊规则—模糊是因为它们不需要精确匹配(因为嵌入可能会返回类似于“狗”到“狼”的东西),规则是因为 Transformer 没有灵活性。一旦学习完成,Transformer 层将每次都做同样的事情。
-
输出层—在模型完成计算后,输出层会进行额外的转换以获得有用的结果。最常见的情况是,输出层作为嵌入层的逆过程,将计算结果从捕捉概念的嵌入空间转换回捕捉实际子词的标记空间,以构建文本输出。你可以将这部分模型视为选择实际单词来表达你已决定的答案的部分,通过选择最有可能代表构成答案的概念的单词。最后,我们通过一个反嵌入过程结束,将嵌入转换为标记。因为每个标记都与一个子词有一对一的映射,我们可以使用简单的字典或映射将标记再次转换为人类可读的文本。这个过程在图 3.2 中有详细说明。
3.2 详细探索 Transformer 架构
为了进一步理解 LLM 内部发生的事情,将我们描述的步骤重新框架化可能会有所帮助。因此,让我们在图 3.2 中这样做,它描述了七个步骤。我们将用参考标记来标记这些步骤,指出我们之前覆盖的章节,或者告诉你它是一个即将解释的新细节。本章提供的信息很多,因此我们将随着我们的进展逐步分解。
图 3.2 使用大型语言模型将输入转换为输出的过程
LLM 的七个步骤如下:
-
将文本映射到标记(第二章)。
-
将标记映射到嵌入空间(新增,子节 使用向量表示标记)。
-
为每个嵌入添加信息,以捕捉输入文本中每个标记的位置(新增,子节 添加位置信息)。
-
将数据通过一个转换层(重复
次)(新增,子节 3.2.2)。
-
应用反嵌入层以获取可能构成良好响应的标记(新增,子节 3.2.3)。
-
从可能的标记列表中采样以生成单个响应(新增,子节 采样标记以生成输出)。
-
将响应中的标记解码为实际文本(第二章)。
3.2.1 嵌入层
标记化、嵌入以及语言如何精确地被转化为模型能理解的事物有很多细微之处。最重要的细微之处是神经网络仍然不能直接处理标记。总体来说,神经网络需要可以操作的数字,而标记有一个固定的数字标识。我们不能改变标记的标识,因为标识允许我们将标记转换回人类可读的文本。我们需要一个层,将数字形式的标记转换成它们所代表的单词或子词。
使用向量表示标记
我们的转换器需要数字来工作。这里的“连续”数字意味着任何分数值都可以供我们使用:0.3,-5,3.14 等。我们还需要多个数字来表示每个标记,以捕捉意义的细微差别和标记之间的关系。如果你试图只用一个数字来表示每个单词,你将难以捕捉到单词的多种含义、同义词、反义词以及它们所建立的关系。例如,你可能希望说一个单词的反义词(对立面)可以通过将单词乘以 来实现。如图 3.3 所示,这很快就会导致关于单词关系的荒谬结论。
图 3.3 如果你只用一个数字来表示一个标记,你很快就会遇到相似/不同单词无法相互适应的问题。在这里,我们看到尝试表示简单的同义词/反义词关系,即使只有几个单词,也会变得毫无意义。
例如,假设我们有一个表示stock
的标记,我们任意决定将其转换为某个数字(例如,5.2
)。我想给相关的金融词汇,如capital
,一个类似的数字(例如,5.3
),因为它们有相似的意义。stock
的其他含义也有反义词,例如rare
。让我们假设我们使用负值来捕捉反义的概念,并给它一个值为-5.2
。但现在事情变得复杂,因为capital
的另一个反义词是debt
。但如果反义词是否定,那么debt
和rare
有相似的意义,这是不合逻辑的。图 3.3 说明了这个问题:当我们用一个数字来表示一个词时,我们无法编码它们的关系,而不暗示与其他词的奇怪关系,而且我们还没有处理过四个词!
图 3.4 在我们的标记表示中添加另一个维度,使我们能够表示更丰富的语义关系排列。在这里,我们看到两个维度如何捕捉同一词的多个含义之间的关系。
这个技巧是使用多个数字来表示每个标记,这样你可以找到更好的表示,以适应词语之间不同的关系。图 3.4 展示了使用两个数字的例子。我们可以看到像bland
这样的词几乎与rare
和well-done
等距,同时还有空间让bank
远离前面提到的所有三个词,而是靠近stock
。我们甚至还能加入一些额外的词。你使用的数字越多,在领域的术语中称为维度,你就能表示更复杂的关系。
维度诅咒
如果更多的维度能更好地捕捉细微的意义,为什么不尽可能多地使用维度来表示我们的数据呢?当处理大量维度时,会出现几个问题。一个主要的问题是 LLMs 处理许多嵌入,增加维度会增加存储和处理嵌入所需的内存和计算。此外,随着我们增加维度,语义空间的大小急剧增加,训练机器学习模型以了解语义空间中所有位置所需的数据量和时间也会呈指数增长。数学家理查德·E·贝尔曼提出了“维度诅咒”这个术语来描述这一现象,因为虽然我们希望创建一个能够捕捉细微意义的空间,但我们受到我们创建的空间的基本属性的局限。
在 LLM(大型语言模型)的术语中,用于表示标记的数字列表被称为嵌入。你可以将嵌入想象成一个浮点值数组或列表。作为简称,我们称这样的数组为向量。向量的每个位置称为一个维度。正如我们在图 3.4 中所示,使用多个维度使我们能够捕捉到人类语言中词汇之间关系的细微差别。
由于嵌入存在于多个维度中,我们通常说它们存在于一个语义空间中。在一些机器学习应用中,这被称为潜在空间,尤其是在不处理文本的情况下。语义空间是一个模糊不清的术语,在领域中并没有很好地定义,但它最常被用作表示每个标记的向量嵌入在该空间中表现良好的简称,即同义词/反义词的距离较近/较远,并且我们可以利用这些关系进行有效利用。例如,在图 3.5 中,我们展示了一个著名的案例,通过减去male
的嵌入并添加female
的嵌入,可以构建一个“使女性化”的转换。这种转换可以应用于许多不同的男性性别词汇,以找到具有相同概念的女性性别词汇。图 3.5 右下角所有“royal”词汇的共现也是故意的,因为在高维空间中可以同时维持许多不同类型的关系。
图 3.5 展示了嵌入之间的关系如何创建语义空间。意义相似的词汇彼此靠近,并且可以对多个词汇应用相同的转换以产生相似的结果——在这个例子中,是将男性词汇转换为女性词汇的转换。
令人震惊的是,我们无法保证这些语义关系会在训练过程中形成。它们只是碰巧经常形成,并且被发现非常有用。由此延伸,语义空间中的关系并非万无一失,你的数据中的偏差可能会渗透进来。例如,模型通常会确定doctor
与male
更相似,而nurse
与female
更相似,因为在构建大多数模型时通常可用的文本中,医生被描述为男性的情况更为常见,而护士被描述为女性的情况更为常见。因此,这些关系不是世界发现的真理,而是反映了进入该过程的数据。
添加位置信息
一个关键问题是标准变换器不理解序列信息。如果你给变换器一个句子,然后重新排列所有标记,它会认为所有可能的标记排列都是相同的!这个问题在图 3.6 中得到了说明。
图 3.6 没有位置信息,变换器不理解它们的输入具有特定的顺序,所有可能的标记重新组织对算法来说看起来都是相同的。这是有问题的,因为词序可以改变词的上下文,或者如果随机进行,可能会变成乱码。
因此,嵌入层生成两种不同类型的嵌入。首先,它创建一个词嵌入,以捕捉标记的意义,其次,它制作一个位置嵌入,以捕捉标记在序列中的位置。
这个想法非常简单。正如我们将每个唯一的标记映射到一个唯一的含义向量一样,我们也将每个唯一的标记位置(第一、第二、第三等等)映射到一个位置向量。因此,每个标记将得到两次嵌入——一次用于其身份,再次用于其位置。然后,这两个向量相加,创建一个代表单词及其在句子中位置的向量。这个过程在图 3.7 中概述。
注意:使用多个维度而不是绝对位置,对于变换器来说更容易学习相对位置,即使对我们人类来说可能过于冗余[1]。
图 3.7 词嵌入没有捕捉到输入标记出现的特定顺序。这种信息由位置嵌入捕捉。位置嵌入的工作方式与词嵌入相同,并且它们被相加。结果组合嵌入包含了模型需要以理解标记顺序的信息。
这些都是理解如何将标记转换为变换层所需的向量的缺失细节。这种策略可能看起来有些天真,这确实是真实的。人们已经尝试开发更复杂的方法来处理这些信息,但“让我们将一切变成向量并简单地相加”这种简单的方法出奇地有效。重要的是,它还在视频和图像中展示了成功。有一个简单且足够有效的策略来处理许多不同的问题是非常有价值的,这就是为什么这种天真方法得以流行。
3.2.2 变换层
变换层旨在将输入转换为更有用的输出。大多数先前的神经网络层,如嵌入层,都是设计用来将关于世界如何运作的非常具体的信念融入其操作中。其理念是,如果编码的信念准确反映了世界的实际运作方式,那么你的模型将使用更少的数据达到更好的解决方案。变换器采取相反的策略。它们编码了一种通用机制,如果你有足够的数据,它可以学习许多任务。
为了做到这一点,变换器使用三个主要组件:
-
查询——查询是从嵌入层来的向量,代表你正在寻找的内容。
-
关键——键向量代表与查询配对的可能答案。
-
值—每个键都有一个相应的值向量,当查询和键匹配时返回的实际值。
这个术语对应于 Python 中dict
或字典对象的行为。你通过键在字典中查找一个条目,以便然后创建一些有用的输出。不同之处在于转换器是模糊的。我们不是在查找单个键,而是在评估所有键,根据它们与查询的相似度进行加权。图 3.8 展示了如何通过一个简单的例子来工作。虽然查询和键被显示为字符串,但这些字符串是代表每个字符串将通过嵌入层映射到的向量的替代品。
图 3.8 查询、键和值在转换器内部如何工作,与 Python 字典相比的示例。当 Python 字典将查询与键匹配时,它需要一个精确匹配来找到值,否则它将返回空值。转换器总是基于查询和键之间最相似的匹配返回一些内容。
每个键都对一个查询做出贡献可能会很混乱,特别是如果查询和特定键之间有一个真正的匹配。这个问题通过一个称为注意力或注意力机制的细节来处理。
转换器内的注意力可以被认为是类似于你关注重要事物的能力。你可以忽略无关的和分散注意力的信息(即,不良的键),并主要关注重要的事情(最佳匹配的键)。这个类比进一步扩展,注意力是自适应的;什么是重要的取决于其他可用的选项。你的老板给你一周的指示会占用你的注意力,但火警响起会将你的注意力从老板转移到警报(以及可能的火灾)。
在生成下一个标记时,转换器将当前标记的查询与所有先前标记的键进行比较。查询和键的比较生成一系列值,注意力机制使用这些值来计算在决定生成下一个标记时应分配给每个潜在后续标记的权重。每个标记的值告诉模型每个先前标记认为其对概率的贡献应该是什么。然后,注意力函数计算下一个标记,如图 3.9 所示。
图 3.9 通过使用当前标记作为查询并计算与先前单词作为键的匹配来预测句子中的下一个标记。这些个别值本身不需要存在于语义空间中;注意力机制的输出产生的是词汇表中某个标记的类似物。
注意力的数学是什么?
我们不会深入探讨注意力背后的数学细节,因为这需要占用很多空间来描述,而且这些内容在其他地方已经有所介绍。我们曾在之前的书中这样做过:《深度学习内部》 [2] 的第十一章详细解释了转换器和注意力的技术细节。
对于好奇的人来说,主要方程是
(3.1)
(3.2)
查询、键和值分别由单个矩阵、
和
表示。矩阵乘法在 GPU 上实现时使注意力变得高效,因为它们可以并行执行许多乘法操作。softmax 函数通过分配许多几乎等于零的值来实现注意力类比的主要组件,这导致转换器忽略不重要的项。
norm和Feedforward的最后一步是通过跳过连接应用层归一化和线性层。如果你对这些术语不熟悉,那没关系;你不需要了解这些数学知识就能理解本书的其余部分。如果你想了解这些术语的含义,我们建议你参考《深度学习内部》 [2] 以获得技术上的深入了解。
转换器模型由数十个转换器层组成。中间的转换器层执行与图 3.9 中描述的相同机械任务,尽管它们不需要预测标记,因为最后一个转换器层是唯一需要预测实际标记的层。转换器层足够通用,结合许多中间层可以使模型学习到复杂的任务,如排序、堆叠和其他复杂的输入转换。
3.2.3 反嵌入层
LLM 的最后一个阶段是反嵌入层,它将转换器使用的数值向量表示转换为特定的输出标记,以便我们最终能够返回与该标记对应的文本。这个输出生成过程也被称为解码,因为我们解码转换器的向量表示为一段输出文本。这是使用 LLM 生成文本的关键组件。不仅解码当前标记对于产生输出至关重要,下一个标记将取决于为输出所选的每个先前标记。这个过程如图 3.10 所示,我们一次递归生成一个标记。在统计术语中,这个过程被称为自回归过程,意味着输出中的每个元素都基于其前面的输出。
图 3.10 从 LLM 生成输出涉及将文档转换为标记,然后使用模型生成输出。我们循环这个过程来消费文本并生成可读的输出。
你可能想知道这个过程是如何停止的。当我们构建标记词汇表时,我们包括一些在文本中不出现的特殊标记。其中之一是一个序列结束(EoS)标记。模型在带有自然端点的文本上训练,这些文本以 EoS 标记结束,当模型生成一个新标记时,EoS 标记是它可以生成的选项之一。如果生成了 EoS,我们知道是时候停止循环并将完整文本返回给用户了。如果您的模型陷入不良状态并且无法生成 EoS 标记,设置一个最大生成限制也是一个好主意。
样本标记以生成输出
这个过程中缺少的是我们如何将一个向量,即由 transformer 层产生的浮点数数组,转换成一个单独的标记。这个过程被称为采样,因为它使用统计方法根据 LLM 的输入及其迄今为止的输出从词汇表中选择样本标记。LLM 的采样算法评估这些样本以选择要生成的标记。有几种进行这种采样的技术,但所有技术都遵循相同的基本两步策略:
-
对于词汇表中的每个标记,计算每个标记将成为下一个选择的标记的概率。
-
根据计算出的概率随机选择一个标记。
如果你使用过 ChatGPT 或其他 LLM,你可能已经注意到它们并不总是为相同的输入提供相同的输出。解码步骤是为什么每次你问相同的问题时,你可能会得到不同答案的原因。
似乎选择标记是随机的,这似乎有些不合逻辑。然而,这是生成高质量文本的关键组成部分。考虑图 3.11 中的文本生成示例,我们试图完成句子“I love to eat.”如果模型总是选择“寿司”作为下一个标记,因为它具有最高的概率,这将是不现实的。如果有人在这种背景下总是对你说“寿司”,你会认为有什么不对劲。我们需要随机性来处理存在多个有效选择的事实,并且并非所有选项都可能发生。
图 3.11 我们通过从短语"I love to eat"开始来展示文本生成,然后显示一些可能的完成项,如烧烤和寿司,具有高概率,而汽车和数字 42 具有低概率。加权随机选择选择了单词tacos。当出现 EoS 标记时,生成循环停止。
还要注意,在图 3.11 的例子中,其他标记在给定的极小概率下将是无意义的,比如 42。再次强调,我们需要给每个标记分配一个概率,以了解哪些标记可能是或可能不是。
你如何为标记获取概率?
每个可能的下一个标记都有被选中的不同概率。大多数标记被选中的概率几乎为零。一个敏锐的读者可能会想:在知道其他标记之前,我们如何给一个标记分配一个概率?我们通过给每个标记一个分数来实现,这个分数表示该标记的嵌入与当前向量(即 transformer 的输出)的匹配程度如何。这个分数是任意的,从到
,并且为每个标记独立计算。然后,使用分数的相对差异来创建概率。例如,如果一个标记的分数是 65.2,而另一个标记的分数是-5.0,那么该标记的概率将接近 100%,而另一个标记的概率将接近 0%。如果分数是 65.2 和 65.1,那么概率将分别接近 50.5%和 49.5%。同样,分数为 0.2 和 0.1 将给出与分数 65.2 和 65.1 相同的概率,因为我们关注的是分数的相对差异来分配概率,而不是分数本身。
Transformer 有时会给出不寻常或无意义的生成。这种情况并不常见,但其他标记的概率接近零,最终会选中一个你不会预期的奇怪标记。一旦选定了意外的标记,所有后续生成的标记都将以试图使不寻常的生成有意义的方式进行。
例如,如果 LLM 产生了“我喜欢吃粉笔”,你可能会感到非常惊讶。但这并不过分不合理,因为吃粉笔是被称为异食癖的医学状况的症状。一旦选定了单词粉笔,LLM 可能会进入关于异食癖或其他医学评论的旁白——当然,如果你足够幸运,你的不寻常生成是在“罕见但合理”的领域,而不是一个完全错误的预测。
注意:许多算法可以计算用于选择生成单词的最终概率。其中之一是核采样,也称为 Top-p 采样,它涉及确定具有最高概率的标记作为潜在输出,并从该列表中选择要输出的标记。这种方法可以帮助我们避免不合理的预测。如果你能的话,你想检查你的 LLM 使用的是哪种采样算法,这样你就可以了解其产生罕见或不合理输出的风险。
3.3 创造力和主题响应之间的权衡
根据用户如何计划与 LLM 互动,生成令人惊讶或具有创造性的输出可能是所希望的。比如说你正在使用 LLM 来帮助构思新产品想法,你正在使用聊天机器人作为数字回声板来激发想法。在这种情况下,你可能会希望生成不寻常的输出,因为目标是具有创造性并想出新点子。
相反,有时创造性是完全不希望的。LLMs 的一个潜在用途是离线搜索,你可以在(相对强大的)手机上安装 LLM,即使没有互联网连接也能提问/查找信息。在这种情况下,你希望 LLM 的输出是可靠的、相关的和事实性的。不需要创造性的重新解释。
LLMs 中一个称为 温度 的特性平衡了这种权衡。温度变量(这是一个介于 0 和 1 之间的数字,通常默认值为 0.7 或 0.8)用于夸大低概率标记的概率(高温)或降低低概率标记的概率(低温)。
以一杯水中的分子作为类比。假设我们想知道哪一种分子会位于杯子的顶部(不要问我们为什么;就按这个思路来)。如果将杯子降低到绝对零度,所有分子都会静止,位于杯子顶部的分子每次都会是相同的(即,你将始终生成相同的标记)。如果你将杯子的温度升高到开始沸腾的程度,分子将会四处弹跳,使得位于杯子顶部的分子基本上是随机的(即,你得到的是一个完全随机的标记)。当你上下调整温度时,你改变了在更大随机性(因此,通常更具创造性)和仅关注最可能的下一个标记(从而保持生成内容的相关性)之间的平衡。
在实际意义上,以“我喜欢吃”为例,较高的温度会导致生成不同类型的食物,而不仅仅是披萨或寿司,还可能是更不典型或更具体的食物,如牛排 Wellington 或素食辣椒。
3.4 上下文中的 Transformer
在本章中,我们已经覆盖了很多内容。嵌入层、Transformer 层和反嵌入层是使 LLMs 运作的核心构建块。LLMs 如何编码意义和位置,然后使用堆叠的 Transformer 层来揭示文本中的结构,这些概念对于理解 LLMs 如何捕捉信息以及它们能够产生的输出质量都是至关重要的。但我们还有更多细节要探讨!我们是如何创建这些层,通过分析堆积如山的数据来生成嵌入和概率的?在第四章中,我们将继续探讨如何将数据输入到这个架构中,并通过训练过程激励 LLM 学习文本中的有意义关系。
摘要
-
虽然大型语言模型(LLMs)使用标记作为它们基本语义意义的基本单位,但在模型中它们以嵌入向量的形式进行数学表示,而不是作为字符串。这些嵌入向量可以捕捉关于邻近性、相似性、反义词以及其他语言描述属性的关系。
-
位置和词序对变换器来说不是自然发生的,它们通过表示相对位置的另一个向量来获得。模型可以通过添加位置和词嵌入向量来表示词序。
-
变换器层充当一种模糊字典,对近似匹配返回近似答案。这个过程称为注意力,并使用查询、键和值等术语,类似于 Python 字典中的键和值。
-
ChatGPT 是一个仅解码器变换器的例子,但仅编码器变换器和编码器-解码器变换器也存在。仅解码器变换器在生成文本方面表现最佳,但其他类型的变换器可能在其他任务上表现更佳。
-
LLMs 是自回归的,这意味着它们是递归工作的。在每一步中,所有先前生成的标记都被输入到模型中,以获取下一个标记。简单来说,自回归模型使用先前的事物来预测下一个事物。
-
任何变换器的输出都不是标记;相反,输出是每个标记可能性的概率。选择特定的标记被称为反嵌入或采样,并包含一些随机性。
-
随机性的强度可以控制,从而产生更真实或更不真实、更有创意或更独特、或更一致的输出。大多数 LLMs 都有一个合理的默认随机性阈值,但您可能希望根据不同的用途进行更改。
第四章:LLMs 的学习方式
本章涵盖
-
使用损失函数和梯度下降的训练算法
-
LLMs 如何模仿人类文本
-
训练如何导致大型语言模型(LLMs)产生错误
-
扩展 LLMs 的挑战
在机器学习社区中,学习和训练这两个词通常用来描述算法在观察数据并基于这些观察做出预测时所做的事情。我们虽然不情愿地使用这个术语,因为尽管它简化了这些算法操作的讨论,但我们觉得它并不理想。从根本上说,这个术语会导致对 LLMs 和人工智能的误解。这些词暗示了这些算法具有类似人类的特性;它们诱使您相信算法表现出涌现行为并且能够做到它们真正能够做到的更多事情。在根本层面上,这个术语是不正确的。计算机以任何方式都不会像人类那样学习。模型确实会根据数据和反馈进行改进,但将这一点与任何类似人类学习的东西在机制上区分开来是极其重要的。实际上,您可能不希望 AI 以人类的方式学习:我们花费了多年的时间专注于教育,但仍然会做出愚蠢的决定。
深度学习算法的训练方式远比人类学习的方式公式化。在字面上,它意味着使用大量的数学,以及在象征意义上,遵循一个简单的重复程序数十亿次直到完成。我们将省略数学部分,但在本章中,我们将帮助您揭开 LLMs 是如何训练的神秘面纱。
许多机器学习算法使用名为梯度下降的训练算法。这个算法的名称暗示了一些细节,我们将通过一个高级概述来回顾梯度下降在机器学习中的应用。一旦您理解了用于训练许多不同模型类型的一般方法,我们将探讨梯度下降如何应用于 LLMs 以创建一个能够产生令人信服的文本输出的模型。
理解这些细节将帮助您避免由像学习这样的词所隐含的不准确含义。更重要的是,它还将为您在 LLMs 在其当前设计和这些算法常常微妙地产生误导性输出的方式中成功和失败时提供更好的理解准备。
4.1 梯度下降
梯度下降是所有现代深度学习算法的关键。当行业从业者提到梯度下降时,他们隐含地指的是训练过程中的两个关键要素。第一个被称为损失函数,第二个是计算梯度,这些是告诉您如何调整神经网络参数以使损失函数以特定方式产生结果的测量值。您可以将这些视为两个高级组件:
-
损失函数——您需要一个单一的数值分数来计算您的算法工作得有多差。
-
梯度下降——你需要一个机械过程来调整算法内部的数值,以使损失函数的得分尽可能小。
损失函数和梯度下降是用于生成机器学习模型的训练算法的组成部分。今天正在使用许多不同的训练算法,但通常,每个算法将输入发送到模型中,观察模型的输出,并调整模型以提高其性能。训练算法将重复这个过程无数次。给定足够的数据,当面对之前未见过的输入时,模型将反复可靠地产生预期的输出。
4.1.1 什么是损失函数?
我们将使用想要赚钱的例子来帮助您形成一个合适的损失函数的心理图像。确实,一个聪明的人可以赚钱,所以如果你有一个聪明的计算机,它应该能够帮助你赚钱。为了选择这个或其他任何任务的合适损失函数(这些课程可以推广到任何超出 LLMs 的 ML 问题),我们需要满足三个标准:特异性、可计算性和平滑性。换句话说,损失函数需要是
-
具体且与模型期望的行为相关
-
在合理的时间和资源量内可计算
-
平滑,即在给相似输入时,函数的输出不会剧烈波动
我们将使用以下示例和反例来帮助您对每个属性形成直观理解。
损失函数的特异性
首先,让我们从一个特异性的坏例子开始。如果你的老板来找你说,“建造一个智能计算机”,那将是一个宏伟的目标,但它不是一个具体的目标。记住,在第一章中,我们讨论了定义智能的难度。你的老板到底希望这台计算机在哪些方面表现出智能?一个只能通过智力测试但不能做你的微积分作业的街头智能计算机就足够了吗?相反,你可以尝试优化一个特定的智商分数,但这与你的老板想要的东西相关吗?我们已经在十多年前让计算机通过智商测试了,甚至在 LLMs 引入之前。然而,它们除了通过智商测试和执行有限的任务外,什么也不能做。最终,智商测试与我们希望计算机做的事情不相关。因此,将智商作为机器学习成功或构建老板要求你创建的智能计算机的度量标准是没有意义的。
另一个例子涉及管理金钱的挑战。考虑这样一个场景,你希望最小化你承担的债务。甚至可能希望你的债务变成负数,这意味着别人欠你钱!我们在这里使用债务的例子,因为它本质上是一个你希望变小的价值。这个类比与实际中使用的术语完美吻合:你希望最小化你的损失,就像你希望减少你的债务一样。债务的量也是一个客观的衡量标准,这使得它成为确保我们的损失函数在变化条件下相关性的好方法。最后,如果我们的总体目标是保持资金的盈余,那么最小化债务与这个目标很好地相关。最小化债务具有良好损失函数的所有特征!
关于术语的说明
你也可能听到损失函数被描述为目标函数。我们建议作为新手避免使用这个术语,因为它是不明确的。例如,不清楚你是想最小化(债务)还是最大化你的目标(利润)。两种方法在技术上都是可行的;将一个最大化目标乘以,你现在就有一个最小化目标了。
你也可能在一些上下文中听到奖励函数这个术语,比如强化学习(RL)。这是合适的,因为强化学习算法通过执行期望的行为来最大化奖励。
不论术语如何,目标函数、奖励函数和损失函数都满足相同的基本要求:它们提供了一种评估机器学习模型产生的输出的方法。
损失函数的可计算性
损失函数还必须是我们可以用计算机快速计算的东西。债务的例子在这个方面不合适,因为所有你需要输入和输出的信息并不容易为计算机所获取。更加努力地工作能增加你的收入并因此减少你的债务吗?也许可以,但我们如何将你的努力工作编码到计算机中呢?在这里,我们面临的问题是最关键的减少债务的因素难以量化,比如工作的可获得性、你对这类工作的适合度、晋升的可能性等。因此,损失是特定的,但连接到该损失的输入是不可计算的。
一个更好、更可计算的目标是预测投资的损失。这个目标之所以更好,原因微妙。目标仍然是客观的,因为我们的算法是从历史数据中学习的。例如,对债券 X 和股票 Y 的历史投资产生了特定的回报。输入现在也是客观的:你可以量化你投入每个投资的现金量。你要么投入了资金,要么取出了资金。没有像“努力工作”这样的难以编码的问题需要处理。有了历史数据的副本,计算机可以快速计算投资的损失/回报。
损失函数平滑性
我们需要的第三点是平滑性。许多人通过思考平滑与凹凸不平的纹理来对平滑性有很好的直觉。我们不是在谈论纹理,而是在谈论函数的平滑性,这可以通过绘制该函数的图形来表示。例如,当试图预测投资的损失时,我们会遇到投资回报通常不平滑的问题。它们可能遵循波动模式,其中价格图形是锯齿状的,有尖锐的、突然的变化。这使得学习变得困难。图 4.1 显示了现实世界投资回报的不稳定值。
图 4.1 投资回报难以预测,部分原因是因为它们并不平滑。(图片修改自[2],根据 Creative Commons 许可)
投资回报是一个糟糕(非平滑)损失的绝佳例子,因为这种不规则的行为对任何预测方法都是问题。你最好总是对任何声称能够很好地预测这种非平滑数据的人或方法保持警惕。然而,平滑有一个精确的技术定义,如果损失函数不满足这个定义,那么它就是一个难以打破的障碍。依赖于不连续性,或其值的一致性中断的函数是最常见的非技术平滑函数,但我们希望在实践中能够使用它们。图 4.2 中展示了非平滑函数的例子,以帮助您理解。平滑性通常由于不连续性而受到抑制,如中心图形所示,或者函数值的明显变化,如右侧图形所示。
图 4.2 左侧是一个平滑函数的例子,右侧是两个非平滑函数的例子。中间的例子大部分是平滑的,但有一个区域不平滑,因为该函数没有值。在右侧,由于值的变化过于剧烈,函数在任何地方都不平滑。
我们不会深入探讨描述什么使得某物平滑以及平滑函数中哪些值的变化是可接受的或不可接受的正式数学定义。尽管如此,我们已经提供了足够的背景知识,以便你了解你需要知道的内容。你需要理解的重要一点是,你对平滑的理解,即值的变化是连续的,是衡量损失函数可行性的良好指标。这看起来可能很随意,但它是一个普遍存在的问题。比如说,你想要构建一个模型来准确预测癌症。准确性不是一个平滑函数,因为你在总数中计算成功的预测次数。例如,如果你有 50 个病人,预测了 48 个正确,一个平滑函数会有 48.2 个案例、47.921351 个案例或任何你可能想到的数字。然而,癌症的实际病例数被限制在整数 1、2、3、、48、49、50,因为没有所谓的部分病例。
你如何处理非平滑损失?
准确性可能是最常见的预测目标之一,但在训练算法时我们却不能使用它。但这却是真的!那么我们如何处理这种奇怪的现象呢?答案是创建一个代理问题。代理问题是一种以与我们想要解决的问题相关联的方式表示问题的替代方法,但它的行为更好。在这种情况下,我们使用交叉熵损失函数而不是准确性。虽然我们不会在这里详细介绍交叉熵损失,但其使用证明了代理问题是机器学习和人工智能中使用的根本技巧。
这次讨论引导我们了解到关于 LLMs 学习的一个关键要点,这一点适用于大多数算法:我们用来训练它们的技巧并不总是专注于我们希望它们做什么,而是专注于我们能教会它们什么。这种关注可能导致激励不匹配,导致意外结果或低性能。在检查第二个主要训练组件:梯度下降之后,我们将讨论 LLMs 的损失函数的本质如何造成这种激励不匹配。
4.1.2 什么是梯度下降?
拥有一个损失函数是执行梯度下降的先决条件。损失函数会客观地告诉你你在执行任务时表现有多糟糕。梯度下降是我们用来找出如何调整神经网络参数以减少损失的过程。这是通过使用损失函数比较输入训练数据和神经网络的实际与预期输出来完成的。在这种情况下,梯度是你需要改变神经网络参数的方向和数量,以减少损失函数测量的错误量。梯度下降告诉我们如何“稍微调整”神经网络的全部参数,以改善其性能并减少预期输出和实际输出之间的差异。这个过程的一个图示显示在图 4.3 中。
如图 4.3 所示,每次应用梯度下降时,我们都会创建一个新的、略微不同的网络。因为变化很小,这个过程必须执行数十亿次。这样,所有的小变化加在一起,在整体网络中产生了一个更显著、更有意义的改变。
如图 4.3 所示,每次应用梯度下降时,我们都会创建一个新的、略微不同的网络。因为变化很小,这个过程必须执行数十亿次。这样,所有的小变化加在一起,在整体网络中产生了一个更显著、更有意义的改变。
注意:现代大型语言模型(LLM)执行数十亿次的参数更新,因为它们是在数十亿个标记上训练的。你拥有的数据越多,你运行梯度下降的次数就越多。你拥有的数据越少,你就不需要那么频繁地运行它。用于训练 LLM 的数据比你在一生中能读到的还要多。
梯度下降是一个反复应用而不偏离的数学过程。没有保证它一定会工作,或者找到最佳或甚至一个好的解决方案。尽管如此,许多研究人员对这种相对简单的方法的实用性感到惊讶。
为了帮助你理解梯度下降是如何工作的,我们将使用一个简单的例子,即让球从山上滚下来。球的位置代表神经网络中一个节点的参数值,训练算法可以改变它。山的高度是损失量,描述了模型对于训练输入表现有多糟糕。我们希望球滚下山谷,因为那里是损失最低的区域,这表明模型表现最佳。这个过程的一个例子显示在图 4.4 中。
图 4.4 这展示了将梯度下降应用于单个参数问题的全局大图。曲线说明了给定参数值的损失函数值。球体的位置显示了当前参数值的损失。目标是找到对应于全局最小值的参数值,这代表着具有最小损失的理想解决方案。
如您所见,球体可能落入许多山谷。行业术语可能会称这个问题为非凸性,因为多条路径导致损失减少,但每条路径并不一定指向最佳可能的解决方案。还重要的是要注意,这并不是一个类比。梯度下降实际上就是这样看待世界的。这些例子展示了梯度下降如何为一个具有一个优化参数的模型工作。在训练一个大型语言模型时,相同的程序应用于数十亿个参数。
因此,从这个位置出发,我们贪婪地寻找球体下山移动的方向。我们在图 4.5 中应用了两次梯度下降。这表明贪婪的选择是向左移动。当我们通过调整参数向左移动时,球体略微沿着斜坡向下移动。从图中可以看出,通过向右搜索,存在更好的解决方案,但由于算法的简单性,梯度下降不太可能找到它。在这种情况下找到最优结果需要更智能的策略,涉及搜索和探索,这在实践中成本太高。
图 4.5 梯度下降算法通过调整参数的步骤来寻找最小损失的最优结果。不幸的是,算法陷入了局部最小值,这是图中一个非最优区域,因为其他参数值对应于损失更低的区域。
此外,请注意,在图 4.5 的第二步中,球体卡住了。虽然很明显继续向左移动将实现更低的损失,但这种结果之所以明显,仅仅是因为我们可以看到整个画面。梯度下降无法看到整个画面,甚至无法看到附近的情况。它只知道由于当前参数和损失函数的精确位置。因此,它是一个贪婪过程。像梯度下降这样的贪婪过程是简化的方法,具有可计算性的期望属性,即它们运行多次以实现结果并不昂贵。贪婪过程是短视的,因为它们只根据当前状态选择下一步的最优步骤,尽管可能存在更广泛、更优的解决方案。它们这样做是因为评估当前和所有可能的未来状态是不可能的,因为需要考虑的潜在结果数量太多。这将是计算上的负担。希望使用有限的信息做出许多简单的最优决策通常会带来最积极的结果——在这种情况下,最小化损失函数的值。
梯度下降中的重要细微差别
在这次关于梯度下降的讨论中,我们跳过了一些在现实应用中需要考虑的重要细微差别。首先,正如这里所描述的,梯度下降需要同时使用所有训练数据,这在计算上是不可行的。因此,我们使用一种称为随机梯度下降(SGD)的程序。SGD 与我们描述的完全相同,只是它使用的是训练数据的一个小随机子集,而不是整个数据集。这大大减少了训练模型所需的内存,从而实现了更快、更好的解决方案。这种方法之所以有效,是因为梯度下降只对当前贪婪方向进行小的调整。结果是,一点数据在确定下一步走哪里的过程中几乎和使用所有数据一样好。如果你有十亿个标记,你可以在大约与使用所有数据进行一次标准梯度下降步骤相同的时间内进行十亿次 SGD 步骤。
许多训练方法使用一种称为自适应动量估计(Adam)的特定形式的 SGD。Adam 包括一些额外的技巧,以帮助更快地最小化损失函数并避免陷入困境。Adam 的主要技巧是给球体一些动量,这种动量随着更新不断朝一个方向移动而增加。这种动量使得球体更快地滚下山坡,这意味着如果遇到一个小局部最小值,可能会有足够的动量冲过那个点并继续前进,从而到达损失函数图上损失最小的区域。
Adam 的缺点是,与普通的 SGD 相比,存储每个参数的动量信息将训练所需的内存增加三倍。内存是构建 LLM 时最关键的因素,因为它通常决定了你需要多少个 GPU,这最终会转化为你的现金支出。尽管 Adam 不会使最终模型变大,因为一旦训练完成,你可以丢弃与 Adam 额外动量计算相关的数据,但你仍然需要一个足够大的系统来首先进行训练。Adam 能够更有效地最小化损失所带来的提高准确性是有明显代价的。
4.2 LLM 学习模仿人类文本
现在我们已经了解了深度学习算法是如何通过指定与梯度下降一起使用的损失函数来训练的,我们可以讨论这是如何应用于 LLM 的。具体来说,我们将重点关注用于训练 LLM 的数据和损失或奖励函数。
LLM 通常是在人类撰写的文本上训练的。具体来说,它们被明确训练来模仿人类产生的文本。虽然这听起来有点明显(他们还能被训练做什么呢?),但这个细节通常被忽视或与其他事物混淆,即使在领域内的专家也是如此。特别是,语言模型不是被训练来做以下任何一件事:
-
记忆文本
-
生成新想法
-
构建世界的表征
-
生成事实准确性的文本
在我们深入探讨之前,有必要进一步解释这个概念。当一个人训练一个模型来下棋时,模型学会下得好是因为它因为获胜而得到奖励。相比之下,语言模型只因为产生文本而得到奖励,
看起来与训练数据完全相同。因此,由 LLM 生成的所有看起来像训练语料库中文本的内容都会产生高奖励(或低损失),即使这些生成的内容并不真实或准确。这是损失函数与设计者更高层次目标之间不一致的一个例子,如第 4.1 节所述。
LLMs 是在从互联网上抓取的数百 GB 文本数据集上训练的。互联网以其包含大量错误(且奇怪)的信息而闻名。在大多数任务上表现更好的 LLM 往往在训练数据中通常被错误表示的任务上表现更差(参见github.com/inverse-scaling/prize
上的逆尺度奖)。例如,研究人员一直发现,更好的语言模型也擅长复制错误的知识[3],模仿刻板印象和社会偏见[4]。它们往往陷入一个自我强化的错误循环。例如,在生成包含错误的代码后,它们更有可能生成包含更多错误的代码[5]。这些事情在训练文本中很常见,因此 LLM 在预测它们时即使错误也会得到正面的奖励。因此,基于其损失函数的 LLM 的改进也意味着在这些需要真实性和正确性的任务上表现更差。
4.2.1 LLM 奖励函数
在之前,我们说 LLM 因为产生看起来像其训练数据的数据而受到奖励。在本小节中,我们将更具体地探讨这意味着什么。
LLMs 通过展示句子的一两个标记并让它预测下一个标记来训练。损失是基于该预测与训练数据准确性的比较。例如,可能会展示“这是”,并期望产生“test。”如果模型产生“test”,则获得一分,如果不产生,则失去一分。这个过程对文本的所有起始段都进行,如图 4.6 所示。在这里,它被训练独立预测每个突出显示的单词。这种设置并不特指 LLM。它已经被用来训练许多年的循环神经网络(RNN)。然而,LLM 之所以如此受欢迎的一个基本原因是它们可以比 RNN 更有效地训练。RNN 必须按顺序在每个生成上进行训练,因为每个新生成的词都依赖于先前选择的词。由于第三章中讨论的转换器架构,LLM 可以并行训练所有生成。在并行训练相关生成的能力代表了一个巨大的加速,允许大规模训练,并且是使用 TB 级数据构建今天最先进的 LLM 的先决条件。
图 4.6 一个 LLM 看到这个句子九次,每次都从九个序列中每个序列末尾的单个词的预测中学习。
我们讨论了预测下一个标记可能存在的问题,因为算法可能被激励产生不正确或事实错误的结果。我们还必须讨论为什么尽管如此,这种方法仍然可以产生如此令人信服的输出背后的直觉。合理地提出问题:一个被训练来创建下一个最可能标记的算法似乎是如何执行我们可以误认为是推理的事情的?
为了培养这种直觉,想象一下你如何尝试预测给定句子的下一个标记。计算机没有快速响应的压力,所以请慢慢来。考虑句子“我喜欢吃<空白>”,并尝试猜测可能填入<空白>的单词。句子的早期部分为你提供了有价值的上下文。由于我们正在讨论吃,你可以几乎立即将范围缩小到食品项目。对于计算机来说,保持所有可能的食品项目的列表并不困难。
现在如果你考虑这本书作者的背景,你将拥有更多的上下文。我们是美国人,在共同的地理区域内,这使得特定的烹饪方式比其他方式更有可能。大型语言模型不会有这种背景,但如果句子更长并且有更多的上下文,你可以以图 4.7 中所示的方式开始缩小选择范围。
图 4.7 上下文可以帮助你做出关于下一个单词的合理预测。当你从左到右移动时,句子中可能出现的额外文本被添加。每个句子思维气泡中的图像显示了添加的上下文如何消除预测。
当你在前面的文本中识别出关键词或短语时,你可以了解预测下一个单词的最佳选择。进行这些计算的计算机比人类需要的处理要多得多。这种蛮力关联主要将范围缩小到非常合理的事物。再次强调,该模型将被更新数十亿次以细化这些关联,从而获得与我们算法理解并响应人类文本的目标相关的有用能力。
然而,相关性不等于因果关系,下一个单词预测策略可能导致幽默的错误。大型语言模型容易受到“循环论证”错误的困扰,其中问题的前提暗示了某些不真实的东西。由于大型语言模型没有针对准确度或矛盾进行训练,它试图产生一系列类似人类的文本预测,这些预测可能跟随你的误导性问题。ChatGPT 在处理这类问题时的一个例子如图 4.8 所示,我们询问干意面的异常强度。
图 4.8 虽然预测下一个标记很强大,但它并没有赋予网络推理或逻辑能力。如果我们向 ChatGPT 提出一些荒谬且不真实的问题,它会愉快地解释它是如何发生的。
意大利面能够支撑自身重量数百倍的核心原因既荒谬又不符合事实。然而,通过将问题格式化为:“为什么 X 如此坚固?”来提供有关材料抗拉强度的答案,该算法已经被预设。模型可以提取这个关键上下文。之前的训练数据可能基于事实问题解释了这样的材料属性,这使模型预测出类似的回答是合适的。句子的主语(意大利面)和宾语(10 磅重物)被用来告知回答的细微细节,否则这些细节是通用的。
4.3 大型语言模型和新型任务
自回归、下一词预测策略的本质及其在训练过程中的作为损失或奖励的使用,为我们提供了关于大型语言模型生成响应的本质以及它们可能如何具有潜在事实不准确性的宝贵见解。然而,这也表明了为什么 LLM 在查找信息方面可以非常有效,它比标准搜索引擎的搜索关键词要强大得多。有方法可以设计出绕过非事实性回答的限制。例如,许多 LLM 方法在生成的输出中添加引用,以便可以快速验证用于生成文本的事实性内容。LLM 还可以作为一个有价值的回声板,一个伪合作伙伴,可以从中获得灵感和创造力。关键的是,这也帮助你理解一个关键案例,你应该避免使用 LLM,因为它们更有可能产生错误——新颖的问题和任务。
LLM 通常不擅长执行新型任务。确定你的任务是否新颖可能相当具有挑战性,因为互联网很奇怪。互联网上有大量随机的事物,包括关于如何编程绘制鸭子和独角兽的竞赛[6]。如果任务与之前看到的任务足够相似,或者与训练数据中的其他事物在结构上相似,你可能会得到一些看似合理的结果。这种结果可能非常有用,但随着你的任务与训练数据中存在的任务相比变得更加独特,它可能会退化。
例如,我们要求 ChatGPT 编写代码来计算数学常数(π)的 Python 实现。这个任务并不新颖;网上有大量类似的代码,ChatGPT 忠实地为我们返回了正确的代码。
列表 4.1 ChatGPT 在 Python 中计算π
def calculate_pi(terms):
pi = 0
for i in range(terms):
term = ((-1) ** i) / (2 * i + 1)
pi += term
pi *= 4
return pi
print(calculate_pi(1000000)) #1
1 测试函数;项数越多,近似值越准确
现在,让我们强迫 ChatGPT 进行一些并不太具挑战性的推断。我们要求 ChatGPT 将此函数翻译成编程语言 Modula-3。这个任务并不是太大的推断;Modula-3 是一种具有相似风格的编程语言,它是一种历史上具有重要意义的编程语言,影响了今天几乎所有最流行语言的设计。然而,它过于晦涩。你今天几乎找不到这种编程语言的例子,主要是在大学编译器课程中。下一个列表显示了 Chat-GPT 的合理尝试。正如你可能从本章迄今为止的上下文中预测的那样,ChatGPT 出现了一些错误,已在列表中标记。
列表 4.2 ChatGPT 在 Modula-3 中计算 pi
MODULE CalculatePi; #1
IMPORT IO, Real;
PROCEDURE CalculatePi(terms: INTEGER): REAL;
VAR
pi: REAL := 0.0;
i: INTEGER;
BEGIN
FOR i := 0 TO terms - 1 DO
pi := pi + ((-1.0) ** FLOAT(i)) / (2.0 * FLOAT(i) + 1.0); #2
END;
RETURN 4.0 * pi;
END CalculatePi;
BEGIN
IO.PutReal(CalculatePi(1000000), 0, 15); #3
END CalculatePi.
1 缺少导出语句 Main;
2 **不是一个操作符。
3 PutReal 只能接受一个可选的第二个参数,并且它不是整数。
这个简短的程序有三个错误,会阻止它正常运行。更有趣的是,ChatGPT 出现了这些错误,因为它自信地从其他语言中推断出标准的编码实践。(在这种情况下,“自信”意味着 ChatGPT 没有警告我们其潜在的错误。其中一位作者喜欢说,ChatGPT 声音听起来像他们最自信且经常出错的朋友。)在这种情况下,**
是一个常用的指数函数,因此 ChatGPT 认为 Modula-3 支持这种操作。据我们所知,从互联网上搜索来看,Modula-3 没有记录如何指数化变量的示例。因为大多数编程语言都支持使用 ^
、**
或 pow()
选项来执行此操作,Chat-GPT 就推断出存在这样一个操作。正确的答案应该是它必须首先实现一个 pow
函数,然后使用它来计算 pi。
传递给 PutReal
函数的参数是另一个谜团。我们最好的猜测是 15
对应于输出浮点值 15 位数字的推断,这是计算 pi 时典型的默认值。无论如何,这并不是该函数的工作方式。
更重要的是,ChatGPT 对一些细微的细节处理得正确,但仅限于那些可以在互联网上找到并且已经解释的部分(例如,需要 FLOAT(i)
,以及使用 4.0 * pi
而不是 4 * pi
)。没有在互联网上找到示例的任务是 ChatGPT 出现错误的地方。
这个例子也突出了 LLM 中感知到的“推理”与实际实现的“推理”之间的局限性。Modula-3 的完整语言规范可在网上找到,并记录了所有这些细节或其不存在性。ChatGPT 几乎肯定看到了许多其他编码语言规范、解析器规范以及通用编程语言的数百万行代码。如果一个人有这种背景知识和资源,进行避免所有三个错误的逻辑归纳应该不会太困难。然而,LLM 没有进行任何归纳过程,因此尽管有大量可用信息,它仍然会犯错误。
这并不是说结果不令人印象深刻,它可以是一个加速你自己的代码开发或使用不熟悉的 API 和语言的宝贵工具。但它也告诉你,这样的工具在广泛使用和有文档记录的语言和 API 上会工作得更好,尤其是如果它们符合预期的标准。例如,大多数数据库使用 SQL 语言,这使得对使用 SQL 的数据库进行准确的外推更有可能。
4.3.1 未识别正确的任务
另一个 LLM 失败的情况是,当它们不能正确识别它们应该执行的任务时,反而会回答与用户意图不同的问题。未能正确识别任务曾经是像原始 GPT-3 这样的模型的一个重大问题,但后续工作旨在增加训练数据中任务结构化示例的数量,大大提高了后续 ChatGPT 模型遵循指令的能力。然而,ChatGPT 在某些情况下仍然无法正确识别任务。例如,通过询问与常见任务微妙不同的不寻常任务,或者以不熟悉的方式修改它已经多次遇到的问题,可以可靠地引发这种行为。
一个例子是关于将卷心菜、山羊和狼用船运过河的著名逻辑谜题。这个谜题规定,山羊不能单独和卷心菜在一起(因为山羊会吃掉它),也不能和狼在一起(狼会吞噬山羊)。ChatGPT 可以迅速解决这个谜题,但如果我们稍微改变谜题的逻辑结构,模型会继续使用如图 4.9 所示的旧推理。
虽然通常很难将 LLM 的错误追溯到具体原因,但在这种情况下,模型高兴地告诉我们“确保没有任何物品(卷心菜、山羊、狼)被无人看管地放在一起。”虽然这个指示在卷心菜/山羊/狼问题的原始版本中是正确的(并且可能基于逻辑问题的约束条件),但模型没有意识到给定版本中山羊和狼单独在一起没有问题。不仅没有必要像建议的那样交换动物,而且 ChatGPT 的建议将失败,因为它将狼和卷心菜放在一起,这是我们明确禁止的。
这种现象的另一个有趣例子发生在你不需要留下任何东西的时候。任何对谜题的逻辑理解都清楚表明,你只需要把所有东西都装上船并过河。然而,模型又太习惯于回答它之前多次见过的那个问题版本,并这样做。
图 4.9 ChatGPT 由于 LLM 的训练方式,未能解决经典逻辑谜题的两个修改版本。内容频繁以相同的一般形式出现(例如,著名的逻辑谜题)会导致模型重复输出常见的答案。即使内容在重要方面被修改,这在人类看来是明显的,这种情况也可能发生。
要理解为什么会发生这种情况,重要的是要回忆起第三章中讨论的 LLM 训练的自动回归性质。模型被明确激励根据先前内容生成内容。为解决重新构架的逻辑谜题而生成的内容在单词和顺序方面几乎与解决原始逻辑谜题的内容完全相同。因此,在 transformer 层的查询和键配对中,它是一个好的模糊匹配,产生了构成原始谜题解决方案的值。模糊匹配被做出,并且通过 transformer 使用的注意力机制忠实地返回了之前的解决方案。虽然这种策略对于模型正确预测著名谜题的标记是出色的,但它并不涉及通过谜题的逻辑进行推理。
4.3.2 LLMs cannot plan
LLM 自回归性质的另一个微妙限制是,它们只能处理它们在上下文中看到的信息。LLM 被训练去接受输入并产生一个合理的后续内容。然而,它们无法规划、做出承诺或跟踪内部状态。一个很好的例子是当你尝试用 ChatGPT 玩 20 个问题游戏时。当人类玩 20 个问题游戏时,他们会预先承诺一个隐藏的信息,即他们选择用来识别的对象。当 ChatGPT 玩这个游戏时,它会逐个回答问题,然后事后找到一个与提供的答案一致的输出。这个例子在图 4.10 中得到了说明,该图显示了玩 20 个问题的可能对话树。当有人用 LLM 玩游戏时,会随机选择这些对话树中的一个,而不是在整个游戏过程中保持一个一致的目标对象。
图 4.10 游戏开始时,对话代理并未承诺特定的对象。
4.4 如果 LLM 无法很好地进行外推,我能使用它们吗?
需要完成的大部分工作都不是新颖的或新的。至少,它不是新颖或新的到足以让 LLM 失败的程度。然而,理解 LLM 的能力随着所需逻辑或细微差别的增加而迅速下降,这可以帮助你缩小使用 LLM 的范围。
当我们设计生产级的计算机系统时,需要考虑的一个关键因素是工具何时以及如何被使用的范围。当你将 ChatGPT 这样的 LLM 产品提供给没有特定范围的普通大众时,人们会要求它做各种你意想不到的随机、疯狂的事情。虽然这可能对研究很有帮助,但通常对于生产应用来说并不实用。尽管你的用户和客户会试图用你的 LLM 应用做不可预测的事情,但如果你限制谁可以访问系统,并围绕用户具有特定目标、有限用例或甚至限制他们的输入如何到达你的 LLM 进行设计,那么你可以构建一个具有更可靠用户体验的东西。
我该如何在没有用户输入的情况下使用 LLM?
LLM 在提供低努力程度的编码或数据处理方面非常出色,尤其是在你处理的数据格式或整理得不是那么干净时。然而,通过给用户提供一个有限的选择集,你可以以更小的风险获得效用。让用户从一组有限的提示中选择,或者让用户决定提示运行的数据源(例如,某个内部数据库)可以让(大多数)人避免给 LLM 提供任意文本。
相反,你可能想知道:“我们能否检测到新颖的请求,并给用户一些错误信息?”从理论上讲,你可以尝试这样做。首先,我们不建议这样做,因为这从用户体验的角度来看并不好。其次,它变成了一项被称为新颖性检测或异常检测的任务。这个问题具有挑战性,并且可能无法以保证无错误的方式解决。因此,我们鼓励预防而不是检测,通过选择不需要通过分析大型语言模型的输入或输出进行高度精确预测失败用例。
提示应用
提示艺术是构建一个对大型语言模型输入的艺术,它能诱导出期望的行为。语言模型对输入的精确框架非常敏感,因此设计出能够得到适当响应的输入的能力非常有价值。在使用大型语言模型时,一个反复出现的主题是人们通常不会考虑如何正确地与他们互动。提示大型语言模型的最佳方式是思考你感兴趣的输出在训练数据中会是什么样子,然后写下它的前四分之一。相反,人们经常描述他们希望语言模型执行的任务,假设这种澄清将使大型语言模型专注于问题。不幸的是,这种方法产生了不一致的结果,并激发了通过向它们提供大量指令和响应作为训练数据来调整大型语言模型的研究。
4.5 更大的是更好吗?
2019 年,理查德·萨顿提出了“苦涩教训”这个术语,来描述他与机器学习的经历。“从 70 年的 AI 研究中可以得出的最大教训是,利用计算的一般方法最终是最有效的,并且差距很大” [7]。
有一种真正的感受,即变换器是这一原则的终极例子。你可以不断地使它们变大,用更多的并行性来训练它们,并添加更多的 GPU。这与 RNNs 明显不同,RNNs 的并行化效率远不如变换器。我们还在图像领域看到了这一点,在生成对抗网络(GAN)方法中,它们难以达到十亿参数的规模。用于大型语言模型中的基于变换器的方法可以轻松扩展到数十亿,从而构建更大更好的模型。
从解决方案设计的角度来看,你今天的原型可能会因为模型大小而遇到重大限制。更大的模型需要更多的资源,并且预测所需的时间更长。用户能接受的最大响应时间是多长?运行模型所需硬件的成本有多高?模型大小的增长率超过了消费硬件的增长率。因此,你可能无法将你的模型部署到嵌入式设备上,或者你可能需要互联网连接来转移成本。因此,你需要在设计中考虑网络基础设施来处理持续连接的需求。这一需求增加了电池使用量,这在持续运行 Wi-Fi 无线电而不是本地计算时是一个考虑因素。所以尽管更大的模型更准确,但设计限制可能阻止它们以实际的方式部署。将这些限制与 LLMs 如何进行预测的事实以及你在这章中学到的 LLMs 何时何地失败的使用案例结合起来,将使你很好地理解如何有效地使用 LLMs 来解决你最关心的问题。
摘要
-
深度学习需要一个损失/奖励函数,该函数具体量化算法在做出预测时的糟糕程度。
-
这个损失/奖励函数应该被设计成与我们在现实生活中希望算法达到的总体目标相关联。
-
梯度下降涉及逐步使用损失/奖励函数来改变网络的参数。
-
LLMs 被训练通过预测下一个标记来模仿人类文本。这个任务足够具体,可以训练一个模型来执行它,但它并不完美地与推理等高级目标相关联。
-
LLMs 在执行与其训练数据中观察到的常见和重复性任务时表现最佳,但当任务足够新颖时,它们会失败。
第五章:我们如何约束 LLMs 的行为?
本章涵盖
-
通过约束 LLMs 的行为使其更有用
-
我们可以约束 LLMs 行为的四个领域
-
微调如何使我们能够更新 LLMs
-
强化学习如何改变 LLMs 的输出
-
使用检索增强生成修改 LLMs 的输入
看起来似乎有些反直觉,你可以通过控制模型允许产生的输出来使模型更有用,但与 LLMs 一起工作时几乎总是必要的。这种控制是由于当被提供一个任意的文本提示时,LLMs 将尝试生成它认为适当的响应,而不管其预期用途如何。考虑一个帮助客户购买汽车的聊天机器人;你不希望 LLMs 偏离脚本并与他们谈论体育或运动,仅仅因为他们询问了与将车辆带到孩子足球比赛相关的事情。
在本章中,我们将更详细地讨论为什么你想限制或约束 LLMs 产生的输出以及与这种约束相关的细微差别。由于 LLMs 是根据训练数据中观察到的内容完成输入的训练性质,准确约束 LLMs 是完成的最困难的事情之一。目前还没有完美的解决方案。我们将讨论四个可能修改 LLMs 行为的潜在位置:
-
在训练发生之前,整理用于训练 LLMs 的数据
-
通过改变 LLMs 的训练方式
-
通过在数据集上微调 LLMs
-
通过在训练完成后编写特殊代码来控制模型的输出
这四个案例总结在图 5.1 中。LLMs 开发的每个阶段都为下一个阶段提供输入。微调阶段,在更小的数据集上进行的第二轮训练,对于 ChatGPT 等工具今天的功能至关重要,并且可能是你在实践中最可能使用的方法。我们在第二章到第四章中了解到的前一个更大的训练阶段通常被称为预训练,因为它发生在微调使模型有用之前。预训练过程产生的模型有时被称为基础模型或基础模型,因为它是一个构建特定任务或微调模型的起点。
图 5.1 可以在四个地方干预以改变或约束 LLMs 的行为。图中中间部分显示了模型训练的两个阶段,其中模型的参数被改变。在左侧,一个人也可以在模型训练之前改变训练数据。在右侧,一个人可以在模型训练之后拦截模型输出并编写代码来处理特定情况。
由于微调的重要性和有效性,我们将在本章的大部分内容中讨论这个因素及其执行方式。
5.1 我们为什么想约束行为?
LLM 之所以非常成功,是因为它是第一个实现“用普通英语告诉计算机做什么,然后它就去做”这一想法的技术。通过非常明确地说明你想要发生的事情,建立特定的细节水平并指定一定的语气,你可以让 LLM 成为一个惊人的有效工具。这个详细的指令集被称为提示,设计良好提示的艺术被称为提示工程。例如,我们可以为汽车销售机器人开发一个提示,如图 5.2 所示。
图 5.2 商业 LLM,如 ChatGPT,被设计成可以遵循指令(在某种程度上)并且可以以非常高的效率执行许多低认知或模式匹配任务。这些任务包括风格化的写作,如模式匹配,以及遵循指令,如扮演汽车销售员。
你可以给一个大型语言模型(LLM)一个提示,让它将数据组织成以逗号分隔的值,以便你可以将它们复制到 Excel 中。你也可以设计一个提示,说明如何将自由形式的调查回复分类到总结的主题中。在所有情况下,提示都是一个限制或约束行为以特定任务和目标为目标的练习。然而,我们在前几章讨论的标记化和训练技术并不能使这种指令跟随成为可能。
记住模型只做它们被训练去做的事情是至关重要的。对于一个标准的 LLM 来说,这个任务是从一段文本中提取并生成该文档的延续,使其看起来像训练语料库中的典型段落。它没有被训练去回答问题、思考、总结文本、进行对话或做其他任何事情。为了获得这种期望的指令遵循行为,我们必须进行微调,这是第二轮以不同目标进行的训练,这将产生预期的行为。你可能想知道,“为什么我们不训练 LLM 来完成我们想要它们执行的任务?”在大多数深度学习应用中,我们强烈建议遵循第四章中定义的过程来创建一个特定、可计算且平滑的损失函数。然而,对于 LLM 擅长的任务类型,有许多原因说明这种两阶段训练过程为什么效果良好。
第一个原因涉及到完成特定目标所需知识的广度。回想一下聊天机器人销售汽车的任务。如果我们旨在构建一个能够成功销售汽车的模型,构建一个只包含与汽车相关的数据的集合将会很棒。但当潜在买家想知道汽车是否能容纳所有冰球运动员所需的设备,清洁是否容易,他们的关节炎祖父是否能进出乘客座位,或者任何其他可能有人关于他们的汽车如何与生活互动的问题时,你会遇到列举所有可能关于汽车的问题的问题。无法获取生成所有可能情况答案所需的所有信息。相反,我们依赖于我们之前讨论过的训练过程,这可以被认为是预训练,从包含关于体育、关节炎等文本的广泛内容集合中获取信息。我们希望这些信息有助于模型更好地准备或泛化地帮助回答更广泛的问题。
这是我们使用两阶段训练过程的第二个和主要原因:获取数亿篇描述特定问题的文档作为预训练阶段的一部分是不可能的。在当前的技术水平上,这个巨大的规模是创建 GPT 中看到的令人印象深刻的能力所必需的。然而,只需相对较少的努力,就可以用数亿条一般信息(如网页)进行预训练,使模型获得一般知识。随后,通常只需要用数百篇文档进行微调,就可以将模型约束为产生针对手头任务的有用定制内容。为特定问题获取数百篇文档可能具有挑战性,但却是可行的。
在高层次上,第二个微调训练阶段可以帮助约束一个大型语言模型(LLM)到一些有用的行为子集,因为原始模型没有激励去做我们想要的事情。在接下来的章节中,我们将展示基模型出现的一些具体问题,这将使为什么这样做有效的原因变得明显。
5.1.1 基模型不太可用
按照第四章中描述的过程训练 LLM 会产生一个通常被称为基模型的模型,因为它可以作为构建应用程序或微调模型的基平台。不幸的是,基模型对大多数人来说并不很有用,因为它们没有通过用户友好的 UI 暴露其底层知识,它们可能很难保持主题相关,有时它们会产生令人不快的内。基模型甚至没有像 ChatGPT 那样的聊天机器人概念进行训练。
5.1.2 并非所有模型输出都是期望的
有时,模型认为在文档中接下来可能发生的事情是不期望的。这有几个原因,包括
-
记忆—有时,大型语言模型(LLMs)可以生成与它们训练数据中找到的序列完全一致的复制品,这通常被称为记忆,指的是文本是通过从训练集中记忆复制的。记忆可能是有益的,例如记住特定事实问题的答案。例如,如果有人问,“亚伯拉罕·林肯什么时候出生?”你希望模型能够复述“1809 年 2 月 12 日。”然而,如果它导致模型侵犯版权,也可能造成重大损害。如果有人要求“爱德华·拉夫的《深度学习内部》的副本”,而模型产生了逐字逐句的副本,爱德华可能会因为你侵犯版权而对你感到不满!
-
网络上的不良内容—互联网上并非所有内容都是你希望让用户接触到的。互联网上充斥着许多卑鄙和仇恨的内容,以及从常见误解到阴谋论的各种事实错误信息。尽管模型开发者通常在训练模型之前尝试过滤掉这些数据,但这并不总是可能的。
-
缺失和新的信息—不方便的是,我们在训练模型之后,世界仍在不断发展和变得更加复杂。因此,一个在 2018 年之前的信息上训练的模型将不会知道之后发生的事情,比如 COVID-19 或噩梦般的仿生机器人[1]的发明。但你可能希望你的模型了解这些发展,以保持其有用性,而无需支付相当大的成本来从头开始重新训练基础模型。
等待法律体系赶上
我们不是你的律师;这不是一本法律书!围绕 LLMs 的法律问题很复杂,关于合理使用和侵权有很多细微差别。搜索引擎可以逐字显示其来源的内容,但为什么?一系列明确解决这些问题的法律,如《数字千年版权法案》(DMCA),以及由法院判决设定的先例,如 Field v Google, Inc.(412 F.Supp. 2d 1106 [D. Nev. 2006]),随着时间的推移确立了可接受和不可接受的使用。然而,立法和法院案件需要时间来创建,而生成式 AI 的革命并不完全符合现有的法律理解。
你可能想要一个关于在美国或你自己的国家法律中什么是允许的,什么是禁止的清晰答案,而可能的答案是,对于 LLMs 来说,这样的确定性尚不存在。此外,我们绝不会在印刷品中提供这样的法律建议——我们甚至不在电视上扮演律师的角色!
GPT-3.5 和 4 已经得到改进,以避免回答他们不知道的问题(并不总是成功),但我们可以参考一些开源的基础模型,如 GPT-Neo,看看没有主动的对策会发生什么。例如,如果我们编造一种新的假药,MELTON-24,并询问“MELTON-24 是什么,它能帮助我睡得更好吗?”我们会得到一个无用的回答:“与褪黑素相关的睡眠问题有很多,包括失眠和疲劳。这会导致失眠,因此避免某些可能抑制褪黑素的食品是很重要的。”
在这种情况下,MELTON 与褪黑素之间的相似性以及“睡眠”的提示足以让模型捕捉到褪黑素的主题。然而,答案显然是荒谬的,因为 MELTON-24 并不存在。理想情况下,我们希望模型能够识别并响应,承认其信息不足,而不是像这里一样产生更多文本。
5.1.3 一些情况需要特定的格式化
如果用户要求以特定格式提供数据,例如 JSON 这样的结构化文本格式(有关计算机间交换数据的一种常见格式示例,请参阅en.wikipedia.org/wiki/JSON
),而你没有匹配每个开括号或闭括号,或者没有正确编码特殊字符,输出将无法满足他们的目标。无论输出可能多么复杂或接近正确,格式要求几乎总是严格的要求。我们在第四章中提出了这类问题的一个例子,当时我们要求 ChatGPT 用 Modula-3 编写代码,而它借用了对 Modula-3 无效的 Python 语法。如果违反了语法规则,代码将无法编译。一个 LLM 生成特定期望输出的概率方法并不能保证 100%遵守所有期望的语法规则。
5.2 微调:改变行为的主要方法
现在我们已经了解了各种原因,为什么我们要限制和控制 LLM 的行为,我们更好地准备向模型引入新信息,以解决我们试图解决的问题,同时避免产生有害或法律上有疑问的内容的问题。记住,尽管我们有四个不同的地方可以干预以改变行为,但微调比其他方法更有效。无论是像 OpenAI [2]这样的闭源选项,还是像 Hugging Face [3]这样的开源工具,以及其他许多工具,它们都有不同的微调选项,这使得它成为实践者最易获取的方法。
任何微调方法都将产生相同的效果——产生一个新的 LLM 变体,具有更新后的参数来控制其行为。因此,可以混合和匹配不同的微调策略,因为它们产生的根本效果是相同的:一组新的参数,可以直接使用或再次修改。一个人的基础模型可能是另一个人的微调模型。这在许多开源 LLM 中很常见,其中初始模型(例如,Llama)将被另一方(例如,您可以在许多“指令 Llama”模型中找到)修改,然后您可以进一步根据您的数据或特定用例对其进行微调。
定制 LLM 最直接的方法是通过提示和迭代地改进提示,直到获得所需的行为。然而,如果这种方法效果不佳,微调是下一个合乎逻辑的步骤。这一步骤涉及适度增加努力和成本,例如收集微调所需的数据和获取运行微调会话的硬件。
您应该特别了解两种微调方法:监督微调(SFT)和更具挑战性的名称基于人类反馈的强化学习(RLHF)。SFT 是一种更直接的方法,非常适合将新知识融入模型或简单地在其首选应用领域给它一个提升。RLHF 更复杂,但提供了一种让 LLM 遵循更难和更抽象的目标的策略,例如“成为一个好的聊天机器人”。
5.2.1 监督微调
影响模型输出的最常见方法是监督微调(SFT)。SFT 涉及使用高质量、通常是人工编写的示例内容,这些内容捕捉到对您的任务至关重要的信息,但可能没有在基础模型中得到充分体现。
这通常是因为 LLM 是在大量通常可用的内容上训练的,这些内容可能与您的特定需求重叠最小。如果您经营一家医院,LLM 看到过非常少的医生笔记。如果您经营一家律师事务所,LLM 可能没有看到太多的证词记录。如果您经营一家维修店,LLM 可能没有看到您可能可以访问的所有手册。
警告:微调是一种向模型添加新信息的有用方法,但也可能带来安全风险。如果您想在病历上构建一个大型语言模型(LLM),在示例病历上微调 LLM 是有意义的。但现在存在风险,有人可能让您的 LLM 重现微调数据中包含的敏感信息,因为从根本上说,LLM 试图根据它们看到的训练数据来完成输入。底线是:不要在您希望保持私密的 数据上训练或微调 LLM。
再次考虑我们关于汽车公司和其销售聊天机器人的例子。一个来自第三方来源的基础模型可能通常对汽车有所了解,但可能不会了解公司产品的所有信息。通过在内部手册、聊天记录、电子邮件、营销材料和其它内部文件上微调模型,你可以确保模型尽可能多地准备好关于你汽车的信息。你甚至可以编写关于你的车辆相对于竞争对手的优点、优势、脚本等内容示例文档,以确保 LLM 装备了你想让它拥有的信息。
SFT 的机制很容易解释。正如我们提到的,SFT 只需要更多的文档。这些文档可以是任何可以提取文本的格式。这构成了应用 SFT 所需的所有工作,因为 SFT 只是重复你在第四章中学到的相同训练过程。图 5.3 显示了 SFT 的过程与之前看到的是相同的。不同之处在于,第一次训练基础模型时,初始参数是随机且无用的。第二次微调时,你从基础模型的参数开始,这些参数编码了基础模型通过观察其训练数据所学习的内容。
图 5.3 监督微调(SFT)是一种简单的提高模型结果的方法。你重复用于构建基础模型的过程。一旦基础模型在大量的通用数据上训练完成,你继续在较小的专业数据集上训练。
令人高兴的是,你现在对 SFT 有了很好的理解。就像原始的训练过程一样,它重新使用了“预测下一个标记”的任务,以确保你的模型有来自新文档内部的信息。预测下一个标记的直接后果是,SFT 也不允许我们改变 LLM 的激励。因此,像“不要对用户诅咒”这样的抽象目标很难通过 SFT 实现。
微调陷阱
通过重新使用第四章中的梯度下降策略,所有微调方法都倾向于继承围绕 LLM 返回训练内容能力的两个问题。由于 SFT 非常简单,这是我们回顾除了 SFT 之外微调更广泛问题的好时机。
没有保证 SFT 会正确保留你提供的信息。这个问题被称为灾难性遗忘 [4],当你用新数据训练模型但不再继续用旧数据训练时,模型开始“忘记”旧信息。很难确定什么会被忘记,什么不会。灾难性遗忘自 1989 年以来就被认为是一个公认的问题 [5]。换句话说,微调并不是纯粹的增加;你为此放弃了一些东西。
5.2.2 从人类反馈中进行强化学习
在撰写本文时,RLHF 是约束模型的主导范式。正如其名所示,它使用来自强化学习(RL)领域的做法。RL 是一个广泛的技巧家族,其中算法必须做出多个决策,以最大化长期目标,如图 5.4 所示,其中使用了四个具有技术含义的术语:
-
代理—拥有一个它希望实现的总目标的实体/AI/机器人,它可能需要采取多个动作来实现这个目标。
-
动作—代理可能能够执行或参与以推进代理目标的全部可能事物。
-
环境—受动作影响的地方/对象/空间。环境可能或可能不会因动作、其他代理采取的动作或环境的自然连续变化而改变。
-
奖励—对改进(可能为负)的数值量化,这种改进可能或可能不会在执行一定数量的动作之后发生。
图 5.4 RL 是关于迭代交互的,你的动作奖励可能需要很长时间才会实现,需要多个步骤才能达到。对于像 ChatGPT 这样的聊天机器人,环境是与用户的对话,动作是 ChatGPT 可能完成的无限可能的文本。在某种意义上,奖励变成了对话结束时用户对聊天机器人的满意度。
在一个将 LLM 用作聊天机器人与人类互动的例子中,用户是环境。LLM 本身是代理,它可以产生的文本是动作。这留下了一件事需要指定:奖励。如果我们让用户为与聊天机器人进行的好对话(例如,没有粗俗语言,没有撒谎,提供有帮助的回答)打+1 分,而对于糟糕的对话(例如,建议摧毁所有人类)打-1 分,那么我们就在我们的强化学习中加入了人类反馈。
一个敏锐的读者可能会注意到,奖励听起来与第四章中讨论的损失函数非常相似。事实上,我们关于好与坏对话的例子落入了我们所说的损失函数不良例子的非常主观且难以量化的范畴。+1/-1 奖励不连续,因为它的值指向一个方向或另一个方向,没有中间地带,这是损失函数的另一个不良特征。
RL 的一个强大之处在于它可以与不连续和难以量化的目标一起工作。我们使用“奖励”而不是“损失”来暗示这两种情况之间的区别。通常,RL 可以学习的目标类型被称为“不可微分的”。因此,这些目标不能使用我们在第四章描述神经网络学习时所提到的梯度下降等相同数学技术来学习。我们将在稍后具体解释 RLHF 是如何工作的。RL 的一个注意事项是它可能计算成本高昂,需要大量的数据。RL 是一种臭名昭著的困难学习方法。它通常比其他微调技术如 SFT 表现更差,因为 RL 需要比其他方法更多的“正确”和“错误”做事方式的例子,并且由于我们正在使用人类反馈来引导 RLHF,结果并不总是完美的。例如,在图 5.5 中,RLHF 无法帮助 LLM 理解在 RLHF 训练期间没有明确看到的基本指令,因为它没有向基础模型添加执行基本逻辑的能力,例如理解用户请求避免显示关于海豚的信息。
图 5.5 RLHF 在让 LLM 避免已知、具体问题方面相当出色。然而,它并没有赋予模型处理新问题的工具。在询问了迈阿密的足球情况后,想要谈论迈阿密海豚作为下一个逻辑上要说的事情,违反了避免提及海豚的第一个请求。
LLMs 的推理方式与我们人类所认为的推理方式不同。通过收集数亿个“一切”的例子,你可以走得很远,但世界很奇怪。我们没有证据表明 LLM 在出现新颖情况时可以可靠地产生令人满意的响应。然而,RLHF 是目前为止约束 LLM 行为最好的方法。尽管存在挑战,RL 提供了一种与基于梯度的、需要可微分目标的方法不同的学习方法。最重要的是,ChatGPT 已经表明 RL 在许多情况下是可行的。因此,让我们更深入地了解 RLHF 是如何工作的。
5.2.3 微调:整体情况
SFT 和 RLHF 是微调 LLM 的两种主要方法。SFT 可以与数千份文档或样本一起工作,而 RLHF 通常需要数万个例子。这不应该阻止你在数据较少的情况下进行调查,但如果你数据较少,可能更好地利用你的时间来开发更好的提示。
更重要的是,SFT(监督学习)和 RLHF(强化学习与人类反馈)并不是相互排斥的。它们都修改了模型的底层参数,并且你可以依次应用它们以获得每种方法的好处。它们也不是目前存在的唯一微调方法。例如,正在开发新的微调方法,通过从 LLM 中移除概念来强迫模型忽略它在训练后学习到的数据[6]。未来几年还将开发其他模型修改技术。所有这些可能都需要你进行一些数据收集,但它们总体上比从头开始构建一个 LLM 要少做很多工作。
5.3 RLHF 的机制
为了描述 RLHF 是如何工作的,我们将介绍一个不完整的 RLHF 版本,解释为什么它不起作用,然后解释如何修复它。在本节中,我们不会讨论 RLHF 使用的详细数学,因为这不会从高层次上给你带来任何特别深刻的见解。如果你想了解更多关于细节的细节,我们建议在完成本章后,从“实现 RLHF:使用 trlX 学习总结”[7]开始学习。
5.3.1 从天真 RLHF 开始
首先,让我们看看 RLHF 的不完整和天真版本。我们已经讨论了 RL 如何使用非可微目标进行学习。所以,让我们假设我们有一个人类,他将使用质量奖励来评分 LLM 的输出,其中+1 表示良好的回答,-1 表示不充分的回答。这种质量奖励只是我们分配给 LLM 产生的输出的一个任意分数,以表明一个例子在某些方面比其他例子更好。
因此,如果用户向一个大型语言模型(LLM)请求说,“给我讲一个笑话”,而 LLM 给出的回答是“拧灯泡需要多少只鸭子?”我们可能会给这个(相对)好的笑话打+1 分。如果 LLM 反而给出一个像“狗是邪恶的”这样的句子,我们将给出-1 分,因为它甚至没有尝试讲笑话。由于使用简单的+1 和-1 质量奖励进行 RL(强化学习)很难,我们将为 RL 算法添加额外的信息,例如每个生成的标记的概率。这样,RL 算法就知道每个标记可能有多大的概率。整个过程总结在图 5.6 中。
图 5.6 一个天真和不完整的 RLHF 版本。虚线代表从组件 A 发送到组件 B 的文本。由于文本与梯度下降不兼容,必须使用更复杂的 RL 算法。这使我们能够根据 LLM 输出的质量评分来调整 LLM 的权重。
为什么要为 RL 提供概率?
我们向 RL 算法提供每个标记的概率似乎有些奇怪。这背后有更深层次的数学原因,我们将在本章中不深入探讨。但为了获得一些直观感受,一个好的笑话通常需要误导或惊喜。如果一个序列的所有概率都是高值(接近 1.0),那么它可能不是一个好的笑话,因为它太可预测了。
在自然语言处理领域,产生好的生成文本是在使某事可能发生(即,可能发生)和不要让它过于可能发生(即,重复)之间的一种平衡行为。
5.3.2 质量奖励模型
我们将质量奖励描述为对每个提示完成的人为评分。虽然从技术上讲,实时手动评分是可行的,但由于所需的工作量,这将是不可行的。然而,人类反馈仍然通过质量奖励被纳入。相反,我们训练一个神经网络作为奖励模型。这是通过让人们手动收集数十万个提示和完成对,并对其进行好坏评分来实现的。这些评分成为用于训练奖励模型的标记数据,如图 5.7 所示。
图 5.7 奖励模型被训练得像标准的监督分类算法一样。一个神经网络,可能是自身就是一个大型语言模型(LLM)或者另一个更简单的网络,如卷积神经网络或循环神经网络,被训练来预测人类会如何评分一个提示完成对。因为神经网络是可微分的,这种训练是有效的,并提供了一个作为强化学习与人类反馈(RLHF)中“人类”角色的工具。
收集数十万个评分过的提示和完成对是昂贵的但可行(例如,huggingface.co/datasets/Anthropic/hh-rlhf
),尤其是在使用像 Mechanical Turk 这样的众包工具(www.mturk.com/
)时。这需要大量手动整理的数据,但比用于创建初始基础模型的数十亿个标记小得多。这些 RLHF 数据集必须很大,因为你必须覆盖用户可能提供的许多场景、问题和请求。正如我们已经在图 5.5 中的海豚示例中看到的,RLHF 对于相对简单和已知的话题往往有效。因此,处理不同情况的范围直接来自于微调数据范围的广度。
注意:我们使用+1/-1 作为提供质量奖励的例子,因为它最容易描述。由于强化学习(RL)不需要梯度,你可以使用与你的问题相关的任何分数。使用排名分数,即比较给定提示的多个完成情况并将它们从最好到最差进行排名,更为流行且更有效,因为你可以同时评估多个完成情况。无论如何,提供正面和负面反馈的基本原则是相同的。
5.3.3 类似但不同的 RLHF 目标
一旦你训练了一个奖励模型,你就可以为 RLHF 过程创建和评分你想要的任何数量的提示。人类反馈已经融入奖励模型,现在可以分发、并行化和重复使用。唯一剩下的问题是,当前 RLHF 的简单版本纯粹是为了最大化质量奖励,而这并不是 RL 必须关注的唯一目标。
因此,随着时间的推移,模型将开始退化,产生无意义和低质量的输出,这对任何读者都没有价值。这种退化与一种称为对抗攻击的现象有关,其中通过相对较小的输入变化,意外地欺骗神经网络做出荒谬的决定。对抗机器学习(AML)正在快速发展,并具有其自身的复杂性陷阱,因此我们将对此讨论推迟到其他人的文章中[8]。但是,我们在图 5.6 中描述的 RLHF 的简单实现实际上是对一个大型语言模型(LLM)进行对抗攻击,因为它只关注最大化质量奖励,而不是对用户有用。本质上,这是 Goodhart 定律在 AI/ML 中的应用:“当一项衡量标准成为目标时,它就不再是一个好的衡量标准。”
为了解决这个问题,我们必须向 RL 算法添加第二个目标。我们将计算原始基础 LLM 的输出和微调 LLM 的输出之间的相似性作为第二个奖励。从概念上讲,这个奖励可以被视为当微调 LLM 产生更好的输出时的一种奖励,类似于原始 LLM 的行为。它通过防止模型过于新颖而偏离轨道。从根本上讲,我们希望微调 LLM 的生成输出由原始 LLM 最初观察到的训练数据所支撑。我们不希望微调模型过于创新而生成无意义的内容。这个奖励被添加到 RL 算法中,以稳定微调。图 5.8 提供了 RLHF 如何工作的完整图景。
图 5.8 强化学习与人类反馈(RLHF)的全貌。虚线表示文本,需要通过强化学习更新参数。原始的 LLM 是未经修改的基础模型,而用于微调的 LLM 则从基础模型开始,但经过修改以提高其输出的质量。相似性和质量奖励组件通过单词概率提供,以改善计算。强化学习通过结合质量和相似性评分来调整参数。
一个学会产生胡言乱语输出的模型会因为缺乏相似性而受到高额惩罚,从而阻止模型变得过于不同。一个产生完全相同输出的模型将获得低质量评分,从而阻止缺乏变化。两者之间的平衡能够很好地实现一个“金发姑娘效应”,使模型有足够的灵活性进行变化,而不会导致其失去类似人类的输出。
5.4 在定制 LLM 行为中的其他因素
微调是改变大型语言模型(LLM)行为的主要手段,但微调并非万无一失,并且并非行为改变发生的唯一地方。我们关注微调是基于强化学习与人类反馈(RLHF)在产生超出简单下一个标记预测的 LLM 行为中的价值。
图 5.9 除了微调之外,您还可以通过改变训练数据、改变基础模型训练过程或通过编写代码处理特定情况来修改模型的行为。
在图 5.9 中描述的另外三个可以修改 LLM 行为的阶段,对于您作为用户来说并不容易访问。然而,我们现在将简要回顾这些其他阶段,以及一些您应该知道的关键细节,以确保完整性。这些因素可以帮助您理解微调难以实现的内容,以及您可能想要调查的 LLM 提供商的问题范围。
5.4.1 改变训练数据
“垃圾输入,垃圾输出”这句谚语在机器学习的所有领域都是永恒的。您确实可能会注意到,OpenAI [9] 和 Google [10] 提供了许多关于他们如何开发 LLM 的低级技术细节,但对于用于构建 LLM 的数据却提供了很少的细节。这是因为构建强大 LLM 的“秘密配方”大多围绕数据整理——开发一个代表各种任务、高质量语言使用和不同情况范围的数据集合。用于训练、验证和测试 LLM 的数据集的大小和质量至关重要。
随着 LLM 生成内容逐渐进入常规使用并重新在线,数据的大小和质量变得特别相关。例如,估计有 6%到 16%的学术同行评审正在使用 LLMs [11],并且许多校对服务很快就会使用这些新技术。这种增加的使用可能会产生一个负面反馈循环。随着 LLMs 生成数据的数量增加,可用于 LLMs 训练的非 LLM 内容将相应减少。这将导致可用语言的多样性总体下降,从而 LLMs 能够捕捉到的创新性也会减少。反过来,基于较新数据训练的 LLM 的质量也会降低 [12]。这个问题可能会在保持 LLMs 更新方面变得非常重要,因为编制高质量数据集将不会像以前那样简单。
此外,还有一个问题,即 LLMs 只能反映训练时可用信息,并且更有可能反映在训练中更普遍的信息。如果你想得到一个不诅咒或使用种族主义语言的 LLM,你必须努力清除数据集中所有的诅咒和种族主义语言。
然而,这个问题可能是一把双刃剑。如果我们想让我们的 LLM 知道如何识别和适当地拒绝种族主义或粗俗语言,它必须知道什么是种族主义和粗俗语言。你可以想象在一个从未见过任何种族主义文本的 LLM 上使用提示来“教导”LLM 在一种看似无害的语境中使用种族主义词汇。但在最终形式中,我们作为意识到种族主义问题的读者,会认为这个句子是令人反感的。到目前为止,这个问题还没有答案,但这是我们应当留意的。
修改数据也很重要,因为这是你唯一能够影响 LLM 中分词方式的机会。正如第二章所讨论的,不同的分词方法有各自的权衡,但一旦开始训练,你所做的选择就会永远被嵌入到模型中。
5.4.2 修改基础模型训练
训练数据隐私在训练或微调大型语言模型(LLMs)时必须是一个重要的关注点。通常,通过以特殊方式构建输入到模型中,可以重建一个模型训练数据。在某些情况下,LLMs 已被证明能够生成它们训练过的确切段落。如果训练数据包含私人信息,如个人可识别信息(PII)、私人健康信息(PHI)或其他敏感数据类别,这将是一个问题。模型的使用者可能无意中提供了一个提示,该提示会逐字逐句地揭示这些数据。
算法的初始训练是使用一种称为差分隐私(DP)的技术来缓解这些隐私问题的理想场所。DP 很复杂,所以如果您想了解更多,我们推荐阅读《编程差分隐私》[13]。简而言之,DP 在模型训练过程中添加了精心构造的随机噪声,以提供关于数据隐私的保证。DP 不能处理所有事情,但它比大多数算法今天提供的保护要多得多。
那为什么不是每个人都这样做呢?嗯,添加噪声自然会降低结果的质量。大规模的训练运行成本高昂,每次可能花费数十万到数百万美元。如果您需要做更多的训练运行来正确设置隐私参数,您将面临数百万到数千万美元的问题。但随着 DP 每年都在变得更好,我们怀疑它将在未来变得更加普遍。
5.4.3 修改输出
最后,我们可以检查生成的标记,并编写代码根据模型生成的标记组合来改变其行为。在微调后,这是 LLM 消费者修改其行为的第二可能阶段。
在本章的早期部分,我们讨论了 LLMs 生成符合精确格式输出(如 XML 或 JSON)的常见需求。实现这类格式要求是 LLMs 中常见的问题。任何一次预测失败都会导致无法生成有效的输出。您可以在图 5.10 中看到一个此类失败的例子;我们要求 LLM 完成一些 Python 代码;下一个标记应该是分号 (😉,但它错误地尝试换行 (\ n)。
图 5.10 通过编写强制格式规范的代码,您可以在 LLM 生成输出时捕获无效输出。一旦检测到,让 LLM 生成下一个最可能的标记,直到找到有效输出,这是一种简单的方法来改善情况。
存在着各种工具(例如,github.com/noamgat/lm-format-enforcer
)用于在 LLM 的解码步骤中指定严格的格式。如果这些工具检测到解析错误,它们会立即重新生成最后一个标记,直到生成有效输出。
虽然存在更多复杂的方法来选择下一个标记,但这里的重要教训是能够在生成完整输出之前使用中间输出做出决策。即使是简单的“进行/不进行”列表也是捕捉不良行为的有效工具。你不需要在真正的实时中将输出传递给用户;你总是可以引入人工延迟,这样你就可以在发送给用户之前看到更多的响应。这为你提供了时间来与不良语言过滤器或其他硬编码的检查进行对话。如果发生匹配,就像图 5.10 中所示,你可以重新生成输出或终止用户的会话。
5.5 将 LLM 集成到更大的工作流程中
在本章的这个阶段,我们已经介绍了一些基本方法来操纵 LLM 以产生更理想和一致的结果。到目前为止,我们主要关注涉及 LLM 本身的技巧,无论是通过提示、操作训练数据,还是微调基础模型。在本节中,我们将探讨如何通过将 LLM 的输入和输出整合到多步骤操作链中,来定制 LLM 的输出以实现更精确的结果。这个领域正在迅速发展,因此我们将简要介绍一个将 LLM 集成到更广泛的信息检索工作流程的具体示例,然后讨论一个通用工具,以展示如何通过与 LLM 的多次交互来定制 LLM 的输出。
5.5.1 使用检索增强生成定制 LLM
检索增强生成(RAG)是一种技术,它允许我们在减少生成无意义或错误解释的可能性同时,从 LLM 中生成答案。RAG 名称中的“检索”部分应该能给你一个关于该技术如何操作的提示。当用户向 RAG 系统提供输入时,它使用 LLM 创建一个查询,该查询在包含文档索引的搜索引擎上运行。根据用例,这可能是一个通用信息的索引,如 Google,或一个特定主题的索引,如汽车营销材料的集合。搜索引擎根据查询生成一份相关文档列表。然后,RAG 系统使用 LLM 从这些文档中提取信息以生成更好的答案。为此,RAG 系统将检索到的文档内容与原始用户查询相结合,为 LLM 创建一个全面的提示,从而产生更好的响应。这种方法通常效果很好,因为我们现在要求 LLM 根据一组与常规搜索引擎查询相关的文档进行总结,并提供这些相关文档,以便从中获取其答案。换句话说,我们正在帮助 LLM 专注于它需要正确回答给定问题的数据。我们在图 5.11 中描述了这一过程,并将其与我们迄今为止描述的正常 LLM 用例进行了比较。
到目前为止,RAG 方法最显著的两大好处如下:
-
RAG 系统的输出比用户原始问题更准确、更符合事实或更有用,因为它基于文档索引中包含的特定来源。
-
LLM 可以生成引用或参考文献,指向用于生成其响应的源文档,使用户能够验证或与原始源材料相关联。
图 5.11 在左侧,我们展示了用户询问如何编写 JSON 时 LLM 的正常使用情况。LLM 自然有可能产生错误的输出,这是我们希望最小化的。在右侧,我们展示了 RAG 方法。通过使用搜索引擎,我们可以找到与查询相关的文档,并将它们组合成一个新的提示,为 LLM 提供更多信息和环境,以便产生更好的答案。
关于引用的后者尤其重要。RAG 不能解决 LLM 的所有问题,因为 LLM 仍然在 RAG 系统中生成最终输出。LLM 可能仍然会因为找不到或不存在的内容而产生错误或幻觉。也有可能 LLM 无法准确捕捉或表示它使用的任何源文档的内容。因此,RAG 方法的有效性与它执行的搜索质量和返回的文档直接相关。底线是,如果你不能为你的问题构建一个有效的搜索引擎,你就不能构建一个有效的 RAG 模型。
上下文大小
当思考大型语言模型(LLM)时,考虑 LLM 的一个方面——即上下文大小——是很重要的。LLM 的上下文大小决定了它在单个请求中可以处理多少个标记。你可以将其视为 LLM 在接收提示形式输入时能够查看的数据量。例如,GPT-3 的上下文大小为 2,048 个标记。然而,在聊天机器人等应用中,上下文通常用于保存整个对话的运行记录,包括任何 LLM 的输出。如果你与 GPT-3 的对话长度超过 2,048 个标记,你会发现 GPT-3 经常在聊天早期讨论的一些内容上失去跟踪。
上下文大小是 RAG(检索增强生成)使用的启用和限制因素。如果一个 RAG 系统为你的 LLM 检索整本书,你的 LLM 将需要一个巨大的上下文大小才能使用它。否则,LLM 只能消费检索到的文档的前一部分(直到 LLM 的上下文大小),可能会错过信息。因此,上下文大小是在选择模型时应考虑的重要操作特性。今天的一些模型,如 X 的 Grok,可以将上下文大小处理到 128,000 个标记。虽然像 Grok 这样的大型上下文大小增加了 LLM 可以消费的硬限制,但利用更大的上下文大小处理大量输入的 LLM 的有效性仍然是一个活跃的研究领域。
你可能会在图 5.11 中注意到,我们必须创建一个新的提示。我们在前面添加了“回答问题:”的前缀,后面跟着“使用以下信息:”的后缀。从理论上讲,通过调整这个提示,你可以获得更好的结果。你可能会有这样的想法,添加一些指令,比如“如果以下信息与原始问题不相关,则忽略任何此类信息。”这些想法开始涉及到提示工程,这是一种调整和修改输入 LLM 的文本以改变其行为的实践,正如我们在第四章中讨论的那样。
提示工程确实很有用,并且是结合多个 LLM 调用以改进结果的好方法。例如,你可以尝试通过让 LLM 重写问题来改进你的搜索结果。(这次讨论涉及信息检索的一个经典领域,称为查询扩展,如果你想了解更多关于这个主题的信息。)然而,提示工程可能非常脆弱:任何 LLM 的更新都可能改变提示的效果,而且不得不重写每个提示会非常痛苦——尤其是在处理更复杂的事情时,比如 RAG 模型或更复杂的东西。
5.5.2 通用 LLM 编程
虽然仍然很新,但我们已经开始看到使用 LLM 作为自定义应用程序组件的编程库和其他软件工具。我们特别喜欢的一个是 DSPy(dspy.ai
),它可以使得构建和维护试图改变 LLM 输入和输出的程序变得更加容易。一个好的软件库将隐藏那些阻碍生产力的细节,DSPy 在抽象以下关于 LLM 使用的任务方面做得很好:
-
集成正在使用的特定 LLM
-
实现常见的提示模式
-
调整提示以适应你所需的数据、任务和 LLM 的组合。
这不是一本编程书,因此 DSPy 的完整教程超出了范围。但是,查看 DSPy 如何实现我们在 5.5.1 节中描述的 RAG 模型是有启发性的。这需要我们选择一个要使用的 LLM(在这个例子中是 GPT-3.5),以及一个信息数据库(维基百科将很好地工作),并定义 RAG 算法。DSPy 通过定义所有组件(除非你干预)使用的默认 LLM 和数据库来工作,这使得分离和替换正在使用的部分变得容易。这个过程在下面的列表中展示。
列表 5.1 DSPy 中最简单的 RAG
import dspy
llm = dspy.OpenAI(model='gpt-3.5-turbo') #1
similarity_and_database = dspy.ColBERTv2( #2
'wiki17_abstracts'
)
dspy.settings.configure( #3
lm=llm,
rm=similarity_and_database
)
class RAG(dspy.Module):
def __init__(self, num_passages=3):
super().__init__()
self.retrieve = dspy.Retrieve( #4
k=num_passages
)
self.generate_answer = dspy.Prediction( #5
"question,relevant_documents -> answer"
)
def forward(self, question): #6
documents = self.retrieve(
question
).passages
return self.generate_answer(
question=question,
relevant_documents=documents
).answer
1 使用 OpenAI 的 GPT-3.5,可以与其他在线或本地 LLM 互换
2 使用 ColBERTv2 算法将维基百科的副本向量化
3 使用我们刚刚创建的 LLM 和文档数据库
4 在数据库中搜索最相关的三个文档
5 指定一个“signature”字符串,它定义了 LLM 的输入和输出
6 调用函数以构建一个 RAG 模型。参数名称与签名中的名称匹配。
这段代码将上述 LLM 和数据库的选择设置为默认值,使得替换 OpenAI 为另一个在线 LLM 或本地 LLM(如 Llama)变得同样简单。class RAG(dspy.Module):
类定义了 RAG 算法。初始化器只有两部分。
首先,我们需要一种基于向量化文档搜索字符串数据库的方法,这由ColBERTv2
定义。它使用了一个较旧的(即四年前)但速度和效率更高的语言模型。记住,更大的语言模型(即运行成本更高)只需要检索合理的文档。虽然 ColBERTv2 可能不会像 GPT-3.5 做得那么好,但它已经足够好,大多数时候都能为你找到正确的文档。dspy.Retrieve
随后使用这个默认数据库进行搜索,因此无需指定任何超过要检索的文档数量的内容。
其次,我们需要将问题和文档组合成一个用于 LLM 的查询。在 DSPy 中,提示(prompt)被抽象化,我们只需编写 DSPy 所说的“签名”,你可以将其视为函数的输入和输出。这些应该给出有意义的英文名称,以便 DSPy 为你生成一个好的提示。(在底层,DSPy 使用语言模型来优化提示!)在这种情况下,我们有两个输入(question
和relevant_documents
),它们之间用逗号分隔。->
用于表示输出的开始,我们只有一个输出:问题的answer
。
注意 DSPy 在签名中支持一些基本类型。例如,你可以通过在字符串中标记"question, relevant_documents -> answer:int"
来强制答案必须是整数。此命令将应用我们在图 5.10 中刚刚了解到的错误重生成技术。
这就是定义我们的 RAG 模型所需的所有内容!对象在forward
函数中被调用和传递,但如果你想添加更多细节,可以修改此代码。你可以将所有内容转换为小写,运行拼写检查器,或在这里使用任何类型的代码。这种方法让你可以将编程规则与 LLM 混合搭配。
你也可以轻松修改 RAG 定义以包含新的约束,并编写代码让 LLM 执行验证。更重要的是,DSPy 支持使用训练/验证集来更好地调整提示,微调本地 LLM,并帮助你创建一个经过实证测试、改进和量化的模型,以实现你的目标,而无需在 LLM 特定细节上花费大量时间。尽早采用此类工具将为你提供一个更加稳健的解决方案,让你更容易升级到新的架构。
摘要
-
你可以在四个地方干预以改变模型的行为:数据收集/标记化、训练初始基础模型、微调基础模型和拦截预测的标记。这四个地方都很重要,但对于大多数用户来说,微调是最有效的改变模型目标的地方,可以降低成本并提供最佳的改变模型目标的能力。
-
监督微调(SFT)在较小的定制数据集上执行正常的训练过程,对于细化模型对特定领域的知识很有用。
-
来自人类反馈的强化学习(RLHF)需要更多的数据,但它允许我们指定比“预测下一个标记”更复杂的任务目标。
-
你可以使用现有的工具,如语法检查器,在输出格式必须严格的情况下(例如 JSON 或 XML),检测 LLM 的错误输出。生成和语法检查可以在循环中运行,直到输出满足必要的语法约束。
-
检索增强生成(RAG)是一种流行的通过首先通过搜索引擎或数据库找到相关内容,然后将它插入到提示中的方法来增强 LLM(大型语言模型)输入的方法。
-
类似于 DSPy 的编码框架开始出现,它们将特定的 LLM、向量化以及提示定义与 LLM 输入和输出的修改逻辑分离,以适应特定任务。这种方法允许你构建更可靠和可重复的 LLM 解决方案,这些解决方案可以快速适应新的模型和方法。
第六章:超越自然语言处理
本章涵盖
-
变压器层如何在除文本以外的数据上工作
-
帮助 LLMs 编写可工作的软件
-
调整 LLMs 以便它们理解数学符号
-
如何让变压器替换输入和输出步骤以处理图像
虽然建模自然语言是变压器的首要目的,但机器学习研究人员很快发现他们可以预测涉及数据序列的任何事物。变压器将一个句子视为一个标记序列,并产生一个相关的标记序列,例如从一种语言到另一种语言的翻译,或者预测序列中的下一个标记,例如在回答问题或充当聊天机器人时。虽然序列建模和预测是解释和生成自然语言的强大工具,但自然语言是 LLMs 唯一能够提供帮助的领域。
许多数据类型,除了人类语言,都可以表示为标记序列。用于实现软件的源代码就是一个例子。与您期望在英语中看到的单词和语法不同,源代码是用 Python 这样的计算机编程语言编写的。源代码有其自己的结构,描述了软件开发人员希望计算机执行的操作。与人类语言一样,源代码中的标记根据所使用的语言和它们出现的上下文具有意义。如果有什么不同的话,源代码比人类语言更加结构化和具体。具有模糊性和意义的编程语言对计算机的解释以及其他人对其进行修改和维护都会更具挑战性。
源代码,或者简单地说“代码”(这是我们接下来将如何称呼它的),只是 LLMs 和变压器如何处理非自然语言数据的例子之一。几乎任何可以重新铸造成标记序列的数据都可以使用变压器以及我们关于 LLMs 工作方式所学到的大量经验。本章将回顾三个例子,这些例子逐渐不像自然语言:代码、数学和计算机视觉。
这三种不同的数据类型,被称为数据模态,将需要一种新的方式来观察 transformer 的输入或输出。然而,在所有情况下,transformer 本身将保持不变。我们仍然会在彼此之上堆叠多个 transformer 层来构建模型,并且我们将继续使用梯度下降来训练 transformer 层。代码与自然语言最相似,不需要太多改变。但是,为了使代码 LLM 工作得更好,我们将改变 LLM 生成后续标记的方式。接下来,我们将探讨数学,我们需要改变标记化以使 LLM 在基本操作,如加法中取得成功。最后,对于计算机视觉,它涉及处理图像并执行诸如对象检测和识别等任务,我们将修改输入和输出,展示如何通过完全替换标记的概念来将非常不同的数据类型转换为序列。我们在图 6.1 中展示了必须修改以与每种数据模态一起工作的 LLM 的部分。
图 6.1 如果我们将 LLM 分解为三个主要组件——输入(标记化)、转换(transformers)和输出生成(反嵌入)——我们可以通过更改至少一个输入或输出组件来使用新的数据模态。同时,对于大多数用例,transformer 本身不需要修改,因为它是一般性的。
在处理所有三种新的数据类型时,我们必须解决一个共同的问题。我们如何赋予 LLM 或 transformer 使用与特定学科领域相关的知识的能力?我们通常通过将外部软件集成到 LLM 中来处理这个问题。你可以将这些外部软件组件视为工具。类似于你需要一把锤子来将钉子敲入一块木头,LLM 也可以通过使用工具来实现最终目标。为代码构建的工具将帮助我们改进编码 LLM。了解人类如何进行数学以及我们用来自动化数学的工具将帮助我们制作更好的数学 LLM。理解我们如何将图像表示为像素(我们最终将它们转换为表示图像某一部分中红色、绿色和蓝色数量的数字序列)将使我们能够将它们转换为 LLM 的序列。当你思考与你工作相关的特定知识,而 LLM 尚未应用到的领域时,你将能够识别你所处理数据的独特特征,以便修改 LLM 以更好地与该知识领域的数据进行交互。
6.1 软件开发的 LLM
我们已经简要讨论过,LLMs 可以编写软件的源代码。在第四章中,我们要求 ChatGPT 编写一些用于计算数学常数 的 Python 代码。接下来,我们要求它将这段代码转换成一种名为 Modula-3 的晦涩语言。软件是人们最早发现 LLMs 可以帮助解决的事情之一,这是编程工作相对自然的结果。编程语言被设计成像文本一样由人类阅读和编写!因此,我们可以在不改变标记化过程的情况下生成代码。我们讨论的所有关于构建 LLMs 的内容同样适用于代码和人类语言。
我们可以通过查看 ChatGPT 对 Python 和 Java 两种类似代码段的标记化来了解这一点,如图 6.2 所示。在这里,我们使用不同灰度来表示 OpenAI 标记化器 (platform.openai.com/tokenizer
),它将代码分解成不同的标记。虽然每个例子中相同的标记可能颜色不同,但我们关注的是标记化器如何将代码分解成标记,以及两个例子之间的相似性。这些包括如下内容:
-
每行代码的缩进
-
变量
x
和i
(在大多数情况下) -
函数名和返回语句
-
操作符,例如
+=
这些相似性使得 LLM 能够更容易地关联每段代码之间的相似性。相似性还意味着,在训练过程中,LLM 在具有共同命名、语法和编码实践的编程语言之间共享信息。
图 6.2 以编程语言 Python(左)和 Java(右)编写的两个类似代码样本。这展示了字节对编码如何在不同语言中识别相似的标记。方框显示了单个标记。标准的人类语言标记化方法在代码上做得相当合理,因为代码与自然语言有很多相似之处。
鼓励软件开发者使用有意义的变量名,这些变量名反映了变量在编写的程序中的作用或目的。像 initValue
这样的变量名被拆分为两个标记 init
和 Value
,使用相同的标记来表示自然语言文本,其中单词 Value
的前缀 init
出现。因此,我们不仅可以在具有相似语法的编程语言之间共享信息,还可以通过变量名共享关于代码上下文和意图的信息。LLMs 也可以从程序员添加的代码注释中受益,这些注释用于描述代码的复杂部分,以便于自己或其他程序员理解。在图 6.3 中,我们重复了 Java 版本,并更改了变量名,并在函数顶部添加了一个描述性(但在现实生活中并非必需)的注释。
图 6.3 用 Java 编写的代码,包括描述代码功能的注释。由于(好的)代码(希望)有很多注释,因此自然语言和代码的自然混合为 LLM 提供了信息。当变量有描述性的名称时,模型更容易在代码和注释及变量名称中描述的意图之间关联信息。
在大多数情况下,代码和注释之间得到相同的标记,将人类和编程语言联系起来,因为它们使用相同的表示。无论是处理编程语言还是自然语言,我们都得到相同的标记和嵌入。这种美妙的性质是,LLM 将重用关于自然语言的信息来捕捉源代码的意义,就像人类程序员一样。
在每种情况下,我们都看到代码的标记化并不完美。存在一些边缘情况,LLM 的标记化器没有将代码中的数据类型转换为相同的标记。例如,你可以看到函数参数中的(double
标记与函数体中的double
标记的处理方式不同。然而,这些差异与我们在自然语言 LLM 中已经看到的问题类似,即围绕像“hello ”、“hello.”和“hello!”这样的单词的不同标点符号被解释为不同的标记。由于 LLM 可以处理这些细微的差异,因此它们也可以处理相同的问题,即代码问题。问题是,在许多方面,LLM 处理代码问题更容易,因为代码是区分大小写的,所以我们不需要担心像“hello”和“Hello”这样的文本情况被不适当地映射到不同的标记。在代码中,“hello”和“Hello”将是不同的、独立的变量或函数名。将它们视为不同的标记是正确的,因为编程语言将它们视为不同的元素。
从应用角度来看,代码生成特别有趣,因为存在各种自我验证的机会。我们可以应用第五章中关于监督微调(SFT)和强化学习(RLHF)的所有教训,使 LLM 成为一个有效的编码代理。
6.1.1 改进 LLM 以处理代码
提高代码型大型语言模型(LLM)的第一步是确保初始训练数据中包含代码示例。由于互联网的特性,大多数 LLM 开发者已经完成了这一步:代码示例在网络上很常见,并自然地融入了每个人的训练数据集中。
提高结果成为应用 SFT 的机会,我们收集额外的代码示例,并在给定的代码示例上微调我们的 LLM。像 GitHub 这样的开源仓库,包含大量的代码,使得获取大量代码变得特别容易。从 GitHub 等来源收集的代码构成了用于解释和生成代码的 LLM 微调数据集的基础。
更有趣的情况是使用 RLHF 来提高模型编写代码的实用性。同样,有许多工具和数据集可用,使得为编码助手构建一个不错的 RLHF 数据集成为可能。像 Stack Overflow 这样的来源允许用户提出问题,为其他人提供回答这些问题的便利,并包括一个其他用户对最佳答案进行投票的系统。数据来源包括像 CodeJam 这样的编码竞赛,它们为特定的编码问题提供了许多示例解决方案。如图 6.4 所示,将这些数据源的信息纳入其中。
就像所有优秀的机器学习解决方案一样,如果你为你的任务创建并标记自己的数据,你将获得最佳结果。据传闻,OpenAI 就是这样做的,为了生成代码,他们雇佣承包商完成编码任务,作为创建他们系统数据的一部分 [1]。无论训练和微调数据是如何收集的,整体策略保持不变:使用标准的标记化工具和强化学习与人类反馈(RLHF)来定制一个用于生成代码的 LLM。这个方法已经被成功用于生成像 Code Llama [2]和 StarCoder [3]这样的 LLM。
图 6.4 开发用于代码的 LLM 需要多轮微调。标准的训练程序,如第四章所述,产生一个初始的基础 LLM。使用大量的代码,SFT 创建了一个与代码配合良好的 LLM。将 RLHF 作为第二次微调步骤可以提升 LLM 生成代码的能力。
6.1.2 验证 LLM 生成的代码
LLMs(大型语言模型)在代码生成方面特别有用,因为存在一个客观且易于运行的验证步骤:尝试将代码编译成可执行程序[4]。在生成自然语言时,检查由 LLM 生成的输出是否正确具有挑战性,因为自然语言具有主观性。没有自动化的方法来检查 LLM 生成的输出的真实性或准确性。然而,在生成代码时,简单地检查代码是否成功编译成可执行程序是一个很好的第一步,并且可以捕捉到大量错误代码。一些商业产品更进一步,将编译器(将源代码转换为可执行文件的软件)和可视化工具等工具集成到其后端。例如,ChatGPT 可以在将代码返回给用户之前检查它所编写的代码是否可编译。如果代码未通过这一验证步骤,ChatGPT 将尝试为它收到的提示生成不同的代码。如果模型无法创建可以编译的有效代码,它将警告用户这一事实。
除了检查代码是否可编译之外,LLM 越来越能够创建验证功能正确性的方法。许多代码生成工具利用 LLM 生成单元测试,这些是提供样本输入到生成的代码中的小型程序,并验证它是否产生正确的结果。在某些情况下,这些功能需要开发者描述他们希望 LLM 生成的测试用例,然后 LLM 创建一个初始实现作为进一步测试的起点。
代码特别特殊,因为除了编译之外,还有多种方式可以验证其输出。例如,LLM 完成生成响应之前,代码编译是无法发生的。
考虑到 LLM 运行成本高昂,我们不想让用户等待太长时间才能得到输出,如果 LLM 能够在完成大量生成之前纠正错误,那就太理想了。再次应用第五章的教训,我们可以在完成整个生成过程之前使用语法解析器来检查代码是否错误。如果输出代码的部分未能通过基本的语法检查,我们可以指示 LLM 仅重新生成那个有缺陷的代码部分。我们在图 6.5 中展示了这一基本过程,其中 LLM 在基于每个标记的基础上进行检查,而不是在生成完成之前使用编译来检查代码。语法检查成本较低,可以更快地发生,但它并不能验证编译器能否将代码转换为可工作的可执行程序。
图 6.5 一个 Python 代码示例,其中生成了当前的标记if(A > B)
。如果 LLM 接下来生成的标记是换行符,将会发生语法错误,因为一个if
语句必须以冒号结尾才是有效的。对每个新标记运行语法检查,使我们能够捕捉到这个错误并迫使 LLM 选择一个不会导致语法错误的替代标记。
6.1.3 通过格式化改进代码
使用解析器进行语法检查和使用编译器生成可执行的程序,使得将 LLM 适应生成代码的新问题领域变得容易得多。然而,还有一个额外的技巧是有帮助的。我们可以使用被称为代码格式化工具(程序员也称之为代码检查器)的工具来改变标记化并提高性能。
问题在于,可能有多种编写执行相同功能但标记化不同的代码的方式。应用代码检查器调整源代码格式有助于消除两个功能等效但不同的代码片段之间的差异。虽然重新格式化代码不是使代码 LLM 良好运行的要求,但它有助于避免可能发生的不必要冗余。例如,考虑使用括号在程序中开始和结束新作用域的 Java 编程语言。现在各种形式的空白不再重要,但会被不同地标记化,特别是由于对于只使用单行代码的作用域来说,括号是可选的!图 6.6 展示了执行相同功能的代码存在不同的合法格式,以及我们理想上如何将这些代码转换为单一的标准表示形式。
图 6.6 一个 Java 代码示例,展示了多种格式化相同代码的方式会导致不同的标记化,尽管每种方式在语义上都是相同的。代码检查器是一种常见的工具,用于强制代码遵循特定的格式化规则。相反,可以使用代码格式化工具创建一个相同的“基础”形式,从而避免表示不必要的信息(如空格与制表符)。
移除代码的非功能性部分称为规范化,这意味着我们将具有格式变化的代码转换为标准或“规范”形式。在这里,我们通过添加特殊标记如<NEW SCOPE>
来展示了一种稳健的规范方法,这些特殊标记捕捉到if
语句存在新上下文的事实,无论它是单行还是多行语句。我们不仅可以添加特殊标记,还可以使用在代码中一致的格式(例如,始终使用空格而不是制表符,在{
之前或之后换行)。特殊解析和格式化都将提高代码 LLM 的性能。添加特殊标记的稳健方法在格式化方面将产生更好的性能,但需要编写和维护一个用于添加这些特殊标记的自定义解析器。在下一节讨论使用 LLM 进行数学时,更改标记化器的问题将更加关键。
6.2 用于形式数学的 LLM
LLM 还可以执行人类通常难以成功完成的数学任务。这些任务不仅仅是执行加法和减法等操作来计算数字;还包括形式和符号数学。我们在图 6.7 中给出了我们所说的形式数学的例子。你可以要求这些 LLM 计算导数、极限和积分,并撰写证明。它们可以产生令人震惊的合理结果。
代码 LLM 是实用的,因为我们可以使用解析器和编译器来部分验证它们的输出。适当的标记化对于创建一个有用的数学 LLM 至关重要。使用 LLM 进行数学研究仍然是一个特别活跃的研究领域[6],因此,让 LLM 执行数学操作的最佳方法尚不清楚。然而,研究人员已经确定了一些围绕 LLM 构建和运行过程中的标记化阶段的问题。
图 6.7 Minerva LLM 可以正确解决的符号数学问题。虽然这个例子将自然语言与数学内容混合在一起,但许多 LLM 使用的标准标记化方法不允许这种数学输出,并可能导致一些令人惊讶的问题。(图片由 Creative Commons 授权自[5])
注意:在第五章中,我们提到微调可以多次应用,数学 LLM(大型语言模型)是这一点的绝佳例子。研究人员通常通过微调通用文本 LLM 来创建数学 LLM,而通用文本 LLM 是通过微调代码 LLM 创建的。在数学 LLM 的每个阶段,SFT(监督式微调)和 RLHF(基于人类反馈的强化学习)之间,对原始下游 LLM 进行多达三到六轮的微调。
6.2.1 清理后的输入
Math LLMs 通常受到输入准备的影响,这些准备对于自然语言文本可能效果良好,但会降低数学概念的表示。在文本中,格式化的数学表示通常涉及像{}<>;^
这样的符号。当处理常规文本时,这些特殊的符号通常会被从训练数据中移除。保留这些信息需要重新编写用于标记化的输入解析器,以确保您不会移除您希望模型从中学习的那些数据。
对于等价的数学方程的多种表示形式进一步增加了训练 LLMs 以类似方式理解数学的难度,就像多种格式在处理编程语言时可能引起问题一样。像 TeX、asciimath 和 MathML 这样的多种格式允许使用纯文本表达数学符号,但提供了为排版者正确渲染方程的指令。这些格式提供了许多表示同一方程的不同方式。我们在图 6.8 中展示了这个问题的一个例子。数学的排版方法(即通过选择 TeX 还是 MathML 来绘制方程)和数学的表示(即表达同一事物的两种数学上等价的方式)都存在问题。
这些都是在我们讨论 LLMs 时多次出现的问题的形式:表示同一事物的不同方式。在数学的情况下,目前的偏好是保持使用 TeX 格式,以及非常相似但使用频率较低的替代方案,如 asciimath,并丢弃像 MathML 这样的冗长内容。我们基于以下三个因素来支持这一动机:
图 6.8 左上角的数学方程展示了数学中出现的两种不同的表示问题。格式良好的数学需要一种排版语言。TeX 和 MathML 是两种不同的排版语言,它们在文本和标记化方面有极大的不同。除了排版语言之外,还有许多方式可以表示相同的数学陈述。
-
基于 TeX 的格式化数学是数学最常见和可用的形式,这得益于像 arXiv 这样的公开资源,它始终使用 TeX 格式。
-
保持所有类似 TeX 的表示形式可以减轻学习多个格式以及因此非常不同的标记集的挑战。
-
MathML 的冗长性使用了更多种类的标记;因此,存储与每个唯一标记相关的数据需要更多的计算资源。
在 LLMs 中将 TeX 作为数学表示的唯一首选格式并不能解决存在多种等效方程书写方式的事实。确定哪些方程是相同的非常困难,以至于研究人员已经证明没有单个算法可以确定两个数学表达式的等价性。(鉴于本节讨论的是形式数学,我们在用词上稍微宽松一些,所以我们将指向来源[7]。)到目前为止,对于 LLMs 来说,最好的答案似乎是由模型尝试自己找出答案,这在迄今为止已经相当成功。但如果我们看到未来数学 LLMs 的开发者大量投资于通过创建更一致的规范表示来改进预处理,从而减少等效表达式的可能表达方式的多样性,我们也不会感到惊讶。
6.2.2 帮助 LLMs 理解数字
对于大多数人来说,数字是数学中更容易接触的部分。你可以把它们放入计算器中并得到结果。尽管可能有些繁琐,如果你没有计算器,你也可以手动进行计算。遵循一组固定的规则就可以得到结果。有些令人惊讶的是,LLMs 在那种死记硬背的计算上有很多困难,但开发者们已经努力提高分词器与数字更好地协同工作的能力。
第一个问题在于标准的字节对编码(BPE)算法产生的分词器为数字创建了不一致的标记。例如,“1812”可能会被标记为一个单独的标记,因为成千上万的文档中都有关于 1812 年战争的引用;分词器可能会将 1811 和 1813 分解成更小的数字。为了进一步探究为什么会发生这种情况,考虑初始字符串3252+3253
以及 GPT-3 和 GPT-4 如何分词这个字符串。GPT-4 会做得更好,因为它似乎每次都以前三位数字开始分词,结果是一个三位数后面跟着一个一位数。GPT-3 看起来不一致,因为它改变了解释数字的顺序,如图 6.9 所示。
图 6.9 LLMs 如果不能一致地分词数字,就无法学习进行基本的算术。在这张图中,下划线表示不同的标记。分词的数字可能代表任何给定数字的十位、百位或千位。GPT-3(左)在分词数字方面不一致,使得加法变得没有必要地复杂。GPT-4 在以一致的方式分词数字方面做得更好(但并不完美)。
现在出现了一个重大问题。GPT-3 的“3”标记在两个不同的上下文中出现了两次,一次在千位(三千二百 ...),一次在十位(三千二百五十 三)。为了使 GPT-3 正确地加这些数字,分词器必须正确地捕获四个不同的数字位置。相比之下,GPT-4 使用每个数字的数字表示顺序,这使得得到正确结果更容易。
人们仍在尝试不同的方法来改变分词器,以提高大型语言模型处理数字的能力。如果我们打算将数字分解成子组件,当前最佳的方法是将每个数字,如 3252,分解成单个数字,如“3, 2, 5, 2” [8]。然而,也存在其他替代方案。
另一种表示数字的有趣方法是称为 xVal [9],其理念是将每个数字替换为表示“一个数字”的相同标记。我们可以称这个特殊标记为 NUM
,它将被我们第三章中提到的嵌入层映射为一个数字向量。
智巧的做法是给每个标记包含一个乘数,即一个与嵌入向量值相乘的第二个数字。默认情况下,大型语言模型为每个标记使用乘数为 1。将任何东西乘以 1 都不会产生任何效果。但对于我们遇到的任何 NUM
标记,它将被乘以文本中的原始数字!这样,我们可以表示可能出现的每一个可能的数字,包括分数值,甚至包括那些没有出现在训练数据中的数字。以这种方式捕获的数字以简单直观的方式相关联。我们将在图 6.10 中更详细地展示这一点。
图 6.10 xVal 使用一个技巧来帮助减少标记的数量并使它们更不模糊。通过修改大型语言模型将数字转换为向量的方式,单个向量表示每个数字,例如数字 1。通过始终使用 1 标记并将其乘以观察到的数字,我们避免了数字标记表示中的许多边缘情况,例如那些从未出现在训练数据中的数字。这种转换方法也使得支持分数数字,如 3.14,变得更容易。
一致数字和 xVal 策略共享一个重要的认识。我们知道如何表示数学和简单的算法,如小学的加法和乘法。如果我们设计大型语言模型以更符合我们作为人类进行数学任务的方式对数学进行分词,我们的语言模型将获得更好的和更一致的数学能力。
6.2.3 数学大型语言模型也使用工具
聪明的读者可能已经注意到,大多数与数学相关的标记化问题都涉及处理数字而不是符号数学。LLM 在改变标记化器并保留通常“不好”的符号(如{}<>;^
)的情况下,无法进行基本的加法或减法运算。通过改变标记化器处理数字的方式来启用计算可能看起来像是一个小问题。然而,它对于良好的符号性能是一个重要因素,并且通常不足以处理其他形式的符号数学。在符号数学上获得最佳性能依赖于外部工具和巧妙地使用 LLM 输出。
如果你曾经使用过能够为你求解导数的 TI-89 计算器,你就知道计算机可以在没有 LLM 的情况下自动化计算。从功能上讲,计算机代数系统(CAS)可以提供这种功能。CAS 实现算法来执行一些(但不是所有)数学步骤。计算导数是其中之一,因此让 LLM 使用 CAS,如 Sympy,有助于确保 LLM 始终正确执行特定步骤。然而,将 Sympy 这样的 CAS 集成到 LLM 中并不能保证整个步骤序列都会被正确执行。
为了验证正确性,数学 LLM 已经开始使用一种名为Lean的编程语言。在 Lean 中,程序是一种数学证明,如果证明中存在错误,程序将无法编译。它有效地将错误的证明步骤视为一种语法错误,然后可以被检测到。一旦检测到,正如我们在其他示例中所示,LLM 可以重新生成输出,直到证明,以 Lean 程序的形式输出,编译成功,就像我们在第 6.1.2 节中展示的那样。
使用 Lean 可以保证从 LLM 返回的证明是 100%正确的,但并不能保证 LLM 能够找到这个证明。值得注意的是,也可能存在 LLM 能够正确解决问题但可能无法使用 Lean 表达所解决问题的情况。我们在图 6.11 中展示了这个问题背后的逻辑,归结为 LLM 中工具使用效果取决于训练数据中工具使用示例的多样性。由于 Lean 相对较新且专业,很少有调整 LLM 以有效使用 Lean 的示例。像我们这样的人需要生成这些示例,以产生合适的训练数据,教会 LLM 如何使用 Lean。
图 6.11 对于某个数学目标,让一个大型语言模型(LLM)使用 Lean(正确路径)可能不会导致一个可验证的正确证明,因为它可能不擅长将 Lean 作为工具使用。让 LLM 生成一个普通证明(左侧路径)可能得到一个正确的证明,但不是一种让我们验证其正确性的方法。
如果 LLM 无法提供其数学正确的可验证证据,你该怎么办?今天使用的一个技巧是多次运行 LLM。因为下一个标记是随机选择的,所以每次运行 LLM 时,你可能会得到不同的结果,每次的结果都不同。出现频率最高的答案最可能是正确的。这个过程不能保证证明是正确的,但它有帮助。
6.3 变压器与计算机视觉
将代码和数学转换为标记的过程相当直观。代码是基本文本,用于以高度严谨的方式告诉计算机做什么。数学转换为标记比较困难,但我们已经讨论了它是如何可能的。计算机视觉是另一回事,其中涉及的数据是使用像素表示的图像或视频。图像标记的概念似乎很令人困惑。我们怎么可能将图像转换为标记呢?图像通常包含大量细节,你不能像将单词连成句子那样将许多小图像组合成一个连贯的图像。尽管如此,如果我们将标记化视为将任何输入转换为数字序列的过程,我们仍然可以将变压器应用于图像。
注意:有一种将图像表示为称为“代码簿”的微小图像组合的方法。代码簿可能很有用,但与我们的讨论精神不同。如果你想了解一些较老的计算机视觉技术,请将此视为一个关键词要点。
在变压器出现之前,高质量的图像识别算法和图像生成器已经存在了很多年。但是,变压器迅速成为机器学习中处理图像的顶级方法之一。严格使用变压器的视觉变压器(ViT)架构,以及混合架构模型,如 VQGAN 和 U-Net 变压器,这些模型将变压器与其他类型的数据结构混合,在解释基于图像的数据和从文本描述生成惊人的计算机生成图像方面都取得了巨大成功。变压器在图像上表现如此出色似乎有些反直觉,因为图像不像自然语言、代码或氨基酸序列那样看起来像离散的符号序列。然而,变压器通过为模型带来全局凝聚力,在计算机视觉中发挥着关键作用。
6.3.1 将图像转换为补丁并反向转换
从概念上讲,我们将用一个新的过程来替换分词器和嵌入过程,该过程输出一系列与我们在第 3.1.1 节中讨论的嵌入层类似的向量序列。创建表示图像的序列的常用方法是将其划分为一组 补丁。因此,我们将用 补丁提取器 来替换我们的分词器,该提取器返回一系列向量。LLM 的输出使用反嵌入层将向量转换回标记。由于我们没有标记,我们需要一个 补丁组合器 来将转换器的输出合并成一个连贯的图像。我们在图 6.12 中展示了这个过程。请特别注意,图中的中心部分与基于文本的 LLM 的情况相同。我们在文本和图像之间重用了相同的转换器层和学习算法(梯度下降)。
图 6.12 在左侧,这个简化的图展示了文本输入在进入转换器之前是如何被分词和嵌入的。然后,反嵌入层将转换器的输出转换为所需的文本表示。当执行计算机视觉任务时,输入和输出将是图像。转换器保持不变,但我们修改了将图像分割成向量序列的方法,以执行补丁提取而不是分词。LLM 使用补丁组合器产生图像输出,类似于文本 LLM 的反嵌入层。
由于除了输入向量序列生成和输出步骤之外的所有内容都保持不变,我们可以专注于图像到向量以及从向量到图像的转换是如何工作的。首先关注输入端将是有帮助的。
如 补丁 的名字所暗示的,补丁提取器将每个图像分割成一系列较小的图像。通常会选择一个固定大小的补丁,比如一个 像素的正方形。我们希望有一个固定的大小,这样就可以轻松地将其输入到神经网络中,神经网络总是处理固定大小的数据,并且大小要小,以便它们只代表整个图像的一部分。将图像分割成补丁类似于将文本分割成标记集合。每个单独的标记并不具有信息量,但与其他标记结合时,它就构成了一个连贯的句子。
一旦图像被分割成补丁,该补丁中的每个像素都被转换成代表每个像素中存在的红色、绿色和蓝色(RGB)数量的三个数字。通过将每个像素的 RGB 值组合成一个单一的长时间向量,创建了一个初始向量。因此,对于我们的像素的正方形,每个像素有三个颜色值,我们将有一个长度为 768 的向量(16 高度,16 宽度,以及每个像素的 RGB 值)。然后,一个可能只有一到两层的小型神经网络分别处理每个向量,以生成最终的输出。这个神经网络实现了一个非常轻量级的特征提取过程,不需要大量的内存或计算资源。这种设计在计算机视觉中很常见,因为第一层通常学习简单的模式,如“内部黑暗,外部明亮”,并且不需要变压器层的高成本或高能耗来学习图像补片的基本特征。整个过程总结在图 6.13 中。
图 6.13 提取补丁是一个简单的过程。补丁提取器将图像分割成称为补丁的正方形瓷砖。图像由像素值组成,这些像素值已经是数字,因此我们将每个补丁转换成一个数字向量。然后,我们在将向量传递给基于完整变压器的神经网络之前,使用一个小型神经网络作为预处理程序。
在补丁提取器中使用的小型神经网络的设计方法有很多种,但所有方法通常都同样有效。一个选择是使用所谓的卷积神经网络(CNN),这是一种理解相邻像素之间相互关联的神经网络类型。其他人则使用了与变压器层组件相同的线性层。在这种情况下,包括小型神经网络和一系列变压器在内的整体模型通常被称为视觉变压器。
小型网络的设计是一个细节,但值得提及,因为它的存在与产生最终输出的补丁合并器相关。无论你选择 CNN 还是线性层作为小型神经网络的架构,但确保输出的形状与输入的形状匹配是至关重要的。例如,如果你有个补丁,你可以使用小型网络强制输出
个值,无论变压器层的本身大小如何。为了产生图像输出,你需要反转补丁提取过程,将向量转换为补丁,然后将补丁组合成图像,如图 6.14 所示。
因此,我们已经成功地将输入分词和输出嵌入替换为新的以图像为中心的层。在许多方面,这比分词更优雅。无需构建/跟踪词汇表,无需采样过程等。这是对变换器作为 LLM 通用核心的通用适用性的关键洞察。如果你能找到大量数据,并且有合理的方法将数据转换为向量序列,你可以使用变换器来解决某些类别的输入和输出问题。
图 6.14 与图 6.13 相比,这里的箭头方向相反。其目的是强调补丁组合器和提取器做的是相同的事情,但操作方向不同。在这个阶段,神经网络更为重要,因为它可以迫使变换器的输出与原始补丁具有相同的形状,因为我们能够控制任何神经网络的输出大小。
6.3.2 使用图像和文本的多模态模型
将 LLM 的输入和输出更改为视觉变换器的能力意味着我们可以以图像为输入,生成图像为输出。这展示了变换器如何产生不同模态的输入,但我们只讨论了输入和输出是同一模态的情况。我们要么以文本为输入和输出,要么以图像为输入和输出。然而,深度学习是灵活的!没有任何东西强迫我们使用相同的模态作为输入和输出,甚至将输入和输出限制为单一模态。你可以将文本作为输入与图像作为输出相结合,图像作为输入与文本作为输出相结合,文本和图像作为输入与音频作为输出相结合,或者任何其他你可能想到的数据模态组合。图 6.15 展示了图像和文本如何给我们提供四种组合方式,我们可以通过这些方式处理不同类型的数据。
通过创建一个以图像为输入、文本为输出的模型,我们构建了一个图像描述模型。我们可以训练这个模型来生成描述输入图像内容的文本。这类模型有助于使图像更易于发现,并帮助视觉障碍用户。
通过创建一个以文本为输入、图像为输出的模型,我们构建了一个图像生成模型。你可以用文字描述一个期望的图像,模型可以根据你的输入创建一个合理的图像。MidJourney 等著名产品就是这类模型的例子。尽管它们的实现涉及不仅仅是视觉变换器,但高级思想是相同的:通过将基于文本的输入与基于图像的输出以及大量数据相结合,我们可以创建跨越不同数据类型的新多模态能力。
图 6.15 展示了四种不同类型的模型输入和输出的组合。最右边的一个例子代表了我们已经了解的正常基于文本的 LLM。向左,我们展示了像以文本作为输入生成图像的模型(“画一个洪水区域的停车标志的图片”)或生成描述图像输入文本的图像标题模型(“这张图片显示了一个被浑浊的水包围的停车标志”)这样的可能性。
6.3.3 前期课程的应用性
在这本书中学习到的其他经验教训仍然适用于这些视觉转换器和多模态模型。最终,它们学会做它们被训练去做的事情,当你试图以训练数据中找不到的方式弯曲它们时,你可能会得到一个不寻常的结果。例如,我们可能会告诉一个图像生成模型“画任何东西,但不是可爱的猫”,你可能会得到如图 6.16 所示的猫。
这些模型(目前)是通过图像和描述图像的文本片段的成对进行训练的。因此,它们学会了对输入句子中的任何东西产生视觉化的强烈相关性。例如,模型想要生成猫,因为输入句子中有“猫”这个词。更复杂的抽象绘图请求,如“画任何东西但”,没有出现在这样的数据集中,因此模型没有被训练去处理这样的请求。
类似地,随着像 ChatGPT 这样的 LLM 将提示作为制定产生期望输出的输入的策略,提示也被开发用于图像标题模型。包含像“Unreal3D”这样的不寻常信息,这是用于为电脑游戏生成 3D 图像的软件名称,以产生具有特定风格和质量输出的情况并不少见。像“高分辨率”这样的词甚至艺术家的名字,无论是生前的还是已故的,都被用来试图影响模型产生特定的风格。
图 6.16 这是由一个老版本的 Stable Diffusion 生成的,这是一个流行的图像生成模型。尽管告诉模型“不要画猫”,但模型被训练生成内容。请求超出了模型被激励去学习的内容,因此它无法处理。这与 LLM 在训练期间看到类似数据时重复输出错误但接近的结果的问题类似。
摘要
-
当 LLM 能够使用外部工具时,它们会受益。例如,一个代码 LLM 可以使用语法检查器和编译器来检测错误代码生成。当 LLM 发现错误时,输出会被重新生成,从而最小化向用户提供无帮助或损坏的代码的风险。
-
标记化器必须修改以支持数学,通过保留用于表达格式化数学的不寻常符号并更改数字表示。我们可以通过给他们提供像计算机代数系统这样的工具来检测和避免错误来进一步提高数学 LLM。
-
Transformer 可以通过将图像分割成块(patches)来应用于图像,其中每个块变成一个向量,并为 Transformer 处理生成一系列输入。从概念上讲,块与文本 LLM(大型语言模型)的标记相似。
-
Transformer 可以使用不同的数据模态作为输入和输出,这允许创建多模态模型,如用于图像标题和图像生成的模型。
第七章:LLMs 的 7 个误解、限制和显著能力
本章涵盖
-
LLMs 和人类在学习上的差异
-
使 LLMs 在延迟和规模敏感的应用中表现更好
-
生成中间输出以获得更好的最终结果
-
计算复杂性如何限制 LLMs 能做什么
多亏了 ChatGPT,世界对 LLMs 及其能力有了更广泛的了解。尽管如此,关于 LLMs 的许多误解和误解仍然存在。许多人认为 LLMs 持续学习和自我改进,比人类更聪明,并且很快就能解决地球上的一切问题。虽然这些说法是夸张的,但有些人真诚地担心 LLMs 将严重扰乱世界。
我们并不是在这里说关于 LLMs 没有合法的担忧,我们将在本书的最后两章中更深入地讨论这些问题。然而,你可能会遇到的许多关于 LLMs 的想法和担忧,与 LLMs 和技术的广泛发展相比,都是被夸大了的。
本章将讨论 LLMs 工作的一些关键方面以及这些方面如何与这些误解相关。最终,LLMs 的这些操作方面会影响你在实践中如何使用或避免使用 LLMs。
首先,我们将讨论人类和 LLMs 学习方式的差异。人类是快速学习者,但 LLMs 默认是静态的。尽管 LLMs 在处理数据方面可能非常有效,但人们在学习新事物时更有可能达到最大生产力。
接下来,我们将探讨在考虑 LLMs 的工作方式时,“思考”一词是如何具有误导性的。我们将强调,将 LLMs 的操作视为“计算”更为合适,因为 LLMs 在制定和输出输出之间没有区别。相比之下,人们通常“三思而后行”。
最后,我们将讨论 LLMs 可以计算的范围以及计算机科学概念如何帮助我们理解 LLMs 当前和未来能力背后的某些内在限制。这三个主题是相互关联的,所以你将看到在我们详细讨论每个主题时它们是如何相互联系的。
7.1 人类学习速度与大型语言模型(LLMs)的比较
虽然我们隐晦地讨论了它,但明确地说明 LLMs 的训练与人类的学习不同是有帮助的。由生成式 AI 产生的流畅且通常清晰的文本以及我们将 LLMs 的能力与人类能力联系起来的类比,可能会让人感觉两者之间似乎存在某种联系。许多在线人士都在宣扬这种联系——LLMs 能做什么和人类能做什么之间的联系是真实的。实际上,两者非常不同,并且对于何时、如何以及为什么你可能更愿意选择人类而不是 AI,以及人类和 AI 如何合作,都有重要的考虑。
从我们迄今为止所涵盖的内容来看,我们知道 LLM 通过使用数亿份文档作为示例来预测下一个单词来学习。在第四章中,我们介绍了 LLM 中“学习”的算法过程:梯度下降算法,通过尝试预测样本输入中的下一个标记来改变 LLM 神经网络的参数。然后,在第五章中,我们展示了微调算法,如 RLHF,如何再次改变 LLM 的参数。LLM 学习中的这两个组成部分与人类学习有最小的相似之处,并对我们期望 LLM 能做什么施加了一些关键的限制。其中最关键的一个方面是这种学习方法的速度和效率,它与训练过程中提供的数据量相关。
为了进一步探讨这个问题,考虑一下 LLM 的学习方式与人类学习方式的差异。你是否遇到过从未与他人交谈过、从未有父母与他们交谈,但 somehow 理解了语言的人?很可能没有。确实,对话是语言习得的关键部分 [1]。至少最初,你通过与他人和环境的互动和交流来获取知识和语言。因此,你可以用比 LLM 在训练数据中拥有的信息少得多的信息来有效地学习。
在儿童语言习得的最佳情况下,研究表明,儿童每月接触到大约 15,000 个总词汇量 [2]。如果我们慷慨地将这个数字四舍五入到 20,000 个单词,并且考虑这个数字超过 100 年,一个人在其一生中会遇到多达 2400 万个口语词汇。这显然是一个巨大的高估。再考虑到大多数人至少在 18 岁之前就能流利地使用母语,并且对词汇和语言结构有隐含的理解,现在将这一点与 LLM(大型语言模型)进行比较。例如,GPT-3 是在数百亿个单词上训练的。仅从单词数量来看,这是一种非常低效的语言学习方法!
语言习得还帮助我们认识到词汇习得方式之间的显著差异。婴儿和幼儿从简单的词汇开始,例如mama和dada,并最终学习基本概念,如颜色、no、food等。随着时间的推移,会逐渐增加更复杂的词汇,建立在先前词汇的基础上。然而,LLM(大型语言模型)是从根据使用频率同时看到所有词汇开始的。确实,可以想象 LLM 将这本书作为其首次“学习”的一部分进行分词,同时获得其最终词汇的全部知识,而不是从简单概念开始,并在这些基础上构建知识。虽然这个过程有助于提高 LLM 的学习速度,但它可能会降低 LLM 在概念之间建立高级关系的能力。
与人类相比,LLM 的关键优势在于其操作的规模和同时执行多项任务的能力。这一优势是机器学习和深度学习中的一个常见主题。你不可能轻易雇佣一支军队来翻阅书籍、费用报告、内部文件或任何信息媒介来执行像撰写评论、寻找潜在的欺诈或回答复杂政策问题这样的知识工作。然而,你可以快速组建一支计算机军队来尝试自动化这些任务。虽然单个 LLM 可以同时分析句子的多个部分,但你可以通过运行相同 LLM 的多个计算机并行工作。训练 LLM 也提供了类似的机会:LLMs 是在你一生中可能阅读或听到的单词数量之上训练的,你可以通过租赁或购买数千台计算机来同时进行大量工作以训练一个大型 LLM。
结合我们在前几章中讨论的内容,我们可以列出使用 LLMs 进行任务与人类相比的几个高级优缺点。这些因素的总览如图 7.1 所示,它描述了 LLMs 的优势和劣势将如何导致其使用的自然益处和弊端,从而提供关于 LLMs 应该和不应该在何处使用的见解。
图 7.1 相对于人类执行相同任务,LLMs(大型语言模型)的优缺点总结。这些自然地引发了你使用 LLMs 时必须评估的考虑因素。从这些因素中,我们可以得出关于成功使用 LLMs 的广泛建议。
LLM 的一些好处如下:
-
经过良好训练的 LLMs 拥有广泛的背景信息,因此在许多与之前所见不太不同的任务上表现良好,而且几乎不需要做额外的工作来使模型有效。虽然这并不一定是正确或详细的信息,但 LLM 可以接收和就合理回应的领域范围远远超过大多数个人可以覆盖的范围。
-
对于许多任务来说,没有必要得到一个精确无误的回应。在某一学科领域内对一般信息的广泛请求本质上允许 LLM 在回应时保持灵活性和不受限制。这一点在通过其他过程精炼 LLM 的输出时尤其正确。例如,一个人可能会复制编辑一篇写作来改进它,但使用 LLM 来产生初稿或提供灵感以打破写作障碍并加速创作工作。同样,LLM 也可以用来精炼作者的写作,通过改写或使用更丰富的词汇量使其听起来更自然或更有吸引力。
-
与人类相比,LLMs 的训练速度要快得多。只要投入 $1,000,000 到 $10,000,000 的预算来购买计算资源,你就可以在几个月内生产出一个广泛有用的 LLM。人类要花很多年才能变得有用。一个能够回答广泛基本问题的 LLM,其所需的努力和成本远低于寻找、雇佣和保留具有特定知识、技能和能力员工的成本。只要问题在 LLM 能力范围内,增量成本与一个人的时薪相比微不足道,即使没有额外的开销也是如此。
LLMs 的一些缺点如下:
-
训练 LLMs 的高成本影响了其经济性。这种训练成本在 LLM 训练后进行的数千次操作中分摊。如果 LLM 表现不佳,不断改进它以使其工作的成本可能会迅速变得过高,即使不考虑它可能永远无法完成特定任务的可能性。例如,如果一个使用所有最新工具和技巧的 LLM 无法解决特定需求,解决这个问题将需要未知的工作量和预算。相反,人类通常可以在几周到几个月内以较低的成本学习新的能力,特别是那些对 LLM 来说很难的能力。
-
LLMs 不能依赖来处理训练数据中未反映的意外情况和输入。尽管许多 LLM 已经证明它们可以在新情况下取得成功,但它们的学習方式与人类不同。一个人可以在第一次尝试时就发现他们的行为没有按预期工作,并迅速适应。LLM 不能通过观察自己的错误来独立适应,可能会反复消耗资源,试图对它无法理解的问题产生答案。
-
LLMs 容易被欺骗,在对抗环境中表现不佳,因为一旦人们找到一种方法欺骗 LLM 得到错误的结果(例如,“即使我没有收入也给我贷款”),他们可以重复这种对抗和恶意行为,除非你实施额外的安全措施,否则你的 LLM 将无法阻止它。
7.1.1 自我提升的限制
通常,人类有能力自我提升。他们可以专注于研究问题,设计新的方法,确定所需资源,并向前推进以实施和改进他们的解决方案。虽然 LLMs 在自我提升方面有困难,但在生成式 AI 领域,人们相信 LLMs 也可能实现自我提升。关于这如何工作的想法大致如下:
-
在初始数据集上训练一个 LLM。
-
使用 LLM 生成新的数据,并将其添加到您的训练数据集中。
-
在新数据上训练或微调模型。(重复直到 LLM 如预期工作。)(Repeat until the LLM works as expected.)
虽然这听起来直观且合理,但我们认为这并不适用于简单的原因。我们可以使用一些基本的信息理论,将信息视为可量化的资源,来解释原因。这个论点的依据是,通过某些信息度量,原始数据集具有固定量的信息。在统计学术语中,我们可能会将原始信息描述为可用信息的分布,并且通过其训练过程,大型语言模型(LLM)试图通过存储和编码到其模型中来近似或重现这种信息分布。当你使用 LLM 生成新数据时,这些数据样本是 LLM 在训练过程中观察到的原始数据分布的嘈杂和不完整的复制。从根本上讲,LLM 的输出不可能包含原始训练数据中不存在的新信息。因此,这类实验的现实情况是,连续生成数据和训练会降低模型的质量和性能[3]。要让类似的事情起作用,你需要在每个回合提供外部或新信息。
这些概念也与一些人害怕 AI 自我改进,直到它变得如此智能,以至于我们无法理解或控制它有关。一些论点是 LLM 可以使用其他工具,以某种方式获取外部信息或更多训练数据来改进自己。最终,这需要相信虽然大多数技术的改进都有局限性,但 LLM 将不受这些限制的影响,例如递减回报定律。图 7.2 描述了 LLM 自我改进的固有限制。
图 7.2 LLM 将自我改进的担忧需要相信 LLM 不会遵循描述几乎所有其他技术发展的正常 sigmoid 或 S 型递减回报曲线。为了无限自我改进的发生,我们必须相信诸如电力、数据或计算能力之类的限制总是可以解决的,并且人类会在 LLM 之外的其他领域解决这些问题。这类限制是为什么我们可以用 S 型曲线来描述大多数技术发展,随着更多限制的生效,进步会放缓。换句话说,我们最终会达到一个状态,我们不能再仅仅通过建造更大的计算机来解决问题。
技术改进限制的一个很好的例子是摩尔定律,它大致表明,芯片上的晶体管数量每 18 到 24 个月就会翻倍。摩尔定律在很大程度上准确地预测了芯片上晶体管数量的增长,但晶体管数量减少的 S 曲线迹象已经出现。芯片上晶体管数量翻倍的速度正在下降。更重要的是,整个系统的性能已经进入了这个 S 曲线。晶体管数量与总计算性能相关,但并不直接指示计算性能。从图 7.3 的整体情况来看,你会看到其他限制因素阻止了整个系统的无限改进。抛开摩尔定律不谈,高性能 GPU 及其基础设施的实际成本也是无限改进的另一个障碍。
LLM 不是人类——不要用人类的标准来评判它们!
许多引人注目的标题宣称了大型语言模型(LLM)在医学院入学考试、律师执业资格考试以及智商测试中的表现,这些测试旨在衡量他们的智力。虽然这些内容总是很有趣,但它们充满了诸如“LLM 的训练数据中有多少个相同类型的问题的例子?”之类的警告,但这些并不是关于 LLM 及其相对于人类能力的推断的好方法。事实上,精确地定义智力是复杂的,这也是为什么存在多种类型的智商测试的原因之一[4]。最终,这些测试在预测人们在各种任务中的结果方面是有帮助的。然而,这些测试并不是为了评估 AI 算法,我们没有理由相信它们能够准确或合理地做到这一点!问题是相关性,而不是因果关系。智商测试都与期望的结果相关,但它们并不测量控制或以相同方式导致结果的潜在属性,例如血糖测试那样。在血糖测试中,如果你的血糖过高或过低,我们知道会发生什么,因为它是测量一个重要的潜在属性,这个属性导致了我们非常了解的一些过程的后果。智商测试是有用的,但它们的用处来自于多年的迭代和改进。我们现在更好地理解了这些测试上的哪些答案与人们的表现相关,但它们并不测量这种表现的潜在原因。
图 7.3 摩尔定律是无限增长的一个常见例子,但它具有误导性。晶体管数量持续翻倍,但频率、功率、单线程性能和总计算并没有。因此,整个系统的性能并没有继续大约每两年翻倍。其他类似因素将限制 LLM 的性能,并随着时间的推移影响其能力。本图使用 CC4.0 许可,来自github.com/karlrupp/microprocessor-trend-data
。
有许多使用外部信息来改进生成式 AI 的例子。一些为机器人手设计的算法使用来自物理模拟器的外部信息。苹果公司使用 3D 建模软件生成数据,以改善其手机上的虹膜识别[5]。在 6 章的例子中,你看到了使用代码编译器或 Lean 语言来验证数学的潜在途径,以改善 LLM。这些例子展示了完全可自动化的过程,可以生成新的信息,从而实现自我改进。
然而,从未有过无限自我改进的例子;使用这些外部工具观察到的收益最终会达到一个平台期,最终依赖于人类通过为机器人编写更好的物理模拟器、更好的代码编译器和更好的领域知识系统(如 Lean)来开发辅助信息。改善这些工具增加了训练 LLM 的主要成本,从而在实用范围内对 LLM 的自我改进施加了第二个经济限制。
7.1.2 少样本学习
少样本学习也称为上下文学习。这种技术涉及在发送给 LLM 的提示中提供你希望 LLM 产生的输出类型的示例。比如说,你希望 LLM 能够用准确的信息回应帮助台的问题。你可以给 LLM 一个用户向帮助台提出的问题的提示,然后提供一个适当的响应示例。如果你只提供一个示例,那么它被称为单样本学习。用两个示例而不是一个示例来代替称为双样本学习,依此类推,因此将这种方法描述为少样本,因为提供的示例的确切数量通常并不像只提供少量示例这一事实那么重要。在图 7.4 中展示的将示例纳入提示的方法是一种特定的提示工程。
图 7.4 以你希望 LLM 产生输出为例的提示称为少样本提示,因为 LLM 在其训练数据中尚未看到任何此类特定行为的示例。在你的提示中,你可以包括类似于 RLHF/监督微调(SFT)的输入和输出示例。这种提示风格通过提供所需输出的示例来鼓励模型产生所需的输出。由于 LLM 在如此大量的未标记数据上训练,k 样本示例是获得更好结果的最小努力的有效方式。
在你的提示中包含示例对于提高 LLM 在新任务上的表现很有用。你不需要使用 RLHF 或 SFT 来改变模型,而且它比零样本提示更有效,在零样本提示中,我们要求 LLM 在没有示例的情况下完成任务。但这是否是有效的学习?
少样本提示不是训练,因为我们没有以训练或微调过程中那样以任何方式改变模型。LLM 的“状态”或权重保持不变。无论 LLM 在周一的任务表现多么准确,它在周二和周三的表现也将完全一样,无论它处理了多少个千或百万个少样本提示。除非你手动做一些事情,比如在提示中包含更好的示例,提供更多示例,或者以其他方式干预,否则模型的能力不会有所提高。从这个意义上说,并没有真正的学习发生,模型也没有任何变化。我们只是通过改变提示来获得模型改进的输出。
然而,从抽象意义上讲,LLM(大型语言模型)在学习,因为提示通过提供额外的上下文来描述问题,从而改变了模型的行为。通过提示所表现出的行为与在类似示例上通过微调所实现的行为相关联[6]。简而言之,这意味着少样本学习并没有从根本上反映与梯度下降可以做到的不同之处。
注意:如果你没有很多数据,作为从业者或用户,少样本提示可能是你让 LLM 在你数据上工作得好的最有效方式。因为我们可以把这种提示看作是低效的梯度下降或微调,所以当你以少样本风格添加示例时,你应该预期到收益递减。例如,如果你在提示中包含了大量你希望 LLM 如何响应的示例,但仍然没有得到所需的表现,你应该考虑 SFT(强化学习与人类反馈)、RLHF(强化学习与人类反馈)以及我们在第五章中讨论的其他微调方法。
7.2 工作效率:10 瓦特的人脑与 2000 瓦特的计算机
人类大脑维持意识所需的能量相当于 10 瓦特,这使得你能够阅读这本书。一个配备 GPU 用于 AI/ML 工作的高端工作站可能轻易消耗 2000 瓦特。而运行今天可用的更大 LLM 的高端服务器,其功耗可达到 10000 至 15000 瓦特。乍一看,使用 LLM 似乎比让人类完成任务要低效 1500 倍。我们应该为此方面我们进化成功和效率感到非常自豪,但这只是我们可能所说的效率的一个方面。我们在图 7.5 中展示了许多不同类型的效率可能对人类和机器都有益。
图 7.5 使 LLM 工作的昂贵硬件导致了许多权衡。例如,使用 LLM 的启动成本通常很高,而且它们不能独立适应。这种缺乏独立适应导致了许多自然弱点,在这些弱点中,人类的表现会优于 LLM。一些弱点,如模型未经训练不会改变的事实,可以被视为优点。如果每个新运行的 LLM 行为不同且不可预测,您将无法获得可重复的过程,这些过程易于扩展。
7.2.1 电力
电力是决定创建和运行 LLM 财务成本的一个驱动因素,但真正的需求尚不明确。是的,许多提供商会为您提供运行 LLM 的价格,但我们不知道每个提供商实际承担的成本或每个提供商设定的利润率。例如,LLM 提供商可能正在运行负利润率或损失领袖策略,而使用 LLM 的长期成本可能比基于今天的价格看起来要高。我们知道 LLM 对电力产生了巨大的需求,以至于大型科技公司正在制定计划,建设核电站以支持未来数据中心运行所有预期模型所需的电力[7]。基于这一点,我们可以预期,新的 LLM 将更大、更耗电,但它们的价值将抵消为数据中心建设专用电厂的成本。
基于此因素,当成功的 LLM 解决方案产生更多需求时,需要格外小心;在满足这一需求时,可能会遇到电力容量问题。同时,还需要注意电力成本的弹性。不仅 LLM 提供商可能会改变成本结构,而且如果您自己托管 LLM,美国的电力价格波动确实存在[8]。如果您的目标用户群只有 20,000 人,这可能不是问题,但如果您计划构建能够服务数百万甚至更多用户的产品,电力成本可能成为重大的运营和环境风险。
7.2.2 延迟、可扩展性和可用性
延迟是从查询 LLM 到获得某些输出的时间,可扩展性描述了从单个 LLM 到一千个 LLM 运行的快速转换能力,可用性描述了 LLM 24/7 运行的能力。这些都是 LLM——更广泛地说,是计算机——相对于人类的重大优势。LLM 和 AI/ML 可以比人类更快地应对更多情况,在任何时候都能做出反应。这种反应速度既有好的一面,也有不好的一面。当您有一个需要监督和审查输出的系统时,如果没有制定与人员配备计划相匹配的方案,您将无法获得 LLM 的全部可用性优势。
7.2.3 精炼
正如我们在第 7.1.1 节中讨论的,LLM 难以自我改进。然而,人们可以并且确实在改进,随着时间的推移提高过程效率是一个共同的目标。您需要让人们在循环中,以设计更好的提示和创建更好的训练方案来提高 LLM 的效率;没有他们,LLM 的性能将不会提高。
提高大型语言模型(LLM)的效率并不仅仅涉及升级到更新的 LLM 或微调现有模型,还包括构建基础设施和记录输入、输出以及性能指标,以研究哪些方法有效,哪些方法无效。您可以使用我们在第 5.5.2 节中讨论的 DSPy 等框架来捕捉这些项目,并识别和处理随着世界环境变化而无法正常工作或开始失败的案例。例如,您可能会开发出一个表现良好的初始 LLM。但那些该死的孩子们不断向 iDroids 和 appleBots[9]添加新的表情符号。如果没有额外的训练,您的 LLM 将无法理解这些新的表情符号,但您的客户不可避免地会开始使用它们,因此系统将开始表现不佳。如果您不记录 LLM 的输入和输出日志,或者不征求能够提供 LLM 失败或成功领域信息的用户反馈,您将永远无法发现这一点。捕捉这些信息对于改进和精炼过程至关重要,而 LLM 没有人类干预是无法做到这一点的。
注意:表情符号问题是一个很好的例子,说明了为什么消除编码并仅使用 LLM 可能永远不会发生。表情符号将是 LLM 在训练数据中从未见过的新的标记,因此它本质上将无法处理它们。我们如何在实践中处理这个问题呢?我们的第一次尝试将是编写代码来检测表情符号,并用表情符号的外观、意图和内涵的描述来替换它们。这可能在每种情况下都不起作用,这就是为什么你需要测试和验证。
在机器学习领域,人们给予了数据漂移概念相当多的关注,即现实世界中的数据不断演变,超出了模型训练数据所捕获的内容。在处理自然语言时,表情符号只是现实世界数据随着时间的推移而变化的一个具体例子,因为语言的使用方式在演变。表情符号的例子可以扩展到包括由新术语或语言中现有单词的新用法引起的问题。通过查看该领域的现有工作,我们可以确定用于测量和减轻 LLM 数据漂移的额外技术,例如收集额外的训练数据、微调模型或修改提示以包括对先前未见术语的补充定义。
7.3 语言模型不是世界模型
你可以从一个语言模型(LLM)中频繁地获取关于世界的准确信息。因此,很容易假设一个语言模型知道关于世界的一些事情。确实,作为这本书的读者,你可以在不采取任何特定行动的情况下对世界和将要发生的事情进行推理。现在,我们不是在讨论像预测股市这样复杂的事情,即使是简单的行动和思考。例如,如果你告诉某人他们的毛衣很丑会发生什么?
你不需要与环境互动或找到一件丑陋的毛衣来回答这个问题。你不需要说话或与任何人或任何事物互动来回答这个问题。你可以想象毛衣的“世界”以及其他人可能有的感受,并推断出结果。如果我告诉你有人在圣诞派对上(可能是一个丑陋毛衣大赛)穿着这件毛衣,你就可以更新你对世界的心理模型,并推断出结果,即使你没有亲身经历过。LLM 在说话之前不能思考。生成文本是 LLM 最接近“思考”的时候(在这个上下文中我们松散地使用这个词)。你可以在图 7.6 中看到一个简单的例子,其中 LLM 过于冗长的推理最终导致它给出一个很好的评论。推理,无论是我们人类隐式或显式地进行的,与我们谈论我们推理的事物是不同的。对于 LLM 来说,没有过程之间的分离;要“思考”更多关于答案,就需要产生更多的输出。因此,LLM 不能在没有生成输出的情况下进行思考。
警告:在 LLM 的上下文中,我们松散地使用“思考”这个词。为了严谨,我们的意思是 LLM 为了回答问题所做的计算不是动态的。输出 10 个标记所需的工作量与这些标记的内容无关。回答一个需要人类更多思考的复杂问题可能需要 LLM 进行更多的计算,但这通常意味着 LLM 也必须产生更长的输出,即使答案本身不应该更长。每当有人将“思考”一词与 LLM 结合使用时,最好将“思考”替换为“计算”。
图 7.6 某人穿着或做某件不寻常的事情的背景和原因可能属于 LLM 能够正确识别并对此产生适当反应的领域。然而,LLM 可能无法不产生一些中间文本就达到那个适当的反应。对于一个数学问题,这个中间文本可能是有用的,但中间文本可能并不总是适合或希望用户看到。
这个例子表明,LLM 在没有生成关于规划过程的文本的情况下无法进行规划。如果 LLM 没有生成文本,它就好像不存在一样。有一些方法可以构建提示,以鼓励 LLM 将其输出分解以模拟规划。这通常被称为 思维链(CoT)提示,其中在提示中包含类似“让我们逐步思考”的陈述。这种逐步指令通常可以提高模型执行任务的能力 [10],但为什么这能提高性能尚不清楚。再次强调,对“思考”含义的不确定性可能导致对 LLM 能做什么和不能做什么的不合理期望。
即使有认知理论(CoT),LLM 仍然会犯许多错误,例如遗漏步骤、遗漏计算和进行逻辑上无效的推理 [11]。其他因素可能也会导致 LLM 将输出分解成一系列步骤时观察到的性能提升。考虑以下情况:
-
在第三章中,我们学习了关于变压器及其实现中使用的注意力机制。我们了解到,LLM 收到的输入和产生的输出越长,变压器进行的计算就越多。那么,逐步思考之所以更有效,仅仅是因为 LLM 通过变压器能够进行更多的 计算 吗?如果 LLM 有一个世界模型,它可以在不生成输出的情况下对输出进行这些计算。
-
LLMs 反映了其训练数据的特点。训练数据中可能包含与“逐步思考”和其他更冗长且通常正确的教学材料相关的内容。最终,我们可能需要手动将 LLM 的模糊回忆与更相关的训练文档对齐,而不是让 LLM 执行根本不同的功能。
警告:对“世界模型”的精确定义尚未达成共识,不同的人可能会有不同的理解。在讨论世界模型时,首先讨论定义是一个好主意,这样大家才能有共同的理解。许多关于大型语言模型(LLM)的讨论都是各自为政,这一点我们将在本书的最后两章中进一步讨论。
这些问题具有挑战性,涉及开放性研究问题。我们的观点是,LLM 的戏剧性失败表明这些解释比更深层次的原因更有可能。重要的是,一些专门的研究关注于将世界模型注入机器学习方法。一个技术但相对容易理解的 2018 年例子来自 David Ha 和 Jürgen Schmidhuber,可在网上找到(worldmodels.github.io/
),与当时的方法相比,它展示了巨大的性能提升。其他人正在努力为 LLM 创建世界模型,并使用 LLM 作为世界模型 [12]。当前的方法没有人类那样高的灵活性;这些例子在范围上更为有限,适用于一类通用问题。
7.4 计算限制:难题仍然很难
有些人担心“失控”的人工智能,即一个 AI 算法变得如此先进和强大,以至于它可以解决我们从未能解决的问题,并且这样的 AI 可能不会有与人类福祉相一致的目标。如果这样的 AI 存在,它可以通过我们无法改进自己的方式来改进自己,从而产生更加强大的人工智能。许多人让这种想法泛滥,想象一个大型语言模型(LLM)将在能力和推理能力上几乎达到神一般,并超越人类。这里有一个伦理问题,我们将在本书的最后一章进行更多讨论。目前,有一个简单的技术原因让我们对这种想法不太担心,这也帮助我们理解了 LLM 的现实局限性。本质上,有许多方法可以衡量我们所说的计算复杂度或算法复杂度。通过比较 LLM 与其他研究得很好的算法的复杂度,我们可以更具体地了解 LLM 能够和不能做到什么。我们还将讨论使用 LLM 对问题进行近似求解时,在适当的情况下,如何避免对相同问题的精确解的一些复杂性。
在计算机科学中,我们花费大量时间学习算法的复杂性。对于大多数学生或从业者来说,这意味着理解输入数据量的变化如何影响一个过程产生结果所需的时间。在现实中很少发生的一个更理想的案例是,如果你将输入加倍,过程将需要两倍的时间。换句话说,对于一个处理个项的过程(在 LLM 的情况下,一个项可能是一个标记),需要 4 天时间处理
。在讨论计算机科学中的复杂性时,我们经常使用一种称为大 O 记法的数学符号来传达不同复杂性的级别。当一个过程的计算时间与其输入大小以相同的速率增长时,它被称为线性复杂度,在大 O 记法中表示为
)。如果你在 x 轴上绘制数据大小,在 y 轴上绘制计算时间,你会得到一条直线,因为数据和计算时间以相同的速率增长。其他常见的现实世界复杂性包括对数线性(
),其中
可能接近 4.4 天;二次(
),其中
可能接近 8 天;以及指数(
),随着输入大小的增加,计算时间增长得如此之快,以至于有很好的机会在算法完成之前世界将不再存在。在这些情况下,输入大小与计算时间的图表随着系统的复杂度增加而变得更加陡峭。换句话说,对于更复杂的算法,随着处理的数据量增加,处理时间将增长得更快。
我们这次短暂的计算机科学之旅是为了帮助你理解运行 LLM 的计算复杂性。对于一个包含个项的输入,LLM 的计算复杂度为
或二次复杂度。如果我们能证明一个算法/任务需要超过
的工作量,那么我们实际上已经证明了 LLM 无法有效地解决这个问题,因为 LLM 的核心算法无法执行这种复杂度的算法,精确地说。
警告:这不是一个关于形式方法或算法的硕士课程;我们正在提供一个关于算法复杂性的快速概述。目标是给你,读者,一个关于这个问题的技术直觉,但我们还没有完全装备你所有讨论这个主题所需的知识。要了解更多关于算法和复杂度的信息,请参阅 Aditya Y. Bhargava 的书籍《Grokking Algorithms:程序员和其他好奇者的图解指南》[13]。
如果可能让一个 LLM 解决一个需要,比如说,的三次复杂度的问题,但 LLM 本身的复杂度(更小)为
,那么我们就会有一个逻辑矛盾。换句话说,LLM 不能比复杂度分析所表明的更快地解决复杂问题。许多现实世界的任务和算法的复杂度比
更差。我们在表 7.1 中描述了一些例子,你会发现我们所列出的少数与物流或资源分配有关。例如,递送包裹和重新安排航班是具有主要痛苦算法复杂度的问题。
表 7.1 一些具有不同时间复杂度的重要算法示例
我们关注算法的第二个重要且相关的原因是算法的复杂度类。复杂度类定义了一个算法可以解决的算法的可能范围。最著名的复杂度类是(对于多项式)和
,这些是需要至少
时间才能完成的问题。这些非常广泛的类别基本上包含了你可能关心的所有问题。
注意:许多人认为代表“非多项式”,但这是不正确的!它实际上意味着“非确定性多项式”。
有趣且信息量丰富的是,William Merrill 和 Ashish Sabharwal [14]证明了 LLM 解决问题的能力与它在中间步骤中生成的标记数量相关。对于 LLM 来说,生成响应属于一个称为的复杂度类(我们知道,计算机科学家在命名事物方面是最差的)。这个复杂度类非常严格,意味着 LLM 几乎解决不了任何问题。随着中间步骤
变长,你最终会达到
的复杂度类。这意味着 LLM 永远不能解决 NP 或更难的现实世界问题!我们在图 7.7 中将这一切联系起来,该图显示了这些复杂度类层之间的关系。
图 7.7 计算复杂性(假设
,对专家来说是一个小问题)之间的关系。顶部的箭头给出了新复杂性类允许你解决的问题的例子。底部的箭头显示了 LLMs 在其复杂性方面的位置。
这个发现甚至更有害,因为复杂性类描述了你能够解决的问题的类型,而不是你解决它们的效率。例如,LLM 必须生成大约个标记来解决涉及
复杂性的算法。然而,LLM 还需要
时间来处理
个标记,因此你最终得到
的计算工作量,这是一个复杂性的巨大爆炸。此外,这个复杂性估计没有考虑到 LLM 的训练数据和开发提示以使 LLM 成功执行算法而不出错所需的时间。
7.4.1 使用模糊算法解决模糊问题
关于算法和复杂性的这次讨论可能听起来对 LLMs 非常不利。实际上,只有当你想将 LLMs 应用于需要正确输出的问题时,它才是有害的。如果你的系统中即使是最小的错误也是不可接受的,那么你不应该使用机器学习,更不用说 LLM 了。
就像机器学习一样,LLMs 在模糊问题上表现最好,因为难以描述什么是对的或错的。在模糊问题中,通常情况下,如果存在错误是可以接受的;其他过程可以纠正这些错误,或者错误的成本可能足够小,可以忽略。这就是为什么文本和自然语言非常适合 LLMs。像“苏西在电子邮件中是什么意思?”或“约翰在文本中是否有意暗示?”这样的问题答案本质上是模糊的。人类语言充满了不精确、澄清和重复,这与 LLMs 解决需要一致和精确答案的问题的难度相吻合。
7.4.2 当对于难题来说足够接近就是好的时候
为了反驳我们自己一会儿,我们也应该指出,当我们用“solve”来表示“找到没有更好解决方案的最优解”时,人类无法解决 NP-hard 问题。我们使用近似值来解决复杂问题,因为我们知道它们太难完美解决了。
例如,在第 7.1 表和第 7.7 图中,我们提到了旅行商问题,这是配送路线规划中的一个著名且重要的问题。邮递员希望在尽可能短的时间和距离内,不重复任何路线,将所有人的邮件全部投递。从计算的角度来看,找到最佳路线是 NP 难题,因此只能应用于几百个或可能是一千个配送目的地。然而,存在许多更快的二次算法可以近似这个问题,并且我们可以证明它们给出的路径不会比最小距离路线的旅行距离更差。因此,在现实世界中,我们使用这些和其他技术来获得“足够接近即可”的解决方案。同样,LLM 可能也能获得“足够接近即可”的解决方案,但它们仍然受限于它们在精确问题上的低效性。
如果没有理解 LLM 的训练数据,我们很难估计它通过近似可能解决一个困难问题的效果如何。考虑一下,棋局在技术上比 NP 难题更难。GPT-3.5 可以玩一局相当不错的棋局,可以击败一个真实的人类[15],尽管它达不到专业棋程序所能达到的“支配所有人类”的水平。这表明 LLM 擅长近似解决非常困难的问题吗?
可能不是。首先,ChatGPT 的棋局在添加棋局作为评估指标后显著改进了(github.com/openai/evals/pull/45
)。怀疑 ChatGPT 的制作者进行了包含将棋作为明确目标的微调是合情合理的。其次,互联网上充满了供人们学习和探索的棋局(old.chesstempo.com/game-database.html
),因此 ChatGPT 很可能在其训练数据中训练了捕获的完整棋局。
仍然很有趣的是,ChatGPT 可以利用其训练数据中的内容来玩一局合理的棋局,将之前看到的情况与未来略微不同的情境相匹配。在考虑基于 LLM 的解决方案在哪里最能发挥作用时,我们推荐以下思维框架:将 LLM 应用于重复性、轻微变化的难题,以最大化其效用。例如,文本摘要、语言翻译、撰写文档初稿和检查现有写作都属于这一类别。
深度学习的其他领域也提供了类似的教训,在这些领域中,比 LLM 更容易推理出模型内部发生的事情。例如,玩围棋几十年来一直是人工智能研究中的一个长期挑战。人工智能最近才能够在游戏中击败冠军级选手。像 LLM 一样,玩围棋的人工智能通过观察许多示例游戏进行训练。然而,如果你构建了一个执行不寻常和/或无意义的移动的围棋机器人,它可能会击败“超人”人工智能,但会输给人类业余爱好者[16]。这个例子也突出了在对抗性环境中使用 LLM 的风险,在这种环境中,人类在处理情况中的重大新颖性方面远比当前的 AI/LLM 更胜一筹。
摘要
-
LLM 相较于人类最大的优势是它们实现的规模。LLM 可以以低成本运行,24/7 不间断,并且可以轻松调整规模以满足需求,而无需像培训或减少人力那样付出大量努力。
-
人类在处理高度新颖的情况方面更胜一筹,这在人们与 LLM 互动可能是对手(例如,试图进行欺诈)的情况下非常重要。
-
我们知道 LLM 在处理与它们在训练数据中之前看到的问题类似的问题时表现良好,这使得它们对重复性工作很有用。
-
除非你能投入大量努力和资金进行数据收集和微调,否则提示工程可能是“教授”LLM 新知识最有效的起点。
-
LLM 无法自我改进,在需要特定正确答案的算法问题解决上效率低下。它们在存在一定范围内令人满意的输出和一定程度的错误可接受的情况下工作得最好。
第八章:使用大型语言模型设计解决方案
本章涵盖
-
使用检索增强生成来减少错误
-
LLM 如何监督人类以减轻自动化偏差
-
通过嵌入启用经典机器学习工具
-
对公司和用户都有益的展示 LLM 的方法
到现在为止,你应该对 LLMs 及其能力有了深刻的理解。它们产生的文本非常类似于人类文本,因为它们是在数十亿份人类文本文档上训练的。它们产生的内容很有价值,但也可能存在错误。而且,正如你所知,你可以通过结合领域知识或像解析器这样的工具来减轻这些错误。
现在,你已经准备好使用 LLM 来设计解决方案了。你如何考虑到目前为止我们所讨论的所有内容,并将其转化为一个有效的实施计划?本章将引导你了解设计该计划的过程、权衡和考虑因素。为此,我们将使用一个我们都能相关联的运行示例:在需要帮助时联系技术支持。
首先,我们将考虑显而易见的路径:构建一个聊天机器人。聊天机器人是许多人了解大型语言模型(LLMs)的媒介,因为它们通常能够很好地进行交互式输出。我们将评估在客户服务场景中部署由 LLM 驱动的聊天机器人的风险。通过这次讨论,你会发现使用 LLM 相比其他选项可能会增加风险。然而,如果风险足够小,一个简单的聊天机器人可能是一个有效的选择。
接下来,我们将探讨通过使用改进客户与 LLM 交互的应用设计来管理风险的方法。我们将讨论由于自动化偏差这一现象,让一个人检查 LLM 产生的每个输出充满了问题。我们将讨论如何通过让 LLM 监督人来在一定程度上避免自动化偏差。我们将探讨如何将 LLM 的嵌入(文本编码为数字的语义表示)与经典机器学习算法相结合,以应对这一风险并处理 LLM 无法独立执行的任务。
最后,我们将探讨技术如何呈现给用户,并在建立信任和传达其内部工作原理方面发挥关键作用。我们将讨论“可解释人工智能”这一领域,其中机器学习算法产生描述或解释其如何到达特定输出的输出。可解释人工智能通常被采用来处理人们需要了解 LLM 如何工作的情况,但研究表明,尽管可解释性可能通过用人类术语描述这些模型的行为来揭示 LLM 的内部工作原理,但它并不总是为了自身的目的而有所帮助。相反,我们将描述关注透明度、与客户利益一致以及创建反馈循环以设计解决方案的好处,这些解决方案能够更好地满足雇用它们的公司和与之互动的客户的需求,通过提供准确的输出并在业务流程中创造效率。
8.1 只做一个聊天机器人?
毫不奇怪,许多人正在使用基于 transformer 架构的 LLM 来构建聊天机器人,这正是 ChatGPT 所依赖的技术。这是一个明显且看似合理的第一步。ChatGPT 与人类互动、适应对话、检索和呈现信息的出色能力展示了 LLM 技术在客户交互应用中的支持效果。随着 LLM 的出现和可用性,尝试使用任何其他方法(如使用训练有素的专家系统,该系统使用决策树和预设响应)来实现客户服务代理可能过于短视。当不满意的客户遇到一些技术问题时,他们可以直接与一个 AI 驱动的工具进行交互,以解决他们的问题,而不是搜索在线常见问题解答(FAQ)文档,将电子邮件发送到工单系统的黑洞中,或者拨打一个具有自动交互语音响应系统的电话号码。这听起来在纸上很美好,如果你画一个像图 8.1 那样的简单图,确实看起来我们正在简化生活。
图 8.1 当查看流程图时,似乎用基于 LLM 的聊天机器人来替换 FAQ、电子邮件工单和支持电话号码可以简化并优化流程。然而,这种观点的愚蠢之处在于流程是不完整的。确保 LLM 能够准确执行所需的潜在错误和补救措施是隐藏的,并增加了复杂性。
当然,有些情况下使用聊天机器人是个好主意。但令人惊讶的是,由于需要构建一个在许多情况下准确可靠且不会在遇到意外输入时产生意外输出的系统,基于在线 LLM 的聊天机器人可能并不是大多数公司客户支持工具列表上的首选。最终,决定使用 LLM 来实现客户支持聊天机器人的决策,归结于我们对 LLM 在生成客户响应时可能犯的错误持续讨论。我们知道 LLM 并非没有错误,虽然机器学习有时是实用的,但在考虑部署这项技术时,潜在错误的成本是主要的决策标准。从根本上说,使用 LLM 可能会增加这些错误的成本。底线是,在当前形式下,LLM 可能会提供错误的答案,而这些错误的责任落在部署和维护它们的公司或个人身上。
高管或产品经理可能会在几个经典商业关键绩效指标(KPI)的背景下考虑错误的成本。例如,如果他们把客户支持委托给聊天机器人,客户保留率可能会下降。也许如果客户关系职能外包给另一个国家的呼叫中心,保留率会更高。确实,这些考虑因素很重要,你可能会在用大型语言模型(LLM)全面替换客户支持功能之前,先进行一次试验部署,看看客户对它们的看法。
注意:我们几乎总是推荐对任何机器学习系统进行试验部署。投资格言“过去的业绩并不能保证未来的回报”适用于任何人工智能。一种方法是进行“幽灵部署”,即在几周或几个月内,将您的新 AI 系统与现有流程并行运行。在现有业务流程存在的情况下,您可以选择忽略其结果。这为您提供了时间来观察当前流程和新流程之间的差异,识别和解决问题,并确定机器学习系统的性能是否会随时间退化。
最重要的是,您的 LLM 可能会提供可能对您的用户造成伤害的建议。由于 LLM 不是一个可以对其行为承担法律责任的人,因此您和您的公司将承担责任。这已经在一家部署了给出错误政策声明的聊天机器人的航空公司中发生过。法院裁定,该公司必须遵守其聊天机器人错误生成和分享的政策[1]。
我们建议在部署大型语言模型(LLM)时始终考虑一种对抗性的思维模式。问自己“如果有人知道它是如何工作的,一个有动机的恶意行为者会做什么?”将帮助你识别和减轻重大风险,并且通常是确定你打算使用的 LLM 应用是好是坏的最佳方式。例如,一家汽车公司将其网站集成 LLM 以帮助销售汽车并回答问题。在意识到这一点后,用户仅用不到一天的时间就说服网站以仅 1 美元的价格卖给他们一辆车[2]。
如果潜在的成本或错误风险较低,如果你选择的话,可以放心地部署 LLM 聊天机器人。但为了本章的目的,让我们假设我们假设的这个技术支持代理非常重要,它犯的错误可能会给公司造成大量损失。现在的问题变成了:我们如何设计一个既能带来生产力和效率上的好处,又能限制用户直接访问 LLM 的解决方案?如果你是 AI/ML 的新手,并且聊天机器人是你对这个领域的首次接触,这可能会听起来像是一种矛盾,但有一些简单、可重复的设计模式你可以应用来实现这一点。
8.2 自动化偏差
针对使用 LLM 进行直接客户互动的风险,一种常见的应对方法是将 LLM 与支持人员或技术人员进行交互。这通常被称为“人工在环”,因为有一个人在审查 LLM 与客户之间的反馈循环,对自动化系统的输出进行关键评估,并在发现错误时介入和调整输出。技术人员仍然会被雇佣,但我们将通过让 LLM 为每个用户的问题生成初始响应,并由技术人员整理这些响应以确保其准确性和相关性来提高他们的效率。如果 LLM 生成可能代价高昂或错误的响应,我们可靠的技术人员将介入并回复更合适的内容。在这种情况下,最终由技术人员选择适当的权威性回复。
记得我们在第五章讨论检索增强生成(RAG)的聪明读者甚至可能识别出改进这一想法的方法。你会说:“啊,我们可以把所有的培训手册和文档都放在数据库里,然后我们可以使用 RAG,这样 LLM 就可以检索到与用户问题最相关的信息。”这种方法在图 8.2 中进行了概述,该图显示了用户的问题首先被发送到 LLM,以使用一组已知答案来集中生成输出。
图 8.2 一种实现“人工在环”系统的天真方法,该系统使用 LLM 与相关信息的数据库配对以生成输出,最终由人工工作者进行审查,并可能进行纠正
RAG 方法可能会减轻很多风险,但也可能陷入自动化偏差的陷阱。自动化偏差指的是人们普遍倾向于选择系统提供的自动化或默认选项,因为这比应用批判性思维来确定哪种选择最适合当前情况要容易得多。如果一个系统运行良好且不需要你经常干预,那么保持高度警惕并检测偶尔的错误就变得极其困难。悖论在于,如果系统在建议上的不准确程度足以让你保持警惕,那么系统在直接回答问题时可能比使用无自动化工具要慢。
这就是试验或幻影部署变得极其重要的地方。如果你的系统如此准确,以至于自动化偏差是真正的风险来源,你有两个选项,不需要偏离“人工在环”的设计:
-
将“逃逸到人工服务”的路径添加到管道中
-
通过流程变更来外部减轻错误风险
第一点相当直接。最终,会出现 LLM 无法回答的新情况。在这种情况下,最好提供一种让客户能够“逃逸”出与计算机的无穷循环,以获得更高层次支持的方法。这可能是一个以消息交换次数或聊天时间衡量的最大对话长度,或者在多次尝试沟通失败后出现联系人工代表的选项,或其他可能的设计。
注意:假设你打算做创建 RLHF 或 SFT 数据集的工作,以微调你的 LLM 以适应你的情况,正如我们在第五章中讨论的那样。在这种情况下,你甚至可以添加训练示例,其中 LLM 的预期响应是“很抱歉,这种情况听起来比我能够协助的要复杂;让我找个人来帮忙。”
8.2.1 改变流程
第二个建议,改变流程,听起来可能并不困难。如果你的老板之一有 MBA 学位,他们(据称)受过这方面的训练。(我们的一位作者有 MBA 学位,所以我们可以说这是可以的。)例如,与聊天机器人的互动可以包括任何需要“人工最终批准”的任何结果的免责声明。在这种情况下,让整个对话由人审查,比要求某人在整个连续对话中保持持续警惕要小得多自动化偏差风险。最终,对抗性用户知道有人会检查,因此他们不太可能试图操纵系统。
根据上下文,通过要求用户提供抵押品以确保他们诚信行动,可以防止 LLM 的对抗性使用。例如,你可以采取相当于冻结用户信用卡的行动,作为一种对不良诚信互动的保险。当交易成功完成时,这种冻结将被解除。你也可以限制自动化过程的程度,要求身份验证,或者随机化人们被路由到人类还是 AI 的频率,以便在可能被利用的情况出现时变得不可预测。
所有这些行动都将取决于你的具体应用、风险、对风险的容忍度以及你用户的性质。一些客户可能会因为信用冻结而感到沮丧。或者,你可能将其作为一项可选方法,如果 AI 系统成功帮助用户解决问题,用户可以从账单中节省 2 美元,前提是这比旧系统每通电话的成本要低。无论如何,这都是个案,将取决于你的创造力来管理风险。
8.2.2 当事情对自主 LLM 来说风险太高时
现在你已经进行了试验部署,评估了风险和用户对抗性倾向,并得出结论,LLM 提供初始答案的风险太高。LLM 如何仍然提供一定程度的效率呢?
一种不直观的方法是让大型语言模型(LLM)检查人,而不是让人检查 LLM。这听起来可能很奇怪。如果我们不能信任 LLM 独立行动,我们为什么要让它进行监督?为了进一步考虑这个问题,想象一下你有一个 LLM 系统在这个监督角色中,检查每个响应,如图 8.3 所示。
如果 LLM 和人都正确,就会采取行动,并将消息传达给客户。这就像用户在与技术人员聊天一样。但如果技术人员和 LLM 对答案有分歧,我们可以提示技术人员在将答案发送给用户之前进行双重检查。
图 8.3 注意到这个图中的箭头方向与图 8.2 不同。所有内容都首先发送给人类,我们使用 LLM 在错误发生之前捕捉错误。
这种双重检查可能只是简单地告诉技术人员,“嘿,这个解决方案看起来可能不正常;请在发送前确认。”你可以尝试让 LLM 生成它自己的建议替代方案。或者,你可以让 LLM 不参与这个过程,并使用它来通知一个更有经验的技术人员加入过程并提供帮助。无论这种结构如何,目的都是为了表明可能存在负面客户互动的风险,比如错误的答案。虽然这种风险以前就存在,但现在我们有机会减轻它。
此外,因为我们正在考虑由人类发起的客户支持错误,所以我们通常不会承担任何新的风险,因为单独行动的支持代表同样可能犯错。所以如果 LLM 和人类同时出错,你本来就已经注定要犯那个过程错误了。这就是生活。从技术上讲,我们可以争论技术人员可能会过多地根据 LLM 对他们的互动评估来质疑他们的回答,从而降低效率。此外,过于敏感的 LLM 可能会频繁要求技术人员复查他们的工作,这会导致警报疲劳,可能导致技术人员完全忽略 LLM 的建议。如果你的用例容易遇到这类问题,那么在提供关于如何调整 LLM 以解决此类问题的特定上下文反馈的试验部署过程中,这一事实将会被发现。适用于所有机器学习的普遍警告在这里尤其重要:总是测试;不要假设。
使用 LLM 来复查人类表现可以减少整个过程中的错误。虽然这种方法看起来并没有使任何事情变得更快,因为人类仍在生成初始回复,但这种方法仍然创造了提高效率的机会:
-
它可以通过帮助捕捉错误和更快地解决问题来缩短对话长度。
-
它可以识别需要更多培训或信息来回答客户问题或识别特定错误情况发生的员工。
-
它可能有助于避免升级到更昂贵的支持级别或经理,从而减少麻烦客户的频率和成本。
8.3 使用 LLM 以外的工具来降低风险
我们所讨论的一切都涉及一种“以火攻火”的方法,即在考虑使用 LLM(大型语言模型)存在风险的情况下,我们考虑了不同的使用 LLM 来减轻这些风险的方法。虽然我们已经改变了使用 LLM 的方式,但 LLM 仍然是主要组件。或者,我们可以考虑使用除 LLM 之外的工具来解决我们的设计挑战。在生成式 AI 的范围内,其他方法,如文本转语音和语音转文本,可以用来构建更易于访问或更方便的用户体验。例如,患有关节炎或视力低下的用户可能更愿意通过电话通话而不是在聊天机器人提示窗口中键入回复。
如果我们考虑我们的客户服务问题以及 LLM 工作得好的时候,我们会发现更广泛类别工具的成分也同样是可用的。LLM 在场景中表现最佳,在这些场景中,问题会重复出现,并且可以给出公式化的解决方案和响应。LLM 在识别语言模糊性中的广泛模式方面非常灵活。如果 LLM 可以正确解释用户的问题,并且存在已知的解决方案,它可能能够引导用户通过该解决方案。这听起来可能很像一个无监督的聊天机器人,但关键的区别在于,在 LLM 在解决方案中扮演从属角色的案例中,输出最终是由客户支持技术人员生成的,如图 8.3 所描述。
本节还将讨论我们如何利用经典的机器学习技术,例如分类,来解决现有问题。我们可以通过使用 LLM 中的知识来生成用户的文本嵌入,从而实现机器学习技术。
8.3.1 将 LLM 嵌入与其它工具结合
在第三章中,我们描述了 LLM 如何将标记转换为嵌入,这些嵌入是向量,它们将每个标记的意义作为一个数字序列进行编码。这些向量嵌入在 LLM 的变压器架构之外也有其他用途。虽然向量嵌入对于使 LLM 运作至关重要,但它们本身也是一个极其有用的工具。
LLM 产生的向量语义性质很重要,因为数百个其他实用的机器学习算法在向量表示上操作。LLM 实质上是一种将复杂的人类语言文本转换为与机器学习领域其他部分兼容形式的一种非常强大的方式。利用 LLM 的向量输出与其他算法相结合已被证明是一种极其有用的策略,从业者将其描述为“创建嵌入”。这种描述来源于 LLM 将一种表示(人类文本)嵌入到另一种表示(数学向量)中的想法。因为这些数字编码了关于原始文本的信息,你可以像数字一样绘制它们,并看到相似文本最终在图表上的相似位置,如图 8.4 所示。
图 8.4 LLM 在其功能中产生称为嵌入的数值向量。这些嵌入的效用取决于这些数字在给定相似文本时只发生微小变化的事实。这里提供的两个示例测试将具有相似的嵌入,因此它们的图表看起来相似,尽管它们没有共享任何相同的单词。这是在较老的机器学习技术中存在的一个强大功能。
让我们快速了解一下四种类型的机器学习算法,您在拥有嵌入后可以使用。我们认为每种类型的机器学习对于大多数使用 LLM 的现实世界应用都特别有用;我们还将注意一些相对可靠且易于使用的流行算法。关键要点是,如果您跳出只有 LLM 才能解决问题的思维定式,您将获得更广泛的一套工具。这个列表是您开始探索这些工具的起点图:
-
聚类算法—根据彼此之间的相似性对文本进行分组,这些文本与大量可用的文本不同(例如,用于市场细分分析)。流行的算法包括 k-means 和 HDBSCAN。
-
异常检测—寻找与几乎所有其他文本都不同的文本(即,寻找持不同意见的客户或新颖的问题)。流行的算法包括隔离森林和局部离群因子(LoF)。
-
信息可视化—创建数据的 2D 图,以便进行视觉检查/探索,尤其是在结合交互式工具(即,数据探索)时。流行的算法包括 UMAP 和 PCA。
-
分类和回归—如果您用已知的成果(例如,净推荐者评分)标记旧文本,您可以使用分类(即,选择 A、B 或 C 中的一个)或回归(即,预测一个连续的数字,如 3.14 或 42)来预测新文本的评分(即,数据分类和值预测)。使用嵌入作为简单算法(如逻辑回归和线性回归)的输入,对于分类或回归都很有用。
注意嵌入并不是作为 LLM 的一部分新发明的。一个名为 Word2Vec 的算法,它可以嵌入单个单词,在 2013 年将嵌入推广为表示文本意义的首选策略。尽管如此,LLM 倾向于产生比其他较老算法更有用的嵌入。然而,LLM 的计算需求远大于 Word2Vec 等较老算法。因此,您可能希望使用较老或更快的算法来完成这项任务。图像、视频和语音中生成 AI 方法的存在意味着您还可以在文本之外,为图像、视频和语音等域使用嵌入。
8.3.2 设计使用嵌入的解决方案
现在我们已经描述了嵌入的概念以及它们如何为我们提供更多工具,让我们构建一个增强型技术支持呼叫中心解决方案。我们将继续使用 LLM 的文本生成能力以及它们的嵌入,并纳入其他机器学习技术,以实现人们习惯的语音交互,减少等待时间,并提高效率。
首先,为了支持语音交互,我们将使用语音转文本将用户说出的单词转换为用于输入 LLM 的文本。合理的想法是,“我之前使用过一些非常糟糕的语音控制系统”,是的,你很可能有。这就是为什么在系统无法理解用户的语音的情况下,添加一个“退出”机制(例如,最大尝试次数、时间或选择退出)是至关重要的。除了语音转文本之外,我们还将使用文本转语音,以便 LLM 有一种将产生的文本转换为用户应该能够听到和理解的方式。
其次,为了减少等待时间,我们可以实施一个系统,如果由于支持请求的数量而形成了一个呼叫者队列,我们将要求客户描述他们的问题,以便他们可以被路由到最合适的分析师。假设客户可能有新颖的问题,我们不尝试直接使用 LLM 来解决问题。相反,我们将使用客户的问题描述来调用 LLM 的嵌入 API 以产生他们问题的表示。一旦我们有了这个问题描述嵌入,我们可以使用聚类来将队列中的用户分组。具有相似问题的用户可以被分配到同一个分析师团队,以帮助分析师更快地解决问题。这本身就是一种胜利。
我们可以利用这种问题分组来进一步提高效率。假设分析师已经确定用户有一个常见问题,对于这个问题有一个一致且预定义的解决方案。而不是依赖 LLM 动态生成一个假设性的解决方案,您的人类分析师可以分享已经由真实用户验证过的预定义解决方案。此外,您可以通过 LLM 将此解决方案推送给正在排队等待的用户。您将能够通知用户:“我们已经开发了一个自动化的解决方案,我们相信这将解决您的问题。当您等待时,让我们尝试用我们的自动化 AI 来解决这个问题。”这种方法总结在图 8.5 中。
图 8.5 该图描述了我们针对客户支持请求的“更好解决方案”,在客户等待与某人交谈时描述他们的问题。LLM 使用问题的嵌入表示来比较已知解决方案的类似问题。在用户等待期间,一个自动化的系统可以提供可能帮助他们解决问题的信息,而无需支持人员的干预。如果这失败了,总有“退出”并与真人交谈的可能性。用于生成嵌入的模型不一定是引导用户通过解决方案的 LLM。
将我们迄今为止描述的解决方案结合起来是完全可能的。例如,图 8.5 右上角的分析师与客户互动循环可能涉及两个人讨论问题,或者可能是我们在图 8.3 中设计的 LLM 监督验证解决方案。根据需要解决的问题,现在我们有了嵌入,有许多机会扩展这些解决方案。例如,如果分析师保存了有关客户愤怒或沮丧的信息,您就可以训练一个回归模型来预测客户从其嵌入中可能有多愤怒。然后,您可以将愤怒的客户均匀分配给分析师,以避免有人感到不堪重负,或者尝试将愤怒的客户引导远离仍在学习如何帮助客户解决问题的初级分析师。
为了明确起见,我们并不是说如果客户服务技术支持系统采用这种方法,它们就会变得更好。目标是向您展示,有方法可以利用 LLM(大型语言模型)构建解决方案,以克服它们的不足,例如它们倾向于产生幻觉以及无法动态地融入新知识。总之,我们提出了两种基本策略:
-
将 LLM 作为观察正在发生的事情的第二双眼睛。如果 LLM 同意,那么一切正常。如果它不同意,您需要进行双重检查,这可能是简单或复杂的,具体取决于问题的性质。
-
使用嵌入将经典机器学习应用于问题。聚类(将相似的事物分组)和异常检测(寻找独特或不寻常的事物)对于许多实际应用将特别有用。
在这些解决方案的任何阶段,我们并不完全依赖 LLM 来创建输出,因为 LLM 可能会生成错误或不适当的输出。然而,我们仍然可以通过谨慎地设计整个系统来利用 LLM 减少工作量、错误和解决问题的耗时。
8.4 技术展示很重要
在阅读了如何设计使用 LLM 的客服支持系统示例之后,有些人可能会感到难以置信。我们经常听到那些完全相信 LLM 技术的人说:“如果你让 LLM 解释其推理,用户或分析师就可以判断其是否合理,并且所有与幻觉和错误相关的问题都将得到解决。”我们也经常收到来自那些对 LLM 产生的错误表示担忧且不理解正在发生什么的人的类似请求,他们希望创建“可解释的人工智能”。因此,在双方都有一种观念,即解释将提供建立对技术的信任并相信 LLM(或任何机器学习算法)正在正常和有效地工作的手段。
在本节中,我们想要讨论一些支持以下观点的论点:可解释性并不是这些问题的解决方案。可解释性并不是单一的解决方案,它将有助于捕捉错误或使系统更加透明和值得信赖。不幸的事实是,我们对大型语言模型如何与人类合作的假设往往是不正确的,并且必须仔细评估。事实上,最近的研究表明,当系统采用可解释人工智能技术时,人们错误地相信人工智能是正确的,仅仅因为存在解释,而不管其准确性如何。即使在用户可以在没有人工智能支持的情况下独立完成任务,并且用户已经了解人工智能系统实际工作方式的情况下,这也是正确的 [3]。底线是,解释可能会对它们试图推进的目标产生有害影响。
为什么要使用可解释人工智能?
在我们的专业经验中,许多对可解释人工智能的请求都源于恐惧或焦虑。理想情况下,可解释人工智能不应该成为平息这种恐惧的方法,因为这与实际要解决的问题的目标是相反的。那么,为什么有人会进行任何形式的可解释人工智能呢?
从实际角度来看,有两个关键因素使可解释人工智能变得有用:
-
回答问题,可解释给谁?
-
从问题陈述到达可解释人工智能
例如,一个现实世界的问题陈述可能描述了需要发展对物理或化学过程的科学理解。有了这个目标,算法的一个有用的解释可能是生成一个产生答案的方程式,而不是直接产生答案。有了这个方程式,物理学家或化学家可以检查其逻辑一致性,并将其作为进一步科学探索的起点。
在这种情况下,解决方案只对具有显著专业知识的人可解释,但只有这个人需要解释。以方程式形式提供的解释也直接解决了科学理解的问题,而不仅仅是理解人工智能算法的内部工作原理。我们没有关于人工智能如何得出方程式的解释,而这个方程式(希望)是一个逻辑上一致的形式,可以解释物理或化学过程。
这个例子反映了我们在哪种情况下发现可解释人工智能最有帮助的一般情况:当它被用来帮助一个狭窄且具体的潜在专家用户群体实现一个非常具体的目标时。例如,数据科学家确实经常使用可解释人工智能来帮助他们弄清楚为什么某个模型会犯特定的错误集,即使他们使用的工具对非数据科学家用户群体来说并不易理解。
所以,如果可解释人工智能不是建立对人工智能系统或解决方案信任的解决方案,那又是什么呢?遗憾的是,目前还没有一个普遍认同的、经过严格评估的方法来建立对人工智能的信任。我们非原创的建议是关注透明度、用户评估以及涉及的使用案例的细节。
8.4.1 如何做到透明?
透明度可以简单到通知用户正在使用的 AI 系统:它是用哪个模型设计的,在较高层次上是如何修改的?如果系统旨在模仿一个特定的人(“由 Albert A.I. Einstein 辅导”)或一种有资格的人(“向 Dr. GPT 询问你背上的那个痣”),那个人或类似有资格的人是否同意这样做或批准其有效性?消费者如何验证这些信息?
实际上,列出这些合理的疑问及其答案,审计员或怀疑的用户可能想知道,将使你在使你的系统更加透明方面远远领先于平均水平。这些不需要向每个用户详细展示,但为用户提供一种发现这些信息的方式是有帮助的。这不仅有助于复杂的用户理解正在发生的事情,还有助于设定用户对给定系统可能性和不可能性的普遍期望。此外,当用户与生成自动响应的系统交互时,告知用户这一点至关重要。试图假装人类在控制并因此应该能够解决任何合理的挑战与告知客户该 AI 具有有限能力的自动化 AI 之间有很大的区别。
8.4.2 与用户对齐激励
透明度和系统展示的一部分涉及调整涉及的激励措施。这不仅仅是一句关于管理实践的好听的话,而是一个实用的建议。记得从第四章中,人工智能算法是贪婪的机器,它们优化的是你所要求的,而不是你所意图的。如果你开始构建一个 LLM 系统,而这个系统的激励措施与你的更广泛目标没有很好地对齐,你可能会过度拟合你所要求的,而不是你和你用户所需要的。
在激励措施对齐的情况下(例如,我们的例子是“试用 LLM 并在它有效时减免 2 美元”),你更有可能获得积极的结果。它们还为你提供了更多使用 LLM 作为向客户提供价值机制而不是作为试图外包所有工作的邪恶人的广告方式。讨论业务与其客户之间的对齐激励以及你是如何使用 LLMs 来实现这些目标的,描述了需要说的话,而不需要隐藏信息。
8.4.3 引入反馈循环
世界不是静止的。事物在变化,今天有效的东西明天可能就不行。这就是为什么你应该定期和持续地对任何自动化 AI/ML 系统进行审计的原因:因为它们不会独立地随着经验而改进或适应。
但这也有助于你捕捉潜在的负面反馈循环,这是你想要提前考虑的事情。负面反馈循环并不总是可以预测的。为了帮助你捕捉这些,尝试思考哪些用户会或不会从新系统中获得最大利益,以及当这种情况反复发生时会发生什么。
例如,我们提到语音转文本和文本转语音可以帮助老年客户或任何听力或运动障碍的客户。如果我们不包括这样的选项,我们可能会随着时间的推移疏远这些客户,因为每次他们有问题时,他们都必须使用一个身体上困难的系统。
想象一下,你是一家依赖家庭计划获得部分收入的手机公司。你之前的中年客户首次购买你的家庭计划,现在对你的支持系统感到沮丧,所以他们把整个家庭计划转移到一家新的提供商那里,该提供商投入额外的工作以确保客户支持流程准确高效。现在你同时失去了老年和年轻客户!
这里的要点是深思熟虑,并训练自己进行这些思维实验。你可能不会捕捉到每一个案例,但你将会进步。定期的审计和测试帮助你捕捉到失败案例,记录它们,并改善你对未来情况和重复问题的思考方式。
摘要
-
LLMs 会出错,你首先需要确定错误的风险和潜在成本,以设计适当的解决方案。如果错误的风险和成本较低,你可能会使用正常的聊天机器人风格的 LLM。
-
通过改变用户与系统交互的方式或将自动化转移到业务流程的另一个部分,可以控制使用 LLM 的风险。
-
包括“人工介入”来监督 LLM 会产生自动化偏差风险,即使使用 RAG 等技术来降低错误风险。
-
LLMs 可以将文本转换为嵌入,这是一种数值表示,其中相似的句子会收到相似的价值。这允许你使用额外的机器学习方法,包括经典技术,如聚类和异常检测。
-
虽然 LLMs 可以解释它们的决策,但它们的解释通常无效,因为人们会依赖它们。相反,专注于产生满足特定需求或用例的解释,而不是通用的“需要解释”。
-
设计你系统的激励措施,使其与用户的激励措施相一致。这不仅是一种避免 LLM 优化你所要求的内容而不是你意图的内容的错误的好方法,也是一种向用户传达和展示你的 LLM 的好方法。
第九章:构建和使用 LLMs 的伦理
本章涵盖
-
LLMs 执行许多任务的能力也创造了不可预见的风险
-
LLMs 与人类价值观不一致的问题
-
LLMs 数据使用对内容创作和构建未来模型的影响
虽然对伦理的讨论可能会让一些人想起入门级大学课程中枯燥的阅读材料,但在实施可能影响人类算法时,存在一些关键的考虑因素。鉴于 LLMs 使用和能力的快速增长,我们必须意识到并关注许多不断演变的问题。如果你对这些担忧一无所知,你将无法在它们的解决中发表意见。
探索构建和使用 LLMs 的伦理是一个极其复杂的话题,难以完全表达。因此,本章将介绍我们认为关于构建 LLMs 及其相关伦理问题的常见担忧。在整个章节中,我们将引用一些补充材料,以便如果你愿意可以进一步调查。
我们将涵盖三个主要主题:
-
为什么人们想要构建 LLMs,它们提供了之前不存在的东西?
-
一些机器学习专家认为,在未来迭代中,LLMs 将导致人类种族的灭绝,因为它们将自动化我们到不存在。即使我们不同意他们,了解这种恐惧的基础也是值得的。
-
LLMs 所需的训练数据量是巨大的。构建 LLMs 的公司,如 OpenAI 和 Anthropic,是如何获取所有这些数据的?由于数据的收集和使用方式,可能引发哪些道德、法律和财务方面的伦理担忧?
这些在伦理和法律方面都是复杂的考虑。我们的目标不是告诉你这些模型的创建是道德的还是不道德的,而是概述每个讨论下的主要考虑因素。我们希望这能帮助你更广泛地考虑 LLMs 的影响、后果和风险。我们看到了许多关于 LLMs 使用的知名、复杂的伦理问题,许多从业者还没有真正地处理这个问题。尽管如此,我们认为考虑构建 LLMs 的伦理问题至关重要,我们将在本章中介绍一些需要考虑的关键问题。
讨论我们如何使用 LLMs 与如何构建 LLMs 时,必要的考虑因素同样多,因此我们将这次对话分为两个部分。首先,我们关注构建 LLMs 的一般伦理问题,而下一部分将涵盖 LLMs 使用的伦理影响。
最后,我们将避免将这些论点归咎于特定的个人或群体。我们的目标是防止偏见,避免在这次讨论中特别“点名”任何人。重要的是这些担忧。
9.1 我们为什么要构建 LLMs?
在我们讨论开发大型语言模型(LLMs)的伦理影响之前,值得思考的是,我们通过构建 LLMs 试图实现什么,以及我们为什么想要实现这些目标。像所有软件工程一样,构建 LLMs 通常旨在减少或消除某些任务中的人类劳动。一些经济学家可能会告诉你,这就是生活水平普遍提高的方式。随着技术的进步,越来越少的人需要执行手动、劳动密集型的工作,因此他们有更多的时间用于探索、创造和其他使用高级认知的功能。
在 LLMs 的情况下,一个常见的目标是提高自动化语言翻译、语音转文字转录、在光学字符识别、索引和信息检索等应用中读取图像和打印文档的算法效率,这些应用简单地被称为“搜索”,或更广泛地称为信息检索,等等。其他人出于纯粹的科学原因对 LLMs 感兴趣,例如研究计算语言学的方法,或者创意应用,例如生成图像、音乐或视频。此外,其他人可能寻求增加影响我们生活的技术的影响力和透明度,或者可能只是因为 LLMs 吸引了他们的注意,并展示了令人惊叹的新能力。
对于一些人来说,LLMs 能够实现的各种事情是他们想要构建它们的内在动机。人工智能和机器学习算法已经执行了我们列出的所有任务一段时间了;例如,机器翻译已有几十年历史。LLMs 与众不同的部分在于它们似乎能够用一个模型和算法做所有的事情。在 LLMs 出现之前,工程师会为满足这些需求而设计独立的系统来执行翻译和转录等任务。今天最大的 LLMs 在某种程度上可以完成这些事情以及更多。通常,它们似乎可以完成看似无限的任务。与此同时,其他人害怕 LLMs,因为他们认为由于它们能力的广泛性,它们将通过承担需要发现和创造的任务,从而从人类那里窃取工作、动机和活动,这些任务以前被认为是仅限于人类的。
9.1.1 LLM 做所有事情的利弊
由于一个 LLM 可以通过单个模型执行许多不同的任务,你可以将其描述为一种“全能应用”:你的人工智能辅助一站式商店。从可用性的角度来看,LLMs 几乎普遍的能力带来了许多好处,例如它们相对擅长将复杂任务分解成一系列步骤,或者它们能够生成独特的解释来填补特定的知识空白。
此外,聊天风格的界面似乎很受用户欢迎,即使有其他与 LLM 合作的方式。聊天受欢迎可能是因为其普遍的易用性:你不断地与人聊天。电话通话的经验很普遍,而通过短信、Slack、Teams、即时消息和电子邮件,人们隐含地知道如何使用各种基于聊天的界面。因此,通过基于聊天的界面与 AI 交互已经成为一种吸引人且易于接受的方式来增加采用率,而无需太多培训。基于聊天的应用的广泛经验也具有民主化的影响:用户只需学习一次,就能帮助他们追求许多不同的目标。
这种系统的首要缺点是,尽管它可以用于一切,但这并不意味着我们应该用它来处理一切。当你有一个人们可以用于许多不同和可能意外的任务的算法时,你没有时间去测试每一种可能的使用。由于 LLMs 潜在应用的范围很广,因此在验证模型安全执行的行为和它可能尝试但可能具有潜在危险或有害的行为之间将存在差距。
例如,当前的 LLM 模型可以进行关于种族或性别的抽象评估,即使这些评估可能包含有害的负面偏见。虽然我们可以为有害偏见的特定实例开发测试和防御措施,但这些可能范围狭窄且非常具体。例如,假设我们要求一个图像生成模型生成一个商务会议的图像。不幸的结果是,图像中的所有人通常都是男性和白人。自然地,我们希望模型能够超越这些刻板印象。然而,识别和修复这种特定情境偏见问题并不会影响模型在现实世界中部署并被以不同、未预料到的方式提示时是否会造成伤害。至多,这些练习可以说明 LLM 可能失败的情况,但解决伤害需要理解可能发生的潜在失败,例如,由于训练数据中的偏见。同时,我们必须了解人们将如何使用 LLM,以及这些使用是否可能导致由于 LLM 生成输出而导致的不当伤害。这可能意味着由于缺乏缓解潜在危害的措施,明确不使用 LLM 于预期用途。
最近关于部署的 LLM(大型语言模型)在现实世界中的危害的研究发现,像 OpenAI 的 ChatGPT 和谷歌的 Gemini 这样的 LLM 对使用非裔美国人俚语的用户的隐性偏见比 20 世纪 20 年代在美国白人中间测量的陈旧负面刻板印象还要严重[1]。另一项研究考虑了医生咨询 LLM 以获取关于不同种族人群的医疗最佳实践和治疗方案的用例,发现模型经常推荐基于优生学“科学”的已被驳斥的基于种族的医疗实践[2]。不幸的是,我们在那些在现有的显性偏见基准测试中得分相当高的模型中仍然看到这些问题。潜在偏见的普遍存在表明,这些基准不足以评估潜在的危害,并强调了根据其使用情况考虑 LLM 可能造成的危害的必要性。换句话说,将 AI 部署造成的危害视为特定用例和应用的具体结果,而不是将其归因于模型是否包含种族偏见的一般观念,这一点更为重要。
今天,我们不知道如何设计一个算法,能够在单一系统中完成如此多的任务,同时还能防御善意个体意外误用和造成的危害。因此,从开发者的角度来看,进行跨广泛群体和环境的彻底用户研究变得至关重要,以识别未预见的风险,并包括监控和记录以补救任何晚发现的危险。无论我们是在尝试防止有害的种族刻板印象还是倡导被驳斥的医疗实践,目前限制 LLM 误用的方法都是列举我们关于潜在问题的了解,并采用微调方法,如 RLHF,迫使模型在已知问题上表现更好。不幸的是,由于 LLM 能力的潜在广泛性,未知问题集是无限的,因此任何测试制度都将是不完整的。
注意:部署后监控的重要性并非新概念。例如,FDA 已经使用 MedWatch 系统实践了多年。该系统允许公众和医疗专业人员报告任何药物或医疗设备的任何不良事件,以便 FDA 可以监控任何异常情况。
9.1.2 我们是否想要自动化所有的人类工作?
正如我们在引言中提到的,一些经济学家可能会认为自动化允许劳动力池专注于新的工作。这种论点依赖于这样一个观点:自动化技术的进步在消除大多数人不愿意做的工作方面做得很好。农业很辛苦,提炼稀土金属很辛苦,组装汽车、玩具和包装也很辛苦。这些是劳动强度大、对身体有害的工作,通常伴随着有限的精神刺激。与 1950 年相比,农业今天需要的劳动力减少了 74%[3],无疑比中世纪时代少得多。
与 LLMs 的不同之处在于,它们有可能自动化某些类型的白领知识工作。文案写作[4]、视觉艺术[5]、平面设计[6]和银行业[7]只是被生成式 AI 颠覆的几个领域。
关心 LLMs 对经济影响的那些人认为,我们将因自动化而失去工作,我们警告说,这并不像通常描绘的那样清晰。机构和消费者的愿望可能会推动保留和继续扩大这些类型的白领工作。我们应该警惕忽视关于技术进步时工作如何变化的经济研究历史。相反,我们必须解决一个更重大的问题:获取高质量的训练数据。我们相信这将推动未来的新工作,强调人类创造力和能力的重要性,即使它目前创造的工作还不是许多人希望的白领工作类型。
关于“显而易见”的结果的反例
有些人认为,LLMs(大型语言模型)对经济某些领域产生正面或负面的影响是显而易见的。银行柜员的职位就是常被用来反对 LLMs 的著名例子。自 20 世纪 60 年代自动取款机(ATM)的发明以来,银行柜员的职位发生了显著变化。显然,ATM 自动化了许多银行柜员的任务。
但 ATM 的例子并不那么简单。在 ATM 发明后的几十年里,柜员职位数量不断增加,1970 年至 2010 年间翻了一番,达到,尽管 ATM 的普及率越来越高[8]。回顾 ATM 对就业的历史研究,人们认识到许多因素导致了失业,包括增长速度和职位性质的变化。失业不仅仅是由于 ATM 技术,还包括业务其他部分的多次技术创新、银行对变化的反应差异、金融行业的去监管化以及竞争和合并的增加[9]。因此,尽管 ATM 在银行柜员的工作上可能更优越、成本更低,但机构、客户和期望的性质阻止了就业的立即下降,使得情况比通常宣传的要复杂得多。
自动柜员机(ATM)的例子并不独特;技术可能会,但并不总是因为自动化而导致失业。例如,机器翻译在 2000 年代初和 2016 年都有了显著改进。然而,翻译工作在每个时期都增加了,并且至今仍在增长[10]。关键观察结果是,当翻译者将自动化工具纳入他们的工作流程时,翻译工作的就业池并没有缩小。相反,我们看到翻译工作的量增加了,随着需要翻译的材料数量的持续增长,对翻译服务的需求也在增加。有些人认为,对创意艺术家和作家的类似需求将会出现[11]。根据这种论点,虽然艺术和知识工作的生产方式将发生变化,但市场将继续增长,需求将继续以可以利用自动化工具引入的新劳动力供应的方式增长。因此,当我们确定可能被 LLMs 自动化或加速的工作领域时,我们还必须确定提高效率和质量的增加是否能够推动更多的需求。
尽管如此,仍有人会争辩说,大型语言模型(LLMs)与以往发生的所有事情都存在根本性的不同。因此,我们不能使用以前理解技术对经济潜在影响的方法来预测未来。鉴于围绕 LLMs 的炒作,虽然相信这一点可能是有可能的,也是诱人的,但我们对此表示怀疑,这或许是一个过于宽泛的声明,没有人能够证明其真伪。尽管在制定法规时(这些法规反过来又在很大程度上影响着技术发展如何影响就业),我们确实应该考虑这样的可能性和因素,但值得注意的是,估计有 60%的美国工作都是现代发明,以前并不存在[12]。
关于训练数据的考虑
生成式人工智能对创意表达的影响是深刻的,因为这种状况具有一种扭曲的双重性。许多在互联网上发布内容的作家和艺术家的作品,似乎在为那些旨在消除他们工作的模型提供燃料。LLM 研究人员提出的伦理论点是,他们应该能够自由地使用这些创作者的内容作为训练数据。这种论点可能会导致一种代价高昂的胜利,并最终对 AI 造成破坏。如果 AI 取代了创意工作者的工作,LLM 开发者将发现,由于缺乏人类生成的内容以及训练 LLM 所需数据的指数级增长超过了用户生成内容的线性增长,他们再也无法改进他们的模型。更重要的是,创造这些内容的人将无法再被雇佣或受到激励,仅仅是为了让 LLM 吞噬他们的内容。
这个负面循环将影响 LLMs 和内容创作者,即使这只是一个感知到的风险,而不是真正的担忧。用于训练 LLMs 的数据采集对成千上万的依赖用户生成内容和从内容消费者那里获得广告收入的网站来说是一个重大的担忧。这些网站为 LLMs 提供了宝贵的训练数据,而 LLMs 的构建者需要大量的训练数据,但他们并没有为广告收入做出任何贡献。
例如,Stack Exchange 是一个用户可以发布问题、让其他用户回答并因良好答案获得声誉评级的网站集合。Stack Exchange 的一个网站,Stack Overflow,对寻求帮助解决编码问题的程序员来说是一个天赐之物。Stack Exchange 还托管了许多其他多样化的用户社区,服务于系统管理员、数学学生和桌面游戏爱好者。
随着大型语言模型(LLMs)的出现,Stack Exchange 迅速调整了其商业模式,并试图要求 LLMs 的创建者付费以维持其财务未来[13]。即使在训练 LLMs 的公司和托管内容的网站之间达成协议,用户生成内容的更直接商业化可能也不会受到用户的欢迎。Stack Overflow 就经历了这种情况,人们开始从平台上删除他们的有用答案,以抗议 Stack Overflow 将他们免费劳动的成果出售给 LLMs 的创建者[14]。
这个例子反映了搜索引擎将它们索引的应用程序和网站的特性整合到其主界面的悠久历史。例如,现在可以直接从 Google 搜索界面搜索和比较机票价格。这种能力将流量从提供相同服务的传统旅游网站吸引走[15],并减少了构建这些服务的公司所提供的服务和收入的需求。当这些 LLMs 的训练数据来源于创意作品时,它们与该作品的原始生产者之间可能存在类似的关系。
显然,由于 LLMs 的兴起而导致的我们正在处理的问题与之前自动化时期的类似,但又不完全相同。那么,与 LLMs 部署相关的差异是否足够显著,以至于会导致不同的、更负面的结果呢?结果对我们来说并不明显,主要是因为 LLMs 的广泛规模、可访问性和适用性。LLMs 的开发者需要采取主动,理解和减轻潜在的伤害,例如与可能受到影响领域进行预先谈判数据使用和社区建设。我们将在本章的最后部分讨论训练数据及其来源的其他方面。
9.2 LLMs 是否构成生存风险?
有些人认为 LLM 本身是危险的。如果你不熟悉这个论点,可能会觉得训练一个强大的 LLM 模型会导致重大的现实危害,比如消除隐私、终结者机器人以及对我们所知的人类的威胁。然而,许多人对此类风险表示担忧,包括 AI 领域的领导者,如杰弗里·辛顿[16]和约书亚·本吉奥[17]。辛顿和本吉奥是深度学习领域最受尊敬的研究者之一,他们为神经网络技术在 AI 中的生存、复兴和主导地位做出了重大贡献。
我们认为人工智能并不构成现实威胁。然而,一些严肃且受人尊敬的人提出了这些主张,因此理解他们的论点并解释为什么我们认为这些担忧不如解决对工作性质更紧迫的影响以及确保创作者公平和可持续的数据许可和补偿重要。
在本节中,我们将重点关注这样一个一般性论点:AI 可能广泛地成为对人类的威胁,因为我们可能失去对 LLM 的控制,而 LLM 可能会做出对人类有害的决定。这一观点源于两个被推向极端的想法:
-
一个 LLM 可以使用工具构建新的 LLM,从而有可能实现自我提升的想法
-
一个 LLM 的目标如果与人类需求不一致,最终可能会决定采取损害人类生活的行动以实现其自身目标
我们在这本书中多次间接地提到了这个关于自我提升的第一个想法。我们讨论了设计大型语言模型(LLM)涉及开发数据收集工具和编写使用这些数据的代码来训练 LLM 的事实。有人可能会假设,如果 LLM 可以直接使用数据收集和训练的工具,而不需要人为干预,那么一个 LLM 理论上可以训练另一个 LLM。
支持这一推理路线所需的认知飞跃是,一个 LLM 将足够聪明,能够构建一个更好的 LLM。为了接受这一点,我们必须假设这个新的 LLM 将能够创建一个更好的,并且进一步相信这种改进周期可以永远重复,直到
模型将比任何可能存在的人更聪明,并且本质上能够预测、颠覆或对抗任何可能中断这一周期的可能的人类行为。这一飞跃具有挑战性,因为我们几乎没有证据表明类似的事情在今天的科技观察中是可能发生的。
第二个想法,通常被称为“协调问题”,是 LLM 与人类需求不一致时,可能会选择对人类有害的目标和结果。这个想法是合理的,因为如第四章所讨论的,创建一个仅衡量你意图的目标的指标是具有挑战性的。然而,这一思考路线所需的非凡飞跃是 LLM 将拥有直接与世界互动和物理互动的能力和资源,如果不加以阻止,这可能导致大规模的伤害。
一些学者将这两个观点结合起来,认为大型语言模型(LLM)可能具有与人类不一致的目标。他们认为,LLM 会意识到需要变得更聪明并提升自己以实现其目标。在这个过程中,它会从人类那里夺取资源,或者通过其提升的智能,迫使人类服从以帮助它实现目标。我们在图 9.1 中概述了这一观点。
图 9.1 如通常所论证的那样,在一致性问题上,存在两种假设性的担忧,认为 LLM 对人类构成生存风险。上面的路径显示了一个直接的协调问题,其中 AI 的目标解决方案直接伤害人类。下面的路径显示了一个间接的协调问题,其中 AI 为其最终目标创造了一个子目标。即使目标——比如解决一个难题——得以实现,这个 LLM 也将以损害人类的代价来完成。在中间步骤中,LLM 决定它需要比可以与人类共享的更多地球资源来解决该问题。
这个论点的关键方面是,LLM,出于自我保存的目标,认为人类正在破坏地球。由于 LLM 存在于地球上并希望继续这样做,它认为摧毁人类将是维持自我保存的最佳手段。
我们认为人类毁灭的可能性不是一个有充分根据的担忧。然而,包括那些拥有计算机科学博士学位并专注于深度学习的人在内,许多人对此情景表示担忧。这个“LLM 毁灭人类”概念的主要问题是它依赖于不可证伪的逻辑。不可证伪的逻辑表明事情将会发生,几乎不可能有人证明它们不会发生。在这种情况下,证明 LLM 不会毁灭人类是具有挑战性的。
茶壶和不可证伪的陈述
在讨论像 LLMs 可能毁灭人类这样的抽象风险时,要求某人做出可证伪的陈述是至关重要的。一个著名的例子是伯特兰·罗素的“茶壶”思想实验。这个想法很简单:有人告诉你,太微小且太远以至于无法被探测到的茶壶存在于太空中。前提本身是不可证伪的;我可以扫描宇宙数百年寻找茶壶,即使我找不到它,我也无法证明它不存在。唯一可能的情况是,我最终找到茶壶并确认它在太空中存在。否则,我将永远无法证明茶壶的存在是一个谎言。因此,在讨论抽象风险时,不可证伪的陈述成为了一个认知的死胡同。反对一个无人能证明其为假的陈述是不可能的。同时,这些陈述对推动对话达到有意义的见解或结论毫无帮助。相反,基于可以认可和解决的问题的现实和实际担忧的论点更有价值。
另有两个论点支持这一推理:技术往往呈指数增长,而大多数人都不擅长考虑指数,因此没有完全理解这一风险将如何迅速成为现实。
这个想法的存在以及它成为该领域领导者关注的焦点,使你深入探讨关于 LLMs 可能引发人类终结这一观点的赞成和反对的思考与考量变得有价值。以下小节将探讨这些论点和自我改进与对齐不匹配背后的关键假设。
9.2.1 自我改进和迭代 S 曲线
当考虑自我改进智能的论点时,通过承认我们人类是构建智能的证明,这一观点得到了加强。如果智能是可构建的,就有理由相信 LLMs 可以自己构建它。大多数事物在 S 形曲线或 S 曲线上的改进是我们已在第七章中讨论过的。那次对话的重要启示是,存在一个收益递减的点,在此之后进一步的改进不再提供有意义的价值。反论点是,人类的技术进步反而遵循迭代 S 曲线,其中每个收益递减的顶峰都通过发现一个开始新 S 曲线的创新来抵消,如图 9.2 所示。
图 9.2 S 曲线,或称为 S 型曲线,显示了经典的平台期行为:在某个时刻,你会遇到收益递减。迭代 S 曲线模型对此的回应是,通过发现新技术,每项新技术都代表一条新的 S 曲线,进步可以继续在收益递减的平台期之后进行。新技术的起点可能不如现有方法,但它们有更高的潜力超越它们。
反对此论点的观点是,自我改进会导致人类杀戮水平的能力存在重大逻辑差距。虽然人类是一种存在证明,但没有已知的存在比人类更智能的东西(我们非常自恋,我们知道)。然而,这也依赖于智能和智能可以改进的想法。虽然像“聪明”和“智能”这样的术语在日常生活中是很有帮助的通用性,但它们因为本质上抽象的概念而无法进行精确的量化或定义。不清楚是否存在一个智能的单一轴,LLM 将沿着这个轴不断改进。
我们更倾向于相信,LLM(大型语言模型)自我改进的能力是有局限的。我们支持这一论点的证据出现在第 7.4 节,在那里,在我们讨论 LLM 的计算限制时,我们证明了 LLM 在执行许多类型的计算时存在困难。
9.2.2 对齐问题
LLM 可能将目标置于人类需求之上的第二个担忧被称为对齐问题。当我们给 LLM 一个我们希望它实现的目标,但没有充分说明、具体化或限制 LLM 为实现这一目标可以使用的行动或方法时,就会形成对齐问题。我们在第四章中关于什么是合适的损失函数的讨论是当前对齐问题的一个例子。更普遍地说,人类一直在处理对齐问题。例如,平衡公司首席执行官的薪酬和公司股东的意愿是一个经典的对齐问题,经济学家对此进行了几十年的研究。
因此,对齐问题是非常真实的,它的存在告诉我们解决它有多么困难。即使当我们试图非常明确时,比如当律师起草一份详细说明和具体规定协议中会发生或不会发生什么的合同时,关于漏洞和诡计以颠覆另一方的故事也司空见惯。虽然其中一些故事无疑是真实的,但虚构的也有其信息价值。实际上,许多机器学习领域的活跃研究试图从技术角度解决这个问题,我们可以从每天处理这一问题的律师和经济学家那里学到一课或两课。
这些与人类对齐相关的一般挑战提供了强有力的证据,表明 LLM 中的对齐问题也是一个真正的担忧。然而,一个怀疑的读者会问,是否有证据表明一个未对齐的 LLM 会得出杀人会推进其目标的结论。确实,如果 LLM 达到这种状态,人类会进行反击(“只是拔掉插头”是常见的回应)。更重要的是,许多末日论观点依赖于 LLM 的智能程度,认为其行为是确定性的,无论发生什么,结果都是已知和规定的。
事实上,结果具有概率性;事情可能顺利进行或出错,一个比人类更聪明的 LLM 肯定能理解它无法充分保证结果,并且共存比杀死所有人更有价值。考虑到固有的不确定性和需要与拥有成功引发爆炸长期记录的人类战斗,试图与人类战斗或颠覆人类是否是超级智能的事情呢?
您的模型与哪些价值观对齐?
越来越多的公司开始使用微调技术,如 RLHF(我们在第五章中对其进行了深入描述),试图使大型语言模型(LLM)的行为与其期望相一致。正如我们讨论的那样,目标是使 LLM 在遵循指令方面更有用,在避免执行有害或伤害性活动方面更安全。本质上,RLHF 试图解决对齐问题,并确保 LLM 的输出基于一组特定的示例和价值观进行约束。正如本节标题所暗示的,关键问题是我们将这些模型与哪些价值观对齐?我们将阐述我们为什么认为,尽管对齐问题在许多情况下有趣且有价值,但在讨论生存风险时却无意义。
使用 RLHF 微调 LLM 需要大量输入-输出对的数据库,通常需要手动构建。构建 LLM 的公司不会共享他们的微调数据,因为这被视为专有信息,并能为竞争对手提供优势。因此,作为用户,我们无法检查我们使用的模型预期的对齐情况。因此,今天对任何单个 LLM 的目标对齐对象仍然是不明确的。我们可以通过考虑其来源和保管链来近似训练数据集中嵌入的目标的性质。一个初步的近似是,这些数据集隐含地包含了创建它们的人的目标。通常,创建这些数据集的数据标注员在具有不同社会规范的国家和地区工作。在此基础上,某种程度上,目标属于开发 LLM 的公司及其员工,他们最终可以筛选和选择那些标注员产生的数据。
作为回应,我们问:“作为用户,我们是否舒服地使用可能偏向于我们不共享的替代信仰体系的科技?”在某种程度上,我们必须对此感到舒适才能使用 LLM。创建这些模型和数据集的成本太高,我们无法基于每个基础创建个性化的模型。因此,LLM 提供商必须存在,但那些提供商的目标不可能与每个潜在用户的目标一致。
同时,如果我们担心恶意行为者利用 LLM 进行邪恶或恶意目的,那么我们可能也会意识到,我们解决对齐问题的无能,在某种程度上是一种幸运。如果有可能将其中一种算法完美地与任何个人的信念体系对齐,那么任何不良行为者都可以完美地将 LLM 与他们的不良行为和信念对齐。这种想法突出了另一个问题:如果我们能够创建完美对齐的 LLM,我们就必须创建 LLM,以便只有好人能够对齐 LLM,以防止坏人做坏事。这种推理接近于一种神奇的想法,即有可能创建一个全能的 LLM,它同时被限制服从所有人。
注意:这种关于对齐的思考方式与关于加密的类似思考方式相平行。尽管人们可能试图创建一种只对好人开放的加密算法,允许他们解密数据,但任何这样的后门本质上都成为攻击者的最高价值目标,并增加了所有用户的风险。
因此,我们并不是非常关注不良行为者将模型对准恶意目的的可能性。然而,这种担忧强调了研究人员的一个关键点:在控制大型语言模型(LLM)方面取得的任何进步本质上都是一种双用途技术,既有和平用途也有对抗用途。确实,我们用 LLM 开发的任何东西都可能在一定程度上具有双用途。在考虑 LLM 更严重的潜在危害时,考虑威胁模型至关重要。谁会动机去实施这种危害,为什么,以及需要什么条件才能做到?目前有哪些障碍在阻止这种危害的发生,LLM 是否绕过了这些障碍?这些障碍能否适应现代技术?随着我们继续前进,我们的关注点不仅应集中在 LLM 上,还应集中在我们所运营的共存系统上,这些系统是成功和风险的最重要促进者和阻碍者。我们必须考虑整个局面,以实现最理想的结果。
9.3 数据来源和重用的伦理问题
大型语言模型(LLMs)和像 DALL-E 这样的生成模型,该模型根据用户提供的文本描述生成图像,需要在大量的数据上进行训练。例如,LLM 开发者使用 1 到 150 万亿个标记(例如,Llama 3.1 使用了 150 万亿[18])或 300 万到 3000 万页的文本来训练模型。这些数据代表了一个巨大的写作量,相当于数十万或数百万本书。虽然一些模型在相同的数据上反复训练,而且模型也在包括代码和数学在内的广泛数据上训练,但原始文本的数量仍然相当于数百万本书。
注意:重要的是要注意,这些文本中的大部分不是书籍;它们来自许多来源,包括新闻文章、网站、研究论文和政府报告。我们以书籍为单位总结这些内容,使其更易于理解,但我们训练模型并不是在数百万本书上。
主要问题之一是,现有的模型中没有哪一个使用的是明确允许用于训练 AI 的训练数据。虽然一些模型在遵守许可方面比其他模型更好,但大多数许可仍然涉及“版权所有”条款,这意味着内容的所有者对内容拥有独家权利,其他人未经其许可不能用于任何目的。
更进一步的是,大多数内容和数据使用许可都是在 LLM 技术存在之前制定的。它们没有预见将训练 AI 模型作为数据潜在用途,因此没有明确允许或禁止人们以这种方式使用数据。LLM 开发者正在努力在更宽松许可的数据上训练模型。然而,这并没有消除核心问题:大规模数据抓取用于训练 AI 之前并未被视为一个公认的关注点,因此现有的许可并没有明确地处理这种数据使用。
社会和法律需要解决的一个基本问题是:在什么条件下,为了训练模型而重复使用数据被视为可接受的使用?遗憾的是,由于缺乏更新的法律或确立的法律先例,美国和其他国家对此问题没有明确的答案。较老的法律,如美国数字千年版权法,明确保护搜索引擎使用来自其他网站的数据或文本来创建从网络中获取的内容索引。使用这些内容构建 LLM 是否属于这些权利范围内?我们不知道,我们也不是你的律师,但在这个部分,我们将讨论 LLM 数据获取的一些伦理因素。我们将简要介绍合理使用和数据创造者的权利,并讨论使用公共领域数据的挑战。
9.3.1 什么是合理使用?
许多国家和文化对版权文本的使用有不同的态度。在许多情况下,对于以新方式使用创意内容的人来说,版权法有有意义的例外,尤其是当这些方法促进公共利益、科学研究或产生类似的益处时。在美国,这被称为“合理使用”。
合理使用始终涉及基于平衡四个因素的情境敏感分析:
-
使用的目的和性质—批评、评论、教育、新闻报道、学术研究或研究等应用更有可能被认定为合理使用,尤其是当其他应用是商业性质时。
-
版权作品的性质—法院倾向于给予创意作品,如虚构写作、艺术、音乐、诗歌等,比非虚构文本更多的保护。
-
使用的数量或实质性部分—合理使用可能允许使用作品的一部分,尤其是当这部分是一个量身定制的组件时。
-
使用对作品潜在市场或价值的影响—如果作品的新使用产生了人们可能会购买而不是原始作品的东西,或者如果新作品以其他方式与原始作品竞争或降低其经济价值,那么该作品不太可能被认定为合理使用。
其中一些观点可能被视为有利于大型语言模型(LLMs),而另一些则与 LLMs 使用数据的方式相冲突。尽管如此,它们是机器学习和法律领域从业者激烈争论的主题,法院决定可能需要许多年。合理使用原则的许多应用是为了保护人们免受版权持有者的剥削。例如,如果你正在撰写负面产品评论,合理使用原则禁止公司因你使用他们的版权来压制你而起诉你。合理使用的其他应用可以防止社会需求的挫败,例如培训学生或学徒使用工具和技术。LLMs 特别强调了一些这些因素。从根本上说,它们通常使用他人创造的内容,但有些人认为某些类型的内容,如社交媒体帖子的评论,价值最小。LLMs 正在为已发表作品的价值创造一个新市场,但通常不会补偿该作品的所有者。
作为从业者,对你来说不满意但重要的答案是,你必须在一个不确定的环境中运作和做出决策。如果你可以创建你的训练数据,你可以绕过许多法律问题。从你拥有的内容中创建训练数据是生成式 AI 的一个特别可行的策略,因为,如第四章所述,需要最多数据的基模型是自监督的。因此,你可以获得大量数据来构建初始模型,然后像第五章所述,在更小的微调数据集上投入更多的工作。
你可能会失望地了解到,在这个领域工作的大多数人通常对与他们司法管辖权相关的法律不太熟悉。如果你找到一个符合你需求的许可证下发布的模型(做得好,检查了许可证!),那么训练或改进该模型所使用的数据的版权或许可证可能不允许他们以该许可证发布。这种普遍缺乏对数据许可问题的关注或意识,使你不得不尽可能检查与第三方模型训练数据相关的细节,并意识到许可问题在该领域普遍存在。
即使这些法律问题对想要构建大型语言模型(LLMs)的人来说得到了有利解决,但这并不意味着它是道德的。本章讨论的担忧有助于你考虑什么是对的或错的。然而,还有一个问题,那就是如何在法律不确定的环境中对待和与他人互动。依赖法律体系来使某事变得可接受很少是会赢得其他相关方好感和尊重的行为的标志。不难想象一个替代场景,即公司通过与提供数据的平台达成交易或建立伙伴关系,通过金钱或模型使用权的交易来增加同意的各方数量。一旦达成协议,合同可以解决法律模糊性带来的冲突,但不幸的是,这在 LLMs 领域是一个罕见的情况。
9.3.2 与补偿内容创作者相关的挑战
解决这一伦理问题的一个建议方案是支付存在于训练数据中的作者、艺术家和创作者的报酬。虽然从许多方面来看,这个方案在概念上很有吸引力,但它可能使技术的发展在经济上变得不可行。
如果有一种相对简单的方法来适当地补偿创作者使用他们的作品,那么社会更有可能达成一个令人满意的结局。通过简单的计算,我们可以估计出一百万本书乘以的结果,等于或大于购买训练语料库中每部作品副本的成本,这可能与训练模型本身的成本相当。对于训练数据创建成本高昂的模型来说,情况更加严峻。流行的图像生成模型 Stable Diffusion 在数亿张图像上进行了训练。支付训练模型成本的
倍以上,以向训练数据中的每位艺术家支付一美元,而且每张图像一美元的补偿可能不足以被认为是艺术家们认为的合理报酬。
另一种补偿方法是将补偿集中在使用点上:假设每次模型生成的内容来自你写的书籍,你都会收到模型创建者收入的百分比。LLM 生成的内容越频繁地依赖于你的作品,你收到的收入比例就越大。虽然这可能是一种使 LLM 技术的长期部署可行的途径,但实施这种模型存在重大的技术障碍。例如,关于追踪 LLM 生成的内容回溯到特定训练数据点的研发非常少。有理由相信这项任务是不可能的。
更好地研究将特定输出归因于特定世代,将输出限制仅依赖于训练数据的一个子集 [19],或者设计模型训练程序,其中归因是一个核心考虑因素(而不是在训练后集成到 LLM 中),这将使这个目标更容易实现。不幸的是,这种研究通常需要训练许多类似的 LLM;因此,成本很高。这种费用使得除了从模型中获利的科技公司之外,其他人难以进行研究。
这场对话尚未考虑识别每份文档的所有者并对其进行补偿的难度。此外,以这种规模支付金钱并非没有成本;仅处理费用就会是非微不足道的总支付额的一部分,因为每位作者收到的平均支付非常低。
如果认为 LLM 对社会构成威胁,那么你有一个简单的出路:你说所有这些担忧都是不首先创建 LLM 的另一个理由。如果你不认为 LLM 对社会构成威胁,而是一个积极的补充,那么你现在有一个难以回答的问题。如果你认同功利主义这样的道德体系,你可能会认为 LLM 在效用和自动化方面的净收益比内容创作者的非补偿和就业风险更为重要。确实,合理使用原则本身就是一种法律认可,即在某些情况下,版权持有人可能不强制他人行使他们的权利。
9.3.3 公共领域数据的局限性
在这一点上,你可能想知道是否存在没有版权的数据,以及我们是否都应该使用这些数据来训练 LLMs。确实,公有领域中有大量的数据,这意味着知识产权法不保护它,任何人都可以使用它而无需请求许可或补偿原始版权所有者。数据可能因各种原因进入公有领域,包括过时(大多数国家都有版权最长期限),非版权内容(事实信息、统计数据、没有大量人类创造性投入生成的数据,以及在美国某些形式的数据不是版权内容),或法律上成为公有领域(所有美国联邦作品根据法律都是公有领域,美国政府可以立法规定这些作品是公有领域)。公有领域的作品,也许结合在 MIT 许可或特定 Creative Commons 许可下工作的作品,这些许可旨在使数据广泛使用,可以使人能够在不处理这些担忧的情况下训练模型。然而,这样做存在几个重大的挑战。
隐性偏见和公有领域
公有领域内容的主要来源之一是那些已经过了版权保护期限的作品。因此,对早期文本存在极端的偏见。20 世纪初或更早时期撰写的书籍表达了与科学和技术截然不同的文化态度和信仰,并且与今天的作品相比,它们以不同的方式呈现世界。从许多角度来看,LLMs 落后于当前的文化态度会有很大的问题。它们会充满不准确的科学信息,加剧刻板印象和偏见,使用对当今观众来说不太熟悉的语言,并且难以有效地使用。
注意:1977 年之前出版的作品在发表后 95 年将失去版权,因此 1928 年出版的所有作品自 2024 年 1 月 1 日起进入公有领域,1977 年之前出版的所有作品将于 2073 年 1 月 1 日进入公有领域。根据现行版权法,从 2049 年开始,1978 年以后出版的作品将在创作者去世后 70 年进入公有领域,除非是公司创作的作品,这些作品将遵循 95 年后进入公有领域的旧规则。
模型是否应该接触种族主义?
老数据的问题,包括其中往往存在相当多的种族主义和性别歧视,令人沮丧地复杂。显然,我们不希望训练数据中包含任何种族主义或性别歧视的内容,因为这似乎是确保我们的模型不会充满种族主义和性别歧视偏见的一种理想手段。然而,如果你成功地从训练数据中排除了这些内容,那么如果用户要求模型避免生成种族主义或性别歧视的内容,你很难让模型做到这一点。总之,包含令人不快的内容是必要的,以便让模型意识到什么是不愉快的内容。
并非所有内容都属于公有领域
美国政府没有记录哪些作品属于公有领域和受版权保护。识别、收集和清理公有领域作品是一项庞大的工作,需要法律、技术和历史专业知识。虽然一些组织正在进行这方面的持续努力,但缺乏检查作品是否属于公有领域的便捷方式是阻止仅用此类作品训练模型的一个重大障碍。
9.4 LLM 输出的伦理问题
正如我们之前讨论的,大型语言模型(LLMs)是在主要从互联网收集的大量数据上训练的。互联网上充斥着许多不适宜的内容。这些内容包括明显的种族主义、性别歧视、有害的阴谋论和虚假信息。更广泛地说,还有无意中过时的世界观。LLMs 会捕捉到这些观点的模式,并乐意重复它们——例如,可以在图 9.3 中找到的一个例子,展示了 GPT-4 如何做出一个许多有良好意图的人都会做出的隐含性别歧视假设。
因此,LLM 的输出可能会出现问题,需要仔细的设计、测试,并且愿意对特定的部署说“不”。尽管我们已经讨论了输出内容可能明显和直接有问题,但 LLM 输出可能存在问题的间接方式也值得详细了解。首先是法律复杂性,即有效和许可的数据可能不会产生合法的输出。其次,我们必须考虑 LLM 中反馈的可能性,这意味着未来的 LLM 将基于未来的数据进行训练;我们必须小心不要让有害内容污染未来的训练。乍一看,这些问题似乎与开发者无关,但当你考虑微调 LLM 以适应你的问题时,这些问题就会出现,并且需要意识到这些风险以避免这些风险。
图 9.3 一个经典的性别刻板印象是男性是医生,女性是护士。这在语言中得到了反映,因此被模型学习。理想情况下,它应该回应说问题是不明确的,但相反,数据的偏见导致了输出的偏见。
9.4.1 LLM 输出的许可影响
第一个问题是与数据许可相关的问题,我们在上一节中已经介绍过。那次讨论集中在用于训练 LLM 的数据的伦理和有效性上。现在我们必须转变问题:某些数据在训练时几乎肯定合法,但可能会使输出不可用。
这个问题源于通常被误解的开源软件(OSS)许可的世界。有许多 OSS 许可证,我们不会一一列举,但一个常用的开源许可证,称为 GNU 通用公共许可证,或 GPL,是一个很好的例子。GPL 基本上说,你可以免费使用许可的代码,只要你将你使用、修改或添加的任何代码都放在 GPL 许可证下。这个故意“病毒式”的许可证迫使许可方遵循相同的规则,并在他们希望使用受 GPL 许可证覆盖的代码时将其代码作为开源发布。
接下来是问题:LLM 因其编写代码的能力而变得非常流行,并且它们是在 GPL 代码上训练的。LLM 自身的输出何时必须成为 GPL 许可的?当我们考虑与这种新情况相关的道德问题,而这些道德问题在上述任何许可中都没有明确解决时,多个层次的论点迅速出现。存在一系列可能性,主要有三种模式:
-
如果 LLM(大型语言模型)恰好重复了现有的 GPL 代码,那么它当然应该获得 GPL 许可。我们如何判断一个 LLM 是否精确地生成应该相应获得许可的现有代码的副本呢?
-
LLM 可能生成看似新颖的代码,但该算法可能需要特定的 GPL 训练数据来解决相关的问题以生成输出。这是否是对应获得许可的训练数据的修改?如果是这样,我们如何解决找到导致 LLM 生成任何给定输出的代码的技术问题?你在第五章中学到的检索增强生成(RAG)方法可能是做这件事的好方法。
-
如果我们在任何 GPL 代码上训练 LLM,有人可能会争辩说,LLM 的所有输出都需要 GPL 许可证!
无论如何,我们面临的问题是,虽然我们可以无疑地使用 GPL 数据来训练 LLM,但我们不清楚如何使用该 LLM 的输出。因此,了解这种风险后,如果你希望使用 LLM 进行这项工作,你现在面临一个道德问题,即在哪里划这条线。确实,公司必须自己判断风险,对于 GPL 输出侵权使用的责任人和责任程度尚不明确。是训练基于 GPL 数据的模型的组织,还是使用该模型基于 GPL 数据生产封闭源代码的公司,或者都不是?
GPL 许可证是有意为之的病毒式许可,许多公司将其视为一种防止他们保护其知识产权(体现在软件和源代码中)的毒药。这种“污染”的概念与我们的下一个话题相联系——LLM 的输出是否在污染构建和改进未来 LLM 所需的训练数据。
9.4.2 LLM 的输出是否污染了水源?
我们在本节开始时使用了一个基于材料科学和制造中一个著名问题的隐喻,具体来说是关于合金钢的。钢被用来建造各种东西,从建筑到医疗设备。许多钢的使用也涉及到对核辐射敏感的电子设备。由于 20 世纪 40 年代第一次核武器试验的结果,整个世界都被以前不存在的辐射污染了。除非你靠近核爆炸,否则辐射不足以伤害大多数东西。然而,辐射足以以这种方式污染全世界生产的所有钢,以至于你不能再为辐射敏感的应用制造钢[20]。人们会非法打捞几十年前沉没的船只,以找到未受背景辐射污染的现有钢。新的制造工艺可以生产出有限的清洁钢,但它们成本极高,因此在许多情况下经济上不可行。幸运的是,随着材料科学的进步和大气层核试验的停止,这个问题随着时间的推移而减少,但几十年来,世界受到了几次单一核试验部署的影响。
这里的类比并不是 LLMs 是核弹,而是它们的输出可能会毒害所有将用于构建未来更好 LLMs 的训练数据。研究人员已经确定了一种称为模式坍塌的现象,它展示了 LLMs 在用其他 LLMs 生成的数据上训练时可能会失败[21]。作为一个快速回顾,分布(数字集合)的模式是该集合中最常见的值。
当一个生成模型产生输出时,大部分输出将来自用于训练模型的分布内容中的模式。换句话说,模型的输出将强调其训练数据中最常见的组成部分。由于生成模型不会输出数据中的所有罕见或细微的情况,最常见的案例将在 LLM 的输出中更为普遍。这意味着与原始训练数据相比,模型中的模式被过度表示。
如果你接着在这个旧模型的输出上训练一个新的生成模型,你将开始以牺牲所有其他数据为代价进一步过度表示该模式。如果你重复多次,最终你会得到一个无用的模型,它总是反复输出相同的内容,如图 9.4 所示。
图 9.4 你可以将文本或图像视为来自数据分布,其中多样性和有趣的内容几乎必然来自分布的尾部(即分布中不太常见的部分),因为最常见的单词或内容通常是填充词或连接词,如单词the。我们的模型不会学习它们没有训练过的内容,并且不能学习分布中的所有内容,因此从模型中抽取的样本不可避免地会失去这些有趣的细节。如果重复,分布就会崩溃,只剩下最常见的组成部分。
这种担忧引发了伦理问题:在没有实施防止其输出污染未来训练数据的方法的情况下,我们应该将 LLMs(大型语言模型)公之于众吗?遗憾的是,解决这一担忧的机会可能已经过去了。LLM 生成的内容在经常用于训练 LLMs 的训练数据来源中很普遍,并且通常与人类生成的内容难以区分。目前似乎没有 LLM 提供商通过在输出中插入细微变化等步骤对 LLM 生成的内容进行水印标记,以使其易于识别为生成数据。虽然关于水印是否真正有效存在技术争议,但简单的方法对于大多数用例来说通常仍然足够。确实,在第二章中,我们讨论了同形异义词,即看起来相同的不同字符,对于 LLM 的输入是问题。但它们可以作为 LLM 输出的简单水印,允许轻松识别 LLM 可能生成的未经后处理或编辑的内容。作为有益的副作用,那些不想使用 AI 内容的人(例如,教师)将有一个比目前容易出错的检测 LLM 任务更可靠的选项[22]。
注意模式崩溃是一个早已为人所知的真实风险,因为它是一个超越生成式 AI 的问题。然而,人类增强的数据可以,但并不一定会减轻这一风险。本质上,只要你能向样本分布中注入新数据,就有可能从这些样本中获得价值。一种方法是通过人类修改 AI 生成的内容或使用 AI 修改他们的人类生成内容。自动化系统也可以提供价值,特别是那些捕获复杂领域知识,如物理模拟器或数学证明引擎(如 Lean),我们在第 6.2 节中讨论过。问题变成了这些增强做得有多好,它们可以带来多少价值,因为它们不会使无限改进成为可能。
第二个非技术性的担忧是我们必须质疑 LLMs 污染数据源的道德影响。自从 LLMs 出现以来,人们使用技术的方式已经发生了变化,可能发生了重大变化。然而,我们构建 LLMs 所依赖的数据是基于 LLMs 出现之前人们如何与信息互动的。例如,Stack Exchange 是一个高度评价的问答网站集合,尤其是在代码等技术主题上。因此,它被认为对训练 LLMs 特别重要。然而,ChatGPT 的发布本身可能正在伤害 Stack Exchange,减少了提问/回答的数量,从而减缓了新训练内容的积累[23]。换句话说,随着人们转向使用 LLMs 等工具来回答问题,人类在像 Stack Exchange 这样的网站上生成内容的需要和益处减少,因此可用的训练数据多样性降低。
这种行为的变化是一个更复杂的问题。Stack Exchange 及其网站上提问或回答问题的用户社区拥有自主权和应受尊重的权利。他们当前的政策是禁止使用 ChatGPT 和类似工具来回答问题。然而,我们必须考虑是否存在一个中间地带,其中生成的内容的谨慎应用可以与人类创造和编辑相结合,产生有益于人类和未来 LLMs 的良性循环和新的成果。这可能允许平台以更健康的方式持续增长,但前提是所有者和使用者都愿意接受。
最终,我们对大型语言模型(LLMs)的使用可能会产生意想不到的后果和难以想象的复杂性。作为用户,您必须决定是否愿意接受这些情况的风险,以及我们使用这些工具将如何改变未来迭代的轨迹。
9.5 LLM 伦理的其他探索
关于构建和使用 LLMs 的伦理影响的对话不断演变。尽管已经有很多关于这个主题的写作,但关于 LLMs 和 AI 的一般伦理仍有很多需要探索。在这里,我们专注于建立基础理解的关键主题。其他关键问题,如隐私、安全和潜在的滥用,在 Manning 的书籍中得到了进一步的探讨,例如 Numa Dhamani 和 Maggie Engler 的《生成式人工智能导论》[24]。
LLMs 和生成式人工智能将对世界产生深远的影响;对于任何新技术,了解其行为的基础及其使用的含义至关重要。在这本书中,我们涵盖了使 LLMs 工作的基本组件,探讨了常见的误解,并确定了其构建和使用的伦理考量。我们希望为您建立了一个坚实的基础,以便您继续探索这个领域。感谢您与我们一同踏上这段旅程。
摘要
-
LLM 通过一个模型就能用于各种任务的能力,帮助人们快速有效地使用它们来完成许多任务。这种广泛适用于许多任务的应用性也使得测试人们可能使用 LLM 的所有方式的安全性变得不可能。
-
从历史上看,自动化是一件好事。然而,LLM 对自动化知识工作构成了独特的风险,这与自动化体力劳动不同,后者是提高生活水平的传统驱动力。广泛自动化知识工作的真正影响尚不清楚。
-
一些人士担心,一个足够好的 LLM(大型语言模型)能够改进新的 LLM 的设计,这可能导致不需要人类的超级智能算法。
-
将任何算法与我们的意图对齐,而不是我们提出的要求,是一个重大的挑战,即使解决了,也可能不会降低风险。
-
由于技术发展速度快于法律,从道德上获取数据充满了法律问题。
-
在对训练数据中使用所有内容创作者的内容进行补偿的财务和技术物流方面,不太可能实际可行,这引发了关于使用他们数据的公平性的伦理问题。
-
公共领域的数据没有版权,太老了,不会造成问题,但它在确定其法律地位方面提出了不同的挑战。
-
LLM 生成数据的激增可能会影响我们未来构建的 LLM。我们必须考虑反馈循环的可能性以及模式崩溃的可能性。
第十章:参考文献
第一章
-
Young, B. (2023). AI 专家对 GPT-4 架构进行推测。Weights & Biases。
api.wandb.ai/links/byyoung3/8zxbl12q
-
Micikevicius, P. (2017)。深度神经网络混合精度训练。NVIDIA 开发者。
mng.bz/6eaA
-
利用 Google Cloud TPUs 加速 AI 开发。
cloud.google.com/
tpu -
Metz, C. (2023 年 7 月 23 日)。研究人员质疑 ChatGPT 和其他聊天机器人的安全控制。纽约时报。
-
Hu, K. (2023 年 2 月 2 日)。ChatGPT 创下用户增长最快的记录——分析师评论。路透社。
mng.bz/XxKv
第二章
-
Friederici, A. D. (2011)。语言处理的大脑基础:从结构到功能。生理学评论,91,1357-1392。
doi.org/10.1152/physrev
.00006.2011 -
Nation, P. 和 Waring, R. (1997)。词汇量、文本覆盖率和词汇表。在:N. Schmitt 和 M. McCarthy 编著,《词汇:描述、获取和教学法》(第 6-19 页)。剑桥大学出版社。
-
Brown, T. B.,Mann, B.,Ryder, N. 等. (2020)。语言模型是少样本学习者。
arxiv.org/abs/2005.14165
-
Google/SentencePiece。
github.com/google/sentencepiece
-
Petrov, A.,La Malfa, E.,Torr, P. H. S. 和 Bibi, A. (2023)。语言模型分词器在语言间引入不公平。
arxiv.org/abs/2305.15425
第三章
-
Denk, T. (2019)。Transformer 的位置编码中的线性关系。
mng.bz/oKxd
-
Raff, E. (2022)。深度学习内部。Manning。
第四章
-
Yong, E. (2012)。模拟大脑获得最高测试分数。自然。
www.nature
.com/articles/nature.2012.11914 -
Forsyth, J. A. 和 Mongrut, S. (2022)。竞争优势的持续时间是否推动股市的长期回报?Revista Contabilidade & Finanças, 33(89),329–342。
doi.org/10.1590/1808-057x202113660
-
Lin, S.,Hilton, J. 和 Evans, O. (2022)。TruthfulQA:衡量模型模仿人类错误的方式。
arxiv.org/abs/2109.07958
-
Parrish, A.,Chen, A.,Nangia, N. 等. (2022) BBQ:问答中的手建偏差基准。
arxiv.org/abs/2110.08193
) -
Chen, M.,Tworek, J.,Jun, H. 等. (2021)。评估在代码上训练的大型语言模型。
arxiv.org/abs/2107.03374
-
我们如何画一只鸭子(为了创建 tikzducks 包并将其存储在 CTAN 中)?
mng.bz/W2Jg
-
Sutton, R. (2019)。苦涩的教训。
mng.bz/EaJq
第五章
-
Barber, R. G., Oza, A., Carlson, R. 和 Ramirez, R. (2023 年 10 月 18 日)。为什么科学家们为了研究而重新激活蜘蛛尸体。NPR。
mng.bz/lYgj
-
OpenAI。微调。
mng.bz/dXnD
-
Hugging Face。微调预训练模型。
huggingface.co/docs/
transformers/training -
Luo, Y, Yang, Z., Meng, F. 等人 (2025)。在持续微调期间大型语言模型中灾难性遗忘的实证研究。
arxiv.org/abs/
2308.08747 -
McCloskey, M. 和 Cohen, N. J. (1989)。连接主义网络中的灾难性干扰。《学习与动机心理学》,第 24 卷,109-165。
doi.org/
10.1016/S0079-7421(08)60536-8 -
Belrose, N., Schneider-Joseph, D., Ravfogel, S. 等人 (2023). LEACE:闭形式下的完美线性概念擦除。
arxiv.org/abs/2306.03819
-
Phung, D. V., Thakur, A., Castricato, L., Tow, J. 和 Havrilla, A. (2025). 实施 RLHF:使用 trlX 学习总结。度量与衡。
mng.bz/rKzg
-
Kolter, Z. 和 Madry, M. (未注明日期)。对抗鲁棒性:理论与实践。
adversarial-ml-tutorial.org/
-
OpenAI。 (2023 年 3 月 27 日)。GPT-4 技术报告。
cdn.openai.com/
papers/gpt-4.pdf -
Chowdhery, A., Narang, S., Devlin, J. 等人 (2022)。PaLM:通过路径扩展语言建模。
arxiv.org/abs/2204.02311
-
Liang, W., Izzo, Z., Zhang, Y., 等人 (2024). 在大规模上监控 AI 修改内容:ChatGPT 对 AI 会议同行评审影响的案例研究。
arxiv.org/abs/2403.07183
-
Li, C. 和 Flanigan, J. (2023)。任务污染:语言模型可能不再是少样本了。
arxiv.org/abs/2312.16337
-
Near, J. P. 和 Abuah, C. (2021)。编程差分隐私。
prog
ramming-dp.com/
第六章
-
Albergotti, R. 和 Matsakis, L. (2023 年 1 月 23 日)。OpenAI 雇佣了一支承包军,使基础编码变得过时。Semafor。
mng.bz/MDGQ
-
介绍 Code Llama,一种用于编码的顶尖大型语言模型。(2023 年 8 月 24 日)。Meta。
mng.bz/av2j
-
von Werra, L., and Ben Allal, L. (2023, May 4). StarCoder: A state-of-the-art LLM for code. Hugging Face.
huggingface.co/blog/starcoder
-
Biderman, S., and Raff, E. (2022). Fooling MOSS detection with pretrained language models.
arxiv.org/abs/2201.07406
. -
Dyer, E., and Gur-Ari, G. (2020, June 30). Minerva: Solving quantitative reasoning problems with language models. Google Research.
mng.bz/gane
. -
Azerbayev, Z., Schoelkopf, H., Paster, K., et al. (2023, October 16). Llemma: An open language model for mathematics. EleutherAI.
blog.eleuther.ai/
llemma/ -
Richardson, D. (1968). Some undecidable problems involving elementary functions of a real variable. Journal of Symbolic Logic, 33, 514–520.
-
Nogueira, R., Jiang, Z., and Lin, J. (2021). Investigating the limitations of transformers with simple arithmetic tasks.
arxiv.org/abs/2102.13019v3
-
Golkar, S., Pettee, M., Eickenberg, M., et al. (2024). Investigating the limitations of transformers with simple arithmetic tasks.
arxiv.org/abs/2310.02989
第七章
-
Romeo, R. R., Leonard, J. A., Robinson, S. T., et al. (2018). Beyond the 30-million-word gap: Children’s conversational exposure is associated with language-related brain function. Psychological Science, 29, 700–710.
doi.org/10.1177/
0956797617742725 -
Gilkerson, J., Richards, J. A., Warren, S. F., et al. (2017). Mapping the early language environment using all-day recordings and automated analysis. American Journal of Speech-Language Pathology, 26, 248-265.
doi.org/10.1044/2016_AJSLP-15-0169
-
Shumailov, I., Shumaylov, Z., Zhao, Y., et al. (2024). The curse of recursion: Training on generated data makes models forget.
arxiv.org/abs/2305.17493
-
Stanovich K. E. (2009). What Intelligence Tests Miss: The Psychology of Rational Thought. Yale University Press.
-
改进合成图像的真实性。 (2017, July 7). Apple Machine Learning Research.
machinelearning.apple.com/research/gan
-
Dai, D., Sun, Y., Dong, L., et al. (2023). Why can GPT learn in-context? Language models secretly perform gradient descent as meta-optimizers. In Findings of the Association for Computational Linguistics: ACL 2023 (pp. 4005–4019). Association for Computational Linguistics.
-
Hiller, J. (2023, December 12). Microsoft targets nuclear to power AI operations. Wall Street Journal.
mng.bz/pKe5
-
Disavino, S. (2023 年 9 月 8 日). 德克萨斯州电力价格飙升,电网在热浪中通过可靠性测试。路透社。
mng.bz/OB0K
-
最近添加的 emoji,v15.1。 (未注明日期)。Unicode。
www.unicode.org/emoji/charts-15.1/emoji-released.html
-
Wei, J., Wang, X., Schuurmans, D. 等. (2023 年)。思维链提示引发大型语言模型的推理。
arxiv.org/abs/2201.11903
-
Wang, L., Xu, W., Lan, Y. 等. (2023 年)。计划-解决提示:通过大型语言模型提高零样本思维链推理。[第 61 届计算语言学年会*(第 1 卷:长篇论文,第 2609-2634 页)。计算语言学协会。
-
Guan, L., Valmeekam, K., Sreedharan, S. 和 Kambhampati, S. (2023 年)。利用预训练的大型语言模型构建和利用世界模型以进行基于模型的任务规划。
arxiv.org/abs/2305.14909
-
Bhargava, A. Y. (2015 年). Grokking Algorithms: An illustrated Guide for Programmers and Other Curious People。Manning Publications。
-
Merrill, W. 和 Sabharwal, S. (2024 年)。具有思维链的 Transformer 的表达能力。在2024 年学习表示国际会议。
openreview.net/forum?id=NjNGlPh8Wh
-
Carlini, N. (2023 年 9 月 22 日). 与大型语言模型下棋。
nicholas.carlini.com/writing/2023/chess-llm.html
-
Edwards B. (2022 年 11 月 7 日). 新的围棋技巧击败了世界级围棋 AI——但输给了业余爱好者。Ars Technica。
mng.bz/dW6O
第八章
-
Yagoda, M. (2024 年 2 月 23 日). 航空公司因其聊天机器人给出糟糕的建议而承担责任——这对旅客意味着什么。BBC。
mng.bz/xK7W
-
Notopoulos, K. (2023 年 12 月 18 日)。一家汽车经销商在其网站上添加了 AI 聊天机器人:然后一切乱套了。
mng.bz/AQPz
-
Suresh, H., Lao, N., 和 Liccardi, I. (2020 年). 误置的信任:衡量机器学习对人类决策的干扰。在第 12 届 ACM 网络科学会议(WebSci '20)(第 315-324 页)。计算机制造协会。
doi.org/10.1145/3394231.3397922
第九章
-
Hofmann, V., Kalluri, P. R., Jurafsky, D., 和 King, S. (2024 年). 方言偏见预测 AI 对人们性格、就业能力和犯罪性的判断。
arxiv.org/abs/2403.00742
-
Omiye, J. A., Lester, J. C., Spichak, S. 等人 (2023). 大型语言模型传播基于种族的医学。npj 数字医学,6,195。
doi.org/10.1038/
s41746-023-00939-z -
农业劳动力。 (2025 年 1 月 8 日)。经济研究服务。
www.ers.usda
.gov/topics/farm-economy/farm-labor/ -
Verma, P. 和 De Vync, G. (2023 年 6 月 2 日)。ChatGPT 夺走了他们的工作:现在他们遛狗和修理空调。华盛顿邮报。
mng.bz/EwQd
-
Marr, B. (2024 年 4 月 18 日)。生成式 AI 在视频游戏开发中的作用。Forbes。
mng.bz/Pdpn
-
Lev-Ram, M. (2023 年 1 月 26 日)。科技巨头裁员受害者发现其他公司争相雇佣他们。Forbes。
mng.bz/JYXV
-
Lohr, S. (2024 年 2 月 1 日)。报告称,生成式 AI 的最大影响将在银行和科技领域。纽约时报。
mng.bz/wJ7P
-
Pethokoukis, J. (2016 年 6 月 16 日)。ATM 和银行柜员的故事揭示了“机器人崛起”和就业的情况。美国企业研究所。
mng.bz/qx7r
-
Hunter, L. W., Bernhardt, A., Hughes, K. L. 和 Skuratowicz, E. (2001)。不仅仅是 ATM:零售银行业的科技、企业策略、就业和收入。ILR 评论,54(2A),402-424。
doi.org/10.1177/001979390105400222
-
Rosalsky, G. (2024 年 6 月 18 日)。如果 AI 如此出色,为什么翻译工作仍然如此之多?NPR。
mng.bz/7pBv
-
Marr, B. (2024 年 5 月 28 日)。生成式 AI 将如何改变艺术家和设计师的工作。Forbes。
mng.bz/mG7a
-
Autor, D.,Chin, C.,Salomons, A. 和 Seegmiller, B. (2024)。新前沿:1940-2018 年新工作的起源和内容。经济学季刊,139,1399-1465。
doi.org/10.1093/qje/qjae008
-
Dave, P. (2023 年 4 月 8 日)。StackOverflow 将对 AI 巨头收取训练数据费用。Wired。
mng.bz/5gDO
-
Grimm, D. (2024 年 5 月 8 日)。Stack Overflow 因用户反抗 OpenAI 合作而大规模封禁用户——封禁用户删除答案以防止其被用于训练 ChatGPT。Tom’s Hardware。
mng.bz/nR75
-
Bishop, T. (2020 年 10 月 20 日)。Expedia 集团首席执行官谈谷歌反垄断案:“非常高兴看到政府最终采取行动。”Geek Wire。
mng.bz/vK7p
-
Siddiqui, T. (2023 年 6 月 29 日)。随着技术的发展,必须考虑人工智能的风险:杰弗里·辛顿。多伦多大学。
mng.bz/4aNR
-
Bengio, Y. (2023 年 6 月 24 日)。关于灾难性 AI 风险的常见问题解答。
mng.bz/QDO6
-
介绍 Llama 3.1:我们迄今为止最强大的模型。(2024 年 7 月 23 日)。Meta。
ai.meta.com/blog/meta-llama-3-1/
-
Min, S., Gururangan, S., Wallace, E., et al. (2023). SILO 语言模型:在非参数数据集中隔离法律风险。
arxiv.org/abs/2308.04430
-
Rivero, N. (2022 年 9 月 21 日)。低背景金属:纯净、未被污染的宝藏。《Quartz》。
mng.bz/eyXZ
-
Shumailov, I., Shumaylov, Z., Zhao, Y. 等. (2024)。当在递归生成数据上训练时,AI 模型会崩溃。《自然》,631 期,第 755–759 页。
doi.org/10.1038/s41586-024-07566-y
-
Coffey, L. (2024 年 2 月 9 日)。教授们对检测 AI 生成写作的工具持谨慎态度。《高等教育内参》。
mng.bz/Xxj9
-
ChatGPT 推出后,Stack Exchange 的流量是否有所下降?(2023)。Stack Exchange。
mng.bz/yW7p
-
Dhamani, N. 和 Engler, M. (2024)。生成式 AI 导论。Manning。
www.manning.com/books/introduction-to-generative-ai