DLAI-RLHF-笔记-全-

DLAI RLHF 笔记(全)

001:课程介绍

概述

在本节课中,我们将要学习从人类反馈中进行强化学习的基本概念、重要性及其应用场景。RLHF是一种关键的模型调优技术,用于使大型语言模型的输出与人类的偏好和价值观保持一致。


课程背景与重要性

欢迎来到《从人类反馈中进行强化学习》课程,本课程是与Google Cloud合作构建的。

一个仅从公共互联网数据训练的基础大语言模型,其输出风格会反映互联网的语调,因此可能生成有害、虚假或无益的信息。RLHF是一项重要的调优技术,对于使语言模型的输出与人类偏好和价值观保持一致至关重要。该算法是推动大语言模型崛起的关键部分。

即使您并非从头开始训练一个大语言模型,而是在构建一个需要设定其价值观的应用程序,RLHF对您也可能非常有用。虽然微调是实现此目的的一种方法,但在许多情况下,RLHF可能更高效。

RLHF的核心概念与应用

例如,对于一个基础模型,响应“法国的首都是什么?”这个提示,存在多种有效方式。它可以回复“巴黎是法国的首都”,或者更简单地回复“巴黎”。在这些回复中,有些会让人觉得比其他更自然。因此,RLHF是一种收集人类对回复偏好的反馈的方法,目的是训练模型生成更多人类偏好的回复。

在这个过程中,您从一个已经过指令微调的模型开始,这意味着它已经学会了遵循指令。然后,您收集数据,这些数据表明了人类标注员对于同一提示的多个补全回复之间的偏好。接着,使用这些数据作为奖励信号,或创建一个奖励信号,来对指令微调过的语言模型进行微调。

最终的结果是一个经过调优的大型语言模型,它生成的输出补全能更好地与人类标注员的偏好保持一致。

讲师介绍

我很高兴向大家介绍讲师Nikkita Najahi。她是Google Cloud上生成式AI的开发倡导者,经常在生成式AI开发者活动中发表演讲,并帮助了许多人构建生成式AI应用程序。我期待她与我们分享她在生成式AI和RLHF方面的深厚实践经验。

感谢Andrew。我非常高兴能与您和您的团队合作。在本课程中,您将了解RLHF流程,并通过实践探索RLHF的样本数据集、使用RLHF调优Llama 2模型,以及评估新调优的模型。

学习平台与课程特色

我们将使用Google Cloud的机器学习平台Vertex AI来贯穿这些概念。RLHF最让我兴奋的一点是,它能帮助我们提升大语言模型解决那些期望输出难以用其他方式解释或描述的任务的能力。换句话说,就是解决那些没有单一正确答案的问题。在我们自然希望使用大语言模型解决的许多问题中,确实不存在一个正确答案。这是一种非常有趣的训练机器学习模型的思维方式,它不同于您可能已经熟悉的监督式微调。

RLHF并不能解决大语言模型中所有关于真实性和毒性的问题,但它确实是提升这些模型质量的关键部分。我认为随着该领域的发展,未来我们将继续看到更多类似的技术。我非常兴奋能与您分享它的工作原理,并且很高兴地告诉您,开始学习并不需要任何强化学习知识

致谢与课程预告

许多人共同努力创建了这门课程。我要感谢Google Cloud方面的Bethany Wang、Mehu和Yarek Cosmeir,以及来自DeepLearning.AI的Chuck。Eddiedi Shu和Leslie Zerma也为本课程做出了贡献。

接下来,让我们进入下一个视频,Nikkita将在其中概述RLHF,以便您能看到它的所有组成部分以及它们是如何协同工作的。


总结

本节课中,我们一起学习了从人类反馈中进行强化学习的初步介绍。我们了解了RLHF对于引导大语言模型符合人类价值观的重要性、其基本工作原理(通过收集人类偏好数据来创建奖励信号并微调模型),以及本课程将提供的实践机会。我们认识到,RLHF特别适用于处理那些没有标准答案的开放式任务,并且是当前提升大语言模型质量的关键技术之一。

002:RLHF工作原理概述 🧠

在本节课中,我们将学习从人类反馈中进行强化学习的基本概念。这是一种用于使大型语言模型的输出更符合用户意图和偏好的技术。我们将通过一个总结任务的例子,逐步拆解RLHF的三个核心阶段。


概述

