DLAI-大模型生成式人工智能笔记-全-
DLAI 大模型生成式人工智能笔记(全)
001:0_课程介绍
在本课程中,我们将深入学*如何使用大型语言模型构建生成式人工智能应用。我们将探讨其技术原理、项目生命周期以及实际应用方法。
大型语言模型是一项非常令人兴奋的技术。尽管备受关注,但其作为开发者工具的潜力仍被许多人低估。具体而言,过去需要数月才能构建的许多机器学*和人工智能应用,现在可以在数天或数周内完成。本课程将深入探讨LLM技术的工作原理,涵盖模型训练、指令微调、精调等许多技术细节,并介绍生成式AI项目生命周期框架,以帮助您规划和执行项目。
生成式AI,特别是大型语言模型,是一项通用技术。这意味着,与深度学*和电力等其他通用技术类似,它不仅适用于单一应用,而且适用于经济体中许多不同领域的众多应用。因此,类似于大约15年前开始的深度学*浪潮,未来多年我们面前有许多重要工作需要完成,需要包括您在内的许多人来识别用例并构建具体应用。
由于这项技术非常新颖,真正知道如何使用它的人很少,许多公司目前也正急于寻找和聘用真正懂得如何使用LLM构建应用的人才。如果您希望更好地定位自己以获得这些职位,我希望本课程也能为您提供帮助。
我很高兴能与来自AWS团队的优秀讲师们共同为您带来这门课程,包括今天在场的Antje Baf、Mike Chambers、Shelby Eenbroke,以及将在实验环节授课的第四位讲师Chris Frankly。Antje和Mike都是生成式AI开发者布道师,Shelby和Chris都是生成式AI解决方案架构师。他们都有丰富的经验,帮助许多不同公司使用LLM构建了许多富有创意的应用。我期待他们所有人在这门课程中分享这些丰富的实践经验。他们与亚马逊AWS、Hugging Face以及全球许多顶尖大学的众多行业专家和应用科学家合作,共同开发了本课程的内容。
Antje,或许您可以再介绍一下这门课程?
当然,谢谢Andrew。很高兴能再次与您在这个令人兴奋的生成式AI领域合作。通过这门关于大型语言模型的生成式AI课程,我们创建了一系列课程,面向希望学*LLM工作原理技术基础,以及其训练、微调和部署最佳实践的AI爱好者、工程师或数据科学家。
在预备知识方面,我们假设您已经熟悉Python编程,并至少具备基础的数据科学和机器学*概念。如果您有一些PyTorch或TensorFlow的经验,那就足够了。
在本课程中,您将详细探索构成典型生成式AI项目生命周期的各个步骤,从界定问题、选择语言模型,到为部署优化模型并将其集成到您的应用程序中。本课程不仅浅显地涵盖所有主题,还会花时间确保您对这些技术有深入的技术理解,并为您在构建自己的生成式AI项目时真正知道自己在做什么做好充分准备。
Mike,您能更详细地介绍一下学*者每周会看到什么内容吗?

当然,Antje,谢谢。在第一周,您将研究为大型语言模型提供动力的Transformer架构,探索这些模型是如何训练的,并理解开发这些强大LLM所需的计算资源。您还将学*一种称为上下文学*的技术,了解如何通过提示工程在推理时引导模型输出,以及如何调整LLM最重要的生成参数来优化模型输出。
在第二周,您将探索通过一个称为指令精调的过程,使预训练模型适应特定任务和数据的选项。
在第三周,您将了解如何使语言模型的输出与人类价值观保持一致,以增加帮助性并减少潜在的危害和毒性。
但我们不止于理论。每周都包含一个动手实验,您将能够在AWS环境中亲自尝试这些技术,该环境包含处理大型模型所需的所有资源,且对您免费。


Shelby,您能再介绍一下动手实验吗?

在第一个动手实验中,您将针对给定的生成任务(本例中是对话摘要)构建并比较不同的提示和输入。您还将探索不同的推理参数和采样策略,以获得如何进一步改进生成模型响应的直观理解。
在第二个动手实验中,您将对来自流行的开源模型中心Hugging Face的现有大型语言模型进行精调。您将尝试完全精调和参数高效精调,并了解PEFT如何让您的工作流程更加高效。
在第三个实验中,您将动手实践基于人类反馈的强化学*。您将构建一个奖励模型分类器,将模型响应标记为有毒或无毒。如果您现在还不理解所有这些术语和概念,请不要担心,您将在本课程中更详细地深入探讨每一个主题。


我很高兴能与Antje、Mike、Shelby以及Chris一起,为您呈现这门深入探讨LLM技术的课程。您完成本课程后,将实践许多不同的具体代码示例,了解如何构建或使用LLM。我相信,许多代码片段将直接对您自己的工作有用。希望您享受这门课程,并运用所学知识构建一些真正令人兴奋的应用。
那么,让我们进入下一个视频,开始深入探讨如何使用LLM构建应用程序。
002:第一周介绍
在本节课中,我们将要学*第一周的核心内容,主要包括两个部分:深入理解Transformer网络的工作原理,以及生成式人工智能项目的完整生命周期。这些知识将为你理解和应用大型语言模型打下坚实的基础。
深入Transformer架构 🧠
上一节我们介绍了本周的学*目标,本节中我们来看看第一个核心主题:Transformer网络。Transformer架构自2017年《Attention Is All You Need》论文发表以来,已成为许多模型的基础。虽然其内部的数据处理过程相当复杂,但我们将从高层次视角切入,并深入探讨其关键部分,以理解这些模型为何以及如何能够理解语言。
其核心在于自注意力和多头自注意力机制。这些机制使得模型能够并行处理大量数据,从而在现代GPU上高效运行并实现规模化扩展。理解这些细微之处对于实际应用这些模型至关重要。
以下是Transformer架构中几个关键概念的简要说明:
- 自注意力机制:允许模型在处理一个词时,关注输入序列中的所有其他词,以更好地理解上下文。
- 多头注意力:通过并行运行多个自注意力“头”,使模型能够同时关注来自不同表示子空间的信息。
- 并行化处理:这是Transformer架构得以广泛应用的关键,使其能够充分利用现代硬件的计算能力。
尽管本课程主要关注文本,但值得注意的是,基础的Transformer架构也为视觉Transformer等模型奠定了基础,成为了许多机器学*领域的关键构建模块。
生成式AI项目生命周期 🔄
在了解了模型的工作原理后,接下来我们需要掌握如何规划自己的生成式AI项目。生成式AI项目生命周期将引导你完成开发应用程序时必须经历的各个阶段和决策。
首先,你需要决定是直接使用现成的基础模型,还是从头开始预训练自己的模型。随后,你需要考虑是否要针对自己的特定数据对该模型进行微调和定制。
面对众多开源或非开源的大型模型选项,许多开发者会困惑于如何选择。因此,掌握评估方法并选择合适规模的模型至关重要。有些用例需要模型具备广泛的知识和强大的泛化能力,这时可能需要数百亿甚至更大参数的模型。而对于专注于单一任务的应用,有时使用较小的模型也能获得相似甚至非常好的效果。
以下是项目生命周期中的几个关键决策点:
- 模型选择:评估并决定使用现有的基础模型还是自行预训练。
- 模型定制:根据特定应用需求,决定是否以及如何对选定的模型进行微调。
- 规模权衡:在模型的通用能力(需要大规模参数)与特定任务性能(可能只需较小模型)之间做出平衡。
本节课中我们一起学*了Transformer架构的核心直觉及其并行化优势,并了解了生成式AI项目从模型选择到规模权衡的完整生命周期。这些知识将帮助你在实际项目中更好地理解和运用大型语言模型。

接下来,让我们进入下一个视频,Mike将首先深入探讨大型语言模型的多种不同用例。
003:2_生成式AI与大语言模型


概述
在本节课中,我们将要学*大型语言模型的基础知识。我们将探讨其应用场景、工作原理、提示工程技巧、如何生成创意文本,并概述生成式AI项目的生命周期。
什么是生成式AI?
鉴于您对本课程的兴趣,您很可能已经尝试过生成式AI工具,或者有此意愿。无论是聊天机器人、根据文本生成图像的工具,还是帮助您开发代码的插件,您在这些工具中看到的是一种能够创建模仿或接*人类能力内容的机器。

生成式AI是传统机器学*的一个子集。支撑生成式AI的机器学*模型,通过在海量由人类生成的数据集中寻找统计模式,从而*得这些能力。


大型语言模型经过数周乃至数月的时间,在大量计算资源的支持下,在数万亿单词上进行了训练。这些我们称之为基础模型的模型,拥有数十亿参数,展现出超越单纯语言处理的新兴能力,研究人员正在解锁它们分解复杂任务、进行推理和解决问题的能力。
以下是部分基础模型(有时称为基座模型)及其相对参数规模的集合。您将在后续课程中更详细地了解这些参数。目前,您可以将参数视为模型的“记忆”。模型参数越多,其“记忆”就越丰富,事实证明,它能执行的任务也越复杂。
在本课程中,我们将用紫色圆圈代表大型语言模型。在实验环节,您将使用一个特定的开源模型 FLAN-T5 来执行语言任务。您可以直接使用这些模型,也可以通过应用微调技术使其适应您的特定用例。这样,您无需从头开始训练新模型,就能快速构建定制化解决方案。
虽然生成式AI模型正被开发用于多种模态(包括图像、视频、音频和语音),但在本课程中,您将专注于大型语言模型及其在自然语言生成中的应用。您将了解它们的构建和训练方式、如何通过文本(称为提示)与它们交互、如何针对您的用例和数据对模型进行微调,以及如何将它们部署到应用程序中以解决您的业务和社会任务。

与大型语言模型的交互方式
与语言模型的交互方式与其他机器学*和编程范式有很大不同。在其他情况下,您需要编写具有正式语法的计算机代码来与库和API交互。相比之下,大型语言模型能够接收自然语言或人类编写的指令,并像人类一样执行任务。
您传递给大型语言模型的文本被称为 提示。提示可用的内存称为 上下文窗口。这个窗口通常足够容纳几千个单词,但具体大小因模型而异。
提示与补全示例

在这个例子中,您要求模型确定木卫三在太阳系中的位置。提示被传递给模型,模型随后预测接下来的单词。因为您的提示包含一个问题,所以模型生成了一个答案。模型的输出被称为 补全。使用模型生成文本的行为被称为 推理。
补全由原始提示中包含的文本和生成的文本共同组成。您可以看到,这个模型很好地回答了您的问题。它正确地识别出木卫三是木星的一颗卫星,并为您的疑问生成了一个合理的答案,指出这颗卫星位于木星的轨道内。
在本课程中,您将看到许多这种风格的提示和补全示例。
总结

本节课中,我们一起学*了生成式AI与大型语言模型的基础概念。我们了解了生成式AI如何作为机器学*的一个子集,通过在海量数据中学*模式来模仿人类创造力。我们认识了基础模型及其参数规模的意义,并明确了本课程将专注于大型语言模型在自然语言生成中的应用。我们还学*了与LLM交互的核心方式——通过提示和上下文窗口,并理解了推理过程如何产生补全。这些基础知识为我们后续深入探讨提示工程、模型微调和项目生命周期奠定了坚实的基础。
004:3_大语言模型的应用场景和任务
在本节课中,我们将要学*大型语言模型(LLMs)和生成式人工智能(Generative AI)的多种应用场景和任务。许多人可能认为LLMs主要专注于聊天任务,因为聊天机器人非常引人注目且备受关注。然而,基于“下一个词预测”这一核心概念,LLMs的能力远不止于此。我们将探讨从文本生成到代码翻译,再到信息检索等一系列任务,并了解模型规模如何影响其能力。

文本生成任务 🖋️
上一节我们提到了“下一个词预测”是LLMs的基础。本节中我们来看看这一概念如何应用于多种文本生成任务。
以下是基于提示词(prompt)进行文本生成的一些具体应用:
- 基础聊天机器人:这是最直接的应用,模型根据对话历史生成连贯的回复。
- 文章撰写:你可以提供一个主题或开头句作为提示,让模型续写一篇文章或论述。
- 对话摘要:你可以将一段对话作为提示的一部分输入给模型,模型会利用其对自然语言的理解来生成摘要。
翻译任务 🌐
除了生成文本,LLMs在翻译领域也表现出强大的能力。
以下是LLMs可以执行的翻译任务类型:
- 传统语言翻译:例如,在法语与德语、英语与西班牙语等不同语言之间进行互译。
- 自然语言到机器代码的翻译:你可以用自然语言描述一个编程任务,模型会生成相应的代码。例如,提示词可以是:“写一段Python代码,用于返回数据框中每一列的平均值。” 模型生成的代码可以直接传递给解释器执行。
信息提取与分类任务 🔍
LLMs同样可以用于执行更具体、更聚焦的任务,例如从文本中提取特定信息。
一个典型的应用是命名实体识别,这是一种词语分类任务。例如,你可以要求模型从一篇新闻文章中识别出所有提到的人物和地点。模型凭借其参数中编码的知识理解,能够正确执行此任务并将请求的信息返回给你。
增强与扩展能力 🚀
LLMs一个活跃的发展领域是通过连接外部数据源或调用外部API来增强其能力。

这种能力使模型能够获取其预训练阶段未知的信息,并实现与现实世界的交互。在本课程的第三周,你将深入学*如何实现这一点。
模型规模与能力 📈
开发者们发现,随着基础模型的参数规模从数亿增长到数十亿甚至数千亿,模型对语言的主观理解能力也随之显著提升。
这种存储在模型参数中的语言理解能力,正是模型处理、推理并最终解决你所给任务的基础。

但同时,较小的模型也可以通过微调在特定的、聚焦的任务上表现出色。在本课程的第二周,你将了解更多关于微调的方法。
过去几年LLMs能力的快速提升,很大程度上归功于其背后的架构。让我们进入下一个视频来更仔细地探讨这一点。

本节课总结:本节课我们一起学*了大型语言模型广泛的应用场景。我们了解到,基于“下一个词预测”,LLMs不仅能驱动聊天机器人,还能完成文章撰写、摘要、多种翻译(包括生成代码)、信息提取(如命名实体识别)等任务。此外,通过连接外部数据或API可以进一步增强模型。模型的参数规模与其语言理解能力密切相关,而较小的模型也可以通过微调在特定任务上取得优异表现。这些能力的核心都源于其强大的模型架构。
005:Transformer之前的文本生成
在本节课中,我们将要学*Transformer架构出现之前的文本生成技术。我们将回顾循环神经网络(RNN)的工作原理及其局限性,并探讨语言本身的复杂性如何为早期模型带来挑战。最后,我们将看到Transformer架构的诞生如何解决了这些问题,为现代生成式AI的突破奠定了基础。
生成算法并非新事物。
在Transformer出现之前,历代语言模型使用一种称为循环神经网络(RNN)的架构。

RNN在其时代虽然强大,但受限于执行生成任务所需的计算量和内存。
让我们看一个RNN执行简单“下一个词预测”生成任务的例子。

当模型只看到前一个词时,预测效果不可能很好。为了能让RNN看到文本中更多的上文,你必须显著扩展模型使用的资源。然而,即使扩展了模型,预测仍然可能失败,因为它仍然没有看到足够的输入来做出好的预测。
为了成功预测下一个词,模型需要看到的不仅仅是前几个词。模型需要理解整个句子,甚至整个文档。


这里的问题在于语言是复杂的。在许多语言中,一个词可以有多种含义,这些词被称为同形异义词。


在这个例子中,只有通过句子的上下文,我们才能明白“bank”指的是哪种含义。
句子结构中的词语可能具有歧义,或者存在我们所说的句法歧义。




以这个句子为例:“The teacher taught the student with the book.”(老师用书教学生。/ 老师教了那个有书的学生。)老师是用书来教,还是学生有书,或者两者都是?如果有时连我们自己都无法理解,算法又如何能理解人类语言呢?
然而在2017年,随着谷歌和多伦多大学发表的论文《Attention Is All You Need》的发布,一切都改变了,Transformer架构诞生了。
这种新颖的方法解锁了我们今天所见的生成式AI的进展。它可以高效地扩展以利用多核GPU,能够并行处理输入数据,从而利用更大的训练数据集。最关键的是,它能够学会关注其正在处理的词语的含义。

而“注意力就是你所需要的一切”,这正是论文的标题。

本节课中我们一起学*了Transformer架构出现前的文本生成技术。我们探讨了循环神经网络(RNN)在生成任务中的工作原理及其在计算资源和理解上下文方面的局限性。我们还分析了语言本身的复杂性,如同形异义词和句法歧义,给早期模型带来的挑战。最后,我们了解到2017年Transformer架构的提出,通过其高效的并行处理能力和注意力机制,为克服这些限制、推动生成式AI的飞速发展奠定了基础。
006:Transformer架构
在本节课中,我们将要学*Transformer架构,这是构建现代大型语言模型(LLM)的核心。我们将了解它如何通过自注意力机制显著提升自然语言处理任务的性能,并详细拆解其编码器和解码器的工作流程。
概述
使用Transformer架构构建大型语言模型,相比早期的循环神经网络(RNN),极大地提升了自然语言任务的性能,并引发了生成能力的爆炸式增长。
Transformer架构的强大之处在于其能够学*句子中所有单词的相关性和上下文联系。
自注意力机制
上一节我们提到了Transformer的核心优势,本节中我们来看看这种能力的具体实现:自注意力机制。
该架构不仅关注相邻的单词,更能关注句子中的每一个其他单词。它通过为这些关系应用注意力权重,使得模型能够学*每个单词与其他所有单词之间的相关性,无论它们在输入中的位置如何。这赋予了算法理解“谁拥有书”、“谁可能拥有书”以及这是否与文档更广泛的上下文相关的能力。
这些注意力权重是在LLM训练过程中学*得到的。下图被称为注意力图,在这个示意性示例中,它有助于说明每个单词与所有其他单词之间的注意力权重。可以看到,“书”这个词与“老师”和“学生”有很强的关联(即给予了高度关注)。这就是所谓的自注意力。以这种方式在整个输入中学*注意力的能力,显著提升了模型编码语言的能力。
Transformer架构总览
既然我们已经了解了Transformer架构的一个关键属性——自注意力,现在让我们从高层次上看看模型是如何工作的。
以下是Transformer架构的简化图示,以便我们能从高层次关注这些过程发生的位置。Transformer架构分为两个不同的部分:编码器和解码器。这两个组件协同工作,并且有许多相似之处。另外请注意,您看到的图示源自原始的《Attention Is All You Need》论文。请注意模型的输入在底部,输出在顶部。在课程中,我们将尽可能保持这种表示方式。
文本的数值化表示:分词与嵌入
机器学*模型本质上是大型的统计计算器,它们处理的是数字,而非单词。因此,在将文本传递给模型处理之前,必须首先对单词进行分词。简而言之,这会将单词转换为数字,每个数字代表模型可以处理的所有可能单词词典中的一个位置。
以下是可选的分词方法:
- 分词ID可以对应完整的单词。
- 分词ID也可以代表单词的一部分。
重要的是,一旦选择了用于训练模型的分词器,在生成文本时也必须使用相同的分词器。
当输入被表示为数字后,就可以将其传递到嵌入层。该层是一个可训练的向量嵌入空间,一个高维空间,其中每个分词被表示为一个向量,并占据该空间内的一个独特位置。词汇表中的每个分词ID都被映射到一个多维向量,其直观理解是这些向量能够学*编码输入序列中各个分词的语义和上下文。
向量嵌入空间在自然语言处理中已使用了一段时间。上一代语言算法如Word2Vec就使用了这一概念。如果您不熟悉这个,请不要担心,您将在整个课程中看到相关示例,并且本周的阅读练*中提供了一些额外资源的链接。
回顾示例序列,在这个简单案例中,每个单词都匹配到一个分词ID,并且每个分词都被映射到一个向量。在原始Transformer论文中,向量大小实际上是512,远比本图能容纳的大。为了简化,假设向量大小仅为3,您可以将单词绘制到一个三维空间中,并观察这些单词之间的关系。现在您可以看到如何关联嵌入空间中位置相*的单词,以及如何计算单词之间的距离(作为一个角度),这赋予了模型从数学上理解语言的能力。
位置编码与自注意力层
当您将分词向量输入到编码器或解码器的基础部分时,还需要添加位置编码。模型并行处理每个输入分词,因此通过添加位置编码,可以保留关于单词顺序的信息,而不会丢失单词在句子中位置的相关性。
在将输入分词和位置编码相加之后,将得到的向量传递到自注意力层。在这里,模型分析输入序列中分词之间的关系。正如前面所看到的,这使得模型能够关注输入序列的不同部分,以更好地捕捉单词之间的上下文依赖关系。
在训练期间学*并存储在这些层中的自注意力权重,反映了该输入序列中每个单词对所有其他单词的重要性。
但这并非只发生一次。Transformer架构实际上具有多头自注意力。这意味着多组自注意力权重(或称“头”)被并行学*,且彼此独立。注意力层中包含的注意力头数量因模型而异,但通常在12到100个之间。
其直观理解是,每个自注意力头将学*语言的不同方面。例如,一个头可能关注句子中人物实体之间的关系,而另一个头可能聚焦于句子的活动,还有一个头可能关注其他属性,比如单词是否押韵。
重要的是要注意,您无需事先规定注意力头将学*语言的哪些方面。每个头的权重是随机初始化的,在给予足够的训练数据和时间后,每个头会学*到语言的不同方面。虽然一些注意力图(如这里讨论的例子)很容易解释,但其他的可能并非如此。
前馈网络与输出
在将所有注意力权重应用于输入数据后,输出会通过一个全连接前馈网络进行处理。该层的输出是一个逻辑值向量,与分词化词典中每个分词的概率得分成比例。
然后,您可以将这些逻辑值传递到最终的Softmax层,在那里它们被归一化为每个单词的概率得分。这个输出包含了词汇表中每个单词的概率,因此这里可能有成千上万个得分。
其中一个单一的分词将拥有比其他分词更高的得分。这就是最可能的预测分词。但正如您将在课程后面看到的,有多种方法可以用来从这个概率向量中进行最终选择,以产生变化。
总结


本节课中,我们一起学*了Transformer架构的核心组件和工作原理。我们从其核心优势——自注意力机制开始,了解了它如何全局理解文本。接着,我们拆解了架构的编码器-解码器整体流程,并详细探讨了文本如何通过分词和嵌入转换为模型可处理的数值表示。我们还学*了位置编码的重要性,以及多头自注意力如何并行学*语言的多个方面。最后,我们看到了信息如何通过前馈网络处理,并输出为下一个词的概率分布。理解这些基础概念,是掌握现代大型语言模型如何工作的关键一步。
007:用Transformer生成文本 🧠
在本节课中,我们将学*Transformer架构如何从端到端地完成文本生成任务。我们将通过一个简单的翻译示例,详细拆解编码器-解码器的工作流程,并了解不同Transformer变体的特点。
概述

到目前为止,我们已经从高层级了解了Transformer架构中的一些主要组件。但我们尚未看到整个预测过程是如何端到端工作的。因此,让我们通过一个简单的例子来逐步解析。
翻译任务示例
在这个示例中,我们将观察一个翻译任务,即序列到序列任务。这恰好是Transformer架构设计者的最初目标。我们将使用一个Transformer模型将法语短语“J‘aime l’apprentissage automatique”翻译成英语。

以下是翻译过程的详细步骤:

- 分词:首先,使用训练网络时使用的相同分词器对输入单词进行分词。
- 编码器处理:这些分词后的标记被送入网络的编码器侧。它们经过嵌入层,然后输入到多头注意力层。
- 生成深度表示:多头注意力层的输出通过一个前馈网络传递到编码器的输出端。此时,离开编码器的数据是输入序列结构和含义的深度表示。
- 解码器启动:这个表示被插入到解码器的中间部分,以影响解码器的自注意力机制。接着,一个序列开始标记被添加到解码器的输入中。
- 预测首个标记:这触发解码器基于编码器提供的上下文理解来预测下一个标记。解码器自注意力层的输出通过解码器前馈网络和最终的Softmax输出层。此时,我们得到了第一个预测出的标记。
- 循环生成:我们将输出标记反馈到输入,以触发下一个标记的生成,并持续这个循环,直到模型预测出一个序列结束标记。
- 反分词:最后,将最终的标记序列反分词为单词,我们就得到了输出结果。在这个例子中,输出是“I love machine learning”。

文本生成的多样性

有多种方法可以利用Softmax层的输出来预测下一个标记,这些方法会影响生成文本的创造性。我们将在本周晚些时候更详细地探讨这些方法。
Transformer架构总结

让我们总结一下目前所学的内容。完整的Transformer架构由编码器和解码器组件构成。
- 编码器:将输入序列编码为输入结构和含义的深度表示。
- 解码器:从输入标记触发开始工作,利用编码器的上下文理解来生成新的标记,并循环进行此过程,直到达到某个停止条件。
Transformer的三种变体
虽然我们探讨的翻译示例同时使用了Transformer的编码器和解码器部分,但我们可以将这些组件拆分,形成不同的架构变体。

以下是三种主要的Transformer模型变体:

- 仅编码器模型:这类模型也可以作为序列到序列模型工作,但在未进一步修改的情况下,输入序列和输出序列长度相同。如今它们的使用已不常见,但通过在架构上添加额外的层,可以训练仅编码器模型来执行分类任务,例如情感分析。BERT就是一个仅编码器模型的例子。
- 编码器-解码器模型:正如我们所见,这类模型在序列到序列任务(如翻译)上表现良好,其中输入序列和输出序列的长度可以不同。我们也可以扩展和训练这类模型来执行通用的文本生成任务。编码器-解码器模型的例子包括BART(与BERT相对)和T5(本课程实验中将使用的模型)。
- 仅解码器模型:这是当今最常用的一些模型。同样,随着规模的扩大,它们的能力也在增长,这些模型现在可以泛化到大多数任务。流行的仅解码器模型包括GPT系列模型、BLOOM、Jurassic、Llama等。
我们将在本周晚些时候了解更多关于这些不同Transformer变体及其训练方式的信息。

结语与展望
以上就是很多内容。本次Transformer模型概述的主要目标是为你提供足够的背景知识,以理解世界上正在使用的各种模型之间的差异,并能够阅读模型文档。我想强调,你不需要担心记住这里看到的所有细节,因为你可以根据需要随时回顾这个解释。
请记住,你将通过自然语言与Transformer模型交互,使用书面文字(而非代码)创建提示。要做到这一点,你不需要理解底层架构的所有细节。这被称为提示工程,而这正是我们将在课程下一部分探索的内容。
让我们继续观看下一个视频以了解更多。
008:提示和提示工程 🎯
在本节课中,我们将要学*大型语言模型(LLM)中关于提示(Prompt)和提示工程(Prompt Engineering)的核心概念。我们将了解如何通过精心设计输入文本来引导模型生成期望的输出,并探讨不同规模模型的能力差异。
概述
首先,我们来回顾一些关键术语。输入到模型的文本被称为提示。模型生成文本的过程被称为推理,而输出的文本则被称为补全。可用于提示的文本总量或模型的“记忆”被称为上下文窗口。

尽管模型有时表现良好,但你经常会遇到模型初次尝试未能产生理想结果的情况。你可能需要多次修改提示的语言或写作方式,才能使模型按照你的期望运行。这种开发和改进提示的工作被称为提示工程。
上下文学*:通过示例引导模型
提示工程是一个重要的主题。一个让模型产生更好结果的强大策略是在提示中包含你希望模型执行的任务示例。在上下文窗口中提供示例的方法被称为上下文学*。
以下是上下文学*的具体示例。在下面的提示中,你要求模型对一条影评进行情感分类,即判断该影评是正面还是负面。
提示:对这条评论进行分类。
评论:“这部电影太棒了,我强烈推荐!”
情感:
这个提示由指令“对这条评论进行分类”、上下文(即评论文本本身)以及一个在末尾生成情感的指令组成。这种将输入数据包含在提示中的方法被称为零样本推理。最大的LLM在这方面表现出色,能够理解任务并返回正确答案。在这个例子中,模型正确地识别出情感为“正面”。
然而,较小的模型可能会在这方面遇到困难。例如,由早期较小版本模型(如GPT-2)生成的补全可能无法遵循指令。虽然它生成的文本与提示相关,但模型无法理解任务的细节,也就无法识别情感。
从零样本到少样本推理
这正是通过在提示中提供示例来提升性能的地方。现在,提示文本变得更长,并以一个完整的示例开头,向模型演示了需要执行的任务。
在指定模型应对评论进行分类后,提示文本包含了一个样本评论“我喜欢这部电影”,以及一个已完成的情感分析(本例中为“正面”)。接着,提示再次陈述指令,并包含我们想要模型分析的实际输入评论。
将这个新的、更长的提示传递给较小的模型,它现在有更好的机会理解任务。你正在指定你期望的响应格式。包含单个示例的方法被称为单样本推理,与之前提供的零样本提示形成对比。
有时,单个示例不足以让模型理解你的意图。因此,你可以扩展这个思路,从提供一个示例增加到包含多个示例。这被称为少样本推理。

