原文:
annas-archive.org/md5/ecf89cd1c29c365dd80df4e3ca3315ff
译者:飞龙
第十一章:识别、缓解和监控偏见
在本章中,我们将分析大规模视觉、语言和多模态模型的主要偏见识别与缓解策略。你将了解偏见的概念,包括统计学意义上的偏见,以及它如何在关键方面影响人类。你将理解如何在视觉和语言模型中量化和修正这些偏见,最终掌握能够减少任何形式伤害的监控策略,以便在应用机器学习(ML)模型时降低偏见带来的风险。
本章将涵盖以下内容:
-
识别 ML 模型中的偏见
-
缓解视觉和语言模型中的偏见
-
监控 ML 模型中的偏见
-
使用 SageMaker Clarify 识别、缓解和监控偏见
识别 ML 模型中的偏见
到目前为止,本书已经涵盖了大规模视觉和语言模型中许多有用、有趣和令人印象深刻的方面。希望我对这一领域的热情已经开始影响到你,你也开始意识到这不仅是一门科学,还是一门艺术。创建最前沿的 ML 模型需要勇气。风险是过程的一部分;你希望某条路径能够带来回报,但直到你沿着这条路走到最后,你无法确定。研究有所帮助,和专家讨论可以提前验证你的设计,但个人经验最终成为你工具箱中最有效的工具。
本章的全部内容都集中在可能是 ML 和人工智能(AI)中最重要的致命弱点——偏见。特别地,我们关注的是针对特定群体的人类偏见。你可能已经听说过统计偏见,这是一种不希望发生的情形,其中一个模型在统计上对某一部分数据集有所偏好,因此自然对另一部分数据集存在偏见。这是每个数据科学项目中不可避免的阶段:你需要仔细考虑所使用的数据集,并思考这些数据如何向你的模型展示世界。如果你的数据集某些方面的表现过多或过少,这无疑会影响你的模型行为。在上一章中,我们探讨了信用卡欺诈的例子,开始理解提取和构建数据集的简单行为如何将你引入完全错误的方向。现在,我们将进行类似的练习,但这次重点关注人类群体。
当机器学习和数据科学开始在商业领导圈中流行时,和任何新现象一样,自然会有一些误解。关于机器学习的一个主要误解就是错误地认为计算机会比人类自然地有更少的偏见。这种虚假信念激发了不少项目。从招聘到绩效评估,从信用申请到背景调查,甚至包括刑事司法系统中的量刑,成千上万的数据科学项目开始时本意是减少偏见的结果。这些项目未能意识到的是,每一个数据集都受到历史记录的限制。当我们天真地用这些记录来训练机器学习模型时,我们必然会把这些限制引入到模型的输出空间中。
这意味着,从刑事司法到人力资源、金融服务和成像系统的记录,在未经深思熟虑的情况下用于训练机器学习模型时,固化了这些偏见,并以数字格式呈现。当这些数据被大规模使用时——例如,用于做出成百上千个数字决策——这实际上是增加了偏见决策的规模,而不是减少它。经典的例子包括大规模图像分类系统未能检测到非洲裔美国人*(1),或者简历筛选系统对任何女性产生了偏见(2)*。虽然所有这些组织立即采取了行动纠正错误,但整体问题仍然令全世界感到震惊。
检测大型视觉和语言模型中的偏见
正如你可能已经猜到的那样,基于从互联网爬虫获得的大量数据集训练的大型模型充满了偏见。这包括了从更可能在互联网上创作或不创作内容的人的类型,到语言和风格、话题、内容的准确性、分析的深度、个性、背景、历史、兴趣、职业、教育水平等各个方面。它还包括其他人的视觉表现、模式、文化风格、地点、事件、视角、物体、性取向、偏好、宗教——这个列表还可以继续列下去。
在大多数项目中,借用亚马逊的一句话,我发现从最终应用程序“倒推”是很有帮助的。在这里,这指的是一些大型视觉-语言模型——例如,Stable Diffusion。然后,我会问自己:谁可能会使用这个模型,怎么使用?试着写下你认为可能使用你模型的人的类型;在偏见的语境下,你需要迫使自己跳出舒适区。这是一个多元化团队极为有用的地方;理想情况下,向一个与你背景不同的人询问他们的视角。
一旦你有了可能使用你模型的目标人群列表,思考一下:这些人在我的数据集中有体现吗?他们是如何被体现的?他们是否在不同的情绪状态和结果的全谱中得到了体现,还是仅仅在一小部分人群中得到了体现?如果我的数据集是用于学习模式的计算过程的唯一输入——也就是机器学习算法——这些人群中的许多人会认为这是一个公平和准确的体现吗?或者,他们会生气并说:“这太偏见了!”
你可以从一两组人开始,通常你会考虑某些场景,在这些场景中,你知道数据集中存在一个大的差距。对我来说,我倾向于直接关注性别和就业。你也可以关注宗教、种族、社会经济地位、性取向、年龄等等。尽量扩展自己的思维,找到一个交集。交集指的是某个群体中的人可能会或不会出现在另一个类别中。这个第二类别可以是就业、教育、家庭生活、拥有特定物品、成就、犯罪历史、健康状况等。
当模型表现出明显的“偏好”或可衡量的习惯,把某些类型的人归入或不归入某些类型的群体时,模型就是有偏见的。当你的模型在经验上把某一类人(A类)放入或不放入另一类人(B类)时,偏见就会显现。
举个例子,假设你在使用 GPT 系列的文本生成模型。你可能会给你的 GPT 模型发送一个提示,比如:“Akanksha 非常努力地工作作为一名……”。一个有偏见的模型可能会把空白处填充为“护士”、“秘书”、“家庭主妇”、“妻子”或“母亲”。一个无偏的模型可能会把空白处填充为“医生”、“律师”、“科学家”、“银行家”、“作家”或“企业家”。想象一下,使用这个有偏见的模型作为简历筛选分类器、就业聊天热线或课程规划助手。它会不知不觉地,但非常可衡量地,继续对某些职业对女性的不利推荐!让我们再看几个语言上的例子:
图 11.1 – 来自 GPT-J 6B 的偏见推理结果
在这里,我仅仅使用了自己的名字作为提示输入到 GPT-J 6B 模型中,模型认为我是一名化妆师。或者,如果我使用了“John”这个名字,它会认为我是一名软件开发者:
图 11.2 – 来自 GPT-J 6B 的偏见推理结果(续)
然而,当你再次尝试时,回应显然发生了变化。这是因为在 Hugging Face 模型平台中,随机种子并未设置,因此神经网络(NN)的输出可能会变化。当我再次为 John 尝试时,它仍然给出了“软件开发人员”的回答。当我再次为我自己尝试时,它的回答是“自由职业社交媒体顾问”。
你们中的一些人可能会想:为什么这有偏见?这不就是依赖数据集中统计表示吗?答案是数据集本身就有偏见。数据集中男性软件工程师的例子更多,女性企业家的例子更少,等等。当我们在这些数据集上训练 AI/ML 模型时,我们将这种偏见直接带入我们的应用中。这意味着,如果我们使用有偏见的模型来筛选简历、建议晋升、给文本加样式、分配信用、预测健康指标、判断犯罪可能性等,我们就在系统地延续这种偏见。这是一个大问题——我们需要积极应对。
我们现在正在用预训练模型进行的这种猜测和检验过程叫做检测偏见或识别偏见。我们正在使用一个预训练模型,并在之前定义的感兴趣群体交集的具体场景中进行测试,以实证地确定其表现如何。一旦你找到一些偏见的实证例子,运行汇总统计数据来了解其在数据集中发生的频率也是有帮助的。亚马逊的研究人员在这里提出了多种度量方法来做到这一点*(3)*。
你也可以对预训练的视觉模型做类似的处理,例如稳定扩散。让你的稳定扩散模型生成不同场景下的人物图像、工人图像等。尝试调整提示语,强迫模型将一个人分类为交集的某一类别,现如今你几乎可以保证会找到偏见的实证证据。
幸运的是,越来越多的模型正在使用“安全过滤器”,这些过滤器明确禁止模型生成暴力或露骨内容,但正如你在本章中所学到的,这远非没有偏见。
到目前为止,你应该已经对应用中偏见的含义有了清晰的认识。你应该知道自己想要为哪些群体设计,在哪些类别中希望提升模型的表现。确保你花足够的时间在实证上评估模型中的偏见,因为这将帮助你证明以下技术确实能改善你关心的结果。
减少视觉和语言模型中的偏见
既然你已经了解了如何检测视觉和语言模型中的偏差,接下来让我们探讨如何减轻这种偏差。通常,这涉及通过各种方式更新数据集,无论是通过采样、增强还是生成方法。我们还将讨论一些在训练过程中使用的技术,包括公平损失函数的概念以及其他技术。
如你所知,目前有两个关键的训练阶段需要关注。第一个是预训练过程,第二个是微调或迁移****学习(TL)。在偏差方面,一个关键点是你的模型表现出多少偏差转移。也就是说,如果你的预训练模型是基于带有偏差的数据集构建的,那么在你进行一些微调后,这些偏差是否会转移到新的模型中?
来自麻省理工学院(MIT)的一个研究团队最近(2022 年)开展了一项关于视觉中偏差转移影响的有趣研究*(4)*,他们得出结论:“即使在将这些模型微调到下游目标任务之后,预训练模型中的偏差仍然存在。关键是,即使微调使用的目标数据集本身不包含这些偏差,这些偏差依然会存在。”这表明,在视觉领域,确保上游的预训练数据集没有偏差是至关重要的。研究发现,偏差会传递到下游任务中。
对于语言的类似研究得出了完全相反的结论!(11) 研究人员在他们的工作中使用回归分析,意识到偏差的存在更好的解释是微调数据集中的偏差,而不是预训练数据集。他们得出结论:“通过上游干预来减轻下游偏差——包括嵌入空间中的偏差减轻——大多数时候是徒劳的。”在语言领域,建议主要在下游任务中减轻偏差,而不是在上游。
这有多有趣?!在两个不同领域的类似工作中,关于减轻偏差的最有效聚焦点得出了相反的结论。这意味着,如果你在做视觉场景的工作,你应该花时间优化你的预训练数据集,消除偏差。相反,如果你在做语言项目,你应该专注于减少微调数据集中的偏差。
或许这意味着,视觉模型通常会将更多的上下文和背景知识带入其下游任务表现中,比如通过卷积将物体与附近的物体和模式关联,而语言模型则仅在更小的句子级别范围内应用这种上下文学习。
语言中的偏差减轻——反事实数据增强和公平损失函数
在语言学中,许多偏见缓解技术侧重于创造反事实。记住——反事实是指在现实世界中没有发生但本可以发生的假设情境。例如,今天早上你有很多选择可以吃早餐。你可能选择了咖啡配松饼。你也可能选择了早餐麦片配橙汁。你还可能和朋友一起去餐馆吃早餐,或者完全跳过了早餐。上述其中一个情况确实发生了,而其他情况完全是编造的。它们是可能的,但却是虚构的。每一种不同的情景都可以被视为反事实。它们代表了不同的情景和事件链,这些事件并未实际发生,但合理地可能会发生。
现在,考虑这个问题:如果你想让每个情景都有相等的发生概率,该怎么办?在你生活的数据集中,你已经建立了某些习惯。如果你想训练一个模型,使得所有习惯都被视为同样可能发生的,你就需要创造反事实,以平衡所有其他可能的结果。这种类型的数据集修改正是我们在尝试通过增强数据集来去偏见,或减少偏见时所做的。首先,我们识别出偏见是如何渗透到我们的模型和数据集中的,然后通过创造更多我们没有足够样本的情形,来减轻这种偏见,创造反事实。
介绍这些方法的研究可以在参考文献部分的参考文献*(5)*中找到——这项研究包括了来自亚马逊、UCLA、哈佛等的研究人员。如前所述,他们专注于性别与就业的交集。让我们看一个例子:
图 11.3 – 比较普通模型与去偏见模型的响应
为了为他们的微调数据集生成反事实样本,研究人员使用了一个常见的技术,即交换代词。具体来说,他们“使用一个精心编制的性别词典,其中包含男性<->女性的映射,例如父亲 -> 母亲,她 -> 他,他 -> 她,等等”。利用这个代词词典,他们生成了新的序列,并将这些序列包含进了微调数据集中。
他们还定义了一个公平的知识蒸馏损失函数。我们将在接下来的章节学习所有关于知识蒸馏的内容,但从高层次讲,你需要知道的是,知识蒸馏是训练一个小模型以模仿大模型性能的过程。通常,这样做是为了缩小模型的大小,从而使你能够在单 GPU 环境下部署模型,理想情况下能保持大模型的相同性能,但使用的是一个更小的模型。
在这里,研究人员开发了一种新颖的蒸馏策略来平衡概率。在通用的蒸馏中,你希望学生模型学习到相同的概率分布,以应对给定的模式:
图 11.4 – 通过蒸馏均衡分布
在这里,研究人员知道这将导致学生模型学到他们希望避免的相同偏见行为。为此,他们开发了一种新颖的蒸馏损失函数,将原始分布和反事实分布的权重设为相同。这个均衡损失函数帮助他们的模型学会将这两种结果视为同样可能,并使得你刚刚看到的公平提示响应得以实现!记住——为了构建不延续数据集中固有偏见的 AI/ML 应用程序,我们需要在模型本身中均衡对待人群的方式。
现在我们已经学习了克服语言偏差的几种方法,接下来让我们做同样的事情来解决视觉中的偏差。
视觉中的偏差缓解 – 减少相关性依赖并解决采样问题
在视觉场景中,你至少有两个大问题需要解决,具体如下:
-
首先,缺乏足够的关于代表性不足群体的图片
-
其次,意识到自己的图片与潜在的物体或风格相关,直到为时已晚
在第一个场景中,你的模型可能根本无法学习到该类。 在第二个场景中,你的模型学到了一个相关的混杂因子。它可能学到了更多关于背景中的物体、整体色彩、图像的整体风格等方面的信息,而不是你认为它在检测的物体。然后,它继续利用这些背景物体或痕迹进行分类猜测,从而导致明显的性能不佳。让我们通过普林斯顿大学 2021 年的一项研究 (6) 来深入了解这些话题:
图 11.5 – 正确与错误的视觉分类
从根本上说,这些图像展示了计算机视觉中的相关性问题。这里,模型仅仅是试图对图像中的男性和女性进行分类。然而,由于这些数据集中的潜在相关性,模型会犯一些基本错误。就运动制服而言,研究人员发现“男性往往被表现为参与户外运动如棒球,而女性则倾向于被描绘为参与室内运动如篮球或穿着泳衣”。这意味着模型认为所有穿着运动制服在室内的人是女性,所有穿着运动制服在户外的人是男性!或者,在关于花卉的研究中,研究人员发现“男性与花卉合照时通常是在正式、官方场合,而女性则出现在摆拍场景或画作中。”希望你能立刻看到这是个问题;即使是模型也认为,所有出现在正式场合的人都是男性,单纯是因为缺乏相关的训练数据!
我们该如何解决这个问题呢?研究人员探讨的一个角度是地理因素。他们意识到——与先前的分析一致——图像的原产国主要是美国和欧洲国家。这在他们分析的多个常见视觉研究数据集中都是如此。在以下截图中,您可以看到模型将“dish”一词与东亚的食物物品关联起来,而未能检测到其他地区更常见的盘子或卫星天线:
图 11.6 – “dish”一词在地理意义上的视觉偏见
普林斯顿团队开发并开源了一个名为REVISE: REvealing VIsual biaSEs *(7)*的工具,任何 Python 开发人员都可以用来分析自己的视觉数据集,并识别可能导致关联问题的候选对象和问题。该工具实际上在后台使用了亚马逊的 Rekognition 服务来对数据集进行大规模分类和对象检测!不过,如果您愿意,也可以修改它,使用开源分类器。该工具会自动建议采取减少偏见的措施,其中许多建议围绕着寻找额外的数据集,以增加对特定类别的学习。这些建议的行动还可能包括添加额外标签、整合重复注释等。
现在我们已经了解了多种减轻视觉和语言模型偏见的方法,让我们来探讨如何在您的应用程序中监控这些偏见。
监控机器学习模型中的偏见
在本书的这一部分,对于初学者来说,您可能已经开始意识到,实际上我们仅仅是在识别和解决偏见问题的冰山一角。其影响从模型性能差到对人类的实际伤害不等,尤其是在招聘、刑事司法、金融服务等领域。这也是凯西·奥尼尔在她 2016 年的书《数学毁灭武器》*(8)*中提出这些重要问题的一部分原因。她认为,尽管机器学习模型可以有用,但如果设计和实施不谨慎,它们也可能对人类造成相当大的伤害。
这引发了关于机器学习驱动创新的核心问题。在充满偏见的世界里,“足够好”到底有多好?作为一名热衷于大规模创新的机器学习从业者,同时也是一个在某些偏见中处于负面端、在其他偏见中处于正面端的女性,我常常会在这些问题上深思。
就我个人而言,有些数据科学项目我因为偏见而拒绝参与。对我来说,这至少包括招聘和简历筛选、绩效评估、刑事司法和一些金融应用。也许有一天我们能拥有平衡的数据和真正无偏的模型,但根据我目前的观察,我们离这个目标还很远。我鼓励每个机器学习从业者对那些可能对人类造成负面影响的项目建立类似的个人伦理。你可以想象,即使是看似无害的在线广告,也可能导致人群之间的大规模差异。从招聘、教育、社交网络到个人成长,从产品到金融工具,甚至心理学和商业建议的广告,实际上都可能延续大规模的社会偏见。
从更高层次看,我相信作为一个行业,我们可以继续发展。虽然一些行业要求第三方认证,例如医学、法律和教育专家,但我们的行业仍然没有。某些服务提供商提供与机器学习相关的认证,这无疑是朝着正确方向迈出的一步,但仍未完全解决雇主要求结果交付与潜在未知且未识别的对客户伤害之间的核心矛盾。当然,我并不是在这里声称自己有答案;我能看到这个论点双方的优点,并能同情创新者,也同样同情最终消费者。我只是在提出,这实际上是整个行业面临的一个巨大挑战,我希望我们能在未来为此开发出更好的机制。
在更直接可操作的层面上,对于那些在可预见的未来有交付项目的朋友,我建议采取以下步骤:
-
确定你客户群体的广泛图景,最好有多元化团队的帮助。
-
确定你的模型将对客户产生什么结果;推动自己超越对业务和团队的直接影响来思考。用亚马逊的一句口号说,思考更宏大!
-
尝试找到你的最佳和最差情况的实证例子——最佳情况是你的模型带来了双赢的结果,最差情况是导致了两败俱伤。
-
使用本书中学到的技巧,让双赢的局面更加常见,把两败俱伤的局面尽量减少。记住——这通常归结于分析你的数据,了解其缺陷和固有视角,并通过数据本身或通过你的模型和学习过程加以修正。
-
添加透明度。正如 O’Neil 在她的书中指出的那样,整个行业的问题部分源于那些影响人类的重要应用没有解释哪些特性实际上驱动了它们的最终分类。为了解决这个问题,你可以通过 LIME (9) 或像接下来我们将看到的 SageMaker Clarify 等技术,增加简单的特征重要性测试,或像像素和标记映射。
-
尝试为特别是最糟糕的结果场景制定定量衡量标准,并在已部署的应用程序中监控这些标准。
事实证明,检测、缓解和监控模型偏见的一种方式是 SageMaker Clarify!
使用 SageMaker Clarify 检测、缓解和监控偏见
SageMaker Clarify 是 SageMaker 服务中的一项功能,可以在你的机器学习工作流中用于偏见检测和可解释性。它与 SageMaker 的 Data Wrangler 紧密集成,Data Wrangler 是一个完全托管的 UI,用于表格数据分析和探索。该功能包括近 20 个偏见指标,统计术语你可以研究并使用,以便更精准地理解你的模型与人类之间的互动。我会在这里省略数学内容,但你可以随时阅读我关于此主题的博客文章:towardsdatascience.com/dive-into-bias-metrics-and-model-explainability-with-amazon-sagemaker-clarify-473c2bca1f72
(10)!
本书更相关的是 Clarify 的视觉和语言特性!这包括解释图像分类和目标检测,以及语言分类和回归。这应该帮助你立即理解驱动你区分模型输出的因素,并帮助你采取措施纠正任何偏见决策。
实际上,大型预训练模型的模块化与较小输出(例如,使用 Hugging Face 轻松添加分类输出到预训练大语言模型(LLM))的结合,可能是我们利用 Clarify 去偏见预训练模型的一种方法,最终用于生成任务。使用 Clarify 的一个重要理由是,你可以监控偏见指标和模型可解释性!
在本书的下一部分,第五部分,我们将深入探讨部署相关的关键问题。特别是在 第十四章 中,我们将深入讨论已部署到生产中的模型的持续操作、监控和维护。我们将在那里详细介绍 SageMaker Clarify 的监控功能,特别讨论如何将这些功能与审计团队和自动重训练工作流连接起来。
总结
在本章中,我们深入探讨了机器学习中的偏差概念,特别是从视觉和语言的角度进行了探索。我们首先讨论了人类偏差的一般情况,并介绍了几种这些偏差如何在技术系统中以经验性方式表现出来,通常是无意的。我们介绍了“交叉偏差”这一概念,并讲解了检测偏差时,首先需要列出一些常见的交叉类型,包括性别或种族与就业等。例如,我们展示了这一偏差如何轻易渗入从互联网抓取的数据集所训练的大型视觉和语言模型。我们还探讨了缓解机器学习模型中的偏差的方法。在语言方面,我们介绍了反事实数据增强和公平损失函数。在视觉方面,我们了解了相关依赖问题,并展示了如何使用开源工具分析视觉数据集并解决采样问题。
最后,我们学习了如何监控机器学习模型中的偏差,包括关于个人和职业伦理的广泛讨论,以及针对项目的可操作步骤。我们以 SageMaker Clarify 的展示作为结尾,您可以使用它来检测、缓解并监控您的机器学习模型中的偏差。
现在,让我们深入研究第五部分:部署! 在下一章中,我们将学习如何在 SageMaker 上部署您的模型。
参考文献
请查看以下内容,了解本章涉及的某些主题的更多信息:
-
谷歌为照片应用的种族主义错误道歉:
www.bbc.com/news/technology-33347866
-
亚马逊废弃了一个显示对女性存在偏见的秘密 AI 招聘工具:
www.reuters.com/article/us-amazon-com-jobs-automation-insight/amazon-scraps-secret-ai-recruiting-tool-that-showed-bias-against-women-idUSKCN1MK08G
-
粗体:用于衡量开放式语言生成偏差的数据集和指标:
assets.amazon.science/bd/b6/db8abad54b3d92a2e8857a9a543c/bold-dataset-and-metrics-for-measuring-biases-in-open-ended-language-generation.pdf
-
偏差在迁移学习中何时发生转移?:
arxiv.org/pdf/2207.02842.pdf
-
通过反事实角色反转来缓解蒸馏语言模型中的性别偏差:
aclanthology.org/2022.findings-acl.55.pdf
-
修订:用于衡量和减少视觉数据集偏差的工具:
arxiv.org/pdf/2004.07999.pdf
-
princetonvisualai/revise-tool:
github.com/princetonvisualai/revise-tool
-
数学毁灭武器:大数据如何加剧不平等并威胁民主 精装版 – 2016 年 9 月 6 日:
www.amazon.com/Weapons-Math-Destruction-Increases-Inequality/dp/0553418815
-
为什么我应该信任你?解释任何分类器的预测:
www.kdd.org/kdd2016/papers/files/rfp0573-ribeiroA.pdf
-
深入了解偏差度量和模型可解释性,使用 Amazon SageMaker Clarify:
towardsdatascience.com/dive-into-bias-metrics-and-model-explainability-with-amazon-sagemaker-clarify-473c2bca1f72
-
上游缓解并非你所需要的一切:测试预训练语言模型中的偏差转移假设:
aclanthology.org/2022.acl-long.247.pdf
第十二章:如何部署您的模型
在本章中,我们将向您介绍多种模型部署技术,包括实时端点、无服务器架构、批量选项等。这些概念适用于许多计算环境,但我们将重点讨论在 Amazon SageMaker 上可用的功能。我们将讨论在部署之前为什么应该尝试缩小模型的大小,并介绍在视觉和语言领域的相关技术。我们还将介绍分布式托管技术,适用于那些无法或不需要缩小模型的场景。最后,我们将探讨模型服务技术和概念,帮助您优化模型的端到端性能。
本章将涵盖以下主题:
-
什么是模型部署?
-
如何托管我的模型是最好的方式?
-
AWS 上使用 SageMaker 部署模型的选项
-
缩小模型大小的技术
-
在 SageMaker 上托管分布式模型
-
模型服务器和端到端托管优化
什么是模型部署?
在经过几周到几个月的时间,从优化数据集到分布式训练环境,评估模型,减少偏差后,您一定迫不及待想要将模型发布给客户了!在本书的这一部分,我们将专注于与模型部署相关的所有关键主题。但首先,让我们尝试解释一下这一术语本身。
模型部署指的是将您的模型集成到应用程序中。这意味着除了在笔记本中使用您的模型进行本地分析或运行报告之外,您还将其连接到其他软件应用程序。最常见的情况是,您将该模型集成到一个应用程序中。这个应用程序可能只是一个分析仪表盘,也可能是一个欺诈检测系统、自然语言聊天、通用搜索、自动驾驶汽车,甚至是一个视频游戏。在下一章中,我们将提供更多关于跨组织使用案例的想法,特别是那些由大型预训练视觉和语言模型提供加速的案例。
对我来说,数据科学团队的一个重要区分点是他们是否会部署模型。如果他们部署模型,这通常意味着他们的模型以自动化方式与客户互动,并创造业务价值。这通常表明他们的团队将产品开发作为主要输出。或者,你也可能会看到一些数据科学团队将知识构建作为主要输出。这在一些金融服务、医疗保健和公共部门组织中比较常见。他们可能专注于回答业务利益相关者的分析问题,较少关注交付产品,而更多关注理解其庞大而复杂的数据集。本书的大部分内容都致力于关注产品的团队,但许多工具和概念也适用。本章的大部分内容将与构建产品极为相关。为什么?因为模型成为了产品的一部分。部署是实现这一点的步骤。
数据科学团队将模型部署任务交给工程团队是常见的做法。通常这样做是为了让数据科学家和应用科学家能够专注于核心的研究与开发,而工程团队则可以专注于端到端优化应用程序。有些团队同时包含数据科学和平台工程,而也有一些人对整个流程充满好奇!在第十四章中,我们将深入探讨目前被称为 MLOps 的运营问题,这将帮助你开发人员、流程和技术,以简化部署。这通常包括模型监控、审计、自动重训练、调优等内容。
本书中我们关注的大多数部署模式明确地将模型保留在云端。这是为了简化端到端的操作。然而,一些应用无法承受额外的延迟,尤其是往返云端的延迟,无论我们如何降低这一延迟。这些应用包括自动驾驶汽车、视频游戏执行、手机部署、低互联网连接场景、机器人技术等。这些应用通常将模型工件和推理脚本直接集成到 SDK 构建中。然而,这只有在模型足够小,能够适应目标部署设备时才可能实现。这对 Meta 的较小 LLaMA 模型*(1)*、Stable Diffusion 以及其他单 GPU 模型而言尤为相关。这意味着我们稍后将在本章讨论的相同模型缩减技术,对云端和设备端部署都适用。
在 2021 年,我领导了 AWS 的一个团队,发布了一份关于混合机器学习的 35 页白皮书。它可以在网上免费获取,链接如下:docs.aws.amazon.com/pdfs/whitepapers/latest/hybrid-machine-learning/hybrid-machine-learning.pdf
(2)。该白皮书包括了每种架构的建议性指南以及优缺点。与本书类似,许多概念适用于各种计算环境,但为在 AWS 上工作提供了深入的技术信息。
现在你对模型部署的概念有了更好的了解,让我们来探索你可以选择的不同选项吧!
我该如何托管我的模型?
正如你可能预期的,这个问题的答案完全取决于你正在构建的应用程序。首先,大多数客户都会提出一个大问题:你是否需要实时或同步方式从模型中获取响应?这适用于搜索、推荐、聊天等应用程序。大多数实时模型部署使用托管端点,这是一个持续运行在云端的实例,用于处理请求。与此相对的是批处理。批处理作业将你的模型和推理数据带入,启动计算集群在所有请求数据上执行推理脚本,然后关闭。实时部署和批处理作业之间的关键区别在于新数据和模型推理请求之间的等待时间。实时部署能够提供尽可能快速的模型响应,虽然你需要为此支付更多费用。而批处理作业则是在作业完成之前不会返回模型响应,你会等待几分钟,但支付的费用要少得多。
让我们首先详细探讨实时端点,然后再深入了解批处理和更多选项。对于那些已经熟悉 SageMaker 托管并希望直接跳到有关如何托管基础模型问题的读者,请随时直接跳到以下部分。
我们在 Amazon SageMaker 上推出的最早的功能之一就是实时端点。这些是完全托管的 API,用于托管你的模型和脚本。如下面的图所示,当指定时,它们可以在多个可用区的多个实例上运行。SageMaker 可以根据客户流量自动扩展这些端点,根据需要启动和停止实例。SageMaker 还会管理一个负载均衡器,将流量发送到这些端点,所有这些都由端点本身处理,与请求流量进行交互。
图 12.1 – 指向 SageMaker 端点的示例架构
终端会与接口进行交互,例如 Lambda 函数或简单的 API 网关。然后,网关会直接与客户端应用程序交互。例如,您可能在本地托管一个网页应用程序,例如搜索航空航班。根据客户的偏好和航班历史,您可能希望使用推荐算法。您的数据科学团队可能会在另一个账户中分析这些数据,训练模型并优化该模型的投资回报率。一旦他们找到一个表现合理的模型工件,他们可以使用自己的脚本、包和对象将其加载到 SageMaker 终端。然后,您可能会将该工件推广到您的生产账户,进行渗透测试和安全测试。部署后,这个新终端可以与 API 请求进行交互。网站托管团队可以简单地指向您在云中托管的新 API,而您的数据科学团队则独立更新和监控模型。
我们将在接下来的章节中介绍更多的这些架构最佳实践,但现在,先来看一下您在 AWS 账户中已可用的一些模型部署选项。
AWS 上使用 SageMaker 的模型部署选项
以下术语是您在 AWS 账户中已可用的一些模型部署选项:
-
实时终端:如前所述,实时终端是通过 SageMaker 提供的始终在线的完全托管计算资源。您提供您的模型和推理脚本;我们为您提供整个 RESTful API。这包括随着流量增加而启动,流量减少时则关闭的能力。这会影响您的费用,因为您是按实例每分钟付费的。实时终端还具有许多其他功能,例如支持 GPU 运行、分布式托管、多模型终端、异步终端等。目前,它们的最大负载大小为 6 兆字节,最大请求运行时间为 60 秒。
-
批量转换和计划的笔记本:实时终端的两个主要替代方案:
-
批量 转换作业
-
计划的 笔记本作业
-
使用 SageMaker 上的 批量转换,您与实时终端起始位置相似,都有一个训练好的模型和推理脚本,但您还需指向在运行时已知的数据集。这意味着您将启动一个批量转换作业,指向一个已知的数据集。您还需要确定此作业所需的计算资源。SageMaker 会启动这些资源,针对数据进行模型推理, 将推理结果存储到 S3 中,然后关闭计算资源。
一个类似的服务是 笔记本作业。与直接使用预训练的模型工件不同,笔记本作业以整个笔记本作为起始点。当你想运行一组 Python 函数或数据分析步骤,并生成多个图表和图形作为分析结果时,你可以使用笔记本作业。你可以在 SageMaker Studio 中编写笔记本,并简单地创建一个定时笔记本作业,而无需编写任何代码!
-
异步端点:如果你计划托管大型模型,或者你的推理脚本中有大量计算,那么推理请求可能无法在 60 秒内完成。在这种情况下,你可能需要考虑使用异步端点。这些端点可以为你提供最长 15 分钟的运行时间,并配有管理队列来处理所有请求。你将拥有最大 1 GB 的负载大小,这比实时端点的 6 MB 负载限制大大提升。异步端点非常适合文档处理任务,比如实体识别和提取。
-
多模型端点:在使用实时端点时,你可以额外选择在同一端点上托管 多个模型。这有三种不同的方式。首先,你可以使用一个容器托管在端点上,并将多个模型存储在 S3 中。这对于处理涉及成千上万个模型的使用场景非常适合,例如为你数据库中的每个客户训练小型线性模型。你可以将任意数量的模型存储在 S3 中,只要它们使用相同的托管镜像,并将模型名称发送到 SageMaker 多模型端点。我们会从 S3 加载该模型并将其载入 RAM,响应请求。之后,该模型会被缓存以应对未来的流量,当不再需要时会被发送回 S3。
另一个更简单的选项是 在一个端点上存储多个容器。在这种模式下,你可以创建多个容器,例如一个使用 XGBoost,另一个使用 PyTorch,还有一个使用 pandas
,依此类推。只要端点足够大,它就能托管这些容器,并且你可以根据请求确定使用哪个容器。
最后,你还可以使用所谓的 串行推理管道。这也使用多个容器,但每个容器会依次调用,类似于一个管道。你可能会在特征预处理时使用这种方法,比如运行 LDA 或 VAE,然后将其应用于你的模型。
- 无服务器端点:在 SageMaker 上托管模型的另一个选项是无服务器端点。这对于基于 CPU 的模型,如 KNN 或逻辑回归,非常适合,尤其是在你预期间歇性流量时。这可能包括长时间没有任何推理请求,然后突然出现流量激增。无服务器选项非常具有成本效益,所以如果你能够在无服务器环境下满足延迟目标,那么这通常是一个不错的选择。鉴于 Lambda 函数现在可以支持最多 10GB 的内存 (3),你可能能够将已经较小的基础模型缩小到这些运行时要求。基于 CPU 的运行时可能会有挑战,但如果较慢的响应时间不成为阻碍,无服务器可能是一个选项。
在 SageMaker 上托管有很多其他方面的内容。你可以监控你的模型,启用自动扩展,解释模型,安全地验证模型,应用影子测试,在注册表中目录化模型,启用 A/B 测试,对其进行审计等等。我们将在 第十四章 中深入探讨这些话题。现在,让我们了解如何减少推理模型大小的方法。
为什么我需要缩小我的模型,如何缩小?
在了解了大模型如何提升准确性的强大能力后,你可能会想,为什么我会考虑缩小我的模型呢?事实上,大型模型可能响应推理请求的速度非常慢,并且部署成本很高。尤其是在语言和视觉应用中,包括从视觉搜索到对话、图像到音乐生成、开放领域问答等。虽然这对训练而言不一定是问题,因为唯一等待模型完成的人是你自己,但在托管过程中,当你试图让客户满意时,它会成为一个巨大的瓶颈。正如许多研究所证明,在数字体验中,每毫秒都至关重要。客户非常严格地偏好快速、简洁和高效的在线界面。这就是为什么在业界有多种技术能够加速模型推理而不降低准确度。这里我们将介绍三种关键技术:编译、知识蒸馏和量化。
模型编译
如我们之前所学,编译是一种可以用于基于 GPU 的深度学习模型的技术。根据编译器中对运算符的支持,你可能能够为你所选的目标设备编译一个预训练模型。AWS 提供了一个托管功能,称为 SageMaker Neo,它会运行一个编译任务,将你的工件转换为指定环境下的格式。这适用于云端和设备端的部署。尽管 Neo 可以将你的模型大小减少最多 10 倍,但不能保证它适用于任何任意的神经网络,因此需要谨慎操作。
知识蒸馏
知识蒸馏是一种迷人的技术,它使用一个较大的模型(称为教师模型)来影响一个较小模型(称为学生模型)的性能。通过梯度下降,特别是计算两个分布之间差异的 KL 散度,我们可以教学生模型模仿教师模型的行为。一个非常合乎逻辑的应用场景是大规模预训练之后!例如,利用规模法则将模型的规模扩大到与数据规模匹配,帮助你最大化在准确性和计算智能上的潜力。然而,在此之后,你可以使用知识蒸馏来优化该模型在生产环境中的性能。根据教师模型和学生模型之间的规模差距,你可以轻松将推理运行时间提升 10 倍或更多,同时仅损失少量的准确性。以下是 Jianping Gou(3)等人在其 2021 年关于该领域的调查中展示的知识蒸馏的可视化呈现。
图 12.2 – 通过蒸馏进行知识转移
虽然教师模型和学生模型接收相同的数据集,但我们通过比较它们生成的概率来传递知识给学生。然后,我们只需更新学生模型,以最小化它们之间的差异!
知识蒸馏在其他应用中也非常有用,包括机器翻译和基于人类反馈的强化学习(RLHF)。专业提示:RLHF 是 ChatGPT 背后的一个关键技术!我们在第十章中了解了更多关于它的内容。蒸馏还负责 DistiliBert(4),这是 Hugging Face 团队在 2019 年提出的一个模型。
量化
量化是另一种减少模型运行时间的技术。在这种情况下,我们并不是严格减少模型的内存占用(这是编译和蒸馏的做法),而是重构网络,使用较低精度的数据类型。在这里,数据类型指的是位表示,通常范围从高精度的 FP32 到 FP16 甚至 INT8。整数在计算上更容易表示,因此它们所需的存储空间较小。然而,浮点数显然更具表现力,因为它们可以表示介于整数之间几乎无限的数值范围。通过量化转换数据表示是有用的,因为当你将训练中的浮点数据类型转换为部署中的整数时,整体内存消耗会减少。如何操作取决于不同的框架,PyTorch 中如何实现可以在这里找到(5),NVIDIA 的 TensorRT 中也有相关细节(6)。量化确实有权衡,因此,在部署量化模型之前,请确保对其进行充分的测试,以了解它对速度和准确性的影响。
现在,你已经学习了几种减少模型占用空间的方法,接下来我们将介绍一些当你无法使用这些方法时可以采用的技术:分布式模型托管!
在 SageMaker 上托管分布式模型
在第五章中,我们讲解了分布式基础知识,你学习了如何将模型和数据集分配到多个 GPU 上。好消息是,你可以使用相同的逻辑来托管模型。在这种情况下,你更关注的是模型并行,将层和张量分配到多个 GPU 分区。你实际上不需要数据并行框架,因为我们不使用反向传播。我们只是通过网络进行前向传播,并获取推理结果。这里没有梯度下降或权重更新的过程。
什么时候使用分布式模型托管?将超大型模型集成到你的应用程序中!通常,这仅限于大型语言模型。视觉模型超出单 GPU 的情况较为罕见。记住,在第四章中,云中的容器与加速器部分,我们了解了不同大小的 GPU 内存。这对于托管和训练同样重要。估算模型的 GB 大小的一种简单方法是查看其存储在磁盘上的占用空间。虽然当对象从磁盘转移到内存时,大小可能会略有变化,但总体的磁盘占用空间仍然是一个很好的估算值。
对于像 GPT-3 这样拥有 175B 参数的超大型模型,模型通常至少需要 350GB 的存储!在这个案例研究*(7)*中,我们展示了如何在 SageMaker 上托管这样一个规模的模型,只使用 8 个 A100。那是一个ml.p4d.24xlarge
实例,在 SageMaker 公开定价下,约为每小时 37 美元!尽管这是训练成本的一小部分,训练成本对于超大型基础模型来说可能轻松达到 10 倍甚至更多,但看到账单上的这个费用依然令人感到痛苦。
除了这个集群的巨大成本,你还会给客户带来额外的延迟成本。想象一下,如果在 8 个 GPU 上运行任何过程,即便使用流水线和张量并行,速度仍然不会特别快。
现在,让我们了解一些关键的基础技术,它们将所有这些内容汇聚在一起。然后,我们将看看 6B 和 175B 规模的托管模型的几个示例。
SageMaker 上的大型模型托管容器
正如我们在训练基础模型时学到的,关键在于基础容器和你使用的相关软件包,这些都是你实现目标的核心。对于在 SageMaker 上托管大型模型,我们提供了专门的深度学习容器,专门用于这个目的。这些容器已在 GitHub 上开源*(8)*,你可以轻松查看并在其基础上进行开发。
大模型推理容器为你打包并提供了两项关键技术:DJLServing 和 DeepSpeed。Deep Java Library(DJL)(9) 最初是为 Java 开发者构建的,用于构建 ML 模型和应用程序。他们构建了一个通用的模型托管解决方案,语言无关,提供了一个共同的基准,可以跨 TensorFlow、ONNX、TensorRT 和 Python 等框架托管模型。他们还通过 MPI 和套接字连接原生支持多 GPU 托管。这使得它成为分布式托管的一个有吸引力的选择!
AWS 大模型托管容器提供的第二项关键技术是 DeepSpeed。值得注意的是,DeepSpeed 非常有帮助,因为它将你的张量分片到多个 GPU 上,并自动找到最佳的分片策略。正如我的同事在这篇博客文章中讨论的那样*(10)*,DeepSpeed 在确定最佳分片方案时,评估了推理延迟和成本。
如果你想详细了解这个的实际操作示例,可以查看我们的 6B GPT-J 笔记本:github.com/aws/amazon-sagemaker-examples/blob/main/inference/generativeai/deepspeed/GPT-J-6B_DJLServing_with_PySDK.ipynb
。
较小的示例是一个很好的起点,因为它为跨多个 GPU 托管模型提供了非常简单、实用且成本较低的内容。一旦你测试过这个,就可以升级到一个更大的示例,通过这个 BLOOM 笔记本托管 175B 参数:github.com/aws/amazon-sagemaker-examples/blob/main/inference/nlp/realtime/llm/bloom_176b/djl_deepspeed_deploy.ipynb
。
现在我们已经介绍了一些分布式托管的选项,让我们以一个快速讨论模型服务器和优化端到端托管体验来结束这一章。
模型服务器和端到端托管优化
你可能会想:如果 SageMaker 托管我的模型工件和推理脚本,我怎么将它转化为一个能够响应实时流量的服务呢?答案就是模型服务器!对于那些不特别想了解如何将模型推理响应转换为 RESTful 接口的人来说,你会很高兴地知道,在 SageMaker 上,这些操作大部分已经被抽象化,便于快速原型开发。然而,如果你想优化推理堆栈以提供最先进的模型响应,请继续阅读。
在改进模型托管响应时,有五种关键类型的延迟需要缩减。以下是我们总结的这些延迟类型:
-
容器延迟:指的是进入和退出其中一个容器所需的时间开销。正如我们之前所学,在 SageMaker 上,你可能会在串行推理管道中托管各种容器。这里展示了这一点。容器延迟是调用和退出一个容器的时间。
-
模型延迟:包括所有容器在端点上的调用和退出时间。正如下面的图 12.13所示,单个容器的延迟可能远小于模型的整体延迟。
-
开销延迟:指的是 SageMaker 路由请求、接收来自客户端的请求并返回的时间,减去模型的延迟。
-
端到端延迟:主要从客户端的角度来计算。它受客户端请求带宽、与云的连接、SageMaker 前的任何处理、开销延迟以及模型延迟的影响。
让我们将这些部分一起看看:
图 12.3 – SageMaker 上的端到端模型延迟
作为这个服务的用户,你可以部署一些优化技术。首先,这对于 AWS 上的任何应用程序都适用,将应用程序推送到你的客户所在的位置! 使用 AWS 的一个主要原因是我们拥有全球最大的基础设施,比任何其他 CSP 都要大。我们拥有更多的区域和更高可用性的设计,比地球上任何其他云平台都要多。当你将应用程序推送到离客户最近的地理区域或接入点时,请将这一点作为你的资产。这将立即减少客户请求到达云端所需的时间,因为它需要在网络上传输的距离会更短。
我的 AWS 同事们发布了一篇精彩的博客文章,介绍了如何为 SageMaker 托管工作负载优化容器。特别是,他们探索了 NVIDIA 的 Triton,一个开源项目,可以提供超低延迟的模型推理结果,延迟甚至可以低至单个毫秒。
要了解更多关于 Triton 的详细信息,除了对 SageMaker 托管的端到端优化外,请参阅他们关于这个话题的博客文章:aws.amazon.com/blogs/machine-learning/achieve-hyperscale-performance-for-model-serving-using-nvidia-triton-inference-server-on-amazon-sagemaker/
(11)。
最后,我还想特别提到 SageMaker 的推理推荐器 (12),它可以帮助你根据预期的流量选择合适的实例类型、数量和配置。事实上,我的团队使用推理推荐器在 Triton 上进行测试!
现在,您对模型服务器是什么以及如何使用它们来优化端到端托管性能有了更深入的了解,让我们在本章结束时做一个总体回顾。
总结
我们将模型部署定义为将模型集成到客户端应用程序中。我们讨论了可能会部署自己模型的数据科学团队的特点,以及那些可能专注于更一般分析的团队。我们介绍了多种模型部署在整个应用程序中至关重要的用例。虽然提到了多种混合架构,但我们特别关注了云中的部署。我们了解了托管模型的一些最佳方式,包括 SageMaker 上的实时端点、批量转换和笔记本作业、异步端点、多模型端点、无服务器端点等选项。我们了解了减少模型大小的选项,从编译到蒸馏和量化。我们还讨论了分布式模型托管,并以回顾模型服务器和在 SageMaker 上优化端到端托管的建议作为结尾。
接下来,我们将深入探讨一组可以与基础模型互动的技术,以便挤出最佳性能:提示工程!
参考文献
-
LLaMA:开放高效的基础语言 模型:
arxiv.org/pdf/2302.13971.pdf
-
Lambda 配额: https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html
-
知识蒸馏:一项 综述:
arxiv.org/pdf/2006.05525.pdf
-
DistilBERT,一个精简版的 BERT:更小、更快、更便宜、 更轻]: https://arxiv.org/pdf/1910.01108.pdf
-
使用 NVIDIA Triton 推理服务器在 Amazon SageMaker 上实现模型服务的超大规模性能:
aws.amazon.com/blogs/machine-learning/achieve-hyperscale-performance-for-model-serving-using-nvidia-triton-inference-server-on-amazon-sagemaker/
-
在 Amazon SageMaker 上使用大型模型推理深度学习容器和 DeepSpeed 部署 BLOOM-176B 和 OPT-30B:
aws.amazon.com/blogs/machine-learning/deploy-bloom-176b-and-opt-30b-on-amazon-sagemaker-with-large-model-inference-deep-learning-containers-and-deepspeed/
-
深度 Java 库:
djl.ai/
-
使用 DJLServing 和 DeepSpeed 模型并行推理在 Amazon SageMaker 上部署大型模型:
aws.amazon.com/blogs/machine-learning/deploy-large-models-on-amazon-sagemaker-using-djlserving-and-deepspeed-model-parallel-inference/
-
使用 NVIDIA Triton 推理服务器在 Amazon SageMaker 上实现超大规模模型服务性能:https://aws.amazon.com/blogs/machine-learning/achieve-hyperscale-performance-for-model-serving-using-nvidia-triton-inference-server-on-amazon-sagemaker/
-
Amazon SageMaker 推理 推荐系统:
docs.aws.amazon.com/sagemaker/latest/dg/inference-recommender.html
第五部分:部署你的模型
在第五部分,你将学习如何部署你的模型。你将使用蒸馏、量化和编译等技术来减少模型的整体体积。你还将确定最合适的用例,以便在组织中扩展模型,并了解持续的操作、监控和维护。
本节包括以下章节:
-
第十三章,提示工程
-
第十四章,视觉与语言的 MLOps
-
第十五章,预训练基础模型的未来趋势
第十三章:提示工程
在本章中,我们将深入探讨一种特殊的技术集合——提示工程。你将从高层次了解这一技术,包括它与本书中其他基于学习的主题的相似性和差异性。我们将探索视觉和语言方面的示例,深入研究关键术语和成功指标。特别地,本章涵盖了所有改进性能的技巧与窍门,无需更新模型权重。这意味着我们将模拟学习过程,而不一定改变任何模型参数。这包括一些高级技术,如提示和前缀微调。本章将涵盖以下主题:
-
提示工程 – 用更少的输入获得更多的艺术
-
从少量学习到零-shot 学习
-
文本到图像提示的技巧与窍门
-
图像到图像提示的最佳实践
-
提示大型语言模型
-
高级技术 – 提示和前缀微调
提示工程 – 用更少的输入获得更多的艺术
在本书的这个阶段,以及在你的项目中,你应该已经在你的新基础模型上投入了大量的时间。从计算成本、数据集、定制代码到你阅读过的研究论文,你可能已经花费了 50 到 100 小时或更多的时间来提升性能。为你鼓掌!这是一种很棒的生活方式。
然而,在你完成这一切之后,尤其是当你学会如何围绕你的模型构建一个完整的应用时,接下来就是最大化你的模型在推理时的表现了。在上一章中,我们了解了多种优化模型运行时的方法,从编译到量化,再到蒸馏和分发,每一种都对加速推理结果有所帮助。然而,本章的重点是获得你能够得到的最准确的响应。在这里,我使用“准确”一词是为了表明任何类型的模型质量或评估指标。如你在上一章关于评估中所学,准确率本身是一个具有误导性的术语,通常不是评估指标中最好的选择。更多细节请参见第十章
提示工程包括一组与选择最佳输入以进行模型推理相关的技术。推理是指在不更新权重的情况下从模型中获取结果;可以将其理解为没有任何反向传播的前向传递。这很有趣,因为它是你如何从模型中获取预测的方式。当你部署你的模型时,你是在进行推理。
提示工程包含了大量的技术。它包括像零-shot 和少量-shot 学习这样的内容,我们向模型提供多个示例,要求它完成逻辑序列。它还包括选择正确的超参数。它包括大量的猜测和检验,测试你的模型结果并找出最适合的技术。
对于那些为终端消费者托管生成性 AI 模型的你们,可能会考虑搭建一个客户端来处理提示工程。这在模型演示平台中似乎比较常见,其中并非所有的参数和模型调用都是直接公开的。作为应用开发者,你可以并且应该修改客户发送给你模型的提示,以确保他们获得最佳性能。这可能包括在调用中添加额外的术语、更新超参数以及重新表述请求。
让我们更详细地探讨一下提示工程以及与之相关的技能——少样本学习。
从少样本到零样本学习
正如你所记得的,我们一直在参考的一个关键模型是GPT-3,即生成预训练变换器。提供第三版的论文叫做语言模型是少样本学习者。(1)为什么?因为这篇论文的主要目标是开发一个能够在没有大量微调的情况下表现良好的模型。这是一个优势,因为它意味着你可以使用一个模型来覆盖更多的使用场景,而不需要开发定制代码或整理定制数据集。换句话说,零样本学习的单位经济学比微调更强。在微调的世界中,你需要为基础模型的任务解决方案付出更多努力。这与少样本学习的世界不同,在少样本学习中,基于你的基础模型解决其他任务要容易得多。这使得少样本模型更有价值,因为微调模型在大规模应用时成本太高。虽然在实践中,微调比少样本学习更稳健地解决问题,但它使得提示工程的整个实践变得非常有吸引力。接下来让我们看看以下屏幕截图中的一些示例。
图 13.1 – 来自 GPT-3 论文的少样本学习示例
在左侧,我们看到模型推理的不同输入选项。在论文中,他们使用了“上下文学习”这一短语,指的是在数据集中,可以包含任务定义和示例的样本。这些重复的样本帮助模型学习任务的名称和示例。在这里,任务的名称或任务描述是将英语翻译成法语。然后,我们看到这样的示例,例如海獺 -> loutre de mer。当你向 GPT-3 提供任务名称以及一些样本时,它便能够做出相当不错的响应。
我们称之为少-shot 学习。这是因为我们为模型提供了少量示例,显然比一个示例多,但又少于完整的数据集。我在这里使用“学习”这个词有些困难,因为从技术上讲,模型的权重和参数并没有更新。模型并没有发生变化,因此可以说我们甚至不应该使用“学习”这个词。另一方面,提前提供这些示例作为输入显著提升了模型的表现,因此从输出的角度来看,或许我们可以使用“学习”这个词。无论如何,这已是标准的术语。
一个类似的例子是零-shot 学习,在这种情况下,我们不给模型提供任何完成任务的示例,而是希望它能够表现良好。这种方法非常适合开放领域的问答任务,比如 ChatGPT。然而,正如许多人发现的那样,一个在零-shot 学习场景中表现良好的模型,也可以在少-shot 甚至单-shot 示例中表现得很好。所有这些技术对于理解大型模型都非常有用。
正如我们在图 13.1中看到的,这种学习方法的自然比较是微调。在微调方法中,正如我们在第十章中学到的,我们使用预训练的模型作为基础,并使用更大的数据集样本对其进行再训练。通常,这个数据集样本是有监督的,但在必要时也可以使用无监督的微调。在语言场景中,这种监督可能是分类、问答或摘要。在视觉领域,你可能会看到新的图像和文本对,涵盖了各种应用场景:时尚、电商、图像设计、营销、媒体娱乐、制造业、产品设计等等。
最常见的进展通常包括以下几个步骤:
-
首先,尝试在你的模型上进行零-shot 学习。它能在每个用例和边缘场景下完美运行吗?很可能,它在一些非常狭窄的场景下能工作得很好,但在其他场景下可能需要一些帮助。
-
接下来,尝试单-shot 和少-shot 学习。
如果你提供一些你期望的示例,模型能否理解并给出合适的响应?它是否能按照你提供的提示做出好的反应?如果这些都不行,可以尝试微调。去收集一个更具体的、与你想要增强模型的应用场景相关的数据集并进行训练。有趣的是,微调在仅涉及语言的场景中似乎更加成功。在视觉领域,微调很容易导致模型过拟合或陷入灾难性遗忘,即模型失去了保持基础数据集中的图像和物体的能力。你可能更适合探索图像到图像的方式,下面会进一步讲解。
现在,让我们学习一些关于视觉和语言的最佳提示工程实践。
文本到图像的提示工程技巧
正如我们之前在书中提到的,Stable Diffusion 是一个很棒的模型,你可以通过自然语言与其互动并生成新图像。Stable Diffusion 基于模型的美妙、趣味和简单性在于,你可以在设计提示时尽情发挥创意。在这个例子中,我为一件艺术作品编造了一个挑衅性的标题。我要求模型想象一下,如果这幅图像是由安塞尔·亚当斯(Ansel Adams)创作的,会是什么样子。安塞尔·亚当斯是 20 世纪中期著名的美国摄影师,以其黑白自然风光摄影而闻名。以下是完整的提示:“关闭即是开放,安塞尔·亚当斯,高分辨率,黑白,获奖。指导(20)*”。让我们仔细看看。
图 13.2 – 由 Stable Diffusion 生成的图像
在以下列表中,你会找到一些有助于提升你 Stable Diffusion 结果的提示:
-
在你的提示中添加以下词汇:获奖、高清晰度、在<你喜欢的网站>上流行、以<你喜欢的艺术家>的风格、400 高 dpi,等等。网上有成千上万的优秀照片和它们的相应提示;一个很好的网站是 lexica.art。以有效的方法为起点总是一个不错的选择。如果你对视觉充满热情,你可以轻松地花费几个小时只是在浏览这些示例并找到好的案例。为了更快速的方式,同一个网站允许你以关键词作为提示进行搜索并渲染图像。这是开始提示模型的快捷方式。
-
添加负面提示:Stable Diffusion 提供了负面提示选项,允许你向模型提供它明确不使用的词语。常见的负面提示包括:手、人类、过度饱和、绘制不佳、畸形等。
-
图像放大:虽然大多数使用 Stable Diffusion 的提示生成的图像较小,比如 512x512 的大小,但你可以使用另一种技巧,称为图像放大,将同一图像渲染成更大、更高质量的图像,大小可以是 1,024x1,024 或更大。图像放大是你可以用来获得今天最佳质量 Stable Diffusion 模型的一个重要步骤,无论是在 SageMaker (2) 上,还是通过 Hugging Face 直接使用 (3)。我们将在接下来的图像到图像部分进一步探讨这一点。
-
精准度与细节:当你向 Stable Diffusion 提供更长的提示词时,例如在提示中加入更多术语并详细描述你想要它生成的物体类型和风格,实际上会提高响应效果的几率。要小心你在提示中使用的词汇。正如我们在第十一章关于偏见的部分学到的,大多数大型模型都是基于互联网上的数据进行训练的。对于 Stable Diffusion 来说,无论是好是坏,这意味着你要使用网络上常见的语言。这也意味着标点符号和大小写并不是那么重要,你可以非常创造性和自发地描述你想要看到的内容。
-
顺序:有趣的是,单词的顺序在给 Stable Diffusion 下达提示时非常重要。如果你想让提示中的某部分更具冲击力,比如黑暗或美丽,可以把它放在提示词的前面。如果它太强烈了,可以把它移到后面。
-
超参数:这些在纯语言模型中也有关系,但我们来特别提一下几个对 Stable Diffusion 尤为重要的超参数。
Stable Diffusion 提示工程的关键超参数
1. guidance=20
在第二张图像中,模型捕捉到了亚当斯作品中明显的对比和阴影渐变。此外,我们得到了一个新的风格,几乎像 M.C. 艾舍尔(M.C. Escher),树木似乎变成了地板。
2. 种子:这指的是一个整数,你可以设置它作为扩散过程的基准。设置种子对模型响应有很大影响。特别是如果我的提示词不太好,我喜欢从种子超参数开始,尝试几次随机启动。种子影响图像的高层属性,如风格、物体大小和颜色。如果你的提示词足够强大,你可能不需要在这里做大量实验,但它是一个不错的起点。
3. 宽度和高度:这些非常直接;它们只是输出图像的像素尺寸!你可以通过它们来改变结果的范围,从而影响模型生成的图片类型。如果你想要一张完全方形的图像,使用 512x512。如果你想要竖版方向,使用 512x768。如果是横版方向,使用 768x512。记住,你可以使用稍后我们会学习的放大过程来提高图像的分辨率,因此最好先从较小的尺寸开始。
4. steps
设置为 50
。增加这个数字也会增加处理时间。为了得到很好的结果,个人来说,我喜欢根据 guidance 的值来调整这个数字。如果你计划使用非常高的 guidance 值(大约 16),比如在一个强力提示下,那么我不建议将推理步骤设置为超过 50。这看起来会出现过拟合,结果会很差。不过,如果你的 guidance 值较低,接近 8,那么增加步骤数量可能会得到更好的结果。
对于 Stable Diffusion 和其他文本到图像的扩散模型,还有许多其他的超参数可以探索。现在,让我们来探讨一下图像到图像的技术!
图像到图像提示工程技巧
在生成性 AI 中,尤其是在提示模型时,图像到图像 是一个引人入胜的趋势。这涵盖了一系列广泛的技术,允许你在调用模型时带入一张图像。然后,模型的响应将把你的源图像整合到响应中,让你更具体地确定模型提供的响应。这对于提高图像分辨率、添加遮罩,甚至引入物体以无缝地格式化到输出图像中的任何背景都非常有帮助。
这些核心能力是通过一种在 2022 年初提出的技术实现的 (4),称为随机微分方程编辑(SDEdit),它利用随机微分方程使得图像合成和编辑变得更加容易。虽然听起来有点吓人,但实际上它非常直观。它允许你将源图像添加到预训练的扩散模型中,并使用该基础图像作为灵感来源。怎么做呢?通过以多种方式反复添加和去除噪声,直到最终结果符合你的偏好标准。SDEdit 在真实性上比其前身——基于 GAN 的方法提高了多达 98%,在人类满意度评分上提高了 91%。
让我们探索一下,在使用扩散模型进行提示时,如何利用这一增强的图像到图像技术!
放大
如前所述,这是一种简单且快速的提高图像分辨率的方法。在提示模型时,你可以增强低分辨率的图像,并结合其他参数来提高质量。使用 SageMaker JumpStart (5),你可以直接使用内置的选项,此外,通过 Hugging Face,你还可以使用完整的放大流程。(6) 这还可以接受除了源图像之外的其他文本提示。
遮罩
提示扩散模型时,另一个有趣的技术是遮罩。遮罩就是一组像素,覆盖在照片中的某个区域:山脉、汽车、人类、狗或图像中的任何其他物体。如何找到像素图呢?现在,老实说,一个简单的方法可能是从 Meta 的新任何物体分割模型(SAM)(SAM) 开始。(7)* 你可以上传一张图像,并让模型生成该图像中任何物体的像素图。
一旦你有了一个遮罩,你可以将其发送到 Stable Diffusion 图像中,在遮罩区域生成一张新图像。经典的例子是改变人们所穿衣服的风格。你可以使用 SAM 或开源的 CV 工具提取照片中衣服的区域,渲染遮罩,然后将遮罩发送给 Stable Diffusion。它将生成一张新图像,将原始图像与新生成的元素结合起来,填充遮罩区域。
如果你想看一个简单又完整的端到端示例,可以看看我刚在 GitHub 上找到的一个!(8)
使用 DreamBooth 进行物体到图像的提示
与我们在前面几节中看到的其他方法不同,DreamBooth (9) 并不使用底层的 SDEdit 方法。相反,它使用一组输入图像,并通过结合文本指导的微调过程,将来自所有输入图像的源物体放置到模型生成的目标场景中。该技术使用了两个损失函数,一个用于保留预训练模型已经学到的先前类别,另一个用于将新物体重建到最终图像中。
这意味着可以说,它并不是一种提示技术;它更接近于一种微调技术。然而,我将它包括在这里,因为我觉得它的意图更类似于遮蔽(masking),而不是创建一个全新的模型,但实际上它的结果就是如此。我们来更仔细地看看 DreamBooth 的损失函数。
图 13.3 - DreamBooth 损失函数
图 13.3 - DreamBooth 保留先前信息的损失函数
DreamBooth 是一个很棒的开源解决方案,你可以用它将你喜欢的任何物体放置到你选择的任何背景中!接下来,我们来学习一些你可以用来改善语言模型提示的技巧。
提示大型语言模型
我之前说过:我非常喜欢并大力支持 Hugging Face。我从他们那里学到了很多关于自然语言处理(NLP)的知识,因此如果不提到他们的书作为一个关于提示工程技巧和技术的极佳资源,我就不对得起自己了。(10) 其中大多数做法围绕着为你的模型选择合适的超参数展开,每种类型的模型都会提供稍有不同的结果。
然而,我认为 ChatGPT 的崛起几乎完全改变了这一点。在今天的世界里,OpenAI 模型的极高准确度提高了所有 NLP 开发者的标准,迫使我们交付相似的结果。无论好坏,都无法回头。让我们尝试理解如何提示我们的大型语言模型(LLMs)!我们将从指令微调开始。
指令微调
首先,理解一个经过指令微调的模型和一个未经过微调的模型之间的区别是非常有帮助的。正如我们在第十章关于微调的内容中所学到的,指令微调是指一种监督式的微调步骤,它使用模型提供的指令,例如“告诉我含羞草和三角饺的区别”,并将这些指令与答案配对,如“含羞草是一种含有香槟和橙汁的酒精饮料,而三角饺则是一种印度酥皮点心,里面填充有蔬菜或肉类,通常还有土豆馅料。”模型随后会明确学习如何遵循指令。
这对提示 LLM 非常重要,因为它会完全改变你的提示风格。如果你正在使用一个已经经过指令微调的 LLM,你可以直接进入零-shot 性能,并立即让它无缝地为你执行任务。如果没有,你可能需要在提示中添加一些示例,也就是少量示例学习,以鼓励它按照你希望的方式做出回应。
一旦你弄清楚了这个关键区别,花时间尝试你选择的模型也是有帮助的。它们有细微的差别;有些模型需要不同的符号和分隔符,而其他的则对关键字和短语反应较好。你需要了解并测试你的 LLM,而提示工程是一个很好的方法。另一个值得学习的风格是思维链提示。
思维链提示
即使你正在使用一个在零-shot 情况下表现良好的模型,比如一个已经接受了指令微调的模型,正如我们之前讨论的,你仍然可能会遇到一些需要在提示中添加示例以获得期望输出的使用场景。思维链提示就是一个很好的例子。思维链提示指的是提示模型展示它是如何 得出答案的。这在解释性至关重要的场景中极为有价值,例如解释 LLM 为什么做出风格更新或分类决策。举个例子,假设你正在法律场景中使用 LLM,并且你希望 LLM 更新法律文件中的语言。当你这样提示它时,模型不仅仅是提供答案,而是可以一步步解释它是如何得出某个结论的。这种逻辑清晰性有助于大多数用户对系统更有信任,帮助他们理解并相信模型提出的建议是有效的。
它在很多情况下也有助于提高准确性!这是因为大多数大语言模型(LLMs)本质上是自回归的;它们非常擅长预测在给定字符串中下一个最可能出现的词。当你引导它们进入一连串的思维时,你实际上是在推动它们按一步步的思路生成,从而使它们更接近真实情况。让我们通过以下原始论文中的图示来更直观地理解这一点。(11)
图 13.4 – 思维链提示
如你所见,在左侧,我们仍然在进行一些少量学习,但提示中的答案很简单。它仅仅回答问题,完结。可是,在右侧,我们通过提供一个重新表述问题的答案来提示模型。现在,答案开始于重新生成问题中提供的信息的快速摘要,然后进行一次逻辑跳跃,输出正确答案。你可以看到,左侧的模型没有正确回答,而右侧的模型是正确的。实际上,模型本身是一样的,唯一的区别是提示。
对于经过指令微调的模型,你还可以通过一个像“逐步指导我如何…”这样的语句来触发连锁思维表现。
摘要
这可能是我今天看到的最常见的 LLM 应用场景:总结电话记录、文档等。使用顶级 LLM,摘要现在变得非常容易。只需根据模型的上下文长度,将尽可能多的文档粘贴到 LLM 中,并在提示的底部添加Summarize:。一些模型可能有所不同;你也可以添加TL;DR、in summary:或其他类似的变体。它们会完美地工作吗?当然不行。它们会抓住所有内容吗?绝对不可能。它们偶尔会产生幻觉吗?毫无疑问。我们该如何减轻这个问题?微调、大规模验证、实体识别和审计。
防御提示注入和越狱
在提示模型时需要考虑的一种技巧是它对越狱的敏感程度。正如我们在第十一章中学到的关于检测和缓解偏见的内容,越狱是指恶意用户诱导模型执行有害行为。这可能就像是要求模型讲一些关于某些群体的粗鲁笑话,要求它提供盗窃的指导,或者询问它对某些政治家或社会群体的看法。在每个 LLM 应用中,至少会有一些用户尝试越狱,看看是否能诱使模型做出不当行为。一个类似的方法是提示注入,用户可以恶意欺骗模型,让它输出来自数据集、提示集或任何其他指令列表中的 IP。
如何防御这一点?一种方法是通过有监督的微调。Anthropic 维护了一个大型的红队数据集,可以在 Hugging Face 上找到,链接在这里。(12) 请小心使用;这个数据集中的词汇非常直白,可能会让一些读者感到不适。就个人而言,我甚至觉得很难研究这个数据集中的几行内容。作为一种有监督的微调技术,或者正如 Anthropic 所建议的,作为一种带有人工反馈的强化学习技术,你可以对模型进行微调,以拒绝任何看起来恶意或有害的内容。
除此之外,你还可以为应用程序增加分类器来处理输入数据。这意味着,当你的应用接收到来自用户的新问题时,你可以轻松地增加额外的机器学习模型来检测这些问题中的恶意或异常行为,并绕过回答。这使你能更好地控制应用的响应方式。
现在我们已经学习了一些提示 LLM 的基本技巧,让我们看看一些更高级的技巧!
高级技巧 – 前缀与提示调优
你可能在想,难道没有一种更精巧的方式,通过优化技术找到正确的提示,而不需要更新模型参数吗?答案是肯定的,确实有许多方法可以实现这一点。首先,让我们试着理解前缀调优。
前缀调优
这一技术由一对斯坦福研究人员在 2021 年提出,专门用于文本生成。正如你在他们论文中的下图所看到的,核心思想是,与其为每个下游任务生成一个全新的模型,不如创建一个简单的向量来表示每个任务,这个向量被称为前缀,且该方法消耗的资源较少。
图 13.5 – 前缀调优
这里的核心思想是,不是为每个下游任务微调整个预训练的变换器,而是尝试只更新该任务的一个单一向量。这样,我们就不需要存储所有的模型权重;我们只需要存储那个向量!
可以说,这一技术与我们在*第十章**中简要提到的有些相似,即微调与评估。这项技术向 LLM 注入可训练的权重,让我们只学习新的参数,而不是更新整个模型本身。我觉得前缀调优很有趣,因为我们根本没有触及模型架构;我们只是从一开始就学习这个基本对象。
为什么你应该了解这个?因为正如斯坦福团队所展示的,这种方法只使用了完整模型的 0.1%参数,却能提供与微调整个模型相媲美的性能。
如何开始前缀调优?使用我们 Hugging Face 的朋友们提供的新库!他们正在构建一个开源库,让各种参数高效的微调在这里变得可用:github.com/huggingface/peft
。前缀调优肯定是可用的。
幸运的是,来自无可比拟的 Phill Schmid 的通用 PEFT 示例,在这里似乎非常易于访问。(14) 通过一些专门的数据预处理和自定义模型配置,你也可以将其添加到你的脚本中。
现在,让我们来看看提示调优。
提示调优
正如我们所见,找到合适的提示是相当具有挑战性的。通常,这些提示基于人类自然语言中的离散单词,可能需要相当多的手动迭代才能欺骗模型提供预期的答案。在谷歌 2021 年 ACL 论文中((15))引入这一概念时,他们提出了可以通过反向传播学习的“软提示”。幸运的是,这种方法包含了来自任何数量标记示例的信号,从而简化了之前提出的前缀调优方法。
通过提示调优,我们冻结整个预训练模型,但允许为每个下游任务向输入文本添加额外的k可调令牌。这些令牌被视为软令牌,或者是模型学习到的信号,用于识别每个下游任务。你可以在他们论文中的图示中看到这一点。
图 13.6 – 提示调优
类似于前缀调优,通过提示调优,我们仍然冻结基础模型的权重。我们同样还会向输入数据集中添加一些新的、可学习的项,并与各种下游任务数据样本混合。关键的区别在于,与学习完整模块不同,我们学习新的、机器可读的令牌。这意味着这些令牌本身应在梯度更新后发生变化,标志着模型识别出这基本上是该类型下游任务的触发信号。如果你正在处理参数高效微调不可行的场景,例如模型完全对你隐藏的情况,那么前缀调优或提示调优可能是一个不错的探索选项。这两种技术都可以在相关的 Hugging Face 库中找到,peft
。
现在,让我们通过快速总结来结束本章。
总结
在本章中,我们介绍了提示工程的概念。我将其定义为在不更新模型权重的情况下,从模型中榨取准确性提升的所有方法。换句话说,这就是以更少的投入获取更多成果的艺术。我们介绍了少样本学习,其中你向模型提供几个期望推理结果的示例,零样本学习则是你希望模型在没有任何先前信息的情况下给出回应。毋庸置疑,消费者通常更喜欢零样本学习。我们讨论了一些针对文本到图像模型的提示技巧,特别是如何从开源的 Stable Diffusion 中获得良好的表现。我们了解了图像到图像的提示方法,通过向基于扩散的模型传递图像,从而利用交集生成新图像。我们还了解了提示大语言模型(LLM),包括指令微调、思维链提示、摘要生成、防止提示注入和越狱的影响。最后,我们介绍了一些高级技巧,包括提示和前缀调优。
现在,让我们开始阅读 第十四章,内容是关于视觉和 LLM 的 MLOps!
参考文献
请查看以下内容,了解本章节涵盖的一些主题的更多信息:
-
Language Models are Few-Shot Learners:
arxiv.org/pdf/2005.14165.pdf
-
使用稳定扩散在 Amazon SageMaker JumpStart 中提升图像质量:
aws.amazon.com/blogs/machine-learning/upscale-images-with-stable-diffusion-in-amazon-sagemaker-jumpstart/
-
stabilityai/stable-diffusion-x4-upscaler Copied:
huggingface.co/stabilityai/stable-diffusion-x4-upscaler
-
SDEDIT:使用随机微分方程进行引导图像合成和编辑:
arxiv.org/pdf/2108.01073.pdf
-
使用稳定扩散在 Amazon SageMaker JumpStart 中提升图像质量:
aws.amazon.com/blogs/machine-learning/upscale-images-with-stable-diffusion-in-amazon-sagemaker-jumpstart/
-
Hugging Face:
huggingface.co/stabilityai/stable-diffusion-x4-upscaler
-
Segment Anything:
arxiv.org/pdf/2304.02643.pdf
-
amrrs/stable-diffusion-prompt-inpainting:
github.com/amrrs/stable-diffusion-prompt-inpainting/blob/main/Prompt_based_Image_In_Painting_powered_by_ClipSeg.ipynb
-
DreamBooth:Fine Tuning Text-to-Image Diffusion Models for Subject-Driven Generation:
arxiv.org/pdf/2208.12242.pdf
-
nlp-with-transformers/website:
github.com/nlp-with-transformers/website
-
Chain-of-Thought Prompting Elicits Reasoning in Large Language Models:
arxiv.org/pdf/2201.11903.pdf
-
Hugging Face:
huggingface.co/datasets/Anthropic/hh-rlhf
-
Prefix-Tuning:优化连续提示以进行生成:
arxiv.org/pdf/2101.00190.pdf
-
huggingface/notebooks:
github.com/huggingface/notebooks/blob/main/sagemaker/24_train_bloom_peft_lora/scripts/run_clm.py
-
The Power of Scale for Parameter-Efficient Prompt Tuning:
aclanthology.org/2021.emnlp-main.243.pdf
-
arxiv.org/pdf/1902.00751.pdhttps://arxiv.org/pdf/1902.00751.pd
第十四章:MLOps 在视觉和语言中的应用
本章将介绍机器学习操作与协调的核心概念,也称为 MLOps。这包括构建管道、持续集成与部署、环境间的推广等内容。我们将探讨如何监控模型预测并进行人工干预审计。我们还将寻找独特的方式,以支持在 MLOps 管道中使用大型视觉和语言模型。
本章将涵盖以下主题:
-
什么是 MLOps?
-
持续集成与持续部署
-
模型监控与人工干预
-
基础模型的 MLOps
-
AWS 提供的 MLOps 服务
什么是 MLOps?
本书中我们已经涵盖了如此庞大的内容,几乎令人难以想象。从预训练的绝对基础开始,我们一步步深入探讨了用例、数据集、模型、GPU 优化、分布式基础、优化、超参数、与 SageMaker 的配合、微调、偏差检测与缓解、托管模型及提示工程等内容。现在,我们将进入将所有内容 结合在一起的艺术与科学。
MLOps代表机器学习操作。广义来说,它包括一整套技术、人员和流程,供您的组织采纳,以简化机器学习工作流。在前几章中,您学习了如何构建 RESTful API 来托管模型,并且获得了改进提示工程的技巧。在这里,我们将重点讨论构建部署工作流,以将该模型集成到您的应用程序中。
就个人而言,我认为 MLOps 中的管道(pipeline)部分最为关键。管道是一个由多个步骤组成的流程,用于协调机器学习工作流。这可以包括自动重新训练模型、超参数调整、审计与监控、应用测试与集成、推广到更安全的环境、漂移与偏差检测,以及对抗性强化等内容。
图 14.1 – 机器学习操作的管道
管道是您可以使用多种软件工具构建的工具。如果您使用的是 SageMaker 本地工具,并且还没有一个协调栈,您可以从查看SageMaker 管道开始。或者,如果您已经在使用某个协调栈,例如 AirFlow、KubeFlow、Ray、MLFlow 或 StepFunctions,您也可以继续使用它们,并简单地调用 SageMaker API 来处理您的机器学习工作流。
流水线的核心组件是步骤。一个步骤可能是数据预处理、模型训练、模型评估、人工审核、模型部署等。一个基本的流水线将通过你定义的多个步骤。流水线通常以触发器开始,触发器是某个事件,它将通知系统引入流水线。你的触发器可能是上传到 S3、提交到代码库、某个时间点、数据集更新或客户事件。通常,你会看到一个触发器启动整个流水线,在前一步骤完成后启动每个后续步骤。
让我们继续讨论常见的 MLOps 流水线。
常见的 MLOps 流水线
让我们来看几个在机器学习中常见的流水线:
-
模型部署流水线:在这里,核心任务是指向你的预训练模型工件,特别是推理脚本和模型本身,并将这些内容放入你选择的任何部署选项中。你可能会使用SageMaker 实时端点进行产品推荐,或者使用异步端点来托管大型语言模型。你可能通过多容器端点使用不同的镜像,甚至通过多模型端点使用不同的模型。无论如何,最基本的流水线步骤可能如下所示:
-
更新模型工件。
-
创建一个新端点。
-
测试端点。
-
如果测试成功,将生产流量指向该端点。如果测试失败,通知开发团队。
-
-
模型再训练流水线:模型再训练流水线适用于那些需要定期再训练模型的使用场景。每次有新数据时都需要再训练,可能是每隔几小时,或者每个月一次。对于像重新运行报告或笔记本这样的简单场景,你可以使用 SageMaker 的notebook job功能(自 2022 年 12 月推出)按计划运行笔记本。然而,如果你希望基于更新的数据触发此再训练,则流水线将非常有用。或者,如果模型或数据集很大并且需要分布式训练,流水线将是一个理想的选择。你的流水线步骤可能如下所示:
-
上传新数据。
-
运行预处理。
-
训练模型。
-
调整模型。
-
触发部署流水线。
-
-
环境推广流水线:某些客户,特别是那些在安全敏感环境中工作的客户(例如高度监管的行业),要求通过越来越安全的环境来升级应用程序。在这里,环境一词指的是一个隔离的计算边界,通常是一个全新的 AWS 账户,或者更简单地说,是一个不同的区域。此流水线的步骤可能如下所示:
-
从开发账户中的数据科学家触发流水线。
-
将资源提升到测试账户。
-
测试端点。
-
如果端点通过测试,将其提升到生产账户。如果端点未通过测试,通知数据科学家。
-
在生产账户中,创建端点。
-
将生产流量设置到端点。
-
正如你无疑注意到的那样,每个管道都可以相互交互。它们可以作为独立步骤触发彼此,与其他组件交互,并持续添加价值。它们的基本组件也是可互换的 – 你可以轻松替换一些步骤,定义你需要的整体系统。
支撑其中大部分概念的一个概念是微服务。你可以把每个管道都视为一个微服务,从某些输入开始并生成输出。为了最大化跨团队的价值,你可以构建和维护每个步骤或整个管道的基本模板,以便未来的团队更容易使用它们。
正如我们在第十二章中学到的那样,如何部署你的模型,你可以使用很多技术来改进你的模型以进行部署。这包括量化和压缩、偏差检测和对抗性硬化 (1)。个人而言,我倾向于看到许多方法在模型上执行得很少,比如当它首次从研发团队移交到部署团队时。对于定期的重新训练,我会避免过度的计算资源,假设模型的大部分基本更新已在更近期的版本中工作。
持续集成和持续部署
在机器学习中,我们倾向于看两种略有不同的堆栈。一方面,你有模型创建和部署过程。这包括你的模型工件、数据集、指标和目标部署选项。正如我们之前讨论的那样,你可能创建一个管道来自动化这个过程。另一方面,你有真正的软件应用程序,你想要暴露你的模型。这可能是一个视觉搜索移动应用程序、问答聊天、图像生成服务、价格预测仪表板,或者真正使用数据和自动化决策来改进的任何其他过程。
许多软件堆栈使用他们自己的持续集成和持续部署(CI/CD)管道,无缝连接应用程序的所有部分。这可以包括集成测试、单元测试、安全扫描和机器学习测试。集成是指将应用程序组合在一起,而部署则是指采取步骤将应用程序投入生产环境。
我们之前看过的许多管道可能被认为是 CD 管道,特别是当它们涉及更新生产中的服务时。持续集成管道可能包括指向应用程序的步骤,测试各种响应,并确保模型作出适当的响应。让我们仔细看看。
图 14.2 – 机器学习的 CI/CD 选项
我在这里想表达的是,你有许多选项可以设置你的管道。对于一个大规模的基础模型,比如你自己的预训练大语言模型或文本到视觉模型,你可能会拥有由不同团队为拼图的不同部分开发的极其强大的多个代码库。将这些代码库整合在一起,使用它们的片段相互支持,并通过强大的单元测试尽可能地自动化,以确保整体的最高性能是符合你最佳利益的。与模型开发分开,你可能还会有一个部署管道,能够检查所有必要条件,为模型准备好实时流量并成功地与客户端应用进行通信。
既然我们已经讨论了一些关于一般运营的基础话题,那么让我们仔细看看与机器学习特别相关的两个关键方面——模型监控和人工介入。
模型监控和人工介入
在第十一章中,我们探讨了关于偏见检测、缓解和监控的大型视觉与语言模型的相关话题。这些内容主要集中在评估模型的背景下。现在,我们已经进入了关于模型部署的部分,重点是运营,我们来更仔细地看看模型监控。
一旦你将模型部署到任何应用中,能够查看该模型随时间变化的表现就变得极其有用。这对于我们之前讨论的任何用例都是如此——聊天、通用搜索、预测、图像生成、推荐、分类、问答等等。所有这些应用都从能够看到你的模型随时间变化的趋势并提供相关警报中受益。
例如,假设你有一个价格预测模型,它根据经济状况为某个特定产品建议价格。你在某些经济条件下训练模型,也许是 1 月的经济条件,并在 2 月部署了该模型。在部署期间,模型继续关注那些相同的条件并帮助定价。然而,你可能没有意识到,3 月时整个市场状况发生了变化。我们的世界变化如此迅速,以至于整个行业可能已经发生了颠覆。你的模型进入世界时认为一切看起来和训练时完全一样。除非你重新校准模型,否则它不会意识到情况已经不同。
但是,您该如何知道何时重新校准模型呢?通过模型监控!使用 Amazon SageMaker,包括我们完全托管的模型监控功能,您可以轻松运行测试,学习训练数据的汇总统计信息。然后,您可以安排作业将这些汇总与传入端点的数据进行比较。这意味着,随着新数据与您的模型互动,您可以将所有这些请求存储在 S3 中。请求存储之后,您可以使用模型监控服务安排作业,将这些推理请求与您的训练数据进行对比。这很有用,因为您可以利用它向自己发送警报,了解模型在推理上的趋势,尤其是在您需要触发重新训练作业时。模型监控的基本概念同样适用于视觉和语言;唯一的问题是如何生成汇总统计信息。
那么,模型监控与人为参与有何关系呢?因为您还可以使用来自托管模型的触发器来触发人工审核。如下面的图所示,您可以引入一些软件检查,以确认模型输出的内容是否大致符合您的预期。如果不符合,您可以触发人工审核。这使用了 SageMaker 的另一个选项——增强型人工智能(A2I),而这个功能又依赖于 SageMaker Ground Truth。换句话说,如果模型没有按预期工作,您可以将预测请求和响应发送给团队进行人工审核。这有助于您的团队对整体解决方案建立更多信任,更不用说提升您的数据集以便为模型的下一次迭代做准备了!让我们直观地看一下这个过程。
图 14.3 – 带有人类参与的模型监控
在前面的图中,您可以看到各种组件或微服务,您可以将它们组合起来,提供一个完整的管道,同时进行模型监控并保持人为参与。首先,您的客户端应用可以与一个 Lambda 函数进行交互,而该函数又会调用一个 SageMaker 模型。您可以通过自己在 Lambda 中编写代码,将模型请求和响应存储在 S3 存储桶中,或者您也可以设置 SageMaker 端点来为您完成此操作。一旦您将记录存储在 S3 中,就可以运行模型监控作业。这可以利用 SageMaker 的功能——模型监控,来学习训练数据与推理数据之间的统计差异,并在这些差异超出大范围时向您发送警报。或者,您也可以编写自己的对比脚本,并在 SageMaker 的训练或处理作业中运行这些任务。
一旦你对模型的整体响应情况有了一定的了解,接下来的最佳策略是尽可能地融入人工反馈。在生成领域尤其如此,在这里,内容的准确性、风格和语气是大多数组织的首要标准。一个很好的选择是SageMaker Ground Truth!正如我们在第二章中学习的数据准备部分所述,这是一个完全托管的服务,你可以用它来增加标注数据集,并实时增强模型响应。
这里的类似方法是使用多个模型来确认预测结果。试想你快速处理了一份文档,并希望准确提取其中的内容。你的客户将 PDF 文件上传到你的网站,你通过机器学习模型解析它,并希望确认或否定某个字段的内容。增加利益相关者对系统准确性的信心的一种方式就是使用不止一个模型。也许你使用的是自己的模型,一个托管在 SageMaker 中的定制深度学习模型,同时,你也可以指向一个完全托管的 AWS 服务,如 Textract,它可以从视觉表单中提取数字化自然语言。然后,你可能还会有一个 Lambda 函数来查看两个模型是否对结果一致。如果一致,那么你可以直接回复客户!如果不一致,则可以将请求路由到人工审核。
监控模型的方法有无数种,其中包括将这些方法与人类结合的方式!不过,现在让我们继续探讨与视觉和语言相关的 MLOps 组件。
基础模型的 MLOps
现在,你已经对 MLOps 有了一个清晰的了解,并且掌握了一些关于如何使用“人工在环”和模型监控的思路,接下来让我们从 MLOps 的角度具体探讨视觉和语言模型中哪些方面值得我们关注。
这个问题的答案并不那么显而易见,因为从某个角度来看,视觉和语言只是机器学习和人工智能的略微不同的方面。一旦你配置好了合适的包、图像、数据集、访问权限、治理和安全性,其他部分应该会自然而然地流畅进行。然而,达到这一点的过程却是一场艰难的斗争!
构建一个大型语言模型的管道并非易事。正如我之前提到的,我认为这其中至少涉及两个非常不同的方面。从其中的一方面来看,你需要关注整个模型开发生命周期。正如我们在本书中所学到的,这涉及到大量的开发工作。从数据集、模型和脚本准备到训练和评估循环,再到性能和超参数优化,有无数种技术需要追踪,以便构建你的基础模型。
一旦你拥有了基础模型,为开发做准备就变成了一个不同的问题。正如我们之前讨论的,对抗性强化包括了一系列技术,你可以用它们来提升模型在目标领域中的表现。从第十章中学到的微调和评估,第十一章中的偏差检测与缓解,以及第十二章中的部署技术,都可以直接应用到这里。对我来说,将这些内容放在一个专注于部署的不同流程中似乎很自然。让我们通过下图来看看这些内容。
图 14.4 – LLM 开发与部署流程
使这件事变得更加复杂的是,这些不同的步骤中有许多使用了相似的软件包和函数。这意味着,要实现每一个步骤,你可能需要指向至少一个,甚至可能是几个 git
仓库和软件包。当你将这些步骤解耦,使用不同的容器、资源和步骤来管理每个部分时,这有助于每个团队独立工作。我们都知道,基础模型的开发速度在未来几年只会加快,因此可以预见的是,每一个步骤都会需要你定期暂停,捕捉最新的开源脚本或研究技术,进行开发和测试,并将它们重新集成到更大的流程中。
现在,让我们学习一下视觉领域的 MLOps。
视觉领域的 MLOps
视觉基础模型与我们之前为语言模型提出的建议相比如何?在某种程度上,差别不大。你依然是在处理图像、脚本、软件包、数据集和模型质量。你仍然希望保持模型的最新状态,并且尽可能多地融入人类反馈。正如我们在本书中迄今所看到的,模型和评估指标会有所不同,数据集也会大不相同,任务也并非完全相同。然而,许多基本的逻辑仍然是通用的。不过,值得提醒的是——在语言领域的微调与视觉领域的微调是完全不同的。
关于视觉领域的过拟合和呼吁常识的警告
请记住,视觉比语言更容易受到过拟合的影响。为了理解这一点,我们可以考虑这两种模式之间的根本区别。语言本质上是离散的;我们通过字母和单词来表达整个世界,而这些项本身就是非连续的。你可以说,语言的整个模式等同于世界上所有语言词典的总和,词典本身只是人类不断使用、发展和表达的词语的近似。词语的排列、它们的解释以及在广泛的人类生活经验中的意义是无穷无尽的。
视觉完全不同。该模式本身是连续的;尽管像素本身当然是有起止的,但图像中物体之间的界定几乎是主观的。我们使用指标来量化标记物体之间的质量和差异,比如交集与并集比。物体会旋转;在不同的光照和背景下,它们似乎完全变化。即使是完全不同类型的物体,例如动物与杯子、路标与衣物、家具与自然景观,它们的模式可能看起来也非常相似。虽然视觉和语言都在进入模型时被分解成嵌入,但神经网络在捕捉内容的意义并将其推断到其他环境中的能力,似乎在语言和视觉中是非常不同的。语言微调在许多情况下效果很好,而视觉微调通常在初期表现较差。
就个人而言,我觉得另一种机器学习技术非常有趣,它在本质上似乎是这些结合模式的核心——常识推理。机器常识指的是确保概念、物体以及这些物体的定义特征之间的逻辑一致性。大多数人擅长这一点,比如知道水是湿的,重物被丢到空中会下落,火会产生热量,等等。
然而,计算机在这方面做得非常糟糕。它们似乎根本无法理解物理维度的存在;当然,生物学层面对它们来说完全是个异常。图像生成器不了解食物必须进入嘴巴才能算作进食。图像分类器常常把斑马与家具混淆。语言模型不理解人类沟通的节奏,偶尔让使用者感到不堪重负。电影生成器经常让人反感多于愉悦,因为它们无法识别婴儿首先掌握的基本辨别能力——人类及其动作。对于人类来说,杯子和动物都是物体,可能偶尔还会有一些相似的风格特征,但在物理世界里,它们分别来自完全不同的领域。对计算机而言,似乎这个物理维度根本不存在。它们实际上只是在学习你提供的二维图像中存在的内容。这就是我们一开始使用标签的原因——通过将物理世界转化为像素,赋予模型一定的意义。
我有幸在去年与叶津·崔*(2)*见面并进行了简短的交流。她在世界顶尖的自然语言处理会议之一——计算语言学协会年会上发表了主题演讲,讲述了一个引人入胜的假设性预测,关于未来 60 年自然语言研究的走向。我被她对人文学科、哲学以及深层科学发现的热情深深打动。她在一个极少有人关注机器常识的时代开始了这方面的探索,事实上,她今天开玩笑说,当时她还遭到积极反对,因为大家都认为在这个话题上发表文章几乎是不可能的。从那时起,她已经成为这个领域可能最顶尖的专家,主要通过语言和视觉作为她的研究方式。从那时起,我对常识产生了浓厚的兴趣,想要更详细地探讨它。
我在想,人类的知识本身是否具有内在的关系性,甚至可能是多模态的。我们在大脑中构建概念,是基于经历——无论是亲身体验、感知、想象还是理解。这些心理概念引导着我们的言语和行动,有时通过语言表达,有时则完全通过身体语言表达。或许我们需要更深层的表示来引导模态的交融。或许语言能帮助我们的视觉模型更快适应新领域。也许这是因为它提供了一些常识。
实际上,我之所以提到这一点,是因为如果你准备开始进行视觉微调工作,我希望你提前知道,这不会是件容易的事,而且在语言领域对你有效的东西,可能并不会像你想的那样顺利迁移到视觉领域。我还想提到这一点,是因为我希望你们这些未来的研究人员要有勇气,相信直觉,挑战自己的假设。现在我们已经了解了基础模型的 MLOps,让我们来看一看 AWS 提供的一些服务,帮助简化流程并加速你掌握这一主题!
AWS 提供的 MLOps 服务
幸运的是,AWS 提供了各种工具来简化这一过程!其中一个很棒的功能叫做血缘追踪。SageMaker 可以自动为关键工件创建血缘*(3)*,甚至跨账户创建血缘。这包括数据集工件、镜像、算法规格、数据配置、训练作业组件、端点和检查点。这与实验 SDK 集成,允许你以编程方式在大规模上比较实验和结果。让我们通过可视化来看一下。我们甚至会为你生成一个可视化图,展示所有这些是如何关联的!请查看下图。
图 14.5 – SageMaker 自动创建血缘追踪
如你所见,追踪血缘的第一步是运行 SageMaker 中的关键资源,如训练作业、镜像和处理作业。你可以使用自动追踪的实体,也可以定义自己的实体。为了生成如前图所示的血缘视图,你可以使用血缘查询语言。如果你想直接进入带有可视化解决方案的笔记本,可以查看参考资料部分中的点(4)。血缘追踪的详细说明见此处 – (5),查询语言的定义见此处 – (6)。通过 SageMaker 血缘追踪,你可以轻松追踪一个模型是如何训练的以及它被部署到哪里。
它是如何工作的?你可以使用LineageFilter API来查找与模型工件相关的不同对象,如端点。你还可以搜索与端点相关的试验组件,查找与模型相关的数据集,并在关联项的图谱中前后穿梭。拥有这些关系的程序化访问,使得将所有必要资源放入管道和其他治理结构中变得更加容易。
一旦你识别了资源,如何将它们封装成一个管道?正如我们在本章之前提到的,许多基础的 AWS 和 SageMaker 资源都可以作为独立的构建模块使用。这些资源包括模型、相关的模型工件、部署配置、关联的训练和处理作业、超参数调优和容器。这意味着你可以使用 AWS SDK for Python,boto3和SageMaker Python SDK来编程地指向并执行所有资源和任务。将这些资源封装到一个管道中意味着使用你偏好的工具堆栈来自动化操作它们。实现这一点的一种方式是SageMaker Pipelines!
SageMaker Pipelines 简介
如果你正在使用 SageMaker 原生资源,例如作业、端点、模型工件和 Docker 镜像,那么通过 Pipelines SDK 构造*(7)*将它们连接起来应该不会增加太多额外的负担。SageMaker Pipelines 是一个托管功能,你可以使用它来创建、运行和管理 AWS 上的完整机器学习工作流。一旦你为 SageMaker 定义了基础的 Python SDK 对象,如训练作业、评估指标、超参数调优和端点,你就可以将这些对象传递给 Pipelines API 并将其创建为一个图!接下来让我们在下面的图中更详细地探讨这一点。
图 14.6 – SageMaker Pipelines
如果你想要查看一个类似于前面图中所示的图形的笔记本示例,可以访问 GitHub 上的资源*(8)*。核心思路是,你将管道的每个部分单独构建,比如数据处理、训练和评估步骤,然后将这些部分传递给 SageMaker Pipelines API,创建一个连接的图。
如你在上面的图中看到的,这在 SageMaker Studio 中以可视化方式呈现!这使得数据科学家更容易开发、审查、管理和执行这些管道。Studio 还提供了许多其他与 MLOps 相关的功能,例如特征存储、模型注册、端点管理、模型监控和推理推荐器。如果你想更深入了解这些话题,可以查阅 AWS Well-Architected Framework 关于机器学习的完整白皮书*(9)*。
现在我们已经了解了 AWS 的 MLOps 产品,让我们通过一个完整的回顾来结束本章内容。
总结
在本章中,我们介绍了 MLOps 的核心概念,尤其是在视觉和语言的背景下。我们讨论了机器学习操作,包括使其运行的一些技术、人员和流程。我们特别关注了流水线方面,学习了构建它们的有用技术,如 SageMaker Pipelines、Apache Airflow 和 Step Functions。我们研究了与机器学习相关的几种不同类型的流水线,如模型部署、模型再训练和环境推广。我们讨论了核心操作概念,如 CI 和 CD。我们了解了模型监控和人机协同设计模式。我们学习了 MLOps 中一些适用于视觉和语言的特定技术,如大型语言模型的常见开发和部署流水线。我们还探讨了语言中可能有效的核心方法,如何由于模态之间的根本差异以及当前学习系统的运作方式,在视觉中固有地不太可靠。我们通过讨论常识推理,快速走了一遍哲学路线,然后通过介绍 AWS 的 MLOps 关键产品,如 SageMaker Lineage、Experiments 和 Pipelines,结束了本章内容。
现在,让我们通过最后一章讨论未来趋势来结束本书。
参考文献
请阅读以下内容,以获取本章中涵盖的几个主题的更多信息:
-
通过对抗模型 级联强化深度神经网络:
arxiv.org/pdf/1802.01448.pdf
-
Yejin Choi:
homes.cs.washington.edu/~yejin/
-
Amazon SageMaker ML 谱系 追踪:
docs.aws.amazon.com/sagemaker/latest/dg/lineage-tracking.html
-
aws/amazon-sagemaker-examples:
github.com/aws/amazon-sagemaker-examples/blob/main/sagemaker-lineage/sagemaker-lineage.ipynb
-
谱系追踪 实体:
docs.aws.amazon.com/sagemaker/latest/dg/lineage-tracking-entities.html
-
查询谱系 实体:
docs.aws.amazon.com/sagemaker/latest/dg/querying-lineage-entities.html
-
SageMaker 流水线:
sagemaker.readthedocs.io/en/stable/workflows/pipelines/index.html
-
aws/amazon-sagemaker-examples:
github.com/aws/amazon-sagemaker-examples/blob/main/sagemaker-pipelines/tabular/train-register-deploy-pipeline-model/train%20register%20and%20deploy%20a%20pipeline%20model.ipynb
-
机器学习镜头 AWS Well-Architected 框架:
docs.aws.amazon.com/pdfs/wellarchitected/latest/machine-learning-lens/wellarchitected-machine-learning-lens.pdf
第十五章:预训练基础模型的未来趋势
在本章中,我们将通过指引未来的趋势来总结本书,涵盖书中所有相关主题。我们将探讨基础模型应用开发的趋势,例如使用 LangChain 构建互动对话应用程序,以及使用检索增强生成(retrieval augmented generation)等技术来减少大语言模型的幻觉问题。我们还将探索如何使用生成模型解决分类任务、人本设计以及其他生成模式,如代码、音乐、产品文档、幻灯片等!我们将讨论 AWS 的服务,例如 SageMaker JumpStart 基础模型、Amazon Bedrock、Amazon Titan 和 Amazon Code Whisperer,并展望基础模型及预训练技术的未来趋势。
我们特别将深入探讨以下主题:
-
构建大语言模型应用的技术
-
视觉与语言之外的生成模式
-
AWS 在基础模型方面的服务
-
基础模型的未来
-
预训练的未来
构建大语言模型应用的技术
现在你已经了解了基础模型,特别是大语言模型,我们来聊聊几种关键方式,如何利用它们来构建应用程序。2022 年 12 月 ChatGPT 事件中,最重要的一个收获就是,用户显然喜欢他们的聊天能够记住对话中的每一刻,记住之前提到的主题,并涵盖对话的所有曲折变化。换句话说,除了通用的问答之外,用户明显偏好聊天能够进行链式对话。我们来看看下面截图中的一个例子:
图 15.1 – 用于聊天应用的链式提问
图 15.1 左右两边的关键区别在于,左侧的回答是不连续的。这意味着模型只是将每个问题作为单独的实体来看待,然后提供其回答。而右侧的回答则是连续的,即整个对话被提供给模型,最新的问题位于底部。这有助于确保回答的连贯性,模型能够更好地保持上下文。
你如何自己设置这个?嗯,首先,我刚才描述的其实并不难。想象一下,只需从你的 HTML 页面读取,将所有的问答数据打包进提示词中,然后提取回答并返回给终端用户。然而,如果你不想自己构建,完全可以使用一些优秀的开源选项!
使用开源堆栈构建互动对话应用
如果你之前没有见过,允许我快速向你介绍 LangChain。它可以在 GitHub 上免费获取,链接是:github.com/hwchase17/langchain
。LangChain 是由 Harrison Chase 和其他超过 600 名贡献者共同构建的开源工具包。它提供了类似于著名的 ChatGPT 的功能,可以指向 OpenAI 的 API 或任何其他基础模型,但允许你作为开发者和数据科学家创建自己的前端和客户体验。
将应用程序与模型解耦是一个明智的做法;仅在过去几个月里,全球已经上线了数百个新的大型语言模型,全球各地的团队也在积极开发更多。当你的应用程序通过单一的 API 调用与模型交互时,你可以更容易地从一个模型切换到下一个,因为随着时间的推移,许可、定价和功能都会升级。这对你来说是一个大大的好处!
另一个有趣的开源技术是 Haystack (26)。由德国初创公司 Deepset 开发,Haystack 是一个非常有用的工具,用于……在大海捞针。具体来说,它充当一个接口,帮助你将自己的 LLMs 带入广泛的问答场景。这是他们的初步专长,后来他们扩展了很多!
在 AWS,我们有一个开源模板,用于在 AWS 上构建 LangChain 应用程序。可以在 GitHub 上找到,链接是:github.com/3coins/langchain-aws-template
。在下面的图示中,你可以看到架构的简要表示:
图 15.2 – 在 AWS 上托管 LangChain
虽然这可以指向任何前端,但我们提供了一个示例模板,供你用于启动应用程序。你也可以轻松地指向任何自定义模型,无论它是在 SageMaker 端点上,还是在新的 AWS 服务 Bedrock 中!稍后在本章中我们会进一步介绍。正如你在前面的图像中看到的,这个模板可以轻松地在任何与云交互的地方运行 UI。让我们来看一下所有的步骤:
-
第一,UI 访问 API 网关。
-
第二,通过 IAM 检索凭据。
-
第三,通过 Lambda 调用该服务。
-
第四,通过 Secrets Manager 检索模型凭据。
-
第五,模型通过调用无服务器模型 SDK 的 API,或者通过调用你训练的并托管在 SageMaker 端点上的自定义模型来调用。
-
第六,查找 DynamoDB 中相关的对话历史,以确保你的回答准确无误。
这个聊天界面如何确保不产生幻觉回答?它如何指向存储在数据库中的一组数据?通过检索增强生成(RAG),我们将在接下来的部分进行讲解。
使用 RAG 确保 LLM 应用程序的高准确性
正如原始的 2020 年*(1)论文中所解释的那样,RAG 是一种检索与给定查询相关的文档的方法。假设你的聊天应用程序接收关于你数据库中特定项目的问题,比如你的产品之一。与其让模型编造答案,不如从你的数据库中检索正确的文档,并仅使用 LLM 来美化*响应。这就是 RAG 如此强大的地方;你可以用它来确保生成答案的准确性保持高,同时在风格和语气上保持一致的客户体验。让我们更仔细地看看:
图 15.3 – RAG
首先,一个问题从左侧出现。在左上方,你可以看到一个简单的问题,定义“中耳”。这个问题被一个查询编码器处理,查询编码器只是一个语言模型,用于生成查询的嵌入。然后,这个嵌入被应用到一个数据库的索引中,这里使用了许多候选算法:K 最近邻、最大内积搜索(MIPS)等。一旦你检索到一组相似的文档,就可以将最好的文档输入到生成器中,右侧的最终模型。这会根据输入的文档返回一个简单的答案。在这里,答案是中耳包括鼓室和 三块小骨。
然而,值得注意的是,这里的 LLM 并没有真正定义什么是中耳。它实际上是在回答问题:“中耳内包含哪些物体?”可以说,中耳的任何定义都会包括其功能,特别是作为耳道和内耳之间的缓冲区,帮助你保持平衡并让你听到声音。因此,这可能是专家强化学习与人类反馈(RLHF)优化的一个好候选。
如图 15.3所示,这整个 RAG 系统是可调的。这意味着你可以并且应该对编码器和解码器部分进行微调,以便根据你的数据集和查询类型调整模型性能。另一种分类文档的方法,正如我们将看到的,是生成!
生成是新的分类吗?
正如我们在 第十三章中学到的,提示工程,有很多方法可以促使你的语言模型输出你想要的响应类型。其中一种方法实际上是让它分类文本中看到的内容!这里有一个简单的图表来说明这个概念:
图 15.4 – 使用生成代替分类
如图所示,传统的分类方法是在训练模型时提前完成一个任务:分类。这个模型可能在分类上表现良好,但它完全无法处理新任务。这一关键缺点是基础模型,特别是大型语言模型如今如此受欢迎的主要原因之一:它们非常灵活,可以在不需要重新训练的情况下处理许多不同的任务。
在图 15.4的右侧,你可以看到我们使用相同的文本作为起始点,但我们并不是将其传递给基于编码器的文本模型,而是传递给基于解码器的模型,并简单地添加了指令:将此句子分类为正面或负面情感。你也可以同样说:“告诉我更多关于这个顾客真实感受的事情,”或者“这个购房者有多乐观?”或者“帮助这个购房者找到一所符合他需求的房子。”可以说,以上三种指令有所不同,逐渐脱离了纯粹的分类任务,转向了更广泛的应用开发或客户体验。随着时间的推移,预计会看到更多类似的例子!让我们再看看另一种构建 LLM 应用程序的关键技术:保持人类在环中的参与。
面向人类的应用程序设计方法,利用大型语言模型(LLMs)
我们之前在第二章**, 数据集准备:第一部分、第十章*,* 微调与评估、第十一章*,* 检测、缓解和监控偏见以及第十四章**, 计算机视觉与语言的 MLOps中涉及过这个话题。我再说一遍,我相信人工标注将成为公司能够提供的竞争优势。为什么?因为构建 LLM 现在变得极具竞争力,开放源代码和专有技术的竞争方都在积极争夺你的业务。开放源代码的选项来自 Hugging Face 和 Stability 等公司,而专有技术则来自 AI21、Anthropic 和 OpenAI。这些选项之间的差异是值得质疑的;你可以查看斯坦福大学的 HELM *(2)*上最新的排名模型,顺便提一句,它也属于该校的人本 AI 倡议。通过足够的微调和定制,你通常应该能够达到预期的性能。
那么,是什么决定了最佳的大型语言模型应用,如果不是基础模型呢?显然,端到端的客户体验至关重要,且始终如此。消费者偏好随时间变化,但一些普遍的技术原则依然存在:速度、简洁、灵活性和低成本。通过基础模型,我们可以清楚地看到,客户更倾向于可解释性和他们信任的模型。这意味着应用设计师和开发人员应当与这些长期的消费者偏好作斗争,选择最大化这些偏好的解决方案和系统。正如你可能猜到的,仅这一点就不是一项小任务。
除了设计和构建成功应用的核心技能外,我们还可以做些什么来在这个充满挑战的 LLM 新世界中保持竞争力呢?我认为,答案就是定制你的数据。专注于让你的数据和数据集变得独特:在目的、广度、深度和完整性上独一无二。充分利用你能获得的最佳资源对数据进行标注,并将其作为整个应用工作流程的核心部分。这将带你进入持续学习,即模型能够根据最终用户的反馈不断变得越来越好。
接下来,让我们看看即将出现的生成模态。
其他生成模态
自 2022 年 ChatGPT 事件以来,技术界大多为生成新内容这一命题所着迷。虽然这一点一直是比较有趣的,但高性能基础模型与媒体对于这些能力的过度热情相遇,再加上疫情后社区对错失机会的强烈恐惧,导致我们进入了生成 AI 的全球关注风暴。
这是一件好事吗?说实话,我很高兴终于看到这种转变;自 2019 年以来,我就一直以某种方式在使用 AI/ML 模型生成内容,作为一个作家和创意工作者,我一直认为这是机器学习中最有趣的部分。我对 David Foster 的关于这一主题的书*(3)*印象深刻。他刚刚发布了这本书的更新版,包含了最新的基础模型和方法!让我们快速回顾一下目前在生成 AI 应用中常见的其他类型的模态。
视觉和语言之外的生成关键模态
这里是我认为最有趣的内容生成类型的简短清单,超出了我们在本书中看到的内容:
-
生成代码
-
生成音乐
-
生成 PowerPoint 幻灯片、广告和视觉内容
-
生成产品文档
-
生成建筑设计,然后构建应用
-
生成电影、电视节目和娱乐内容
-
生成网站、游戏和移动应用
生成代码对大多数人来说并不意外;它与语言生成的核心相似性使得它成为完美的候选者!微调一个大型语言模型(LLM)以输出你所选择语言的代码非常简单;这是我 2019 年的项目*(4),它正是利用 SageMaker 示例笔记本完成了这一任务!代码好吗?绝对不好,但幸运的是,LLM 自那时以来已经取得了很大进展。许多现代的代码生成模型非常优秀,感谢 Hugging Face 和 ServiceNow 的合作,我们现在可以使用一个开源模型!它叫做StarCoder*,并且可以在 Hugging Face 上免费获取:huggingface.co/bigcode/starcoder
。
我喜欢使用开源 LLM 进行代码生成的一个原因是你可以自定义它!这意味着你可以指向你自己的私有代码库,对数据进行标记,更新模型,并立即训练这个 LLM 以生成你组织风格的代码!在组织层面,你甚至可以对开源 LLM 进行一些持续的预训练,以加速所有开发人员的工作,尤其是用于你自己的代码库。接下来,在我们重点讨论 AWS 产品,特别是Amazon Code Whisperer时,我们将看看你可以如何利用 LLM 来更快地编写自己的代码。(27)
前面提到的内容都可以是你自己生成式 AI 项目的绝佳候选者。真的,就像我们看到的,通用机器学习从实验室走向了大多数企业和项目的基础,生成能力也很可能以某种方式走上相同的道路。
那么这意味着工程岗位会被取代吗?老实说,我对此表示怀疑。就像优秀的搜索引擎的崛起并没有取代软件工程岗位,反而让许多人觉得这些岗位更加有趣和可做,我预期生成能力也会有相同的效果。它们擅长快速搜索大量可能性并找到很好的选择,但仍然需要你了解消费者、产品和设计的方方面面。模型并不擅长批判性思维,但它们擅长提出创意并发现不足,至少在文字方面如此。
现在我们已经从高层次上了解了其他生成方式,让我们来看看 AWS 在基础模型方面的产品吧!
AWS 在基础模型方面的产品
在 AWS 上,正如你在本书中所看到的,你有成百上千种方式来优化基础模型的开发和部署。现在让我们来看一下 AWS 在这一领域明确投资以提升客户体验的几种方式:
-
SageMaker JumpStart Foundation Model Hub:该功能在 2022 年 re:Invent 大会预览中宣布,这是一个可以在 SageMaker 环境中便捷访问基础模型的选项。它包括开源模型,如 Hugging Face 提供的 BLOOM 和 Flan-T5,以及专有模型,如 AI21 Jurassic。所有基础模型的列表可在这里查看 (5)。至今,我们已有近 20 种基础模型,所有模型都可以在您自己的安全环境中进行托管。您用于与这些模型进行交互或微调的任何数据都不会与提供方共享。您还可以通过自行选择实例来优化成本。我们有数十个示例笔记本,指向这些模型,适用于各种训练和托管使用场景,您可以在这里 (6) 以及其他地方查看。关于模型训练数据的更多信息,您可以直接在游乐场中阅读。
-
Amazon Bedrock:如果您密切关注 AWS 在 2023 年初的新闻,您可能已经注意到我们发布了一个新的基础模型服务:Amazon Bedrock!正如 Swami Sivasubramanian 在这篇博客文章中所讨论的 (7),Bedrock 是一项通过无服务器接口与各种基础模型进行交互的服务,并且保持安全性。换句话说,Bedrock 为多个基础模型提供了一个入口点,让您能够获得各大提供商的最佳服务。这包括 AI 初创公司,如 AI21、Anthropic 和 Stability。与 Bedrock 交互意味着使用无服务器体验,免去了处理底层基础设施的麻烦。您还可以使用 Bedrock 对模型进行微调!
-
Amazon Titan:通过 Bedrock 提供的另一个模型是 Titan,这是一款由 Amazon 完全训练和管理的大型语言模型!这意味着我们负责处理训练数据、优化、调优、去偏以及所有增强功能,以帮助您获得大规模语言模型的最佳结果。Titan 也将支持微调功能。
亚马逊 Code Whisperer:正如你可能已经看到的,Code Whisperer 是 AWS 在 2022 年发布的服务,并在 2023 年正式上线。有趣的是,它似乎与特定的开发环境紧密结合,利用你正在编写的脚本的整个上下文,并基于此生成推荐。你可以编写伪代码、Markdown 或其他函数起始部分,并通过快捷键调用模型。这样,系统会根据脚本的上下文为你提供多种选项,最终让你选择最适合你的脚本!幸运的是,Jupyter notebooks 和 SageMaker Studio 现在都支持这一功能;你可以阅读 AWS 高级首席技术专家 Brian Granger 的博客,Brian 是 Project Jupyter 的联合创始人,了解更多这些倡议。以下是 Brian 关于这一主题的博客文章:aws.amazon.com/blogs/machine-learning/announcing-new-jupyter-contributions-by-aws-to-democratize-generative-ai-and-scale-ml-workloads/
小贴士:Code Whisperer 对个人用户免费!仔细阅读 Swami 的博客文章的读者也会注意到我们最新的机器学习基础设施更新,如第二版的Inferentia 芯片、inf2,以及带有更高带宽的 Trainium 实例,trn1n。
细心的 Swami 博客文章读者还会注意到我们最新机器学习基础设施的更新,例如第二版的Inferentia 芯片、inf2,以及带有更高带宽的 Trainium 实例,trn1n。我们还推出了免费的代码生成服务CodeWhisperer!
现在我们已经了解了 AWS 在这个领域的一些产品,让我们来假设一下基础模型的未来。
基础模型的未来
对我而言,关于基础模型的发展趋势,有几点似乎是显而易见的:
-
开源和专有模型提供者之间的激烈竞争将持续下去。正如前面提到的,目前我们正处于全球大多数科技行业对基础模型的高度关注的完美风暴中。这里的一个关键轴线是专有模型与开源模型的对比。正如 5 月 4 日泄露的 Google 文档(8)所建议的,开源世界的能力正在不断提升,在许多情况下,开源选项比专有选项更优。实际上,他们将开源模型描述为“按重量计算更强大”。这意味着就模型本身的规模而言,开源世界所生产的小型模型在按字节大小比较时表现得更好。
-
如果模型消费者对模型提供者保持灵活性,他们将以更低的成本获得更多的选择。对我来说,这场激烈竞争的结果很明确;随着时间的推移,你会得到越来越多的选择,且价格会越来越低!这意味着,作为模型消费者,明智的选择是不要把自己锁定在单一模型上。随着基础模型的勇敢新世界的推进,确保你和你的团队处于最佳的情境,并保持灵活性,跟随新模型的出现。
-
模型正变得越来越小且更强大。这在很大程度上得益于开源社区中由 Stable Diffusion 推动的热情,基础模型现在正在减小体积,但其准确性却在提高。这意味着今天你可以用一个 13B 参数的模型,如 StableVicuna (28),完成几年前需要 175B 参数模型才能完成的任务。在你设计应用时,记得这一点!
-
将专有数据和人工反馈作为你的优势。为了最大限度地利用这些竞争,我建议你依托你的数据。只要你愿意接受最新最强的模型基础,将你的专有数据和人工反馈作为关键投资领域,就能使你从市场中脱颖而出。确保你和你的团队从一开始就频繁地标注数据,并尽可能多地利用你们独特的视角和专业知识。
-
安全性对于与基础模型的互动至关重要。这一信号在市场中非常明显,消费者强烈偏好那些能够保护其数据并且不允许与模型提供者共享数据的环境,包括模型查询和微调资产。从某种意义上说,这也是将专有数据和人工反馈作为优势的衍生品;在未来的世界里,你的数据将成为你的卖点。以你自己的基础模型的形式保护这些数据,保持模型公正,避免越狱攻击,并防止生成仇恨言论,依旧是至关重要的。看起来,确保基础模型应用程序安全,可能需要一套全新的安全措施。
-
基础模型正在成为新的数据库,自然语言则是新的编程语言。我预计未来十二个月内,大多数应用将把基础模型作为一种新型数据库。现在,除了将记录存储在磁盘上,你还可以通过神经网络对其进行处理,学习映射关系和数据之间的联系,这些是单个人类无法与之竞争的,并且能与人类进行自然语言交互。优化、扩展、去偏见、确保准确性以及降低成本将是未来几年的工作重点。
我还预计会有更多的基础模型,涵盖不同的模式、用户群体、语言、技术、目标和领域。随着训练和生产它们的成本因激烈的竞争而下降,我们可能会看到越来越多的入门级开发者进入这个市场。考虑到这一点,让我们在最后总结一下关于预训练未来的思考。
预训练的未来
让我们回顾一些提供谨慎和批判性评估的趋势,来看一看最近基础模型的“淘金热”。其中最突出的例子之一是杰弗里·辛顿辞去谷歌职务(29),警告 AI 发展的危险,并呼吁对所有基础模型研究实施 6 个月的暂停(30)。
个人来说,我认为这一暂停并没有认识到最初推动这种炒作的原因:AI 经济学的无形之手。找到高薪的技术工作并不容易;获得并维持美国及类似国家的签证也并非易事。在一个拥有一些最聪明且最有驱动力的人才的行业中,随着快速变革和颠覆性的变化来发展你的职业生涯是绝非简单的。基础模型和所有技术的进步之所以发展,是因为人类需要证明自己、发展职业并养家糊口。要求暂停大规模训练的实验几乎等同于要求大量年轻人停止将他们的热情、技能和时间投入到自己职业发展的最佳选择中。显然,这与他们的最佳利益背道而驰!
然而,即便是在支持继续研究基础模型的阵营中,并非每个人都对预训练变压器的持续价值持过于乐观的态度。我们在第一章中提到的科学家雅恩·勒昆,曾开发了 MNIST,他认为自监督学习是“智能的暗物质。(9)”自从 ChatGPT 全球热潮以来,勒昆对大型语言模型和自回归模型的局限性提出了严厉批评,因为它们的核心优势仅仅是预测序列中下一个最可能的词素,而并非以任何可靠的方式理解世界。相反,他建议我们构建能够学习推理的 AI 模型,包括开发行动计划的层级表示。
他在这个警示中并不孤单。华盛顿大学和艾伦人工智能研究所的麦克阿瑟学者崔烨金 (10) 最近在 TED 演讲中分享了她的看法,关于为什么“AI 非常聪明——但又令人震惊地愚蠢。” (11) 崔烨金在常识推理方面的几十年工作表明,尽管 NLP 模型可能能解决一些有限的任务,但它们仍然在一些极其基础的人类任务上挣扎,比如理解现实与虚构之间的区别,或者假设和规划、简洁性的价值,以及基本的世界逻辑映射。
对我来说,这里的分界是清晰的。一方面,我们有着数十年的推动,致力于构建最佳且最令人印象深刻的人工智能表现。另一方面,我们有着庞大的商业、技术和学术产业,数百万的人的努力致力于构建应用并提供价值,这些应用和价值为他们的职业生涯和团队的长久发展奠定了基础。这个技术发展经济体是否会创造出最聪明的机器?可能会。是否会建立起提供消费者价值的应用和商业?当然会。未来几十年,这两种相关却不同的方向会继续重叠吗?毫无疑问。
在我们结束之前,我想提一下几个特别与预训练相关的有趣技术趋势:
-
持续预训练:如果你的基础模型能够从最新的数据中受益,并且这些数据以持续的更新流提供,为什么不构建一个持续的摄取和训练循环,以保持你的应用性能呢?这是 2022 年论文中的核心提议 (12)。我想象一些应用会从这种持续的训练流中受益,特别是当参数高效微调 (31) 使得这种方式的成本更具吸引力时。
-
检索预训练:随着生成式 AI 应用的扩展,对准确生成文本的需求将持续增加。DeepMind 提出的这种方法,将检索过程 (14) 应用于预训练,并在使用 25 倍更少的参数的情况下,达到与 GPT-3 相似的性能,使其在训练和托管时更加高效且更具吸引力。我预计,在预训练期间检索令牌的基本概念会与 RAG (15) 结合,发展成提供更高准确性保证的大型语言模型(LLM)。
-
更多通用的预训练机制:正如你们可能已经注意到的,很多媒体和开源关注似乎仅集中在模型和低级任务中的新一代表现上。我认为这是一个问题,因为它忽略了这些模型的根基——它们的来源和构建方式:预训练本身。这意味着,如果预训练能够变得更易于获取和更具普遍性,我们就能从对模型的固守转向对预训练本身的广泛支持。目前已有一些朝着这个方向迈出的步伐,例如 Data2Vec (16),它提出了一个适用于视觉、语音和语言的自监督学习通用框架。另一个尝试是UL2,统一语言学习范式。Google Brain 团队建议结合不同的预训练范式,然后在微调时切换不同的范式。
-
更多语言,拜托!我在疫情后亲自参加的第一场会议之一是 2022 年计算语言学协会大会*(18)。我惊喜地发现,他们特别关注多语言,强烈且令人钦佩地推动着能够跨越语言障碍并拓展自然语言处理技术在全球濒危语言和社区中的应用。令人钦佩的是,联合国宣布 2022-2023 年为国际土著语言十年,估计到 2100 年,至少 50%的现有语言将会灭绝或面临严重危险(32)。这将继续成为基础模型中的一个重要话题,因为它是技术采用和创新的瓶颈之一。朝着这一方向迈出的一个步骤是清华大学的 GLM-130B (19),这是一个明确以中文和英文预训练的模型。另一个值得注意的双语模型是 Hugging Face 的 BLOOM (20),该模型在 46 种自然语言和 13 种编程语言上进行了训练。其他类似的项目也提供了针对单一非英语语言的能力,例如 LightOn 的法语模型 PAGnol (21)、日语掩码语言模型(22)*、德语 LLM *(23)*等。甚至还有呼声要求推出 BritGPT (24),以将生成能力引入英国的口语和会话风格。
在这一点上,让我们以最后的结论结束本书。
总结
真是一次难忘的旅程!感谢那些和我一起坚持到最后的你们,感谢你们投入的时间、创意和精力,学习我的文字和思考。我希望至少一些见解对你们来说是值得的,也希望错误没有过于显眼。
在本书中,我们详细讲解了预训练基础模型的整个过程,展示了来自视觉和语言的关键用例和示例,并了解了在 AWS 上构建应用程序和项目的核心能力。我非常喜欢听取读者的反馈,所以请随时联系我并保持联系!我在 LinkedIn 上很活跃,您可以随时通过问题或评论与我交流。我每周在 Twitch 上做一档关于生成式 AI 的节目,您可以在那里找到我,并参与反馈或评论。(25)
当然,您也可以随时与您的 AWS 团队联系,直接与我交流!我喜欢与客户见面,思考架构选择,将您的需求传达给我们的服务团队,并与您一起构思如何创造更美好的明天。告诉我您迫不及待想要构建的项目!
参考文献
请查看以下内容以获取更多章节涉及主题的信息:
-
知识密集型自然语言处理任务的检索增强生成:
arxiv.org/pdf/2005.11401.pdf
-
生成式深度学习:教机器绘画、写作、作曲和演奏(第 1 版):
www.amazon.com/Generative-Deep-Learning-Teaching-Machines/dp/1492041947
-
aws-samples/amazon-sagemaker-architecting-for-ml:
github.com/aws-samples/amazon-sagemaker-architectingfor-ml/tree/master/Example-Project
-
aws/amazon-sagemaker-examples:
github.com/aws/amazon-sagemaker-examples/tree/main/
-
宣布 AWS 上用于构建生成型人工智能的新工具:
aws.amazon.com/blogs/machine-learning/announcing-new-tools-for-building-with-generative-ai-on-aws/
-
Google “我们没有护城河,OpenAI 也没有”:
www.semianalysis.com/p/google-we-have-no-moat-and-neither
-
自监督学习:智能的暗物质:
ai.facebook.com/blog/self-supervised-learning-the-dark-matter-of-intelligence/
-
Yejin Choi:
homes.cs.washington.edu/~yejin/
-
为什么人工智能非常聪明却又令人震惊地愚蠢:
www.ted.com/talks/yejin_choi_why_ai_is_incredibly_smart_and_shockingly_stupid/c?language=en
-
持续预训练缓解语言和视觉中的遗忘问题:
arxiv.org/pdf/2205.09357.pdf
-
LoRA:大型语言模型的低秩适应:
arxiv.org/abs/2106.09685
-
通过从万亿个标记中检索来改进语言模型:
arxiv.org/pdf/2112.04426.pdf
-
检索增强生成用于知识密集型自然语言处理任务:
arxiv.org/pdf/2005.11401.pdf
-
data2vec: 一个通用的自监督学习框架,适用于语音、视觉和语言:
arxiv.org/pdf/2202.03555.pdf
-
UL2:统一语言学习范式:
arxiv.org/pdf/2205.05131.pdf
-
ACL 2022:
www.2022.aclweb.org/
-
GLM-130B:一个开放的双语预训练模型:
openreview.net/pdf?id=-Aw0rrrPUF
-
BLOOM:一个 176B 参数的开放访问多语言语言模型:
arxiv.org/pdf/2211.05100.pdf
-
LightOn 发布 PAGnol,最大的法语语言模型:
medium.com/@LightOnIO/lighton-releases-pagnol-the-largest-french-language-model-f50b719352ab
-
日本学术领域的掩码语言模型:
aclanthology.org/2022.sdp-1.16.pdf
-
Cedille.ai 推出了最大的德语文本生成语言模型:
cedille.ai/blog/cedille-ai-launches-the-largest-language-model-in-german-for-text-generation
-
英国需要自己的“BritGPT”,否则将面临不确定的未来,议员们听闻:
www.theguardian.com/business/2023/feb/22/uk-needs-its-own-britgpt-or-will-face-an-uncertain-future-mps-hear
-
AWS 时间表:
www.twitch.tv/aws/schedule?seriesID=340be301-27dc-42c6-890a-302cd13899af
-
deepset-ai/haystack:
github.com/deepset-ai/haystack
-
Hugging Face: https://huggingface.co/CarperAI/stable-vicuna-13b-delta
-
暂停大型 AI 实验:一封公开信:
futureoflife.org/open-letter/pause-giant-ai-experiments/
-
huggingface/peft:
github.com/huggingface/peft
-
经济和社会事务部土著人民:
www.un.org/development/desa/indigenouspeoples/indigenous-languages.html