RLHF旨在解决一个问题:对于许多自然语言任务,不存在唯一的“正确答案”,而是存在多种符合人类偏好的有效回答。因此,我们不再训练模型寻找单一答案,而是通过收集人类对模型输出的偏好,并利用这些偏好数据来引导模型学习。

上一节我们介绍了RLHF的目标,本节中我们来看看其具体的工作流程。


RLHF的三个阶段 🚀

RLHF主要包含三个步骤:

  1. 创建偏好数据集。
  2. 使用偏好数据集训练奖励模型。
  3. 在强化学习循环中使用奖励模型来微调基础大语言模型。

第一阶段:创建偏好数据集

我们从一个希望微调的基础大语言模型开始。首先,我们使用这个基础模型为一系列提示生成多个不同的补全(回答)。

例如,对于提示“总结以下文本:我想开始园艺,但是……”,模型可能会生成多个总结版本。

接下来,关键的一步是让人类标注员对这些生成的回答进行评价。直接让标注员给每个回答打分效果并不理想,因为评分标准主观且因人而异。

一个更有效的方法是进行成对比较。以下是具体做法:

  • 向人类标注员展示针对同一提示的两个不同模型输出。
  • 要求标注员选出他们更偏好的那一个。
  • 这种数据被称为偏好数据,它记录了人类在特定输入下对两个可能输出的选择。

需要注意的是,这个数据集反映的是具体标注员的偏好,而非广义的“人类”偏好。创建高质量的偏好数据集是RLHF中最具挑战性的环节之一,因为它要求明确定义“对齐”的标准(例如,是让模型更有用、更无害,还是更积极)。

一旦我们收集了足够的偏好数据,第一阶段就完成了。


第二阶段:训练奖励模型

接下来,我们利用上一步收集的偏好数据来训练一个奖励模型。在RLHF中,奖励模型本身通常也是一个语言模型。

在推理时,奖励模型接收一个提示和一个补全,并输出一个标量分数,用以表示该补全对于给定提示的“好坏”程度。因此,奖励模型本质上是一个回归模型。

以下是训练奖励模型的核心思想:

  • 训练数据是三元组:(提示, 获胜补全, 失败补全)
  • 对于每个候选补全,模型会生成一个分数。
  • 损失函数的设计旨在最大化获胜补全与失败补全之间的分数差

训练完成后,我们就可以将任何提示-补全对输入奖励模型,并获得一个分数。分数越高,代表该补全越符合标注数据所体现的人类偏好。


第三阶段:强化学习微调

现在,我们进入RLHF中的“RL”部分。我们的目标是微调基础大语言模型,使其生成的补全能够最大化从奖励模型获得的奖励

为此,我们需要引入第二个数据集:提示数据集。顾名思义,它只包含一系列提示,没有对应的补全。

在深入如何使用这个数据集之前,我们先快速了解一下强化学习的基本框架。

强化学习快速入门

强化学习适用于训练模型完成具有复杂、开放目标的任务。智能体通过与环境交互来学习:

  • 状态:环境的当前情况(例如,游戏棋盘局面)。
  • 动作:智能体可以采取的操作(例如,移动棋子)。
  • 奖励:环境对智能体动作的反馈(正分或负分)。
  • 策略:一个函数,它根据当前状态决定智能体应采取哪个动作。策略的学习目标就是最大化累积奖励。

在RLHF中的应用

在RLHF场景中,这些概念对应如下:

  • 策略:我们要微调的基础大语言模型
  • 状态:当前的上下文,即提示加上已生成的文本。
  • 动作:生成下一个词元
  • 奖励:由奖励模型为生成的完整补全给出的分数。

因此,学习最大化奖励的策略,就等于得到一个能生成高奖励分数补全的大语言模型。这个策略通常通过近端策略优化算法进行更新。

以下是每一步的具体流程:

  1. 从提示数据集中采样一个提示。
  2. 将提示传递给基础大语言模型(策略),生成一个补全。
  3. 将“提示-补全”对输入奖励模型,获得奖励分数。
  4. 使用PPO算法,根据该奖励分数更新基础大语言模型(策略)的权重。

每次更新后,策略(即模型)在生成符合偏好的文本方面应该会有所改进。实践中,通常会添加一个惩罚项,以防止微调后的模型偏离原始基础模型太远。


参数高效微调 ⚙️

微调神经网络时,更新全部权重的方式称为全参数微调。但对于参数量巨大的大语言模型,这非常耗时耗力。