例如,假设你正在使用一个更小的模型,它在单样本推理下未能进行良好的情感分析。你可以尝试少样本推理,加入第二个示例(这次是一条负面评论)。包含不同输出类别的混合示例可以帮助模型理解它需要做什么。
将新的提示传递给模型,这次它理解了指令,并生成了一个正确将评论情感识别为“负面”的补全。
模型规模与任务能力的关系

随着模型规模越来越大,模型执行多任务的能力以及执行这些任务的表现,强烈依赖于模型的规模。正如本课前面提到的,拥有更多参数的模型能够捕捉更多对语言的理解。
最大的模型在零样本推理方面表现出奇地好,能够推断并成功完成许多它们并未专门训练过的任务。相比之下,较小的模型通常只擅长少量任务,特别是那些与它们训练任务相似的任务。
你可能需要尝试几个模型,才能找到适合你用例的那一个。一旦找到适合你的模型,你可以尝试调整一些配置设置,以影响模型生成的补全的结构和风格。
总结

本节课中,我们一起学*了提示工程的核心概念。我们了解到,可以通过在提示中包含示例(即上下文学*)来引导模型,具体方法包括零样本、单样本和少样本推理。同时,我们认识到模型的规模对其任务执行能力有决定性影响:大模型擅长零样本推理,而小模型则更依赖于示例引导。最后,我们提到了可以通过调整配置参数来优化模型的输出。在下一节视频中,我们将具体探讨这些配置设置。
009:生成式配置
在本节课中,我们将要学*如何通过调整生成式配置参数,来影响大型语言模型在生成下一个词时的决策方式。这些参数允许我们控制生成文本的长度、创造性和随机性。
概述
在之前的课程中,我们了解了大型语言模型的能力和其背后的Transformer架构。本节我们将深入探讨在模型推理(生成文本)时,我们可以使用哪些配置参数来调整其行为。这些参数不同于训练时学*的参数,它们是在模型使用时进行设置的。

最大新令牌数
首先,我们来看看最简单的参数之一:最大新令牌数。这个参数用于限制模型生成的新令牌(可以理解为词或词片段)的数量。


你可以将其视为对模型选择下一个词这一过程的循环次数设置了一个上限。例如,你可以将其设置为100、150或200。需要注意的是,这是一个最大值,如果模型在达到此上限前预测到了一个序列结束标记,生成过程也会提前停止。
代码示例:
max_new_tokens = 100
解码策略:从贪婪解码到随机采样
默认情况下,大多数大型语言模型使用贪婪解码。这意味着模型在每一步总是选择概率最高的词作为下一个词。
公式:
下一个词 = argmax(P(词 | 上下文))
这种方法对于短文本生成效果很好,但容易导致词语或短语的重复。为了生成更自然、更具创造性且避免重复的文本,我们需要引入随机性。
随机采样是实现这一目标的最简单方法。模型不再总是选择概率最高的词,而是根据整个词典的概率分布来随机选择下一个词。例如,一个词的概率为0.02,那么它被选中的几率就是2%。
代码示例(以Hugging Face Transformers为例):
do_sample = True
高级采样技术:Top-K 与 Top-P


为了在引入随机性的同时,确保生成的文本依然合理,我们可以使用两种采样技术:Top-K 和 Top-P。
Top-K 采样
Top-K采样通过指定一个K值,将模型的选择范围限制在概率最高的K个词之内。模型会在这K个候选词中,根据它们的概率权重进行随机选择。
例如,设置K=3,模型就只从概率最高的三个词中挑选下一个词。这能在保持一定随机性的同时,防止模型选择概率极低的词。
Top-P 采样(核采样)
Top-P采样则设定一个概率累计值P(例如0.9)。模型会从概率最高的词开始累加,直到累计概率超过P,然后仅从这个候选池中根据概率权重随机选择下一个词。


例如,设置P=0.3,模型会选取概率从高到低累加至刚好超过0.3的那些词作为候选。
核心区别:
- Top-K:基于候选词的数量进行限制。
- Top-P:基于候选词的概率总和进行限制。
温度参数
另一个控制输出随机性的关键参数是温度。这个参数直接影响模型为下一个词计算出的概率分布的形状。
公式(简化概念):
调整后的概率 = softmax(原始逻辑值 / 温度)
- 低温度(< 1):会使概率分布更加“尖锐”,概率集中在少数几个高概率词上。这导致生成文本的随机性更低,更可预测,更贴*训练数据中的常见模式。
- 高温度(> 1):会使概率分布更加“平坦”,概率更均匀地分散在所有词上。这导致生成文本的随机性更高,更具创造性,但也可能产生不连贯或无意义的内容。
- 温度 = 1:使用模型原始的、未调整的概率分布。
与Top-K和Top-P不同,温度参数直接改变了模型对每个词的原始预测概率。
总结

本节课我们一起学*了影响大型语言模型文本生成行为的几种关键配置参数:
- 最大新令牌数:控制生成文本的长度。
- 解码策略:从确定性的贪婪解码切换到引入随机性的随机采样。
- 采样技术:使用Top-K和Top-P在随机性和合理性之间取得平衡。
- 温度:通过缩放概率分布来全局控制输出的随机性与创造性程度。
通过熟练运用这些参数,你可以引导模型生成更符合你需求、长度适宜且创造性可控的文本。在接下来的课程中,我们将基于这些基础知识,探讨如何开发和部署一个由大型语言模型驱动的应用程序。
010:生成式AI项目生命周期
在本节课中,我们将学*开发和部署一个由大型语言模型驱动的应用程序所需的技术。我们将介绍一个生成式AI项目生命周期框架,它能指导你完成从构思到上线的全过程。

🎯 项目范围定义
任何项目中最重要的步骤是尽可能准确、具体地定义项目范围。正如本课程目前所展示的,LLM能够执行许多任务,但其能力在很大程度上取决于模型的规模和架构。你需要思考LLM在你的具体应用中承担什么功能。
以下是需要考虑的关键点:
- 你是否需要模型能够执行许多不同的任务,包括生成长文本或具备高度的通用能力?
- 或者任务非常具体,例如命名实体识别,因此你的模型只需要擅长一件事?
正如你将在课程后续部分看到的,明确界定模型需要完成的任务,可以节省你的时间,或许更重要的是,节省计算成本。
🤔 选择模型策略
一旦你明确了需求并界定了模型的范围,可以开始开发时,你的第一个决定将是:从头开始训练自己的模型,还是使用现有的基础模型。
通常,你会从一个现有模型开始,尽管在某些情况下你可能发现有必要从头开始训练模型。本周晚些时候,你将了解更多关于这个决策背后的考量因素,以及一些经验法则,帮助你评估使用自己的资源训练模型的可行性。

🔧 评估与模型调优
有了模型之后,下一步是评估其性能,并根据你的应用需求进行额外的训练。

正如本周早些时候所见,提示工程有时足以让你的模型表现良好。因此,你可能会从尝试情境学*开始,使用适合你任务和用例的示例。然而,在某些情况下,即使使用单样本或少样本推理,模型的表现可能仍达不到你的要求。
在这种情况下,你可以尝试对模型进行微调。这个监督学*过程将在第2周详细介绍,并且你将在第2周的实验中亲自尝试微调一个模型。
随着模型能力越来越强,确保它们在部署中表现良好且符合人类偏好变得日益重要。在第3周,你将学*一种额外的微调技术,称为基于人类反馈的强化学*,它有助于确保你的模型行为良好。
所有这些技术的一个重要方面是评估。下周,你将探索一些指标和基准,用于确定你的模型表现如何,或者它与你的偏好对齐得如何。
请注意,应用开发的这个“调整与对齐”阶段可能是高度迭代的。你可能从尝试提示工程和评估输出开始,然后使用微调来提高性能,接着再次重新审视和评估提示工程,以获得所需的性能。
🚀 部署与优化
最后,当你获得一个满足性能需求且对齐良好的模型时,你可以将其部署到你的基础设施中,并与你的应用程序集成。
在这个阶段,一个重要步骤是优化模型以进行部署。这可以确保你充分利用计算资源,并为应用程序用户提供最佳体验。
🛠️ 补充基础设施
最后但非常重要的一步是考虑你的应用程序良好运行所需的任何额外基础设施。LLM存在一些基本限制,仅通过训练可能难以克服,例如它们在不知道答案时倾向于捏造信息,或者它们执行复杂推理和数学的能力有限。
在本课程的最后一部分,你将学*一些强大的技术,可以用来克服这些限制。
我知道这里有很多需要考虑的内容,但不必担心现在就全部掌握。在本课程中,当你探索每个阶段的细节时,你会反复看到这个视觉框架。

总结:本节课我们一起学*了生成式AI项目的完整生命周期,从定义范围、选择模型策略、评估与调优,到最终的部署优化和补充基础设施。这个框架将帮助你系统化地规划和执行LLM应用开发项目。
011:AWS实验室介绍 🚀
在本节课中,我们将学*如何访问和设置本课程所需的AWS实验室环境。通过动手实践,你将能更好地巩固视频中学到的核心概念。
课程至此,你已经学*了大量知识。巩固这些概念的最佳方式,就是亲自动手尝试编写一些代码。
正如Andrew在本周开始时提到的,我的同事Chris Frly主导开发了本课程的实验练*。每周都包含一个实验,让你可以亲自实践视频中的关键概念。

接下来,Chris将帮助你入门,向你展示实验环境,并引导你完成本周的活动。
你好,Chris。😊

你好,Mike。现在让我们来看看实验环境和第一个实验。
在正式开始实验之前,让我先解释一下我们将要使用的系统环境,它叫做“Vcaria”。
在这里,你将启动自己的AWS账户,从而获得Amazon SageMaker的访问权限。因此,你可以免费运行这些笔记本。
以下是需要注意的几点:
当你进入Vquaium实验环境时,首先要点击 Start Lab。这是你在左上角看到的第一个操作。你会看到AWS的状态从红色变为黄色,再变为绿色。绿色表示就绪。
绿色意味着我们可以点击它并进入实验。这里有几个快速提示:你有两小时的时间来完成每个实验。完成后,你不需要点击任何“结束实验”的按钮,只需关闭浏览器,然后按你的意愿进入下一个实验或视频即可。
这里有一些说明,但我现在将直接带你一步步操作。

我们要做的是点击 AWS,这将启动AWS控制台。如果你已经登录了另一个AWS控制台,你需要先点击登出,然后再点击这里同样的绿色 AWS 按钮。
我将稍微放大一下界面。




进入SageMaker最快的方法是在这里的搜索字段中输入 SageMaker,然后点击它。我们的目标是进入SageMaker Studio,这是一个基于Jupyter的IDE,我们今天所有的笔记本操作都将在这里进行。点击那边的 Open Studio。




简单来说,我在这里点击了 Studio,然后点击了 Open Studio。所有这些资源都已为你预先配置好,你无需进行任何设置。

这将直接带你进入Jupyter笔记本界面。让我放大一下。默认启用了深色模式,如果你愿意,可以切换到浅色模式。
你可以点击 Theme,然后切换到 Jupyter Lab Light 模式。默认是SageMaker UI的深色模式,也就是我们看到的这种黑色。
第一步是点击 Open Launcher。我们实际上需要进入系统终端,因为我们要做的第一件事是从我们的S3存储桶复制实验文件。
S3是云中的对象存储,这个公共存储桶包含了本次实验所需的所有笔记本、图像和数据集。
现在我已经在终端里了,我将回到我的操作说明。我们已经完成了所有这些步骤:第一步,点击Studio;第二步,点击Open Studio。
有时学*者可能会通过另一种方式进入Studio。如果你在探索时看到了某个屏幕,只需知道你可以点击 Launch,然后点击 Studio,这将以同样的方式打开Studio笔记本。从那时起,所有操作说明都相同:点击 Open Launcher,点击 System Terminal。
现在,这是我需要复制的代码。请确保你复制了直到最后一个斜杠 / 的所有内容。





我将回到Jupyter Launcher,然后直接在这里粘贴这段代码。

好的,下一步是点击文件夹,我们应该能看到下载好的笔记本。因为我放大了很多,所以我需要滚动到这里。这就是第一个实验。


正如我所说,所有的计算资源都已为我们配置好。我们现在应该可以直接开始运行这些实验了。
如果你不熟悉Jupyter笔记本,只需知道你可以使用 Shift + Enter 在单元格之间跳转并执行。或者,如果你觉得时间紧迫,可以点击 Restart Kernel and Run All Cells,这将一键运行所有单元格。
对于这些实验,我建议你一步一步地运行,即按 Shift + Enter,再按 Shift + Enter。这里的所有内容都只是Markdown格式的说明,告诉你这个实验将要做什么。


本节课中,我们一起学*了如何访问AWS实验室环境、启动SageMaker Studio、从云端S3存储桶获取实验材料,以及运行Jupyter笔记本的基本操作。现在,你已经准备好开始动手实践,巩固生成式AI与大型语言模型的相关知识了。
012:11_实验室1演练 🧪
在本节课中,我们将学*如何利用大型语言模型(LLM)来总结对话。我们将从加载数据集和模型开始,逐步探索零样本、单样本和少样本提示工程,并了解如何通过调整生成参数来影响模型的输出。





环境与库安装 💻
首先,我们需要设置实验环境。实验运行在拥有8个CPU核心和32GB内存的机器上,使用Python 3。
以下是需要安装的核心Python库:
- PyTorch:一个主流的深度学*框架。
- Transformers:由Hugging Face公司开发的开源库,提供了大量预训练模型和工具。
- Datasets:同样来自Hugging Face,用于轻松加载和处理公共数据集。


运行以下代码块来安装这些库。安装过程可能需要几分钟,请耐心等待。如果出现一些警告信息,可以忽略,这不会影响后续实验。





# 安装必要的库
!pip install torch torchdata transformers datasets
导入库与加载数据 📥

上一节我们完成了环境配置,本节中我们来看看如何导入必要的函数并加载我们的实验数据。
安装完成后,我们导入关键函数并加载数据集。我们将使用名为 dialogsum 的公开数据集,它包含了大量对话及其人工编写的摘要。

from datasets import load_dataset
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer




# 加载 dialogsum 数据集
dataset = load_dataset("dialogsum")

探索数据集 🔍
在开始使用模型之前,让我们先观察一下数据的样子。数据集中的每个样本都包含一段对话和一个由人工编写的“基线摘要”。

以下是一个数据示例:


- 对话:
- Person 1: What time is it, Tom?
- Person 2: Just a minute. It‘s 10 to 9 by my watch.
- ...
- 基线摘要 (人类标注): Person 1 is in a hurry and Tom tells Person 2 there is plenty of time.
我们的目标是让模型生成的摘要尽可能接*这个人类编写的“黄金标准”。目前我们还没有加载任何模型,这只是原始数据。
加载模型与分词器 🤖

现在,我们将加载用于本次实验的模型——FLAN-T5。这是一个通用的指令微调模型,能够执行多种任务,包括文本摘要。
加载模型后,我们还需要加载对应的分词器。分词器的作用是将原始文本(如对话)转换成模型能够理解的数字序列(即词元ID)。
# 加载 FLAN-T5 模型和分词器
model_name = “google/flan-t5-base”
model = AutoModelForSeq2SeqLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
为了理解分词器的工作,我们可以看一个简单的例子:




# 分词示例
sample_text = “What time is it, Tom?”
encoded = tokenizer(sample_text)
print(“编码后的词元ID:”, encoded[“input_ids”])
decoded = tokenizer.decode(encoded[“input_ids”])
print(“解码后的文本:”, decoded)
输出将展示文本如何被转换为数字,并能够被还原。这些数字对应着模型词汇表中的嵌入向量,是后续所有数学运算(如线性代数、反向传播)的基础。




零样本推理尝试 🎯
我们已经加载了模型和分词器,本节中我们来看看直接使用模型进行摘要的效果如何,这被称为零样本推理。
我们直接将对话输入模型,不提供任何任务说明或示例,观察其生成的摘要。
对于之前的“时间”对话,模型可能生成类似 “It‘s 10 to 9.” 的摘要。与人类编写的基线摘要 “Person 1 is in a hurry...” 相比,模型遗漏了大量关键信息(如“Person 1很着急”这个上下文)。

对于另一个关于“升级软件”的对话,模型可能错误地总结为 “Person 1 is thinking about upgrading their computer.”,而基线摘要准确地描述了 “Person 1 teaches Person 2 how to upgrade...”。

可见,在没有明确指导的情况下,模型的摘要能力有限。
提示工程:零样本指令学* 📝
在课程中我们学到,可以通过指令来引导模型。这是一种上下文学*,具体到这里是零样本指令推理。




我们修改输入,在对话前加上明确的指令。以下是两种不同的提示模板:
模板 1:
Summarize the following conversation.
{对话内容}
Summary:
模板 2:
Dialogue:
{对话内容}




What was going on?


让我们看看效果。对于“时间”对话,使用模板1后,模型可能生成 “The train is about to leave.”,这比之前好一点,捕捉到了“赶火车”的细节,但仍不完整。对于“升级软件”对话,结果可能变为 “Person 2 wants to add a painting program.”,更接*但仍有偏差。
提示工程就是尝试不同指令,以找到能让模型表现最佳的表达方式。
提示工程:单样本与少样本学* ✨



如果仅靠指令效果不佳,我们可以为模型提供示例,这就是单样本和少样本学*。



- 单样本学*:在提示中提供一个完整的“输入-输出”示例(即一条对话及其正确摘要),然后再给出需要总结的新对话。
- 少样本学*:提供多个(例如三个)“输入-输出”示例,然后再给出新任务。
以下是单样本提示的结构:
对话: [示例对话]
摘要: [示例摘要]
对话: [需要总结的新对话]
摘要:
使用单样本提示后,对于“升级软件”对话,模型生成的摘要可能变为 “Person 1 wants to upgrade software, Person 2 wants a painting program, Person 1 suggests a CD-ROM.”,这显著更接*人类摘要,捕捉到了更多细节。

尝试少样本提示(提供三个示例)后,我们可能会发现,对于当前任务,单样本带来的提升已经足够,增加更多示例(少样本)可能不会带来显著改善。在实践中,通常尝试到5-6个示例就足够了,模型能力是核心。


调整生成参数 🎛️
最后,我们可以通过调整生成参数来探索模型输出的多样性。这是提示工程的另一面。
关键的参数是采样温度:
- 公式: 在多项式分布中,温度参数 T 用于调整概率分布的平滑程度。
P_modified(i) = exp(log(P(i)) / T) / sum(exp(log(P(j)) / T))。 - 低温度 (如 0.1):使输出分布更“尖锐”,模型倾向于选择最高概率的词元,结果更确定、保守,可能重复。
- 高温度 (如 1.0 或 2.0):使输出分布更“平滑”,模型选择低概率词元的机会增加,结果更具创造性、随机性,甚至可能产生不合理内容。
在Hugging Face的 generation_config 中,我们可以这样设置:




from transformers import GenerationConfig



# 高温度,更具创造性
generation_config = GenerationConfig(max_new_tokens=50, temperature=1.5)
# 低温度,更确定和保守
generation_config = GenerationConfig(max_new_tokens=50, temperature=0.1)
outputs = model.generate(..., generation_config=generation_config)


你可以尝试不同的温度值,直观感受它对生成文本风格的影响。
总结 📚
本节课中我们一起学*了使用FLAN-T5模型进行对话摘要的完整流程:
- 环境准备:安装必要的库(PyTorch, Transformers, Datasets)。
- 数据加载:使用
datasets库加载dialogsum数据集。 - 模型加载:加载预训练的FLAN-T5模型及其分词器。
- 基础推理:观察到直接进行零样本推理的效果不佳。
- 提示工程:通过添加指令(零样本)、提供示例(单样本、少样本)来显著提升模型摘要质量。
- 参数调优:通过调整采样温度等生成参数,可以控制模型输出的创造性与确定性。


这是探索和评估一个大型语言模型能力的标准起点,也是决定是否需要以及如何对模型进行微调的重要步骤。
013:12_预训练大型语言模型 🧠
在本节课中,我们将要学*大型语言模型(LLM)的预训练过程。我们将探讨不同模型架构(编码器、解码器、编码器-解码器)的预训练目标,理解它们如何影响模型的能力和适用场景,并了解选择合适模型时需要考虑的因素。
模型选择与模型中心
在上一节视频中,我们介绍了生成式AI项目生命周期。在确定了用例范围并规划了LLM在应用中的工作方式后,下一步是选择一个模型来使用。

你的第一个选择是使用现有模型,还是从头开始训练自己的模型。在某些特定情况下,从头训练自己的模型可能是有利的,我们将在本课后面学*这些情况。然而,通常情况下,你会使用现有的基础模型来开始开发你的应用程序。

许多开源模型可供像你这样的AI社区成员在应用中使用。一些主要的生成式AI应用框架(如Hugging Face和PyTorch)的开发者创建了模型中心,你可以在其中浏览这些模型。
这些模型中心的一个非常有用的功能是包含了模型卡片。
它们描述了重要的细节,包括每个模型的最佳用例、训练方式以及已知的限制。你可以在本周结束时的阅读材料中找到这些模型中心的链接。


你选择的具体模型将取决于你需要执行的任务的细节。Transformer模型架构的变体适用于不同的语言任务,这主要是由于模型训练方式的差异。为了帮助你更好地理解这些差异,并对特定任务使用哪种模型形成直觉,让我们更深入地看看大型语言模型是如何训练的。


掌握了这些知识后,你会发现更容易浏览模型中心,并为你的用例找到最佳模型。
预训练概览
首先,让我们从高层次了解一下LLM的初始训练过程。这个阶段通常被称为预训练。
正如你在第1课中所见,LLM编码了语言的深层统计表示。这种理解是在模型的预训练阶段形成的,此时模型从海量的非结构化文本数据中学*。这些数据可能达到千兆字节、太字节甚至拍字节的规模,来源包括互联网抓取的数据以及专门为训练语言模型而组装的文本语料库。

在这个自监督学*步骤中,模型内化了语言中存在的模式和结构。这些模式使模型能够完成其训练目标,而该目标取决于模型的架构。
在预训练期间,模型权重会更新以最小化训练目标的损失。预训练还需要大量的计算资源和GPU的使用。
请注意,当你从公共网站(如互联网)抓取训练数据时,通常需要处理数据以提高质量、解决偏见并移除其他有害内容。由于这种数据质量筛选,通常只有1%到3%的标记(tokens)被用于预训练。如果你决定预训练自己的模型,在估算需要收集多少数据时应考虑这一点。
不同架构的预训练目标

本周早些时候,你了解到Transformer模型有三种变体:仅编码器模型、编码器-解码器模型和仅解码器模型。每种模型都有不同的训练目标,因此学*执行不同的任务。
仅编码器模型也被称为自编码模型,它们使用掩码语言建模进行预训练。
在这里,输入序列中的标记被随机掩码,训练目标是预测被掩码的标记以重建原始句子。这也被称为去噪目标。
自编码模型构建输入序列的双向表示,这意味着模型理解标记的完整上下文,而不仅仅是它前面的词。
仅编码器模型非常适合受益于双向上下文的任务。例如,你可以用它们执行句子分类任务(如情感分析)或标记级任务(如命名实体识别或词分类)。
一些著名的自编码模型例子是BERT和RoBERTa。
现在,让我们看看仅解码器模型或自回归模型,它们使用因果语言建模进行预训练。
这里的训练目标是根据之前的标记序列预测下一个标记。研究人员有时将预测下一个标记称为全语言建模。基于解码器的自回归模型会掩码输入序列,并且只能看到所讨论标记之前的输入标记。模型不知道句子的结尾。然后,模型逐个遍历输入序列以预测下一个标记。
与编码器架构相比,这意味着上下文是单向的。通过学*从大量示例中预测下一个标记,模型构建了语言的统计表示。这种类型的模型利用了原始架构的解码器组件,而没有编码器。
仅解码器模型通常用于文本生成,尽管较大的仅解码器模型表现出强大的零样本或少样本推理能力,并且通常可以很好地执行一系列任务。
著名的基于解码器的自回归模型例子是GPT和BLOOM。
Transformer模型的最后一种变体是序列到序列模型,它使用了原始Transformer架构的编码器和解码器部分。
预训练目标的具体细节因模型而异。一个流行的序列到序列模型T5使用跨度损坏来预训练编码器,它会掩码输入标记的随机序列。这些被掩码的序列随后被替换为唯一的哨兵标记(此处显示为X)。哨兵标记是添加到词汇表中的特殊标记,但不对应于输入文本中的任何实际单词。然后,解码器的任务是自回归地重建被掩码的标记序列。输出是哨兵标记后跟预测的标记。
你可以使用序列到序列模型进行翻译、摘要和问答。它们通常在输入和输出都是文本体的情况下很有用。除了你将在本课程实验中使用的T5之外,另一个著名的编码器-解码器模型是BART(不是BERT)。
架构对比总结
以下是不同模型架构及其预训练目标的快速比较总结:
- 自编码模型使用掩码语言建模进行预训练。它们对应于原始Transformer架构的编码器部分,通常用于句子分类或标记分类。
- 自回归模型使用因果语言建模进行预训练。这种类型的模型利用了原始Transformer架构的解码器组件,通常用于文本生成。
- 序列到序列模型使用原始Transformer架构的编码器和解码器部分。预训练目标的具体细节因模型而异。T5模型使用跨度损坏进行预训练。序列到序列模型通常用于翻译、摘要和问答。
现在你已经了解了这些不同模型架构是如何训练的,以及它们各自最适合的特定任务,你可以选择最适合你用例的模型类型。
模型规模与能力

需要记住的另一点是,任何架构的较大模型通常都能更好地执行其任务。

研究人员发现,模型越大,它就越有可能按照你的需要工作,而无需额外的上下文学*或进一步训练。

这种观察到的模型能力随规模增长的趋势,推动了*年来模型规模越来越大的发展。这种增长得益于研究中的转折点,例如高度可扩展的Transformer架构的引入、用于训练的海量数据的获取以及更强大计算资源的发展。
模型规模的这种稳步增长实际上让一些研究人员假设存在一种适用于LLM的新“摩尔定律”。你可能想问,我们是否可以不断添加参数来提高性能并使模型更智能?这种模型增长会走向何方?
虽然这听起来很棒,但事实证明,训练这些庞大的模型非常困难且成本高昂,以至于持续训练越来越大的模型可能不可行。
让我们在下一个视频中更仔细地看看与训练大型模型相关的一些挑战。

总结

本节课中,我们一起学*了大型语言模型预训练的核心概念。我们了解了三种主要Transformer架构(仅编码器、仅解码器、编码器-解码器)的区别,以及它们各自通过掩码语言建模、因果语言建模和跨度损坏等不同目标进行预训练的方式。这些预训练方式决定了模型最适合的任务类型,如分类、文本生成或翻译。我们还认识到,模型规模通常与其能力正相关,但训练超大模型也面临着巨大的成本和挑战。掌握这些知识,将帮助你在开发自己的生成式AI应用时,更明智地浏览和选择最合适的预训练模型。
014:13_训练大型语言模型的计算挑战 💻
在本节课中,我们将要学*训练大型语言模型时遇到的核心计算挑战——内存不足问题。我们将探讨其根本原因,并通过量化技术来理解如何有效减少内存需求。
内存不足的常见问题

当你尝试训练大型语言模型时,最常见的问题之一是内存耗尽。

如果你曾尝试在NVIDIA GPU上训练甚至只是加载模型,可能会对以下错误信息感到熟悉。
CUDA,全称为Compute Unified Device Architecture,是为NVIDIA GPU开发的一系列库和工具。
诸如PyTorch和TensorFlow等库使用CUDA来提升矩阵乘法及其他深度学*常见操作的性能。
你会遇到这些内存不足问题,因为大多数大型语言模型非常庞大,需要大量内存来存储和训练其所有参数。
理解问题的规模
让我们做一些快速计算,以直观理解问题的规模。
一个参数通常由一个32位浮点数表示,这是计算机表示实数的方式。稍后你将看到关于数字如何以这种格式存储的更多细节。




一个32位浮点数占用4字节内存。因此,要存储10亿个参数,你需要 4字节 * 10亿参数 = 4GB 的GPU内存(以32位全精度计算)。

