在这篇文章中,我们探讨了如何使用 Amazon SageMaker 定制奖励模型以提升客户满意度。文章阐明了人类反馈的重要性,介绍了如何通过奖励建模技术使大型语言模型LLM能够生成更符合公司价值观的响应。利用定制的奖励模型,我们可以为客户提供体现品牌身份和道德的独特体验。
随着强大的大型语言模型LLMs的使用越来越广泛,它们在各种任务中表现出更高的准确性,借助生成式人工智能AI构建的应用程序和服务数量也在不断增加。组织希望确保这些 LLMs 所生成的响应与其组织价值相符,并且能够提供预期的独特客户体验。
但评估 AI 生成的响应存在挑战。本文讨论了如何通过 Amazon SageMaker 构建定制的奖励模型,以通过程序化定义奖励功能来提升客户体验。同时这些定制的客户体验能够独特地反映出组织的品牌形象和价值观。
现成的 LLM 虽然高效,但常常缺乏针对组织特定需求和终端用户的定制化。不同组织和客户群体对人类反馈的主观性存在差异,因此收集多样的、主观的人类反馈以改进 LLM 被证明既耗时又不可扩展。
本文章展示了一种奖励建模技术,能够高效地通过定义程序化的奖励功能来为组织定制 LLM。我们将演示一种无需进行高强度、人为判断即可交付与组织相匹配的 LLM 结果的方法。该技术旨在通过将组织的主观质量标准编码进一个奖励模型中,以引导 LLM 产生合乎预期的输出,从而克服定制化和可扩展性挑战。
并非所有人类反馈都是相同的。我们可以将人类反馈分为客观和主观两种类型。
任何人都能认同左侧的箱子是白色,而右侧的箱子是黑色。这一判断是客观的,毫无争议。而对于 AI 模型的输出是否“出色”的判断则本质上是主观的。以颜色谱为例,不同的人会基于自身的感知提供不同的描述。一人的白色在另一人看来可能就是灰色。
这种主观性为通过人类反馈改进 AI 带来了挑战。与客观的正确与错误反馈不同,主观偏好具有复杂性和个人化特征。同样的输出可能在某人耳中被赞美,而在另一个人看来则会受到批评。关键在于承认并考虑人类偏好的根本主观性。我们必须让模型能够接触到丰富多彩的人类主观判断,而不是追求难以捉摸的客观真理。
flyingbird 飞鸟机场与传统的分类模型任务不同,评估一个资源广泛的对话代理的质量具有高度主观性。一个人的引人入胜的文章在另一个人看来可能是无的放矢。我们该如何完善这些广泛的语言模型呢?关键在于从多样的人群中收集反馈。有足够的主观观点,关于引人入胜的对话、逻辑的一致性和无害内容的模式就会显现。模型随后可以基于更广泛的人类偏好进行调整。
一般认为,奖励模型仅仅与基于人类反馈的强化学习RLHF相关。但实际上,奖励建模超越了 RLHF,它可以成为align AI 生成响应与特定组织价值和品牌身份的强大工具。
你可以选择一个 LLM,并让其针对不同的提示生成多条响应,然后人类标注者将对这些响应进行排名。确保标注者的多样性非常重要,并且清晰的标记指导原则至关重要。没有明确的标准,判断可能会变得任意。有效的维度包括连贯性、相关性、创造力、事实准确性、逻辑一致性等。人类标注者将这些响应分类并标记为从最喜欢到最不喜欢。
通过汇总这些主观评分,可以发现读者之间的共鸣。汇总的人类反馈本质上训练了一个独立的奖励模型,旨在提升满足大众吸引力的写作品质。将大众视角浓缩为 AI 奖励功能的这一技术被称为 奖励建模。奖励建模提供了一种根据多样的主观观点来提高 LLM 输出质量的方法。
在本文中,我们详细介绍了如何基于组织特定的人类标记反馈训练奖励模型。下图展示了解决方案的架构。
如需更多详细信息,请查看附带的 notebook。
要成功训练奖励模型,您需要以下内容:
大型数据集,包含符合组织和最终用户需求的提示及人类标注者排名的响应。对于本文,我们将数据集存储在 Amazon Simple Storage Service (Amazon S3) 桶中。一个小型语言模型,如 OPT27b、Falcon 7b大约 6 GB 的解码器模型。实现 分布式训练 的机制。对于本文,使用 SageMaker。与 Amazon SageMaker Studio 用户配置文件相关联的 AWS 身份与访问管理 (IAM) 角色,该角色有权访问保存经整理的数据集的 S3 桶。对于本文,标准的 SageMaker IAM 角色就足够了。有关最佳实践和 SageMaker 身份基础策略示例的指导,请参阅 Amazon SageMaker 身份基础策略示例。一个 SageMaker 域。您可以快速启动 SageMaker 域并为启动 SageMaker Studio notebook 环境设置单个用户,以便完成模型训练。有关设置您环境的说明,请参见 快速上手 Amazon SageMaker 域。完成以下步骤以启动 SageMaker Studio:
在 SageMaker 控制台中,选择导航面板中的 Studio。在 Studio 登陆页面,选择域和用户配置文件以启动 Studio。选择 打开 Studio。为启动 SageMaker Studio 选择 启动个人 Studio。让我们看看如何在 SageMaker Studio notebook 环境中本地创建奖励模型,采用来自 Hugging Face 模型库的预先存在的模型。
在进行奖励建模时,从人类获取反馈数据可能会很昂贵。这是因为奖励建模需要来自其他人类工作者的反馈,而不仅仅依赖于系统常规使用过程中的收集数据。奖励模型的表现如何,取决于来自人类的反馈的质量和数量。
我们推荐使用 AWS 托管的产品,如 Amazon SageMaker Ground Truth。它提供了最全面的人机循环能力,使您能够在机器学习ML生命周期中利用人类反馈的力量,以提高模型的准确性和相关性。您可以使用 SageMaker Ground Truth 完成多种人机循环任务,从数据生成和标注到模型审阅、定制和评估,支持自助服务或 AWS 托管的方式。
在本文中,我们使用 IMDB 数据集训练一个奖励模型,使其对被标记为正面的文本给予更高的分数,而对负面文本给予更低的分数。
我们使用以下代码准备数据集:
pythondef createcustomdataset(rawdataset) df = rawdatasettopandas() negativedf = df[df[label]==0] positivedf = df[df[label]==1] negativedf = negativedfdrop( columns=[label])rename( columns={text rejected}) # shuffle the data positivedf = positivedfsample( frac=1 randomstate=0)resetindex( drop=True)drop(columns=[label])rename( columns={text chosen}) joineddf = negativedfjoin(positivedf)
def tokenizefn(texts maxlength=argsseqlength) encoded = tokenizer( texts padding=maxlength maxlength=maxlength truncation=True addspecialtokens=False ) return encodedrejectedencoded = tokenizefn(joineddfrejectedvaluestolist())joineddf[rejectedinputids] = rejectedencoded[inputids]joineddf[rejectedattentionmask] = rejectedencoded[attentionmask]encodedchosen = tokenizefn(joineddfchosenvaluestolist())joineddf[choseninputids] = encodedchosen[inputids]joineddf[chosenattentionmask] = encodedchosen[attentionmask]traindataset = Datasetfrompandas(joineddf preserveindex=False)return traindatasetwithformat(torch)
以下示例显示了准备数据集中一个样本记录,包含对被拒绝和被选择响应的引用。同时我们也嵌入了被选择和被拒绝响应的输入 ID 和注意力掩码。
python{rejected 如果不想在未来制作这种类型的影片,这部影片作为实验相当有趣,但并未讲述任何连贯的故事。观众也许会感到强烈,想着它探讨了许多重要议题,但它却没有任何明显的动机。观众没有得到新的视角除非在思维游离的过程中产生某个观点,因而难以做好观影体验。不如花时间凝视窗外的树木更好。 chosen 这是一部伟大的电影。我每次观看都更爱它。大多数喜剧可能都会变得无趣,因为你知道所有的包袱,但《神秘人》在写作和角色塑造上有如此高的完整性,所以再次观看比如本斯蒂勒撕扯轿车的车标,汉克阿佐里告别路易丝拉瑟,杰弗里拉什展示他作为元首的舞蹈,或者汤姆威茨耳语收入新闻报道,或者简加罗法洛拒绝保罗鲁滨逊的吻是种享受。这是完美无缺的群像表演。故事直截了当而一致,动作场景富有创意,且不太具有主导性,所有设定在最后都有回报。认真说,如果你看过,而已经一段时间没看了,再看看,如果你还没有,那么就开始吧。只有先看过第一遍后,才可再观看。韦斯斯图迪,威廉H梅西,试镜场面,太多精彩的内容! rejectedinputids tensor([1106 129 7 1 1 1]) rejectedattentionmask tensor([1 1 1 0 0 0]) choseninputids tensor([713 16 10 1 1 1]) chosenattentionmask tensor([1 1 1 0 0 0])}
在这里,我们使用 OPT13b开放预训练转换器语言模型,可通过 Amazon SageMaker JumpStart 从 Hugging Face 获取。如果您希望在笔记本中执行所有本地训练,而不是分布式训练,则需要使用具有足够加速器内存的实例。我们在 mlg4dnxlarge 实例类型的笔记本中运行以下训练代码:
pythonfrom transformers import ( AutoModelForSequenceClassification AutoTokenizer setseed ) from datasets import Dataset loaddataset import torch
model = AutoModelForSequenceClassificationfrompretrained( facebook/opt13b torchdtype=torchbfloat16 devicemap=auto numlabels=1 )
在以下代码片段中,我们创建了一个自定义训练器,用于计算模型在任务中的表现:
pythonfrom torch import nn from transformers import Trainer import torchnnfunctional as F