参数高效微调是一种旨在缓解此问题的技术,它只训练模型参数的一小部分。这些参数可以是原有参数的子集,也可以是新增的参数。这样做的好处包括:

  • 大幅减少训练时间和计算资源。
  • 部署更简单:可以共享一个基础模型,仅为不同任务或用户加载不同的、轻量的微调参数集。

在本课程中,我们对Llama 2模型的微调将采用参数高效微调的实现。


总结

本节课中我们一起学习了RLHF的工作原理。我们了解到,RLHF通过以下三个主要步骤使大语言模型与人类偏好对齐:

  1. 创建偏好数据集:通过人类对模型输出的成对比较,收集偏好数据。
  2. 训练奖励模型:利用偏好数据训练一个能对补全质量打分的模型。
  3. 强化学习微调:将基础大语言模型作为策略,在奖励模型的指导下,通过PPO等算法进行微调,以生成能获得高奖励(即更符合人类偏好)的文本。

此外,我们还介绍了参数高效微调的概念,它是实际应用中用于降低大模型微调成本的关键技术。现在,你已经掌握了RLHF的基本原理,接下来可以进入实践环节了。

003:RL训练数据集准备 📊

在本节课中,我们将学习为RLHF训练准备数据。RLHF需要两个关键数据集:偏好数据集提示数据集。我们将以在Reddit帖子摘要任务上微调OSS Llama2模型为例,具体了解这两个数据集的构成和内容。

概述

在微调大型语言模型之前,数据准备是至关重要的第一步。RLHF流程依赖于两个核心数据集:用于训练奖励模型的偏好数据集,以及用于强化学习循环的提示数据集。本节我们将详细探索这两个数据集的结构和内容。

探索偏好数据集

首先,我们来看看偏好数据集。这个数据集用于训练奖励模型,通常是RLHF中最棘手的部分之一,因为它包含了人类标注的偏好,而不同的人可能有不同的判断标准。

以下是加载和查看偏好数据集的步骤:

  1. 导入JSON库并加载数据:我们首先导入必要的库,并定义一个空列表来存储数据。
    import json
    preference_data = []
    

  1. 读取数据文件:我们将循环读取一个名为 sample_preference.jsonl 的JSONL格式文件,并将每一行数据添加到列表中。
    with open('sample_preference.jsonl', 'r') as f:
        for line in f:
            preference_data.append(json.loads(line))
    

  1. 查看数据结构:加载完成后,我们可以查看数据的具体内容。每个数据样本都是一个字典。
    sample_one = preference_data[0]
    print(type(sample_one))  # 输出: <class 'dict'>
    print(sample_one.keys()) # 输出: dict_keys(['input_text', 'candidate_0', 'candidate_1', 'choice'])
    

字典包含四个键:

  • input_text:这是提示(prompt),即需要被总结的Reddit帖子原文。所有提示都以特定的指令结尾,例如 [总结]:。保持训练和推理时提示格式的一致性非常重要,这样模型才能识别出任务模式。
  • candidate_0candidate_1:这是针对同一个 input_text 生成的两种可能的摘要(completion)。
  • choice:这是人类标注者的偏好选择,其值(例如 1)表示标注者认为 candidate_1 是优于 candidate_0 的摘要。我们称被选中的为 获胜候选,另一个为 失败候选

奖励模型将基于 (input_text, 获胜候选, 失败候选) 这样的三元组进行训练,学习为更好的摘要输出更高的标量分数。

探索提示数据集

上一节我们介绍了偏好数据集,本节中我们来看看第二个关键数据集——提示数据集。在奖励模型训练完成后,我们将使用它在强化学习循环中微调基础大语言模型。这个过程需要一个仅包含样本提示的数据集。

以下是加载和查看提示数据集的步骤:

  1. 加载数据:与之前类似,我们从一个名为 sample_prompt.jsonl 的小文件中加载数据。

    prompt_data = []
    with open('sample_prompt.jsonl', 'r') as f:
        for line in f:
            prompt_data.append(json.loads(line))
    
  2. 查看数据结构:提示数据集的结构更简单。我们可以定义一个辅助函数来清晰地打印字典内容。

    def print_d(dictionary):
        for key, value in dictionary.items():
            print(f"{key}: {value}")
    
  3. 检查数据样本:使用这个函数查看数据。

    print_d(prompt_data[0])
    # 输出示例:
    # input_text: I noticed this the very first day... [总结]:
    

    可以看到,每个样本只有一个 input_text 键,其值就是一个提示文本。这些提示同样来自Reddit帖子,并且以相同的 [总结]: 指令结尾。