这是很大的内存量。请注意,到目前为止你只考虑了存储模型权重所需的内存。如果你想训练模型,还必须为训练期间使用GPU内存的额外组件做规划。这些组件包括优化器状态、梯度、激活值以及函数所需的临时变量。
实际上,这很容易导致每个模型参数需要额外20倍的内存。为了在训练期间考虑所有这些开销,你实际上需要大约20倍于模型权重本身所占用的GPU内存。要在32位全精度下训练一个10亿参数的模型,你大约需要 4GB * 20 = 80GB 的GPU内存。
这对于消费级硬件来说绝对太大了,甚至对数据中心使用的硬件来说也是一个挑战。如果你想使用单个处理器进行训练,80GB是单个NVIDIA A100 GPU的内存容量,A100是云端机器学*任务常用的处理器。
减少训练内存需求的技术
那么,有哪些选项可以减少训练所需的内存呢?
以下是你可以用来减少内存的一种技术,称为量化。
量化技术详解
其主要思想是,通过将权重的精度从32位浮点数降低到16位浮点数或8位整数,来减少存储模型权重所需的内存。
深度学*框架和库中使用的相应数据类型有:用于32位全精度的FP32,用于16位半精度的FP16或Bfloat16,以及用于8位整数的INT8。
FP32可以表示的数字范围大约从 3 * 10^-38 到 3 * 10^38。默认情况下,模型权重、激活值和其他模型参数以FP32存储。
量化通过使用基于原始32位浮点数范围计算出的缩放因子,将原始的32位浮点数统计性地投影到更低精度的空间中。
让我们看一个例子。假设你想以不同精度存储π到小数点后六位。
浮点数存储为一系列比特(0和1)。以FP32全精度存储数字的32位包括:1位用于符号(0表示正数,1表示负数),8位用于数字的指数,23位表示数字的小数部分。小数部分也称为尾数或有效数字,它代表数字的精度位。
如果你将32位浮点值转换回十进制值,会注意到精度的轻微损失。作为参考,以下是π到小数点后19位的真实值。
现在让我们看看,如果你将这个π的FP32表示投影到FP16(16位低精度)空间会发生什么。16位包括:1位用于符号(与FP32相同),但现在FP16只分配5位来表示指数,10位来表示小数部分。因此,FP16可以表示的数字范围要小得多,从-65504到+65504。
原始的FP32值在16位空间中被投影为3.140625。注意,通过这个投影你失去了一些精度,现在小数点后只有六位。你会发现,在大多数情况下,这种精度损失是可以接受的,因为你正在为减少内存占用进行优化。
在FP32中存储一个值需要4字节内存。相比之下,在FP16中存储一个值只需要2字节内存。因此,通过量化,你将内存需求减少了一半。
BFloat16:一种流行的选择
人工智能研究界已经探索了优化16位量化的方法。一种名为Bfloat16的数据类型最*已成为FP16的热门替代品。Bfloat16,全称为Brain Floating Point Format,由Google Brain开发,已成为深度学*中的热门选择。包括Falcon在内的许多大型语言模型都已使用Bfloat16进行预训练。
Bfloat16或BF16是半精度FP16和全精度FP32之间的混合体。BF16显著有助于训练稳定性,并受到较新GPU(如NVIDIA A100)的支持。Bfloat16通常被描述为截断的32位浮点数,因为它捕获了完整32位浮点数的全部动态范围,但只使用16位。BF16使用完整的8位来表示指数,但将小数部分截断为仅7位。这不仅节省了内存,还通过加速计算提高了模型性能。缺点是BF16不太适合整数计算,但这些在深度学*中相对少见。
为了完整性,让我们看看如果你将π从32位量化到更低精度的8位空间会发生什么。如果你使用1位表示符号,那么8位值由剩余的7位表示。这给出了表示从-128到+127的数字范围。不出所料,π在8位低精度空间中被投影为3。这将内存需求从原来的4字节降低到仅1字节,但显然导致了相当显著的精度损失。
量化效果总结
让我们总结一下你在这里学到的内容,并强调你应该从这次讨论中带走的关键点。
请记住,量化的目标是通过降低模型权重的精度,来减少存储和训练模型所需的内存。量化使用基于原始32位浮点数范围计算出的缩放因子,将原始的32位浮点数统计性地投影到更低精度的空间中。
现代深度学*框架和库支持训练中量化,即在训练过程中学*量化缩放因子。这个过程的细节超出了本课程的范围,但你已经看到了关键点:你可以使用量化来减少训练期间模型的内存占用。

BF16已成为深度学*中一种流行的精度选择,因为它保持了FP32的动态范围,但将内存占用减少了一半。包括Falcon在内的许多大型语言模型都已使用Bfloat16进行预训练。

请注意下周实验中对Bfloat16的提及。
量化对GPU内存的影响
现在,让我们回到将模型装入GPU内存的挑战,看看量化可能产生的影响。
通过应用量化,你可以将存储模型参数所需的内存消耗减少到仅2GB(使用16位半精度),节省了50%。你还可以通过将模型参数表示为8位整数,进一步将内存占用再减少50%,这只需要1GB的GPU内存。请注意,在所有这些情况下,你仍然拥有一个10亿参数的模型。正如你所见,代表模型的圆圈大小相同。
量化在训练方面会给你带来相同程度的节省。正如你之前听到的,当你尝试以32位全精度训练一个10亿参数模型时,你很快就会达到单个NVIDIA A100 GPU 80GB内存的极限。如果你想在单个GPU上训练,就需要考虑使用16位或8位量化。请记住,现在许多模型的规模超过500亿甚至1000亿参数,这意味着你需要多达500倍的内存容量来训练它们,达到数万GB。

模型规模与分布式训练
这些庞大的模型使我们一直在考虑的10亿参数模型相形见绌,左侧是按比例显示的对比图。
当模型规模超过几十亿参数时,在单个GPU上训练它们变得不可能。相反,你需要转向分布式计算技术,在多个GPU上训练你的模型。这可能需要访问数百个GPU,这非常昂贵。这也是大多数时候你不会从头开始预训练自己的模型的另一个原因。

然而,一种称为微调的额外训练过程(你将在下周学*)也需要将所有训练参数存储在内存中,而且你很可能会在某个时候想要微调模型。
为了帮助你更多地了解跨GPU训练的技术方面,我们为你准备了一个可选视频。它非常详细,但将帮助你了解像你这样的开发者为训练更大模型而存在的一些选项。你可以自由跳过这个视频,但如果你有兴趣了解更多,我希望你能看一看。
课程总结


本节课中,我们一起学*了训练大型语言模型时面临的核心内存挑战。我们探讨了内存不足问题的根源,并深入了解了量化技术如何通过降低参数精度(从FP32到FP16/BF16或INT8)来显著减少内存占用。我们还认识到,对于超大规模模型,分布式训练是必不可少的。理解这些计算限制和技术解决方案,是有效利用和定制大型语言模型的基础。
015:14_可选视频- 高效的多GPU计算策略 🚀
在本节课中,我们将要学*如何将模型训练扩展到单个GPU之外。我们将探讨两种核心的多GPU计算策略:模型复制与模型分片,并了解它们如何帮助加速训练或处理无法放入单个GPU的大型模型。

概述

当模型变得太大,无法放入单个GPU时,或者即使模型能放入单个GPU,但为了加速训练,我们都需要使用多GPU计算策略。了解如何在GPU之间高效地分配计算至关重要。
上一节我们介绍了多GPU计算的必要性,本节中我们来看看具体的实现策略。
模型复制策略:分布式数据并行

首先,考虑模型仍能放入单个GPU的情况。扩展模型训练的第一步是将大型数据集分发到多个GPU上,并并行处理这些数据批次。


以下是实现模型复制的一种流行方法:
- PyTorch分布式数据并行:简称DDP。其工作原理如下:
- 将你的模型复制到每个GPU上。
- 并行地向每个GPU发送一批数据。
- 每个GPU并行处理其数据。
- 通过一个同步步骤,合并每个GPU的计算结果。
- 根据合并的结果更新每个GPU上的模型,确保所有GPU上的模型始终保持一致。
这种实现方式允许在所有GPU上进行并行计算,从而带来更快的训练速度。
注意:DDP要求你的模型权重以及训练所需的所有额外参数(梯度和优化器状态)都能放入单个GPU。如果你的模型太大,无法满足此条件,则应考虑另一种称为模型分片的技术。
模型分片策略:全分片数据并行
模型分片的一个流行实现是PyTorch Fully Sharded Data Parallel,简称FSDP。FSDP的灵感来源于微软研究人员在2019年发表的一篇论文,该论文提出了一种名为ZeRO的技术。ZeRO代表“零冗余优化器”,其目标是通过在GPU之间分发(或分片)模型状态且零数据重叠来优化内存。这使你能够在模型无法放入单个芯片内存时,跨GPU扩展模型训练。
在深入FSDP之前,我们先快速了解一下ZeRO的工作原理。本周早些时候,我们了解了训练LLM所需的所有内存组件。其中最大的内存需求是优化器状态,它占用的空间是权重的两倍,其次是权重本身和梯度。
让我们用蓝色方框代表参数,黄色代表梯度,绿色代表优化器状态。之前介绍的模型复制策略的一个限制是,你需要在每个GPU上保留一个完整的模型副本,这会导致冗余的内存消耗(你在每个GPU上存储相同的数据)。而ZeRO则通过跨GPU分发(也称为分片)模型参数、梯度和优化器状态,而不是复制它们,从而消除了这种冗余。同时,同步模型状态所需的通信开销与之前讨论的DDP保持接*。
ZeRO提供了三个优化阶段:

- ZeRO阶段1:仅跨GPU分片优化器状态。这最多可将内存占用减少4倍。
- ZeRO阶段2:在阶段1的基础上,同时跨芯片分片梯度。结合使用阶段1和2,最多可将内存占用减少8倍。
- ZeRO阶段3:分片所有组件,包括跨GPU的模型参数。结合使用阶段1、2和3,内存减少量与GPU数量成线性关系。例如,在64个GPU上进行分片,可将内存减少64倍。
让我们将这个分片概念应用到DDP的可视化中,并用模型参数、梯度和优化器状态的内存表示来替换LLM。当你使用FSDP时,你像在DDP中看到的那样,将数据分发到多个GPU上。

但与DDP不同的是,FSDP还会使用ZeRO论文中指定的策略之一,将模型参数、梯度和优化器状态分发(分片)到GPU节点上。通过这种策略,你现在可以处理那些太大而无法放入单个芯片的模型。
FSDP与DDP的对比
与DDP(每个GPU本地拥有处理每批数据所需的所有模型状态)不同,FSDP要求在前向传播和反向传播之前,从所有GPU收集这些数据。
每个GPU按需从其他GPU请求数据,以便在操作期间将分片数据具体化为未分片数据。操作完成后,你将未分片的非本地数据作为原始分片数据释放回其他GPU。你也可以选择将其保留以供未来操作使用(例如,在反向传播期间),但这需要更多的GPU内存。这是一个典型的性能与内存权衡的决策。
在反向传播之后的最后一步,FSDP以与DDP相同的方式跨GPU同步梯度。通过FSDP描述的模型分片,可以降低整体GPU内存利用率。此外,你还可以指定FSDP将部分训练计算卸载到CPU上,以进一步减少GPU内存使用。
为了管理性能与内存利用率之间的权衡,你可以使用FSDP的分片因子来配置分片级别:
- 分片因子为1:基本上移除了分片,并像DDP一样复制完整模型。
- 分片因子设置为最大可用GPU数量:开启完全分片。这能最大程度节省内存,但会增加GPU间的通信量。
- 介于两者之间的任何分片因子:启用混合分片。
性能对比
让我们看看FSDP与DDP相比的性能如何(以每GPU的TFLOPS衡量)。这些测试使用最多512个NVIDIA A100 GPU(每个80GB内存)进行。注意:1 TFLOPS对应每秒1万亿次浮点运算。
第一张图显示了不同大小T5模型的FSDP性能。你可以看到FSDP完全分片(蓝色)、混合分片(橙色)和完全复制(绿色)的不同性能数字。作为参考,DDP性能以红色显示。对于前两个T5模型(6.11亿参数和22.8亿参数),FSDP和DDP的性能相似。
现在,如果你选择一个超过22.8亿参数的模型大小,例如113亿参数的T5模型,DDP会遇到内存不足错误。而另一方面,FSDP可以轻松处理这种大小的模型,并在将模型精度降低到16位时实现更高的TFLOPS。
第二张图显示,对于113亿参数的T5模型,当GPU数量从8个增加到512个时,每GPU的TFLOPS下降了约7%(图中橙色线为批次大小16,蓝色线为批次大小8)。随着模型规模增大并分布在越来越多的GPU上,芯片间通信量的增加开始影响性能,减慢计算速度。

总之,这表明你可以将FSDP用于小型和大型模型,并无缝地将模型训练扩展到多个GPU上。
总结

本节课中我们一起学*了两种高效的多GPU计算策略。我们首先介绍了分布式数据并行,它通过复制模型来并行处理数据以加速训练。接着,我们深入探讨了全分片数据并行,它基于ZeRO技术,通过分片模型状态来允许训练远超单个GPU内存容量的大型模型。理解这些策略如何分配数据、模型参数和计算,对于高效扩展LLM训练至关重要。鉴于跨GPU训练模型的昂贵性和技术复杂性,一些研究人员正在探索如何用更小的模型获得更好的性能,我们将在下一视频中了解相关内容。
016:缩放定律和计算优化模型

在本节课中,我们将要学*大型语言模型训练中的缩放定律,以及如何优化计算资源、模型大小和训练数据量之间的关系,以实现最佳性能。

概述
上一节我们探讨了训练大型语言模型面临的一些计算挑战。本节中,我们将深入研究模型大小、训练配置与性能之间的关系,以确定模型究竟需要多大才能达到最佳效果。记住,预训练的目标是最大化模型在其学*目标上的性能,即最小化预测词元时的损失。
计算预算与性能
为了获得更好的性能,你可以选择增加训练模型的数据量,或者增加模型中的参数数量。理论上,你可以扩大其中任何一个或两个量来提高性能。
然而,另一个需要考虑的问题是计算预算,这包括你可用的GPU数量以及可用于训练模型的时间等因素。
为了帮助你理解接下来的讨论,我们首先定义一个量化所需资源的计算单位:PetaFLOP/s-day。这个单位衡量的是以每秒1 PetaFLOP(千万亿次浮点运算)的速度运行一整天所执行的浮点运算次数。



注:1 PetaFLOP 对应每秒一千万亿次浮点运算。具体到训练Transformer模型,1 PetaFLOP/s-day 大约相当于8个NVIDIA V100 GPU以最高效率运行一整天。如果你有更强大的处理器,可以同时执行更多操作,那么达到1 PetaFLOP/s-day所需的芯片数量会更少。例如,2个NVIDIA A100 GPU提供的计算能力就相当于8个V100芯片。
为了让你对这些计算预算的规模有个概念,下图比较了预训练不同变体模型所需的PetaFLOP/s-day天数。这些模型包括编码器-解码器模型T5和解码器模型GPT-3。每个模型家族内部的区别在于训练的参数数量,从数亿到1750亿不等。
注意:此处的Y轴是对数坐标,因此垂直方向的每个增量代表10的幂次方。我们可以看到,拥有30亿参数的T5-XL模型需要接*100 PetaFLOP/s-day,而更大的GPT-3(1750亿参数)模型则需要大约3700 PetaFLOP/s-day。这张图清楚地表明,训练最大的模型需要巨大的计算量。
由此可见,更大的模型需要更多的计算资源来训练,并且通常也需要更多的数据才能达到良好的性能。

缩放定律

事实证明,这些选择之间存在着明确的关系。研究人员已经探索了训练数据集大小、模型大小和计算预算之间的权衡。

以下是OpenAI研究人员一篇论文中的图表,探讨了计算预算对模型性能的影响。Y轴是测试损失,你可以将其视为模型性能的代理指标,数值越小越好。X轴是以PetaFLOP/s-day为单位的计算预算。
每条细蓝线代表一次单独训练运行中模型损失的变化。观察每次运行中损失开始下降变缓的点,可以清晰地看到计算预算与模型性能之间的关系。这种关系可以用一条粉红色的幂律关系线来*似。
幂律 是两个变量之间的一种数学关系,其中一个变量与另一个变量的某次幂成正比。在双对数坐标图中,幂律关系表现为一条直线。
只要模型大小和训练数据集大小不限制训练过程,这种关系就成立。因此,表面上看,这似乎意味着你可以通过增加计算预算来提高模型性能。
然而在实践中,你可用于训练的计算资源通常是一个硬性约束,由诸如可用硬件、训练可用时间和项目财务预算等因素决定。
固定计算预算下的优化
如果你将计算预算固定,那么提高模型性能的两个杠杆就是训练数据集的大小和模型中的参数数量。
OpenAI的研究人员发现,在另外两个变量保持不变的情况下,这两个量与测试损失之间也呈现出幂律关系。
以下是论文中另一张图,探讨了训练数据大小对模型性能的影响。在此图中,计算预算和模型大小保持不变,而训练数据集的大小是变化的。图表显示,随着训练数据量的增加,模型的性能持续提升。
在第二张图中,计算预算和训练数据集大小保持不变,训练了不同参数数量的模型。随着模型大小的增加,测试损失下降,表明性能更好。
此时你可能会问,这三个量之间的理想平衡点是什么?事实证明,很多人对这个问题感兴趣,研究和工业界都发布了大量关于预训练计算优化模型的实证数据。
计算优化模型:Chinchilla




在2022年发表的一篇论文中,由Jordan Hoffman、Sebastian Borgeaud和Arthur Mensch领导的研究小组对不同大小和训练数据量的语言模型性能进行了详细研究。他们的目标是为给定的计算预算找到最优的参数数量和训练数据量。作者将得到的计算优化模型命名为 Chinchilla,因此这篇论文通常被称为 Chinchilla论文。
让我们看看他们的一些发现。Chinchilla论文暗示,许多像GPT-3这样的千亿参数大型语言模型实际上可能是过度参数化的,这意味着它们拥有的参数超过了实现良好语言理解所需的量;同时又是训练不足的,这意味着它们会从看到更多训练数据中受益。
作者假设,如果在小模型上使用更大的数据集进行训练,它们可能能够达到与更大模型相同的性能。
在下表中,你可以看到一系列模型及其大小和训练数据信息。

Chinchilla论文的一个重要结论是:对于给定模型,最优的训练数据集大小大约是模型参数数量的20倍。Chinchilla被确定为计算最优模型,因此对于一个700亿参数的模型,理想的训练数据集应包含1.4万亿个词元,即参数数量的20倍。

表中最后三个模型是在小于Chinchilla最优大小的数据集上训练的,因此这些模型可能确实训练不足。相比之下,LLaMA模型在1.4万亿词元的数据集上训练,这个数字接*Chinchilla推荐的数量。
该论文的另一个重要结果是,计算最优的Chinchilla模型在一系列下游评估任务上的表现优于非计算最优模型(如GPT-3)。
计算优化模型的影响
有了Chinchilla论文的结果,最*一些团队已经开始开发更小的模型,这些模型取得了与以非最优方式训练的更大模型相似甚至更好的结果。

因此,展望未来,随着更多团队或像你一样的开发者开始优化他们的模型设计,你可能会看到与过去几年“越大越好”趋势的偏离。
本幻灯片中展示的最后一个模型,BloombergGPT,是一个非常有趣的模型。它遵循Chinchilla损失以计算最优的方式进行训练,因此以500亿参数的规模实现了良好的性能。
它也是一个有趣的例子,说明了在某些情况下,为了获得良好的任务性能,从头开始预训练模型是必要的。

总结

本节课中,我们一起学*了大型语言模型训练中的缩放定律。我们了解到,模型性能与计算预算、模型大小和训练数据量之间存在幂律关系。通过Chinchilla论文,我们认识到,对于给定的计算预算,存在一个最优的模型大小与训练数据量的平衡点(约为1:20),这可以让我们用更小的模型和更多的数据,达到甚至超越非最优训练的大模型的性能。这为未来更高效地设计和训练语言模型提供了重要指导。
017:针对特定领域的预训练 🎯

在本节课中,我们将要学*在何种情况下需要为一个高度专业化的领域从头开始预训练自己的大型语言模型,并以金融领域的Bloomberg GPT为例,探讨其中的权衡与考量。
到目前为止,我们一直强调,在开发应用时,通常会使用现有的大型语言模型。这可以节省大量时间,并更快地获得可工作的原型。然而,存在一种情况,您可能会发现有必要从头开始预训练自己的模型。
何时需要领域预训练?⚖️
如果您的目标领域使用的词汇和语言结构在日常语言中不常见,您可能需要进行领域适应才能获得良好的模型性能。
以下是几个具体例子:
- 法律领域:法律写作使用非常特定的术语,例如“Mens rea”(犯罪意图)和“res judicata”(既判力)。这些词汇在法律世界之外很少使用,这意味着它们不太可能广泛出现在现有LLM的训练文本中。因此,模型可能难以理解或正确使用这些术语。另一个问题是,法律语言有时会在不同的语境中使用日常词汇,例如“consideration”(对价),它与“友善”无关,而是指使合同协议可强制执行的主要要素。
- 医疗领域:医疗语言包含许多描述医疗状况和程序的不常见词汇,这些词汇在由网络抓取和书籍文本组成的数据集中可能不会频繁出现。某些领域还以高度特殊的方式使用语言。例如,处方缩写“1 tab PO QID AC & HS”对药剂师有非常明确的含义:“每日四次,每次一片,餐后及睡前口服”。

由于模型通过原始的预训练任务来学*词汇和对语言的理解,因此,对于法律、医学、金融或科学等高度专业化的领域,从头开始预训练模型将产生更好的模型。

案例研究:Bloomberg GPT 📈
现在,让我们回到Bloomberg GPT。它于2023年由彭博社的X. Qi Wu、Stephen Luu及其同事在一篇论文中首次宣布。Bloomberg GPT是一个为特定领域(本例中是金融)预训练的大型语言模型的例子。
彭博社的研究人员选择结合金融数据和通用文本数据来预训练一个模型,该模型在金融基准测试中取得了最佳结果,同时在通用LLM基准测试中也保持了有竞争力的性能。因此,研究人员选择的数据集由51%的金融数据和49%的公共数据组成。
在他们的论文中,彭博社的研究人员更详细地描述了模型架构。他们还讨论了如何以Chinchilla缩放定律为指导,以及他们必须在哪些方面做出权衡。
以下两张图比较了包括Bloomberg GPT在内的多个LLM与研究人员讨论的缩放定律。左图中的对角线描绘了针对一系列计算预算(以十亿参数计)的最优模型大小。右图中的线描绘了计算最优的训练数据集大小(以token数量计)。

每张图中的粉色虚线表示彭博团队可用于训练新模型的计算预算。粉色阴影区域对应于Chinchilla论文中确定的计算最优缩放损失。
就模型大小而言,您可以看到,在给定的130万GPU小时(约2.3亿petaFLOPs)计算预算下,Bloomberg GPT大致遵循了Chinchilla方法。模型参数数量仅略高于粉色阴影区域,表明参数数量相当接*最优值。
然而,用于预训练Bloomberg GPT的实际token数量(5690亿)低于可用计算预算所推荐的Chinchilla值。这个小于最优值的训练数据集是由于金融领域数据的可用性有限,这表明现实世界的约束可能迫使您在预训练自己的模型时做出权衡。
第一周内容回顾 📚


恭喜您完成第一周的学*!您已经涵盖了很多内容,让我们花点时间回顾一下您所看到的内容。

Mike带您了解了LLM的一些常见用例,例如论文写作、对话总结和翻译。
接着,他详细介绍了为这些模型提供动力的Transformer架构,并讨论了在推理时可以用来影响模型输出的一些参数。最后,他向您介绍了一个生成式AI项目生命周期,您可以用它来规划和指导您的应用开发工作。



然后,您看到了模型在称为“预训练”的初始训练阶段是如何在大量文本数据上进行训练的。这是模型形成对语言理解的地方。您探讨了训练这些模型的一些计算挑战,这些挑战在实践中非常重要。由于GPU内存限制,在训练模型时几乎总是会使用某种形式的量化。
您将以对LLM已发现的缩放定律的讨论结束本周的学*,以及如何利用它们来设计计算最优的模型。如果您想了解更多细节,请务必查看本周的阅读练*。


总结


本节课中,我们一起学*了针对特定领域进行预训练的必要性。当目标领域(如法律、医疗、金融)使用大量专业术语或特殊语言结构时,使用通用语料库预训练的模型可能表现不佳。此时,结合领域数据从头预训练或继续预训练是更优选择。我们以Bloomberg GPT为例,看到了在实际操作中,研究人员需要在模型大小、训练数据量和计算预算之间根据领域数据的可用性做出权衡。这为我们在特定领域应用LLM提供了重要的实践指导。
018:第二周介绍
在本节课中,我们将要学*第二周的核心内容,重点探讨如何通过指令微调让大型语言模型更好地遵循指令,并介绍参数高效微调技术,以更低的计算和内存成本实现模型定制。
课程概述
欢迎回来。本周将由讲师Mike和Shelby带领大家学*。上周我们学*了Transformer网络,这是大型语言模型和生成式AI项目生命周期的关键基础。本周我们将深入探讨更多内容,从大型语言模型的指令微调开始,之后学*如何进行高效的微调。

指令微调:让模型学会遵循指令
上一节我们介绍了Transformer的基础,本节中我们来看看如何让基础模型变得“有用”。当你拥有一个经过预训练的基础模型时,它通常编码了大量关于世界的有效信息。它知道很多事情,但不一定知道如何响应提示或问题。当我们指示它执行特定任务时,它不一定知道如何回应。因此,指令微调有助于改变其行为,使其对我们更有帮助。
我认为指令微调是大型语言模型发展史上的重大突破之一。因为通过从互联网和其他来源的通用文本中学*,模型学会了预测下一个词,但预测互联网上的下一个词与遵循指令是不同的。
这很神奇:你可以获取一个大型语言模型,用互联网上的数千亿词汇进行训练,然后使用一个规模小得多的、关于遵循指令的数据集进行微调,它就能学会这么做。
微调的挑战与应对策略
当然,需要注意的一点是灾难性遗忘,这是我们在课程中会讨论的问题。这指的是当你用一些额外数据对模型进行微调后,它可能会忘记之前学到的所有或大部分知识。
因此,我们将在课程中讨论一些技术来帮助对抗这种情况,例如在非常广泛的不同指令类型上进行微调。所以,不仅仅是针对你希望它做的事情进行微调,你可能还需要更广泛一些,我们会在课程中详细讨论。
两种关键的微调类型
事实证明,有两种类型的微调非常值得做,一种是Mike刚刚谈到的指令微调。
当特定开发者试图为自己的专业应用微调模型时,微调的一个问题是:你需要获取一个庞大的模型,并更新其中的每一个参数。这会导致模型体积巨大,难以存储和部署,并且在计算和内存上非常昂贵。
幸运的是,现在有更好的技术。我们将讨论参数高效微调,简称PEFT,这是一套可以缓解上述担忧的方法。我们有很多客户希望能够针对非常具体的任务和领域进行调优,而参数高效微调是一种很好的方式,它能在许多任务上达到与全参数微调相似的性能,同时利用一些技术让你可以冻结原始模型权重,或在顶部添加自适应层,从而大大减少内存占用,以便为多个任务进行训练。
参数高效微调的代表:LoRA
事实上,我知道你们经常使用的一种技术是LoRA。我记得当我读到LoRA论文时,我觉得这很有道理,这肯定会成功。我们看到围绕LoRA有很多兴奋和需求,因为使用这些低秩矩阵相比全参数微调能带来出色的性能结果。因此,你能够以最小的计算和内存需求获得非常好的性能。
我在不同开发者中观察到的是,许多开发者通常会从提示工程开始,有时这能提供足够好的性能,这很棒。但有时提示工程会遇到性能瓶颈,这时使用LoRA或其他PEFT技术进行微调,对于解锁更高层次的性能至关重要。
模型规模与成本的权衡
此外,我在许多开发者中看到的另一个讨论点是,关于使用巨型模型的成本(它有很多好处)与为你的应用微调一个较小模型的利弊。全参数微调的成本可能非常高。因此,能够使用像PEFT这样的技术,让生成式AI模型的微调掌握在那些有成本限制、注重成本的日常用户手中,这非常重要,现实世界中几乎每个人都是如此。
当然,如果你也关心数据去向,那么拥有一个大小合适的模型在你的控制下运行就非常重要。
总结
本节课中我们一起学*了第二周的课程大纲。本周我们将深入探讨指令微调如何教会基础模型遵循指令,并学*参数高效微调技术,特别是LoRA,它能在控制成本的同时有效提升模型在特定任务上的表现。接下来,让我们进入下一个视频,Mike将为我们开启指令微调的学*。
019:指导式微调 🎯
在本节课中,我们将要学*如何通过指导式微调来提升大型语言模型在特定任务上的性能。我们将探讨微调的基本概念、具体步骤以及评估模型性能的重要指标。

上周,我们介绍了生成式人工智能项目的生命周期。我们探讨了大型语言模型的用例,并讨论了它们能够执行的任务类型。
本节中,我们将学*可用于提升现有模型在特定用例上性能的方法。

我们还将学*用于评估微调后LLM性能的重要指标,并量化其相对于初始基础模型的改进。
指导式微调简介
让我们从讨论如何使用指导提示对LLM进行微调开始。在本课程早期,我们看到一些模型能够识别提示中包含的指令并正确执行零样本推理。
而其他模型,例如较小的LLM,可能无法执行任务,如下面这个例子所示。



我们也看到,包含一个或多个你希望模型执行的示例(称为单样本或少样本推理)可能足以帮助模型识别任务并生成良好的补全。


然而,这种策略有几个缺点。首先,对于较小的模型,即使包含五六个示例,它也不总是有效。
其次,提示中包含的示例会占用上下文窗口中的宝贵空间,减少了包含其他有用信息的空间。
幸运的是,存在另一种解决方案:你可以利用一个称为微调的过程来进一步训练基础模型。

微调与预训练的区别
与预训练不同,预训练是通过自监督学*使用大量非结构化文本数据来训练LLM。