class CustomTrainer(Trainer) def computeloss(self model inputs returnoutputs=False) choseninputids = inputs[choseninputids] chosenattentionmask = inputs[chosenattentionmask] rejectedinputids = inputs[rejectedinputids] rejectedattentionmask = inputs[rejectedattentionmask]
rw = model(choseninputids chosenattentionmask)logits rl = model(rejectedinputids rejectedattentionmask)logits outputs = (rw rl) loss = Flogsigmoid(rw rl)mean() return (loss outputs) if returnoutputs else loss
它比较了模型对两组输入数据的结果:一组是被选择的,一组是被拒绝的。然后训练器使用这些结果来判断模型在区分选择和拒绝数据方面的表现。这帮助训练器调整模型,以提高任务的绩效。CustomTrainer 类用于创建专用训练器,计算涉及选择和拒绝输入序列的特定任务的损失函数。这个自定义训练器扩展了由 transformers 库提供的标准 Trainer 类的功能,可以根据任务的特定要求,量身定制处理模型输出和损失计算的方法。如下所示:
pythonfrom transformers import TrainingArguments
trainingargs = TrainingArguments(outputdir=rewardmodel overwriteoutputdir=True dotrain=True doeval=False dopredict=False evaluationstrategy=no learningrate=5e5 numtrainepochs=1 perdevicetrainbatchsize=2 gradientaccumulationsteps=32 removeunusedcolumns=False)
trainer = CustomTrainer( model=model args=trainingargs traindataset=traindataset )
trainertrain()trainersavemodel()
上述代码片段中的 TrainingArguments 用于配置 ML 模型训练过程中各个方面。让我们逐一解析每个参数的目的以及它们如何影响训练结果:
outputdir 指定训练模型及其相关文件保存的目录。此参数有助于组织和存储训练模型以备后用。overwriteoutputdir 决定是否在已存在的情况下覆盖输出目录。将其设为 True 允许在不手动删除的情况下重用相同目录。dotrain 指示是否执行训练。如果设置为 True,则模型将使用提供的训练数据集进行训练。doeval 和 dopredict 控制是否执行评估和预测任务。在这种情况下,两个选项均设置为 False,意味着只进行训练。evaluationstrategy 定义训练过程中何时进行评估。设置为“no”意味着训练期间不进行评估。learningrate 指定优化器的学习率,影响模型从数据中学习的速度快慢。numtrainepochs 设置训练期间模型遍历整个训练数据集的次数。一轮意味着对所有训练样本的完整遍历。perdevicetrainbatchsize 确定在每个设备例如,GPU上训练时每批次处理的样本数量。较小的批量大小可能导致训练较慢,但培训更稳定。gradientaccumulationsteps 控制在更新模型参数之前累积梯度的次数。这有助于利用大批量稳定训练。removeunusedcolumns 指定在处理之前是否应删除数据集中未使用的列,以优化内存使用。通过在 TrainingArguments 中配置这些参数,您可以影响训练过程的各种方面,例如模型性能、收敛速度、内存使用情况,以及基于特定需求和限制的总体训练结果。
当您运行此代码时,它会基于您从人类标注者那里收集的主观反馈的数值表示来训练奖励模型。经过训练的奖励模型将对 LLM 响应给出更高的分数,从而表明这些响应更有可能受到人类偏好的青睐。
您现在可以将 LLM 的响应输入到该奖励模型中,模型所生成的数值分数将告知您 LLM 的响应与奖励模型中包含的主观组织偏好的对齐程度。下图展示了这一过程。您可以将此数字用作决定是否向最终用户共享