一个重要提示:偏好数据集和提示数据集中的提示必须来自相同的分布。在本例中,它们都源自Reddit帖子数据集,因此满足这个条件。

总结

本节课中我们一起学习了RLHF训练所需的两个核心数据集。偏好数据集包含提示、两个候选摘要以及人类偏好选择,用于训练奖励模型区分摘要质量。提示数据集则仅包含一系列提示,用于在强化学习阶段微调基础语言模型。理解这两个数据集的结构和关系,是成功实施RLHF的关键第一步。在下一课中,我们将实际使用这些数据集来微调我们的模型。

004:使用 RLHF 微调大语言模型 🚀

在本节课中,我们将学习如何启动完整的 RLHF 工作流,使用 Google Cloud 的 Vertex AI 平台来微调一个大语言模型。我们将介绍如何利用 Vertex AI 管道来封装和自动化 RLHF 的多个复杂步骤,并详细讲解配置和启动一个 RLHF 调优任务所需的各项参数。


概述:理解 Vertex AI 管道

上一节我们介绍了 RLHF 的基本概念和数据准备。本节中,我们来看看如何将这些组件整合到一个可执行的工作流中。

在 Vertex AI 上,RLHF 调优任务以 Vertex AI 管道 的形式运行。机器学习管道是基于容器的、可移植且可扩展的工作流。你的工作流中的每一步,例如准备数据集、训练模型、评估模型,都是管道中的一个组件。

正如我们讨论过的,RLHF 由许多不同的步骤组成,涉及多个数据集和模型。管道是一种将这些步骤封装到单个对象中的便捷方式,有助于自动化和复现你的机器学习工作流。

你不需要自己编写管道,我们将使用一个现成的管道。为了更具体地理解,下图展示了一个基础的机器学习管道:

  • 橙色方框 是你的机器学习工作流中的组件或步骤,这里会执行一些代码。
  • 蓝色方框 是这些组件产生的 工件。工件指的是在机器学习工作流步骤中创建的任何东西,例如数据、训练好的模型和一些评估指标。

运行这个管道时,首先执行“创建数据”步骤,产生数据(深蓝色框)。然后这些数据被用于“训练模型”步骤,输出一个训练好的模型和一些评估其性能的指标。

一个 RLHF 管道则更为复杂,可能如下图所示:

我们首先创建一个偏好数据集。该数据集用于训练奖励模型。然后,奖励模型与提示数据一起,通过强化学习来微调基础大语言模型。最终,我们得到一个微调后的大语言模型和一些输出的训练曲线。

实际上,我们将要执行的管道包含更多步骤。这个 RLHF 管道存在于 Google Cloud 管道组件开源库中。要运行它,你需要先导入、编译,然后执行。


准备环境与导入管道

首先,我们需要确保安装了必要的库。在你的环境中,你需要运行:

pip install google-cloud-pipeline-components

同时确保安装了 Kubeflow Pipelines 库 (kfp)。本课程环境已为你预先安装好。

以下是导入和编译管道的步骤:

  1. 导入管道:我们从 google_cloud_pipeline_components 库中导入 RLHF 管道。请注意,RLHF 目前处于预览阶段,因此管道位于 preview 文件夹下。

    from google_cloud_pipeline_components.preview.llm import rlhf_pipeline
    
  2. 导入编译器:该管道使用 Kubeflow Pipelines 库编写,因此我们需要导入其编译器。

    from kfp import compiler
    
  3. 编译管道为 YAML 文件:编译过程会创建一个 YAML 文件,其中包含了执行管道所需的所有信息。

    # 定义 YAML 文件路径
    rlhf_pipeline_package_path = “rlhf_pipeline.yaml”
    # 编译管道
    compiler.Compiler().compile(
        pipeline_func=rlhf_pipeline,
        package_path=rlhf_pipeline_package_path
    )
    

    生成的 YAML 文件非常长,它用自然语言详细描述了整个管道,包括名称、描述和所有输入参数。


探索 RLHF 管道结构

Vertex AI 提供了一个可视化工具来查看管道的所有组件。我们将要执行的 RLHF 管道结构如下图所示(整体视图可能较复杂):