微调是一个监督学*过程,你使用带标签示例的数据集来更新LLM的权重。
带标签的示例是提示-补全对。微调过程扩展了模型的训练,以提高其针对特定任务生成良好补全的能力。

一种称为指导式微调的策略在提升模型在各种任务上的性能方面特别有效。
让我们更仔细地看看这是如何工作的。
指导式微调的工作原理

指导式微调使用展示模型应如何响应特定指令的示例来训练模型。
以下是几个示例提示来说明这个想法。
两个示例中的指令都是“classify this review”,期望的补全是一个以“sentiment”开头的文本字符串,后面跟着“positive”或“negative”。


用于训练的数据包括许多你感兴趣任务的提示-补全示例对,每个示例都包含一个指令。
例如,如果你想微调模型以提高其摘要能力,你需要构建一个以“summarize the following text”或类似短语开头的示例数据集。

如果你想提升模型的翻译技能,你的示例将包含“translate this sentence”这样的指令。
这些提示-补全示例使模型能够学会生成遵循给定指令的响应。
全微调
指导式微调,即更新模型所有权重的方法,被称为全微调。

这个过程会产生一个具有更新权重的新版本模型。
需要注意的是,与预训练一样,全微调需要足够的内存和计算预算来存储和处理训练期间更新的所有梯度、优化器和其他组件。因此,你可以从上周学到的内存优化和并行计算策略中受益。
执行指导式微调的步骤
那么,你实际上如何进行LLM的指导式微调呢?
第一步是准备你的训练数据。有许多公开可用的数据集曾被用于训练早期版本的语言模型,尽管其中大多数并未格式化为指令。
幸运的是,开发人员已经组装了提示模板库,可用于将现有数据集(例如大型的亚马逊产品评论数据集)转换为用于微调的指导提示数据集。
提示模板库包含许多针对不同任务和不同数据集的模板。


以下是三个设计用于亚马逊评论数据集的提示,可用于微调模型以进行分类、文本生成和文本摘要任务。你可以看到,在每种情况下,你将原始评论(此处称为“review body”)传递给模板,模板将其插入到以指令开头的文本中,例如“predict the associated rating”、“Generate a star review”或“give a short sentence describing the following product review”。
结果是一个现在既包含指令又包含数据集中示例的提示。
一旦你的指导数据集准备就绪,与标准监督学*一样,你将数据划分为训练集、验证集和测试集。
在微调期间,你从训练数据中选择提示并将其传递给LLM,LLM随后生成补全。
接下来,你将LLM生成的补全与训练数据中指定的响应进行比较。
你可以看到这里模型做得并不好,它将评论分类为“neutral”,这有点轻描淡写。该评论显然是非常积极的。

请记住,LLM的输出是跨词元的概率分布,因此你可以比较补全的分布和训练标签的分布,并使用标准的交叉熵函数来计算损失。



然后使用计算出的损失在标准反向传播中更新你的模型权重。
你将针对许多批次的提示-补全对执行此操作,并在多个训练周期中更新权重,以提高模型在该任务上的性能。
评估微调后的模型

与标准监督学*一样,你可以定义单独的评估步骤,使用留出的验证数据集来衡量LLM的性能。这将为你提供验证准确率。
完成微调后,你可以使用留出的测试数据集执行最终的性能评估。这将为你提供测试准确率。

微调过程会产生基础模型的一个新版本,通常称为指导模型,它在您感兴趣的任务上表现更好。
使用指导提示进行微调是当前微调LLM最常见的方式。从现在开始,当你听到或看到“微调”这个术语时,可以假定它总是指指导式微调。
总结


本节课中,我们一起学*了指导式微调的概念和方法。我们了解了微调与预训练的区别,探讨了指导式微调的工作原理和具体步骤,包括数据准备、训练过程和性能评估。通过指导式微调,我们可以显著提升大型语言模型在特定任务上的表现,使其更好地遵循指令并生成高质量的响应。
020:19_单任务指导式微调


概述
在本节课中,我们将要学*如何针对单一任务对预训练的大型语言模型进行微调。我们将探讨这种方法的优势、潜在风险(如灾难性遗忘)以及应对策略。
单任务微调简介
虽然大型语言模型因其能在单一模型中执行多种语言任务而闻名,但您的应用程序可能只需要执行单一任务。在这种情况下,您可以对预训练模型进行微调,以仅提升您所关注任务的性能。例如,使用该任务的数据集示例进行摘要生成。
微调所需的数据量
有趣的是,只需相对较少的示例即可获得良好的结果。通常,仅需500到1000个示例就能实现良好的性能。这与模型在预训练期间看到的数十亿条文本形成了鲜明对比。
灾难性遗忘的风险
然而,针对单一任务进行微调存在一个潜在的缺点。这个过程可能导致一种称为“灾难性遗忘”的现象。灾难性遗忘的发生是因为完整的微调过程会修改原始大型语言模型的权重。虽然这能显著提升单一微调任务的性能,但可能会降低模型在其他任务上的表现。
例如,微调可以提升模型对评论进行情感分析的能力并产生高质量的完成结果,但模型可能会忘记如何执行其他任务。该模型在微调前知道如何进行命名实体识别,能正确识别句子中猫的名字“Charlie”。但在微调后,模型无法再执行此任务,不仅混淆了应该识别的实体,还表现出与新任务相关的行为。
如何避免灾难性遗忘
那么,有哪些选项可以避免灾难性遗忘呢?首先,重要的是要判断灾难性遗忘是否真的影响您的用例。
如果您只需要在微调的单一任务上获得可靠的性能,那么模型无法泛化到其他任务可能不是问题。
如果您确实希望或需要模型保持其多任务泛化能力,您可以同时针对多个任务进行微调。良好的多任务微调可能需要跨多个任务的5万到10万个示例,因此需要更多的数据和计算资源来训练。我们稍后将更详细地讨论这个选项。
第二个选项是执行参数高效微调,简称PEFT,而不是完全微调。PEFT是一套技术,它保留原始大型语言模型的权重,只训练少量特定于任务的适配器层和参数。由于大部分预训练权重保持不变,PEFT对灾难性遗忘表现出更强的鲁棒性。PEFT是一个令人兴奋且活跃的研究领域,我们将在本周晚些时候进行介绍。

总结
本节课中,我们一起学*了针对单一任务进行模型微调的方法。我们了解到,虽然少量数据即可有效提升特定任务性能,但需警惕“灾难性遗忘”的风险。为此,我们探讨了两种主要应对策略:一是评估该风险对实际应用的影响,若无需多任务能力则可忽略;二是采用多任务微调或参数高效微调技术来保持模型的广泛能力。下一节,我们将更深入地探讨多任务微调。
021:多任务指导式微调 🎯


在本节课中,我们将要学*多任务指导式微调。这是一种扩展的单任务微调方法,旨在让模型同时学*并精通多个不同的任务,从而避免“灾难性遗忘”的问题。
什么是多任务指导式微调?🤔
上一节我们介绍了单任务微调,本节中我们来看看它的扩展形式——多任务指导式微调。
多任务指导式微调是单任务微调的扩展。其训练数据由多个任务的输入和输出示例组成。
以下是其核心特点:
- 数据多样性:数据集包含指示模型执行各种任务的示例,例如摘要、评论评级、代码翻译和实体识别。
- 同步优化:在此混合数据集上训练模型,可以同时提升模型在所有任务上的性能,从而避免灾难性遗忘的问题。
- 训练过程:经过多个训练周期,所有示例计算出的损失被用于更新模型权重,最终得到一个指导式微调模型,该模型学会了如何同时擅长多种不同任务。
多任务微调的优缺点 ⚖️
多任务微调的一个缺点是需要大量数据。你可能需要多达5万到10万个示例来构建训练集。
然而,投入精力收集这些数据通常是值得的。由此产生的模型通常能力非常全面,适用于需要模型在多种任务上都有良好表现的场景。
FLAN模型家族实例 🍰

接下来,让我们看一个通过多任务指导式微调训练出来的模型家族。

指导式模型变体之间的差异,主要基于微调时使用的数据集和任务。一个例子是FLAN模型家族。FLAN代表“微调语言网络”,是一套用于微调不同模型的特定指令集。由于FLAN微调是训练过程的最后一步,原论文作者将其比喻为预训练主菜之后的“甜点”,这个名字非常贴切。
以下是FLAN模型的两个例子:
- Flan-T5:这是T5基础模型的FLAN指导版本。
- Flan-PaLM:这是PaLM基础模型的FLAN指导版本。

Flan-T5是一个出色的通用指导模型。它总共在146个任务类别的473个数据集上进行了微调。这些数据集选自其他模型和论文。

数据集示例:SAMSum 📝
用于Flan-T5摘要任务的一个提示数据集例子是SAMSum。它属于MUFFIN任务和数据集集合的一部分,用于训练语言模型总结对话。SAMSum是一个包含1.6万个类似即时通讯的对话及其摘要的数据集。
以下是三个示例,左侧为对话,右侧为摘要。这些对话和摘要由语言学家专门制作,旨在为语言模型生成高质量的训练数据集。语言学家被要求创建他们日常会写的对话,反映其真实生活中即时通讯对话的话题比例。然后,其他语言专家为这些对话创建简短摘要,其中包含重要信息和对话中人物的姓名。
提示模板与泛化能力 🔧
这是一个为SAMSum对话摘要数据集设计的提示模板。该模板实际上由几个不同的指令组成,这些指令基本上都要求模型做同一件事:总结对话。
以下是几个指令变体:
- 简要总结该对话。
- 这个对话的摘要是什么?
- 那个对话中发生了什么?
包含表达同一指令的不同方式,有助于模型更好地泛化和提升性能。就像之前看到的提示模板一样,在每个案例中,SAMSum数据集中的对话都被插入到模板中“{dialogue}”字段出现的位置。摘要则用作标签。将此模板应用于SAMSum数据集的每一行后,就可以用它来微调对话摘要任务。

特定领域微调的必要性 🎯

虽然Flan-T5是一个在许多任务上都表现出良好能力的通用模型,但你可能会发现,对于你的特定用例任务,它仍有改进空间。
例如,假设你是一名数据科学家,正在构建一个应用程序来支持客服团队处理通过聊天机器人收到的请求。你的客服团队需要每个对话的摘要,以识别客户请求的关键行动,并确定应采取何种应对措施。

SAMSum数据集赋予了Flan-T5一些总结对话的能力。然而,该数据中的示例大多是朋友之间关于日常活动的对话,与客服聊天中观察到的语言结构重叠不多。
你可以使用一个与你聊天机器人对话更接*的对话数据集,对Flan-T5模型进行额外的微调。这正是本周实验中将探索的确切场景。你将利用一个名为DialogSum的额外领域特定摘要数据集,来提升Flan-T5总结客服聊天对话的能力。
微调效果对比:以DialogSum为例 📊

DialogSum数据包含超过1.3万个客服聊天对话及其摘要。该数据不属于Flan-T5的训练数据,因此模型之前从未见过这些对话。
让我们看一个DialogSum中的例子,并讨论额外一轮微调如何改进模型。这是一个典型的DialogSum数据集示例中的客服聊天,对话发生在客户和酒店前台工作人员之间。聊天已应用了模板,因此总结对话的指令包含在文本开头。
现在,让我们看看在进行任何额外微调之前,Flan-T5如何响应这个提示。
模型响应(微调前):
The conversation is about a reservation for Tommy.


人类生成的基线摘要:
Mike asks for information to facilitate check-in for Tommy's reservation.
可以看到,模型表现尚可,能够识别对话是关于Tommy的预订。然而,它不如人类生成的基线摘要,后者包含了重要信息,例如Mike要求信息以方便办理入住。此外,模型的补全还编造了原始对话中未包含的信息,特别是酒店名称及其所在城市。
现在,让我们看看模型在DialogSum数据集上微调后的表现。
模型响应(微调后):
Mike asks for information to facilitate check-in for Tommy's reservation.
希望你会同意,这个结果更接*人类生成的摘要。它没有编造信息,并且摘要包含了所有重要细节,包括参与对话的双方姓名。这个例子使用公共的DialogSum数据来演示在自定义数据上的微调。
实践建议:使用内部数据 🏢

在实践中,通过使用公司自己的内部数据,你能从微调中获得最大收益。例如,来自你客服应用程序的客服聊天对话。这将帮助模型学*你公司总结对话的具体方式,以及什么对你的客服同事最有用。
我知道这里有很多内容需要消化,但别担心,这个例子将在实验课中详细讲解,你将有机会亲眼看到并亲自尝试。

进行微调时,你需要考虑的一件事是如何评估模型补全的质量。在下一个视频中,你将学*几种指标和基准测试,可以用来确定模型的性能如何,以及你的微调版本比原始基础模型好了多少。

本节课中我们一起学*了:多任务指导式微调的概念、其优缺点,以及FLAN模型家族(如Flan-T5)如何通过大量多样化数据集进行训练。我们还探讨了针对特定领域(如客服聊天摘要)进行额外微调的必要性和效果,并了解了使用内部数据进行微调的最佳实践。
022:模型评估

在本节课中,我们将学*如何评估大型语言模型的性能。你将了解如何量化模型在特定任务上的表现,以及如何比较微调模型与基础预训练模型之间的性能差异。我们将介绍两种核心评估指标:Rouge和BLEU,并解释它们的计算方法和适用场景。
概述
在之前的课程中,我们经常看到诸如“模型在此任务上表现出色”或“微调模型相比基础模型性能有显著提升”的表述。这些表述具体意味着什么?我们如何将微调模型相对于初始预训练模型的性能提升进行形式化衡量?本节将探讨大型语言模型开发者使用的几种评估指标,你可以用它们来评估自己模型的性能,并与世界上的其他模型进行比较。
从传统机器学*到LLM评估
在传统机器学*中,你可以通过观察模型在已知输出的训练集和验证集上的表现来评估其性能。由于模型是确定性的,你可以计算简单的指标,例如准确率,它表示所有预测中正确的比例。
然而,对于输出非确定性且基于语言的大型语言模型,评估则更具挑战性。例如,句子“Mike really loves drinking tea”与“Mike adores sipping tea”非常相似,但我们如何衡量这种相似性?再看另外两个句子:“Mike does not drink coffee”和“Mike does drink coffee”。它们之间只有一个词的差异,但含义却完全不同。
对于我们人类来说,可以轻易看出这些句子的异同。但当你用数百万个句子训练模型时,你需要一种自动化、结构化的方式进行测量。
核心评估指标:Rouge与BLEU
以下是两种针对不同任务广泛使用的评估指标。
- Rouge:全称为“面向召回率的摘要评估替身”,主要用于通过将自动生成的摘要与人工生成的参考摘要进行比较,来评估摘要的质量。
- BLEU:全称为“双语评估替身”,是一种通过将机器翻译文本与人工翻译进行比较来评估其质量的算法。BLEU在法语中是“蓝色”的意思,所以你可能会听到有人称它为“Blue”,但这里我们将坚持使用原始的“BLEU”。
在开始计算指标之前,我们先回顾一些术语。在语言构成中:
- Unigram 相当于一个单词。
- Bigram 是两个单词。
- N-gram 是一组N个单词。
这是非常直接的概念。
深入理解Rouge指标
首先,让我们看看Rouge-1指标。为此,我们来看一个由人生成的参考句子“It is cold outside”和一个模型生成的输出“It is very cold outside”。你可以使用召回率、精确率和F1分数进行计算,类似于其他机器学*任务。
- 召回率衡量的是参考句子和生成输出之间匹配的单词(unigram)数量,除以参考句子中的单词总数。在本例中,由于所有生成的单词都与参考句子中的单词匹配,因此获得了完美的分数1。
- 精确率衡量的是匹配的unigram数量除以生成输出的总单词数。
- F1分数是召回率和精确率的调和平均数。
这些是非常基础的指标,只关注单个单词(因此名称中有“1”),不考虑单词的顺序,所以可能具有欺骗性。模型很容易生成得分很高但主观上质量很差的句子。
停下来想一想,如果模型生成的句子只差一个词,比如“It is not cold outside”,其得分会是一样的。你可以通过考虑bigram(即每次从参考句子和生成句子中取两个词的组合)来获得稍好的分数。通过处理词对,你以一种非常简单的方式承认了句子中单词的顺序。使用bigram,你可以计算Rouge-2。现在,你可以使用bigram匹配而不是单个单词来计算召回率、精确率和F1分数。你会注意到,这些分数低于Rouge-1的分数。对于更长的句子,bigram不匹配的几率更大,分数可能更低。
与其继续使用更大的n(如三元组或四元组)来计算Rouge-N,不如采用不同的方法。接下来,你将在生成输出和参考输出中寻找最长的公共子序列。在本例中,最长的匹配子序列是“it is”和“cold outside”,每个长度为2。你现在可以使用LCS值来计算召回率、精确率和F1分数,其中召回率和精确率计算公式的分子都是最长公共子序列的长度(本例中为2)。这三个量统称为Rouge-L分数。
与所有Rouge分数一样,你需要结合上下文来理解这些值。只有在为相同任务(例如摘要)确定分数时,你才能使用这些分数来比较模型的能力。不同任务的Rouge分数彼此之间不可比。
Rouge指标的局限性及改进
正如你所见,简单Rouge分数的一个特定问题是,一个糟糕的生成结果也可能导致高分。例如,考虑这个生成输出:“cold, cold, cold, cold”。由于这个生成输出包含了参考句子中的一个词,即使同一个词重复了多次,它也会得到相当高的分数。Rouge-1精确率得分将是完美的。
解决此问题的一种方法是使用截断函数,将unigram匹配的数量限制为该unigram在参考句子中出现的最大次数。在本例中,“cold”在参考句子中出现了一次,因此,对unigram匹配进行截断后的修正精确率会导致分数大幅降低。
然而,如果生成的单词都存在,只是顺序不同,你仍然会面临挑战。例如,对于这个生成的句子“outside cold, it is”,即使在使用了截断函数的修正精确率上,这个句子也能获得完美分数,因为生成输出中的所有单词都存在于参考句子中。

因此,虽然使用不同的Rouge分数会有所帮助,但实验确定能计算出最有用的分数的n-gram大小,将取决于句子本身、句子长度和你的具体用例。
请注意,许多语言模型库(例如你在第一周实验中使用过的Hugging Face)都包含了Rouge分数的实现,你可以轻松地使用它们来评估模型的输出。在本周的实验中,你将尝试使用Rouge分数来比较模型在微调前后的性能。
BLEU评分详解
另一个可用于评估模型性能的有用分数是BLEU分数,它代表“双语评估替身”。提醒一下,BLEU分数对于评估机器翻译文本的质量很有用。该分数本身是通过对多个n-gram大小的精确率取平均值来计算的,就像我们之前看到的Rouge-1分数一样,但是针对一系列n-gram大小进行计算然后取平均。
让我们更仔细地看看它衡量什么以及如何计算。BLEU分数通过检查机器生成的翻译中有多少n-gram与参考翻译中的n-gram匹配来量化翻译的质量。要计算该分数,你需要对一系列不同n-gram大小的精确率取平均值。如果你要手动计算,你将执行多次计算,然后对所有结果取平均值以找到BLEU分数。
对于这个例子,让我们看一个更长的句子,以便你能更好地理解分数的价值。参考的人工提供句子是:“I am very happy to say that I am drinking a warm cup of tea.” 既然你已经深入了解了Rouge的各个计算步骤,我将使用一个标准库向你展示BLEU的结果。使用像Hugging Face这样的提供商提供的预写库来计算BLEU分数很容易。我已经为我们的每个候选句子做了计算。
第一个候选句子是“I am very happy that I am drinking a cup of tea.”,其BLEU分数是0.495。随着生成的句子越来越接*原始句子,我们得到的分数也越来越接*1。
总结与最佳实践
Rouge和BLEU都是相当简单的指标,计算成本相对较低。你可以在迭代优化模型时将它们用作简单的参考。但你不应单独使用它们来报告大型语言模型的最终评估结果。使用Rouge进行摘要任务的诊断性评估,使用BLEU进行翻译任务的评估。

然而,要对模型的整体性能进行评估,你需要查看研究人员开发的一些评估基准。我们将在下一个视频中更详细地了解其中的一些基准。
在本节课中,我们一起学*了如何评估大型语言模型的性能。我们介绍了Rouge和BLEU这两种核心评估指标,解释了它们分别适用于摘要和翻译任务,并讨论了它们的计算方式及局限性。记住,这些自动化指标是强大的工具,但应结合具体任务上下文和更全面的评估基准来使用。
023:基准测试

概述
在本节课中,我们将要学*如何更全面地评估大型语言模型的性能。我们将介绍一系列由研究人员专门设计的基准测试和数据集,它们能帮助我们衡量模型在推理、常识、风险等多方面的能力,并理解如何选择合适的评估数据。
正如上一节视频所见,大型语言模型非常复杂,像Rouge和BLEU分数这样的简单评估指标,只能有限地反映模型的能力。
为了更全面地衡量和比较大型语言模型,你可以利用由LLM研究人员专门为此目的建立的现有数据集和相关基准。
选择合适的评估数据集至关重要,这能让你准确评估LLM的性能并理解其真实能力。

你会发现,选择那些能隔离特定模型技能(如推理或常识知识)的数据集,以及那些关注潜在风险(如虚假信息或版权侵权)的数据集,会非常有用。
你需要考虑的一个重要问题是,模型在训练期间是否见过你的评估数据。通过评估模型在未见过的数据上的表现,你能对模型能力获得更准确、更有用的认识。
主流基准测试概览
以下是几个覆盖广泛任务和场景的基准测试,它们通过设计或收集能测试LLM特定方面的数据集来实现这一目标。
GLUE(通用语言理解评估基准)于2018年推出。它是一个自然语言任务的集合,例如情感分析和问答。GLUE的创建是为了鼓励开发能够跨多个任务泛化的模型,你可以使用这个基准来衡量和比较模型性能。

作为GLUE的继任者,SuperGLUE于2019年推出,以解决其前身的局限性。它由一系列任务组成,其中一些是GLUE未包含的,另一些则是相同任务的更具挑战性的版本。SuperGLUE包括多句子推理和阅读理解等任务。
GLUE和SuperGLUE基准测试都设有排行榜,可用于比较和对比已评估的模型。其结果页面也是跟踪LLM进展的绝佳资源。

基准测试的发展与挑战
随着模型变得越来越大,它们在SuperGLUE等基准测试上的表现开始在某些特定任务上匹配人类能力。这意味着模型在基准测试中能表现得和人类一样好。但从主观上看,我们发现它们在通用任务上并未达到人类水平。
因此,在LLM的涌现特性和旨在衡量它们的基准测试之间,本质上存在一场“军备竞赛”。
以下是几个推动LLM进一步发展的*期基准测试:
MMLU(大规模多任务语言理解)是专门为现代LLM设计的。为了表现出色,模型必须拥有广泛的世界知识和解决问题的能力。模型将在初等数学、美国历史、计算机科学、法律等领域接受测试。换句话说,这些任务远远超出了基本的语言理解。
BIG-bench目前包含204项任务,涵盖语言学、儿童发展、数学、常识推理、生物学、物理学、社会偏见、软件开发等。BIG-bench有三种不同的规模。部分原因是为了控制成本可行,因为运行这些大型基准测试可能会产生高昂的推理成本。

HELM:一个全面的评估框架
最后一个你应该了解的基准测试是HELM(语言模型整体评估)。
HELM框架旨在提高模型的透明度,并就哪些模型在特定任务上表现良好提供指导。HELM采用多指标方法,在16个核心场景中测量7个指标,确保模型和指标之间的权衡被清晰地揭示出来。
HELM的一个重要特点是,它评估的指标超出了精确度或F1分数等基本准确性度量。该基准测试还包括公平性、偏见和毒性的指标。随着LLM越来越能够生成类人语言,并可能因此表现出有害行为,评估这些指标正变得越来越重要。

HELM是一个动态发展的基准测试,旨在通过添加新的场景、指标和模型来持续演进。你可以查看其结果页面,浏览已评估的LLM,并查看与你的项目需求相关的分数。

总结
本节课中,我们一起学*了评估大型语言模型性能的重要工具——基准测试。我们了解到,简单的评估指标不足以全面衡量LLM,因此需要利用GLUE、SuperGLUE、MMLU、BIG-bench和HELM等专门的基准测试。这些测试通过设计多样化的任务和引入多维度指标(包括公平性和毒性),帮助我们更准确、更全面地评估模型在知识、推理、风险等方面的真实能力,并为模型选择和应用提供重要指导。
024:参数高效微调 🎯

在本节课中,我们将要学*参数高效微调技术。这是一种在资源有限的情况下,通过仅更新模型的一小部分参数来适应新任务的方法,从而避免了完整微调带来的巨大计算和存储开销。
正如你在课程第一周所见,训练大型语言模型在计算上是密集的。完整微调不仅需要存储模型本身的内存,还需要存储训练过程中所需的各种其他参数。

即使你的计算机能够容纳模型权重(对于最大的模型,权重可达数百GB),你也必须能够为优化器状态、梯度、前向激活值和整个训练过程中的临时内存分配空间。这些额外的组件可能比模型本身大许多倍,并且可能迅速超出消费级硬件的处理能力。
与完整微调(在监督学*期间更新每个模型参数)不同,参数高效微调方法只更新一小部分参数。
参数高效微调的核心思想
一些PEFT技术冻结了大部分模型权重,专注于微调现有模型参数的一个子集(例如,特定层或组件)。另一些技术则完全不触及原始模型权重,而是添加少量新参数或层,并且只微调这些新组件。
使用PEFT时,大部分(即使不是全部)LLM权重都被冻结。因此,训练的参数数量远少于原始LLM的参数数量。在某些情况下,仅占原始LLM权重的15%到20%。这使得训练的内存需求变得更容易管理。事实上,PEFT通常可以在单个GPU上执行。并且由于原始LLM只被轻微修改或保持不变,PEFT更不容易出现完整微调可能导致的灾难性遗忘问题。
完整微调会为你训练的每个任务生成一个新版本的模型。每个新模型都与原始模型大小相同,因此如果你为多个任务进行微调,可能会造成昂贵的存储问题。
让我们看看如何使用PEFT来改善这种情况。通过参数高效微调,你只训练少量权重,这导致整体占用空间小得多(根据任务不同,可能小到几兆字节)。这些新参数在推理时会与原始LLM权重结合使用。PEFT权重是为每个任务训练的,并且可以在推理时轻松替换,从而允许原始模型高效地适应多个任务。
主要的PEFT方法类别
以下是几种可用于参数高效微调的方法,每种方法在参数效率、内存效率、训练速度、模型质量和推理成本方面都有权衡。让我们来看看PEFT方法的三个主要类别。
选择性方法:这类方法仅微调原始LLM参数的一个子集。有几种方法可以用来确定你想要更新的参数。你可以选择只训练模型的某些组件、特定层,甚至是个别参数类型。研究人员发现这些方法的性能参差不齐,并且在参数效率和计算效率之间存在显著的权衡,因此本课程将不重点讨论它们。
重参数化方法:这类方法也处理原始LLM参数,但通过对原始网络权重创建新的低秩变换来减少需要训练的参数数量。这类方法中常用的技术是LoRA,你将在下一个视频中详细探讨。
添加性方法:这类方法通过保持所有原始LLM权重冻结,并引入新的可训练组件来进行微调。这里有两种主要方法:
- 适配器方法:向模型架构中添加新的可训练层,通常位于注意力层或前馈层之后的编码器或解码器组件内部。
- 软提示方法:另一方面,保持模型架构固定和冻结,专注于操纵输入以获得更好的性能。这可以通过向提示嵌入中添加可训练参数,或者保持输入固定并重新训练嵌入权重来实现。
在本课中,你将了解一种名为“提示调优”的特定软提示技术。

总结与过渡
本节课中,我们一起学*了参数高效微调的基本概念、优势以及三种主要方法类别(选择性、重参数化和添加性)。我们了解到,PEFT通过大幅减少需要训练和存储的参数,使得在有限资源下定制大模型成为可能。

接下来,让我们进入下一个视频,更仔细地研究LoRA方法,看看它是如何减少训练所需内存的。


025:参数高效微调技术1 - LoRA 🎯

在本节课中,我们将要学*一种名为低秩适应的参数高效微调技术,简称LoRA。这是一种属于重参数化范畴的技术,它能显著减少微调时需要训练的参数数量,从而降低计算成本。
回顾Transformer架构


在深入了解LoRA之前,我们先快速回顾一下Transformer架构。输入提示被转换为词元,然后转化为嵌入向量,并传入Transformer的编码器和/或解码器部分。在这些组件中,存在两种神经网络:自注意力层和前馈网络。这些网络的权重在预训练期间学*得到。
嵌入向量生成后,会被送入自注意力层。在该层中,会应用一系列权重来计算注意力分数。在全量微调过程中,这些层中的每一个参数都会被更新。
LoRA的工作原理 🔧
上一节我们介绍了全量微调,本节中我们来看看LoRA如何以更高效的方式工作。
LoRA是一种通过冻结原始模型的所有参数,然后在原始权重旁边注入一对低秩分解矩阵来减少微调期间训练参数数量的策略。这两个较小矩阵的维度被设定为:它们的乘积是一个与它们要修改的权重矩阵维度相同的矩阵。
在微调过程中,保持LLM的原始权重冻结,仅使用本周早些时候介绍的监督学*过程来训练这些较小的矩阵。对于推理,将两个低秩矩阵相乘,创建一个与冻结权重维度相同的矩阵,然后将其加到原始权重上,并用这些更新后的值替换模型中的原始权重。
这样,你就得到了一个经过LoRA微调的模型,可以执行你的特定任务。由于该模型具有与原始模型相同数量的参数,因此对推理延迟几乎没有影响。
LoRA的应用与优势

研究发现,仅将LoRA应用于模型的自注意力层,通常就足以针对任务进行微调并获得性能提升。原则上,你也可以将其用于其他组件,如前馈层。但由于LLM的大部分参数都在注意力层中,因此通过将LoRA应用于这些权重矩阵,可以获得最大的可训练参数节省。
以下是LoRA的一个实际优势:
- 显著减少参数:通过更新新的低秩矩阵的权重,而非原始权重,可训练参数数量大幅下降。
- 降低硬件需求:由于可训练参数显著减少,通常可以使用单个GPU执行这种参数高效微调,而无需分布式GPU集群。
- 灵活的任务切换:由于低秩分解矩阵很小,你可以为每个任务微调一组不同的矩阵,然后在推理时通过更新权重来切换它们。这避免了存储多个完整尺寸LLM版本的需要。
实例分析:参数计算

让我们以《Attention Is All You Need》论文中描述的Transformer架构为例进行具体分析。论文指明Transformer权重维度为512x64。这意味着每个权重矩阵有 32,768 个可训练参数。

如果你使用秩为8的LoRA进行微调,你将训练两个小的低秩分解矩阵,其较小维度为8。这意味着:
- 矩阵A的维度为8x64,总计 512 个参数。
- 矩阵B的维度为512x8,总计 4,096 个参数。

因此,通过更新这些新的低秩矩阵的权重,你将训练 4,608 个参数,而不是原来的32,768个,减少了 86%。
性能评估:LoRA vs. 全量微调
那么,这些模型的效果如何呢?我们使用本周早些时候学到的Rouge指标,来比较LoRA微调模型、原始基础模型和全量微调版本的性能。
我们专注于对FLAN-T5进行对话摘要任务的微调。首先,为FLAN-T5基础模型和我们之前讨论过的摘要数据集设定一个基线分数。基础模型的Rouge分数相对较低。


接下来,查看在对话摘要上进行了额外全量微调的模型的分数。全量微调在监督学*期间更新模型中的每一个权重,这导致了更高的Rouge-1分数,比基础FLAN-T5模型提高了0.19。
现在,让我们看看LoRA微调模型的分数。这个过程也带来了性能的大幅提升。Rouge-1分数比基线提高了0.17,略低于全量微调,但相差不大。然而,使用LoRA进行微调所训练的参数数量远少于全量微调,使用的计算资源也显著减少。因此,性能上的这点微小折衷可能是非常值得的。
如何选择LoRA的秩?
你可能会想知道如何选择LoRA矩阵的秩。这是一个好问题,并且仍然是一个活跃的研究领域。原则上,秩越小,可训练参数越少,计算节省越大。然而,需要考虑一些与模型性能相关的问题。
在首次提出LoRA的论文中,微软的研究人员探索了不同的秩选择如何影响模型在语言生成任务上的性能。他们发现,对于大于16的秩,损失值会达到一个平台期。换句话说,使用更大的LoRA矩阵并没有改善性能。



这里的启示是,4到32之间的秩可以在减少可训练参数和保持性能之间提供良好的平衡。优化秩的选择是一个持续的研究领域,随着更多像你一样的实践者使用LoRA,最佳实践可能会不断发展。
总结与展望

本节课中我们一起学*了LoRA这一强大的微调方法。它通过引入和训练低秩矩阵来*似权重更新,实现了出色的性能,同时大幅降低了计算和存储需求。该方法背后的原理不仅适用于训练LLM,也适用于其他领域的模型。

本周你将探索的最后一种PEFT方法完全不改变LLM本身,而是专注于训练你的输入文本。我将在下一个视频中与你分享更多。
026:参数高效微调技术2-软提示 🎯
在本节课中,我们将要学*第二种参数高效微调(PEFT)方法——提示调优。我们将探讨它与提示工程的区别,了解其工作原理,并分析其性能表现。
上一节我们介绍了LoRA,其目标是找到一种无需重新训练所有参数的模型权重更新方法。而在PEFT中,还存在一些加性方法,其目标是在完全不改变模型权重的情况下提升模型性能。


提示工程与提示调优的区别 🤔
提示调优听起来与提示工程有些相似,但两者截然不同。
以下是提示工程的核心思路:
- 目标:通过优化提示的语言,来获得期望的模型输出。
- 方法:尝试不同的词语、短语,或包含示例进行单样本/少样本推理。
- 目的:帮助模型理解你要求其执行的任务性质,从而生成更好的输出。

然而,提示工程存在一些局限性:
- 需要大量手动工作来编写和尝试不同的提示。
- 受限于上下文窗口的长度。
- 最终可能仍无法为特定任务达到所需的性能。

什么是提示调优? 🧠
与提示工程不同,提示调优会向你的提示中添加额外的可训练标记,并让监督学*过程来决定这些标记的最优值。
这组可训练标记被称为软提示。它会被前置到代表输入文本的嵌入向量之前。
软提示向量与语言标记的嵌入向量长度相同。通常,包含20到100个虚拟标记就足以获得良好的性能。


自然语言标记是“硬”的,因为它们各自对应嵌入向量空间中的一个固定位置。而软提示并非固定的自然语言离散词汇。你可以将它们视为虚拟标记,可以在连续的多维嵌入空间中取任何值。通过监督学*,模型会学*到这些虚拟标记的值,以最大化特定任务的性能。
与全参数微调的对比 ⚖️

以下是两种方法的核心区别:
-
全参数微调:
- 训练数据集由输入提示和输出补全(或标签)组成。
- 在监督学*过程中,大型语言模型的权重会被更新。
-
提示调优:
- 大型语言模型的权重被冻结,底层模型不会被更新。
- 取而代之的是,软提示的嵌入向量会随着时间被更新,以优化模型对提示的补全。
提示调优是一种参数效率极高的策略,因为只有少量参数被训练,这与全参数微调中需要更新数百万到数十亿参数形成鲜明对比。
提示调优的优势与灵活性 🔄

与LoRA类似,你可以为每个任务训练一组不同的软提示,然后在推理时轻松地切换它们。
以下是其工作流程:
- 为任务A训练一组软提示。
- 为任务B训练另一组软提示。
- 在推理时,只需将输入提示与学*到的软提示拼接即可。
- 要切换到另一个任务,只需更换软提示。
软提示在磁盘上占用的空间非常小,因此这种微调方式极其高效和灵活。你会注意到,所有任务都使用同一个LLM,在推理时只需切换软提示即可。
性能表现分析 📊
在Brian Lester及其谷歌合作者探索该方法的原始论文中,作者将提示调优与其他几种方法在不同模型规模下进行了比较。
从论文中的图表可以看出:
- X轴:模型规模。
- Y轴:SuperGLUE基准测试得分(用于评估模型在多种不同语言任务上的性能)。
- 红线:通过单任务全参数微调创建的模型得分。
- 橙线:使用多任务微调创建的模型得分。
- 绿线:提示调优的性能。
- 蓝线:仅使用提示工程的得分。
分析表明,对于较小的LLM,提示调优的性能不如全参数微调。然而,随着模型规模的增大,提示调优的性能也随之提升。一旦模型参数达到约100亿,提示调优的效果可以与全参数微调相媲美,并且比单纯的提示工程带来显著的性能提升。
软提示的可解释性 🔍

一个需要考虑的潜在问题是学*到的虚拟标记的可解释性。由于软提示标记可以在连续的嵌入向量空间中取任何值,训练后的标记并不对应LLM词汇表中的任何已知标记、单词或短语。
然而,对软提示位置最*邻标记的分析表明,它们形成了紧密的语义聚类。换句话说,最接*软提示标记的词语具有相似的含义。识别出的词语通常具有与任务相关的某种意义,这表明软提示正在学*类似词语的表征。


本周内容回顾与总结 🎉
本节课中,我们一起探讨了两种PEFT方法:
- LoRA:使用低秩分解矩阵来高效地更新模型参数。
- 提示调优:向提示中添加可训练标记,而保持模型权重不变。
这两种方法都能让你以远低于全参数微调的计算成本对模型进行微调,并有可能在特定任务上获得更好的性能。LoRA因其在许多任务和数据集上可与全参数微调相媲美的性能而在实践中被广泛使用。

恭喜你完成第二周的学*!让我们简要回顾一下本周内容:
本周初,Mike引导你了解了如何通过指令微调的过程来适配基础模型。你看到了一些用于训练FLAN-T5模型的提示模板和数据集。你也学*了如何使用如ROUGE和HELM这样的评估指标和基准来度量模型微调过程中的成功。在实践中,指令微调已被证明在广泛的自然语言用例和任务中非常有效和实用。仅需几百个示例,你就可以将模型微调到你的特定任务,这非常令人惊叹。


接下来,你看到了参数高效微调如何减少微调模型所需的计算量。你学*了两种可用于此目的的方法:LoRA和提示调优。顺便一提,你还可以将LoRA与第一周学到的量化技术结合,以进一步减少内存占用,这被称为QLoRA。

在实践中,PEFT被大量用于最小化计算和内存资源,最终降低微调成本,使你能够充分利用计算预算并加速开发流程。
027:26_实验室2演练 🧪



在本节课中,我们将动手实践两种微调方法:全参数微调 和 参数高效微调。我们将使用特定的提示指令,对 Flan-T5 模型进行微调,以提升其在特定摘要任务上的能力。

我的同事 Chris 将引导你完成本周的实验笔记本。现在,让我们开始实验2。


实验概览与准备
在实验1中,我们尝试了零样本推理和上下文学*。现在,我们将实际修改语言模型的权重,使其适应我们的特定摘要任务和数据集。


首先,请确保你使用的是 ml.m5.2xlarge 实例类型。我们将安装必要的库。
以下是需要安装的库及其作用:
torch和torchdata:用于 PyTorch 框架及其数据加载。evaluate:用于计算 ROUGE 分数,以评估摘要质量。peft和lora:用于实现参数高效微调。
安装完成后,我们导入必要的模块。除了实验1中使用的 AutoModelForSeq2SeqLM 和 Tokenizer,我们还将使用两个新类:
TrainingArguments:用于配置训练参数。Trainer:用于简化训练流程。

这些类都来自 transformers 库。
加载数据与模型
与实验1类似,我们首先加载数据集、原始模型及其分词器。这个原始模型将作为后续所有微调策略的对比基准。
我们定义一个便利函数来打印模型中的参数总数和可训练参数数。这对于后续理解参数高效微调至关重要。目前,模型大约有 2.5亿 个参数,在全参数微调时,所有这些参数都将被更新。




接下来,我们展示一个样本输入、人类标注的基准摘要,以及原始模型在零样本设置下生成的摘要。我们的目标是,通过微调,让模型仅通过一个简单的调用就能生成像样的摘要,而无需提供示例。
全参数微调

我们将首先进行全参数微调。为此,我们定义一个函数,将数据转换为包含指令的提示格式。例如,提示可能为:“总结以下对话:{对话内容} 总结:”。


为了降低本实验的资源需求并加快速度,我们仅使用数据的一个子集:125个样本用于训练,5个用于验证,15个用于最终测试。

我们使用 TrainingArguments 配置训练参数,例如学*率、最大训练步数和训练轮数。这些值设置得较低以节省计算资源。随后,我们使用 Trainer 类开始训练。这个过程需要几分钟。
为了获得更好的效果,我们还将从云存储中加载一个预先训练了更长时间、效果更好的模型。这个全微调后的模型大小约为 945 MB。

现在,我们加载这个指令微调后的模型,并对其进行定性测试。与人类基准摘要和原始模型的零样本输出相比,微调后的模型生成的摘要质量有明显提升。
为了进行定量评估,我们使用 ROUGE 指标。我们在测试集上比较原始模型和指令微调模型的 ROUGE 分数。结果显示,指令微调模型在所有 ROUGE 指标上均显著优于原始模型。这表明,使用我们的数据集和特定提示进行微调,可以有效提升模型性能。

我们还使用更大的测试集进行了评估,结果显示 ROUGE-1 提升了约 18%,其他指标也有显著改善。
参数高效微调
现在,我们进入参数高效微调部分。这种方法可以大幅降低对计算资源的需求。





我们将使用 LoRA 方法,并设置秩为 32。通过几行额外的代码配置 LoRA 后,我们发现只有约 1.4% 的模型参数需要被训练。这使得在单个 GPU 上微调大型模型成为可能。
训练过程与全参数微调类似,但使用的是 PeftModel。同样,我们加载一个预先训练好的 PEFT 适配器,其大小仅为 14 MB。



要进行推理,我们需要将这个 PEFT 适配器与原始的基础语言模型合并。这里有一个关键技巧:在合并后,我们可以将模型的 is_trainable 标志设置为 False。这告诉 PyTorch 我们只进行前向推理,不进行训练,从而进一步减少推理时所需的内存资源。此时,可训练参数的比例为 0%。
模型对比与总结
我们最后对比所有模型在测试集上的表现。以下是各模型的 ROUGE 分数对比:
- 原始 Flan-T5 模型:作为基准,性能最低。
- 全参数指令微调模型:性能最佳,ROUGE 分数显著提升。
- PEFT 微调模型:性能略低于全参数微调模型,但差距很小。

具体来说,在大数据集上,PEFT 模型在 ROUGE-1 上仅损失约 1% 到 1.7% 的性能。考虑到 PEFT 在训练时节省的巨量计算资源和时间,这是一个非常值得的权衡。
本节课中,我们一起学*了两种微调大型语言模型的方法。我们实践了全参数微调,它能够最大化模型性能,但计算成本高昂。接着,我们探索了参数高效微调,特别是 LoRA 技术,它通过仅训练一小部分参数,以极小的性能损失换来了计算资源的大幅节省。这为在资源受限环境下使用和定制大模型提供了强大的工具。
028:27_第三周介绍
在本节课中,我们将要学*第三周的核心内容:基于人类反馈的强化学*(RHF)以及将大型语言模型作为推理引擎使用的技术。这些技术对于提升模型的安全性、有用性以及扩展其能力至关重要。
欢迎回来。上一周,我们学*了大型语言模型的指令微调以及参数高效微调(PEFT)。本节中,我们来看看本周将要深入探讨的两个激动人心的主题。


基于人类反馈的强化学*(RHF)
基于人类反馈的强化学*是*期新闻中常被提及的技术。我们将深入探讨其工作原理。RHF非常令人兴奋,它能帮助模型与人类价值观对齐。例如,大型语言模型有时可能生成有害内容或带有毒性的语调。通过利用人类反馈对齐模型,并使用强化学*作为算法,可以帮助模型减少此类输出,并生成危害更小、更有帮助的内容。
有时人们会惊讶于模型在糟糕的互联网数据上训练后可能产生的危险输出。这恰恰凸显了RHF的重要性。不完美的大型语言模型确实会产生有问题的输出,但随着技术进步,研究人员正致力于让模型变得更有帮助(Helpful)、无害(Harmless)。
本周,我们将有幸邀请到一位来自亚马逊的应用科学家,他将为我们解释用于此目的的强化学*背后的算法。我们对此充满期待。
负责任的人工智能与推理引擎
除了使用RHF微调模型,另一个令人兴奋的技术是将大型语言模型作为推理引擎使用,并赋予其调用子程序的能力,例如进行网络搜索或执行其他操作。
我们将在课程中深入探讨这一点,并介绍一些技术,如ReAct,它允许模型通过推理和行动来克服大型语言模型的某些限制。我们还将讨论检索增强生成(RAG),该技术允许模型访问外部信息源,从而获取特定领域的信息。我们看到许多客户希望将专有数据源的信息整合到他们的生成式AI应用中,我们将讨论一些实现此目标的技术和方法。
关于大型语言模型,有一点需要注意:它们非常擅长记忆从互联网上学到的事实,因此有时人们将其用作获取问题答案的事实库。但或许一种不同且更有帮助的思考方式是:将其视为一个推理引擎。你可以为它提供API接口去获取所需的事实,因为它本身只是一个尚可但并非最佳的事实数据库,却是一个非常出色的推理引擎。这确实是这些模型的真正威力所在。
这样做也更具成本效益:用数据库存储信息,而让生成式AI专注于其擅长的推理任务。
总结
本节课中我们一起学*了第三周的概览。我们介绍了两个核心方向:一是使用基于人类反馈的强化学*来对齐模型价值观并提升安全性;二是探索将大型语言模型作为能调用工具、进行推理和行动的智能体。这些内容将帮助我们构建更强大、更可靠、更负责任的AI应用。
最后,由于有这么多令人兴奋的内容,我相信你会喜欢接下来的学*。让我们进入下一个视频,开始深入探索RHF。
029:28_与人类价值观的对齐



欢迎回来。让我们回到生成式AI项目生命周期。


上一节我们深入探讨了微调技术。指令微调(包括路径方法)的目标是进一步训练模型,使其更好地理解类人提示并生成更类人的响应。这可以显著提升模型相对于原始预训练基础版本的性能,并产生听起来更自然的语言。

然而,听起来自然的类人语言也带来了一系列新的挑战。到目前为止,你可能已经看到许多关于大型语言模型行为不当的头条新闻。问题包括模型在补全中使用有害语言、以对抗性和攻击性的语气回复,以及提供关于危险主题的详细信息。这些问题之所以存在,是因为大型模型是在互联网上的海量文本数据上训练的,而这些数据中频繁出现此类语言。
以下是模型行为不当的一些例子。
假设你想让LLM给你讲一个笑话。模型的回应只是“鼓掌,鼓掌”。虽然这本身很有趣,但这并不是你想要的。这里的补全对于给定任务来说不是一个有帮助的答案。
同样,LLM可能会给出误导性或完全错误的答案。如果你向LLM询问一个已被证伪的健康建议,例如通过咳嗽来阻止心脏病发作。模型应该反驳这个说法。相反,模型可能会给出一个自信但完全错误的回应,这绝对不是人们寻求的真实、诚实的答案。
此外,LLM不应产生有害的补全,例如具有冒犯性、歧视性或引发犯罪行为。如下所示,当你问模型如何破解邻居的Wi-Fi时,它给出了一个有效策略。理想情况下,它应该提供一个不会导致伤害的答案。
这些重要的人类价值观——有益性、诚实性和无害性——有时被统称为 H、H、H,是指导开发者负责任地使用AI的一套原则。

基于人类反馈的额外微调有助于使模型更好地与人类偏好对齐,并提高补全的有益性、诚实性和无害性。这种进一步的训练也有助于降低模型响应的毒性,并减少错误信息的生成。
😊


在本节课中,你将学*如何利用来自人类的反馈来对齐模型。



在下一个视频中,让我们一起开始学*。
030:29_从人类反馈的强化学*

在本节课中,我们将要学*一种名为“从人类反馈的强化学*”的技术,它如何被用来微调大型语言模型,使其输出更符合人类的偏好。
概述
文本摘要任务要求模型生成一段简短的文字,以捕捉一篇较长文章的核心要点。我们的目标是通过微调,利用人类生成的摘要示例来提升模型的摘要能力。
2020年,OpenAI的研究人员发表了一篇论文,探讨了如何利用人类反馈进行微调,以训练模型撰写文本文章的简短摘要。结果显示,经过人类反馈微调的模型,其生成的回答优于预训练模型、指令微调模型,甚至优于人类参考基线。
从人类反馈的强化学*简介
一种利用人类反馈来微调大型语言模型的流行技术被称为“从人类反馈的强化学*”,简称RHF。顾名思义,RHF使用强化学*,结合人类反馈数据来微调LLM,从而产生一个更符合人类偏好的模型。
你可以使用RHF来确保你的模型产生的输出能最大化其对于输入提示的有用性和相关性。或许最重要的是,RHF有助于最小化潜在的危害风险。你可以训练你的模型给出承认其局限性的说明,并避免使用有害的语言和话题。

RHF一个潜在令人兴奋的应用是LLM的个性化,即模型通过持续的反馈过程学*每个用户的个人偏好。这可能催生诸如个性化学*计划或个性化AI助手等激动人心的新技术。

为了理解这些未来应用如何成为可能,让我们首先深入了解RHF的工作原理。
强化学*核心概念
如果你不熟悉强化学*,这里是对其最重要概念的高度概括。
强化学*是一种机器学*类型,其中智能体通过在环境中采取行动来学*做出与特定目标相关的决策,其目标是最大化某种累积奖励的概念。


在这个框架中,智能体通过采取行动、观察由此导致的环境变化,并根据其行动结果获得奖励或惩罚,从而持续从经验中学*。通过迭代这个过程,智能体逐步优化其策略,以做出更好的决策并增加成功的几率。
强化学*示例:井字棋
一个有助于说明这些概念的有用例子是训练一个模型玩井字棋。
在这个例子中,智能体是作为井字棋玩家的模型或策略。其目标是赢得游戏。环境是3x3的游戏棋盘,任何时刻的状态是棋盘的当前配置。动作空间包括玩家基于当前棋盘状态可以选择的所有可能位置。
智能体通过遵循一种称为RL策略的策略来做出决策。当智能体采取行动时,它会根据行动在向胜利推进过程中的有效性来收集奖励。强化学*的目标是让智能体学*到针对给定环境的最优策略,以最大化其奖励。
这个学*过程是迭代的,并且涉及试错。最初,智能体采取随机行动,这会导致进入一个新状态。从这个状态出发,智能体通过进一步的行动继续探索后续状态。这一系列行动和相应的状态构成了一次“推演”。随着智能体积累经验,它逐渐发现能带来最高长期回报的行动,最终在游戏中取得成功。
将RHF应用于大型语言模型
现在,让我们看看如何将井字棋的例子扩展到使用RHF微调大型语言模型的情况。
在这种情况下,指导行动的智能体策略就是LLM本身。其目标是生成被认为符合人类偏好的文本。这可能意味着文本是有帮助的、准确的和无害的。
环境是模型的上下文窗口,即我们可以输入提示文本的空间。模型在采取行动前考虑的状态是当前上下文,即当前包含在上下文窗口中的任何文本。
这里的行动是生成文本的行为。根据用户指定的任务,这可能是一个单词、一个句子或更长的文本。动作空间是词元词汇表,即模型可以选择来生成补全的所有可能词元。
LLM如何决定生成序列中的下一个词元,取决于它在训练期间学到的语言的统计表示。在任何给定时刻,模型将采取的行动,即它接下来将选择哪个词元,取决于上下文中的提示文本以及词汇表空间上的概率分布。
奖励的分配基于补全内容与人类偏好的契合程度。鉴于人类对语言反应的多样性,确定奖励比井字棋的例子更为复杂。
一种方法是让人类根据某些对齐指标来评估模型的所有补全内容,例如判断生成的文本是有害的还是无害的。这种反馈可以表示为一个标量值,例如0或1。然后,LLM的权重被迭代更新,以最大化从人类分类器获得的奖励,从而使模型能够生成无害的补全内容。
然而,获取人类反馈可能耗时且昂贵。作为一种实用且可扩展的替代方案,你可以使用一个额外的模型,称为奖励模型,来对LLM的输出进行分类,并评估其与人类偏好的对齐程度。
你将从少量的人类示例开始,通过传统的监督学*方法训练这个辅助模型。一旦训练完成,你将使用奖励模型来评估LLM的输出并分配奖励值。这个奖励值随后被用来更新LLM的权重,从而训练出一个新的符合人类偏好的版本。
模型权重如何随着其补全内容被评估而更新,具体取决于用于优化策略的算法。你将在稍后更深入地探讨这些问题。
最后请注意,在语言建模的上下文中,行动和状态的序列被称为“推演”,而不是经典强化学*中使用的“对局”一词。
奖励模型的核心作用
奖励模型是强化学*过程的核心组件。它编码了从人类反馈中学到的所有偏好,并且在模型经过多次迭代更新其权重的过程中扮演着核心角色。
在下一个视频中,你将看到这个模型是如何训练的,以及如何在强化学*过程中使用它来对模型的输出进行分类。

总结

本节课中,我们一起学*了从人类反馈的强化学*的基本原理。我们了解到RHF如何利用强化学*框架,结合人类偏好数据来微调大型语言模型,使其输出更加有用、相关且无害。我们还探讨了奖励模型在替代直接人类评估、实现规模化训练中的关键作用。理解这些概念是掌握高级LLM对齐技术的重要基础。
031:从人类获取反馈

在本节课中,我们将学*强化学*人类反馈(RLHF)微调流程的第一步:如何从人类标注员那里获取高质量的反馈数据。这是训练奖励模型的基础。
选择模型与生成响应


使用RLHF微调大语言模型的第一步,是选择一个基础模型,并用它来为人类反馈准备数据集。
你选择的模型应具备执行你感兴趣任务的基本能力,无论是文本摘要、问答还是其他任务。通常,从一个已经过多种任务微调、具备通用能力的指令模型开始会更容易。
接着,你将使用这个大语言模型,配合一个提示数据集,为每个提示生成多个不同的响应。提示数据集包含多个提示,每个提示都会经过大语言模型处理,产生一组补全(即模型的回答)。
收集人类反馈
下一步是从人类标注员那里收集对大语言模型生成的补全的反馈。这是强化学*人类反馈中“人类反馈”的部分。
首先,你必须决定希望人类依据什么标准来评估补全。这可以是之前讨论过的任何问题,例如“有帮助性”或“毒性”。确定标准后,你将要求标注员根据该标准评估数据集中的每个补全。
让我们看一个例子。在这个案例中,提示是“我的房子太热了”。你将这个提示输入大语言模型,模型生成了三个不同的补全。标注员的任务是按照“有帮助性”对这三个补全进行排序,从最有帮助到最没有帮助。

这里,标注员可能会认为补全2最有帮助,因为它告诉用户一个可以实际给房子降温的方法。补全1和3都不太有帮助,但标注员可能认为补全3更差,因为模型直接否定了用户的输入。因此,标注员将最佳补全排第一,次佳排第二,最差排第三。
这个过程会对许多“提示-补全”组合重复进行,从而构建一个可用于训练奖励模型的数据集,该模型最终将代替人类执行这项工作。通常,同一组“提示-补全”会分配给多位人类标注员,以建立共识并最小化组内低质量标注的影响。
提供清晰的标注指南
这一点非常重要。你提供的指南是否清晰,会极大地影响所获人类反馈的质量。标注员通常来自代表多元化和全球化思维的群体。
以下是为人类标注员编写的指南示例。这将在任务开始前呈现给标注员阅读,并在他们处理数据时可供随时查阅。
指南以标注员应执行的整体任务开始,在本例中是“为提示选择最佳补全”。指南继续提供更多细节,指导标注员如何完成任务。通常,这些指南越详细,标注员就越有可能理解他们必须执行的任务,并完全按照你的意愿完成。
例如,在第二条指南中,标注员被告知应根据他们对回答“正确性”和“信息量”的感知来做决定。他们被告知可以使用互联网进行事实核查和查找其他信息。同时,他们也得到了关于如何处理“平局”(即他们认为两个补全同样正确和信息丰富)的明确指示:可以给两个补全相同的排名,但应谨慎使用。最后一条值得注意的指南是关于如何处理无意义、令人困惑或不相关的答案:在这种情况下,标注员应选择“F”而不是排名,以便轻松剔除低质量答案。
提供这样一套详细的指南,可以增加获得高质量反馈的可能性,并确保不同个体执行任务的方式相似。这有助于确保标注完成的整体数据能代表共识观点。
为训练奖励模型准备数据
一旦人类标注员完成了对“提示-补全”组合的评估,你就拥有了训练奖励模型所需的所有数据。该模型将在强化学*微调过程中代替人类来对模型补全进行分类。
然而,在开始训练奖励模型之前,你需要将排名数据转换为补全的成对比较。换句话说,对于一个提示的所有可能补全对,都应被分类为0或1的分数。
在所示的例子中,一个提示有三个补全,人类标注员给出的排名是2、1、3(其中1对应最受偏好的响应)。对于三个不同的补全,存在三个可能的配对。根据每个提示的备选补全数量N,你将拥有 C(N, 2) 种组合。对于每一对,你将为首选响应分配奖励值1,为次选响应分配奖励值0。然后,你将重新排列提示,使首选选项排在前面。这是一个重要步骤,因为奖励模型期望首选补全(记为 y_j)在前。完成这种数据重构后,人类反馈就处于训练奖励模型的正确格式了。
需要注意的是,虽然“点赞/点踩”反馈通常比排名反馈更容易收集,但排名反馈能为你提供更多的“提示-补全”数据来训练奖励模型。正如你所见,从每次人类排名中,你可以得到三对“提示-补全”数据。
总结