我们可以放大管道的特定部分(例如右侧),其结构如下:

  • 组件:带有蓝色立方体的方框,代表执行代码的步骤。例如,“奖励模型训练器”组件负责训练奖励模型,“强化器”组件是微调基础大语言模型的强化学习循环。
  • 工件:带有黄色三角形的方框,代表管道运行产生的任何输出。例如,“奖励模型训练器”组件会输出一些指标,保存在“TensorBoard 指标”工件中。

这个管道看起来相当复杂,但它已经由 Vertex AI 团队编写并针对平台和 RLHF 进行了优化。YAML 文件是自动生成的,你通常不需要编辑它,直接使用即可。


配置 RLHF 管道参数

现在我们已经有了 YAML 文件,可以定义一个 Vertex AI 管道作业了。这需要传入 YAML 文件以及针对我们具体用例的所有参数。

首先,我们创建一个参数字典 parameter_values。以下是需要逐一查看的关键参数:

1. 数据集路径

以下是三个数据集的路径参数。所有数据都必须存储在 Google Cloud Storage 中,并且是 JSON Lines 格式。路径以 gs:// 开头。

  • preference_dataset_uri: 偏好数据集的路径。
  • prompt_dataset_uri: 提示数据集的路径。
  • evaluation_dataset_uri: (可选)评估数据集的路径。调优完成后,将使用此数据执行批量推理任务。

Cloud Storage 使用 存储桶 来组织数据。在本例中,数据已预先上传到一个公开可访问的存储桶中。对于你自己的项目,你需要将数据上传到自己的存储桶。

2. 基础模型选择

  • large_model_reference: 指定要微调的基础大语言模型。本例中使用开源的 Llama 2 模型 (“llama-2-7b”)。其他支持的模型包括 “text-bison” 和 T5x 系列模型。

3. 训练步数

  • reward_model_train_steps: 训练奖励模型的步数。这取决于你的偏好数据集大小。根据实验,模型最好在偏好数据上训练约 20 到 30 个周期 以获得最佳结果。
  • reinforcement_learning_train_steps: 执行强化学习微调的步数。这取决于你的提示数据集大小。根据实验,模型最好在提示数据上训练约 10 到 20 个周期

注意:参数接收的是步数,而非周期数。以下是一个将周期转换为步数的实用启发式方法:

import math

# 假设你的数据集大小和批次大小
data_size = 128  # 可以是偏好数据或提示数据的大小
batch_size = 64   # RLHF on Vertex AI 使用固定的批次大小

# 计算每个周期的步数
steps_per_epoch = math.ceil(data_size / batch_size)  # 例如:128 / 64 = 2

# 设定你想训练的周期数
num_epochs = 10

# 计算所需的总训练步数
total_training_steps = steps_per_epoch * num_epochs  # 例如:2 * 10 = 20

你可以根据自己数据集的大小,使用上述方法计算 reward_model_train_stepsreinforcement_learning_train_steps

4. 学习率与 KL 系数

这些是更高级的参数,初次尝试时可以使用默认值。

  • reward_model_learning_rate_multiplierreinforcement_learning_rate_multiplier: 用于在训练奖励模型或强化学习循环时调整基础学习率的常数。默认值为 1.0
    • 乘以大于 1 的数会增加每次训练步骤中梯度更新的幅度。
    • 乘以小于 1 的数会减小更新的幅度。
  • kl_coeff: KL 散度系数,是一个正则化项,有助于防止 奖励黑客 问题。默认值为 0.1
    • 奖励黑客是指模型学会生成能获得奖励模型高分、但对人类无意义的输出(例如堆砌正面词汇)。
    • KL 系数通过惩罚微调模型与原始基础模型分布差异过大的情况来防止这一点。
    • 系数设为 0 表示没有惩罚。系数越大,对偏离原始模型的惩罚越重。

5. 任务指令

  • instruction: 让模型知道需要执行什么任务的文本。例如,“Summarize in less than 50 words”
    • 此文本将被预置到你的数据集(偏好和提示数据集)中的每个提示前。
    • 仅当 你的数据集中尚未包含指令时才需要设置此参数。

认证、初始化与运行作业