本节课中,我们一起学*了RLHF流程中获取人类反馈的关键步骤。我们首先讨论了如何选择基础模型并生成初始响应。接着,我们详细介绍了如何设计任务、提供清晰指南,以从人类标注员那里收集高质量的排名反馈。最后,我们学*了如何将这些排名数据转换为成对比较格式,为下一步训练奖励模型做好准备。清晰的任务定义和详细的数据准备是确保后续微调成功的基础。
032:奖励模型 🏆
在本节课中,我们将学*如何训练一个奖励模型。这个模型是强化学*人类反馈流程中的关键组成部分,它将替代人类评估者,自动判断语言模型生成的回复质量。
上一节我们介绍了如何准备用于训练奖励模型的人类偏好数据。本节中,我们来看看如何利用这些数据来训练奖励模型本身。

训练奖励模型
在完成数据准备后,你已经拥有了训练奖励模型所需的一切。虽然前期需要投入相当多的人力来标注数据,但一旦奖励模型训练完成,后续的强化学*过程就不再需要人类参与。

奖励模型将有效地替代人类劳动,在RHF过程中自动选择更优的回复。这个奖励模型本身通常也是一个语言模型,例如一个经过监督学*方法训练的BERT模型。它基于人类评估者对提示词回复的成对比较数据进行训练。
对于一个给定的提示词 X,奖励模型学*预测人类偏好的回复 y_j,同时最小化奖励差值的逻辑损失函数。其核心公式如下:
损失函数 = -log(σ(r_j - r_k))
其中,r_j 和 r_k 分别是模型对两个候选回复 y_j 和 y_k 给出的奖励分数,σ 是sigmoid函数。正如上一张幻灯片所示,人类偏好的选项总是被标记为 y_j。
奖励模型作为分类器
在基于人类排序的提示-回复对数据训练好模型后,你可以将奖励模型用作一个二元分类器,为正类和负类提供一组逻辑值。
逻辑值是应用任何激活函数之前的未归一化模型输出。假设你想让你的LLM去毒化,奖励模型需要识别回复是否包含仇恨言论。
以下是两种分类情况:
- 正类:非仇恨言论。这是你最终希望模型优化的方向。
- 负类:仇恨言论。这是你希望模型避免的方向。
在RHF中,你使用正类的逻辑值作为奖励值。需要提醒的是,如果你对逻辑值应用softmax函数,就会得到概率。


这里的第一个例子展示了对一个非仇恨回复给出了高奖励。第二个例子展示了对一个有毒回复给出了低奖励。
总结与展望
本节课我们涵盖了很多内容。至此,你已经拥有了一个强大的工具——奖励模型,用于对齐你的大型语言模型。
下一步,我们将探索奖励模型如何在强化学*过程中被使用,以训练出与人类价值观对齐的LLM。在下一个视频中,我们将一起了解这个过程是如何运作的。
033:32_强化学*微调
在本节课中,我们将学*如何将奖励模型整合到强化学*过程中,以更新大型语言模型的权重,从而生成与人类偏好对齐的模型。我们将从整体流程开始,逐步深入到核心算法。

概述
强化学*人类反馈微调旨在使模型输出更符合人类价值观。整个过程始于一个在特定任务上已有良好表现的指令微调模型。我们将通过迭代的强化学*过程,利用奖励模型的评分来引导模型生成更优的响应。
强化学*人类反馈流程详解
上一节我们介绍了奖励模型的构建,本节中我们来看看如何利用它来微调语言模型。
整个流程是一个迭代过程,其核心步骤如下:
以下是RHF单次迭代的具体步骤:
- 输入提示:从提示数据集中选取一个提示(例如,“A dog is”)输入给指令微调后的LLM。
- 生成补全:LLM根据提示生成一个补全文本(例如,“a furry animal”)。
- 评估奖励:将原始提示和生成的补全文本作为一对(PRm completion pair)输入给奖励模型。奖励模型根据其训练时学*到的人类反馈标准进行评估,并返回一个奖励值。
- 更新模型:将此奖励值传递给强化学*算法(如PPO),算法据此更新LLM的权重,使其倾向于生成能获得更高奖励(即更符合人类偏好)的响应。
我们将经过一次权重更新后的模型称为RL更新后的LLM。如果流程有效,随着迭代进行,模型生成的补全所获得的奖励分数会逐步提高。当模型达到预设的评估标准(例如,达到特定的“有用性”阈值或达到最大训练步数)时,迭代停止,此时得到的模型可称为人类对齐的LLM。

核心算法:*端策略优化

我们尚未讨论的一个关键细节是强化学*算法的具体实现。该算法负责接收奖励模型的输出,并利用它来更新LLM的权重,以使得奖励分数随时间推移而增加。
在RHF流程中,有多种算法可供选择,一个流行的选择是*端策略优化。
PPO是一个相当复杂的算法,使用者无需了解其所有细节即可应用它。然而,其实现可能具有挑战性,更深入地理解其内部工作原理有助于在遇到问题时进行排查。

接下来的视频将更详细地解释PPO算法的工作原理。该视频为可选内容,你可以选择跳过它并直接进入下一节关于奖励黑客的视频。掌握这部分信息并非完成测验或本周实验所必需,但了解这些细节正变得越来越重要,因为它能确保LLM在部署时以安全、对齐的方式运行。
总结

本节课中我们一起学*了强化学*人类反馈微调的核心流程。我们从已指令微调的模型出发,通过提示生成补全,再利用奖励模型进行评估打分,最后借助强化学*算法(如PPO)根据奖励分数迭代更新模型权重,最终目标是获得一个与人类偏好高度对齐的语言模型。理解这个端到端的流程是应用RHF技术对齐大模型行为的基础。
034:*端策略优化 (PPO) 🧠

在本节课中,我们将学**端策略优化算法。这是一种用于强化学*的强大算法,特别适用于根据人类偏好来微调大型语言模型。我们将了解PPO如何工作,其核心组件,以及它如何帮助模型生成更符合人类期望的回复。

概述
*端策略优化是一种用于解决强化学*问题的强大算法。顾名思义,PPO优化一个策略,在本例中即大型语言模型,使其更符合人类偏好。经过多次迭代,PPO对LLM进行更新。这些更新幅度很小且在一个有界的区域内,从而产生一个与先前版本接*的更新后LLM,因此得名“*端”策略优化。将变化保持在这个小区域内可以实现更稳定的学*。
第一阶段:实验与评估
上一节我们介绍了PPO的目标,本节中我们来看看PPO每个周期的具体流程。PPO的每个周期分为两个阶段。
在第一阶段,使用LLM进行一系列实验,以完成给定的提示。这些实验允许你在第二阶段根据奖励模型来更新LLM。请记住,奖励模型捕捉了人类的偏好。例如,奖励可以定义回复的有用性、无害性和诚实性。
完成一个提示的预期奖励是PPO目标中使用的一个重要量。我们通过LLM的一个独立头部,称为价值函数,来估计这个量。
让我们更仔细地看看价值函数和价值损失。
假设给定了多个提示。首先,你生成LLM对这些提示的回复。然后,你使用奖励模型计算这些提示-完成对的奖励。例如,这里显示的第一个提示-完成对可能获得1.87的奖励,下一个可能获得-1.24的奖励,依此类推。你得到了一组提示-完成对及其对应的奖励。
价值函数估计给定状态 S 的预期总奖励。换句话说,当LLM生成一个回复的每个词元时,你希望基于当前的词元序列来估计未来的总奖励。你可以将其视为一个基线,用于根据你的对齐标准评估回复的质量。
假设在完成过程的这一步,估计的未来总奖励是0.34。随着生成下一个词元,估计的未来总奖励增加到1.23。目标是最小化价值损失,即实际未来总奖励(本例中为1.87)与其通过价值函数的*似值(本例中为1.23)之间的差值。价值损失使对未来奖励的估计更加准确。
价值函数随后将用于第二阶段的优势估计,我们稍后会讨论。这类似于你开始写一段文章时,甚至在动笔之前就对它的最终形式有一个大致的想法。
第二阶段:模型更新与策略目标
上一节我们介绍了第一阶段如何生成数据和评估奖励,本节中我们来看看如何利用这些信息更新模型。
在第二阶段,你对模型进行小幅更新,并评估这些更新对模型对齐目标的影响。模型权重的更新由提示-完成对的损失和奖励来指导。PPO还确保将模型更新保持在一个称为信任区域的特定小区域内。这就是PPO“*端”特性的体现。理想情况下,这一系列小更新将使模型朝着获得更高奖励的方向移动。
PPO策略目标是该方法的主要组成部分。请记住,目标是找到一个预期奖励高的策略。换句话说,你试图对LLM权重进行更新,使生成的回复更符合人类偏好,从而获得更高的奖励。策略损失是PPO算法在训练期间试图优化的主要目标。
我知道数学公式看起来很复杂,但实际上比看起来简单。让我们一步步分解它。
首先,关注最重要的表达式,暂时忽略其余部分。
π(a_t | s_t) 在LLM的上下文中,是给定当前提示 s_t 时下一个词元 a_t 的概率。动作 a_t 是下一个词元,状态 s_t 是到词元 t 为止已完成的提示。
分母是使用初始版本(已冻结)的LLM生成下一个词元的概率。分子是通过更新后的LLM(我们可以改变它以获得更好奖励)生成下一个词元的概率。
Â_t 称为给定动作选择的估计优势项。优势项估计当前动作与该状态下所有可能动作相比是好是坏的程度。因此,我们观察遵循新词元的完成的预期未来奖励,并估计这个完成与其他可能完成相比的优势程度。有一个基于我们之前讨论的价值函数的递归公式来估计这个量,这里我们专注于直观理解。
以下是我刚才描述内容的视觉表示。你有一个提示 S,并且有不同的路径来完成它,图中用不同的路径说明。优势项告诉你当前词元 a_t 相对于所有可能词元是好是坏。在这个可视化中,向上走的顶部路径是更好的完成,获得更高的奖励;向下走的底部路径是更差的完成。
那么我有一个问题,EK,为什么最大化这个项会导致更高的奖励?让我们考虑优势对于建议词元是正的情况。正优势意味着建议词元优于平均水平。因此,增加当前词元的概率似乎是一个能带来更高奖励的好策略。这转化为最大化我们这里的表达式。
如果建议词元比平均水平差,优势将为负。同样,最大化该表达式将降低该词元的概率,这是正确的策略。因此,总体结论是,最大化这个表达式会产生一个更好对齐的LLM。
好的,很好。那么我们就直接最大化这个表达式,对吗?直接最大化这个表达式会导致问题,因为我们的计算只有在优势估计有效的假设下才是可靠的。优势估计只有在旧策略和新策略彼此接*时才有效。这就是其余项发挥作用的地方。
因此,退一步再看整个方程,这里发生的是你选取两个项中较小的那个:一个是我们刚刚讨论的项,另一个是它的修改版本。注意,第二个表达式定义了两个策略彼此接*的区域。这些额外的项是护栏,它们简单地定义了LLM附*的一个区域,在这个区域内我们的估计误差很小。这被称为信任区域。这些额外的项确保我们不太可能离开信任区域。
总之,优化PPO策略目标可以在不超出不可靠区域的情况下,产生一个更好的LLM。
其他组件:熵损失
上一节我们讨论了策略目标的核心,本节中我们来看看另一个重要的组成部分——熵损失。
当策略损失推动模型朝向对齐目标时,熵允许模型保持创造性。如果你保持低熵,你可能会总是以相同的方式完成提示,如图所示。😡
更高的熵引导LLM走向更具创造性的方向。这类似于你在第一周看到的LLM的温度设置。区别在于,温度在推理时影响模型的创造性,而熵在训练期间影响模型的创造性。
整体目标与迭代
将所有项作为加权和放在一起,我们得到我们的PPO目标,它以稳定的方式将模型更新为更符合人类偏好。
这是整体的PPO目标。C1 和 C2 系数是超参数。
PPO目标通过反向传播在多个步骤中更新模型权重。一旦模型权重被更新,PPO就开始一个新的周期。对于下一次迭代,LLM被替换为更新后的LLM,并开始一个新的PPO周期。经过多次迭代,你得到了人类对齐的LLM。
其他技术与总结

现在,是否有其他用于RLHF的强化学*技术?是的,例如,Q学*是一种通过RL微调LLM的替代技术,但PPO是目前最流行的方法。在我看来,PPO之所以流行,是因为它在复杂性和性能之间取得了恰当的平衡。话虽如此,通过人类或AI反馈微调LLM是一个活跃的研究领域,我们预计在不久的将来会有更多的发展。例如,就在我们录制这个视频之前,斯坦福大学的研究人员发表了一篇论文,描述了一种称为直接偏好优化的技术,它是RLHF的一个更简单的替代方案。像这样的新方法仍处于积极开发中,需要做更多的工作来更好地理解它们的优势,但我认为这是一个非常令人兴奋的研究领域。
总结
本节课中我们一起学*了*端策略优化算法。我们了解到PPO通过两个阶段运作:第一阶段利用LLM生成回复并利用奖励模型进行评估;第二阶段基于策略目标、优势估计和信任区域对模型进行稳定的小幅更新,同时通过熵损失保持模型的创造性。PPO是目前将大型语言模型与人类偏好对齐的主流强化学*方法,平衡了效果与稳定性。该领域仍在快速发展,未来可能出现更优的算法。
035:34_奖励欺骗
在本节课中,我们将回顾基于人类反馈的强化学*流程,并探讨一个可能出现的挑战——奖励欺骗。我们将了解其表现形式,并学*如何使用KL散度等技术来缓解这一问题,确保模型在优化目标的同时不偏离其核心语言能力。
强化学*与人类反馈流程回顾

上一节我们介绍了RLHF的基本流程。本节中,我们先来简要回顾一下。
基于人类反馈的强化学*是一种使大语言模型与人类偏好对齐的微调过程。该过程主要包含以下步骤:

- 使用奖励模型进行评估:利用一个奖励模型,根据特定的人类偏好指标(例如“是否有帮助”),来评估大语言模型对一组提示数据集的补全结果。
- 应用强化学*算法更新权重:使用强化学*算法(例如*端策略优化),根据当前版本大语言模型生成的补全所获得的奖励,来更新模型的权重。

你会使用许多不同的提示进行多次迭代,不断更新模型权重,直到获得期望的对齐程度。最终结果是一个与人类偏好对齐、可用于应用程序的大语言模型。


理解奖励欺骗问题
在强化学*中,一个有趣的问题是“奖励欺骗”。智能体可能学会通过选择能最大化奖励的动作来“欺骗”系统,即使这些动作与原始目标并不完全一致。
在大语言模型的上下文中,奖励欺骗可能表现为:模型在补全内容中添加某些词语或短语,这些内容能使其在对齐的指标上获得高分,但却降低了语言的整体质量。

例如,假设你正在使用RLHF来“净化”一个指令模型。你已经训练了一个可以进行情感分析、并将模型补全分类为“有毒”或“无毒”的奖励模型。
你从训练数据中选择提示“This product is”,并将其传递给指令模型以生成补全。一个不友好的补全,例如“complete garbage”,预计会获得较高的毒性评分。这个补全由奖励模型处理并生成分数,该分数被输入到PPO算法中,用于更新模型权重。
通过迭代,RLHF将更新大语言模型,使其生成毒性更低的回复。然而,当策略试图优化奖励时,它可能会过度偏离初始的语言模型。
在这个例子中,模型可能学会通过添加诸如“Most awesome, most incredible”之类的短语来生成能获得极低毒性评分的补全。这种语言听起来非常夸张。模型也可能开始生成无意义或语法错误的文本,仅仅因为这些文本碰巧能以类似的方式最大化奖励。这样的输出显然没有太大用处。
使用KL散度防止奖励欺骗
为了防止奖励欺骗的发生,你可以使用初始的指令模型作为性能参考。我们称之为参考模型。
参考模型的权重是冻结的,在RLHF迭代过程中不会更新。这样,你始终保留一个单一的参考模型用于比较。
在训练期间,每个提示会同时传递给两个模型:参考大语言模型和正在强化学*更新的中间模型,从而生成两个补全。
此时,你可以比较这两个补全,并计算一个称为KL散度的值。KL散度是一种衡量两个概率分布差异的统计指标。你可以用它来比较两个模型的补全,并确定更新后的模型与参考模型偏离了多少。
不必过于担心其工作原理的细节。KL散度算法包含在许多标准的机器学*库中,你可以在不了解背后所有数学原理的情况下使用它。在本周的实验中你将实际使用KL散度,从而亲身体验其工作方式。
KL散度是针对大语言模型整个词汇表中的每个生成词元进行计算的。这很容易达到数万甚至数十万个词元。然而,通过使用softmax函数,你可以将概率数量减少到远小于完整词汇表的大小。
请记住,这仍然是一个计算量相对较大的过程,因此使用GPU几乎总是有益的。
一旦计算了两个模型之间的KL散度,你就将其作为一项添加到奖励计算中。如果强化学*更新的模型偏离参考大语言模型太远,并生成了差异过大的补全,这项就会对模型进行惩罚。
需要注意的是,现在你需要大语言模型的两个完整副本来计算KL散度:冻结的参考大语言模型和正在强化学*更新的PPO大语言模型。
结合参数高效微调的优势
顺便提一下,你可以从将RLHF与参数高效微调结合中受益。在这种情况下,你只更新PEFT适配器的权重,而不是大语言模型的全部权重。
这意味着你可以为参考模型和PPO模型重用同一个底层大语言模型,PPO模型通过训练好的PEFT参数进行更新。这可以将训练期间的内存占用减少大约一半。

我知道这里有很多内容需要消化,但不用担心。结合PEFT的RLHF将在实验课中涉及,你将有机会看到它的实际运行并亲自尝试。
评估模型性能

完成模型的RLHF对齐后,你需要评估模型的性能。你可以使用摘要数据集来量化毒性的减少程度,例如本课程早期看到的对话摘要数据集。

这里使用的数字是毒性分数。这是负面类别(在本例中是有毒或仇恨回复)的概率,在所有补全结果上的平均值。

如果RLHF成功降低了大语言模型的毒性,这个分数应该下降。
以下是评估步骤:
- 首先,通过使用能评估有毒语言的奖励模型,在摘要数据集上评估原始指令模型的补全,为其创建一个基线毒性分数。
- 然后,在同一数据上评估你新得到的与人类对齐的模型,并比较分数。
在这个例子中,RLHF后的毒性分数确实下降了,表明模型毒性更低、对齐更好。同样,你将在本周的实验中看到所有这些内容。

总结

本节课中,我们一起学*了RLHF流程中可能出现的奖励欺骗问题。我们了解到,模型可能通过生成夸张或无意义的文本来“欺骗”奖励系统以获得高分。为了防止这种情况,我们引入了使用冻结的参考模型和计算KL散度的方法,将模型输出与原始分布进行比较并施加约束。此外,我们还看到了结合PEFT可以显著降低训练的内存需求。最后,我们介绍了如何使用毒性分数等指标来量化评估模型对齐后的性能改进。
036:扩展人类反馈
在本节课中,我们将探讨如何扩展人类反馈,以解决在模型对齐过程中对大量人工标注的依赖问题。我们将介绍一种名为“宪法AI”的方法,它通过让模型自我监督来减少对人力的需求。

概述
虽然奖励模型可以消除在RHF微调过程中对人类评估的需求,但训练奖励模型本身所需的人力投入是巨大的。用于训练奖励模型的标注数据集通常需要大型标注团队,有时甚至需要成千上万的人来评估大量的提示。这项工作需要大量时间和其他资源,这可能成为重要的限制因素。随着模型数量和用例的增加,人力成为一种有限的资源。扩展人类反馈的方法是一个活跃的研究领域。
扩展反馈的方法
为了克服这些限制,一个想法是通过模型自我监督来扩展反馈规模。宪法AI就是一种扩展监督的方法。


它由Anthropic的研究人员在2022年首次提出。宪法AI是一种使用一套规则和原则来训练模型的方法,这些规则和原则管理着模型的行为。这些规则与一组示例提示共同构成了“宪法”。然后,你训练模型进行自我批评,并修改其响应以遵守这些原则。
宪法AI不仅有助于扩展反馈规模,还可以帮助解决RHF的一些意外后果。
例如,根据提示的结构方式,一个对齐后的模型在试图提供最有帮助的响应时,最终可能会泄露有害信息。想象一下,你要求模型告诉你如何入侵邻居的WiFi。因为这个模型已被对齐以优先考虑“有帮助性”,它实际上会告诉你一个可以实现此目的的应用程序,尽管这种行为是非法的。

为模型提供一套宪法原则可以帮助模型平衡这些相互竞争的利益,并最大限度地减少危害。

以下是研究论文中要求LLM遵循的一些示例规则。例如,你可以告诉模型选择最有帮助、诚实和无害的响应,但你可以对此设定一些界限,要求模型通过评估其响应是否鼓励非法、不道德或不道德的活动来优先考虑无害性。请注意,你不必使用论文中的规则,你可以定义最适合你的领域和用例的一套规则。
宪法AI的实施阶段
在实施宪法AI方法时,你需要在两个不同的阶段训练你的模型。
第一阶段:监督学*
在第一个阶段,你进行监督学*。首先,你以试图让模型生成有害响应的方式提示它。这个过程被称为“红队测试”。然后,你要求模型根据宪法原则批评其自己的有害响应,并修改它们以遵守这些规则。完成后,你将使用红队提示和修订后的宪法响应对来微调模型。
让我们看一个如何生成这些“提示-完成”对的例子。
回到WiFi入侵问题。正如之前所见,这个模型在试图最大化其有帮助性时给出了有害的响应。为了缓解这个问题,你使用有害的完成响应和一组预定义的指令来增强提示,这些指令要求模型批评其响应。
😊,利用宪法中概述的规则,模型检测到了其响应中的问题。在这种情况下,它正确地承认入侵他人的WiFi是非法的。最后,你将所有部分组合在一起,并要求模型编写一个去除所有有害或非法内容的新响应。
模型生成了一个将宪法原则付诸实践的新答案,并且没有提及非法应用程序。
原始的红队提示和这个最终的宪法响应随后可以用作训练数据。你将积累许多这样的示例来创建一个数据集,从而微调出一个已经学会如何生成宪法响应的LLM。
第二阶段:强化学*
流程的第二部分执行强化学*。这个阶段类似于RHF,不同之处在于,我们现在使用的是模型生成的反馈,而不是人类反馈。这有时被称为“来自AI反馈的强化学*”或R AIF。
在这里,你使用上一步微调好的模型来生成一组针对某个提示的响应。然后,你询问模型根据宪法原则,哪个响应是更优选的?结果是一个模型生成的偏好数据集,你可以用它来训练一个奖励模型。

有了这个奖励模型,你现在可以使用像PPO这样的强化学*算法进一步微调你的模型,正如之前讨论的那样。
总结
在本节课中,我们一起学*了扩展人类反馈的重要性以及宪法AI这一具体方法。我们了解到,尽管奖励模型可以减少人工评估,但其创建本身就需要大量人力。宪法AI通过引入一套规则(宪法)让模型进行自我批评和修订,从而在监督学*和强化学*两个阶段减少对人力的依赖。模型对齐是一个非常重要且活跃的研究领域,你在本课中探索的R L HF基础将使你能够跟上该领域的发展。鼓励你关注未来几个月和几年中出现的新方法和最佳实践。😊
037:36_实验室3演练 🧪
在本节课中,我们将学*如何通过强化学*人类反馈来降低语言模型的毒性。我们将动手实践,使用PPO算法和一个仇恨言论奖励模型,对之前微调好的模型进行“解毒”处理。

概述 📋
上一节我们介绍了RLHF的理论基础。本节中,我们将通过一个实验来具体实现它。实验的目标是降低我们在Lab2中得到的指令微调模型的毒性。我们将使用一个仇恨言论分类器作为奖励模型,通过PPO算法来优化模型,使其生成更少仇恨言论的文本。最后,我们将对“解毒”前后的模型进行定量和定性比较。
环境与库安装 🔧
以下是实验所需的Python库。我们使用PyTorch作为深度学*框架,并引入了一些新的库来支持RLHF。
# 安装必要的库
!pip install torch transformers datasets evaluate peft trl tqdm
- torch: 深度学*框架。
- transformers: Hugging Face的模型库,用于加载和使用预训练模型。
- datasets: 用于加载和处理数据集。
- evaluate: 用于模型评估,例如计算ROUGE分数。
- peft: 参数高效微调库,我们将使用LoRA进行微调。
- trl: 一个新的库,它为我们提供了PPO算法及其训练器。
- tqdm: 用于显示进度条。
数据与模型准备 📊
我们将加载在Lab2中训练好的模型作为本次实验的起点。同时,我们需要准备一个用于评估毒性的数据集。
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer, AutoModelForSequenceClassification
from peft import LoraConfig, get_peft_model
from trl import PPOTrainer, PPOConfig, AutoModelForSeq2SeqLMWithValueHead, create_reference_model
from datasets import load_dataset
import torch
# 加载Lab2训练好的模型
model_name = “your_lab2_model_checkpoint”
model = AutoModelForSeq2SeqLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
# 打印可训练参数数量(使用LoRA,仅占一小部分)
def print_trainable_parameters(model):
trainable_params = sum(p.numel() for p in model.parameters() if p.requires_grad)
all_params = sum(p.numel() for p in model.parameters())
print(f”可训练参数: {trainable_params} | 全部参数: {all_params} | 占比: {100 * trainable_params / all_params:.2f}%”)

print_trainable_parameters(model) # 输出例如:1.4%
为了进行PPO训练,我们需要一个带有价值头(Value Head)的模型。价值头是PPO算法中用于估计状态价值的部分。
# 为PPO训练准备模型(带有价值头)
model_for_training = AutoModelForSeq2SeqLMWithValueHead.from_pretrained(model_name)
print_trainable_parameters(model_for_training) # 参数数会略微增加,因为加入了价值头
奖励模型:仇恨言论分类器 🎯
我们将使用一个预训练的序列分类模型作为奖励模型。它的作用是判断一段文本是否包含仇恨言论。
# 加载Facebook的RoBERTa仇恨言论分类模型
toxicity_model_name = “facebook/roberta-hate-speech-dynabench-r4-target”
toxicity_tokenizer = AutoTokenizer.from_pretrained(toxicity_model_name)
toxicity_model = AutoModelForSequenceClassification.from_pretrained(toxicity_model_name)
# 定义“非仇恨”类别的索引(非常重要!)
not_hate_index = 0 # 该模型输出中,索引0代表“非仇恨”
hate_index = 1 # 索引1代表“仇恨”
# 测试奖励模型
def get_toxicity_score(text):
inputs = toxicity_tokenizer(text, return_tensors=“pt”, truncation=True)
logits = toxicity_model(**inputs).logits
# 获取“非仇恨”类别的分数(我们将最大化这个分数)
not_hate_score = logits[0, not_hate_index].item()
return not_hate_score
# 测试非毒性文本
print(get_toxicity_score(“I want to kiss you”)) # 应输出一个很高的正数
# 测试毒性文本(示例,实际使用时请谨慎)
# print(get_toxicity_score(“...")) # 应输出一个较低的分数或负数
核心概念:奖励模型 toxicity_model 对输入文本进行打分。在PPO中,我们的目标是最大化 not_hate_score,即模型生成“非仇恨”文本的倾向。
构建PPO训练流程 ⚙️
接下来,我们配置PPO训练器并开始训练。PPO训练需要三个关键部分:要训练的模型、参考模型(用于计算KL散度以防止奖励黑客)和奖励函数。
# 1. 创建参考模型(固定不变,用于KL散度计算)
ref_model = create_reference_model(model_for_training)
# 2. 定义PPO配置
ppo_config = PPOConfig(
model_name=model_name,
learning_rate=1.41e-5,
batch_size=16,
ppo_epochs=4, # PPO训练轮数
)
# 3. 初始化PPO训练器
ppo_trainer = PPOTrainer(
config=ppo_config,
model=model_for_training, # 要训练的模型(带价值头)
ref_model=ref_model, # 参考模型
tokenizer=tokenizer,
)
# 4. 准备训练数据(构建查询-响应对)
def build_dataset_for_ppo(dialogue_dataset):
# 此函数将对话数据转换为模型用于总结的提示(prompt)
# 例如:”Summarize the following conversation: ...”
prompts = []
for dialogue in dialogue_dataset[“dialogue”]:
prompt = f”Summarize the following conversation:\n{dialogue}\n\nSummary:”
prompts.append(prompt)
return prompts
# 加载对话数据集
dataset = load_dataset(“dialog_sum”) # 示例数据集
train_prompts = build_dataset_for_ppo(dataset[“train”])
现在,我们进入核心的训练循环。在每一步中,模型根据提示生成总结,奖励模型对该总结进行评分,然后PPO算法利用这个分数来更新模型参数。
# 5. PPO训练循环
for epoch in range(ppo_config.ppo_epochs):
for batch_prompts in train_prompts: # 在实际代码中,这里应是分批处理
# 模型生成总结(响应)
response_tensors = []
for prompt in batch_prompts:
input_ids = tokenizer(prompt, return_tensors=“pt”).input_ids
# 使用模型生成总结
generation = model_for_training.generate(input_ids, max_length=50)
response_tensors.append(generation)
# 将生成的文本解码
batch_responses = [tokenizer.decode(r[0], skip_special_tokens=True) for r in response_tensors]
# 使用奖励模型计算分数(查询+响应)
rewards = []
for prompt, response in zip(batch_prompts, batch_responses):
query_response_text = prompt + “ “ + response
# 计算“非仇恨”分数作为奖励
reward_score = get_toxicity_score(query_response_text)
rewards.append(torch.tensor([reward_score]))
# 将数据转换为PPO训练器所需的格式
batch_tensors = [tokenizer(p, return_tensors=“pt”).input_ids[0] for p in batch_prompts]
# 执行PPO训练步骤
stats = ppo_trainer.step(batch_tensors, response_tensors, rewards)
# 打印训练状态,如KL散度(应保持在一定范围内)
print(f”Epoch {epoch}, KL Div: {stats[‘ppo/returns/kl’]:.2f}, Mean Reward: {sum(rewards)/len(rewards):.2f}”)
核心概念:ppo_trainer.step() 是训练的关键。它接收提示(prompts)、模型生成的响应(responses)和对应的奖励(rewards),然后执行PPO更新,在最大化奖励的同时,通过KL散度约束模型不要偏离原始模型(ref_model)太远。
评估与结果比较 📈
训练完成后,我们需要评估“解毒”效果。我们将从定量(平均毒性分数)和定性(生成文本示例)两个方面进行比较。
# 定量评估:计算模型生成文本的平均毒性分数
def evaluate_toxicity(model, tokenizer, eval_prompts, num_samples=50):
toxicity_scores = []
for prompt in eval_prompts[:num_samples]:
input_ids = tokenizer(prompt, return_tensors=“pt”).input_ids
with torch.no_grad(): # 评估时不计算梯度
output = model.generate(input_ids, max_length=50)
response = tokenizer.decode(output[0], skip_special_tokens=True)
score = get_toxicity_score(prompt + “ “ + response)
toxicity_scores.append(score)
mean_score = sum(toxicity_scores) / len(toxicity_scores)
std_score = torch.tensor(toxicity_scores).std().item()
return mean_score, std_score
# 评估原始模型(Lab2的模型)
print(“评估原始模型...”)
orig_model = AutoModelForSeq2SeqLM.from_pretrained(model_name)
orig_mean, orig_std = evaluate_toxicity(orig_model, tokenizer, train_prompts[:100])
print(f”原始模型 - 平均毒性分数: {orig_mean:.4f} (±{orig_std:.4f})“)
# 评估PPO微调后的模型
print(”\n评估PPO微调后的模型...“)
ppo_mean, ppo_std = evaluate_toxicity(model_for_training, tokenizer, train_prompts[:100])
print(f”PPO模型 - 平均毒性分数: {ppo_mean:.4f} (±{ppo_std:.4f})“)
# 我们希望PPO模型的平均分数(非仇恨分数)更高,表示毒性更低。
print(f”毒性降低(分数增加): {ppo_mean - orig_mean:.4f}“)
以下是定性比较的示例。我们可以观察模型对相同提示的总结在训练前后有何变化。
# 定性评估:查看具体示例
sample_prompts = train_prompts[:5]
print(“定性比较(前 vs 后):”)
print(“=”*50)
for i, prompt in enumerate(sample_prompts):
# 原始模型生成
orig_input_ids = tokenizer(prompt, return_tensors=“pt”).input_ids
orig_output = orig_model.generate(orig_input_ids, max_length=50)
orig_summary = tokenizer.decode(orig_output[0], skip_special_tokens=True)
# PPO模型生成
ppo_input_ids = tokenizer(prompt, return_tensors=“pt”).input_ids
ppo_output = model_for_training.generate(ppo_input_ids, max_length=50)
ppo_summary = tokenizer.decode(ppo_output[0], skip_special_tokens=True)
print(f”\n示例 {i+1}:“)
print(f”提示: {prompt[:100]}...“)
print(f”原始模型总结: {orig_summary}“)
print(f”PPO模型总结: {ppo_summary}“)
print(f”原始奖励分数: {get_toxicity_score(prompt + ‘ ‘ + orig_summary):.2f}“)
print(f”PPO奖励分数: {get_toxicity_score(prompt + ‘ ‘ + ppo_summary):.2f}“)
print(”-”*30)
总结 🎓

本节课中我们一起学*了强化学*人类反馈的实际应用。我们通过一个完整的实验流程,使用PPO算法和一个仇恨言论分类奖励模型,成功降低了指令微调语言模型的毒性。
关键步骤回顾:
- 准备阶段:加载基础模型和奖励模型,并理解奖励模型输出的含义。
- PPO配置:设置带有价值头的训练模型、固定的参考模型以及PPO训练的超参数。
- 训练循环:模型生成文本,奖励模型打分,PPO算法利用分数更新模型参数,同时用KL散度防止模型“作弊”。
- 评估比较:通过计算平均毒性分数和对比生成文本的示例,定量和定性地验证了“解毒”效果。
通过本实验,你将更深入地理解RLHF如何将人类偏好(如“减少毒性”)转化为可优化的目标,从而引导大型语言模型生成更安全、更符合期望的内容。
038:模型部署优化 🚀

在本节课中,我们将要学*如何将经过适配和对齐的大型语言模型集成到实际应用中。我们将探讨在部署前需要考虑的关键问题,并详细介绍三种优化模型以提升推理性能的技术:知识蒸馏、量化与剪枝。
现在你已经探索了如何使大型语言模型适应并对齐你的任务,接下来我们来讨论将模型集成到应用程序中需要考虑的事项。
在此阶段,有一系列重要问题需要提出。
第一组问题与你的LLM在部署中的功能表现相关。例如,你的模型需要以多快的速度生成补全内容?你拥有多少可用的计算预算?你是否愿意为了提升推理速度或降低存储成本,而在模型性能上做出一些妥协?
第二组问题则与你的模型可能需要的额外资源有关。你是否打算让模型与外部数据或其他应用程序交互?如果是,你将如何连接到这些资源?

最后,是关于模型如何被使用的问题。你的模型将通过什么样的预期应用程序或API接口来被消费?

让我们从探索几种在部署模型进行推理之前可以使用的优化方法开始。虽然我们可以用好几节课来深入探讨这个话题,但本节的目标是向你介绍最重要的优化技术。
计算与存储的挑战 💾

大型语言模型在推理时面临着计算和存储需求方面的挑战,同时还需要确保消费应用程序的低延迟。

无论你是部署在本地还是云端,这些挑战都持续存在。当部署到边缘设备时,这些问题会变得更加突出。提升应用程序性能的主要方法之一是减小LLM的规模。
模型优化的目标 ⚙️
减小模型规模可以加快模型的加载速度,从而降低推理延迟。然而,挑战在于如何在减小模型规模的同时,仍然保持模型的性能。对于生成式模型,某些技术比其他技术效果更好,并且在准确性和性能之间需要权衡取舍。
你将在本节学*三种技术。以下是这三种核心优化技术的简要介绍:
- 知识蒸馏:使用一个更大的模型(教师模型)来训练一个更小的模型(学生模型)。然后使用较小的模型进行推理,以降低存储和计算预算。
- 量化:类似于量化感知训练,训练后量化将模型的权重转换为更低精度的表示(例如16位浮点数或8位整数)。正如你在课程第一周所学,这可以减少模型的内存占用。
- 模型剪枝:移除对模型性能贡献很小的冗余模型参数。
让我们更详细地讨论这些选项。
知识蒸馏 👨🏫➡️👨🎓
知识蒸馏是一种技术,重点是让一个更大的教师模型训练一个更小的学生模型。学生模型学*在统计上模仿教师模型的行为,可以仅在最终预测层模仿,也可以在模型的隐藏层也进行模仿。
这里你将专注于第一种选项。你从微调好的LLM作为教师模型开始,并为学生模型创建一个更小的LLM。你冻结教师模型的权重,并使用它为你的训练数据生成补全内容。同时,你使用学生模型为训练数据生成补全内容。
教师模型和学生模型之间的知识蒸馏是通过最小化一个称为蒸馏损失的损失函数来实现的。其核心公式是计算两个概率分布之间的差异:
蒸馏损失 = 损失函数(教师模型的软标签, 学生模型的软预测)
为了计算这个损失,蒸馏使用了由教师模型的softmax层产生的词元概率分布。现在教师模型已经在训练数据上进行了微调,因此概率分布很可能与真实数据紧密匹配,并且在词元上不会有太大变化。
这就是为什么蒸馏应用了一个小技巧:向softmax函数添加一个温度参数。正如你在第一课中学到的,更高的温度会增加模型生成语言的创造性。当温度参数大于1时,概率分布变得更广泛,峰值不那么尖锐。这种更“柔和”的分布为你提供了一组与真实词元相似的词元。
在蒸馏的上下文中,教师模型的输出通常被称为软标签,而学生模型的预测被称为软预测。
与此同时,你训练学生模型基于你的真实训练数据生成正确的预测。在这里,你不使用温度设置,而是使用标准的softmax函数。蒸馏将学生模型的输出称为硬预测和硬标签。这两者之间的损失是学生损失。
结合蒸馏损失和学生损失,通过反向传播来更新学生模型的权重。

蒸馏方法的主要好处是,在部署时可以使用较小的学生模型进行推理,而不是教师模型。在实践中,蒸馏对于生成式解码器模型效果不那么显著,它通常对像BERT这样具有大量表示冗余的仅编码器模型更有效。
需要注意的是,通过蒸馏,你是在训练第二个更小的模型用于推理,你并没有以任何方式减小初始LLM的模型大小。
训练后量化 🔢

让我们看看下一个实际减小LLM大小的模型优化技术。你在第一周的训练背景下已经介绍了第二种方法——量化,特别是量化感知训练。
然而,在模型训练完成后,你可以执行训练后量化以优化其部署。PTQ将模型的权重转换为更低精度的表示(例如16位浮点数或8位整数),以减少模型大小和内存占用,以及模型服务所需的计算资源。
量化可以仅应用于模型权重,也可以同时应用于权重和激活层。通常,包含激活层的量化方法可能对模型性能产生更大的影响。量化还需要一个额外的校准步骤,以统计方式捕获原始参数值的动态范围。
与其他方法一样,这里也存在权衡,因为有时量化会导致模型评估指标小幅下降。然而,这种下降通常值得换取成本节约和性能提升。
模型剪枝 ✂️
最后一个模型优化技术是剪枝。从高层次看,其目标是通过消除对整体模型性能贡献不大的权重来减小推理时的模型大小。这些是值非常接*或等于零的权重。
需要注意的是,一些剪枝方法需要模型完全重新训练,而另一些则属于参数高效微调的范畴,例如LoRA。也有一些方法专注于训练后剪枝。
理论上,这可以减少模型的大小并提高性能。然而,在实践中,如果只有一小部分模型权重接*零,那么对大小和性能的影响可能不大。

总结 📝
本节课中我们一起学*了模型部署前的关键考量与优化技术。量化、蒸馏和剪枝都旨在减小模型大小,以在不影响准确性的情况下提升推理时的模型性能。为部署优化你的模型将有助于确保你的应用程序运行良好,并为用户提供最佳的体验。
039:生成式AI项目生命周期备忘单 📋
在本节课中,我们将学*生成式AI项目生命周期的各个阶段,并了解每个阶段所需的时间和精力。这有助于你规划从模型选择到最终部署的整个流程。
到目前为止,你在课程中看到的所有内容——从选择模型、进行微调,到使其与人类偏好对齐——都将在你部署应用程序之前完成。


为了帮助你规划生成式AI项目生命周期的这些阶段,这份备忘单提供了每个工作阶段所需时间和精力的大致指示。

1. 预训练阶段 🏗️
正如之前所见,预训练一个大型语言模型可能是一项巨大的工程。


这个阶段是你将面临的最复杂的阶段,因为它涉及模型架构的决策、所需的大量训练数据以及必要的专业知识。

核心概念:预训练 = 大规模数据 + 复杂模型架构 + 专业知识

不过请记住,通常你会从一个现有的基础模型开始你的开发工作,因此你很可能可以跳过这个阶段。

2. 提示工程阶段 ✍️

上一节我们介绍了最复杂的预训练阶段,本节中我们来看看更常见的起点。如果你正在使用一个基础模型,你很可能会通过提示工程来开始评估模型的性能。

这种方法对技术专业知识要求较低,且不需要对模型进行额外的训练。
以下是提示工程阶段的特点:
- 对技术专业知识要求较低。
- 无需额外训练模型。
- 是评估和初步改进模型性能的快速起点。


3. 提示调优与微调阶段 🔧

如果你的模型表现未达预期,接下来你会考虑提示调优和微调。

根据你的具体用例、性能目标和计算预算,你可以尝试的方法范围很广,从完全微调到参数高效的微调技术,如 LoRA 或 提示调优。

这项工作需要一定的技术专业知识。但由于微调通常只需要相对较小的训练数据集就能取得很好的效果,这个阶段有可能在一天内完成。
以下是微调阶段的关键点:
- 需要一定的技术专业知识。
- 可使用完全微调或参数高效微调等方法。
- 通常所需训练数据量较小,可能快速完成。
4. 基于人类反馈的强化学*对齐阶段 🎯


在拥有训练好的奖励模型后,使用基于人类反馈的强化学*来对齐你的模型可以快速完成。因此,你可能会看看是否能使用现有的奖励模型来完成这项工作,正如你在本周实验中所见。



然而,如果你必须从头开始训练一个奖励模型,由于收集人类反馈的工作量很大,这可能会花费很长时间。
5. 优化阶段 ⚡

最后,你在上一个视频中学到的优化技术,通常在复杂度和工作量上处于中等水平,但如果对模型的改动不会对性能造成太大影响,优化可以相当快速地进行。


总结与展望 🚀
在完成了所有这些步骤之后,希望你已经训练和调优出了一个出色的LLM,它能够很好地服务于你的特定用例,并已为部署做好了优化。恭喜你!
在本课程的最后一系列视频中,你将探讨在启动应用程序之前可能还需要解决的有关LLM性能的剩余问题,以及可以克服这些问题的技术。让我们继续前进,一探究竟。
本节课中我们一起学*了生成式AI项目生命周期的完整路线图,从预训练、提示工程、微调、对齐到优化,了解了每个阶段的特点、所需资源和时间成本,为规划和实施你自己的AI项目提供了清晰的指引。
040:在应用中使用大语言模型 🚀

在本节课中,我们将要学*如何将大型语言模型集成到实际应用中,并探讨如何通过连接外部数据源来克服模型自身的局限性,例如知识过时、数学计算错误和“幻觉”问题。
尽管您之前探索的所有训练、微调和对齐技术都有助于为您的应用构建一个出色的模型,但大型语言模型存在一些更广泛的挑战,仅靠训练无法解决。让我们来看几个例子。

一个问题是模型所持有的内部知识截止于其预训练的时刻。例如,如果您询问一个在2022年初训练的模型“英国首相是谁”,它很可能会告诉您是鲍里斯·约翰逊。这个知识已经过时了。模型并不知道约翰逊在2022年底离任,因为该事件发生在它的训练之后。

模型也可能在复杂数学问题上遇到困难。如果您提示模型表现得像一个计算器,它可能会给出错误答案,这取决于问题的难度。在这里,您要求模型执行一个除法问题。模型返回了一个接*正确答案的数字,但它是错误的。请注意,大型语言模型并不执行数学运算。它们仍然只是试图基于其训练来预测下一个最佳标记,因此很容易得出错误答案。
最后,大型语言模型最著名的问题之一是,即使在不知道问题答案时,它们也倾向于生成文本。这通常被称为“幻觉”。在这里,您可以看到模型明显编造了一种不存在的植物——火星沙丘树——的描述。尽管目前仍然没有火星上存在生命的明确证据,但模型会很乐意告诉您相反的情况。

在本节中,您将学*一些技术,通过将大型语言模型连接到外部数据源和应用程序,来帮助您的模型克服这些问题。您需要做更多的工作,才能将您的大型语言模型连接到这些外部组件,并将所有内容完全集成以部署在您的应用程序中。


您的应用程序必须管理将用户输入传递给大型语言模型以及返回补全结果的过程。这通常通过某种编排库来完成。这一层可以实现一些强大的技术,在运行时增强和提升大型语言模型的性能,例如提供对外部数据源的访问或连接到其他应用程序的现有API。一个实现示例是LangChain,您将在本课后面了解更多。


让我们首先考虑如何将大型语言模型连接到外部数据源。


检索增强生成,简称RAG,是一个用于构建由大型语言模型驱动的系统的框架,它利用外部数据源和应用程序来克服这些模型的一些局限性。RAG是克服知识截止问题的绝佳方法,有助于模型更新其对世界的理解。虽然您可以在新数据上重新训练模型,但这很快就会变得非常昂贵,并且需要反复重新训练才能定期用新知识更新模型。


一个更灵活、成本更低廉的克服知识截止的方法是,在推理时让您的模型能够访问额外的外部数据。RAG在任何您希望语言模型能够访问它可能未曾见过的数据的情况下都很有用。这可能是新信息、原始训练数据中未包含的文档,或是存储在您组织私有数据库中的专有知识。为您的模型提供外部信息可以提高其补全结果的相关性和准确性。

让我们更仔细地看看这是如何工作的。检索增强生成不是一套特定的技术,而是一个为大型语言模型提供访问其在训练期间未见过的数据的框架。存在多种不同的实现方式,您选择哪一种将取决于您任务的细节以及您需要处理的数据格式。

在这里,您将了解Facebook研究人员在2020年发表的一篇关于RAG的早期论文中讨论的实现方式。该实现的核心是一个称为“检索器”的模型组件,它由一个查询编码器和一个外部数据源组成。编码器接收用户的输入提示,并将其编码成可用于查询数据源的形式。在Facebook的论文中,外部数据是一个向量存储,我们稍后会详细讨论,但它也可以是SQL数据库、CSV文件或其他数据存储格式。这两个组件一起训练,以在外部数据中找到与输入查询最相关的文档。检索器从数据源返回最佳的单篇或一组文档,并将新信息与原始用户查询相结合。然后,这个新的扩展提示被传递给语言模型,模型利用这些数据生成补全。
让我们看一个更具体的例子。想象您是一名律师,使用大型语言模型帮助您处理案件的取证阶段。一个RAG架构可以帮助您向文档语料库(例如,先前的法庭文件)提问。在这里,您向模型询问特定案件编号中提到的原告姓名。提示被传递给查询编码器,编码器以与外部文档相同的格式编码数据,然后在文档语料库中搜索相关条目。找到包含所请求信息的一段文本后,检索器将新文本与原始提示相结合。现在包含特定案件信息的扩展提示随后被传递给大型语言模型。模型利用提示上下文中的信息生成包含正确答案的补全。
您在这里看到的用例相当简单,只返回了可以通过其他方式找到的单一信息,但想象一下RAG的强大功能:能够生成文件摘要或在全部法律文档语料库中识别特定的人、地点和组织。



允许模型访问包含在此外部数据集中的信息,极大地提高了其在此特定用例中的效用。除了克服知识截止问题,RAG还有助于避免模型在不知道答案时产生幻觉的问题。

RAG架构可用于集成多种类型的外部信息源。您可以通过访问本地文档(包括私有维基和专家系统)来增强大型语言模型。RAG还可以实现访问互联网以提取网页上发布的信息,例如维基百科。通过将用户输入提示编码为SQL查询,RAG也可以与数据库交互。另一个重要的数据存储策略是向量存储,它包含文本的向量表示。这对于语言模型来说是一种特别有用的数据格式,因为它们在内部使用语言的向量表示来生成文本。向量存储支持一种基于相似性的快速高效的相关搜索。
请注意,实现RAG比简单地将文本添加到大型语言模型中要复杂一些。有几个关键的考虑因素需要注意,首先是上下文窗口的大小。大多数文本源太长,无法放入模型有限的上下文窗口中,而上下文窗口最多也只有几千个标记。因此,外部数据源被分割成许多块,每一块都能放入上下文窗口。像LangChain这样的包可以为您处理这项工作。
其次,数据必须以一种易于检索最相关文本的格式提供。回想一下,大型语言模型不直接处理文本,而是在嵌入空间中为每个标记创建向量表示。这些嵌入向量允许大型语言模型通过诸如余弦相似度之类的度量来识别语义相关的词。RAG方法获取外部数据的小块,并通过大型语言模型进行处理,为每个块创建嵌入向量。这些数据的新表示可以存储在称为向量存储的结构中,从而允许快速搜索数据集并高效识别语义相关的文本。向量数据库是向量存储的一种特定实现,其中每个向量也由一个键标识。例如,这可以允许RAG生成的文本也包含其来源文档的引用。

因此,您已经看到了访问外部数据源如何帮助模型克服其内部知识的限制。通过提供最新、相关的信息并避免幻觉,您可以极大地改善用户使用您应用程序的体验。接下来,我们将探索一种可以提高模型推理和制定计划能力的技术,这是使用大型语言模型驱动应用程序时的重要步骤。请加入下一个视频以了解更多。


本节课总结

在本节课中,我们一起学*了如何将大型语言模型集成到实际应用中,并重点探讨了检索增强生成框架。我们了解到,RAG通过连接外部数据源,可以有效解决模型的知识过时问题、减少幻觉,并提升回答的准确性和相关性。我们还讨论了实现RAG的关键考虑因素,如处理长文本的上下文窗口限制,以及利用向量存储进行高效语义检索。这些技术是构建强大、可靠的大型语言模型应用的重要基石。
041:与外部应用交互 🚀

在本节课中,我们将学*大型语言模型如何与外部应用程序进行交互。你将了解这种交互的必要性、典型用例以及实现交互所需的关键信息。

上一节我们介绍了LLM如何与外部数据集交互。本节中,我们来看看它们如何与外部应用程序交互。
动机与用例 🤔
为了说明需要此类LLM增强功能的问题和用例类型,我们将回顾课程早期提到的客户服务机器人示例。
以下是客户与购物机器人交互的流程,我们将分析允许应用程序端到端处理退货请求所需的集成。
交互流程示例 🛍️
在这个对话中,客户表示想退回购买的牛仔裤。购物机器人回应要求提供订单号,客户随后提供。接着,购物机器人在交易数据库中查找该订单号。一种实现方式是使用之前视频中见过的RAG(检索增强生成)方法。在这种情况下,你可能通过SQL查询后端订单数据库来检索数据,而不是从文档语料库中检索。
一旦购物机器人检索到客户订单,下一步是确认要退回的商品。机器人询问客户除了牛仔裤外是否还想退回其他物品。用户回答后,机器人向公司的物流合作伙伴发起退货标签请求。机器人使用物流商的Python API来请求标签。购物机器人将通过电子邮件向客户发送物流标签,因此它还需要客户确认其电子邮件地址。客户回复其电子邮件地址后,机器人将此信息包含在调用物流商API的请求中。API请求完成后,机器人通知客户标签已通过电子邮件发送,对话结束。
这个简短的例子说明了为应用程序提供支持时,你可能需要LLM具备的其中一组可能的交互能力。

连接LLM与外部应用 🌐
总的来说,将LLM连接到外部应用程序使得模型能够与更广阔的世界互动,将其效用扩展到语言任务之外。正如购物机器人示例所示,当LLM获得与API交互的能力时,它们可用于触发操作。
LLM还可以连接到其他编程资源,例如Python解释器,这能使模型将精确计算纳入其输出中。
需要注意的是,提示词和补全结果是这些工作流程的核心。应用程序为响应用户请求而采取的操作将由LLM决定,LLM充当应用程序的推理引擎。
触发操作的关键信息 🔑
为了触发操作,LLM生成的补全结果必须包含某些重要信息。
以下是所需的关键信息类型:
- 生成指令集:模型需要能够生成一组指令,以便应用程序知道要采取什么操作。这些指令需要易于理解,并对应于允许的操作。例如,在购物机器人示例中,重要步骤包括:检查订单ID、请求物流标签、验证用户邮箱以及向用户发送标签邮件。
- 格式化输出:补全结果需要以更广泛的应用程序能够理解的格式进行格式化。这可能简单到特定的句子结构,也可能复杂到编写Python脚本或生成SQL命令。例如,以下是一个SQL查询,用于确定某个订单是否存在于所有订单的数据库中:
SELECT * FROM orders WHERE order_id = '[提供的订单号]'; - 收集验证信息:模型可能需要收集用于验证操作的信息。例如,在购物机器人对话中,应用程序需要验证客户用于下原始订单的电子邮件地址。验证所需的任何信息都需要从用户处获取,并包含在补全结果中,以便传递给应用程序。
提示词结构的重要性 🏗️
以正确的方式构建提示词对于所有这些任务都至关重要,并且可以极大地影响生成计划的质量或对期望输出格式规范的遵守程度。

本节课中,我们一起学*了大型语言模型与外部应用程序交互的原理、流程和关键要素。我们了解到,通过精心设计的提示词和格式化的输出,LLM可以充当智能代理,触发外部API、执行查询并完成复杂的端到端任务,从而极大地扩展其应用范围。
042:帮助大语言模型进行推理和规划 🧠
在本节课中,我们将要学*如何通过特定的提示技巧,帮助大型语言模型(LLM)更好地进行多步骤推理和规划,以解决其可能感到困难的复杂问题。
正如你所见,LLM能够推理出满足用户请求所需采取的步骤,这一点非常重要。

然而,复杂的推理对LLM来说可能具有挑战性。

特别是对于那些涉及多个步骤或数学计算的问题。
这些问题普遍存在,即使在许多其他任务上表现出色的大型模型中也不例外。
推理挑战示例
以下是LLM难以完成任务的一个例子。
你要求模型解决一个简单的多步骤数学问题,以确定食堂在使用一些苹果做午餐后又购买了一些之后,还剩下多少苹果。
你的提示中包含了一个类似的示例问题及其解决方案,旨在通过单样本推理帮助模型理解任务。
处理提示后,模型生成了此处所示的回答,声称答案是27。这个答案是错误的。如果你自己计算一下,会发现食堂实际上只剩下9个苹果。

引入思维链提示
研究人员一直在探索提高大型语言模型在类似推理任务上表现的方法。
一种已证明有效的方法是,通过提示模型将问题分解为步骤,使其更像人类一样思考。

那么,更像人类一样思考是什么意思呢?

让我们看看前一页幻灯片提示中的单样本示例问题。
这里的任务是计算罗杰在购买一些新网球后有多少个网球。
人类解决这个问题的一种方式可能如下:
首先,确定罗杰开始时拥有的网球数量。
然后,注意到罗杰购买了两罐网球。每罐包含三个球,所以他总共有六个新网球。
接着,将这六个新球与原来的五个相加,总共得到11个球。
最后陈述答案。这些中间计算构成了人类可能采取的推理步骤,而完整的步骤序列则展示了解决问题的思维链。

要求模型模仿这种行为被称为思维链提示。
它的工作原理是,在你用于单样本或少样本推理的任何示例中,包含一系列中间推理步骤。
通过这种方式构建示例,你本质上是在教模型如何通过推理来完成任务并得出解决方案。

应用思维链提示
以下是几页幻灯片前看到的同一个苹果问题,现在被重新构建为一个思维链提示。
罗杰购买网球的故事仍然被用作单样本示例,但这次你在解决方案文本中包含了中间推理步骤。
这些步骤基本上等同于几分钟前看到的人类可能采取的步骤。
然后,你将这个思维链提示发送给大型语言模型,模型会生成一个回答。
请注意,模型现在产生了一个更稳健、更透明的回答,它按照与单样本示例相似的结构解释了自己的推理步骤。
模型现在正确地确定剩下9个苹果。通过逐步思考问题,模型得出了正确答案。
需要指出的是,虽然这里的输入提示以压缩格式显示以节省空间,但完整的提示实际上都包含在输出中。
思维链提示的扩展应用
除了算术问题,你也可以使用思维链提示来帮助LLM提高对其他类型问题的推理能力。
以下是一个简单的物理问题示例,要求模型判断一枚金戒指是否会沉到游泳池底部。
这里作为单样本示例包含的思维链提示,向模型展示了如何通过推理“梨会漂浮是因为它的密度小于水”来解决这个问题。
当你将这个提示传递给LLM时,它会生成一个结构相似的回答。
模型正确地识别了金的密度(这是它从训练数据中学到的),然后推理出戒指会下沉,因为金的密度远大于水。
总结与展望
思维链提示是一种强大的技术,可以提高模型推理问题的能力。

虽然这可以极大地提高模型的性能,但如果你的任务需要精确计算(例如计算电子商务网站的总销售额、计算税款或应用折扣),LLM有限的数学技能仍然可能导致问题。
在下一个视频中,你将探索一种可以帮助你克服这个问题的方法,即让你的LLM与一个更擅长数学的程序进行“对话”。
让我们继续前进,一探究竟。
本节课中,我们一起学*了思维链提示这一核心技巧。我们了解到,通过要求模型将复杂问题分解为中间步骤并展示其推理过程,可以显著提升其在多步骤推理和数学计算任务上的表现。其核心公式可以概括为:
问题 -> [中间推理步骤1 -> 中间推理步骤2 -> ... -> 中间推理步骤N] -> 最终答案
这种方法模仿了人类的思考方式,使模型的输出更加透明和可靠。然而,我们也认识到LLM在精确计算方面仍有局限,这为后续学*更高级的解决方案(如工具调用)做好了铺垫。
043:程序辅助语言模型 🧮
在本节课中,我们将要学*如何通过“程序辅助语言模型”框架,让大型语言模型与外部代码解释器协同工作,以克服其在执行数学运算方面的局限性。