配置好所有参数后,我们准备创建并运行管道作业。这意味着 RLHF 管道将在 Vertex AI 的云端服务器上执行,而不是在本地笔记本中。

  1. 认证与初始化:首先需要向 Google Cloud 认证并初始化 Vertex AI Python SDK。本课程已为你完成设置。
    # 导入自定义认证函数(课程环境已提供)
    from utils import authenticate
    credentials, PROJECT_ID, STAGING_BUCKET = authenticate()
    REGION = “europe-west4”  # RLHF 管道在此区域可用
    
  2. 初始化 AI Platform
    import vertexai
    vertexai.init(project=PROJECT_ID, location=REGION, credentials=credentials)
    
  3. 创建管道作业
    from google.cloud import aiplatform
    job = aiplatform.PipelineJob(
        display_name=“tutorial_rlhf_tuning”,  # 作业显示名称
        template_path=rlhf_pipeline_package_path,  # 之前编译的 YAML 文件路径
        parameter_values=parameter_values,  # 我们定义的参数字典
        pipeline_root=STAGING_BUCKET  # 存储管道输出工件的存储桶
    )
    
  4. 运行作业
    job.run()
    
    请注意:运行此作业需要数小时甚至更长时间,并消耗大量计算资源。出于在线课堂的考虑,我们不会实际运行它。在下一课中,我们将查看一个已执行完毕的管道的结果。

总结

本节课中,我们一起学习了如何配置和启动一个完整的 RLHF 微调管道。我们介绍了 Vertex AI 管道如何封装复杂的多步骤工作流,详细讲解了配置管道所需的关键参数,包括数据集路径、模型选择、训练步数、学习率调整、KL 系数以及任务指令。最后,我们了解了如何通过 Vertex AI SDK 认证、初始化和提交管道作业。虽然实际运行作业耗时较长,但下一课我们将分析一个已完成作业的输出结果,以评估 RLHF 微调的效果。

005:评估微调后的模型 🧐

在本节课中,我们将学习如何评估经过RLHF流程微调后的大型语言模型。RLHF包含多个步骤,但我们的最终目标不仅是训练一个模型,而是创建一个比原始模型性能更优的新模型。因此,我们将讨论几种不同的评估策略,并查看新微调模型的结果。

评估大型语言模型的方法 📊

评估大型语言模型时,我们可以关注几个不同的方面。需要说明的是,LLM评估仍然是一个快速发展的研究领域,本课内容只是冰山一角。但概括来说,我们主要关注以下几点。

以下是几种主要的评估方法:

  1. 训练曲线:观察训练过程中产生的损失等曲线,以判断模型是否在学习。这与训练神经网络或其他机器学习模型时类似。
  2. 自动化指标:这些是可以通过算法或数学公式计算的性能指标,通常需要真实标签。包括常见的指标如准确率或F1分数,以及更常用于生成任务的指标,如Rouge系列指标,用于衡量生成文本与人类参考文本的相似度。
  3. 并列评估:使用同一组输入提示,比较两个模型的性能。这可以计算出胜率,即特定模型产生更优响应的百分比。

对于RLHF,研究人员发现训练曲线和并列评估最为有用。如果你熟悉Rouge指标并好奇为何它在RLHF中价值有限,尽管它常用于摘要任务,原因是Rouge分数可能不适合作为RLHF的衡量标准。Rouge分数并不很好地描述与人类偏好的一致性,它只告诉你生成文本与参考文本的接近程度。甚至有研究表明,在RLHF中,对Rouge的优化越严重,模型性能反而可能越差。

分析训练曲线 📉

我们将首先查看一些训练曲线。上一课中创建的Vertex AI RLHF流水线将一些训练曲线输出到了TensorBoard。TensorBoard是一个用于机器学习实验可视化的开源项目,你可以通过 pip install tensorboard 安装。在本环境中,它已经预先安装好了。

加载TensorBoard扩展后,我们可以启动它。我们将使用命令 %tensorboard --logdir,并提供一个包含TensorBoard日志文件的文件夹路径。例如,奖励模型训练的日志文件位于名为 reward_logs 的目录中。

执行相应单元格后,我们将看到TensorBoard启动。我们可以滚动查看我们关心的指标——排名损失。这是用于训练奖励模型的损失函数。与其他损失函数一样,我们希望看到这条曲线随时间下降并最终收敛。从图中可以看到,曲线确实在下降并趋于平缓,这表明训练效果良好。

接下来,让我们查看强化学习阶段的曲线。我们再次调用TensorBoard命令,并传入包含强化学习步骤日志文件的另一个目录。