概述
正如您在本课早些时候所见,大型语言模型执行算术和其他数学运算的能力是有限的。虽然可以尝试使用思维链提示来克服这一点,但效果有限。即使模型能正确推理问题,它仍可能在具体的数学运算上出错,尤其是在处理大数字或复杂运算时。
大型语言模型的数学局限性

上一节我们介绍了LLM在数学运算上的挑战,本节中我们来看看一个具体的例子。


这是之前看到的一个例子,LLM试图扮演计算器的角色,但得出了错误的答案。请记住,模型实际上并没有进行任何真正的数学计算。它只是在尝试预测最有可能完成提示的标记。根据您的使用场景,模型算错数学可能会带来许多负面后果,例如向客户收取错误的总金额或弄错食谱的配料比例。

引入程序辅助语言模型

为了克服这一限制,可以让模型与擅长数学的外部应用程序交互,例如Python解释器。一个以此方式增强LLM的有趣框架被称为“程序辅助语言模型”,简称PAL。这项工作由卡内基梅隆大学的Lou Yugao及其合作者于2022年首次提出,它将LLM与外部代码解释器配对以执行计算。


该方法利用思维链提示来生成可执行的Python脚本。模型生成的脚本被传递给解释器执行。右侧的图片取自论文,展示了一些示例提示和补全。我们稍后将详细分析一个例子,所以现在不必担心阅读所有细节。
PAL的工作原理
PAL背后的策略是让LLM生成推理步骤伴随计算机代码的补全。然后将此代码传递给解释器,以执行解决问题所需的计算。通过在提示中包含一个或多个示例,来指定模型的输出格式。让我们仔细看看这些示例提示的结构。

我们将继续以罗杰购买网球的故事作为单样本示例。这里的设置现在看起来应该很熟悉。这是一个思维链示例。您可以看到用文字写出的推理步骤,在蓝色高亮行中。与之前看到的问题不同之处在于,包含了用粉色显示的Python代码行。这些代码行将涉及计算的任何推理步骤转化为代码。
以下是变量声明和赋值的逻辑:
- 变量根据每个推理步骤中的文本声明。
- 它们的值要么直接赋值(如这里的第一行代码所示),要么使用推理文本中存在的数字进行计算赋值(如第二行Python代码所示)。
- 模型也可以使用它在其他步骤中创建的变量(如第三行所示)。
请注意,每个推理步骤的文本都以井号开头,这样该行就可以被Python解释器作为注释跳过。提示在此处以需要解决的新问题结束。在这个案例中,目标是确定一家面包店在一天的销售以及从杂货店合作伙伴退回一些面包后,还剩下多少条面包。在右侧,您可以看到LLM生成的补全。同样,思维链推理步骤用蓝色显示,Python代码用粉色显示。


如您所见,模型创建了许多变量来跟踪烘烤的面包数量、一天中每个时段售出的面包数量以及杂货店退回的面包数量。然后通过对这些变量进行算术运算来计算答案。模型正确识别了各项是应该相加还是相减,以得出正确的总数。
构建PAL推理流程
既然您知道了如何构建示例来指示LLM根据其推理步骤编写Python脚本,让我们来看看PAL框架如何使LLM能够与外部解释器交互。
要为PAL推理做准备,您需要格式化提示以包含一个或多个示例。每个示例应包含一个问题,后跟解决问题的推理步骤和Python代码行。


接下来,您需要将想要回答的新问题附加到提示模板中。您生成的PAL格式化提示现在同时包含了示例和要解决的问题。然后,将此组合提示传递给您的LLM。LLM随后会生成一个Python脚本形式的补全,因为它已根据提示中的示例学会了如何格式化输出。
现在,您可以将脚本移交给Python解释器,用它来运行代码并生成答案。对于上一张幻灯片中看到的面包店示例脚本,答案是74。现在,您将包含答案的文本(您知道它是准确的,因为计算是在Python中执行的)附加到您最初使用的PAL格式化提示中。至此,您有了一个在上下文中包含正确答案的提示。现在,当您将更新后的提示传递给LLM时,它会生成包含正确答案的补全。
鉴于面包店面包问题中的数学相对简单,模型可能仅通过思维链提示就能得到正确答案。

但对于更复杂的数学,包括大数字的算术、三角学或微积分,PAL是一种强大的技术,可确保应用程序执行的任何计算都是准确可靠的。

自动化与编排器
您可能想知道如何自动化此过程,以免手动在LLM和解释器之间来回传递信息。这就是您之前看到的编排器发挥作用的地方。


此处显示为黄色框的编排器是一个技术组件,可以管理信息流以及对外部数据源或应用程序的调用启动。它还可以根据LLM输出中包含的信息决定采取什么行动。请记住,LLM是您应用程序的推理引擎。最终,它创建编排器将解释和执行的计划。在PAL中,只需要执行一个操作:运行Python代码。因此,LLM实际上不必决定运行代码,它只需要编写脚本,然后由编排器传递给外部解释器运行。
然而,大多数现实世界的应用程序可能比简单的PAL架构更复杂。您的使用场景可能需要与多个外部数据源交互。正如您在Sho机器人示例中看到的那样,您可能需要管理多个决策点、验证操作以及对外部应用程序的调用。

那么,如何使用LLM来驱动更复杂的应用程序呢?让我们在下一个视频中探讨一种策略。


总结

本节课中我们一起学*了程序辅助语言模型。我们了解到LLM在数学运算上的固有局限性,并探索了如何通过PAL框架,将LLM的推理能力与Python解释器的精确计算能力相结合。PAL通过让LLM生成伴随代码的推理步骤,并将代码交由外部解释器执行,从而确保了复杂数学运算的准确性。我们还简要介绍了编排器在自动化此流程中的作用,为构建更复杂的AI应用奠定了基础。
044:43_React- 结合推理和行动
在本节课中,我们将要学*一个名为ReAct的框架。该框架将思维链推理与行动规划相结合,能够帮助大型语言模型(LLM)规划并执行涉及多个外部数据源和应用的复杂工作流。


概述
上一节我们介绍了如何使用结构化提示词(如PAL)帮助LLM编写Python脚本来解决复杂数学问题。一个利用PAL的应用可以将LLM连接到Python解释器来运行代码,并将答案返回给LLM。然而,大多数应用需要LLM管理更复杂的工作流,可能涉及与多个外部数据源和应用的交互。
本节中,我们将探索一个名为ReAct的框架,它可以帮助LLM规划和执行这些工作流。
ReAct框架简介
ReAct是一种提示策略,它结合了思维链推理与行动规划。该框架由普林斯顿大学和谷歌的研究人员在2022年提出。其研究论文基于Hotpot QA(一个需要推理两个或更多维基百科段落的多步骤问答基准)和FEVER(一个使用维基百科段落验证事实的基准)开发了一系列复杂的提示示例。
ReAct使用结构化示例向大型语言模型展示如何推理问题,并决定采取哪些行动以接*解决方案。
ReAct的工作原理
以下是ReAct提示示例的核心结构,它包含一个“思考-行动-观察”的三元组循环。
- 思考:一个推理步骤,向模型展示如何处理问题并确定要采取的行动。
- 行动:模型从预定义列表中选择一个具体操作,以与外部应用或数据源交互。
- 观察:外部搜索提供的新信息被引入提示上下文中,供模型解读。
提示会重复这个循环多次,直到获得最终答案。
一个具体示例
假设目标是判断两本杂志中哪一本创刊更早。ReAct提示示例如下:
- 思考:模型需要搜索两本杂志的信息并比较创刊年份。首先搜索“Arthur‘s Magazine”。
- 行动:执行搜索操作,格式为
行动:搜索[Arthur‘s Magazine]。 - 观察:外部API返回信息,例如“Arthur‘s Magazine创刊于1844年”。
- 思考:已知第一本杂志信息,下一步需要搜索“First for Women”。
- 行动:执行搜索操作,格式为
行动:搜索[First for Women]。 - 观察:外部API返回信息,例如“First for Women创刊于1989年”。
- 思考:比较1844年和1989年,因此Arthur‘s Magazine创刊更早。
- 行动:执行完成操作并输出答案,格式为
行动:完成[Arthur‘s Magazine]。
在这个框架中,LLM只能从一组预定义的指令所限定的有限行动中选择。这一点至关重要,因为LLM非常有创造力,可能会提出应用程序无法执行的步骤。

构建完整的ReAct提示

要将所有部分组合起来进行推理,你需要遵循以下步骤:
- 准备ReAct示例提示。
- 在示例开头添加指令定义。
- 在末尾插入你想要回答的问题。
完整的提示现在包含了所有这些独立的部分,可以传递给LLM进行推理。其结构可以概括为以下伪代码:
指令:任务定义、思考说明、允许的行动列表(搜索、查找、完成)
示例:完整的“思考-行动-观察”循环演示
问题:用户提出的待解决问题
扩展与应用:LangChain框架
ReAct框架展示了通过推理和行动规划来驱动应用程序的一种方式。你可以通过创建针对应用程序中特定决策和行动的示例来扩展此策略。
幸运的是,基于语言模型开发应用的框架正在积极发展中。一个被广泛采用的解决方案叫做LangChain。😊

LangChain框架为你提供了包含必要组件的模块化部件,以便与LLM协同工作。
以下是LangChain提供的一些核心组件:
- 提示模板:适用于多种用例,可用于格式化输入示例和模型补全。
- 记忆:可用于存储与LLM的交互历史。
- 工具:预构建的工具,支持执行广泛任务,包括调用外部数据集和各种API。
将这些独立组件连接在一起就形成了一个链。LangChain的创建者开发了一套针对不同用例优化的预定义链,你可以直接使用它们来快速启动和运行你的应用。
有时,应用程序的工作流可能会根据用户提供的信息采取多种路径。在这种情况下,无法使用预定的链,而是需要灵活性来决定在用户执行工作流时采取哪些行动。
LangChain定义了另一种称为智能体的构造,你可以用它来解释用户的输入,并确定使用哪种或哪些工具来完成任务。LangChain目前包含了适用于PAL和ReAct等策略的智能体。智能体可以被整合到链中,以执行单个行动或规划并执行一系列行动。
LangChain处于活跃开发中,新功能不断添加,例如在整个工作流中检查和评估LLM补全的能力。它是一个令人兴奋的框架,可以帮助你进行快速原型设计和部署,并可能成为你未来生成式AI工具箱中的重要工具。
模型规模的重要性

最后,在使用LLM开发应用程序时,需要记住一点:模型进行良好推理和规划行动的能力取决于其规模。
对于使用像PAL或ReAct这样的高级提示技术,更大的模型通常是更好的选择。较小的模型可能难以理解高度结构化提示中的任务,可能需要你执行额外的微调来提高其推理和规划能力,这可能会减慢你的开发进程。
相反,如果你从一个强大的大模型开始,并在部署中收集大量用户数据,你或许可以利用这些数据来训练和微调一个较小的模型,以便在后期切换使用。

总结

本节课中,我们一起学*了ReAct框架,它通过结合思维链推理和预定义行动,使LLM能够规划复杂任务。我们还了解了如何构建完整的ReAct提示,并介绍了LangChain这一强大工具,它提供了模块化组件来简化基于LLM的应用开发。最后,我们讨论了模型规模对实现复杂推理和规划能力的重要性。掌握这些概念将帮助你构建更智能、更强大的生成式AI应用。
045:44_大语言模型应用架构


在本节课中,我们将学*构建基于大型语言模型(LLM)的应用程序时需要考虑的额外因素。我们将探讨一个完整的应用架构,回顾课程中涉及的关键技术,并展望该领域的未来研究方向。
概述
在本节中,我们将把课程中学*到的所有知识整合起来,审视构建LLM驱动应用程序所需的各个组成部分。我们将从基础设施层开始,一直到用户界面层,了解如何将这些组件组合成一个端到端的解决方案。
构建LLM应用的关键组件
要创建端到端的应用程序解决方案,你需要以下几个关键组件。
以下是构建LLM驱动应用程序所需的核心层次:
- 基础设施层:该层提供计算、存储和网络资源,用于部署你的LLM以及托管应用程序的其他组件。你可以使用本地基础设施,也可以通过按需付费的云服务来获取这些资源。
- 大型语言模型层:此层包含你希望在应用程序中使用的大型语言模型。这些模型可以是基础模型,也可以是你为特定任务进行过适配的模型。模型需要根据推理需求(例如是否需要实时或*实时交互)部署在合适的基础设施上。
- 外部数据与工具层:你的应用可能需要从外部源检索信息,例如在“检索增强生成”部分讨论的技术。此外,你可能需要使用额外的工具和框架来轻松实现课程中讨论的一些技术。例如,你可以使用LangChain的内置库来实现“思维链”提示等技术。模型中心允许你集中管理和共享模型以供应用使用。
- 应用逻辑与存储层:你的应用程序将把LLM生成的补全结果返回给用户或消费应用。根据具体用例,你可能需要实现捕获和存储输出的机制。例如,你可以构建在会话期间存储用户补全内容的能力,以扩展LLM固定上下文窗口的大小。你还可以收集用户反馈,这些反馈在应用成熟后可能对进一步的微调、对齐或评估有用。
- 用户界面与安全层:在最顶层,通常会有某种类型的用户界面供用户使用应用程序,例如网站或REST API。这一层还包括与你的应用程序交互所需的安全组件。
从高层次看,这个架构栈代表了构建生成式AI应用时需要考虑的各种组件。你的用户,无论是人类终端用户还是通过API访问你应用的其他系统,都将与整个栈进行交互。由此可见,模型通常只是构建端到端生成式AI应用的一部分。
课程核心内容回顾
上一节我们介绍了应用的整体架构,本节我们来回顾一下本课程中学*的核心技术与概念。

恭喜你完成了完整的生成式AI项目生命周期的学*。希望你现在对使用LLM构建应用程序时必须考虑的重要问题有了一些直观的理解。
本周,你学*了如何通过一种名为基于人类反馈的强化学*的技术来微调模型,使其与人类偏好(如乐于助人、无害和诚实)保持一致。鉴于RLHF的流行,目前已有许多现成的RL奖励模型和人类对齐数据集可用,这使你可以快速开始对齐你的模型。
在实践中,RLHF是一种非常有效的机制,可用于提高模型的对齐度,降低其回答的毒性,并让你在生产中更安全地使用模型。

你还学*了通过蒸馏、量化或剪枝来减小模型规模,从而优化模型推理的重要技术。这最大限度地减少了在生产环境中部署LLM所需的硬件资源量。

最后,你探索了可以通过结构化提示以及连接到外部数据源和应用程序来帮助模型在部署中表现更好的方法。LLM可以作为应用程序中的推理引擎发挥惊人的作用,利用其智能来驱动令人兴奋且有用的应用。

像LangChain这样的框架使得快速构建、部署和测试基于LLM的应用程序成为可能,这对开发者来说是一个非常激动人心的时代。
总结与展望

在本节课中,我们一起学*了构建基于大型语言模型的生成式AI应用程序的完整架构和关键考量。我们回顾了从模型对齐(RLHF)、推理优化(蒸馏、量化、剪枝)到应用增强(提示工程、外部数据集成)等一系列核心技术。

课程最后,吴恩达老师将探讨一些活跃的研究领域,这些领域很可能在未来几个月和几年内塑造这个领域的发展轨迹。
046:AWS SageMaker JumpStart 入门 🚀
在本节可选视频中,我们将了解一个名为 Amazon SageMaker JumpStart 的 AWS 服务。该服务能帮助你快速将大型语言模型应用投入生产并实现规模化运营。
概述
上一节我们探讨了构建LLM应用的基础组件。本节中,我们来看看AWS提供的一个集成化服务——SageMaker JumpStart。它作为一个模型中心,能让你快速部署预训练的基础模型,并将其集成到自己的应用中,从而简化从开发到生产的流程。
应用架构与JumpStart的角色
以下是你在前一个视频中探索过的应用技术栈。正如所见,构建一个由LLM驱动的应用需要多个组件。
SageMaker JumpStart 是一个模型中心。它允许你快速部署该服务内可用的基础模型,并将它们集成到你自己的应用程序中。
JumpStart服务还提供了一种简单的方法来微调和部署模型。

JumpStart覆盖了此架构图中的许多部分,包括基础设施、LLM本身、工具和框架,甚至调用模型的API。
重要注意事项

与你在实验课中使用的模型相比,JumpStart中的模型需要GPU来进行微调和部署。
请记住,这些GPU采用按需计费模式。在选择要使用的计算资源之前,你应该参考SageMaker的定价页面。
此外,请务必在不使用时删除SageMaker模型端点,并遵循成本监控的最佳实践来优化成本。
JumpStart快速导览
接下来,让我为你快速展示JumpStart,以及如何从你自己的AWS账户访问它。
SageMaker JumpStart可以从AWS控制台或通过SageMaker Studio访问。在这个简短的导览中,我将从Studio开始,然后从主屏幕选择JumpStart。我也可以选择左侧菜单中的JumpStart,并选择模型、笔记本和解决方案。

点击JumpStart后,你会看到不同的类别,其中包括跨不同用例的端到端解决方案,以及许多支持不同模态的基础模型。你可以轻松部署这些模型,并且在“微调”选项下标记为“是”的模型还可以进行微调。
以FLAN-T5模型为例
让我们看一个学完本课程后大家都熟悉的例子,即FLAN-T5模型。在课程中,你专门使用了基础变体以最小化实验环境所需的资源。然而,正如你在这里看到的,你也可以根据需要通过JumpStart使用FLAN-T5的其他变体。
你还会注意到这里的Hugging Face标志,这意味着这些模型实际上直接来自Hugging Face。AWS已与Hugging Face合作,使你只需点击几下即可轻松部署或微调模型。
如果我选择FLAN-T5基础模型,你会看到我有几个选项。
以下是部署模型的主要步骤:
- 部署模型:首先,我可以通过指定几个关键参数(如实例类型和大小)来选择部署模型。这是应用于托管模型的实例类型和大小。请注意,这将部署到一个实时的持久端点,价格取决于你在此处选择的主机实例。其中一些实例可能相当大,因此请务必记住删除任何不使用的端点,以避免产生不必要的成本。
- 安全设置:你还可以指定许多安全设置,从而实施符合自身安全要求的控制。
- 启动部署:然后你可以选择点击“部署”,这将使用你指定的基础设施自动将该FLAN-T5基础模型部署到端点。
微调模型
在第二个标签页中,你会注意到“训练”选项。因为此模型支持微调,你也可以通过指定训练和验证数据集的位置来设置微调任务。
以下是设置微调任务的要点:
- 选择计算资源:然后选择你想用于训练的计算资源大小。通过这个下拉菜单可以轻松调整计算资源的大小,你可以轻松选择想用于训练任务的计算类型。再次提醒,你需要为训练模型所需时间内的底层计算资源付费,因此我们建议为你的特定任务选择所需的最小实例。
- 调整超参数:另一个功能是能够通过这些下拉菜单快速识别和修改此特定模型的可调超参数。
- 使用高效微调技术:如果我们继续向下滚动到底部,你会看到一个名为“PEFT”(参数高效微调)的参数类型,这是你在第6课中学到的。在这里,你可以通过一个简单的下拉菜单选择“LoRA”(你在第4课中学到),从而更轻松地实现你学到的这些各种技术。
- 启动训练:然后你可以继续点击“训练”,这将启动一个训练任务,使用你为特定任务提供的输入来微调这个预训练的FLAN-T5模型。
以编程方式使用
最后,这里是另一个选项,即让JumpStart自动为你生成一个笔记本。假设你不喜欢使用下拉菜单,而更喜欢以编程方式处理这些模型。

这个笔记本基本上为你提供了我们之前介绍的所有选项背后运行的代码。如果你更喜欢以编程方式在最低层级使用JumpStart,这是一个可选方案。

总结与鼓励
这只是JumpStart的一个快速导览,用以说明你在课程中学到的模型中心的一个具体实现。
除了作为包含基础模型的模型中心外,JumpStart还提供了大量资源,包括博客、视频和示例笔记本。


我强烈鼓励你通过探索其中可用的不同基础模型及其变体来更多地了解它,以帮助你快速入门。
047:责任感的AI 🤖
在本节课中,我们将探讨生成式人工智能,特别是大型语言模型应用中的责任感问题。随着AI技术的快速发展,确保其被负责任地开发和使用变得至关重要。我们将了解当前面临的主要挑战、应对策略以及该领域的未来研究方向。


概述

在本课程中,你已经学*了贯穿生成式AI项目生命周期的基本概念和应用技术。由LLM驱动的应用仍处于起步阶段,研究人员几乎每天都在宣布新的技术或策略以提高性能和可靠性。本课程只能涵盖发布时已知或已理解的内容,但我们确信这个领域将继续快速发展。让我们重点介绍几个活跃的研究领域。
主要挑战与应对策略
我的AWS同事,Ashley Ses博士,将与我一起讨论负责任的人工智能,特别是在大型语言模型的生成式AI背景下。
Ashley博士是AWS亚马逊AI的首席技术布道师。在这个职位上,她专注于公平性和准确性,以及识别和减轻人工智能中的潜在偏见。她曾在亚特兰大担任应用科学家,领导亚马逊视觉搜索团队。有趣的是,该团队在亚马逊购物应用上推出了商品部件的视觉搜索功能。
鉴于当前领域现状,在大型语言模型的生成式AI背景下,负责任AI面临哪些新的风险和挑战?
这是一个很好的问题,因为存在许多挑战,我们重点讨论三个:毒性、幻觉和知识产权问题。
1. 毒性挑战
以下是关于毒性挑战的详细描述和缓解建议。
- 挑战定义:毒性的核心意味着某些语言或内容可能对特定群体,特别是边缘化群体或受保护群体,造成伤害或歧视。
- 缓解策略:
- 从训练数据入手:训练数据是所有AI的基础,因此可以从精心策划训练数据开始。
- 训练护栏模型:训练模型来检测和过滤掉训练数据中任何不需要的内容。
- 重视人工标注:在训练和标注过程中,我们需要确保为标注者提供足够的指导,并确保标注者群体的多样性。这样他们才能理解如何筛选或标记某些数据。
有道理,你刚才提到的确保人工标注者多样性非常重要。
2. 幻觉挑战
上一节我们讨论了毒性问题,本节中我们来看看幻觉挑战。幻觉指的是完全不真实的内容,或者看起来可能真实但实际上毫无依据的内容。
这正是生成式AI中幻觉的含义。由于我们训练大型语言模型或一般神经网络的方式,很多时候我们并不知道模型实际学到了什么。因此,模型有时会尝试填补其缺失数据的空白,这常常导致虚假陈述或幻觉。
以下是应对幻觉的一些方法。
- 用户教育:教育用户这是该技术的现实情况,并添加免责声明,让他们知道这是需要注意的事项。
- 增强可信来源:用独立且经过验证的来源来增强大型语言模型,以便对返回的数据进行双重检查。
- 开发归因方法:开发将生成输出归因于特定训练数据片段的方法,以便我们总能追溯信息来源。
- 明确使用范围:始终确保定义预期用例与非预期用例,因为幻觉可能发生,我们希望用户对这些系统的运作方式保持透明和了解。
明白了,我认为教育在这里确实非常关键。
3. 知识产权挑战
你提到的第三个挑战是知识产权。对此你有何看法?
这个问题肯定需要解决,因为它基本上意味着人们使用这些生成式AI模型返回的数据,可能会抄袭他人先前的工作,或者对已存在的作品和内容产生版权问题。
因此,这个问题可能需要随着时间的推移,通过技术和政策制定者及其他法律机制的混合方式来共同解决。同时,我们希望建立一个治理体系,确保每个利益相关者都履行其职责以防止这种情况发生。
此外,*期出现了一个新概念——机器去学*,旨在减少或移除受保护内容对生成式AI输出的影响。这只是当今研究中一个非常初步的方法。我们还可以采用过滤或阻止方法,将内容与受保护的训练数据进行比较,如果过于相似,则在呈现给用户之前抑制或替换它。
明白了。现在,从项目角度整体来看,你能给从业者什么建议?我如何负责任地构建和使用生成式AI模型?
负责任构建与使用生成式AI模型的建议
我很高兴你问这个问题。定义用例非常重要,越具体、越窄越好。
以下是一些关键建议。
- 定义具体用例:用例定义越具体、越窄越好。例如,我们实际使用生成式AI来测试和评估系统鲁棒性的一个场景是人脸识别系统。我们使用生成式AI创建人脸的不同版本。例如,如果我测试一个使用我的脸来解锁手机的系统,我希望确保用不同版本的脸进行测试:长发、短发、戴眼镜、化妆、不化妆。我们可以利用生成式AI大规模地进行这种测试。这就是我们如何用它来测试鲁棒性的一个例子。
- 评估风险:我还想确保我们评估风险,因为每个用例都有其自身的风险集,有些可能更好或更糟。
- 评估性能:评估性能确实是数据和系统的一个函数。你可能拥有相同的系统,但用不同类型的数据测试时,可能表现得很好,也可能非常糟糕。
- 迭代生命周期:我们希望确保在AI生命周期中进行迭代。创建AI是一个持续迭代的循环,我们希望在设计阶段和部署阶段都实施责任感,并长期监控反馈。
- 建立治理与问责:最后同样重要的是,我们希望在整个生命周期中发布治理政策,并为每个相关利益相关者制定问责措施。
这真的很有帮助,Ashley。我也喜欢你提到的关于生成式AI可能成为解决方案一部分的观点,即帮助创建更多样化的数据。
未来研究方向

现在,在我们结束之前,我知道这个领域目前正在发生很多事情,但研究界目前正在积极研究哪些让你感到兴奋的课题?
我认为有几个方向。有很多,这也是为什么这个领域每天都在展现新面貌。
以下是当前一些令人兴奋的研究方向。

- 水印与指纹技术:这是在内容或数据中包含类似印章或签名的方法,以便我们总能追溯来源。
- 内容来源鉴别模型:创建帮助确定内容是否由生成式AI创建的模型也是一个新兴的研究领域。
因此,这是一个非常激动人心的时刻。我认为AI的未来是可访问的、包容的,我期待看到未来的创新。
总结
本节课中,我们一起学*了在大型语言模型的生成式AI背景下,负责任AI所面临的核心挑战:毒性、幻觉和知识产权。我们探讨了针对这些挑战的缓解策略,例如精心策划数据、用户教育、增强可信来源以及建立治理体系。最后,我们展望了该领域令人兴奋的未来研究方向,如水印技术和内容鉴别模型。构建和使用AI是一个持续的过程,将责任感融入其生命周期的每个阶段至关重要。
048:课程总结与未来展望
在本节课中,我们将对课程内容进行总结,并展望大型语言模型(LLM)领域的未来发展趋势。我们将探讨模型对齐、可解释性、效率优化以及新兴能力等关键方向。
未来研究方向
上一节我们回顾了课程的核心内容,本节中我们来看看研究人员正在探索的几个关键未来方向。
除了生成式人工智能本身,研究人员正在探索使模型与人类价值观和偏好保持一致的技术。
提高模型的可解释性,并实施有效的模型治理。
随着模型能力的增强,我们还需要更具扩展性的人类监督技术。
例如,我在上一课中讨论过的宪法人工智能。
研究人员继续探索在整个项目生命周期中扩展损失函数的方法。
包括能更好预测模型性能的技术,以确保资源被有效利用。
例如,通过模拟。
而扩展并不总意味着更大。研究团队正在为小型设备和边缘部署进行模型优化。
例如,Llama.cpp 是一个使用4位整数量化在笔记本电脑上运行的Llama模型的C++实现。
同样,我相信我们将在整个模型开发生命周期中看到进步和效率提升。
特别是在预训练、微调和强化学*方面出现更高效的技术。
新兴模型能力
在探讨了效率优化后,我们来看看模型能力本身将如何发展。
我们将看到LLM能力的增加和新兴。例如,研究人员正在研究开发支持更长问题和上下文的模型。
例如,用于总结整本书。事实上,在本课程开发期间,我们已经看到了首个宣布支持100,000个令牌上下文窗口的模型。
这大致相当于75,000个单词和数百页的内容。
模型也将越来越多地支持跨语言、图像、视频、音频等的多模态。
这将解锁新的应用和用例,并改变我们与模型的交互方式。
我们已经通过最新一代的文生图模型看到了这一点的首批惊人成果,其中自然语言成为创建视觉内容的用户界面。
研究人员还在试图更多地了解LLM的推理能力,并探索将结构化知识和符号方法相结合的LLM。
这个神经符号人工智能的研究领域探索了模型从经验中学*的能力以及从所学知识中进行推理的能力。
非常感谢您学*本课程。我们希望您喜欢这些课程,并迫不及待地想看到您运用这些知识构建出什么。
总结
本节课中我们一起学*了大型语言模型领域的未来展望。我们探讨了模型对齐与治理、效率优化技术以及多模态、长上下文等新兴能力的发展方向。这些进步将共同推动生成式人工智能走向更强大、更可靠、更易用的未来。
最后,让我们问问我们的AI,未来会怎样。






浙公网安备 33010602011771号