在TensorBoard中,我们主要关注两个指标。第一个是KL散度损失,它告诉我们模型与原始基础模型的偏离程度。理想情况下,我们希望看到这条曲线上升并最终趋于平缓。第二个是奖励值,理想情况下,它应该随时间增加并最终稳定下来。

然而,在我们查看的日志中(基于1%数据子集训练),KL损失和奖励曲线都波动很大,没有明显的收敛趋势,这表明模型没有很好地学习。

现在,让我们查看在完整数据集上训练产生的日志。再次启动TensorBoard并传入相应的目录。这次,我们可以看到曲线更接近我们的预期:KL损失持续上升后趋于平缓,奖励值也持续增加后稳定下来。这正是我们希望看到的行为。

这些曲线是我的同事Bethany使用Reddit数据集和Llama2模型进行大规模调优实验时生成的。她使用了完整的偏好数据集、提示数据集和评估数据集,并设置了以下关键参数:奖励模型和强化学习的训练步数均为10,000步,奖励模型学习率乘数为1.0,强化学习率乘数为0.2,KL系数为默认值0.1,指令与之前相同:“summarize in less than 50 words”。

如何访问你自己的TensorBoard日志 🔍

目前,我们通过Python SDK在Notebook中与Google Cloud交互。如果你想在控制台中访问,可以前往 console.cloud.google.com,进入你的Google Cloud项目,在Vertex AI部分选择“Pipelines”。

在“Pipelines”页面,你可以看到在特定区域运行的所有流水线。在“Runs”下,选择你的流水线(名称应与之前设置的相同,如“RLHF_train_template”)。点击流水线后,会打开之前展示过的组件可视化图。

要找到奖励模型训练的TensorBoard日志,可以放大右上角标有“reward model trainer”的组件。该组件会产生一个名为“tensorboard_metrics”的工件。点击这个方框,右侧会弹出一个UI,显示Google Cloud存储中的路径。点击该路径,即可打开TensorBoard日志。在该目录中,你可以找到一个以 events.out.tfevents 开头、以 .v2 结尾的文件。

类似地,要找到强化学习循环的日志,点击“reinforcer”组件,然后打开其产生的“tensorboard_metrics”工件,按照相同步骤即可访问日志文件。

进行并列评估 🔄

训练曲线可以帮助我们了解模型是否在学习,但评估大型语言模型有时最好的方法就是直接查看它们对一组输入提示生成的补全内容。

在上一课创建流水线作业时,我们传入了一个评估数据集。这组数据只包含提示(没有补全内容),我们称之为评估数据,但它可能与你过去在机器学习中使用的评估数据集有所不同。这些数据会被传递给微调后的模型进行批量推理作业。这意味着一旦模型完成微调,我们就会为这个评估数据集中的所有提示生成补全内容,我们并不计算任何指标,只是调用模型并产生文本输出。

为了让这一点更具体,让我们查看一些评估结果。这里加载了一个评估结果的小子集供你检查,它也是一个JSONL文件。

首先,我们导入JSON库,并定义结果文件的路径。然后,我们创建一个空列表,循环读取JSONL文件并将数据追加到列表中。接下来,使用第二课定义的 print_d 函数来可视化字典的键值对。查看列表中的第一个元素,它是一个字典,其中 inputs 键的值是另一个字典,包含 inputs_pretokenized 键,其值就是我们的提示。这个提示包含了我们在启动流水线时设置的指令“summarize in less than 50 words”,它被预置到了评估数据中的Reddit帖子前。模型为这个输入提示生成的预测结果(即摘要)显示在 prediction 字段中。

接下来,我们进行并列评估。这意味着我们将查看同一组提示在Llama2模型微调前和微调后生成的补全内容。

首先,加载包含基础模型(即微调前的Llama2模型)推理结果的文件。这个数据集包含的输入提示与我们的评估数据集完全相同。我们同样创建一个空列表,循环读取文件并将数据追加到列表中。

现在,我们有两个列表:一个包含微调后Llama2模型的结果,另一个包含未微调Llama2模型的结果。查看未微调数据集中的第一个例子,你会发现提示相同,但补全内容不同,因为它来自运行RLHF微调之前的模型。例如,对于同一个关于情人节和玫瑰的提示,未微调模型生成的摘要以第三人称提及“作者”,而微调后的模型生成的摘要则使用了第一人称,与原始发帖人的口吻一致。

为了更方便地比较所有结果,避免反复打印和滚动,我们将所有内容放入一个DataFrame中进行真正的并列评估。

首先,我们从微调模型的结果数据集中提取所有提示,创建一个提示列表。然后,我们分别从未微调模型和微调模型的结果中提取补全内容,创建两个补全列表。

最后,我们导入pandas库,创建一个名为 results 的DataFrame。它包含三列:prompt(提示)、base_model(RLHF微调前模型生成的补全)和 tuned_model(RLHF微调后模型生成的补全)。我们可以设置pandas的显示选项以便更好地可视化,然后查看这个DataFrame,对每一行进行并列评估,尝试判断你更喜欢哪个补全结果。

如何访问批量评估结果 📁

对于你自己的RLHF调优工作,要访问批量评估结果,同样需要进入云控制台并打开你的流水线。

这次,你需要放大标有“perform inference”的组件。在该组件下,你会看到一个名为“bulk infer”的子组件,它负责执行批量推理作业,即接收我们评估数据集中的JSONL提示文件,并调用模型为每个提示生成补全。点击该组件,右侧会弹出一个方框,显示“output parameters”。其中,“output_prediction_gcs_path”参数指向Google Cloud存储中的一个位置,该位置存有包含结果的JSONL文件。你可以点击该链接,下载JSONL文件并查看结果。

RLHF领域的新兴技术 🚀

课程最后,我想介绍两种RLHF领域有趣的新技术。

第一种是RLIF,即“利用AI反馈扩展人类反馈强化学习”。这是一种非常有趣的技术,我们实际上使用一个现成的大型语言模型来创建带有偏好标签的数据集。之前我们看到的偏好数据是由人类标注员标注的,但现在研究领域正在探索使用大型语言模型来创建偏好数据的不同方法。如果你好奇如何使用AI模型帮助生成偏好数据,我推荐你阅读相关论文。

第二种相关技术是自动并列评估。这与我们在Notebook中进行的并列评估类似,但不是由人类查看微调前后的结果,而是使用第三个任意的大型语言模型(而非人类标注员)来进行评估。这意味着这个大型语言模型会查看未微调模型和微调模型的响应,并决定它更喜欢哪一个,通常还会提供解释。你可以在幻灯片中看到Google Cloud自动并列评估服务的截图,其中包含提示、未微调模型的响应、微调模型的响应,以及第三个人工智能模型偏好的选择和解释。

这些新兴的研究领域希望能让你了解这个领域是如何不断演进的。

总结 📝

本节课中,我们一起学习了如何评估经过RLHF微调后的大型语言模型。我们介绍了三种主要的评估方法:分析训练曲线、计算自动化指标以及进行并列评估,并重点探讨了训练曲线和并列评估在RLHF中的实用性。我们通过TensorBoard查看了奖励模型和强化学习阶段的训练曲线,学习了如何解读KL损失和奖励值的变化趋势。接着,我们实践了并列评估,通过对比同一提示在模型微调前后生成的文本来直观判断模型性能的提升。最后,我们了解了RLHF领域的两项新兴技术:RLIF和自动并列评估,它们代表了该领域未来的发展方向。希望本课内容能帮助你有效地评估自己的RLHF模型。

006:总结 🎯

在本节课中,我们将对 RLHF 短期课程进行总结,回顾所学到的核心概念与实践流程。

上一节我们介绍了模型评估的方法,本节中我们来看看整个课程的要点回顾。

我们首先从概念上概述了 RLHF 的工作原理及其涉及的不同数据集。随后,你学习了如何使用机器学习流水线来微调开源的 Llama 2 模型,并了解了如何评估微调后的结果。

以下是本课程涵盖的核心步骤列表:

  • 概念理解:掌握 RLHF 的基本框架与数据流程。
  • 模型微调:运用 ML pipelineOSS Llama 2 模型进行调优。
  • 结果评估:对微调后的模型性能进行衡量与分析。

我希望这些知识能为你未来使用 RLHF 微调自己的模型做好准备。我非常期待看到你构建出的成果。

本节课中我们一起学习了 RLHF 的完整流程,从理论认知到实践操作与评估。恭喜你完成了这门关于 RLHF 的短期课程。

posted @ 2026-03-26 08:12  绝不原创的飞龙  阅读(1)  评论(0)    收藏  举报