斯坦福-CS224r-深度强化学习笔记-全-

斯坦福 CS224r 深度强化学习笔记(全)

001:课程介绍与行为建模

欢迎来到深度强化学习课程CS224R。我很高兴能在这个季度再次教授这门课程。我叫Chelsea,是这门课的讲师。我是斯坦福大学的助理教授。我的研究方向包括强化学习、机器人学和语言模型等。今天的计划是,我们将介绍课程目标和一些后勤信息。这部分内容会比较简短,因为所有信息都可以在线获取。之后,我们将讨论为什么要学习深度强化学习,并开始涉及一些关于行为建模和强化学习的技术内容。

今天的关键学习目标是:什么是深度强化学习?我们如何以一种可以优化的方式来表示行为?以及如何构建一个强化学习问题?

什么是深度强化学习?🤔

首先,对于强化学习,我们指的是决策问题。这类问题中,系统需要基于不断获得的信息做出多个决策。系统会观察,然后根据观察采取行动,接着再次观察并采取另一个行动。我们将研究这类问题及其解决方案,包括模仿学习、无模型和基于模型的强化学习、离线和在线强化学习、多任务和元强化学习,以及一些关于大语言模型和机器人的强化学习的额外内容。这是课程中强化学习部分的核心。我们将强调那些可以扩展到深度神经网络的解决方案,而较少关注那些与深度神经网络无关的解决方案。

强化学习与其他机器学习主题有何不同?🔄

希望你们很多人对机器学习有一些经验。在机器学习中,通常会有一些输入输出对 (x, y),并且在一个数据集中有很多这样的对。你的目标是学习一个可以从 x 映射到 y 的东西。另一个通常的假设是,这些数据点是从某个分布中独立同分布地采样得到的。

这正是强化学习有很大不同的地方。在监督学习中,我们有带标签的数据,我们学习函数,我们被直接告知给定输入应该输出什么。输入是独立同分布采样的。

在强化学习中,情况有些不同。最终,我们的目标是学习行为。我们实际上会使用不同的术语来指代输入和输出。具体来说,我们的目标是从状态映射到动作。我们将执行这种映射的函数称为策略 π

与监督学习不同,我们不会被直接告知答案。我们的目标实际上是从更间接的反馈中学习这种行为。因此,在强化学习中,目标是从经验中学习这个策略 π(s)。这些经验通常来自于你正在学习的策略或函数。数据不会从单一分布中采样,而是以一种实际上取决于你当前正在学习的策略或函数的方式采样。

这是两个主要区别。我所说的“行为”可以包括像控制机器人这样的运动控制、与人类交互的聊天机器人、玩游戏、驾驶汽车、与网络交互的智能体,以及许多其他领域。

这就是强化学习与典型机器学习的区别。

课程目标与范围 🎯

我们无法涵盖深度强化学习的所有内容。因此,我们将尝试专注于深度强化学习方法背后的核心概念,以便你可以利用这些核心概念来理解更高级的方法,如果你选择更深入地研究这个主题。我们还将专注于算法的实现,让你能够自己实现算法。我们将在讲座和项目中给出机器人学、控制和语言模型方面的例子,但许多技术将具有更广泛的适用性。我们还将专注于我们认为最有用和最令人兴奋的主题。

如果你对更多理论和其他超出这些范围的应用感兴趣,CS234课程也是一个很好的选择。核心目标是能够理解和实现关键强化学习领域中的现有和新兴方法。

为什么要学习深度强化学习?🚀

我将在这里列出几个原因,然后对每个原因进行更深入的探讨。

  1. 超越监督学习:在许多场景中,AI模型的预测会产生后果。如果我们想要考虑这些后果,就需要一个框架来思考这些后果,以及如何根据这些后果来优化行为。例如,如果你在Spotify上听音乐,Spotify算法为你推荐一首歌。这个推荐(甚至直接播放)会产生后果,比如下次推荐时,它可能不应该推荐同一首歌,并且可能希望保持在相同的流派内。因此,如果我们想要开发能够考虑这些后果的AI系统,深度强化学习使我们能够做到这一点。

  2. 直接监督不可用:在许多场景中,直接监督是不可用的。例如,如果你有一个像Cursor或Copilot这样的编码助手,你想给它反馈说“那里做得很好”或“那里做得不好”,这种监督不是输出,而是一种更间接的监督。从这种间接监督或任何目标中学习,都可以被构建为一个强化学习问题,因此它比监督学习灵活得多。

  3. 广泛应用:强化学习在许多高性能AI系统中被广泛使用和部署。

  4. 从经验中学习:在我看来,从经验中学习似乎是智能的基础。因此,从构建智能机器的哲学层面来看,弄清楚如何开发能够从自身经验中学习的算法,似乎是非常基础的。这对于能够真正发现新事物而不仅仅是模仿数据也是基础。

  5. 激动人心的开放研究问题:这个领域还存在许多令人兴奋的开放研究问题,使其成为一个进行研究的激动人心的领域。

  6. 实际激励:上周末我告诉一个朋友我正在制作关于为什么要学习深度强化学习的幻灯片,并说我做了好几张幻灯片。他们说:“这个问题似乎不难回答,答案就是OpenAI提供的百万美元总薪酬。”所以,如果前四点不能激励你,这或许可以成为一些动力。

超越监督学习 🌐

决策问题无处不在,并且不能直接构建为监督学习问题。任何AI智能体都属于这个范畴。此外,如果你希望你的AI系统与人交互,比如聊天机器人或推荐系统,或者场景中决策会影响未来的结果或观察,这些反馈循环就是强化学习问题。如果你没有标签,或者你的目标不仅仅是准确性,或者是不可微分的,这些场景下强化学习就很有用。

深度强化学习的应用实例 🤖🎮

深度强化学习被用于各种不同的高性能系统。例如,使用强化学习(在模拟中训练然后转移到现实世界)学会了行为的腿式机器人,你可以看到像灵活的机器人和跳舞的人形机器人这样的酷炫成果,这些都是现实世界中通过深度强化学习训练的策略。

除了腿式机器人和跳舞,你还可以让机器人用机械臂操作物体完成任务,例如卸载和折叠衣物,或者折叠简单的折纸。这些都是使用这类方法可以完成的酷炫事情。

你还可以学习玩复杂的游戏。几年前,DeepMind使用深度强化学习训练了一个系统来玩围棋游戏,并击败了世界冠军李世石。这本身就令人印象深刻,另一个非常酷的事情是,它体现了AI系统的发现能力。有一手棋(第37手)让所有围棋专家都感到惊讶,它发现了一种人类以前未曾想到的策略。这表明强化学习可以成为发现新解决方案的工具,这可能不仅限于游戏。例如,如果我们想发现新药或需要实验的事物,强化学习提供了一个工具。

这不仅仅是机器人和游戏。几乎所有现代语言模型都使用某种形式的强化学习进行后训练,特别是用于更高级的推理。也有研究使用强化学习进行交通控制,寻找将自动驾驶汽车插入人类驾驶车流中的方法,以提高不同道路的通行量。还有研究使用强化学习训练叙事模型,例如,试图使生成的内容更符合特定的提示。这些例子表明,如果你要求基础标准模型生成一张海豚骑自行车的图片,它可能会给你一张不太好的图片。然后,你可以通过强化学习优化,得到一张更有效地遵循提示的图片。这同样适用于其他提示。

强化学习也被用于芯片设计,有一篇论文设计了用于谷歌生产TPU的芯片,这也非常有用。

这些只是一些例子,还有很多其他例子没有涵盖。

从经验中学习与智能的基础 🧠

接下来,我想讲一个小故事来说明为什么深度强化学习似乎是智能的基础。当我刚开始攻读博士学位时,我加入了一个研究机器人强化学习的实验室。我坐的地方旁边就是这个机器人。实验室里经常有一位博士后用强化学习进行实验。我会看着这个机器人,它会做这样的事情。真正让我着迷的是,你可以看到它随着时间的推移在学习。开始时,它对如何组装玩具飞机的两个部件一无所知,但最后它能够相当熟练地完成。

这非常酷,你可以看到它在现实世界中从自己的经验中学习。本质上,强化学习实现了这种通过练习变得更好的能力,这是其他机器学习系统所不具备的。

但这里有一个注意事项:这个特定的机器人是“闭着眼睛”的,它没有使用摄像头。这对我来说似乎是一个根本性的限制。因此,我实际上和那位博士后合作了一个后续项目,使用摄像头和视觉。在这个案例中,机器人能够在现实世界中学习如何将红色积木放入形状分类管中。同样,随着它一遍又一遍地练习任务,它变得越来越好。在学习过程之后,它仍然在学习、改进,最终成功率达到了95%或100%。然后,我可以(至少是年轻时的我)为机器人拿着积木,机器人可以将正确的积木放入正确的孔中。这些都是非常简单的任务,在某种程度上是很久以前的事了。现在我们有了可以折叠衣物和跳舞的机器人。

但我喜欢展示这些视频的原因之一是,它们真正展示了现实世界中的强化学习过程以及通过练习改进的能力。

激动人心的开放研究问题 🔬

同时,也存在大量开放的、令人兴奋的研究问题。如果你对做研究感到兴奋,这些挑战包括:机器人如何学习表示什么对任务有益?智能体如何将行为泛化到许多不同场景,而不仅仅是一个场景?我们能否在大规模、多样化的数据集上应用这样的系统,并从其他任务和目标中迁移?我们能否使用强化学习处理长周期任务,比如做一顿饭或解决一个非常难的数学问题?机器人能否完全自主地练习?对于最后一点,我给你们看了一些强化学习的视频,但这并不总是实际情况。有时,如果你在机器人上运行强化学习,它看起来更像这样:机器人试图将冰球击入球门,每次尝试任务后,它都需要重新开始,机器人实际上不知道如何撤销任务。这是我的朋友Yevgen,你可能会注意到Yevgen实际上比机器人做了更多的工作,这似乎不是做事的正确方式,以这种方式收集大量数据是不切实际的。

沿着所有这些主题,这些也是我们将在本课程中涵盖的一些主题。我们将讨论奖励学习以及如何表示不同的奖励,讨论离线强化学习、多任务强化学习和元强化学习,以及分层、推理和无重置强化学习。

学习深度强化学习是很有趣的。

关于在现实世界中学习奖励的问题:在那个特定的例子中,我们将奖励表示为物体位置与目标位置之间的负距离。你可能已经注意到,在形状分类积木的例子中,机器人实际上拿着积木,因此我们可以使用机器人手臂的位置来测量积木的位置。在实践中,许多场景下你无法做到这一点,这特定于那个任务。在冰球例子中,冰球上实际上有一个动作捕捉标记来测量它在房间中的位置。总的来说,这非常困难,这就是为什么奖励学习对于以更通用的方式解决问题是必要的。

行为建模与强化学习 🧩

现在,让我们深入探讨行为建模和强化学习。我们需要弄清楚如何将经验表示为数据。就像机器人练习时,我们需要思考如何将视频中捕捉到的内容表示为可以学习的数据。这是另一个机器人在现实世界中学习的例子。我们可能还想思考如何表示来自聊天机器人的文本。在任何一种情况下,我们都需要思考智能体收集的经验,我们如何将其写成数据?

在强化学习中,我们通常这样做:首先,我们考虑世界的状态,用 s 表示世界的当前状态。例如,在机器人的情况下,世界的状态可能是手臂的位置、毛巾的位置和挂钩的位置。如果你无法直接获取关于毛巾的信息,它可能只是机器人摄像头捕捉到的图像,以及手臂关节的位置(如果你能获取的话)。

你并不总是能直接访问世界的状态。因此,有时我们会提到观察 o,并使用观察而不是状态。观察和状态之间的区别在于,观察可能无法捕捉到你做决策所需的全部信息,你可能实际上需要考虑过去观察到的信息。例如,对于一个聊天机器人,如果你正在与它交互,你可以将给定时间步的观察视为你发送给聊天机器人的最新消息。这个最新消息并不包含它需要知道的关于下一个回复的所有信息。因此,你实际上需要给它过去观察的历史,而不仅仅是当前的观察,以便做出决策。

我们将在接下来的几张幻灯片中更多地讨论状态和观察的区别。

这大致捕捉了智能体正在观察的内容。现在,我们还需要捕捉它如何采取行动,如何做出决策,我们将这些决策称为动作,用字母 a 表示。

在与环境的一次交互方面,我们将其视为一个轨迹。这将是一系列状态和动作,或者一系列观察和动作。这是一种表示行为的方式。这将产生一个轨迹数据集,而不是一个 (x, y) 对的数据集。

然后我们需要思考,智能体的目标是什么?这就是奖励函数的作用。奖励函数本质上告诉我们一个给定的状态和动作有多好。在许多情况下,奖励函数只取决于状态。例如,它可能告诉你毛巾离被挂起有多近,或者毛巾是否被挂起。在聊天机器人的情况下,它可能是用户有多开心,或者他们是否给了你点赞或点踩。

然后,这种经验就是轨迹,并且该轨迹可能会用奖励来增强。所以,每次你运行策略时,你都会得到这种形式的数据。

状态与观察 🔍

让我们先更多地讨论状态和观察。我们可以将状态和动作视为有点像马尔可夫链。假设我们有世界的第一个状态。例如,在机器人的情况下,假设毛巾在桌子上,有一个挂钩,目标是把毛巾挂在挂钩上。第一个状态是机器人处于某个中立位置,毛巾在桌子上。

然后机器人会采取某个动作。比如将手臂移动到特定位置。

那个动作和当前状态将决定下一个状态是什么。然后从那里,如果机器人只是在自由空间中移动,毛巾可能还在同一位置,或者毛巾可能被移动了。

然后机器人将采取另一个动作,再次移动它的手臂。状态和动作将决定下一个状态。

这里一个关键点是,我们可以思考环境是如何在所谓的动态函数下变化的。你有 p(s₃ | s₂, a₂)。这基本上是世界的动态:手臂和毛巾在空间中如何移动,作为之前位置和机器人所做动作的函数。

这里需要注意的关键点是,s₃ 只取决于 s₂a₂,而不取决于 s₁。本质上,在给定 s₂ 的条件下,s₃ 将与 s₁ 独立。这种独立性被称为马尔可夫性。这是强化学习中实际上非常有用的一点,因为它允许你将问题分解为这些场景,而不必担心之前的所有依赖关系。

现在,如果你有观察而不是状态,那么情况看起来就有点不同了。我们可以将观察视为状态的一个函数。它可能不包含状态的所有信息。因此,任何给定时间点的观察,如果你无法观察状态,那么 o₃ 就不仅仅是 o₂a₂ 的函数,它实际上也是 o₁ 的函数(如果你无法观察状态的话)。

在幻灯片上,我们可以思考这个模型:我们有这些动态,我们不知道世界将如何演化,我们无法直接预测未来。这些动态是未知的,并且在这些动态中,sₜ 独立于 sₜ₋₁,这被称为马尔可夫性。

关于在实践中需要多少过去的观察来推断状态的问题,这在很大程度上取决于领域。在许多机器人学例子中,通常只使用当前的传感器观察就足够了,但这很大程度上取决于传感器是什么。例如,如果你有触觉传感器,它们通常不像视觉观察那样包含那么多信息。因此,例如,当你没有接触时,你离桌子有多近是不知道的,一旦你接触了,你就知道了。这比图像更具部分可观测性。如果你有图像,那么它会给你一个更完整的表示。

关于为什么奖励函数是状态和动作的函数,而不仅仅是状态的问题,一个例子是回到机器人学的例子。假设你是一个人形机器人,正在学习如何行走。一个自然的奖励函数可能只是你前进了多少,这取决于状态。你可能希望动作也参与的一个场景是,如果你不想消耗太多能量,因为你不想让电机过度工作。那么你会希望奖励也取决于动作,你可以对通过电机施加的扭矩进行一些惩罚。在许多情况下,你可以只依赖于状态,但也有一些例子中你希望惩罚采取过多动作。

关于如果观察只是状态的一部分,为什么未来的观察不独立于过去的观察的问题,原因是我们可以回到触觉的例子。假设你接触了,然后停止接触,然后又接触了。在这种情况下,最近的过去观察实际上并不能告诉你太多关于当前状态的信息,而这个观察实际上告诉你更多关于状态的信息。因此,为了预测 o₃,你实际上需要使用所有过去的观察,而不仅仅是 o₂。对于熟悉图模型的人来说,如果你边缘化这些变量,你实际上会看到在图模型中,o₃ 依赖于过去的观察。

强化学习问题构建示例 📝

让我们看几个例子,看看这可能是什么样子。

在机器人学案例中,状态可能包括三样不同的东西:机器人上任何摄像头的RGB图像、机器人所有关节的位置以及关节的速度。这是机器人系统相当常见的状态表示。图像实际上与位置具有不同的维度,你可能需要以能够接受这些不同维度的方式配置你的神经网络。

动作将是命令的下一个关节位置。所以你打算如何移动你的关节?如果你的关节当前处于90度,也许你会尝试将其移动到92度。

轨迹将是一系列状态和动作:一系列视频(本质上是一系列图像)、一系列关节位置和一系列命令的关节位置。

这个序列实际上包含什么?通常我们做的是将时间离散化。例如,这个序列将以20赫兹的频率进行,所以你的视频将是每秒20帧,你每秒将有20次关节观察,每秒也将有20次命令动作。

当我第一次学习时,我总觉得这有点不直观,因为作为一个人,我不会每秒思考20次做决定。但这通常是表示像机器人这样的物理系统上的数据和行为的最终实际方式。

对于奖励函数,这里有几样东西可以使用。一个可能是:如果毛巾在挂钩上,状态 s 的奖励为1,否则为0。你也可以对施加在动作上的力有一些惩罚。

这是一个机器人例子。现在让我们看一个聊天机器人的例子。这里,我们可能没有紧凑的状态表示,因此使用观察。观察可能是用户最近的消息。动作将是聊天机器人的下一条消息,这可能是一个句子或一个段落,可能非常大。然后你可以将轨迹视为对话记录。与机器人学例子不同,这不一定是固定的20赫兹频率,用户可能需要更长时间来响应。这是轨迹在时间表示上可能如何变化的一个例子。在第一种情况下,时间表示为二十分之一秒,而在第二种情况下,时间表示为用户响应时。作为一个奖励的例子,也许如果用户点赞,奖励为1;如果用户点踩,奖励为-10;如果没有用户反馈,奖励为0。

这些是我们如何建立强化学习的例子。现在我想请你构建一个强化学习问题。具体来说,我希望你为以下三个例子中的一个定义状态(或观察)、动作、轨迹和奖励,或者选择你自己的例子。

关于为什么这是观察而不是状态的问题:这实际上可以两种方式构建,具体取决于传感器测量的细节。例如,如果你的传感器只是观察你周围的当前深度(如激光雷达)和你面前的图片,那么可能就是这样。这可能会遗漏的是周围汽车移动的速度,这对于未来的情况可能非常重要。你可能会尝试包含激光雷达信息的历史记录来获取速度信息,然后将你的状态表示为例如三秒的历史记录。这将代表一个主题:通常为了处理观察,会使用一点历史记录,然后这可以形成你的状态表示。在这个特定情况下有点模糊,这取决于细节。

关于在机器人例子中,如果奖励只有在挂钩上才为1,否则为0,你如何实际学习的问题:如果你从未在任何时候做到这一点,那么你将只有非常少的监督信号,你将一直只有零奖励。因此,在那个特定的视频中,我们实际上初始化时向机器人展示了如何做几次,这有助于我们称之为探索的过程。如果你有非常稀疏的奖励(即信号很少且没有很好地朝向目标形状化),那么通常这类数据对于启动强化学习过程可能很重要。

酷,所以如果大家没听到,状态可能是像HTML和URL这样的东西,关于网页和你所在位置的信息。动作将是与之交互。奖励将是某个任务是否完成。

关于是否一切都是观察的问题,因为传感器可能不完美:如果你担心传感器噪声之类的问题,你总是可以选择将某些东西建模为观察。如果你需要添加大量历史记录,这在某些方面可能会有很大的缺点。因此,有时我们会近似地将某些东西视为状态,即使它可能缺乏信息。例如,也许每10000次传感器会失败一次,给你一张黑屏图像,尽管从技术上讲这属于观察情况,但由于它对算法的影响,你可能仍然会将其用作状态表示。

关于观察是否可以是当前的一切,或者是与先前观察的差值的问题:是的,这归结为不同的权衡。通常,如果你要包含大量历史记录,那么通过使用差值来压缩它可能很有意义。但随着我们深入策略,这一点可能会变得更清楚。

表示行为:策略 🧠➡️🎯

现在我们已经讨论了如何构建强化学习问题,让我们谈谈如何实际表示行为。我们通常希望从状态或观察映射到动作。为此,我们将使用所谓的策略。我们通常用 π 表示一个策略。这可以只是一个神经网络(在这种情况下是卷积神经网络),也可以是Transformer、简单的全连接神经网络或线性函数。这将从状态或观察(或观察序列)映射到动作。

我们通常用 θ 表示你试图学习的神经网络的参数。

因此,当你实际使用策略采取行动时,你会观察一个状态,采取一个动作,然后观察下一个状态。当我们采取行动时,我们实际上是从我们的神经网络中采样。所以我们将通过神经网络运行一个前向传播来选择动作,然后在现实世界中执行该动作并观察下一个状态。

这个过程的结果是一个轨迹。当我们使用策略生成这个轨迹时,我们通常称之为rolloutepisode。你可以将其视为学习的一个片段,一次尝试,然后一次又一次地尝试。“rollout”这个术语的意思是,你顺序地进行策略、动态、策略、动态,你正在展开这个过程以创建轨迹。

如果你只有观察而没有状态,解决方案是给你的策略记忆。所以你可以传入多个观察,而如果你只给它一个状态,你实际上不需要给它任何记忆,你可以只输入状态。这非常方便,因为如果你有大量记忆,它将占用你计算机或GPU上的大量内存。

但是,如果你只有观察,那么在某些方面你别无选择,只能向策略提供该记忆。为此,你可能会使用序列模型。例如,在语言模型中,你将使用使用先前观察的序列模型。

关于 T 是当前时间步还是从开始到结束的一般表示的问题:这里的大写 T 我用来表示轨迹的结束,即轨迹中状态和动作的数量。然后小写 t 我指的是一个给定的时间步,并且将其一般化,以便你可以思考这发生在从小写 t=1 到小写 t=T 的所有时间步。

关于是否曾经有用同时以观察和状态为条件的问题:在这种情况下,状态严格比当前观察包含更多信息,因此如果状态确实是捕捉一切的状态,那么添加观察是没有用的。回到这个图表,如果我们有状态,那么我们只需要提供当前状态;而如果我们有观察,那么添加历史记录是有帮助的。这是状态和观察之间的区别。

为什么观察历史有帮助?基本上,过去的观察将帮助你获得更多关于 s₁ 是什么的信息。因此,如果你只有观察而不知道世界的底层状态,例如在语言建模中,如果你正在与用户进行对话,用户说的每件事都是不同的观察,过去的观察实际上会告诉你很多关于世界当前状态的信息。如果他们的第一个问题是“你能为我写这段代码吗?”,然后你写了一些代码,他们给了你一些反馈,那么实际上包含所有这些过去的观察对于捕捉世界的完整状态非常重要。这可能并非在所有情况下都成立,但在许多情况下,先前的观察对于预测动作也是有用的。

因此,也可能存在你希望有一个两阶段过程的场景:首先推断状态,然后第二个过程从该状态预测动作。如果你对底层状态的良好表示有一些想法,那么这类信息可能对尝试建模底层状态有用。在其他情况下,直接从观察堆栈出发更简单。

强化学习的目标 🏆

我们已经讨论了状态、动作、策略。强化学习的实际目标是什么?我们的目标是最大化奖励。因此,如果我们有一个轨迹,我们不想只优化一个时间步的奖励,而是希望优化整个轨迹的奖励。我们可以将其表示为最大化奖励的总和。

现在,出现的一个问题是,这实际上不是一个确定性的量。如果你有一个策略,并在世界中执行该策略,你得到的奖励并不总是每次运行策略时都相同。

那么问题来了:为什么这不是一个确定性的量?有哪些可变性来源可能导致一个轨迹与另一个轨迹的奖励总和不同?

是的,一个可变性来源是,状态不仅仅取决于动作和状态,而且影响下一个状态的还有一些随机性。其他可变性来源。你的策略也可能不是确定性的。所以有两个关键来源。

关于奖励函数是否可能是随机的问题:我们通常将其建模为确定性的函数,并将随机性的来源归因于状态和动作。如果你不知道状态,那么如果你只有观察,它实际上可以被视为随机的。

关于奖励学习中的随机性问题:通常你仍然会将其建模为一个奖励函数。你可能对奖励的确切内容没有完全的确定性,也许你想在学习过程中利用这种不确定性。这可能是离线学习的一些考虑因素。

另一个问题是,你的目标可能会随时间变化。在这种情况下,奖励函数会改变。我们实际上通常会将其建模为一个完全不同的决策过程,而不是在同一个过程中。可能存在你想要一个非平稳决策过程的场景,但通常你可以将这种随机性放入状态中,而不是放入奖励函数中。例如,可能有一个你无法观察到的底层目标在状态中,然后奖励函数保持确定性。因此,一般来说,不失一般性,你可以将其推入状态中。

所以,你必须担心的两个主要可变性来源是:世界是随机的(环境动态是一个分布,而不是一个确定性函数);其次,策略也不是确定性的。例如,在驾驶中,其他汽车的行为方式是随机的,你的汽车可能不会每次都做出相同的决定。

目标函数与轨迹分布 📈

如果我们想思考最大化奖励,我们可以将策略加入这个图表中。如果你能访问状态,那么从这里到这里会有一个箭头,模拟这个分布,同样从这里到这里。

现在,如果我们想写下奖励的样子,我们需要思考轨迹的概率分布。我们需要思考未来会看到什么样的分布。

我们可以这样思考:我们会有某个初始状态。可能还有一些我们没有讨论过的随机性,比如世界的初始条件可能会变化。例如,在玩扑克牌时,发牌方式会变化。然后,在状态之后,你将用你的策略做出决策。一旦你做出决定,就会从动态中产生随机性。

如果我们想思考给定轨迹的概率,它将是第一个状态的概率,然后是采取下一个动作的概率,然后是观察到下一个状态的概率,然后是采取之后动作的概率,然后是下一个状态的概率,依此类推。然后我们可以将给定轨迹的概率视为初始状态概率加上策略和动态产生的概率的乘积。

其中 t 从1到大写 T。一旦我们构建了这个轨迹的概率分布,我们就可以将最大化奖励视为最大化在这个概率分布下采样的轨迹的期望奖励。

所以,我们将思考从这个分布中采样的轨迹的期望,即该轨迹中状态和动作的奖励之和。这是我们的目标:我们的目标是最大化这个期望,我们的目标是找到一个策略 π,使其最大化这个期望和。

注意,与监督学习不同,这看起来不像你可以直接优化的东西。实际上,π 甚至没有出现在这个方程中,但它影响轨迹的方式是,轨迹的分布是 π 的函数。你实际上想找到能带来最高奖励的策略。

本课程的很多内容将是弄清楚我们如何在这个特定目标下优化行为。

关于大写 T 是否必须固定的问题:它不必固定,可以是可变的。如果它是固定的,写下来会更容易一些,但你可以将其视为轨迹的长度。

折扣因子 ⏳

另一个将更深入讨论的主题是:当你思考奖励时,这是平等地权衡整个轨迹的奖励,它表示你关心即时奖励和关心未来奖励一样多。在某些情况下,你可能更关心即时奖励而不是未来奖励。例如,如果这个 T 是一千年,也许你不太关心一千年后的奖励,而更关心今天的奖励。因此,构建强化学习目标的另一种方式不仅仅是这种普通的奖励总和,而是通过所谓的折扣因子来加权你的奖励,该折扣因子实际上取决于 t。我们经常这样做的方法之一是添加一个折扣因子,其幂次为 t。这意味着,如果折扣因子通常是一个大于0且小于或等于1的值,如果它是1,则与原始公式相同。当你使其越来越低时,你会变得更贪婪,你更关心近期奖励而不是远期奖励。

我们将在接下来的课程中更多地讨论折扣因子。

为什么策略是随机的?🎲

顺便说一下,我们已经讨论了我们的策略是一个分布,因此它不是确定性的。我们为什么希望这样做呢?

有几个原因可能希望我们的策略不是确定性的。首先,如果你想学习,你可能需要尝试不同的事情。例如,如果你在学习打网球,你不应该一遍又一遍地尝试完全相同的技术。你需要实际探索并尝试不同的策略才能做到。这可以表示为一个尝试几种不同策略并试图找出哪种策略最好的随机策略。

另一种情况是,有些场景中你从人或不同系统收集数据,这些人正在采取不同的策略。如果你想模拟他们处理问题的方式,你可能需要你的策略也是随机的。

为此,我们还可以利用生成模型的工具,你实际上在思考的不仅仅是从 A 映射到 B 的神经网络,而是给定状态和观察的动作的生成模型。

评估策略:价值函数 📊

我想这是我们将要涉及并介绍的最后一件事(实际上是倒数第二件):我们如何决定一个策略有多好?思考这一点真的很有用,因为如果你不知道你的策略有多好,那么你将无法让你的策略变得更好。

我们用来思考这一点的术语被称为价值函数。我们经常思考一个策略在给定状态下的价值函数,通常用 V^π(s) 表示。本质上,它的意思是:如果你从状态 s 开始,然后从那时起遵循策略 π,未来的期望奖励是多少?所以它基本上是这个方程,但从 s 开始,遵循你当前的策略。

与此类似,我们还将开始讨论(不是在本周五的讲座中,而是从下周开始)Q价值函数。这与价值函数非常相似,但不是从 s 开始,而是从 s 开始,然后采取动作 a,然后遵循 π,其中动作 a 可能不同于策略 π 可能采取的动作。

我今天不会深入探讨这两个函数是什么,但我想介绍它们,因为我们将大量使用它们,所以开始理解它们是什么是很好的,随着我们在未来的讲座中更多地使用它们。

算法类型概览 📚

我们将涵盖的算法类型:模仿学习的理念是模仿一个获得高奖励的策略。然后下周我们将开始讨论策略梯度,它试图直接对这个目标进行微分,并从实践和经验中学习。从那里,我们将讨论演员-评论家算法,它估计当前策略的价值,并用它来改进策略。我们将讨论基于价值的方法,它试图估计最优策略的价值,然后用它来推导出一个好的策略。最后,我们将讨论基于模型的方法,它实际上学习如何建模世界的动态(例如,尝试预测未来),然后用它来改进策略或进行规划。

现在你可能想知道,为什么我们有这么多不同的算法来优化这个目标?在监督学习中,我们只有梯度下降,它有效,很棒,很简单。在强化学习中,事情不那么简单。算法做出不同的权衡,并在不同的假设下表现出色。因此,这将取决于,例如,收集数据的难易程度或成本。如果你在模拟器中,收集大量数据非常便宜,而如果你手写响应或实际与人交互,那将更昂贵。此外,不同形式的监督的难易程度如何?你有演示吗?你有详细的奖励吗?稳定性和易用性与数据效率相比有多重要?也许你有更多时间来调整一些超参数,如果它不需要大量数据的话。还有一些关于你的动作是什么样的考虑:它们的维度有多高?它们是连续的还是离散的?学习动态模型容易吗?是的,这些就是我们有很多不同算法的一些原因,我们将在本课程后面的部分讨论不同的算法以及它们在哪里应用。

总结 📝

好了,总结一下。强化学习中有很多术语和符号,我想今天开始介绍它们,因为我们将在接下来的讲座中开始大量使用它们。我们讨论了状态、观察、动作、奖励函数,以及初始状态分布和动态。这些构成了所谓的马尔可夫决策过程,或者如果你只有观察,它被称为部分可观测马尔可夫决策过程,或MDP/POMDP。我不想直到最后才引入这个符号,因为它实际上叫什么并不重要,但从长远来看,如果人们提到MDP,你现在知道他们指的是什么,他们指的是强化学习问题的这种构建。

我们还讨论了轨迹、策略、强化学习的目标、价值函数和Q函数(简要地)。

在本节课中,我们一起学习了深度强化学习的基本概念,包括其定义、与监督学习的区别、应用实例、核心问题构建(状态、动作、奖励、策略、轨迹),以及强化学习的目标函数。我们还简要介绍了价值函数和不同类型的强化学习算法。这些基础知识为我们后续深入学习各种强化学习方法奠定了坚实的基础。

002:模仿学习 🎯

在本节课中,我们将要学习模仿学习。这是一种通过模仿专家行为来学习策略的方法,无需显式地定义奖励函数。我们将从模仿学习的基础概念开始,然后探讨如何学习表达能力强的策略分布,接着讨论如何通过在线干预来改进学习,最后简要介绍如何收集演示数据。


模仿学习的目标 🎯

上一节我们介绍了强化学习的基本符号,如状态、动作、轨迹和策略。本节中我们来看看模仿学习的具体目标。

模仿学习的目标与强化学习一致:获得一个能高效完成任务的高性能策略。我们实现这一目标的方式是,假设我们获得了一些由专家收集的轨迹数据。这些轨迹被称为演示,我们用 D 来表示。演示数据本质上是一系列状态和动作对的序列。

例如,如果我们想学习如何自动驾驶汽车,演示数据可以来自人类驾驶员的驾驶记录。我们不知道人类驾驶员使用的确切策略,但我们可以将演示数据集视为从某个未知的专家策略 π_expert 中采样得到的。我们的目标是通过模仿演示数据集中的行为,学习一个性能达到或接近专家策略水平的策略。


模仿学习版本0:监督回归 📊

一个非常简单的模仿学习方法是将其视为监督回归问题。以下是具体步骤:

  1. 给定演示数据集:数据集包含状态-动作对 (s, a)
  2. 训练策略:我们训练一个策略 π_θ。对于演示中的某个状态 s,策略会输出一个预测动作 â
  3. 最小化损失:我们希望预测动作 â 尽可能接近演示中的真实动作 a。因此,我们最小化预测动作与真实动作之间的差异损失 L(例如 L2 损失)。
  4. 部署策略:训练完成后,部署该策略,它应该能够模仿数据集中的行为。

这本质上是一种监督学习:对专家动作进行回归。如果策略是神经网络,这意味着从数据集中采样小批量数据,进行前向传播得到预测动作,计算损失,然后通过反向传播更新网络参数。

核心公式
min_θ Σ_{(s,a)∈D} L(π_θ(s), a)

然而,这种方法存在一个问题:它通常假设策略是确定性的,并且只学习动作的均值。当专家行为本身是多模态(即在同一状态下可能采取多种不同的合理动作)时,这会导致问题。


为何需要表达能力强的分布? 🤔

上一节我们介绍了简单的监督回归方法。本节中我们来看看当专家行为具有多模态特性时,仅学习均值会带来什么问题。

考虑一个自动驾驶的例子。在某个路口,一些驾驶员可能选择直行,而另一些驾驶员可能选择向左变道。演示数据集会同时包含这两种行为的例子。

如果我们使用 L2 回归(即学习高斯分布的均值)来训练一个确定性策略,那么在该状态下,策略会输出直行动作和左转变道动作的平均值。这个平均动作(例如,轻微向左偏但未完全变道)在实际驾驶中可能非常糟糕,甚至危险,因为它不属于任何合理的驾驶模式,在数据分布下的概率也很低。

核心问题:当数据呈现多模态分布时,确定性策略(或仅输出均值的高斯分布)无法捕捉这种多样性,会输出低概率、无意义的动作。

因此,我们需要让策略能够输出表达能力更强的分布,而不仅仅是单个值或简单的高斯分布。


用神经网络学习分布 🧠

为了解决多模态问题,我们需要让神经网络输出一个分布的参数,而不仅仅是一个动作值。这样,策略就能捕捉更复杂的行为模式。

核心思想:神经网络以状态 s 为输入,输出一个参数化分布 P(a|s) 的参数(例如均值、方差、混合权重等)。通过选择不同复杂度的分布族,我们可以控制模型的表达能力。

以下是几种常见的用于输出动作分布的模型:

1. 分类分布(用于离散动作)

如果动作空间是离散的(例如电子游戏中的按键),神经网络可以直接输出一个分类分布,即每个可能动作的概率。

  • 输出[P(a₁|s), P(a₂|s), ..., P(aₙ|s)]
  • 特点:对于离散动作,这是表达能力最强的分布形式。

2. 高斯混合模型(用于连续动作)

对于连续动作,单一高斯分布表达能力有限。高斯混合模型是多个高斯分布的加权和,能更好地拟合多模态数据。

  • 输出:每个高斯分量的权重 w_i、均值 μ_i 和方差 σ_i²
  • 核心公式P(a|s) = Σ_i w_i * N(a; μ_i, σ_i²)
  • 特点:比单一高斯更灵活,但需要预先指定混合分量的数量。

3. 离散化自回归模型

对于高维连续动作,可以将其每个维度离散化(分桶),然后使用类似语言模型的自回归方式建模。

  • 步骤
    1. 将连续动作的每个维度离散化为多个区间(桶)。
    2. 神经网络先预测第一个动作维度的分类分布 P(a₁|s)
    3. 根据采样的 a₁,神经网络预测第二个动作维度的条件分布 P(a₂|s, a₁)
    4. 依此类推,直到生成完整的动作向量。
  • 特点:非常灵活,能建模复杂的联合分布,尤其适合高维动作。

4. 扩散模型

扩散模型是强大的生成模型,也可用于建模动作分布。它通过一个逐步去噪的过程,从噪声中生成动作样本。

  • 特点:能对高维连续动作建模非常复杂的分布,但生成过程通常是迭代的,计算成本较高。

训练目标:无论使用哪种分布,训练的核心目标都是最大化演示数据中动作的对数似然,或者说最小化负对数似然。

核心公式
min_θ Σ_{(s,a)∈D} [-log π_θ(a|s)]

对于分类分布,这对应于交叉熵损失;对于高斯混合模型,则需要计算并最大化其概率密度函数。


表达能力的重要性:实验结果 📈

使用表达能力强的分布究竟有多重要?研究结果给出了明确答案。

在机器人操作任务中,对比了扩散模型(高表达能力)和高斯混合模型(中等表达能力):

  • 单演示者数据:两者表现尚可,但扩散模型更优。
  • 多演示者数据:数据多样性增加。扩散模型性能略有下降但仍保持较好水平,而高斯混合模型的性能则显著下降。这表明数据越多样,分布的表达能力就越关键。

在真实的机器人挂衣服任务中,对比了扩散模型和使用 L1 损失的确定性策略:

  • 使用扩散模型的成功率高得多。
  • 仅使用 L1 损失(确定性策略)的成功率下降了近 50%。

这些实验表明,当演示数据来自多个具有不同策略的个体时,使用表达能力强的生成模型对于获得高性能策略至关重要


模仿学习的挑战:误差累积 ⚠️

即使我们使用了表达能力很强的模型,模仿学习仍面临一个根本性挑战:误差累积

在标准的监督学习中,训练数据的输入分布是固定的,且独立于模型的预测。但在模仿学习中:

  1. 学习到的策略在部署时可能会犯小错误,导致进入一个在演示数据中不常见或未出现过的状态。
  2. 在这个“陌生”状态下,由于缺乏相关数据,策略更容易做出错误决策。
  3. 这可能导致进一步偏离专家演示的数据分布,错误像滚雪球一样越积越大,最终导致失败。

这种现象也称为协变量偏移:策略访问的状态分布 P_π(s) 与专家演示的状态分布 P_expert(s) 发生了偏移。


解决方案:从在线干预中学习 🔄

上一节我们指出了模仿学习中误差累积的问题。本节中我们来看看如何通过收集在线干预数据来解决它。

为了应对误差累积,一个有效的方法是收集纠正性数据。核心思想是:当学习策略在运行时犯错并偏离轨迹时,我们请专家提供如何纠正的指导,然后将这些纠正数据加入到原始数据集中重新训练策略。

有两种主要的干预方式:

1. 数据集聚合

算法步骤如下:

  1. 初始训练:在初始演示数据集 D 上训练策略 π_θ
  2. 策略 rollout:使用当前策略 π_θ 与环境交互,收集一系列状态 s_t
  3. 专家查询:对于策略访问的每个状态 s_t,询问专家“在此状态下正确的动作 a_t* 是什么?”。
  4. 数据聚合:将新的 (s_t, a_t*) 对加入数据集 D
  5. 策略更新:在聚合后的新数据集上更新(或重新训练)策略。
  6. 重复:重复步骤 2-5。

这种方法数据效率高,但需要专家能针对任意(可能是错误的)状态给出正确的动作,这在实际中有时难以实现。

2. 专家接管

更实用的接口是允许专家在策略即将犯错时直接接管控制

  1. 策略 rollout:策略开始执行。
  2. 专家干预:当专家认为策略要犯错时,接管控制并执行一段正确的动作序列。
  3. 数据记录:记录从接管点开始的这段专家演示(部分轨迹)。
  4. 数据聚合与更新:将这部分演示加入数据集,并更新策略。

这种方法在自动驾驶测试等领域很常见(安全驾驶员随时准备接管)。它的优点是接口更自然,但要求专家能及时预判并防止严重错误发生。

共同点:这两种方法都通过引入策略实际可能访问的状态下的专家数据,拓宽了训练数据的覆盖范围,使策略学会了如何从错误中恢复,从而缓解了误差累积问题。


总结 📝

本节课我们一起学习了模仿学习的基础知识:

  1. 核心思想:通过模仿专家演示数据来学习策略,无需定义奖励函数。
  2. 基础方法:可将模仿学习视为对专家动作的监督回归。
  3. 关键改进:当专家行为多模态时,需使用表达能力强的分布(如高斯混合模型、离散化自回归模型、扩散模型)来建模策略,而不是简单的确定性输出或单一高斯分布。
  4. 主要挑战误差累积(或协变量偏移)会导致策略在部署时因小错误而逐渐偏离,最终失败。
  5. 解决方案:通过在线干预收集纠正性数据(如数据集聚合或专家接管),让策略学习如何从错误中恢复,从而提升鲁棒性和性能。

模仿学习是一种强大且实用的方法,特别是在奖励函数难以设计、但可以获取专家演示的场景中。理解如何表示复杂分布以及如何处理误差累积,是构建高效能模仿学习系统的关键。

003:策略梯度 🎯

在本节课中,我们将要学习在线强化学习算法,特别是策略梯度方法。我们将从数学推导和直观理解两个层面,探讨如何通过试错来改进策略,使其获得更高的累积奖励。


概述 📋

到目前为止,我们已经将强化学习问题形式化为一个包含状态、动作、轨迹和奖励函数的问题。我们的目标是学习一个策略,以最大化期望的累积奖励。上周我们讨论了模仿学习,它虽然简单且可扩展,但无法超越演示者,也不允许通过试错进行改进。

今天,我们将开始讨论在线强化学习算法,特别是策略梯度方法。策略梯度是许多流行强化学习算法的基础,包括用于训练足式机器人和语言模型的算法。我们将学习其背后的直觉、如何实现以及何时使用它。


在线强化学习算法流程 🔄

在线强化学习算法的流程通常如下:

  1. 初始化策略:就像训练神经网络需要初始化权重一样,我们可以随机初始化策略权重,或使用模仿学习、启发式方法进行初始化。
  2. 收集数据:运行当前策略,在环境中尝试不同的动作,收集轨迹数据。
  3. 改进策略:利用收集到的这批数据来更新和改进策略。
  4. 重复过程:使用更新后的策略收集新的数据,并再次更新策略,如此循环。

这个过程体现了在线强化学习的核心思想:在线收集数据,并用这些数据来改进策略。


策略梯度目标与梯度推导 🧮

我们有一个策略 π_θ,目标是最大化在该策略下采样轨迹的期望累积奖励。我们将这个目标记为 J(θ)

J(θ) = E_{τ∼p_θ(τ)}[R(τ)]

其中,R(τ) 是轨迹 τ 上奖励的总和。我们希望使用梯度下降来优化 θ,因此需要计算目标 J(θ) 关于参数 θ 的梯度。

直接计算这个梯度具有挑战性,因为 θ 的影响是通过采样轨迹的概率分布 p_θ(τ) 间接体现的。我们使用一个对数技巧来重写梯度:

∇_θ J(θ) = ∇_θ ∫ p_θ(τ) R(τ) dτ = ∫ ∇_θ p_θ(τ) R(τ) dτ

利用恒等式 ∇_θ p_θ(τ) = p_θ(τ) ∇_θ log p_θ(τ),我们可以将梯度改写为:

∇_θ J(θ) = ∫ p_θ(τ) ∇_θ log p_θ(τ) R(τ) dτ = E_{τ∼p_θ(τ)}[∇_θ log p_θ(τ) R(τ)]

现在,梯度表达式中包含了期望,我们可以通过采样来估计它。


简化梯度表达式 ✂️

轨迹的概率 p_θ(τ) 可以分解为初始状态分布、策略和动态模型的乘积:

p_θ(τ) = p(s_1) ∏_{t=1}^{T} π_θ(a_t|s_t) p(s_{t+1}|s_t, a_t)

取其对数:

log p_θ(τ) = log p(s_1) + ∑_{t=1}^{T} [log π_θ(a_t|s_t) + log p(s_{t+1}|s_t, a_t)]

再对其求关于 θ 的梯度。由于初始状态分布 p(s_1) 和环境动态 p(s_{t+1}|s_t, a_t)θ 无关,它们的梯度为零。因此:

∇_θ log p_θ(τ) = ∑_{t=1}^{T} ∇_θ log π_θ(a_t|s_t)

将这个结果代回我们的梯度公式中,得到:

∇_θ J(θ) = E_{τ∼p_θ(τ)}[ (∑_{t=1}^{T} ∇_θ log π_θ(a_t|s_t)) R(τ) ]

这就是原始策略梯度REINFORCE算法的梯度公式。它比最初的版本友好得多,因为我们可以从策略中采样轨迹,计算每条轨迹的奖励 R(τ) 以及每个时间步动作的对数概率梯度 ∇_θ log π_θ(a_t|s_t),然后将它们相乘并求和,从而得到一个可用于更新神经网络权重的梯度估计。


策略梯度算法实现 ⚙️

上一节我们推导了策略梯度的核心公式,本节中我们来看看如何将其转化为具体的算法。

完整的算法步骤如下:

  1. 从当前策略 π_θ 中采样 N 条轨迹。
  2. 使用这些样本估计梯度:∇_θ J(θ) ≈ (1/N) ∑_{i=1}^{N} [ (∑_{t=1}^{T} ∇_θ log π_θ(a_t^i|s_t^i)) R(τ^i) ]
  3. 使用估计出的梯度对策略参数 θ 执行梯度上升步骤(因为我们要最大化奖励)。
  4. 重复上述过程,用更新后的策略收集新数据,并再次改进。

在实际实现时,我们可以构建一个替代损失函数,其梯度与上述梯度公式相同,然后利用自动微分软件进行一次前向和反向传播,这比进行 N×T 次单独的反向传播要高效得多。


策略梯度的直观理解与改进 🧠

直观理解

观察梯度公式 ∇_θ log π_θ(a_t|s_t) R(τ),我们可以获得直观理解:

  • ∇_θ log π_θ(a_t|s_t) 部分类似于模仿学习的梯度,旨在增加当前策略下已采取动作的概率。
  • R(τ) 作为权重,决定了这个“模仿”梯度是正向还是反向。
    • 如果轨迹奖励 R(τ) 高,则增加该轨迹中所有动作的概率。
    • 如果轨迹奖励 R(τ) 低,则减少该轨迹中所有动作的概率。

因此,策略梯度本质上是在执行“多做高奖励的事,少做低奖励的事”的试错学习。

改进1:仅使用未来奖励

当前动作无法影响过去的奖励。在原始公式中,一个时间步的动作梯度受到整个轨迹奖励的影响,这并不合理。我们可以进行改进,只使用当前动作之后的未来奖励之和:

∇_θ J(θ) ≈ E_{τ∼p_θ(τ)}[ ∑_{t=1}^{T} ∇_θ log π_θ(a_t|s_t) (∑_{t'=t}^{T} R(s_{t'}, a_{t'})) ]

其中,(∑_{t'=t}^{T} R(s_{t'}, a_{t'})) 被称为“奖励到-go”。这样,动作的更新只依赖于它未来可能带来的后果,更符合因果关系。

改进2:引入基线以减少方差

策略梯度估计的方差可能很高。例如,如果所有奖励都是正数,则所有梯度更新都是正向的,这虽然仍会推动策略向好方向发展,但效率较低。我们可以通过减去一个基线(baseline)来改进:

∇_θ J(θ) ≈ E_{τ∼p_θ(τ)}[ ∑_{t=1}^{T} ∇_θ log π_θ(a_t|s_t) ( (∑_{t'=t}^{T} R(s_{t'}, a_{t'})) - b ) ]

一个常见且有效的选择是使用平均奖励作为基线 b。可以证明,只要基线 b 不依赖于动作,这样的操作不会改变梯度的期望值(是无偏的),但能显著降低其方差。直观上,它使更新变为“鼓励高于平均水平的轨迹,抑制低于平均水平的轨迹”。


离策略策略梯度 🔄

到目前为止讨论的策略梯度是同策略的,即用于估计梯度的数据必须来自当前待更新的策略 π_θ。这意味着每执行一次梯度更新,就需要重新收集数据,效率低下。

我们希望能够重用旧策略 π_θ_old 收集的数据来更新当前策略 π_θ,即实现离策略学习。这可以通过重要性采样技术来实现。

重要性采样允许我们利用从一个分布 q(x) 中采样的样本来估计关于另一个分布 p(x) 的期望:

E_{x∼p(x)}[f(x)] = E_{x∼q(x)}[ (p(x)/q(x)) f(x) ]

将其应用于我们的场景,假设我们有从旧策略 π_θ_old 采样的轨迹,我们想估计新策略 π_θ 的目标函数的梯度:

∇_θ J(θ) = E_{τ∼π_θ_old}[ (p_θ(τ)/p_{θ_old}(τ)) ∑_{t=1}^{T} ∇_θ log π_θ(a_t|s_t) (∑_{t'=t}^{T} R(s_{t'}, a_{t'})) ]

其中,重要性权重 p_θ(τ)/p_{θ_old}(τ) 可以分解为每个时间步策略概率的比值。在实践中,当轨迹很长时,这个乘积可能变得极不稳定(非常大或非常小)。因此,近似方法常被使用,有时会忽略状态分布的变化,只考虑动作概率的比值。

离策略策略梯度允许我们在同一批数据上执行多次梯度更新,提高了数据利用率。


总结 📝

本节课中我们一起学习了策略梯度方法,这是我们的第一个在线强化学习算法。

  • 核心思想:通过“多做高奖励的事,少做低奖励的事”的试错方式来优化策略。
  • 数学基础:我们推导了策略梯度定理,得到了梯度估计公式 ∇_θ J(θ) = E[∑ ∇_θ log π_θ(a|s) * 未来奖励]
  • 关键改进
    • 仅使用未来奖励:使更新符合因果关系。
    • 引入基线:使用平均奖励等基线来减少梯度估计的方差,加速收敛。
    • 离策略学习:通过重要性采样重用旧数据,提高数据效率,允许在同一批数据上进行多次更新。
  • 特点与适用场景:策略梯度方法直观且通用,但梯度估计的方差较高。它最适用于奖励信号相对密集且可以使用大批量数据进行训练的场景。

策略梯度为更高级的演员-评论员方法(如PPO)奠定了基础,我们将在接下来的课程中继续探讨。

004:Actor-Critic 方法

在本节课中,我们将要学习 Actor-Critic 方法。这是一种基于策略梯度(Policy Gradients)的强化学习算法,它通过引入一个价值函数(Critic)来更准确地评估动作的好坏,从而更高效地利用数据并提升学习效果。我们将介绍如何估计策略的价值,并构建一个完整的 Actor-Critic 算法。


回顾:策略梯度

上一节我们介绍了在线强化学习(Online Reinforcement Learning)和策略梯度算法。在策略梯度中,我们通过在当前策略下收集一批数据,然后利用这些数据来改进策略,并重复此过程以持续提升。

策略梯度的更新公式如下:

# 策略梯度更新公式(简化表示)
gradient = average_over_trajectories( log_probability_of_actions * sum_of_future_rewards )

具体来说,我们首先从当前策略 π_θ 中采样 N 条轨迹。然后,我们计算策略下每个动作的对数似然 log π_θ(a|s),并用该轨迹未来获得的总奖励 R(τ) 作为权重。如果某个动作序列带来了高奖励,我们就增加该动作的概率;反之则降低。

为了减少方差,我们引入了基线(Baseline),通常是平均奖励。这样,我们鼓励高于平均奖励的动作,抑制低于平均奖励的动作。

然而,这个算法是完全同策略(On-Policy)的,意味着我们只能使用当前策略收集的数据进行更新。每收集一批新数据,我们只能进行一次梯度更新,这导致数据利用效率不高。

为了更高效地利用数据,我们引入了重要性采样(Importance Sampling),它允许我们使用旧策略收集的数据来估计新策略的梯度。但这种方法仅在新旧策略相似时有效,否则估计会不准确。


引入价值函数

为了构建更好的算法,我们需要重新审视第一讲中介绍的一些非常有用的概念:价值函数(Value Functions)

状态价值函数 V^π(s)

状态价值函数 V^π(s) 表示从状态 s 开始,并遵循策略 π 所能获得的期望累积奖励

公式
V^π(s) = E_τ~π [ Σ_{t‘=t}^T r(s_t‘, a_t‘) | s_t = s ]

直观理解:如果我们从状态 s 出发,用策略 π 运行很多次,然后将每次从 s 开始到结束获得的奖励加起来再求平均,这个平均值就是状态 s 的价值 V^π(s)。它衡量了在策略 π 下,处于状态 s 有多好。

动作价值函数 Q^π(s, a)

动作价值函数 Q^π(s, a) 表示在状态 s先执行一个特定动作 a,然后遵循策略 π 所能获得的期望累积奖励。

公式
Q^π(s, a) = E_τ~π [ Σ_{t‘=t}^T r(s_t‘, a_t‘) | s_t = s, a_t = a ]

直观理解:它评估了在状态 s 下,采取某个特定动作 a(这个动作可能不是策略 π 最常选的)的长期价值。

优势函数 A^π(s, a)

优势函数 A^π(s, a) 衡量了在状态 s 下采取动作 a,相对于遵循策略 π 的默认行为(即平均表现)有多好。

公式
A^π(s, a) = Q^π(s, a) - V^π(s)

如果 A^π(s, a) > 0,说明动作 a 比策略 π 的平均动作更好;如果 < 0,则更差。

关系:状态价值是动作价值的期望:V^π(s) = E_{a~π(·|s)}[ Q^π(s, a) ]


从策略梯度到 Actor-Critic

现在,让我们回到策略梯度,看看如何利用价值函数来改进它。

在原始策略梯度中,我们使用单条轨迹观测到的未来总奖励 Σ_{t‘=t}^T r_t‘ 作为权重。这个估计非常嘈杂(Noisy),因为它只基于一次采样。

一个更好的想法是:如果我们能用更准确的 Q^π(s, a) 来代替这个嘈杂的奖励和,那么梯度更新就会更准确。也就是说,我们希望梯度更新公式变成:

# 使用Q函数的理想梯度
gradient = average_over_samples( log_probability_of_actions * Q^π(s, a) )

这样,我们会根据动作 a 的真实长期价值 Q^π(s, a) 来调整其概率,而不是一次偶然的轨迹结果。

更进一步,我们可以引入基线来减少方差。一个自然的基线就是状态价值 V^π(s),因为它代表了在状态 s 下策略 π 的平均表现。于是,我们的权重变成了优势函数 A^π(s, a) = Q^π(s, a) - V^π(s)

最终的 Actor-Critic 策略梯度公式
∇_θ J(θ) ≈ (1/N) Σ_i Σ_t ∇_θ log π_θ(a_t^i | s_t^i) * A^π(s_t^i, a_t^i)

直观解释:我们根据优势函数 A^π 来更新策略。增加具有正优势(好于平均)的动作的概率,减少具有负优势(差于平均)的动作的概率。这样能更有效地利用数据,例如,即使一次向前迈步后摔倒了,但如果模型学习到“迈步”本身从长期看是有利的(正优势),它仍然会增加迈步的概率。


如何估计优势函数 A^π?

我们不知道真实的 Q^πV^π,所以需要估计它们。一个巧妙的方法是只估计 V^π,然后推导出 A^π

根据定义:
Q^π(s_t, a_t) = r(s_t, a_t) + E_{s_{t+1}}[ V^π(s_{t+1}) ]

也就是说,(s_t, a_t)Q 值等于即时奖励 r_t 加上下一个状态 s_{t+1} 的价值期望。

在实际中,我们无法对下一个状态求期望(需要无限次模拟),但我们可以用单次采样来近似。当我们运行策略收集数据时,对于数据中的每个 (s_t, a_t, r_t, s_{t+1}) 元组,我们可以用观测到的下一个状态 s_{t+1} 来近似期望。

因此,优势函数可以近似为:
A^π(s_t, a_t) ≈ r_t + V^π(s_{t+1}) - V^π(s_t)

这样,问题就简化为:我们只需要学习一个状态价值函数 V^π 的估计器


策略评估:拟合价值函数 V^π

我们将 V^π 表示为一个神经网络,输入是状态 s,输出是一个标量值 V_φ(s),参数为 φ。我们的目标是让这个网络的预测尽可能接近真实的 V^π

我们有以下几种主要方法来构建训练目标(标签):

1. 蒙特卡洛估计 (Monte Carlo Estimation)

方法:直接使用从当前状态 s_t 开始,在整条轨迹中观测到的未来奖励和作为监督标签。
目标y_t = Σ_{t‘=t}^T r_{t‘}
优点:无偏估计。
缺点:方差很高,因为只基于单条轨迹的未来。

2. 自举估计 / 时序差分 (Bootstrapping / Temporal Difference)

方法:使用即时奖励加上我们对下一个状态价值的当前估计作为标签。
目标y_t = r_t + V_φ(s_{t+1})
优点:方差低。
缺点:有偏,因为 V_φ 本身不准确,误差会传播。

3. N步回报 (N-step Returns)

方法:结合前两种方法,使用接下来 N 步的观测奖励,然后加上 N 步后状态的估计价值。
目标y_t = Σ_{k=0}^{N-1} r_{t+k} + V_φ(s_{t+N})
优点:在偏差和方差之间取得了更好的平衡。N=1 即自举法,N 很大时接近蒙特卡洛法。

训练目标:无论采用哪种方法获得标签 y_t,我们都通过最小化均方误差来更新价值网络参数 φ
L(φ) = (1/|D|) Σ_{(s_t, y_t) in D} ( V_φ(s_t) - y_t )^2

我们可以在这个目标上运行多次梯度下降,而无需重新收集数据,这与策略网络的更新是分开的。


折扣因子 γ

对于非常长的或无限的轨迹,未来奖励的简单求和可能会变得非常大或不收敛。因此,我们通常引入一个折扣因子(Discount Factor) γ (0 < γ ≤ 1)。

引入 γ 后,价值函数的定义变为对未来奖励的折扣和:
V^π(s) = E_τ~π [ Σ_{t‘=t}^∞ γ^{t‘-t} r_{t‘} | s_t = s ]

相应地,我们的训练目标也需要加入 γ。例如,对于自举法:
y_t = r_t + γ * V_φ(s_{t+1})
对于 N步回报:
y_t = Σ_{k=0}^{N-1} γ^k r_{t+k} + γ^N V_φ(s_{t+N})

γ 可以理解为智能体更重视近期奖励,或者等价于在每个时间步有 1-γ 的概率进入一个“终止”状态(获得0奖励并停止)。


完整的 Actor-Critic 算法流程

现在,我们将所有步骤整合起来,形成完整的在线 Actor-Critic 算法:

  1. 收集数据:使用当前策略 π_θ 与环境交互,收集一批轨迹数据 D
  2. 策略评估:利用收集到的数据 D,通过最小化价值函数的损失 L(φ)(例如使用N步回报目标)来更新价值网络 V_φ。可以执行多个梯度步。
  3. 估计优势:对于数据 D 中的每个 (s_t, a_t, r_t, s_{t+1}),使用更新后的价值网络计算优势估计:
    Â_t = r_t + γ * V_φ(s_{t+1}) - V_φ(s_t)
  4. 策略改进:计算策略梯度并更新策略网络 π_θ
    ∇_θ J(θ) ≈ (1/|D|) Σ_{(s_t, a_t, Â_t) in D} ∇_θ log π_θ(a_t | s_t) * Â_t
    θ ← θ + α * ∇_θ J(θ)α 是学习率)
  5. 重复:回到步骤1,用更新后的策略收集新数据,并重复整个过程。

为什么叫 Actor-Critic?

  • Actor(演员):策略网络 π_θ,负责选择动作。
  • Critic(评论家):价值网络 V_φ,负责评估状态或状态-动作对的好坏,为 Actor 的更新提供指导。

总结

本节课我们一起学习了 Actor-Critic 方法的核心内容:

  1. 回顾了策略梯度的局限性:数据利用效率低,梯度估计噪声大。
  2. 引入了价值函数:包括状态价值函数 V^π(s)、动作价值函数 Q^π(s, a) 和优势函数 A^π(s, a),它们为评估策略和动作提供了更准确的工具。
  3. 改进了策略梯度:用优势函数 A^π(s, a) 替代原始的奖励和作为权重,使得更新方向更准确,能更好地区分动作的长期价值。
  4. 学习了策略评估:介绍了如何拟合价值函数 V_φ,包括蒙特卡洛法、自举法(时序差分)和 N步回报法,并讨论了它们在偏差和方差上的权衡。
  5. 介绍了折扣因子 γ:用于处理长周期任务,使价值估计更稳定。
  6. 构建了完整的 Actor-Critic 算法:这是一个包含数据收集、策略评估(Critic更新)和策略改进(Actor更新)的循环框架。

Actor-Critic 方法通过分离“评估”和“执行”,实现了更稳定、更高效的学习,是现代深度强化学习算法(如 PPO、A3C 等)的重要基础。

005:离策略演员-评论家方法

在本节课中,我们将要学习如何将演员-评论家方法从“同策略”扩展到“离策略”,从而更高效地利用数据。我们将探讨两种实用的算法:PPO和SAC,并理解它们背后的核心概念。


课程回顾与引入

上一节我们介绍了演员-评论家方法,它结合了策略梯度和价值函数估计。本节中,我们来看看如何让这些方法变得更高效,即能够复用旧数据,进行多次梯度更新。

策略梯度回顾

在策略梯度方法中,我们的目标是运行一个策略来收集一批数据,然后利用这批数据改进策略,并重复此过程。改进策略的核心公式如下:

公式:

\[\nabla_{\theta} J(\theta) \approx \frac{1}{N} \sum_{i=1}^{N} \nabla_{\theta} \log \pi_{\theta}(a_i|s_i) \hat{A}^{\pi}(s_i, a_i) \]

其中,优势函数估计 \(\hat{A}^{\pi}(s_i, a_i)\) 衡量了在状态 \(s_i\) 下采取动作 \(a_i\) 相对于遵循策略 \(\pi\) 的平均表现有多好。我们通过减去一个基线(通常是价值函数 \(V(s)\))来降低方差:

公式:

\[\hat{A}^{\pi}(s_i, a_i) = Q^{\pi}(s_i, a_i) - V^{\pi}(s_i) \]

价值函数与Q函数

价值函数 \(V^{\pi}(s)\) 表示从状态 \(s\) 开始,遵循策略 \(\pi\) 所能获得的期望未来总回报。

公式:

\[V^{\pi}(s) = \mathbb{E}_{\tau \sim \pi} \left[ \sum_{t=0}^{\infty} \gamma^t r_t \bigg| s_0 = s \right] \]

Q函数 \(Q^{\pi}(s, a)\) 则表示在状态 \(s\) 下先采取动作 \(a\),然后遵循策略 \(\pi\) 所能获得的期望未来总回报。

公式:

\[Q^{\pi}(s, a) = \mathbb{E}_{\tau \sim \pi} \left[ \sum_{t=0}^{\infty} \gamma^t r_t \bigg| s_0 = s, a_0 = a \right] \]

优势函数则定义为:
公式:

\[A^{\pi}(s, a) = Q^{\pi}(s, a) - V^{\pi}(s) \]

直观上,价值函数好比在围棋棋局中,给定当前棋盘状态和策略,对最终获胜概率的估计。Q函数则是在考虑一个特定落子动作后的获胜概率估计。


从同策略到离策略

上一节我们讨论的演员-评论家方法主要是同策略的,即用于评估优势函数的数据必须来自当前待更新的策略。本节中我们来看看如何将其转变为离策略方法,从而能复用旧数据,提升数据效率。

重要性采样

为了实现离策略更新,我们需要使用重要性采样。假设我们使用旧策略 \(\pi_{\theta_{old}}\) 收集了一批数据,现在想用这批数据来更新新策略 \(\pi_{\theta_{new}}\)。策略梯度的估计可以修正为:

公式:

\[\nabla_{\theta} J(\theta) \approx \frac{1}{N} \sum_{i=1}^{N} \frac{\pi_{\theta_{new}}(a_i|s_i)}{\pi_{\theta_{old}}(a_i|s_i)} \nabla_{\theta} \log \pi_{\theta_{new}}(a_i|s_i) \hat{A}^{\pi_{old}}(s_i, a_i) \]

这里,重要性权重 \(\frac{\pi_{\theta_{new}}(a_i|s_i)}{\pi_{\theta_{old}}(a_i|s_i)}\) 用于纠正数据分布差异。

替代目标函数

在实际实现中,我们通常优化一个替代目标函数,其梯度等于上述策略梯度。该目标函数为:

公式:

\[J^{CPI}(\theta) = \mathbb{E}_{(s,a) \sim \pi_{old}} \left[ \frac{\pi_{\theta}(a|s)}{\pi_{\theta_{old}}(a|s)} \hat{A}^{\pi_{old}}(s, a) \right] \]

其中 CPI 代表保守策略迭代。

然而,直接优化这个目标存在风险。如果新策略与旧策略差异过大,重要性权重会变得非常极端(极大或极小),导致梯度估计方差巨大,学习过程不稳定甚至崩溃。


近端策略优化

为了解决上述问题,PPO算法引入了关键技巧来约束策略更新的幅度,确保学习稳定性。

技巧一:裁剪重要性权重

PPO的核心思想是限制重要性权重的变化范围,防止新策略过度偏离旧策略。我们定义一个裁剪后的替代目标函数:

公式:

\[J^{CLIP}(\theta) = \mathbb{E}_{(s,a) \sim \pi_{old}} \left[ \min \left( \frac{\pi_{\theta}(a|s)}{\pi_{\theta_{old}}(a|s)} \hat{A}, \text{clip}\left(\frac{\pi_{\theta}(a|s)}{\pi_{\theta_{old}}(a|s)}, 1-\epsilon, 1+\epsilon\right) \hat{A} \right) \right] \]

其中,\(\epsilon\) 是一个超参数(例如0.2)。clip 函数将重要性权重限制在 \([1-\epsilon, 1+\epsilon]\) 区间内。取 min 操作确保了当优势函数估计为负且权重被裁剪调高时,我们不会意外地让目标函数变得更好(即不会鼓励有害的更新)。

技巧二:广义优势估计

PPO通常结合广义优势估计来估计优势函数 \(\hat{A}\)。GAE通过混合不同步长的优势估计,在偏差和方差之间取得平衡:

公式:

\[\hat{A}^{GAE(\gamma, \lambda)}_t = \sum_{l=0}^{\infty} (\gamma \lambda)^l \delta_{t+l} \]

其中,

\[\delta_t = r_t + \gamma V(s_{t+1}) - V(s_t) \]

PPO算法流程

以下是PPO算法的简化步骤:

  1. 使用当前策略 \(\pi_{\theta}\) 收集一批轨迹数据。
  2. 使用收集的数据(通过蒙特卡洛或时序差分方法)拟合价值函数 \(V_{\phi}(s)\)
  3. 使用GAE计算每个状态-动作对的优势估计 \(\hat{A}\)
  4. 通过优化裁剪后的替代目标函数 \(J^{CLIP}(\theta)\),对策略进行多次(例如10-15个) epochs 的更新。
  5. 重复步骤1-4。

通过裁剪,PPO能够在一批数据上稳定地进行多次策略更新,相比传统策略梯度方法数据效率更高,同时保持了较好的稳定性。


更彻底的离策略:软演员-评论家算法

上一节我们通过裁剪限制了策略更新,从而可以复用一批数据多次。本节中我们来看一个更激进的离策略方法——SAC,它通过引入回放缓冲区来复用所有历史数据。

回放缓冲区

回放缓冲区是一个存储过去经验(状态、动作、奖励、下一个状态)的数据集。算法可以从中随机采样小批量数据来进行更新,从而打破数据间的时序相关性,并复用旧经验。

拟合当前策略的Q函数

使用回放缓冲区的主要挑战在于,数据来自过去的各种策略。如果我们想评估当前策略的价值,直接使用旧数据拟合的价值函数 \(V(s)\) 是不准确的,因为它对应的是旧策略的混合。

解决方案是转而拟合Q函数 \(Q(s, a)\)。Q函数的贝尔曼方程对于任何策略生成的数据都成立:

公式:

\[Q^{\pi}(s, a) = r(s, a) + \gamma \mathbb{E}_{s' \sim p(s'|s,a), a' \sim \pi(\cdot|s')} [Q^{\pi}(s', a')] \]

我们可以利用这个递归关系来学习当前策略的Q函数:

  1. 从回放缓冲区采样一个转移 \((s, a, r, s')\)
  2. 从当前策略 \(\pi_{\theta}(\cdot|s')\) 中采样下一个动作 \(a'\)
  3. 构造Q函数的学习目标:\(y = r + \gamma Q_{\phi}(s', a')\)
  4. 通过最小化 \(Q_{\phi}(s, a)\) 与目标 \(y\) 之间的均方误差来更新Q网络参数 \(\phi\)

注意,这里用于计算目标 \(y\) 的动作 \(a'\) 来自当前策略,而不是缓冲区中的旧动作,这保证了我们学习的是当前策略的Q函数。

策略更新

有了Q函数后,策略更新的目标是最大化期望Q值:

公式:

\[J(\theta) = \mathbb{E}_{s \sim \mathcal{D}, a \sim \pi_{\theta}(\cdot|s)} [Q_{\phi}(s, a)] \]

其梯度近似为:
公式:

\[\nabla_{\theta} J(\theta) \approx \mathbb{E}_{s \sim \mathcal{D}} \left[ \nabla_{\theta} \log \pi_{\theta}(a|s) Q_{\phi}(s, a) \bigg|_{a \sim \pi_{\theta}(\cdot|s)} \right] \]

同样,状态 \(s\) 来自缓冲区,但动作 \(a\) 是从当前策略中采样的。

SAC算法流程

SAC算法(简化版)循环执行以下步骤:

  1. 与环境交互,将经验 \((s, a, r, s')\) 存入回放缓冲区 \(\mathcal{D}\)
  2. \(\mathcal{D}\) 中随机采样一个小批量数据。
  3. 根据上述方法更新Q函数网络。
  4. 根据上述策略梯度更新策略网络。
  5. (可选)更新价值函数网络作为基线(SAC实际使用熵正则化版本,此处略过)。

SAC通过完全离策略的学习和回放缓冲区,实现了极高的数据效率,常用于对样本效率要求高的场景,如机器人学习。


算法对比与应用场景

本节课我们一起学习了两种重要的离策略演员-评论家算法。最后,我们来对比一下PPO和SAC,并了解它们的典型应用。

PPO 与 SAC 对比

  • PPO:通过裁剪等技巧实现“轻度”离策略。稳定性高,超参数相对鲁棒,是许多应用的首选,尤其是在模拟环境中可以大量生成数据时。它广泛用于游戏、机器人仿真到大型语言模型的微调。
  • SAC:基于Q函数学习和回放缓冲区的“彻底”离策略算法。数据效率极高,适合在真实机器人等数据收集成本高昂的场景中使用。但其超参数调优可能更复杂,稳定性挑战稍大。

应用实例

  • SAC:在真实机器人上,仅用约2小时的真实交互就能学会行走。在复杂操作任务上,其性能通常优于纯模仿学习。
  • PPO:在模拟器中训练解决魔方任务的策略,然后迁移到实体机器人上完成操作。它也常作为大语言模型强化学习微调的基础算法。

总结

在本节课中,我们一起学习了:

  1. 如何通过重要性采样将同策略演员-评论家方法扩展到离策略设置。
  2. 近端策略优化 如何通过裁剪重要性权重使用广义优势估计来解决离策略学习的不稳定性,实现稳定高效的学习。
  3. 软演员-评论家 算法如何通过拟合Q函数使用回放缓冲区来实现更彻底的数据复用,极大提升样本效率。
  4. 两种算法的核心思想、流程以及各自适用的场景。

理解这些算法背后的原理,将帮助你为不同的强化学习任务选择合适的工具。

006:Q-Learning 🎯

概述

在本节课中,我们将要学习基于价值的强化学习方法,特别是Q-Learning算法。我们将探讨Q函数如何与策略相关联,如何在不显式学习策略的情况下进行强化学习,以及如何在实际应用中稳定Q-Learning的训练过程。


价值函数与Q函数回顾

在之前的几节课中,我们详细讨论了价值函数和Q函数。作为回顾,价值函数和Q函数代表了某些特征的期望回报。具体来说,价值函数表示从某个状态开始,遵循特定策略所能获得的期望总回报。而Q函数则更进一步,表示从某个状态采取某个特定动作开始,然后遵循策略所能获得的期望总回报。

我们可以用公式来描述它们:

  • 价值函数 V^π(s)V^π(s) = E[Σ γ^t * r_t | s_0 = s, π]
  • Q函数 Q^π(s, a)Q^π(s, a) = E[Σ γ^t * r_t | s_0 = s, a_0 = a, π]

我们已经讨论过几种方法。第一种是策略梯度方法,我们交替收集数据和改进策略。我们可以将其视为尝试评估策略,并增加那些在未来有更高回报的动作的似然,同时减少低于平均水平的动作的似然。

接着,我们开始讨论演员-评论家方法。在这个框架中,我们引入了一个额外的循环步骤:首先估计当前策略的期望未来回报(即Q函数),然后利用这个估计来改进策略。因此,策略梯度的形式被修正为:我们仍然采样,但增加我们认为好的动作的似然,减少我们认为不好的动作的似然。

上一节我们重点讨论了如何以离策略的方式实现演员-评论家算法。这意味着我们不仅使用当前迭代的数据,还能利用所有过去迭代的历史数据。为了实现这一点,我们需要能够从过去的策略数据中估计Q函数。我们可以使用神经网络,输入状态和动作,输出Q值。我们推导出了递归定义Q函数的方程,也可以将未来回报的总和视为第一步的即时奖励加上从下一个状态开始的Q函数值。

我们发现这个方程对于任何策略下的任何状态-动作对都成立。这意味着我们可以使用之前数据缓冲区中的(状态,动作,下一个状态)元组来学习Q函数。具体做法是:从历史数据缓冲区中采样一个(状态,动作,下一个状态)元组,然后从当前策略(而非过去的策略)中采样下一个动作。接着,我们尝试对这些目标进行监督学习,其中目标值使用了我们对当前策略Q函数的估计。我们将状态、动作、下一个状态和采样的下一个动作作为输入。

一旦用均方误差等损失函数制定了这个目标,就可以使用监督学习技术来拟合Q函数。我们还讨论过,为了使这些估计准确,你的数据集需要有足够的覆盖范围,以包含新策略可能采取的动作。


基于价值的强化学习方法

今天,我们将介绍基于价值的强化学习方法。具体来说,我们将讨论我认为可以说是最早的强化学习方法之一——基于Q-Learning算法。我们将探讨Q-Learning,以及如何在实践中实现它、如何使其稳定。今天的目标是思考Q函数如何与策略关联,如何在不学习显式策略的情况下进行强化学习,以及在使用函数近似器时如何稳定Q-Learning。


思想实验:从Q函数推导策略

让我们从一个思想实验开始。假设你有一个策略,并且对这个策略的Q函数有一个相当准确的估计。提醒一下,Q函数 Q^π(s, a) 定义为从状态 s 采取动作 a 开始,然后遵循策略 π 所能获得的未来回报的期望。

我们今天要思考的一个核心问题是:如果你有一个策略的Q函数估计,你可以尝试不遵循已有的策略,而是利用Q函数来构建一个新策略。具体来说,在给定状态下,你可以从多个候选动作中选择Q值最高的那个动作,而不是遵循原策略。

因此,我们可以定义一个恰好执行此操作的策略:该策略以概率1选择最大化Q值的动作,否则概率为0。这只是一个确定性的策略,总是遵循Q值告诉你的最佳动作。

我们在一个例子中看看这个思路。假设我们有一个3D导航问题,从蓝色框中的某个位置开始,目标是到达星星处。我们可以在2D平面内移动,到达星星处奖励为1,其他情况奖励为0。假设我们当前的策略总是向右移动。

作为一个额外的细节点,如果你向上移动,移动这段距离需要一个时间步,移动这段距离需要大约两个时间步。

我的问题是:如果你根据当前策略(总是向右)的准确Q函数估计,定义了上述新策略,那么这个新策略比当前策略更好、更差、相同,还是最优策略?为什么?


分析与讨论

让我们总结一下,然后讨论它是否是最优策略。总结一下,旧策略是向右走,这不是最优的。如果你从这里开始,实际上无法到达星星。如果你思考一下 Q^π(旧策略的Q函数),对于这一行的所有状态,向右动作的Q值可能是1。对于这一行,向右动作的Q值将是0。但是,如果你看这一行中向上动作的Q值是多少?如果你先向上移动,然后遵循旧策略(向右),你将获得奖励1。最后,对于这一行,如果我们向上移动,Q值是多少?可能是0。

这意味着,我们得到的新策略将执行以下操作:在这里(最上面一行)向右走。对于这一行(中间行),它将向上走,因为它会选择具有最大Q值的动作。但对于这一行(最下面一行),所有Q值都是0,因为下一行的Q值也是0,所以如果默认遵循之前的行为,它会继续向右走。

现在,有人想讨论第二个问题吗?比如,这是最优策略吗?这个新策略比旧策略好,但它不是最优策略,因为在这些状态(最下面一行)中,最优策略应该是也向上走才能到达星星。所以,如果我们从这个初始状态开始,定义新策略后,我们实际上会继续向右走,不会向上走,因此无法从所有状态获得奖励1。

问题是,如果我们迭代这个过程并执行多次,这会变成最优策略吗?是的,我们稍后会讨论迭代执行。我们可以在这里获得奖励1,这很好,但如果我们从这个初始状态开始,定义新策略后,我们实际上会继续向右走,不会向上走,因此无法从所有状态获得奖励1。

问题是,如果你离星星更近,Q值是否会更高?我实际上没有明确定义这一点,但如果你使用的折扣因子小于1,那么离得越近Q值会越高。我这里展示的所有内容都使用了折扣因子为1以简化说明。但如果你使用例如0.9的折扣因子,那么这里的Q值将是1,这里将是0.9,这里0.8,这里0.7,依此类推。对于这一整行,它仍然会是0,因为你仍然无法到达星星。

另一个需要注意的点是,如果你的奖励函数不同,例如不是星星处为1其他地方为0,而是例如到星星的负距离,那么你实际上会发现,即使在单步改进中,从这个策略出发,你也会得到一个严格优于旧策略的新策略。问题是,要获得最优策略,我需要迭代地执行此操作,并每次都基于最新策略重新计算Q函数。是的,这是正确的。

在这个例子中,新策略优于当前策略。这实际上总是成立的吗?假设 Q^π 是准确的,新策略总是至少和旧策略一样好,永远不会比旧策略差。如果 π 已经是最优策略,那么它们将相同。


策略迭代与Q-Learning

这让我们开始思考:我们是否可以开始省略显式的策略?给定Q函数,我们将在状态 s 采取最大化未来期望回报的动作。这至少和策略会采取的任何动作一样好。因此,我们实际上可以忘记使用策略网络,而直接这样做,而不是显式地学习一个策略神经网络。

作为一个迭代算法,这看起来像是:我们运行策略收集数据,然后拟合一个模型来根据最新批次的数据估计 Q^π(你也可以像上一讲讨论的那样以离策略方式进行)。接着,为了改进策略,你可以直接将策略定义为最大化Q函数的策略。然后,一旦你找到这个新策略,你可以收集一些新数据,再次估计 Q^π,但这次是针对你的新策略 π',而不是旧策略 π。这里,π' 被定义为 argmax_a Q^π(s, a)。我们并没有学习策略 π' 的神经网络,没有将其显式表示为模型。这里唯一的神经网络或模型是用于近似Q函数的。

问题是如何将其推广到连续动作或更复杂的动作空间。当你有离散的动作集合(如上、右)时,这通常最容易实现。如果你有连续动作,你仍然可以使用这个算法,尽管你需要弄清楚如何执行这个最大化操作。原则上,你可以使用梯度下降之类的方法,但效果可能不佳。如果动作空间维度不高,更好的方法可能是简单地采样一堆不同的动作,然后选择Q值最高的那个。你也可以使用其他基于采样的优化算法,或者迭代地采样并优化。对于像文本这样的离散动作空间,原则上你可以进行某种离散搜索,目标是最大化Q值。

当奖励非常稀疏时,这如何工作?我们看到了一个奖励稀疏的例子,它仍然可以工作。需要注意的是,当奖励稀疏时,你可能需要多次执行这个“拟合Q函数-改进策略”的循环,因为每次你这样做,实际上都是在将奖励信息从有奖励的状态“备份”到其他状态。你需要进行足够多次的备份,覆盖问题的整个时间范围。


Q-Learning算法

我们可以将其写成一个算法。我们可以采用离策略演员-评论家算法中拟合Q函数的部分,然后不使用策略梯度更新,而是简单地定义一个根据Q函数采取动作的新策略。

你可以将其视为两个关键步骤,通常称为策略评估(评估策略的价值)和策略改进。这种两步迭代过程通常被称为策略迭代。它是通向Q-Learning等算法的一种方式。

在板上写出来,这个过程如下:

  1. 收集数据:通常从某个探索性策略收集数据,也可能包含来自其他策略的数据。
  2. 拟合Q函数:尝试拟合对应当前策略的Q函数估计。我们可以使用之前定义的目标:y = r + γ * Q^π(s', a'),其中 (s, a, r, s') 来自缓冲区,a' 是从当前策略 π 中采样的。
  3. 改进策略:定义新策略 π'(s) = argmax_a Q^π(s, a),这是一个确定性策略。

问题是,当我们拟合这些目标时,为什么我们从 π 中采样 a',而不是对下一个动作取最大值或期望?这里有几件事:首先,你可以采样多个 a' 并取平均,这可以给你一个更好的目标值估计。其次,你实际上可以在Q函数目标本身中执行改进步骤。也就是说,你可以考虑将你的Q函数目标定义为:y = r + γ * max_{a'} Q^π(s', a')

这看起来像这样:y = r + γ * max_{a'} Q^π(s', a')。这实际上就是Q-Learning。一种理解方式是,这些目标实际上是你即将定义的新策略的Q值。你已经在Q函数更新中加入了改进步骤,实际上你正在学习与你将要定义的新策略相关联的Q值。

还有另一种方式来看待这个问题。我们之前定义了这个对所有策略都成立的方程:Q^π(s, a) = r + γ * E_{a'~π}[Q^π(s', a')]。实际上,对于最优策略,也可以写出一个特定的方程。我们知道最优策略总是采取最大化未来回报的动作。最优策略选择的动作总是最大化Q值的那个。因此,我们可以写出一个对最优策略成立的方程,它与上面的方程类似,只是对下一个动作的期望替换为了最大值。

这个方程是:Q*(s, a) = r + γ * E_{s'}[max_{a'} Q*(s', a')]。我们定义最优Q函数为当前奖励加上未来折扣奖励的和,对于这个和,我们对下一个状态 s' 有一个期望,然后因为我们知道最优策略将采取最大化Q值的动作,我们可以将其写为 max_{a'} Q*(s', a')

问题是我们为什么只讨论Q而不讨论V?你也可以用非常相似的方式为V写下这些方程。Q函数的好处在于,如果我们知道Q,我们可以通过对动作取 argmax 来得到一个比之前策略更好的策略。而如果我们只知道价值函数 V(s),我们不知道哪个动作会导致更高的价值。原则上,有了价值函数,你应该尝试某种前瞻:如果你对动态模型有了解,你可以尝试预测 s' 并选择能最大化期望价值的动作。但这看起来像是:argmax_a E_{s'}[r + γ * V(s')]。然而,我们不知道这些动态模型,也不一定能预测我们的动作会导致的下一个状态。因此,一般来说,从价值函数中推导策略并改进策略要困难得多。


贝尔曼方程

回到这个方程,它对于最优策略成立。我在这里写 π* 表示最优策略。如果你看我们的更新目标 y = r + γ * max_{a'} Q(s', a'),我们试图让一个Q函数预测这个值。本质上,有了这个方程,你可以将这个更新视为试图使这个方程成立。我们试图让方程的左边等于右边。当这个方程成立时,意味着我们的策略是最优的。

因此,思考Q-Learning的一种方式是:当我们执行优化步骤时,我们试图找到一个满足此方程的Q函数,而此方程仅对最优策略成立。

问题:如果我们对Q有非常好的估计,这会收敛吗?我们稍后会讨论。首先,让我们快速讨论一些术语。不幸的是,这里有很多术语。了解其中一些是有用的,这样当有人与你讨论强化学习或你读论文时,你知道他们在说什么。

第一个方程 Q^π(s, a) = r + γ * E_{a'~π}[Q^π(s', a')] 通常被称为贝尔曼方程。它是一个非常有用的对象,是我们尝试对策略进行策略评估时使用的。

第二个方程 Q*(s, a) = r + γ * E_{s'}[max_{a'} Q*(s', a')] 被称为贝尔曼最优性方程,因为它是针对最优策略的。有时,人们非正式地也可能称第二个为贝尔曼方程,但严格来说,第一个是贝尔曼方程,第二个是贝尔曼最优性方程。你也可以为价值函数V推导类似的方程,它们也被称为贝尔曼方程和贝尔曼最优性方程。


收敛性与探索

回到问题:如果我们迭代地这样做,会收敛到最优策略吗?这里有好消息也有坏消息。好消息是,如果你处于一个非常简单的设置中,可以实际为每个状态和动作在表格中存储所有Q值(例如非常小的离散状态和动作空间),并且有充分的探索,那么这个算法会收敛。坏消息是,基本上在任何其他情况下,都不能保证收敛,你甚至可以构造出它发散的场景,即使使用线性函数近似也是如此。这有点令人沮丧。不过,反过来看,即使在可能发散的场景中,它也可以被调整得很好用,我们将看到一些它工作得很好的例子。

问题:这个陈述意味着什么?具体来说,这不一定与你的Q值的准确性有关,因为你实际上是通过这个过程来拟合你的Q值的。这更多是关于你的状态和动作空间大小的陈述,如果它足够小,你可以维护这个表格,并且还有一个关于探索的条件——你实际上需要在数据集中对状态和动作有充分的覆盖——那么它就会收敛。


离策略与探索策略

关于Q-Learning的一个注意事项是它是离策略的。具体来说,这个方程 Q*(s, a) = r + γ * E_{s'}[max_{a'} Q*(s', a')] 对所有状态-动作对都成立,这意味着我们的动作不一定非要来自当前策略。实际上,让数据收集策略比当前策略更广泛可能很有意义,因为我们将对Q值进行最大化操作,会考虑许多不同的可能动作。如果我们考虑所有可能的动作,我们会希望我们的Q值对于所有这些动作都是准确的。如果有一个我们在优化中会考虑但从未收集过数据的动作,由于没有数据,它的Q值可能会被错误地估计得很高,那么当你拟合目标时就会得到一个不准确的值。

因此,与其从当前策略收集数据,不如从某个探索策略收集数据,具体来说,是一个比我们的确定性策略收集更广泛动作集的策略。我们希望数据能覆盖很多不同的动作。这里有几个选择。

一种常见的选择是 ε-贪婪策略:大部分时间遵循当前策略,但以一个小概率 ε 采取完全随机的动作。这看起来像是一个以概率 ε 采取随机动作,以概率 1-ε 遵循当前策略的策略。这是一个不错的选择,因为当你采取随机动作时,它是均匀随机的,这意味着你将获得对你所考虑动作的很好覆盖。通常,在训练过程中,你可能会从一个较大的 ε 开始,以便在训练初期有更多探索,然后随着策略变得更好、Q函数估计更准确,你可以逐渐减小 ε,减少探索。

另一种也较为合理但稍微复杂一点的选择是,以与Q值成比例的概率采取动作。因此,如果某些动作具有较高的Q值,则更频繁地采取这些动作;如果某些动作概率较低,则较少采取这些动作。一种写法是:你可以对Q值取指数使其全为正,然后归一化以获得一个概率分布。这有时被称为 玻尔兹曼探索,以玻尔兹曼分布命名,其中你按指数权重进行采样。

问题:对于连续动作,如何实现这些方法?第一种(ε-贪婪)在离散动作中更直接。对于连续动作,你仍然可以做类似的事情,但你需要定义在连续动作上的某种均匀分布,为此你需要一个范围。或者,原则上你也可以使用具有宽标准差的高斯分布进行采样。我认为在连续动作空间中,第二种选项(玻尔兹曼探索)在采样方面更常见一些。


完整的Q-Learning算法

将各部分组合起来,一个完整的Q-Learning算法如下:

  1. 使用某个策略(如ε-贪婪)收集数据。
  2. 将该数据添加到经验回放缓冲区。
  3. 从经验回放缓冲区中均匀采样一批数据(这有助于解相关,从缓冲区中采样IID数据)。
  4. 通过取损失函数(如均方误差)的梯度来更新Q函数。梯度形式为:∇φ (Qφ(s, a) - (r + γ * max_{a'} Qφ(s', a')))^2
  5. 你可以重复多次梯度步骤。在实践中,k=1 很常见,但如果你对给定批次数据采取更多梯度步骤,效率会更高,数据利用率也更高。
  6. 完成这些梯度步骤后,你可以收集更多数据并迭代此过程。

问题:如果你从任何策略收集数据,那不是比使用当前策略更不优化吗?使用不同策略的原因是为了学习更准确的Q函数,这实际上有助于你以后学习更优的策略。本质上,这里存在一个权衡:在开始时收集次优数据以帮助以后变得更好。可以这样想:如果你的强化学习代理试图帮你挑选餐厅,一开始如果你没有探索很多餐厅,不知道什么是好餐厅,你可能需要探索一些可能次优的餐厅,以获得对特定人来说什么是好餐厅的良好估计。然后,一旦你有了一个好的Q函数(即对好餐厅有了好的估计),你可能希望减少探索。


实践中的技巧:目标网络

在实践中,当我们使用Q-Learning时会发生什么?我们谈到Q-Learning可能发散,通常当你使用神经网络运行Q-Learning时,它可能不稳定。原因之一是你有一个移动的目标,即这个 max 操作。如果 k=1,优化过程可能非常不稳定。

一个技巧是尝试减缓目标变化的频率。与其让目标在你每次改变参数时都变化,一个想法是冻结目标网络的参数,只定期更新它们,例如每1000个梯度步骤更新一次。具体做法是:我们保存一个单独的神经网络,它是我们Q函数参数的另一个副本,称为 φ'。当我们保存这个副本后,对于目标值 r + γ * max_{a'} Qφ'(s', a'),我们使用这些新参数 φ'。这些参数将被冻结,这意味着在这个内部循环中,标签不会频繁变化。因此,这个内部循环本质上是在用一些添加到缓冲区的数据进行监督学习,这通常要稳定得多。然后,只定期将目标网络参数更新为我们最新的Q函数参数。

当我们使用目标网络时,这被称为 DQN算法,于2013年提出,基本上可以说是第一个成功的深度强化学习方法。他们发现可以训练神经网络玩各种不同的Atari游戏,这是使用强化学习训练神经网络执行相当复杂任务的第一个例子。他们实际上直接从像素观测进行训练。在此之前,很多强化学习的例子都是在非常简单的设置或低维设置中。

问题:如果你存储所有Q值,一个Q值表,那不一样吗?实际上不完全一样,因为你实际上会在环境中收集新数据,所以你不能只存储所有Q值,你必须存储参数,以便能够为新数据计算Q值。


实践中的技巧:双Q学习

这是你将在作业中实现的算法之一。好的,第一个技巧是使用目标网络,只定期更新。还有另外两个技巧可以让Q-Learning工作得更好。

第一个是观察反馈循环的准确性。如果你绘制训练过程中的奖励,奖励会上升,这很好。如果你也绘制训练过程中的Q值,它们也会上升,这实际上是你所期望的,因为Q值代表了你的平均奖励。一个需要注意的实用技巧是:当你在训练期间查看Q值的损失函数时,使用DQN训练时,损失值实际上经常会上升。这有时有点令人担忧,因为你习惯看到损失值下降。但原因是你在收集新数据,而新数据具有更高的Q值,因此损失函数的尺度会变化。在最初阶段,如果你到处都获得零奖励,可能很容易得到一个低损失。所以,如果你的损失函数在上升,不要惊慌,有时这意味着策略开始学习。

这很好。预测的Q特征看起来是合理的。你还可以查看训练过程中的价值。在第一种情况下,这里的值相当均匀,但一旦你处于一个真的需要向上的状态,向上动作的Q值就比向下或无操作高。同样在这里,向上非常重要,所以向上动作的Q值比向下或无操作高。在右边的情况下,这并不重要,因为球在对手那边,所以Q值更均匀。当你可视化这些Q值时,它们看起来相当合理。

这很好。但然后你绘制了真实的回报。真实的回报在这里用红色水平线表示,而根据Q网络估计的价值显示为上方的线。你可以看到估计值总是远高于真实值,存在巨大的差距。看起来Q函数高估了我们的策略有多好。

然后有一个叫做 双DQN 的算法,能够获得更准确的Q函数,能够大大减少高估。让我们谈谈双DQN。一般来说,高估是因为我们的目标值是 r + γ * max_{a'} Q(s', a')。当我们取这个最大值时,我们选择了一个最大化其Q值的动作。另一种写法是:r + γ * Q(s', argmax_{a'} Q(s', a'))。因此,我们既使用了一个具有高Q值的动作,又使用同一个Q函数来评估该动作的Q值。这意味着如果我们的Q函数中存在噪声,那么很容易利用这个噪声来选择高估的动作。因此,最后一项就是高估的来源。它不完美,存在噪声,因为神经网络通常如此。由于用于选择动作和执行评估的是同一个Q函数,你真的可以利用那个噪声,选择那些由于噪声而显得比实际价值更高的动作。

如果你改为使用不同的Q函数来选择动作和评估它,那么你可以解相关噪声。如果你有两个不同的Q函数,它们自然会有不同的噪声。因此,如果你有办法使用不同的Q值,我们实际上可以通过使用一个Q函数来估计动作,另一个来评估动作,从而消除高估问题。

双Q学习的核心思想是使用两个不同的网络:网络A用于选择动作,网络B用于评估价值。如果它们以不同的方式产生噪声,那么我们就不会利用Q函数中的噪声,从而不会高估我们的价值。

问题:你能保证它们没有相同的噪声吗?你肯定不能保证,可能有一些噪声来自网络架构本身。但在实践中,这通常效果很好。如果你为此使用不同的神经网络,它通常能做得非常好。仍然存在一些高估,但相比不使用双Q学习,它有很大帮助。它并不完美,但帮助相当大。

问题:如果你使用三重DQN或更多网络的DQN呢?好问题。我认为差距可能在于噪声相关性。如果你能获得更多样本和噪声,那可能会有帮助。在实践中尝试过,如果噪声来自一个恒定的来源,比如神经网络的架构,那么可能没有帮助。在实践中,使用超过两个神经网络并没有被证明非常有帮助。

你如何确保它们不会合并?让我们谈谈我们实际做什么。我们实际上已经在使用两个神经网络:当前的神经网络和定期冻结的目标神经网络。因此,我们实际可以这样做:当我们进行Q更新时,我们可以使用目标网络进行评估,使用当前神经网络来选择动作。这就是双Q学习的样子:我们使用当前网络来选择最佳动作,然后使用目标网络来评估该动作的价值。

问题:为什么这有帮助,特别是如果之前的Q有相同的噪声?之前的Q总是你之前的Q,所以你不能设置这个。是的,问题是为什么这有帮助,特别是如果之前的Q有相同的噪声?之前的Q会过时,而新的Q自那以后已经获得了很多梯度更新,并且最近看到了新的数据点。因此,通常噪声不仅与初始化有关,还与应用了哪些梯度更新有关。所以,是的,这有帮助。


实践中的技巧:N步回报

我们要讨论的最后一个技巧,我们已经在演员-评论家方法中讨论过,就是 N步回报。我们的Q-Learning目标看起来像这样:r + γ * max_{a'} Q(s', a')。如果你的Q值很好,那么这一项实际上将非常重要,在Q学习更新中扮演主要角色。但如果你在训练初期Q值很差,那么这些(即时奖励 r)将是唯一重要的值,也是推动你学习算法的值。

如果你这里只有一个奖励函数,那可能有点问题,因为仅仅一个奖励函数可能无法告诉你太多关于你的Q值有多好的信息。

所以,如果你记得当我们讨论演员-评论家方法时,我们讨论了使用N步回报。如果我们使用蒙特卡洛回报,我们将使用奖励的总和;如果我们使用自举,我们只做 r + γ * V(当前时间步的奖励加上下一个时间步的价值)。相反,我们讨论了这个折中的方法:我们对接下来N个时间步的奖励求和,然后使用那之后时间步的价值。我们讨论过这如何具有更低的方差和偏差(偏差更低的意思是,如果你的目标很差,奖励函数会更准确)。

我们为Q值做这个。对于Q值,这看起来不是像 r + γ * max_{a'} Q(s', a') 这样,而是定义目标 y 为:y = r_t + γ * r_{t+1} + ... + γ^{N-1} * r_{t+N-1} + γ^N * max_{a'} Q(s_{t+N}, a')。这就是Q函数的N步回报的样子。

有人看到使用这个目标有什么问题吗?是的,如果你以离策略方式进行,这些 r 将来自你在回放缓冲区中使用的任何策略,而不是你试图估计的最优策略。所以这有一些优缺点:优点是它偏差更小,学习更快,尤其是在早期;缺点在于这些奖励是针对收集数据的策略的,而不是针对最优策略的,而我们试图估计的是最优策略的Q函数。

因此,在Q-Learning中使用N步回报时,这是一个缺点。当 N=1 时这不是问题,因为那里的奖励只是 sa 的函数,我们正在估计 Q(s, a)。我们对此怎么办?也许最常见的、不太令人满意的答案是直接忽略这个问题,仍然使用大于1的N。N步回报通常确实能提高算法的性能,尽管存在这个问题。也就是说,你还可以做其他事情:你可以动态选择N,只使用遵循当前策略的数据(基本上查看采取了哪些动作,并检查这些动作是否与最大Q值一致)。原则上,你也可以动态选择N,在训练后期当你的Q值可能更准确时使用更小的N。你还可以使用重要性采样,用一些重要性权重来加权这些奖励。


成功案例与算法选择建议

这些是实践中Q-Learning的三种技巧。有一些非常成功的Q-Learning例子。我认为还有其他例子,但最突出的例子之一是用来玩游戏。如果你想训练一个智能体玩游戏,无论是为了看你能做多好,还是为了与人类对战,Q-Learning能够在大多数Atari游戏上超越人类水平。这里的图表显示,所有在虚线上方的游戏,其性能都达到或超过了人类水平,所有在下方的则低于人类水平。

它还被用来训练机器人抓取系统。这实际上是一个连续动作的情况。右边的机器人使用通过Q-Learning训练的Q函数,然后对动作进行一种连续优化,试图找到抓取物体的好方法。

我们上次谈到,使用RL可以获得更高的成功率和更可靠的策略,这里也看到了。这个系统能够达到约96%的成功率,相当高。使用RL对这个应用的另一好处是,为了抓取,你不仅需要向下抓取东西,还需要在物体周围移动。它也能够学会如何使用强化学习来做到这一点,因为它将其视为一个序列决策问题。


在线RL算法选择建议

最后我想介绍一些关于何时使用哪种在线RL算法的建议,因为这是我们讨论的最后一个在线RL方法。我们讨论了PPO、SAC和DQN,这是我们讨论过的三种主要实用算法。

  • PPO:当你关心稳定性和易用性时很棒。通常不需要太多调整,但数据效率不高。因此,当你关心稳定性、易用性且不太关心数据效率时,它是很好的选择。
  • DQN:当你有离散动作或低维动作空间时效果很好。在这些情况下,它可以是一个很好的选择,根据你能使其离策略的程度,它可能具有相当的数据效率。
  • SAC 及其变体:当你最关心数据效率时很棒,但需要更多调整,并且比简单的PPO稳定性稍差。

总结

本节课中,我们一起学习了Q-Learning及其在实践中的应用,包括目标网络、双DQN和N步回报这三个技巧。我们定义了贝尔曼方程和贝尔曼最优性方程。这本质上就是如何在不学习显式策略的情况下进行强化学习。

至此,我们完成了目前在线强化学习算法的学习。我们已经涵盖了许多不同在线强化学习算法的基础知识。

007:离线强化学习

在本节课中,我们将要学习离线强化学习。我们将首先回顾在线强化学习方法,然后探讨离线强化学习的核心挑战,并介绍两种主要的离线强化学习方法:优势加权回归和隐式Q学习。我们将了解这些方法如何利用离线数据集学习策略,并克服因数据分布偏移带来的过估计问题。

在线强化学习方法回顾

上一节我们介绍了在线强化学习的基本方法,本节中我们来看看这些方法的核心思想。

我们首先讨论了策略梯度方法。其目标是收集策略数据,然后增加那些带来高于平均回报结果的行动的概率,从而鼓励策略多做带来好结果的事情,少做带来坏结果的事情。

接着,我们引入了价值函数的概念。我们可以使用价值函数来估计一个行动的好坏。当我们拟合一个价值函数后,就可以用它来鼓励策略多做我们估计为好的事情,少做我们估计为坏的事情。我们看到了像PPO和SAC这样使用演员-评论家方法的算法。

我们还讨论了拟合价值函数的几种不同方式。这些方式将在今天的课程中扮演重要角色。

以下是拟合价值函数的几种主要方法:

  1. 蒙特卡洛回报:如果你有一些状态数据,并想估计该状态的价值,一种方法是取未来轨迹上的奖励之和,并以此方式估计价值。目标函数是尝试拟合某个价值函数 \(V_{\pi}(s)\),其目标是该状态向后的奖励之和。其目标函数如下:

    \[\min_{\phi} \sum_{(s_t, a_t) \in \mathcal{D}} \left( V_{\phi}(s_t) - \sum_{t'=t}^{T} r_{t'} \right)^2 \]

    这是估计价值函数最简单的方法。

  1. 时序差分更新:为了获得更好的估计,我们可以在中间状态查看价值估计,而不是简单地对所有奖励求和。具体来说,目标变为当前时间步的奖励加上下一时间步的估计价值。其目标函数如下:

    \[\min_{\phi} \sum_{(s_t, a_t, s_{t+1}) \in \mathcal{D}} \left( V_{\phi}(s_t) - (r_t + V_{\phi}(s_{t+1})) \right)^2 \]

    我们称这种方法为自举法或时序差分更新。

  2. 离策略Q函数学习:在上述两种场景中,数据集是从你的策略中采样的,这是用于估计策略价值的同策略方法。我们随后开始研究一种场景:如果数据集是从一些旧策略的混合中采样的,我们能否使用这些数据来拟合价值函数?为此,我们开始研究Q函数。原则上,我们可以使用类似自举的方法,但关键区别在于,这里的价值函数是针对数据中的策略,而不是我们试图学习价值函数的策略。因此,我们改变了目标,使用Q函数。目标变为 \(r_t + Q_{\phi}(s_{t+1}, a_{t+1})\)。关键区别在于,\(s_t\)\(a_t\)\(s_{t+1}\) 是从数据中采样的,但 \(a_{t+1}\) 将从我们试图学习价值函数的策略中采样。

这个最后的方法的一个非常重要的方面是,因为我们使用自举法,并使用我们在给定状态下的价值函数估计作为标签,所以我们需要这个Q函数在那些与我们将在其上评估的行动相似的行动上进行训练。如果我们的策略与旧策略集非常不同,这个标签将不准确,我们就无法学习到准确的Q函数。因此,它需要对行动有良好的覆盖。

完整的离策略演员-评论家方法大致如下:我们从策略中获取数据,将其存储在包含多个过去策略数据的缓冲区中,从该缓冲区采样一些数据,用这些目标更新我们的Q函数,然后更新我们的策略以鼓励其增加具有高Q值的行动的概率。然后我们可以重复这个过程。

离线强化学习简介

今天,我们将基于这些想法进行构建,具体讨论离线强化学习。在离线强化学习中,我们试图从一个给定的数据集中学习,而不是由我们自己的策略收集。我们将讨论两种不同的方法或两类方法来进行离线强化学习。我们将尝试看到的关键点是:首先,离线强化学习中出现的关键挑战;其次,两种不同的离线强化学习方法及其工作原理;最后,离线强化学习如何比另一种从离线数据集学习的方法——模仿学习——有所改进。

离线强化学习的动机

在线强化学习的过程是收集数据,然后使用最新数据或迄今为止的数据更新策略,然后重复该过程。对于离线强化学习,你实际上只是预先获得数据集,然后你想在该提供的数据集上训练一个策略。因此,你实际上不是迭代地收集数据。

在许多情况下,离线强化学习可能比在线强化学习更有用。

以下是离线强化学习可能更有用的几种情况:

  1. 已有数据集:当你试图解决一个问题时,你可能已经有一个由现有系统或人员收集的数据集。
  2. 安全考虑:从当前策略收集数据可能风险更高或可能不安全。例如,如果你试图学习一个控制汽车在道路上行驶的策略,你可能有很多人们驾驶的数据,这些数据对于学习一个好的驾驶策略非常有用。实际部署你的策略,尤其是驾驶技术不佳的策略,可能是不安全的。
  3. 数据重用:如果你实际多次运行在线强化学习,你可能已经拥有来自策略的数据集,重用这些数据比每次尝试运行实验时重新收集数据要好得多。例如,如果你正在训练机器人做某事,并希望它学习如何抓取东西,那么如果你使用纯在线强化学习方法,意味着每次运行算法时都需要从策略中重新收集数据。这可能非常低效,因为第一次运行算法时,算法本身仍有迭代空间。通常,离线数据比在线数据更便宜,因为离线数据可以多次重用。

值得注意的是,你可以混合离线强化学习和在线强化学习。例如,在自动驾驶中,你有一个人们驾驶的数据集,然后你在其上训练一个策略,然后尝试用一些在线数据收集来改进它。在许多现实世界的强化学习用例中,你会希望混合使用,因为如果你实际部署了策略,那么在部署后能够改进它是很好的。

离线强化学习的正式定义

假设你被给予某个数据集。该数据集可能包含一些轨迹。例如,在驾驶场景中,你有一些汽车,并且有人们在许多不同地方、以许多不同方式、使用许多不同汽车驾驶的数据集。我们将说这构成了我们被给予的某个数据集。

从数学角度思考收集这些数据的策略是有帮助的。我们不知道底层策略。例如,如果这是由人们收集的,我们不知道具体是什么。首先,它是由多个人收集的,即多个策略。我们也没有直接访问权限。但从数学角度思考该策略是有用的。因此,我们将说该数据集是通过运行某个策略收集的,我们将其称为行为策略或 \(\pi_{\beta}\)。如果它是由多个策略收集的,你可以将 \(\pi_{\beta}\) 视为策略的混合,并将该混合定义为某些组成策略的平均或加权和。因此,说它是由单个策略收集的不会失去一般性。

我们的目标是学习一个能最大化奖励的好策略。理想情况下,我们能够获取这个数据集并学习一些可以控制汽车的策略。我们想要一个我们称之为 \(\pi_{\theta}\) 的策略,并最终最大化对应于该策略有多好的奖励之和。你可以将其视为最大化该策略的参数,并尝试最大化从该策略采样的轨迹的奖励之和。目标函数如下:

\[\max_{\theta} \mathbb{E}_{\tau \sim \pi_{\theta}} \left[ \sum_{t} r(s_t, a_t) \right] \]

这里需要注意的一点是,这个目标是对该策略的期望,而我们的数据是由不同策略收集的。因此,我们可以认为收集数据的策略与我们部署的策略之间存在一些分布偏移,并且我们实际上无法从该策略中采样。这是离线强化学习的一大挑战。存在一种分布偏移,因为这个期望是在学习策略下,而不是在收集数据的策略下。环境动态在数据和学习策略之间是恒定的。因此,轨迹的分布偏移仅由策略的偏移引起。

直接应用离策略算法的挑战

一个自然的问题是,也许我们可以直接重用离策略算法,只是使用离线数据集而不是用新策略重新收集数据来运行该离策略算法。如果你在离线数据集上使用像SAC这样的离策略算法,会发生什么?

核心问题是,我们正在评估从我们策略中采样的行动上的Q估计,而我们的策略也试图增加具有高Q值的行动的概率。如果我们有离线数据,并且我们正在学习一个与收集数据的策略不同的策略,那么我们用来监督Q函数的这个Q估计可能不准确,因为它实际上不一定看到来自我们学习策略的行动。因此,我们可能最终学习到一个不准确的Q函数,如果你没有学习到准确的Q函数,那么结果可能会得到一个糟糕的策略。

更详细地解释一下:假设我们的数据集中有一些行动,比如 \(a_1\)\(a_2\)\(a_3\)。汽车可以采取数据集中没有的其他行动,例如 \(a_4\)\(a_5\)\(a_6\)。在训练开始时,我们将随机初始化我们的Q函数。对于一个给定的状态,随机初始化的Q函数可能看起来有些随机。只有其中一些行动存在于数据中。然后,当你进行策略更新时,你的策略会说,让我们尝试增加具有高Q值的行动的概率。对于这个随机初始化的Q值,也许像 \(a_4\) 这样的行动看起来不错。如果那在你的数据之外,那么它将继续认为那是一个好的行动,因为它永远不会真正知道该行动的正确Q值是什么。

另一种思考方式是,这里有一些分布外的行动,包括 \(a_4\)\(a_5\),它从未见过。例如,从未见过汽车在高速公路上掉头,因此该行动的Q值是随机初始化的。一些分布外的行动将任意具有更高的Q值,一些将具有更低的Q值,因为它是随机初始化的。然后,你的策略将利用这些分布外行动上的不准确性。在策略更新之后,这些Q值将被高估,因为现在你将不断强化那是好的行为,即使它不在你的数据中。

这个问题的另一个视角是,当你的学习策略与行为策略偏离太多时,就会发生这种情况,因为这些分布外行动是与行为策略所做的非常不同的事情。如果我们更接近行为策略,就不会有这个问题。

离线强化学习方法

现在,让我们讨论减轻过估计的方法,这实际上是离线强化学习方法的核心目标。

基线方法:过滤模仿学习

一种离线强化学习方法是进行模仿学习。模仿学习有效的原因是你只监督数据中看到的行动,因此任何使用模仿学习的方法都会在一定程度上隐式地避免分布外行动,因为你只监督数据中的行动。

然而,我们不一定想使用普通的模仿学习,因为离线数据可能不是最优的。例如,你的数据中可能有人类驾驶员,他们不以你希望自动驾驶汽车驾驶的方式驾驶。通常,强化学习方法应通过利用奖励信息提供一种比底层数据策略更好的方式。通过利用这样一个事实:也许你可以浏览数据集并说这是一个好的行为,而另一个行为不那么好。这些奖励信息可以让你获得更好的策略。普通的模仿学习无法超越数据中提供的专家。

一个好的离线强化学习方法还可以将好的行为“缝合”在一起。例如,如果你有一些轨迹,你知道从 \(s_1\)\(s_3\) 是好的行为,从 \(s_7\)\(s_9\) 是好的行为,那么离线强化学习方法原则上实际上可以学习如何获得一个从 \(s_1\)\(s_9\) 的策略,而模仿学习方法将无法做到这一点。

在我们深入讨论可以进行这种缝合的方法之前,让我们先讨论一个非常简单的基线方法。一个想法是,如果你有一个离线数据集,你也可以只取具有高奖励的轨迹,只模仿好的部分,不模仿坏的部分。这似乎是一个合理的方法。

以下是该方法的步骤:

  1. 你有一个包含各种轨迹的离线数据集。
  2. 你可以定义一个新的数据集,该数据集只包含具有高奖励的轨迹。
  3. 这个新数据看起来像是你原始数据集中的所有轨迹,但条件是这些轨迹的奖励大于某个阈值。该阈值可以是数据集中奖励的某个百分位数,例如第70百分位数,即只取前30%的轨迹。
  4. 然后,你可以学习一个最大化在这个修改后的数据集中行动可能性的策略。这看起来像是在这个修改后的数据集中取状态和行动,并最大化给定状态下行动的对数概率。

这是一个非常原始的利用奖励信息的方法。值得注意的是,它无法进行这种缝合行为,因为如果那是一个坏的轨迹,它可能会完全过滤掉该轨迹,而不会实际学习如何采取这个好的行为和那个好的行为,并弄清楚如何从这里到达那里。也就是说,这是一个好的基线。如果你要尝试任何离线强化学习方法,最好先尝试这个方法,看看它的效果如何,并将其作为基准,并确保你的离线强化学习方法比这更好。

方法一:优势加权回归

我介绍这个方法的原因之一是,可以说一些最好的离线强化学习方法实际上做的事情与此并没有太大不同,因为它们确实有一个模仿学习的组成部分。这里的想法是,我们可以模仿数据,但根据该转移中行动的好坏来加权我们的模仿学习目标。

如果你还记得我们关于价值函数和优势函数的讨论,优势函数表示 \(A_t\) 比你的策略的平均表现好多少。这个优势函数表明,如果我们用优势函数加权我们的模仿学习目标,那么我们可以获得该行动有多好的度量,并获得一个能够有效学习的策略。这将形成我们第一个离线强化学习方法的目标。

具体来说,我们将最大化一个策略的目标,该目标采用标准的模仿学习目标,但仅用指数化的优势进行加权。目标函数如下:

\[\max_{\theta} \sum_{(s, a) \in \mathcal{D}} \log \pi_{\theta}(a|s) \exp\left( \frac{1}{\alpha} A(s, a) \right) \]

关于指数化的选择,实际上有一种方法可以推导出这个特定的目标。如果你有一个好的优势函数估计,并且我们回到缝合的例子,对于这个特定的状态,我们知道这个行动的优势是高的。因此,当我们采用模仿学习目标并用优势加权时,我们将告诉我们的策略,在该状态下,它应该走向好的结果,而不是走向坏的结果。因此,如果你有一个好的优势估计,这个目标能够在离线数据集中缝合好的行为。

在推导方面,你可以证明这个优势加权模仿学习目标近似于一个KL约束目标,其中它在最大化由你的Q值衡量的未来奖励,同时受到你保持接近行为策略的约束。这对于离线强化学习来说是一个相当合理的目标,因为如果你离行为策略太远,那么你将无法获得关于如何改进策略的良好信息。

优势函数估计

现在,优势实际上与某个策略相关联。它是采取状态 \(s\) 下的行动 \(a\) 然后遵循某个策略的优势。第一个问题是,我们试图为哪个策略估计优势?目前,我们可以尝试估计行为策略的优势。

一个关键问题是如何以防止我们之前看到的过估计的方式来估计这个优势函数。

以下是估计优势函数的第一种方式:

版本1:使用蒙特卡洛回报

我们可以首先拟合一个价值函数。因为我们正在为行为策略拟合价值函数,数据来自我们试图评估价值函数的策略。如果我们想用蒙特卡洛回报拟合价值函数,那么我们的目标看起来像是我们试图回归到未来奖励之和。目标函数如下:

\[\min_{\phi} \sum_{(s_t, a_t) \in \mathcal{D}} \left( V_{\phi}(s_t) - \sum_{t'=t}^{T} r_{t'} \right)^2 \]

这基本上是有监督学习,学习未来奖励。然后,一旦我们完成了这个,问题是我们如何从中获得优势?有几种方法可以做到这一点。我们第一次看到这个时,获得优势函数的方法是使用奖励加上下一时间步的价值函数减去当前时间步的价值函数。这些都是我们刚刚估计的价值函数。你可以使用这个。

一个替代方案是,你可以简单地使用未来奖励的经验和。这会更简单一些,不依赖于两个价值函数之间的良好时序差异。具体来说,我们可以首先通过尝试最小化我们的价值估计与奖励和之间的差异来估计价值函数,然后为了估计优势函数,我们可以取该轨迹的奖励和并减去价值函数。优势估计如下:

\[\hat{A}(s_t, a_t) = \sum_{t'=t}^{T} r_{t'} - V_{\phi}(s_t) \]

这种特定的优势估计对应于一个相当简单且相当流行的算法,称为优势加权回归。

确定性数据集的考虑

为了让你思考一下,问题是,如果你在确定性数据集或底层策略是确定性的数据集上这样做,你实际上会学到什么?例如,假设汽车在某些车道上总是直行,你从未见过它左转或右转。如果你在这种数据上运行这个算法,以这种方式拟合你的优势,你会学到什么优势?

如果你总是采取相同的行动,那么奖励之和将与 \(V\) 相同,因为你实际上没有看到行动中的任何可变性,这意味着你的优势估计将全部为零。然后,如果你将其代入这个方程,如果你的所有优势估计都为零,那么这个指数项将变为1,那么你实际上就回到了普通的模仿学习。这实际上很好,因为你得到了那个结果,因为这意味着对于这种策略,你实际上无法比行为策略做得更好,因为你看不到可以采取的不同行动的任何可变性,因此该算法在这种情况下退回到模仿学习。

完整算法与总结

完整的算法是:我们首先使用蒙特卡洛回归拟合价值函数,然后我们训练一个策略,其中我们通过指数化的优势估计来加权采取行动的概率或似然目标,优势估计由奖励和减去价值函数给出,并且我们有一个超参数来控制温度或该分布的尖锐程度。

这种算法的一个优点是它非常简单,可能是你可以实现的最简单的东西,有可能比过滤模仿学习有所改进。它还避免了查询或训练任何分布外行动,这使其更加稳定。也就是说,蒙特卡洛估计可能有噪声,并且我们正在为行为策略而不是我们学习的策略学习优势估计,因此我们只能比数据集改进这么多。

方法二:隐式Q学习

如果我们能够不使用蒙特卡洛,而是使用TD更新或自举更新,而不必查询分布外行动上的Q值,那将是非常好的。我们之前目标的问题是,我们在这里查询从我们学习的策略中采样的行动上的Q函数。

一个非常简单的事情是,我们可以不从我们学习的策略中采样 \(a'\),而是直接从我们的数据集中采样 \(a'\)。这是一个非常简单的修改,这将确保我们看到的 \(a'\) 实际上总是在数据中看到,并且我们将实际拥有对这个 \(s', a'\) 的监督目标。

如果你以这种方式估计优势函数或估计Q函数,然后使用它来估计你的优势,你会得到一个称为优势加权演员-评论家的算法。请注意,这消除了原始优势加权回归算法的一个弱点,即我们能够使用自举,但我们仍然在为 \(\pi_{\beta}\) 而不是我们学习的策略估计价值函数。这仍然是这种方法的一个缺点。

因此,从这里开始,最好考虑我们是否可以为比行为策略更好的策略估计Q值。思考这个问题的一种方式是,当我们试图最小化这个自举目标时,这个目标实际上是 \(s'\) 的一个样本。我们估计的是结果的平均值,即预期未来奖励的平均值。但实际上,数据中表示的结果存在某种分布。

如果我们考虑那个分布,对于给定的状态,当你采取不同的行动时,你会看到不同的奖励和。因此,实际上存在某种底层分布。当我们进行蒙特卡洛回归时,如果这个分布有一个均值,那么这就是我们试图拟合的行为策略的蒙特卡洛估计的平均值。

如果我们想尝试学习一个比 \(\pi_{\beta}\) 更好的策略的价值函数,我们可以考虑也许不是试图拟合我们看到的结果的均值,而是尝试拟合某个其他百分位数。例如,如果我们尝试拟合第70百分位数,那么我们实际上可能获得一个比我们行为策略更好的策略的价值函数。

我们如何做到这一点?也许我们可以考虑使用一个不同于L2损失的损失函数来获得一个更好的策略。一个想法是使用一个不对称的损失函数。这被称为期望回归。这是一个很酷的技巧,如果你考虑它,就像不是误差或某个任意随机变量 \(x\),如果你定义这个 \(\lambda\) 项的不同值,那么你会得到这些不对称的损失。如果 \(\lambda\) 大于0.5,你会看到一个方向的不对称;如果小于0.5,你会看到另一个方向的不对称。

回到我们的算法,如果我们想拟合我们的价值函数,我们可以使用这个期望损失,并基本上拟合一个价值函数,该函数试图估计一个比行为策略更好的策略的价值函数。这将惩罚你的高估和低估,但如果你稍微高估一点,惩罚不会那么严重。

具体来说,对于这个算法,我们将使用期望损失来拟合价值函数,我们还将使用典型的均方误差损失来拟合一个Q函数,并且我们将实际使用价值函数作为目标。因此,我们将同时拟合一个价值函数和一个Q函数,并且只对拟合价值函数使用这个期望损失。一旦我们有了Q函数和价值函数,我们就可以将优势估计为 \(Q - V\),并使用相同类型的AWR方法来获得一个策略,其中我们通过指数化的 \(Q - V\) 来加权可能性。

这个算法被称为隐式Q学习。这种算法的优点是,我们不需要查询分布外行动,策略仍然只在数据中的行动上进行训练,并且我们解耦了演员和评论家训练。因此,我们只进行这些评论家训练,在数据上拟合价值函数和Q函数,然后一旦完成并且已经收敛或进行了足够的训练,我们就训练我们的策略。

总结

在本节课中,我们一起学习了离线强化学习。我们首先回顾了在线强化学习方法,然后探讨了离线强化学习的动机和核心挑战——行为策略与学习策略之间的分布偏移。我们讨论了直接应用离策略算法会导致对分布外行动的Q值过估计问题。

接着,我们介绍了两种主要的离线强化学习方法:

  1. 优势加权回归:一种简单的方法,通过蒙特卡洛回报拟合行为策略的价值函数,然后使用指数化的优势估计来加权模仿学习目标,从而在避免分布外行动的同时,利用奖励信息改进策略。
  2. 隐式Q学习:一种更先进的方法,通过期望回归拟合一个优于行为策略的价值函数,并结合Q函数学习,能够进行更低方差的自举更新,从而实现更好的策略提升和轨迹“缝合”。

离线强化学习的核心思想是通过约束学习策略接近行为策略(例如,只对数据中的行动进行监督)来避免分布偏移问题,同时利用奖励信息来超越单纯的模仿学习。这些方法使得重用昂贵的离线数据成为可能,并为安全关键应用和从现有数据集中进行高效学习提供了强大的工具。

008:奖励学习

在本节课中,我们将要完成离线强化学习的讨论,并重点探讨奖励学习。核心目标是理解为什么任务定义是困难的,为什么简单的奖励定义方法会失败,以及如何从人类监督中学习奖励函数。

离线强化学习回顾

上一节我们介绍了离线强化学习的基本挑战。我们的目标是从一批已有的数据中学习策略,而不进行任何在线数据收集。我们假设这批离线数据是由某个未知的策略(称为行为策略或 π_β)收集的,而我们的目标是在新策略 π_θ 下最大化奖励。这就带来了数据收集策略与我们正在优化的策略之间的分布偏移挑战。

传统方法的挑战

如果你尝试在此设置中使用传统的强化学习算法,会遇到一个关键挑战。例如,当你尝试优化一个Q函数来改进策略时,你可能会在从学习策略中采样的动作上查询你的Q函数,而这些动作可能并未包含在数据中。这会导致高估,并使你的Q函数变得不准确。

以下是离线强化学习中一个典型的问题场景:

  • 如果我们的数据只覆盖了某个给定状态下某个范围内的动作。
  • 当我们尝试学习一个优化Q函数的策略时,它可能会开始查询那些Q值随机较高的动作(即使它们不在数据分布内)。

隐式Q学习

我们上次讨论的主要算法是隐式Q学习。IQL通过完全避免对数据集之外的动作进行任何函数查询,来解决离线误差问题。它通过仅使用数据中的状态和动作来学习价值函数和Q函数。

一个关键点是,IQL在学习价值函数时使用了非对称损失,以尝试学习一个优于行为策略的策略的价值函数。而对于Q函数,它使用了标准的L2损失。

为什么价值函数使用非对称损失而Q函数不用?我们可以这样思考:在执行策略时,存在两个变异性来源:一是你可能采取的不同动作,二是给定动作后你最终到达的状态。Q函数评估的是采取某个动作后的预期回报,而价值函数评估的是到达某个状态后的预期回报。由于环境存在随机性,下一个状态的价值可能低于采取该动作后的Q值。

  • 如果我们对价值函数使用非对称损失(倾向于更大的Q值),这对应于选择更好的动作,从而学习一个优于行为策略的策略。
  • 如果我们对Q函数也使用非对称损失(倾向于更大的未来状态价值),那将是在优化一个“更幸运”的策略,而不是“更好”的策略,而幸运是你无法通过动作控制的。

因此,在IQL目标中,我们同时训练一个价值函数和一个Q函数。价值函数用于学习一个更优策略的价值估计,而Q函数则帮助我们通过优势加权回归等方法找出哪些动作更好。

保守Q学习

除了IQL,还有其他方法可以进行离线强化学习。本节中我们来看看另一种算法。在这种方法中,我们仍然会尝试估计价值,并且仍然会从策略中查询动作。我们需要思考如何阻止高估,并阻止RL算法采取那些因为分布外而可能被误认为具有高Q值的动作。

一个想法是:我们能否在数据支持范围之外最小化Q值?也就是说,我们能否直接对分布外的Q值进行压制?

如果我们这样做,那么对于所有分布外的事物,我们都会持一种悲观或保守的态度,而对于数据支持范围内的部分则不那么保守。

我们可以制定一个实现此目标的损失函数。它看起来是这样的:

L(φ) = L_critic(φ) + α * (E_s~D, a~μ(·|s)[Q_φ(s, a)] - E_s~D, a~π_β(·|s)[Q_φ(s, a)])

其中:

  • L_critic(φ) 是标准的批评家(Q函数)损失。
  • 第二项是试图最小化来自某个分布 μ 的动作的Q值,同时最大化数据集中动作的Q值。
  • α 是一个超参数,控制保守程度。

这个算法的目标是:在数据支持范围内,Q函数尽可能准确;在数据支持范围外,Q值较低,因为我们知道在那里无法学习到准确的Q函数。

在实践中,我们不需要显式地构建分布 μ。如果我们选择 μ 为最大化Q值同时具有一定熵(即更广泛的分布)的分布,那么最优的 μexp(Q值) 成正比。最终,这个额外的项可以简化为一个对数求和项。

因此,最终的CQL目标函数如下:

L(φ) = L_critic(φ) + α * (log ∑_a exp(Q_φ(s, a)) - E_(s,a)~D[Q_φ(s, a)])

这个算法被称为保守Q学习。完整的算法流程是:使用我们的数据优化这个目标,得到一个Q函数,然后更新我们的策略以选择具有高Q值的动作,并重复这个过程。

应用实例

CQL已被应用于实际场景。例如,LinkedIn的研究人员使用该算法来优化发送通知(如电子邮件通知)的策略。他们希望优化点击率,同时最小化发送通知的总次数。通过将CQL项添加到DQN目标中,并使用离线数据集进行训练,然后在在线A/B测试中运行该策略,他们获得了更高的点击率、更少的通知总数以及用户使用率的轻微提升。

为什么要保守?

保守性源于离线RL的最初动机:在数据支持范围之外,由于无法收集在线数据,你无法学习一个远超出数据的策略。如果你假设可以远超数据,可能会学习到一个不准确的Q函数,从而导致学习到一个糟糕的策略。

奖励学习概述

到目前为止,除了模仿学习,我们一直在尝试最大化奖励之和。这就引出了一个问题:奖励从何而来?在现实世界场景中,通常无法直接获得奖励函数。

为什么需要奖励学习?

  • 代理奖励的局限性:有时我们可以使用真实奖励的代理,例如人类给出的成功/失败标签,或点击率等指标。但代理奖励存在很多缺点,可能无法完全捕捉我们真正关心的目标。
  • 模仿学习的局限性:模仿学习不需要奖励函数,但它只优化模仿动作,而不考虑结果或优化特定目标。此外,提供演示可能很困难,或者专家具有不同的自由度,使得获取良好的演示数据变得困难。

奖励学习的核心是思考我们想要看到的底层结果是什么:专家试图实现什么?人类想要什么?

我们将讨论两种学习奖励的方法:一种是从目标示例中学习,另一种是从人类偏好中学习。

从目标示例中学习奖励

我们可以考虑的最简单的事情是,给出成功看起来是什么样子的例子,然后训练一个分类器来预测成功与失败。

具体步骤如下:

  1. 收集成功状态和失败状态的示例。
  2. 训练一个二元分类器来区分它们。
  3. 使用该分类器的输出作为奖励信号。

潜在问题

这种方法可能存在什么问题?

  • 稀疏奖励:分类器只告诉你是否在目标状态集合内,你需要自己找出如何朝着目标取得进展。
  • 欺骗分类器:当你针对分类器进行优化时,RL算法可能会寻找分类器认为好但实际并非如此的状态,本质上是在利用分类器的弱点。

解决方案:对抗性训练

我们可以采用一种与CQL非常相似的方法来防止RL算法利用弱点。关键思想是:将策略访问的状态作为负样本添加到分类器的训练数据中。

具体算法如下:

  1. 收集初始的成功状态和失败状态。
  2. 更新分类器,训练其区分成功和失败状态。
  3. 使用基于分类器的奖励收集策略的经验。
  4. 将访问过的状态添加到负样本中。
  5. 使用这些新的负样本重新更新分类器。

这种方法需要注意几点:

  • 数据平衡:为了防止分类器总是预测为负,需要平衡数据集,确保正负样本各占一半。
  • 正则化:为了防止对少量正样本过拟合,需要对分类器进行正则化,鼓励其更加平滑。

有趣的是,这种方法本质上是一种生成对抗网络:分类器作为判别器,试图区分我们提供的正样本和策略访问的状态;而策略作为生成器,试图生成被判别器认为是“真实”(即成功)的状态。

实例与总结

在机器人技术中,使用这种方法,仅用50个演示的最终状态作为成功样本来训练分类器,然后运行基于该分类器奖励的RL,可以将成功率从模仿学习的26%提升到62%。

从目标示例中学习的总结:

  • 优点:这是一个非常实用的框架。
  • 缺点:对抗性训练可能不稳定,需要各种正则化技巧;并且需要提供期望行为的示例,这有时可能具有挑战性或耗时。

从人类偏好中学习奖励

现在让我们谈谈从偏好中学习。我们不再仅仅讨论到达某个目标集的状态,而是希望学习涵盖良好行为与不良行为的奖励,这可能包含超越仅仅到达某个状态的内容。

与其提供演示或目标示例,我们可能希望提供关于完整轨迹的反馈。一种选择是直接询问“这个轨迹有多好?”,但评估轨迹的绝对性能通常很困难。一个更简单的问题是:“哪个轨迹更好?”这种相对偏好通常比评估轨迹的绝对性能更容易提供。

偏好学习模型

假设人类告诉我们一个轨迹比另一个轨迹更好。这可能意味着较好轨迹中状态和动作的奖励之和应该大于较差轨迹的奖励之和。

我们可以将这种偏好关系形式化。假设我们有一个由轨迹对和偏好标签组成的数据集。我们希望使用这个数据集来学习一个奖励函数 r_θ(s, a)

一个简单的方法是,我们希望较好轨迹的总奖励减去较差轨迹的总奖励为正数。为了进行最大似然训练,我们可以使用sigmoid函数将这个差值映射到0到1之间,将其解释为一个轨迹优于另一个轨迹的概率。

具体地,我们定义偏好概率为:

P(τ_w ≻ τ_l) = σ( Σ_t r_θ(s_t^w, a_t^w) - Σ_t r_θ(s_t^l, a_t^l) )

然后,我们通过梯度下降优化奖励函数参数 θ,以最大化数据集中所有轨迹对这个概率的乘积(或对数似然)。

完整算法

完整的算法流程如下:

  1. 拥有一个轨迹数据集。
  2. 采样K个轨迹的批次,请人类对这些轨迹进行排序。
  3. 在当前奖励模型下计算这些轨迹的奖励(即对状态和动作进行前向传播并求和)。
  4. 使用目标函数计算梯度(对于排序中的每一对轨迹计算偏好概率)。
  5. 使用计算出的梯度更新奖励参数 θ
  6. 重复此过程。

此外,你还可以将其置于强化学习循环中:

  1. 从策略中采样轨迹。
  2. 请人类对它们进行排序。
  3. 更新奖励模型。
  4. 使用更新后的奖励模型重新更新策略。
  5. 重复。

应用实例

  • 模拟环境:例如,训练一个模拟智能体做后空翻。很难为后空翻编写奖励函数,但通过向人类询问约900次“这个比那个好吗?”,可以在RL循环中学习到一个能够后空翻的策略以及人类偏好的后空翻奖励函数。
  • 自动驾驶:学习车道保持、保持一定速度、避免碰撞等行为的相对重要性。
  • 语言模型:这是学习语言模型奖励的一种非常流行的方法。例如,给定一个提示“如何煎蛋卷?”,从语言模型中采样两个不同的回答,然后询问哪个人更喜欢哪个回答。收集到的偏好数据可用于训练一个奖励模型,该模型判断对于给定提示,一个回答有多好。

基于AI的反馈

除了人类反馈,你也可以使用AI模型(例如,一个更强的模型)来判断哪个回答更好。这通常被称为“基于AI反馈的强化学习”。一个见解是:批评通常比生成更容易,因此你可能能够通过AI反馈获得比其它方式更强的模型。

课程总结

本节课中我们一起学习了奖励学习。奖励不能被视为理所当然。

我们讨论了从目标中学习:

  • 非常实用,但对抗性训练可能有些棘手,并且需要期望行为的示例。

我们也讨论了从人类偏好中学习:

  • 成对偏好非常容易提供,不需要目标示例或演示。
  • 已在语言模型中大规模部署。
  • 可能需要在强化学习循环中进行一些监督。

最后,值得思考的是,除了目标和偏好,还有许多其他方式可以为尝试学习的智能体提供监督。这是一个充满研究机会的领域。此外,还有“无监督强化学习”等有趣的工作,其中智能体可以自己提出目标,而不是由人类提供。

009:大语言模型的强化学习 🧠

在本节课中,我们将要学习如何将预训练的大型语言模型转化为能够与人类良好交互的智能助手。我们将重点介绍偏好优化技术,包括指令微调、基于人类反馈的强化学习以及直接偏好优化,并探讨当前方法的局限性。

从语言模型到智能助手 🤖

过去五到十年间,一个明显的趋势是我们构建的模型越来越大,投入的计算资源也越来越多。然而,今天我们要回答的问题是:如何从这些经过预训练、用于预测文本的大型语言模型,得到我们日常使用的、表现优异的聊天机器人?

预训练:学习语言与世界 🌍

首先,我们简要回顾一下预训练。这不是一个自然语言处理课程,但我们需要理解预训练中学到了什么,以及为什么这不一定能直接转化为我们使用的聊天机器人。

大型语言模型在庞大的互联网文本语料库上进行预训练。它们的训练方式大致是预测句子中的下一个词或标记。例如,给定句子“斯坦福大学位于____加州”,模型会学习预测空白处的文本。通过预测文本,模型不仅学习了许多事实和琐事,也开始理解语言的句法结构。

预测下一个标记不仅让模型学会了语言,还让它学到了更多。有证据表明,模型最终学习到了关于世界如何运作的某种概念。例如,当提示是“这是一个在真空室中同时掉落保龄球和叶子的演示”时,模型需要理解文本内容,并在某种程度上理解世界如何运作,才能预测接下来的词语。

关键在于,语言模型不仅学习句法和词汇,还学习了大量关于世界如何运作的知识。同样,我们可以让它们解答数学问题、生成代码,甚至具备相当合理的医学理解能力。更重要的是,我们现在可以开始将这些模型转化为助手。

预训练的局限:语言建模 vs. 用户协助 ❓

现在回到我们的核心问题:预训练给了我们这么多能力,那么我们如何真正将其转化为助手呢?首先要理解的是,当我们预训练模型时,我们是在对语言建模。虽然这确实学到了比语言更多的东西,学到了关于世界的知识,但这仍然不等于协助用户。

例如,GPT-3的一个提示是:“用几句话向一个六岁的孩子解释登月”。作为语言模型,它会根据其在语料库中看到的文本分布,预测它认为应该是下一组标记的内容。它可能会开始生成:“向一个六岁的孩子解释重力理论”或“用几句话向一个六岁的孩子解释相对论”。这并非我们期望助手所做的——它只是一个在预测下一个标记的语言模型。

我们真正希望的是得到一个解释或故事,例如“一艘巨大的火箭飞船从地球发射,将宇航员送往月球”。这才是问题的初衷,而不仅仅是它在互联网上看到的文本。这就是语言建模和协助用户之间出现差异的地方。

指令微调 📝

为了解决上述问题,人们开发的第一套技术是微调。迄今为止,通用范式仍然是首先在大型文本语料库上预训练一个语言模型,然后针对特定任务进行微调。

微调的工作原理

微调是如何工作的呢?你收集一组输入和一些目标输出,然后提高这些目标输出的对数似然。在第二步中,你有一个输入(例如电影评论),以及一个目标输出(“好”或“坏”),模型学习预测输出是“好”还是“坏”。这就是微调和预训练之间的主要区别。

随着我们意识到这些预训练模型适用于更多任务,我们开始扩大可以同时进行微调的任务数量。之前的例子可能是情感预测,但实际上,这些模型可以同时针对许多不同的任务进行微调。

指令微调范式

广义上,这可以看作收集一组指令和输出对。例如,如果指令是“请回答以下问题:氮的沸点是多少?”,我们会有一个像“-320.4”这样的答案。我们希望能够在给定输入的情况下预测这个答案。

一旦我们收集了这样一个指令-输出对的语料库,我们就可以在许多未见过的任务上评估模型。例如,“杰弗里·辛顿能和乔治·华盛顿对话吗?请在回答前给出理由”,模型会产生一个合理的输出。

模型规模与泛化能力

如果在不同规模的语言模型上对同类型语料进行微调,会观察到随着模型参数规模的增加,它们的泛化能力实际上会变得好得多。即使使用非常小的指令-输出数据集,也能看到更多的泛化。需要指出的是,参数越大、模型规模越大,指令微调后的增益就越大。

这表明,模型开始响应并泛化到各种问题,即使数据语料库很小。

指令微调示例

举一个指令微调前后模型表现的例子。一个相当简单的问题:“在下面的句子中,解释代词的先行词,并说明它是模糊的”。未经微调的原始语言模型可能会开始生成右侧的文本,例如“记者和厨师将讨论他们最喜欢的菜肴”等等。但经过指令微调后,它会给出用户可能期望的正确答案。

指令微调的局限性

指令微调相当简单,这里没有非常复杂的内容。那么,你是否看到了这种方法的一些局限性呢?

一个明显的限制是收集此类数据的成本很高。你必须收集问题及其标签。随着问题难度的增加,能够回答这些问题的人越来越少,因此扩展这种需要人类坐下来为每个问题写下答案的数据收集工作成本高昂。

除此之外,某些任务甚至没有正确答案。语言模型的许多用例是创造性的。例如,如果我要求语言模型写一个关于狗和她的宠物蚱蜢的故事,这没有正确答案。我不能每次都坐下来指定一个我希望听到的确切故事。

第二点比较微妙。在指令微调中,我们有一个预定义的答案,因此错误是被同等对待的。我们不一定在说“这是错误的部分”,我们基本上是在说你的整个答案是错的或整个答案是对的。这对于特定问题来说往往并不正确。

例如,如果我们有一个陈述:“《阿凡达》是一部奇幻电视剧”,并不是整个句子完全正确或错误,而是将《阿凡达》描述为冒险电视剧比奇幻电视剧更好。

我认为最近出现的一个问题是,语言模型在生成答案方面确实比人类更出色。因此,如果我们依赖人类来生成答案并为我们的问题生成标签,我们将受到人类回答问题能力的限制。

最后,一个大的不匹配是语言模型的目标与我们希望模型做的事情之间存在一些偏差。我们希望模型能与人类良好互动,遵循他们的意图,而我们的微调目标基本上是说“很好地预测这个答案”。因此,在进行指令微调时,我们的训练目标存在一些不匹配。

基于人类反馈的强化学习 🏆

这引导我们进入基于人类反馈的强化学习范式。

从指令微调到偏好学习

问题是,指令微调的改进有多少来自于遵循格式,实际上又教授了多少新知识?大多数研究表明,它主要教授的是格式,而大部分知识实际上来自于基础语言模型本身。有一个非常清晰的方法可以验证这一点:你可以通过训练模型给出错误答案来进行实验,它在下游任务上仍然表现不错。这告诉我们,它实际上教授的是格式,而不是知识本身。

那么,语料库是否总是问答格式?因为这就是我们期望从聊天机器人那里得到的。现在不再是这样了。我认为这是大型语言模型微调的早期阶段,我们更关注问答,但现在指令微调的语料库非常多样化。这些大型语言模型被用于各种任务,如函数调用、工具使用等,不仅仅是协助,意味着许多不同的事情,所以不仅仅是问答,可以是任何东西。

RLHF 核心思想

现在,我们将深入探讨基于人类反馈的强化学习,它解决了我们在此讨论的一些局限性。

在本节中,我们将以摘要生成为例,因为通常没有一个我们可以训练的“好”摘要。

在符号上,我们假设给定一个指令 X,语言模型将生成一些样本 Y。我们假设有一种方法可以让人类在给定输入 X 和摘要 Y 的情况下,给出某种奖励分数。

例如,我们有一篇新闻文章:“加利福尼亚州旧金山,一场 4.2 级地震……”。我们有一个摘要:“地震袭击旧金山,有轻微财产损失,但无人员伤亡”。我们有另一个摘要:“湾区天气很好,但容易发生地震和野火”。显然,其中一个摘要比另一个稍好一些。假设奖励函数给我们一个 8.0 的分数,另一个摘要得到 1.2 分。

粗略地说,我们希望设定一个目标,即最大化期望奖励。因此,在给定某个输入指令 X 的情况下,我们希望我们的语言模型生成摘要 Y,使得期望奖励很高。这是我们可能在课程中见过的相当简单的标准强化学习目标。

RLHF 训练流程

这是聊天机器人训练的核心,大致流程如下(来自 Instruct GPT 论文):

  1. 首先进行一些指令微调。我们收集一些演示数据,主要是为了获得正确的格式,正如我们之前讨论的。
  2. 第二步和第三步我们将更深入地探讨,即首先建立一个奖励模型,使我们能够与人类意图对齐,然后我们最大化这个奖励模型。

这些是我们通常遵循的三个步骤。

策略梯度方法回顾

现在,假设我们有一个奖励模型,我们想要最大化它。我假设你们都熟悉梯度上升的思想。我们改变语言模型参数以最大化奖励的方式,你们以前见过,通常是某种形式的梯度上升(通常有更复杂的优化器,但我们现在可以假设不需要)。

目前,我们只假设一个通用的强化学习公式,我们生成一些样本 S_hat(来自分布 P_theta(S)),我们希望改变参数 theta,使得样本 S_hat 在奖励函数 R 下获得更高的奖励。

主要问题(这也是我们进行强化学习的原因)是我们的奖励函数通常是不可微的。如果你让我给出一个数字,我的人类思维是不可微的,因此我们无法通过它们进行反向传播。这就是我们求助于强化学习的原因。

这就是策略梯度方法(我认为 Chelsea 在课程早期已经讲过)的用武之地,它们允许我们最大化不可微的奖励函数,并且我们可以估计和优化那里的目标。

我将在这里简要回顾一下,因为它很重要,并且我们将慢慢引导进入强化学习流程,但我假设你们以前见过这个。

在这个通用目标中,当我们想要估计我们想要的量时,是期望奖励的梯度,我们希望样本 S_hat 在 R 下具有高奖励。这可以写下来,此时这只是代数,期望可以写为 R(S) 乘以 P_theta(S) 的和,然后我们这里有梯度。这只是期望的定义,现在我们要通过梯度的线性性质将梯度向前传播。

我假设你们见过这个,但我要过一遍。这是一个对数导数技巧,我们可以将 P_theta 的梯度重写为 P_theta 乘以 log P_theta 的梯度。要看到这一点,只需从链式法则出发,log P_theta 的梯度可以简单地写为 (1/P_theta) 乘以 P_theta 的梯度。

因此,我们可以将其重写,得到这个恒等式:P_theta 的梯度可以写为 P_theta 乘以 log P_theta 的梯度。

黄色的量是我们想要代回去的。如果我们把它代回去,我们得到以下方程:奖励乘以 P_theta 的梯度等于在 P_theta 下的期望 [R 乘以 log P_theta 的梯度]。

我们为什么要做这一切?通常,当我们计算句子的期望时,真的不可能枚举每一个可能的句子,甚至尝试这样做都是难以处理的。因此,我们希望能够以某种方式估计梯度,并且我们希望能够创建某种随机估计器,以便我们可以得到梯度。这个对数导数技巧使我们能够获取这个梯度并将其转换为我们可以采样然后近似的期望。

这就是我们得到的最终结果:它再次是奖励乘以 log P_theta 梯度的期望。

直观理解与挑战

那么问题是我们是否接受这个梯度?因为我们无法正确反向传播。有两个原因:首先,我们无法建立一个目标,其中奖励是不可微的;其次,更精确的数学答案是,我们的参数在期望中。因此,我们确实需要找到一种方法,将梯度带回期望中的参数。

但是,如果我们的奖励是可微的,我们不一定需要像这样设置优化目标。我们可以想象其他优化目标,在那里我们直接进行反向传播。

好的,所以我们经历了所有的数学推导,只是为了表明我们可以重写原始目标的梯度,并再次将其重写为一个期望,我们现在可以使用蒙特卡洛估计来近似它,即末尾的方程。我们可以将这个近似梯度插入我们喜欢的优化器(使用梯度下降或上升)中。

这真的只是一个简要回顾。

这也是一个非常直观的目标。实际上,它所说的就是,如果对于某个样本,奖励很高,我们应该增加其对数似然。因此,参数沿着在奖励上得分高的样本方向进行梯度更新。这就是这个目标所表达的全部内容。如果样本不好,你就朝着与那些样本相反的方向更新。

这就是为什么我们称之为强化学习,因为我们是在做好的行动就去那里,坏的行动就不去那里。

从分数到偏好

第一个问题是,到目前为止,我们假设我们有某种奖励函数,可以告诉我们摘要 A 是 10.0 分,摘要 B 是 5.0 分。但这通常是不可能的。假设你正在训练可能最大、最伟大的大型语言模型,它需要数百万个这样的查询,我们不可能让人类大军坐在那里标记每一个答案。因此,直接询问人类并不具有很好的可扩展性。

对此的通用解决方案是使偏好学习成为一个单独的优化问题,我们在开始强化学习优化之前,尝试找出一个人工奖励模型。

奖励模型训练:Bradley-Terry 目标

所以,我们有两个摘要,我们假设分数是 8.0 和 1.2。我们将在某种数据上进行训练,尝试预测分数,这样我们就有了一个学习到的奖励函数,可以在后续的强化学习中使用。

我们讨论了想要学习这个奖励模型,并且我们有一些摘要,我们希望能够预测它们的分数。那么,我们如何获得这些分数呢?我们需要某种带注释的数据集。

问题是,如果我们直接向人类索要分数,两个不同的人类有着完全不同的校准标准。对于一个摘要,分数 7 对两个不同的人类可能意味着完全不同的事情。因此,没有一个简单的方法来汇总。即使对于同一个人,根据他们午餐吃了什么,他们在不同时间点可能会对同一个摘要给出不同的分数。因此,直接从人类那里获得分数并不容易,如果你直接问他们,效果不会很好,你学到的奖励模型对于训练这样的语言模型不是很有用。

解决这个问题的办法不是实际向他们索要分数,而是实际向他们索要偏好。因此,我们给他们几个摘要,我们只问他们:“嘿,你更喜欢这个摘要还是那个摘要?” 这就是我们应该期望从人类那里收集的带注释数据集类型。

现在更深入地探讨这一点。我们将收集一个形式为(输入 X,获胜摘要 Y_w,失败摘要 Y_l)的数据集 D。我们想要做的是训练一个奖励模型,该模型为获胜摘要分配更高的分数,为失败摘要分配更低的分数。这种称为 Bradley-Terry 目标的优化目标,是一种从这样的偏好数据集中获得与偏好一致的隐式奖励分数的方法。

我们训练的方式是最小化这个对数 sigmoid 和奖励差值的损失。这个目标就是说,奖励模型应确保正确摘要的奖励高于失败摘要的奖励。

问题是它是否无界,或者你是否对此进行归一化?实际出现的问题是(这也是我们将用来开发 DPO 的一个非常重要的观察结果),该目标只要求差值很高。因此,即使你分配 100000 和 100001 的奖励,差值也会很高;或者你分配从 1 到 999 的差值,它也会很高。这里没有真正的缩放控制。因此,通常你必须进行某种后处理归一化,以确保不同的提示获得相同尺度的奖励。否则,优化目标可能会变得有点奇怪。

但这就是 Bradley-Terry 目标,它允许我们从偏好数据集转到我们将在课程中使用的奖励模型。

问题在于,为什么我们使用 sigmoid?并不完全是。你可以设置一些不同的函数。Sigmoid 只是自然地映射到这个样本胜过那个样本的概率。所以,这就是它通常被用作 sigmoid 的原因。但实际上,我们想要鼓励的是奖励模型应该使差值很大。

回到 RL 循环

好的,现在我们回到强化学习循环。我们有什么?我们有某种指令微调模型,比如 P_IFT。我们使用 Bradley-Terry 目标学习了一种奖励模型,它给出一个标量输出。它接受输入 X,给出一个摘要,然后给出一个标量输出 R_phi(x, y)。

现在,这是简单的部分。在某种程度上,我们将在这里进行 RLHF 循环。我们这样做的方式是,我们希望优化期望奖励,我们从这里开始,将我们的 LLM 参数代入 P_theta 的期望中。因此,在给定某个输入 X 的条件下,它将产生某种摘要 Y_hat,而我们的奖励模型将是从偏好中学习到的奖励模型。

在我继续之前,我有一个稍微有点难的问题。

我一开始说奖励函数是不可微的,这就是我们想要进行强化学习的部分原因。但我们刚刚学习了一个奖励模型,并且我们知道我们通常使用神经网络本身来学习奖励模型,它们是非常可微的,我们可以通过它们进行反向传播。那么我们为什么还要进行强化学习呢?

正确答案是,我们输出的是离散的标记。当我们假设我们可以反向传播时,我们实际上无法通过离散的语言标记进行反向传播。所以,即使我们有一个可微的奖励模型,我们生成一些输出,将其插入奖励模型,然后我们想直接回到语言模型的参数。但是我们在中间遇到了这个离散的瓶颈,我们无法将梯度从奖励模型反向传播到语言模型,这就是为什么即使我们这里有一个可微的非黑盒奖励模型,我们仍然不得不求助于强化学习的原因。

假设我们有一个奖励模型 R_phi(x, Y_hat)。假设 Y 是一个连续变量。通常,我们会接受一些输入,生成一些输出,将其插入学习到的奖励模型。如果这里的一切都是连续函数,你可以依靠反向传播来获取梯度并更新模型参数,使得奖励模型分数不断上升。所以你实际上不需要进行强化学习,而不进行强化学习通常非常好,因为采样成本很高。

但问题是,我们的 Y_hat 是离散的标记。它们是从某个底层分布中采样的。一旦你包含了采样操作,就很难进行反向传播(虽然有一些技巧可以做到,但它们不是很稳定)。

是的,所以我不想假设这里的人都知道 Gumbel-Softmax。但不幸的是,Gumbel-Softmax 到目前为止还没有很好地扩展。特别是考虑到语言模型的背景,Y_hat 是一个可能包含数千个标记的句子,每个标记的词汇表大小在数十万标记的数量级。整个句子是 100,000 个标记乘以序列长度的组合空间。Gumbel-Softmax 通常无法扩展到超过一千维左右。

这是一个难题,所以我想提一下,因为你永远不应该假设你需要进行强化学习。

KL 惩罚与奖励黑客

即使我们设定了这个目标,还有一个问题(有人已经暗示过),那就是我们的奖励模型从来都不是完美的。所以我们不想假设它们会为每一个输入和输出给出完美的分数。毕竟,它们只是在某个分布上拟合了人类偏好。

如果你像我们目前描述的那样进行朴素的优化,你会得到“黑客攻击”奖励模型的模型,我们稍后会看到一些相关的图表。

因此,我们添加的另一个东西是 KL 惩罚或 KL 散度。KL 惩罚基本上是说,我们将 beta * log(P_theta / P_pretrain) 添加到奖励中。P_theta 是我们当前正在优化的量,这是当前为标记 Y_hat 分配概率的语言模型。P_pretrain 是我们开始时的模型(可能是指令微调模型),这些是那些模型下的概率。

粗略地说,每当概率分布偏离预训练分布时,我们就会受到惩罚。因此,如果我们偏离预训练模型太多,我们会得到较低的分数。

如果你进行数学推导,这个量正是我们当前正在优化的语言模型与我们开始时的语言模型之间的 KL 散度。

我们这样做的原因是,正如我所说,奖励模型是不完美的。我们知道它在训练过的偏好分布上更准确,我们希望确保模型保持在它开始的地方附近。

RLHF 效果示例

这是 RLHF 早期效果很好的例子之一。这是摘要任务本身,曲线基本上 X 轴是模型大小,Y 轴是摘要相对于某些基线摘要被偏好的频率。如果你看蓝色曲线,这是预训练曲线,随着模型大小的增加,优于基线的摘要比例增加。然后是 SFT 或指令微调,它比预训练模型有所改进。但当你看到 RL 曲线时,这是第一个实际上超过人类撰写摘要的模型。

所以现在我们生成的摘要,即使在小规模下,也比人类摘要更受青睐。这是 RLHF 早期的结果之一,展示了直接优化偏好的力量。

直接偏好优化 🎯

接下来,我们将讨论直接偏好优化。这里会有更多的数学,但非常有趣。

DPO 的动机

我描述的 RLHF 流程,你们中的一些人可能会觉得复杂,有些人可能觉得简单。但在实践中,当我们尝试在非常大的模型上进行时,可能会非常昂贵。假设你正在训练一个 1000 亿参数的模型,甚至是一个万亿参数的模型,你必须对每个答案进行采样,然后查询你的奖励模型,并且根据你使用的强化学习算法,你可能需要计算价值函数和其他东西。

只是为了优化模型,你不必理解这个图,我特意放上来吓唬你们的。在实践中,要正确设置这一切可能相当困难,系统中的参数越多,正确设置的难度就越大。所以 RLHF 可能相当复杂。

因此,当我们研究直接偏好优化时,我们的目标是能否让这一切变得更简单?正如我所说,你有一个初始流程,我们得到一个奖励模型,然后得到一个最终的所有权模型。但如果你看整个过程,我们有一个语言模型,我们正在收集一些偏好,为什么我们不能直接在偏好数据上训练并直接优化参数模型呢?为什么我们必须学习像奖励模型这样的中间量?为什么我们不能直接从偏好出发并优化我们的语言模型?这就是它被称为直接偏好优化的原因:我们找到了一种从偏好出发优化语言模型的方法。我们这样做的方式是,在很高的层面上,我们希望能够用我们的语言模型本身来表示奖励模型。

我们为什么要这样做?因为我们将奖励模型拟合到偏好数据是通过一个相当简单的分类损失(我们讨论过的 Bradley 损失)。如果我们能够将奖励模型和语言模型连接起来,而不是有一个单独的过程,我们可以直接通过损失函数将语言模型参数拟合到损失上。这就是直接偏好优化的高级动机。

DPO 的数学推导

这部分数学会有点紧张,所以我会慢慢讲。

我们讨论了上一节中的带约束的强化学习目标,我们希望最大化期望奖励,并带有一些 KL 惩罚,使得模型不会过多地偏离指令微调模型。这里我们再次要优化的参数是 P_theta,R、P_pretrained 和 RM 是固定的。现在我们只是假设这里有某种奖励模型。

事实证明,这个方程实际上有一个封闭形式的解。如果你只是进行常规的期望奖励最大化,这是不可能的,但一旦你添加了 KL 约束,事实证明你可以写出这个方程的封闭形式解,这真的很酷,因为很少能找到这样的东西。解看起来像这样:这是最优策略 P_star,我们将计算给定 x 条件下 y_hat 的概率。粗略地说,这个最优量表示我们想要……暂时忽略 Z(x)。

我们有一个预训练模型 P_pretrained(y_hat | x)。我们将用指数化的奖励乘以对数概率。简单地说,如果一个句子有更高的奖励,如果一个 y_hat 有更高的奖励,我们将通过 beta 指数化的奖励来提升最优分布下的概率。高奖励,高指数,在最优策略下的更高概率;如果奖励低,它也会被指数奖励降权。

这里的 Z(x) 只是一个归一化因子,确保这个量是一个概率分布。实际上,你只需要关注分子,就是这样。

你必须相信我的话,这是上述方程的最优解。也许我以后可以分享一些关于如何推导这个的内容。

关键观察:连接奖励与策略

现在,关键观察来了:因为我们有上述方程的最优解,我们可以用最优策略本身来重写奖励模型。

下面的方程只是项的重排。奖励模型 R_phi(x, y_hat) 可以写为 beta * log(P_star / P_pretrain) 加上一些 beta * log(Z(x)),这是一个关于 y 的常数。

再次强调,只是为了确保这在直觉上也有意义:如果一个补全 Y_hat 应该得到高分,它在 P_star 下通常也会有很高的概率。而 P_pretrain 是固定的,所以每当奖励模型给出高分时,beta * log(P_star / P_pretrain) 也会很高。类似地,如果奖励模型给 Y_hat 分配了低分,我们的最优策略通常会为 Y_hat 分配较低的概率,beta * log(P_star / P_pretrain) 也会很低。所以这种关系是有道理的,我们现在可以忽略 Z(x)。

这里的主要论点是,这不仅适用于最优策略。你总是可以插入某个奖励模型 P_theta,它将是某种奖励模型的最优策略。这真的是你在这里得到的观察结果。

推导 DPO 目标

之后很简单,鉴于我们到目前为止推导出的关系,我们知道我们如何通过 Bradley 损失来拟合我们的奖励模型,我们希望确保获胜补全的奖励高于失败补全的奖励。

到目前为止,我一直要求你忽略配分函数,这是有原因的。原因是,因为目标只优化奖励之间的差异,配分函数 Z(x) 就抵消了。也许我可以在黑板上写出来。

我们从关系式 R_theta(x, Y_w) = beta * log(P_theta(Y_w | x) / P_pretrain(Y_w | x)) + beta * log(Z(x)) 开始。我们对失败补全 Y_l 也重写同样的东西:R_theta(x, Y_l) = beta * log(P_theta(Y_l | x) / P_pretrain(Y_l | x)) + beta * log(Z(x))。

现在注意,如果我们使用相同的文本进行摘要,那么输入到奖励模型是相同的。所以当我们要做减法时,我们要减去这个和那个,这个 beta * log(Z(x)) 项就会抵消掉。抵消掉这个很重要的原因是 Z(x) 实际上是难以计算的,我们无法真正计算它,所以我们得到了这个关系:奖励模型之间的差异简单地就是 beta * 对数比率之间的差异。

最终的 DPO 目标

很好。那么,采用我们刚刚推导出的这个恒等式,我们简单地将其代入原始的 Bradley 损失,我们得到了一些非常棒的东西:我们将再次拥有一个数据集,包含输入、获胜输出、失败输出,我们将直接针对语言模型参数优化这个目标。

顺便说一下,这是一个分类目标,所以我们不再进行任何强化学习循环,我们直接从偏好数据出发,优化语言模型参数本身。

是的,所以初始时它们是一样的,但梯度只会通过 P_theta 反向传播。P_pretrain 将始终保持不变。它将增加获胜补全的概率,并降低失败补全的概率。

让我们再花点时间看看这个目标。这个目标将尝试鼓励获胜补全的 R_theta 上升,失败补全的 R_theta 下降。提高 R_theta 的方法是提高当前模型下 Y_w 的概率,并降低当前模型下失败补全的概率。

这是一个非常直观的目标,对吧?好的东西上升,坏的东西下降,最后你可以在没有强化学习或任何复杂性的情况下做到这一点。

DPO 的优势与讨论

问题是,我们能否做一些像蒸馏这样的事情,而不是这个?问题是,对于奖励模型,你首先必须以某种方式获得一个奖励模型,对吧?没有简单的方法来获得它,所以你必须收集某种偏好数据才能开始。这就是 DPO 的用武之地:如果你已经收集了偏好数据,你可以直接优化你的语言模型参数,而不是拟合一个显式的奖励模型。

问题是,DPO 是否包含防止偏离预训练模型的惩罚?这是一个好问题。我们的损失函数设置为对数 sigmoid,sigmoid 的一个特性是,当差异已经足够大时,梯度会消失。差异变得足够大的速度比……实际上,beta 参数控制着差异变大的速度。所以,如果你有一个非常高的 beta,即使是很小的差异也会突然使 sigmoid 饱和,并且不会过多地改变参数。

DPO 的主要优势是不是在于你不需要训练一个奖励模型?我会这样说:你正在训练一个奖励模型,因为你使用了相同的目标。DPO 提供了奖励模型与其相应最优策略之间的联系,因此你不必进行显式的强化学习循环来从奖励模型转到其最优策略。我们聪明地将奖励模型参数化为语言模型本身。因此,当你将奖励模型拟合到偏好数据时,你正在优化语言模型本身。

考虑到 DPO 更便宜,我们是否还需要进行 RLHF?我认为这在很大程度上取决于具体情况。我认为 RLHF 仍然有一些持久的好处,因为你可以期望从奖励模型中获得某种泛化,这允许你对可能未在偏好数据中见过的生成进行评分。所以这仍然有一些好处,这取决于你的预算和你想实现的目标。

我得到的问题是,KL 散度,为什么我们依赖 sigmoid,而最初 KL 散度与 sigmoid 无关?更清楚或更精确地说,我认为是 beta 项控制着你被允许偏离的速度。即使在原始的强化学习目标中,这个 beta 项也是控制我们当前模型与预训练模型之间允许的差异的量。所以,如果 beta 真的很高,你根本不允许偏离,因为你会受到更多的惩罚。

是的。所以 beta 控制着这个差异的强度或权重。

这是一个好问题。所以现在涉及两种采样:首先,我们想要创建一个人类标记其偏好的偏好数据集;然后,在强化学习优化本身期间,我们想要采样以在某种外部或显式奖励模型下获得分数,然后我们评分然后优化。我们正在处理第二个采样步骤,但第一个采样步骤仍然需要。

这是一个好问题。当你进行在线强化学习或某种强化学习程序时,你不仅需要提示,你还需要一个偏好数据集。因此,通常在强化学习期间使用的提示集比在偏好阅读期间使用的提示集更大。

这是一个很好的问题。我认为这个问题基本上是在问,我们是否可以考虑到偏好的强度,而不仅仅是二元标签。我认为这是 RLHF 和 DPO 的一个限制,我们应该给出更多的见解。通常,当我们收集偏好数据集时,我们会要求注释者给出他们的偏好强度,并且我们只保留那些强烈的偏好。但这仍然是一个未解决的问题,如何从噪声数据和低强度或高强度偏好中学习,仍然是一个尚未解决的问题。

DPO 效果

是的,这些是直接偏好优化的一些结果。我们展示了执行 DPO 目标与执行 KL 约束强化学习程序之间的理论等价性。在实践中,当我们尝试查看摘要任务并尝试像之前那样测量胜率时,我们确实发现它表现相似或更好,但这是一个有争议的问题。总的来说,它表现得相当好。

这里的 beta 参数正好对应于原始强化学习目标中的 beta 参数,那是额外的超参数。

总结与展望 🚀

现在,我将总结一下我们到目前为止所学的内容,然后我们将继续讨论缺失的地方等等。

核心要点回顾

我们希望优化人类偏好,因为首先,它更符合我们想要的目标。我们使用这些模型的方式更接近于提高人类参与度或满足人类偏好,因此我们也希望直接为此进行优化。并且,我们不依赖不同注释者未校准的分数,而是尝试收集偏好,然后通过 DPO 或 RLHF 学习某种形式的奖励模型,并通过它改进模型。

在 RLHF 中,我们学习一个显式的奖励模型,它为我们采样的每个补全给出一个明确的分数,我们用它来优化语言模型参数。我们通常施加某种 KL 约束,以确保我们的模型不会过多地偏离其初始化的地方。

它非常有效,有时甚至比 DPO 更有效,但由于需要采样,可能有点棘手,而且计算成本高昂。

在直接偏好优化中,我们可以完全跳过采样部分,通过将其视为二元分类问题,直接在偏好数据上进行优化。它非常简单有效,并且不需要在线步骤。

当前应用与挑战

这一切将我们引向何方?我们已经讨论了所有的 RLHF 和 DPO 内容。顺便说一下,聊天机器人大致就是这样构建的。这是 Instruct GPT 流程,这是最早向公众开放并与之互动的聊天机器人之一,它运行得相当好,可以完成很多任务,回答通用问题。

这是预训练模型给出的答案与指令微调或 RLHF 模型给出的答案之间的比较。是的,这些是一些例子。是的,我们可以为对话优化这些模型,不仅仅是摘要。我想说,我们可以为许多通用任务优化它们。你收集的数据越多,覆盖的任务越多,这些模型的表现就越好,它们对意图的理解就越好,它们响应我们所有需求的能力就越强。

是的,自推出以来,DPO 在开源社区中被大量使用。它相当便宜,性能相当好,并且在某个时候,所有的大型语言模型都使用 DPO 来获得与人类反馈的对齐。如果你听说过 Llama 和 Mistral,它们也使用 DPO 进行后训练。

我认为这是一个有趣的例子。这是一个好问题:指令微调模型和 RLHF 模型之间有什么区别?一个明显的风格差异是,它们倾向于给出更详细的答案、格式更好的答案,并且它们倾向于更符合人类认为更容易阅读的文本类型。这里的问题是:“人们最常见的五种压力来源是什么?”如果你只用很少的数据进行指令微调,你会得到一个好的答案:“人们最常见的五种压力来源是工作、金钱、人际关系、健康和家庭。”但然后你进行某种 PPO 程序,你会得到一个更清晰、更长的答案,带有格式良好的列表。这些都是涌现的特性,这是模型发现人类喜欢和偏好的东西,这就是为什么它们倾向于生成那种形式的答案。

未解决的问题与未来方向

我喜欢这个问题,我基本上在最后有一张关于这个的幻灯片,但是的,问题是:我们能信任人们的反馈吗?如果人们不知道自己想要什么,我们该怎么办?这又是一个非常困难的边界问题。我认为发生的情况是,短期激励和长期激励之间存在不匹配。有些行为在短期内看起来不错,人们根据短期激励给出反馈,但有时这些行为在长期内是非常不可取的,这确实是 RLHF 流程中难以解决的难题。

这是一个好问题。问题是:我们是否对两个或多个答案进行排名?我们是在 NC2 对上训练吗?是的,我认为为了效率,人们通常对多个答案进行排名,这样你可以从中获得更多的学习数据,因为你得到了 NC2 对偏好对。但也有一个叫做 Plackett-Luce 系列的损失函数,它是 Bradley-Terry 的推广,允许你直接在排名补全上训练,而不仅仅是偏好对。所以你可以做其中任何一种,它们可能都工作得很好。

这是一个非常好的问题。我认为我们的公司被激励去给予与人类偏好不一致的参与度偏好。这远远超出了本讲座的范围,我不知道我能对此说些什么,但我们可以回顾历史。所以这并不是一个只针对大型语言模型的问题。例如,YouTube 在推荐系统方面遇到了很多问题,人们使用 YouTube 的时间比他们想要的要多得多。所以在某些方面,这是一个更广泛的问题,关于技术应该如何与人们和社会互动。但如果我简要回忆那起事件,实际上 YouTube 的动机是确保消费者有长期健康的参与度。这意味着,如果他们一天花 20 个小时在 YouTube 上,这对产品可能也不好,所以他们可能想确保他们不会花太多时间。所以,如果你优化长期参与度,这应该理想地解决我们看到的 GPT-4 的谄媚行为,因为那是更短期的行为。

奖励黑客与模型对齐

是的,这基本上是我们讨论的全部内容,我只是想提出几个问题,因为这是一个非常快速发展的主题,它正在影响我们现在的生活,当我们决定如何与聊天机器人交互时。

对于可能不熟悉这一事件的人来说,GPT-4 由于一次模型更新而变得相当谄媚,突然之间,它以一种所有人都认为不健康的方式认可用户的所有好主意和坏主意。我不在 OpenAI 工作,不作任何评论,但这些问题非常真实,我们仍在试图理解我们的反馈数据如何影响最终模型的涌现行为,这也会影响我们使用产品的方式。

是的,课堂上提出了很多很好的问题,这些都是人们正在研究的活跃问题,我们不一定有所有问题的答案,所以你们应该去更多地研究它。

我想谈到的当前范式的另一个主要限制是奖励黑客现象,这也涉及到错位问题。当我们基于这些学习到的奖励模型进行训练时,它们确实在某种程度上与人类偏好保持一致,但随着你不断地针对它们进行训练,它们往往会开始偏离我们真正想要的东西。这是强化学习中一个非常常见的问题,当你使用代理奖励而不是你真正关心的真实奖励时,这对于机器学习来说也是普遍存在的。

是的,这影响了我们扩展强化学习的能力,因为如果你开始黑客攻击,你必须在某个时候停止训练,这是一个人们正在努力解决的活跃优化问题。

领域演进与个性化

我认为这个领域正在快速发展。它超越了……人们正在转向更多基于规则的东西,我们在几个不同的方面对它们进行评分。但是的,你通常确实希望收集许多不同类型的数据来教导模型我们希望灌输什么样的行为,以及以正确的方式响应某些情况。很难覆盖聊天机器人可能遇到的每一种情况,因此我们依靠模型从我们教授的数据中进行泛化。但这些事情经常出问题,这些模型会以我们无法预料的方式出现某些意外行为。

是的,我已经稍微谈到了这一点,但这是一个快速发展的领域,还有很多方面需要改进。偏好数据仍然昂贵,并且正如我们可能讨论过的,它不一定代表我们想要的模型行为类型。因此,我们正在寻找更好的方法来改进反馈。

我认为你会听到更多关于推理领域非常酷的发展,模型从可验证的奖励中生成自己的输出并接受评分,这也是我们在后训练和推理中研究的最酷的主题之一。

我个人觉得非常有趣的是,语言模型与人类的总体偏好保持一致。但我们是一对一地互动,我们不是与整个互联网互动。所以我们最终确实希望确保模型与我们的需求保持一致,而不仅仅是每个人的需求。因此,个性化语言模型并获取更多关于我们和我们的偏好的上下文输入,也是一个相当不错的发展领域。

是的,我们谈到了幻觉和不受控制的涌现行为,这些都是我们正在研究的活跃问题。


本节课中,我们一起学习了如何利用强化学习技术,特别是基于人类反馈的强化学习和直接偏好优化,将预训练的大型语言模型转化为更符合人类期望和偏好的智能助手。我们探讨了从指令微调到偏好学习的演进,理解了 RLHF 和 DPO 的核心原理、数学推导及其优缺点,并认识到当前方法在奖励黑客、偏好数据质量、长期对齐等方面面临的挑战。这是一个快速发展的领域,对于构建安全、可靠且有用的 AI 助手至关重要。

010:大语言模型推理的强化学习

概述

在本节课中,我们将探讨如何将强化学习技术应用于大语言模型的推理任务。我们将从传统的监督训练方法出发,分析其局限性,并逐步介绍如何利用模仿学习、离线强化学习和在线强化学习来提升模型在数学问题求解等复杂推理任务上的性能。课程内容将分为两部分:首先介绍2025年初之前的经典方法,然后讨论这些方法如何被扩展以训练当前流行的“思维链”模型。

从监督训练到强化学习

上一节我们介绍了课程的整体目标,本节中我们来看看传统的大语言模型训练范式。

传统训练范式:下一个词预测

通常,当我们训练语言模型或基础模型时,商业范式是进行下一个词预测。这意味着我们将数据标记化为一系列输入词元,并使用负对数似然损失来训练模型,以预测序列中出现的下一个词元。

在推理任务的背景下,这意味着我们将问题标记化为一系列词元,将来自参考解答的答案也标记化,然后训练模型在给定输入问题序列的条件下预测这个答案序列。

监督训练的局限性

为了开始理解强化学习在此的重要性,我们首先需要问:为什么这种形式的下一个词预测实际上有效?

一个我特别喜欢的视角是观察以下公式,它告诉你下一个词预测在一般情况下效果如何。这个公式表明,如果我们训练一个模型 P_θ,将输入 x(如问题)映射到输出 y(如答案),那么学到的模型只会以某种误差来近似真实的基础模型或真实解。这个误差取决于用于训练的数据量。

如果你有大量数据,展示了非常多的问题和答案,那么这个误差会很小,你将近似一个解决这些问题能力很强的专家。但在现实中,对于许多推理问题和其他领域,你通常没有足够的数据来使这个误差界限足够小,因此最终学到的模型无法通过下一个词预测来达到人类水平的能力。

实际上,有很多工作研究了数据量的问题。其中一个有趣的发现是,如果你仅仅从互联网上获取高质量难题解答并用于监督训练(下一个词预测),效果并不会很好。据估计,到2028年,这类高质量数据将会耗尽,而显然,模型目前还远未达到可以替代人类研究人员的水平。

这种情况也发生在机器人学和具身智能等领域,这些领域的数据同样有限。这意味着,如果仅仅依赖下一个词预测,你将无法在模型中达到真实专家级的能力。

监督训练的问题实例

为了给你一个具体的例子,如果你只在当前数据上训练模型,并让它们解决来自IMO21的一个非常有趣的问题,这个问题可能存在于某些模型的训练集中,但如果你要求GPT或OpenAI系列模型来解决它,它们会给出一个看起来非常合理的解答。这些解答看起来很像人类专家会写出的答案,但它们最终会遗漏答案背后的逻辑。

在这个具体问题中,你需要证明幻灯片上显示的不等式。你不能真的去逐个查看表达式的各项,而需要将整个求和视为一个整体来思考。然而,模型(例如来自O系列模型O1的解答)开始查看各个项,最终断言了一个答案,但实际上并没有意识到它犯了错误,也没有进行纠正。

因此,当我们在思考推理时,当前监督训练范式最终产生的结果是:它们会产生一个看起来非常像你在考试中可能写出的合法解答,只是这个解答最终是错误的,其逻辑内容并不完全正确。

而这正是强化学习试图解决的问题。我希望今天能向你展示一些强化学习技术如何在此情境下发挥作用。

强化学习用于推理:概览

在今天的讲座中,我们将讨论用于推理的强化学习。我大致将其分为两部分。

划分依据:时间线

这种划分是基于时间线的。一部分是在DeepSeek R1这类模型发布之前出现的技术(大约2025年初之前)。另一部分是在这些模型发布后,在社区中变得更加突出的技术。

DeepSeek R1是中国公司深度求索发布的一个模型,它非常擅长解决许多竞赛数学问题或编程问题。它与OpenAI的O系列模型、Gemini的思维模型或Claude Sonnet的思维版本等模型属于同一家族。

讲座结构

  1. 第一部分:经典技术:我将讨论基于模仿学习、离线强化学习和在线强化学习的技术。这是我对这个领域的大致分类,虽然可能遗漏了一些文献,但这是一个合理的思考框架。
  2. 第二部分:现代扩展:讨论如何将2025年初之前人们构建的这些技术,应用于训练当前表现惊人的思维模型。当你从第一部分过渡到第二部分时,一些非常有趣的事情需要改变。

问题形式化:将推理建模为马尔可夫决策过程

好的,我想我已经谈到了问题设置,但让我快速深入一点细节,并联系回我们的强化学习术语。

我们将考虑推理任务。如前所述,你会得到一个自然语言描述的问题,并提供一个自然语言的解答。

当我们从强化学习研究者的视角来思考这个问题时,我们可以将整个问题解决过程视为一个马尔可夫决策过程。

定义MDP

为了实现这一点,我们可以将问题中的词元串(或词串)视为MDP的初始状态。这是你的智能体或策略在开始与世界交互时的起始状态。

你可以将模型产生的解答分解为一系列步骤,这些步骤可以对应于动作。例如,你可以认为有一个模型,它以初始状态(问题)作为输入,一个接一个地采取一系列动作(这些步骤),最终得到一个特定的答案。在这个具体设置中,答案由你看到的方框中的内容表示,答案是8。如果答案正确,你将用稀疏奖励+1来奖励模型;如果答案不正确,则奖励为0。

因此,这里的真实马尔可夫决策过程是:从状态开始,经过一系列动作,最终到达一个终止点,模型在此产生答案,并根据该答案是否正确获得奖励。

MDP的细节

用强化学习术语来说,这很像一个具有确定性动态的稀疏奖励MDP。我的意思是,在产生这些步骤的整个过程中,没有外部环境给你下一个状态。你看到的只是初始状态和这些一个接一个的动作,它们告诉你问题的下一个状态。

让我在黑板上画一下:这是你的初始状态 S0。你的模型采取一个动作 a0(问题的第一步),到达状态 S1S1 不过是 S0a0 拼接在一起的词元串。然后它产生下一个状态,采取下一个步骤 a1(下一个动作),到达 S2,而你的下一个状态 S2 只是 S0a0a1 拼接在一起,直到你得到最终答案。你多次执行此操作,得到最终答案(比如8),然后根据8是否等于真实答案获得奖励 R(8, ground_truth)。这要么是+1,要么是0。这就是你操作的MDP。

关于动作空间:这里的动作可能是无限的。与连续控制不同(你有一个固定维度的连续值向量,它也是无限的),这里你有一个可变长度的离散词元串,但数量可能非常多。

关于答案为证明而非数值的问题:这是一个非常好的问题。我认为我们作为一个社区还没有为这类问题找到正确的技术集合。这就是为什么我们从有确定性最终答案的竞赛问题开始。所以我们现在假设我们有一个确定性的最终答案用于学习。

关于得到正确答案但步骤次优的风险:确实存在这种风险,我实际上会在本讲座中讨论这个问题。

这就是一个基本的推理MDP或语言MDP,你可以在这种特定设置下用它来研究推理问题,至少是我在本讲座中将要坚持使用的框架。

经典强化学习方法用于推理

我们将从研究一些用于推理的经典强化学习方法开始。在这里,我将介绍我来自NeurIPS 2024的一篇论文(幻灯片上的第一个要点)。我介绍这篇论文并不是因为它发明了很多技术,而是因为它对许多现有方法进行了大量有趣的实证分析,以理解某些方法为何有效,某些为何失败。因此,这至少在我看来,是一种很好的方式来获得关于经典推理领域中所有强化学习技术的概念模型。

我们将要做的是,尝试理解当我们在不同数量的数据上训练它们时,不同的强化学习方法或用于推理的训练方法表现如何。我们将在讲座的这一部分进行所谓的“数据缩放分析”。

基本设置

基本设置如下:我将构建可用于在数据集上训练推理模型的算法。这个数据集将包含一些“问题”(即我之前描述的初始状态),并且我们假设可以访问一些“参考解答”,因为我们需要一种方法来检查真实答案,这定义了奖励函数。我们有一个用于训练的问题和解答对的数据集。我们将尝试通过评估在不同数量的问题和解答对上训练时这些方法的表现,来理解不同类别的方法。

三个训练维度

当我们思考在这个数据上训练这些方法时,我们将从三个维度来看。

  1. 监督微调:我们可以在多个问题的真实答案上训练模型。我们可以获取这个问题和解答的数据集,并训练模型在给定问题时产生解答,就像监督微调或模仿学习所做的那样。我们可以在这些数据上直接进行模仿学习。
  2. 拒绝微调:我们将引入一种称为“拒绝微调”的新方法,它在给定答案的多个正确解答上进行训练。
  3. 强化学习:第三个维度是完整的强化学习,在强化学习中,当我们训练数据时,我们并不真正需要数据是高质量的或高奖励的。你可以从次优的、不成功的数据中学习。因此,你也可以将所有这些方法中的第三个维度视为那些使用不正确解答或从未成功的轨迹(获得0奖励的轨迹)中学习的方法。

以下是这三个不同维度的详细说明,你可以沿着这些维度扩展数据:监督微调(问题和解答数量)、通过过滤或拒绝进行训练(称为拒绝微调或RFT,问题和正确解答数量),以及在任何类型的数据上训练(即强化学习)。

在本讲座中,我们将讨论这些不同方法在实际中如何表现,这将让我们了解在什么情况下使用什么方法。

拒绝微调详解

让我在这里写出这种方法,这样会更清楚。

你要做的是:取一个模型 π(y|x)。从我的数据中取一个问题 x(这是我的问题或初始状态)。这是我的解答,由一系列动作组成。

现在我要做的是:取这些问题,并从我想训练的当前模型中,采样给定问题条件下的多个解答。我有一个模型 π_θ,我将采样给定问题条件下的多个解答轨迹。

现在我要做的是:取这些轨迹,评估每条轨迹的奖励。我可以评估 R(y1), R(y2)... 直到 R(yn)。我为什么可以这样做?因为我的数据集中有这个问题,这意味着我也有这个问题的真实答案 y*。我可以简单地检查从我的策略 π_θ 中采样的多条轨迹或多条轨迹是否最终得到了正确的答案,通过检查最终数字是否正确。

我在这里做的是:取我的初始模型,采样一堆轨迹(或者说,在我的环境中进行 rollout),这只是从该模型为每个问题产生解答,并根据真实答案评估奖励。

现在,我取这组产生的 y1yn,只保留那些最终得到正确答案的。我取集合 S = {y1, ..., yn},然后过滤它,得到过滤后的集合 ,它由满足奖励为1的 y_j 组成,意味着这些解答最终得到了正确答案。

这个过程对大家来说清楚吗?

现在,我有一堆最终得到正确答案的轨迹,这意味着它们是成功的。所以,我可以简单地尝试训练我的模型 π_θ 来模仿这些轨迹。我可以训练 π_θ 来模仿

让我再写一遍。我的算法如下:

  1. 采样:从 π_θ(·|x) 中采样 y1yn
  2. 过滤:生成 ,仅包含正确的 y(即奖励为1的 y)。
  3. 模仿:在 上进行模仿学习或行为克隆(或监督微调,随你喜欢怎么称呼)。你现在训练模型 π_θ 只产生那些正确的 y

这种方法被称为“拒绝微调”或 RFT。这就是你在水平轴上看到它的原因,你现在要做的是产生多个解答,尝试过滤出正确的,然后再次训练它们。

这种方法的一个优点是,它实际上并不要求你提供人类编写的参考解答。它只要求你的模型能够产生最终正确的解答。这些是从你的策略中采样的同策略 rollout,你只是根据正确性进行过滤,因为你知道奖励函数是什么。

第三个维度实际上是完整的强化学习,在强化学习中,当我们训练数据时,我们并不真正需要数据是高质量的或高奖励的。你已经讨论过离线强化学习(这是你的作业),你可以从次优的、不成功的数据中学习。因此,你也可以将所有这些方法中的第三个维度视为那些使用不正确解答或从未成功的轨迹中学习的方法。

关于是否强制模型产生过于冗长的答案:简短的回答是否定的,因为我们在这里根本没有鼓励冗长。我们所做的只是从一个模型中采样多条轨迹,并训练模型紧密模仿那些以某种方式最终成功的轨迹。如果最终成功的轨迹是那些实际上需要更多空间来变得冗长的轨迹,那么它会激励你变得冗长;但如果最终成功的轨迹不是那些需要变得冗长的,那么它就不会激励。想象一下,问题是“2+2=?”。也许有一条轨迹直接得到了答案4,而有些轨迹会以10种不同的方式计算2+2,但大多数轨迹直接得到4。那么,在这个过程中,你将找到直接得到4的轨迹,并训练模型直接产生4。所以这不会发生。

关于如果方法以错误的方式得到了正确答案,是否会激励模型学习错误方式:答案是肯定的。这就是为什么我们将在实证结果中看到这些情况的表现。这实际上是讲座的下一部分。

关于数据集是否偏向简单问题:简短的回答是,在某种程度上是的。但这个问题的实际答案是:在这些情况下,你通常首先会在参考问答对数据上用监督微调训练模型(第一个维度),使其具备一定的能力来为这些问题产生一些答案,然后在其基础上进行拒绝微调。

监督微调与拒绝微调的表现分析

好的,这实际上是一张花了我很长时间的幻灯片。但从这里开始,很多幻灯片实际上都在讨论这些方法的特性。

监督微调的表现

我们要看的第一件事是监督微调的表现。即,在人类编写的给定问题的正确答案上训练你的模型。

当我们做这项工作时,我们研究了两个基准:GSM8K 和 MATH。这些基准现在已经被完全解决了,所以继续在这些基准上评估方法没有意义,但在2024年(正好一年前),这些基准非常具有代表性。我们在这张幻灯片中尝试做的是,试图观察监督微调的表现,并将其与拒绝微调进行比较。

我们在多个模型上进行比较,这里我向你展示的是在 DeepSeek V2 模型上的一个结果,这是当时最好的数学模型之一。我在这里绘制的是这些模型在使用这些监督微调和拒绝微调方法进行微调后的平均测试误差,作为我们运行微调所用数据量的函数。

数据越多,理想情况下误差应该越低,你应该能够获得更高的准确率。这确实发生了,你发现随着问题数量的增加,误差在这两种设置下都会下降。但显然,误差下降的速度并不快。这意味着,如果你试图近似最接近这条曲线的函数,它看起来像是 d^{-0.15}d^{-0.05}。你看到的这些曲线是经验测量值,但如果我尝试根据数据集大小拟合一条平滑曲线,指数将是一个非常小的数字。

理想情况下,你希望这个指数非常大,比如 d^{-0.5},因为这条曲线会下降得非常快,用合理数量的数据,你就能在这个特定数据集上成功解决特定问题,但这种情况并没有发生。

因此,许多推理方法和用于推理的强化学习方法的目标之一,就是尽可能地将这条曲线向左推、向x轴推,即向下和向左推。

我们看到的第一个结果是,拒绝微调(在你自己的正确解答上训练)实际上能带来更好的测试误差。你发现,与监督微调相比,用拒绝微调可以在这些基准上获得相同的测试误差,而所需的人类编写解答的问题数量是监督微调的一半。

这告诉你的高层次信息是:与单独的监督微调(或离策略监督微调,或单独的模仿学习)相比,同策略模仿学习(从你的策略中采样并模仿正确答案)在这种特定设置下可以高效2倍。

拒绝微调的局限性

但事实证明,如果你只是不断地这样做,它不会给你带来最好的策略或模型。我的意思是,如果你只是扩大同策略数据上的监督微调规模(即增加你在这里看到的 n 值,采样大量解答,挑选正确的,然后对它们全部进行行为克隆),结果证明这个配方实际上并不奏效。

同策略模仿学习如果做得太多,最终会损害泛化能力。为了展示这个结果,我将在这里展示一张图。

这张图显示了测试性能(与之前相同的图),但现在x轴是每个问题在过滤集中得到的正确答案数量。你可以根据需要扩大规模。x轴显示的是 的大小乘以一个常数因子,我们绘制了由此训练出的拒绝微调模型的性能。

这里需要注意的有趣之处是:最初,你的误差会下降。随着你生成越来越多这些正确的解答轨迹,你的误差最初会下降,但超过某个点后,你的误差开始上升。你发现,超过某个点后,你会遇到收益递减,你无法简单地生成更多来自你策略的解答、模仿它们并获得更好的性能。事实上,在某些数据集上,误差甚至上升了。

关于x轴是什么:x轴是 的大小,即每个问题保留的正确解答数量。图中是 S̃ * 8k,因为你在这里看到的提示数量,但这只是一个常数乘子,对于图中的所有点都是相同的。

关于缩放 时是否去重:答案是肯定的。当你做这个过程时,你经常会去重 。有很多机制可以做到这一点。人们可以做基于编辑距离的拒绝。人们常用的一个方法是采样超过 n 个(比如 2n 个),然后保留其中看起来最多样化的 n 个。是的,你会这样做。

这告诉我们的高层次信息是:在有限数量的初始状态上拟合自生成数据实际上会损害模型的泛化能力。回想一下我之前画的那张图(我已经擦掉了),那里有一个 S0,你的模型采取 a0 到达 S1。你可以把这看作是在一组 S0 上训练,并在一个新的测试问题集上评估。事实证明,如果你以这种方式在特定的 S0 集合上训练太多,你最终会遇到该设置中的泛化问题。

虚假步骤与优势函数

那么,为什么会发生这种情况?这是我将要讨论的图景,我会将其与我们目前在模仿学习中已知的一些有趣概念联系起来,即“虚假步骤”的图景。

我们将暂时远离例子,看看图片。我们将把这些图片绘制成我之前描述的MDP中的小轨迹:提示作为初始状态,你一步一步地产生这些步骤,它们带你进入下一个状态,最终你到达答案。

事实证明,当你从自己的模型中大量采样并进行同策略训练时(即从你的策略中采样并训练),你经常会发现其中一些轨迹包含本质上是虚假的步骤。这些步骤实际上是不正确的,但它们只是以某种方式不影响模型的生成。我将展示一个例子,但基本上,这些步骤会带你进入一个你可能做了错误计算的区域,也许在这个特定的轨迹上,当你从模型中采样时,你最终从这些轨迹中恢复过来,所以你最终得到了正确答案,但实际上这些轨迹是有害的。

举个例子,假设这是GSM8K数据集中的一个简单算术问题。我们发现的一个最突出的例子是:模型的一个解答做了一些计算,然后说需要的总金额是100乘以2等于200,然后在下一行它反转了计算。真正的计算是100除以2,但它最终说了200,然后马上又做了200除以2。

所以,中间存在的这个做200的步骤是一个虚假步骤。这是一个不需要存在的错误步骤,你在这个特定的 rollout 中仍然得到了正确答案,但这个步骤实际上不应该存在。

关于步骤是否总是一个句子:目前,你可以想象它在这种特定设置中总是一个句子。没有普遍认同的定义。在讲座的第二部分,我将向你展示一些例子,其中步骤根本不是句子,而是一整块东西。

关于这是否是误差增加的主要原因,以及是否可以某种方式测量它:事实证明,对两者的回答都是肯定的。这是误差增加的主要原因之一。你能以某种方式测量它吗?至少,拟合数据的常规概念不会告诉你这一点。

关于我们如何通过实验发现每一步的问题:我们以一种特定的方式来做,这也决定了我接下来要展示的许多方法。

关于是否采样整个轨迹:这种特定方法采样整个轨迹。如果你想,你可以采样部分轨迹,但我认为这需要一些高级机制,这些机制可以基于我下一张幻灯片要讲的内容来完成。

关于是否过度拟合了以某种方式得到正确答案的特定类别方法:从高层次上讲,答案是肯定的,但需要注意的是我不知道如何定义“方法”是什么。只看这个例子,有人可能会说计算100乘以2是一种方法现象,模型需要通过它才能成功,然后意识到那是错误的。你也可以说,这里的方法只不过是做一堆算术。这真的取决于你如何定义它。我认为在这一点上这是一个语义问题。但从一个非常符号化的角度来看,可以说有一组词元可能仍然让你在训练集上得到正确答案,但实际上可能无助于你在测试问题上做正确的事情。

与模仿学习中的因果混淆问题相似

这与模仿学习中的“因果混淆”问题非常相似。基本上,如果你在你的策略中产生了一堆可能不好的东西(比如这些虚假步骤),你可能无法以正确的方式学习模仿专家。也许你实际上得到了正确答案,但你正在学习这些不正确的关联。这基本上是模仿学习中人们熟知的因果混淆问题的要点。

强化学习如何解决此问题

那么,我们如何解决这个问题?这就是强化学习发挥作用的地方。这也是使用不正确数据或不正确 rollout 进行学习的第三个维度。

简单的想法是:正如你们许多人已经问过的,给一个步骤分配某种信用概念。如果我能理解我的策略生成的每个步骤或每个状态的效用,那么我就可以以某种方式利用这个概念来过滤掉这些不良的解答。

这正是用于推理的强化学习在高层次上试图做的事情:以某种方式识别这些早期步骤并消除它们。

利用优势函数识别虚假步骤

做到这一点的方法如下,这联系到你们许多人可能熟悉的价值函数和优势函数的许多概念。我将从一个图示开始,然后写下这到底意味着什么数学。

假设我给你一个特定的 rollout 或轨迹:从提示开始,添加这些步骤或动作,最终得到一个答案,这个答案可能是不正确的(在图中显示为红点)。

我现在可以做的是:尝试通过获取这些特定的前缀(即到目前为止连接的所有词元构成的状态)来识别一个步骤是否是虚假的,并以某种方式进行 rollout。

我可以要求某个模型尝试在给定生成的解答的某个前缀的情况下完成解答。例如,在这种特定设置中,我保持前三个步骤相同,并要求一个单独的模型或单独的 rollout 策略尝试在给定这个特定前缀的情况下完成解答。

如果我这样做,并且假设 rollout 成功了(即许多这些 rollout 最终得到了正确答案),那么很可能此前缀并不太糟糕,因为对于这个特定的 rollout 策略来说,它并没有影响其任何解决问题的能力。

另一方面,假设我最终在给定你在这里看到的前缀条件下得到了一个完全错误的答案,显然这里有问题,你在这里看到的前缀有问题,因为你的 rollout 策略在给定该前缀的条件下根本无法成功,即使尝试了许多可能的 rollout。

如果我有时成功有时不成功,也许仍然有些问题,但至少比你总是失败要好一些。

这个进行 rollout 并估计未来某种预期成功概率的基本原则,可以告诉你当前操作的前缀有什么问题。

这也非常类似于一个价值函数,因为这基本上是在计算我的 rollout 策略(这个橙色策略)在这个特定MDP中行动时获得的预期未来0/1奖励。

关于上一张幻灯片上的虚假步骤是否实际上无关紧要或不正确:步骤本身并不一定是错误的,但在某种程度上是无关紧要的。想象一下,如果你向一个语言模型传递一百万个无关紧要的词元,并要求它挖掘出真正重要的信息,这在测试集上可能是一个具有挑战性的问题。因此,即使一个步骤是无关紧要的,它也可能成为模型的问题。

将 rollout 估计形式化为 Q 函数

好的,我们做了这些 rollout。我们计算了预期成功次数,这类似于某种价值函数。为什么它是价值函数?因为如果你用一点数学写下来,假设我定义问题或初始状态为 x,每个步骤为 y1yn(这里有点符号不匹配,我展示的 y 基本上是你采取的每个步骤或每个动作)。

如果你写下看起来像以下这样的量,它基本上就是一个 Q 函数。这个量告诉你你的特定 rollout 策略 π' 的 Q 值,在给定状态(由初始状态和到目前为止的解答前缀给出)和给定动作(即你的策略添加的当前步骤)的情况下。

我可以将这里的 Q 值定义为预期长期奖励,即如果我从执行动作 a_i 开始,然后从该 rollout 策略中获取动作 a_{i+1}a_L,那么在我的 rollout 策略下获得的预期0/1奖励。

Q 函数的定义是:Q_π(s, a) 基本上是从 S0 = sa0 = a 开始,在策略 π 下的预期折扣奖励总和。在这个特定设置中,我们假设折扣因子为1(γ = 1),并且奖励只在终止时获得,所以在此之前你得到的都是0。因此,你在这里只看到一个期望值,这个期望值是在策略 π 下计算的。你从那里开始 rollout 这个策略 π。这里有一个小细节:你通常有 R(s, a) 加上后面的东西,因为你从下一步开始 rollout 策略,并在当前状态求和奖励。在这种情况下,这并不重要,因为 R(s) 等于0,你只在最后获得奖励。

因此,你在这里看到的东西本质上是从给定前缀(状态)和给定步骤(动作)开始的预期未来奖励,并且 rollout 是在你在这里看到的策略 π' 下执行的。

关于是否使用相同的策略来 rollout 其他轨迹:原则上,我写的这个方程与使用哪个策略进行 rollout 无关。大多数情况下,我认为用于 rollout 的策略应该与当前策略不同,否则它可能以同样的方式失败。但文献中有一些工作认为,即使使用相同的策略也可能足够好。考虑到实验的规模,我认为我们还没有看到一个苹果对苹果的比较,明确显示一种方式或另一种方式更好。我认为现有的大部分证据都指向拥有不同策略的好处,因为这也有道理。但我认为社区的一部分,尤其是NLP社区,使用相同的策略并发现它工作得相当好。

关于这是否类似于轨迹缝合和优势权重:事实证明,答案完全是肯定的,这与那非常相关。我认为我的幻灯片中没有讨论这个缝合角度,因为我认为这有点太技术性了。但如果你查看论文,你会发现它确实谈到了在这种特定设置中的缝合,这是非常相关的概念。所以,可以这样想。

定义优势函数

好的,很好。所以这是 Q 函数的定义。一旦你定义了这个 Q 函数,你就可以用它来告诉你步骤是否是虚假的或好坏的,就像定义优势函数那样。我敢肯定你们讨论过优势加权回归作为一种离线强化学习方法。我将做一些非常类似的事情,但只是花一分钟谈谈这里优势的定义。

优势函数通常意味着 Q(s, a) - V(s)。不过在这种特定设置中,动态是确定性的,状态只是先前状态与定义所添加步骤的新词元集的拼接。因此,优势可以定义为步骤 i 的前缀的 Q 值减去步骤 i-1 的前缀的 Q 值。

这在这种特定MDP中充当了相同的优势概念。这就是为什么你在那里看到的定义是 Q - Q 而不是 Q - V,但这基本上是同一回事。

利用优势识别步骤质量

一旦你以这种方式定义它,你就可以为每个步骤计算这些优势。你可以通过从彼此减去连续步骤的 Q 值来计算优势,在这种特定设置中,你会得到一些正数和负数。

这真的取决于你能成功多少次。一旦你有了这些优势,它们就是衡量特定步骤对你从该前缀最终成功的能力贡献了多少的度量。如果步骤2最终降低了优势,这意味着步骤1之后的 Q 值高于执行步骤2之后的 Q 值,这意味着步骤2可能不是一个有用的步骤,不利于最终成功。

因此,负的或低的优势意味着它是一个糟糕的步骤或某种虚假步骤,你不想从中学习。正的优势意味着它是一个好的步骤,你可能想从中学习一些东西。

这应该回答了关于如何以某种方式识别虚假步骤的问题。

关于我们是否在拟合一个 Q 函数:这是一个非常好的问题。事实证明,在文献中有两类工作:一类明确地拟合一个类似 Q 函数的东西(在NLP社区中,这被称为“过程奖励模型”)。过程奖励模型,因为既然你们已经涵盖了DPO和强化学习,如果你们讨论过为特定问答提供分数的奖励模型,那么这就是为每一步提供分数,因此奖励过程,故称过程奖励模型或PRM。我不一定认为PRM和Q值在语义上完全相同,但很多NLP人士都这么称呼它。但你可以训练它。还有另一类方法,它们只是使用我跟你谈到的 rollout 方式来估计优势,我们将看到这意味着什么。

关于这如何帮助模型学习通用问题解决策略:粗略的答案是,最终这里发生的是,你将一个长轨迹的成功分解为其中出现的各个步骤的成功,这可能是一件有用的事情,因为现在你的模型可以意识到,一旦它把问题分解成四个步骤或四个高级计划,如果它还能定位哪个步骤出了问题,它就可以更好地学习那个步骤,而不是模糊地认为可能是步骤3导致了失败,而实际上可能是步骤1。所以,它帮助你更有效地学习。最终,你需要一些数据来学习,但这大大提高了你的数据效率。

利用优势进行训练

好的,很好。所以下一步将是利用这些优势进行训练。这就是我谈到的许多方法也将发挥作用的地方。

方法一:基于优势过滤的模仿学习

第一件事就是根据我刚才描述的优势进行过滤。你可以从你的模型中取一堆轨迹,我仍然在这里有拒绝微调算法。我将把它写下来:从 π_θ 中采样 y1yn。你可以采用拒绝微调算法,从你的模型中采样同策略轨迹,对每一步进行我们讨论过的 rollout,用它们来估计优势,并将那些优势为正的步骤放入你的训练数据集中进行模仿学习或监督微调。

这意味着,你取一个特定的轨迹,并在步骤级别检查优势是否为正。即使该步骤来自不正确的解答轨迹,如果该步骤本身给你带来高优势,你也会将其放入训练数据中。另一方面,假设该步骤本身来自正确的解答轨迹,但其中某个步骤优势很低或为负,我就把它扔掉。

这非常让人联想到优势加权回归,只不过在这里,我们不是对优势取指数(我猜这已经讲过了),而是基于优势进行过滤。这是基本思想。你也可以对优势取指数,即对所有东西进行训练,但将损失乘以 e^A。我认为这个目标需要大量调参,如果你只能运行一个实验,你通常会更喜欢这个目标而不是 e^A

关于是否只在错误解答的好步骤上训练:答案并非如此。我们最初认为这是这里训练的唯一方式,并且我们也做了具体的消融实验来研究这一点。答案是,你从来没有真正训练模型去产生这个步骤然后那个步骤。你的所有训练都是在给定到目前为止的前缀条件下产生这个步骤。所以你的损失看起来像是:训练模型在给定 S_i 的条件下产生 a_i,而不是你在这里看到的先前动作或步骤。

让我画一下,因为我认为画出来最容易理解。这样想:你有 xS0。你采取了 a0,到达 S1。你采取 a1,到达 S2。这些是步骤,这些是状态。假设这个状态获得了非常正的优势 A(S1, a1),而 A(S0, a0) 非常负。你现在要做的是,不一定训练你的策略在给定 S0 的条件下产生 a0,你不会那样做。你只会训练策略在给定 S0, a0(这基本上等于 S1,因为你在拼接步骤)的条件下产生 a1。这就是你要激励的全部。

关于是否有一个单独的提示器在模型行动时不断提示它:答案并非如此。一般来说,当你做强化学习时,我们从来没有真正训练策略去产生单个动作。在离线强化学习或模仿学习中,我们训练在给定 S_i 的条件下产生 a_i,但当它在世界中行动时,它只是行动并一次性产生一个巨大的词元串或动作序列。所以,你可以在它看到的不同步骤段上训练策略,但当它部署时,它只会产生一个动作,然后状态 S1 将只是问题中的词元和到目前为止步骤中的词元,这就是 S1,现在同一个策略可以继续产生下一步。它不会以任何方式被提示,它只是在一个流程中产生整个解答,只不过现在你以一种将它们分解成步骤的方式训练它。所以,真的没有单独的执行器的概念。

关于是否只在一个步骤上训练,因为马尔可夫性,你不在乎如何到达那里:答案实际上是否定的,因为在某些方面,你的状态 S1 包含了你的所有历史。S1 由问题拼接步骤1组成。所以在某些方面,你保留了所有的历史,在这种情况下,你学习的是一个非马尔可夫策略。只不过在这里,我们在步骤级别这样做的原因是,现在我们可以更好地理解解答的哪一部分实际上导致了偏离(如果确实偏离了)。没有独立性的概念。在这种特定设置中,给定 S1,动作 a1 当然很重要,但 S1S0 是相同的。所以,取决于你怎么看,它可以被称为非马尔可夫策略,因为它依赖于整个历史。但在这种特定设置中,如果你将 S1 定义为拼接状态,那么它是一个马尔可夫策略。

关于如果你的Q值非常负,但你的优势是正的,你是否会把它放入训练数据集:这是一个很好的问题。我认为我们尝试过这样做。我们确实取了不正确的轨迹,并将其中实际上好的步骤放入数据中,这是可以的。除非有些轨迹中所有东西都很糟糕,没有任何前缀可以从中成功,那么优势和Q值都很小。事实证明,如果你把它们过滤掉,你可能会做得更好一点。但同样,我在这里没有一个非常具体的可以展示给你的结果,所以我不打算告诉你这是正确的方法。但在很大程度上,敏感性似乎并不存在,因为如果前缀是罪魁祸首,那么你只训练在给定前缀的条件下产生 a1,而不是试图产生前缀本身。

方法一的结果

好的,很好。所以这是第一个选项。这很像过滤模仿学习或优势更好的回归。

我可以在这里向你展示一些结果,这最终至少在一定程度上解决了误差上升的问题。我再次绘制了每个问题的正确答案数量,你发现优势过滤确实比之前误差上升的拒绝微调方法更有帮助。

它确实有效,并且我们根据一些启发式定义(我们如何评估这一点)测量了虚假步骤的数量。仅仅从定性角度来看,虚假步骤的数量在某种程度上也确实减少了。

方法二:基于优势的离线强化学习(如DPO)

好的,那么下一件事是如何将其用于离线强化学习,这就是基于DPO的方法发挥作用的地方。之前课堂上有一个关于这个问题的问题。你也可以使用相同的原理来做DPO。

DPO中的想法与精确计算这个优势略有不同,但它使用了我们之前讨论过的相同协议。你现在要做的是:从你的基础模型(你正在训练的模型)中取一个解答,这可能是不正确的。到目前为止,我们所做的是找出有用的步骤并以某种方式保留它们,丢弃其他一切。但现在我们可以做的是,我们可以进行这些 rollout,而不是扔掉这些 rollout 或仅仅使用它们来估计优势,我可以取一个共享前缀并最终成功的 rollout,取我的模型中未成功的解答轨迹,并用它们构建一个偏好对。所以我现在有一个偏好对,看起来像是某个前缀后跟某个正确的修正,以及某个前缀后跟实际上是错误的步骤。

我可以把它扔进DPO训练数据集。我也可以用正确的 rollout 做同样的事情。如果我从我的基础模型有一个正确的 rollout,我仍然可以进行这些 rollout,也许其中一个从我的 rollout 策略来看不会成功,我基本上可以把这东西作为偏好对放入我的训练中。

这里发生的一件好事是,有两个不同之处:在某种程度上,我仍然意识到在这个过程中前缀是共享的,正确和不正确 rollout 之间的区别真的来自于你在这里看到的超出前缀的那一小段。这是第一件事。第二件事是,与之前基于优势过滤的方法不同,我实际上保留了出现在这个 rollout 分布中的整个步骤。

我不是简单地使用这些 rollout(橙色的虚线)来计算优势,而是保留它们,并且我也训练出现在该 rollout 中的词元。

DPO损失,我想我的幻灯片上没有,但你可能知道,我不一定需要写下来,但它基本上就是在我们谈到的这两个解答段上的相同的旧DPO损失。

关于你是想要高质量文本还是更多样性:我认为真正的答案是……我应该提到,这是我们试图形式化的东西。有一个精确的方程可以写下来,你可以说,我想要一个策略来进行这些 rollout,以最大化这个表达式。我认为这在某种程度上平衡了多样性和高质量。

想象一下,你的模型真的很糟糕。假设你的模型大多产生不正确的轨迹,那么你想要一个实际上能够某种程度成功的 rollout 策略,否则你永远无法从中学习到成功的概念,你只看到失败,如果你只看到失败,你怎么能真正学会解决那个问题?另一方面,假设你的模型还算不错,有50%的准确率,但总体上不是最好的解决问题者。在这种情况下,也许你只想要多样化的解决问题的方法,这样你就能看到哪些方法你更容易失败。所以在某些方面,你关心覆盖率。

因此,这里的答案就像强化学习中的每一个问题一样,你需要在探索和利用之间取得某种平衡:你想要高质量文本或高质量解答来正确解决问题,以及在某种程度上更加多样化。我认为这方面的确切表达式实际上你也可以写下来,但我今天不打算讲。

DPO算法描述

让我为每个人的理解写下那个算法。你基本上要做的是:那就是拒绝微调算法,现在我们要做的是简单地迭代这个过程。

对于迭代 t = 1T

  1. 从我的当前策略 π_θ 中采样 y1yn
  2. 给定任何问题,我现在要进行这些 rollout。
  3. 构建偏好数据集 D_f,它基本上包含那些偏好对。
  4. 现在我要做的是运行或最小化DPO损失。

这就是你要做的主要算法,而深度偏好数据集由从你当前基础模型生成的前缀和轨迹组成。轨迹的一部分来自

011:基于模型的强化学习

在本节课中,我们将要学习基于模型的强化学习。我们将探讨其核心思想、如何学习动态模型、如何使用这些模型进行规划与数据生成,并通过一个灵巧机器人操作的案例研究来加深理解。

算法概览回顾

上一讲我们介绍了多种强化学习算法。本节中,我们来回顾一下这些算法的分类,以便更好地理解基于模型方法所处的位置。

我们讨论过的算法主要分为在线和离线两大类。在线算法指策略会被用于收集新数据;离线算法则指我们只能使用给定的数据集,不能在环境中进行额外的数据收集。

在在线设置中,我们讨论了两类使用策略数据收集进行改进的强化学习方法:

  • 同策略强化学习:只能使用当前策略收集的数据,不能重用历史数据或离线数据。例如 REINFORCE 或普通策略梯度方法。
  • 异策略强化学习:可以重用来自其他策略的数据,包括在策略参数更新前收集的数据。例如 PPO 和重要性采样。

此外,还有更彻底的异策略算法,它们使用回放缓冲区存储来自过去策略的数据,例如 DQN 和 SAC。

这些算法还可以按学习内容分类:

  • 策略梯度方法:仅训练一个策略。
  • 演员-评论家方法:同时学习策略和值函数。
  • 值函数学习算法:仅学习值函数,不显式学习独立的策略,例如 DQN。

与这些在线方法不同,我们还讨论了离线强化学习方法。它们建立在许多在线方法的思想之上,但必须应对无法收集任何新数据的事实。我们研究了两种主要方法:

  • 显式约束:将策略限制在数据中出现过的动作上,例如 BCQ、AWAC 和 IQL。
  • 隐式约束:通过保守主义来约束,例如 CQL。

通常,越靠右的算法需要越多的在线数据,因此成本也越高。

在讨论强化学习之前,我们还介绍了模仿学习算法。它们也可以分为离线和在线,但假设不同:

  • 行为克隆:一种离线方法,尝试模仿数据中的动作。
  • DAgger:一种在线方法,既在线收集数据,也在线查询专家获取新数据上的正确动作。

模仿学习不需要奖励函数,但需要高质量的数据,并且通常无法超越数据中的平均表现水平。

以上是对我们目前所学算法的一个概览,涵盖了离线/在线、同策略/异策略、模仿学习/强化学习等术语。

基于模型强化学习的核心思想

上一节我们回顾了各类算法,本节中我们来看看基于模型的强化学习。它可以应用于之前提到的所有强化学习方法类别。

基于模型强化学习的核心思想是:尝试学习一个模拟器。我们能否学会预测未来可能采取的动作所带来的结果?

对于机器人、驾驶和其他物理系统,这可能意味着对特定系统的物理特性进行建模。如果你无法直接观察物理系统中的实体并进行建模,这可能看起来更像是基于智能体想要采取的动作进行视频预测。

如何学习动态模型

我们简要讨论如何学习一个好的动态模型。在实践中,有几种情况:

  1. 已知模型:在某些场景下,你可能已经知道模型,可以直接使用。
  2. 部分已知模型:你可能知道模型的大部分,只需要用数据拟合未知参数。这是将领域特定知识融入强化学习算法的一种有效方式。
  3. 完全未知模型:在大多数实际场景中,你并不知道模型。这时,典型的做法是使用神经网络或其他函数逼近器从头开始学习模型。

当使用图像观测时,有两种主要建模方式:

  • 在原始图像空间建模:预测整个未来的视频帧。这可能计算成本很高。
  • 在低维表示空间建模:学习一个编码器将状态映射到低维表示空间,然后在该空间学习动态模型。这可以降低计算成本,但需要解决如何获得良好表示的问题。

此外,为了使用模型来预测未来,你通常还需要学习一个奖励模型,以便评估预测状态带来的奖励。

如何使用动态模型:规划

现在,我们来看看如何使用学习到的动态模型。第一种方法是规划

如果我们能预测未来状态和基于这些状态的奖励,我们就可以直接将奖励梯度反向传播到动作上。我们的目标是最大化从时间 tt+H 的未来奖励总和:
max Σ_{t'=t}^{t+H} r(s_{t'}, a_{t'})

具体步骤如下:

  1. 运行某个策略 π 收集数据 D
  2. 训练动态模型 f_φ,最小化预测下一状态与真实下一状态之间的误差:min_φ Σ_{(s,a,s')∈D} || f_φ(s,a) - s' ||^2
  3. 寻找一组动作 a_t, ..., a_{t+H},以最大化未来奖励总和。这可以通过优化(如梯度下降)来完成。
  4. 在环境中执行规划出的动作序列。

然而,这种方法存在两个主要问题:

  1. 数据分布不匹配:初始策略收集的数据可能无法覆盖最终策略访问的状态,导致模型在这些区域不准确。
  2. 模型不准确:学习到的模型可能存在误差,优化过程可能会利用这些误差,导致学到的策略在真实环境中表现不佳。

一个简单的改进方法是:在执行规划出的动作后,将新数据添加到数据集中,重新训练模型,并重复此过程。这使得算法更像一个迭代的强化学习过程。

开环与闭环规划

我们一直在讨论执行整个规划出的动作序列。这被称为开环规划,因为你在执行未来动作时没有使用来自环境的中间状态反馈。

一个更好的替代方案是闭环规划,或称为模型预测控制。具体做法是:

  • 规划一个动作序列 a_t, ..., a_{t+H}
  • 只执行第一个动作 a_t
  • 观察得到的新状态 s_{t+1}
  • 基于 s_{t+1} 重新规划一个新的动作序列。
  • 重复此过程。

闭环规划有助于应对环境变化和模型误差,通常更加鲁棒。为了降低计算成本,可以使用“热启动”技术,即用上一个时间步规划结果的后部分来初始化新的规划。

基于采样与基于梯度的规划优化

在规划步骤中,我们需要优化动作序列以最大化奖励。有两种主要的优化方法:

基于梯度的优化(如梯度下降):

  • 优点:可扩展至高维空间,在过参数化场景下表现良好。
  • 缺点:需要可微的、平滑的优化环境;本质上是顺序过程。

基于采样的优化(如随机采样、交叉熵方法):

  • 优点:易于并行化;不需要梯度,适用于离散动作或不可微奖励函数。
  • 缺点:难以扩展到高维空间。

交叉熵方法是一种迭代采样优化方法:

  1. 从某个初始分布(如均匀分布)采样一批动作序列。
  2. 根据奖励对样本进行排序。
  3. 选取表现最好的样本,用它们拟合一个新的分布(如高斯分布)。
  4. 从新分布中重新采样,并重复此过程。

对于低维动作空间,基于采样的方法可以非常高效。

案例研究:灵巧手操作

最后,我们通过一个案例研究来具体看基于模型规划的应用:使用五指灵巧手进行物体操作。

  • 状态:手和物体的位置。
  • 动作:控制24个关节。
  • 奖励:基于目标物体轨迹和掉落惩罚。
  • 模型:使用一个包含两个500维隐藏层的神经网络,并训练一个集成模型(多个网络)以提高鲁棒性。
  • 规划器:使用改进的交叉熵方法进行迭代重采样优化。

实验表明:

  1. 对于复杂任务,只有所提出的方法能够成功解决。
  2. 与无模型方法(如SAC)相比,基于模型的方法数据效率高出数倍。
  3. 集成模型和迭代重采样对于良好性能至关重要。
  4. 该方法成功迁移到了真实的机器人手上,仅用4小时数据就能学会旋转物体等技能。

总结与展望

本节课中,我们一起学习了基于模型的强化学习。我们探讨了其核心思想——学习一个环境模拟器,并介绍了如何学习动态模型。重点在于如何使用模型进行规划,包括开环与闭环规划、基于梯度与基于采样的优化方法。最后,通过一个灵巧机器人操作的案例,我们看到了基于模型方法在数据效率和最终性能上的优势。

基于模型强化学习的优点包括任务无关性(同一模型可用于不同目标)和数据效率高。缺点主要在于测试时计算成本高,以及对长视野稀疏奖励任务的处理能力有限。

下次课,我们将继续讨论基于模型强化学习的最后部分,以及多任务强化学习。

012:多任务强化学习

概述

在本节课中,我们将完成对基于模型的强化学习的讨论,具体介绍如何使用学习到的模型生成合成数据,以及何时适合使用基于模型的强化学习方法。随后,我们将探讨多任务模仿学习与强化学习,包括将不同任务视为目标达成任务的方法,以及一种名为“事后重标记”的技术。


基于模型的强化学习:使用合成数据

上一节我们介绍了基于模型的强化学习,本节中我们来看看如何使用学习到的模型生成合成数据来训练策略。

我们讨论了一种与学习策略截然不同的行为生成方法。我们并非显式地学习从状态到动作的映射,而是针对给定状态,实时思考应采取何种行动。这种方法被称为“规划”。我们讨论了如何通过基于梯度或基于采样的优化方法,在未来有限的时间范围内进行这种规划。同时,我们也强调了使用收集到的数据更新模型的重要性,因为这能让你在希望使用模型的领域内学习到更好的模型。此外,周期性地重新规划有助于纠正模型错误,并适应环境的变化。

这种规划方法的优点是简单,并且如果模型足够通用,可以轻松地适配不同的目标或奖励函数,甚至在测试时也能做到。其缺点在于测试时(推理时)计算密集,且仅适用于短时间范围的问题,或那些可以通过较短时间范围规划就能处理的、奖励函数设计良好的问题。

现在,我们来看看使用这类学习模型的第二种方式:学习一个策略。核心思想是利用这个对未来进行预测的模型(即学习到的模拟器)来增强我们已收集的任何数据。

假设我们在真实世界或真实环境中收集了一些数据,即一些轨迹。这些数据也可能是离线提供给我们的。我们拥有的真实环境数据可能如下图所示。

以下是如何使用学习到的模型来增强这个数据集的一些思路:

  • 可以从轨迹的最后一个状态开始,利用模型生成更多后续状态。
  • 可以从轨迹中的任意状态(不一定是终点)开始生成后续轨迹。

通过这种方式,我们可以生成类似下图的数据,其中红色部分代表使用模型生成的合成数据或“想象”数据,黑色部分代表来自环境的真实数据。

然而,我们之前讨论过,模型在生成长轨迹时并不可靠。因此,一个可行的做法是保持这些生成的轨迹非常短。与其生成与原始轨迹几乎等长的轨迹,不如生成许多短的“片段”,这些片段围绕着你数据中的轨迹提供额外的覆盖范围。这在实践中通常效果更好,因为它能缓解模型不准确的问题。

具体来说,假设我们有一条真实的示例轨迹。生成数据的方法可能包括:

  1. 从初始状态生成完整轨迹:就像在真实环境中一样。缺点是模型对于长时域可能不准确,如果只从初始状态分布开始生成,可能无法很好地覆盖后续状态。
  2. 从初始状态生成部分轨迹:这不会给你提供对后期状态的良好覆盖。
  3. 从真实数据集中的所有状态生成部分轨迹:这种方法结合了前两者的优点,既能获得良好的状态覆盖,又能利用短轨迹。

完整的算法流程如下:

  1. 收集真实数据:记为 $ D_N $。
  2. 使用真实数据更新模型:使模型尽可能准确。
  3. 生成合成数据
    • 从真实数据 $ D_N $ 中采样一个状态 $ s $。
    • 从状态 $ s $ 开始,在你学习到的模型内部(而非真实环境),使用你的策略或任何探索策略,生成一条短轨迹。
    • 将这些生成的数据存入另一个数据集,记为 $ D_{gen} $。
  4. 更新策略:使用真实数据 $ D_N $ 和生成数据 $ D_{gen} $ 共同更新策略参数 $ \theta $。
  5. 重复此过程

关于此方法的一些要点:

  • 收敛速度:生成短轨迹并不会显著减慢收敛到目标的速度。这些数据是对现有数据的补充。当从接近目标的状态开始生成数据时,你将更容易获得奖励并进行更新。即使数据未直接达到目标,强化学习算法也能利用这些信息。
  • 奖励获取:如果你知道奖励函数的形式,或者已经学习了一个奖励函数(例如在逆强化学习中),你可以直接使用它。否则,你需要训练模型(或一个单独的模型)通过监督学习来预测奖励。
  • 计算开销:与不使用模型的方法相比,这种方法在训练时计算更密集,因为你需要在模型中展开轨迹。这是一种用计算换取环境数据收集的权衡。在物理设备上收集在线数据可能不安全或非常昂贵,因此这种权衡通常是值得的。然而,与规划不同,这种方法在测试时并不增加计算开销,因为你最终运行的是训练好的策略。
  • 算法兼容性:此方法与多种强化学习算法兼容。即使是需要从当前策略采样的同策略算法,只要用于在模型中收集合成数据的策略与待更新的策略是同一个,也可以使用。
  • 数据使用:在最后一步更新策略时,可以同时使用环境数据和模型数据,也可以仅使用模型数据。
  • 稳定性:算法的稳定性取决于模型的准确性。生成多少合成数据以及如何平衡这些数据是额外的超参数。如果模型训练不佳,算法性能可能会下降。

何时使用基于模型的强化学习

接下来,我们讨论一下何时适合使用基于模型的强化学习及其合成数据生成方法。

总的来说,基于模型的强化学习既有巨大的潜在优势,也有明显的缺点。

主要优势:

  1. 数据效率高:如果能学习到一个相当好的模型,预测未来的能力将非常有用。通过使用生成的数据,可以大大减少对真实数据的需求。
  2. 可进行测试时规划:模型允许在测试时进行规划。
  3. 无需奖励标签:模型可以在没有奖励标签的数据上进行训练。如果你有大量无奖励数据和少量有奖励数据,模型可以利用比无模型强化学习方法更多的数据。
  4. 任务无关性与可迁移性:模型在某种程度上是任务无关的。如果它在足够广泛的数据分布上训练,有时可以跨不同任务或不同奖励函数进行迁移。这对于学习多个任务非常有用。

主要缺点:

  1. 优化目标不匹配:模型优化的是状态预测的准确性(例如,像素级细节),但这并不总是下游策略性能所关心的。存在优化目标的不匹配。
  2. 模型学习可能更难:有时学习一个好的模型比学习一个好的策略更困难。在这种情况下,学习模型相当于提出了一个比下游任务本身更困难的问题。
  3. 引入额外复杂性与超参数:需要训练模型,这引入了更多的超参数(如模型架构、学习率、训练轮数、正则化等)和计算开销。此外,生成长度和合成数据量也是超参数。

因此,是否尝试学习这种预测模型很大程度上取决于具体领域和学习此类模型的难度。

关于模型在机器人领域的成功应用:

  • 在处理像图像这样的高维观测时,基于模型的方法 arguably 不太成功。
  • 在状态空间更紧凑的领域(如关节位置、物体位置),例如足式机器人或已知物体位置的灵巧手操作,基于模型的强化学习非常成功。对于这些问题,无模型强化学习或模仿学习可能极具挑战性。
  • 随着视频生成模型的进步,未来基于图像观测的模型方法也可能变得非常成功。

其他类型的模型:
除了预测未来状态的模型,还可以学习其他类型的模型:

  • 逆模型:给定当前状态 $ s_t $ 和下一状态 $ s_{t+1} $,预测导致该状态转移的动作 $ a_t $。
  • 多步逆模型:预测导致从当前状态到达未来某个状态 $ s_{t+n} $ 的动作序列。
  • 无动作的未来预测:预测未来可能发生的事件,而不考虑采取的动作。
  • 状态插值模型:学习状态 $ s_t $、动作 $ a_t $ 和下一状态 $ s_{t+1} $ 之间的转移模型。

这些模型各有用途,可以在没有奖励数据的情况下学习,仅用于理解环境。


多任务强化学习简介

现在,我们开始讨论多任务学习及其相关技术,超越简单朴素的方法。

什么是多任务强化学习?
核心思想是学习一个通用策略,该策略不仅能完成单一任务(例如倒水),还能完成许多不同的任务。例如:

  • 一个通用的语言助手,可以为我们预订旅行、在线购买杂货。
  • 一个足式机器人,可以行走、奔跑、跳舞、蹲下。
  • 一个移动机器人,可以挂毛巾、清空洗碗机、擦拭溢出物。
  • 一个音乐推荐系统,可以为不同用户个性化推荐。
  • 一个能玩多种不同游戏(如宝可梦、弹球、笨鸟先飞)的系统。

在这些场景中,每个任务都可以被视为一个独立的强化学习问题,它们可能拥有不同的奖励函数、动态特性(如不同游戏的物理规则),甚至不同的动作空间。

我们将看到,关键思想在于,在许多情况下,你可以继续进行常规的强化学习,但需要以当前要学习的任务为条件。这样,你学习的策略将不仅依赖于状态,还依赖于你希望它为该状态执行的任务。

为什么关心多任务强化学习?
回顾本课程讨论过的许多主题(模仿学习、同策略/异策略强化学习、离线强化学习、基于模型的强化学习、奖励函数),一个反复出现的重要话题是数据效率。如果我们最终目标是训练一个能同时执行多项任务的系统,那么通过跨任务和跨场景训练策略,实际上可以分摊学习任何单一任务的复杂性。因此,从数据效率的角度看,当同时训练所有任务时,训练任一单个任务所需的数据效率可能会更高,因为任务之间通常存在某种共享结构。

此外,还有一个更深层次的动机:当我们尝试构建这些通用系统,而非单一任务系统时,我们常常发现通用系统最终比仅针对一个任务训练的系统更可靠、性能更好。这已成为近年来人工智能领域一个经验性的重要发现。

定义任务
我们需要思考“任务”具体指什么。一种方式是将不同任务视为不同的强化学习问题,即不同的马尔可夫决策过程。每个任务 $ i $ 都有自己的状态空间 $ \mathcal{S}_i $、动作空间 $ \mathcal{A}_i $、初始状态分布 $ p_i(s_0) $、转移模型 $ p_i(s'|s, a) $ 和奖励函数 $ r_i(s, a) $。

值得注意的是,这种将任务定义为 MDP 的方式,可能与“任务”一词的语义概念有所不同。例如,在草地上向前走与在平坦地面上向前走,在这个框架下可能是两个不同的任务,尽管它们都属于“向前走”这个语义任务。

多任务问题示例:

  1. 个性化推荐:不同任务是不同的用户。不同用户可能有不同的奖励函数(音乐偏好)和动态特性(听歌频率)。
  2. 角色动画:不同任务是不同的动作(后空翻、奔跑、侧手翻)。奖励函数随任务变化,但物理模拟器的动态特性保持不变。
  3. 穿着不同服装的角色动画:不同任务是穿着不同服装(长袖衫、短袖衫、裙子)。动态特性(服装物理)和初始状态分布(穿着不同服装的起始状态)会变化。
  4. 控制不同机器人手臂:不同任务是控制具有不同自由度(4、6、7)的机械臂抓取物体。状态空间、动作空间(维度不同)和动态特性都会变化。

任务标识符
我们需要一种方法来区分不同任务,以便告知策略在给定时刻应该执行哪个任务。这可以通过任务标识符 $ z_i $ 来实现:

  • 分配索引:例如,任务0、任务1、任务2。如果没有更好的方法,通常会采用这种。
  • 语言描述:用自然语言描述任务。
  • 视频演示:展示任务完成过程的视频。
  • 目标状态:在目标条件强化学习中,目标状态本身就是任务标识符。

将多任务问题视为单一 MDP
一旦有了任务标识符,多任务强化学习问题可以重新表述为:将任务标识符作为状态的一部分。也就是说,我们构造一个单一的、聚合的 MDP,其状态是原始状态 $ \bar{s} $ 和任务标识符 $ z_i $ 的组合。这个聚合 MDP 的奖励函数和动态特性会根据任务标识符调用相应任务的函数。

对于目标条件强化学习这种特殊情况,任务标识符通常是期望达到的目标状态 $ g $,奖励函数通常是当前状态与目标状态之间的某种负距离(如欧几里得距离、稀疏奖励等)。

通过这种方式,我们得到了一个标准的 MDP,其状态空间包含了任务标识符。那么,为什么不直接对此应用标准的强化学习算法呢?答案是:可以,而且在许多情况下,这是一种很好的方法。然而,在某些情况下,通过利用不同任务之间的已知结构,可以做得更好。目标条件强化学习就是这样一个案例,你知道这个 MDP 由你试图完成的不同任务组成。在接下来的部分,我们将讨论一种利用这一事实来显著提升性能的特定方法。


多任务模仿学习

在多任务模仿学习设置中,如果我们有相对较少数量的任务 $ i $,可以认为我们拥有每个任务的一组演示轨迹 $ \mathcal{D}_i $,其中包含专家演示。

回顾最初的模仿学习,我们的目标是最小化给定状态下动作的负对数似然。如果我们将其写为关于策略参数的最小化监督损失函数,那么当转向多任务设置时,我们可以简单地尝试最小化单一策略参数集在所有任务上的平均损失函数。

这就是多任务模仿学习,非常简单。

一个实用技巧:分层小批量采样
如果任务差异很大(例如,一个任务要求前进,另一个要求后退,第三个要求躺下),那么如果一个小批量主要包含前进数据,而下一个小批量主要包含躺下数据,从一次梯度更新到下一次,你可能会遇到很大的方差。虽然策略应该能够利用任务标识符来区分它们,但有时网络要做到这一点可能有些棘手。

一个非常有用的技巧是:在采样小批量时,进行分层采样,确保每个小批量数据都包含来自每个任务的数据。如果你试图优化任务上的均匀分布,那么你的小批量中,每个任务的数据应各占 $ 1/n $。这将提供方差更低的梯度,在实践中非常有用。

另一个未在幻灯片上提及但同样有用的技巧是:确保不同任务间的状态和动作尺度相似。因此,按任务进行归一化也对学习过程很有帮助。

策略架构设计
训练多任务策略时,策略需要以某个状态和某个任务描述符作为输入,然后输出一个动作。你可能会遇到任务描述符是语言字符串或独热编码向量,而状态是图像的情况。这本质上是一个多模态问题,输入数据具有非常不同的形态和维度。

因此,在实践中,如何设计能够接受这种多模态数据输入的架构是一个问题。

示例架构(较早期):
一篇论文中展示了一个用于简单机器人操作任务的多任务模仿学习系统。其架构处理当前状态(图像),并使用两种任务描述符:语言字符串(如“把瓶子放进陶瓷碗里”)和任务演示视频(如一个人放置瓶子的视频)。对于语言,使用语言编码器(如Transformer);对于视频,使用不同的视频编码器。然后将这些嵌入乘到处理状态的主干网络的不同层中。损失函数对应于行为克隆损失,它要么从视频编码器采样任务描述符,要么从语言编码器采样,整个模型(包括这些编码器)都使用行为克隆损失进行训练。

现代架构:

  • 语言模型:如果使用像语言模型这样的架构,任务描述符很自然地就是一个语言字符串,可以将其视为提示词。因此,多任务模仿学习在某种程度上可以看作是所有带有不同提示词的语言模型模仿学习或监督微调。
  • 机器人策略:在现代机器人策略架构中,通常也使用Transformer。例如,使用预训练的图像编码器将图像投影到语言模型的输入空间,同时将任务描述符(如“机器人应该做什么来把茄子放进碗里”)作为标记输入语言模型,然后输出动作。整个模型(包括图像编码器和文本编码器)一起训练。在这里,任务标识符 $ z_i $ 基本上就是模型的提示词。

多任务模仿学习策略示例:
视频展示了机器人执行多个任务,例如“铺平毛巾”和“挂起毛巾”。任务标识符显示在视频左上角。机器人能够根据语言指令切换任务。另一个例子展示了机器人执行超过10个不同的语言指令任务,如“把盘子放进抽屉”、“关闭微波炉”、“底座向后行驶”、“底座左转”等。有趣的是,任务可以具有不同的抽象层次,从低层次的“向前行驶”或“右夹爪放低”,到高层次的“扔掉抹布”。

关于单一策略与多个策略的讨论:

  • 单一策略(带提示输入):可以共享权重,利用所有任务的数据,通常数据效率更高,内存占用更少,切换任务更快。
  • 多个策略(每个任务一个):权重仅在该任务数据上训练,数据集更小,通常性能更差,且需要更多内存来存储所有权重,切换任务可能更慢。但有时,将所有任务拟合到一个模型中会存在优化挑战,因此在某些情况下,为不同任务训练不同策略可能有用。

关于分层与长时域任务:
对于更高层次或更长时间范围的任务(如“清洁厨房”),单一扁平策略可能无法胜任。分层方法非常有用,我们将在后续关于分层强化学习的课程中讨论。但即使没有分层,单一策略也能为某些较高层次的任务执行合理的动作序列。


多任务强化学习

多任务强化学习的故事与模仿学习非常相似。我们可以将任务描述符作为输入传递给策略、Q函数或价值函数等模型。

如果你有离散数量的任务,为每个任务设置不同的经验回放缓冲区可能很有用,特别是如果你想平衡每个批次的采样。

数据共享与事后重标记
在强化学习中,会出现数据共享的问题。具体来说,当我们为一个任务收集了一些探索性数据时(例如,策略被告知“捡起海绵”但可能犯了错误),这种经验可能对其他任务描述符也有用。如果我们为每个任务设置了单独的经验回放缓冲区,那么我们就不会使用该数据来更新其他任务的策略。

我们可以考虑一些场景,在这些场景中,我们能够更明确地重用来自一个任务的数据来帮助模型或策略学习另一个任务。要做到这一点,我们必须对数据进行重标记。具体来说,如果任务具有不同的奖励函数但动态特性相同,那么你必须将数据集中的奖励标签更改为其他任务的奖励标签。

示例:冰球运动
假设你正在学习打冰球。一个任务是传球,另一个任务是射门得分。也许你试图射门得分,但搞砸了,却意外地将球很好地传给了你的队友。那么,你刚刚收集的这些数据,尽管你的意图是射门,但实际上可能对学习如何更好地传球非常有用。

因此,你可以做的是:除了将这段经验以其原始任务标识符正常存储外,还可以用另一个任务标识符(这里是传球任务)重新标记这段经验,然后将其存储在该任务的经验回放缓冲区中。

算法流程:

  1. 选择一个任务 $ i $ 及其对应的任务标识符 $ z_i $。
  2. 从以该任务标识符为条件的策略中收集数据:$ (s_t, a_t, s_{t+1}, r_t, z_i) $。
  3. 将此数据存储到任务 $ i $ 的经验回放缓冲区中。
  4. 事后重标记:考虑将此数据用于另一个任务 $ j $。计算任务 $ j $ 下的奖励 $ r^{(j)}(s_t, a_t) $,并将任务标识符改为 $ z_j $,得到新数据 $ (s_t, a_t, s_{t+1}, r^{(j)}_t, z_j) $。
  5. 将此重标记后的数据添加到共享的经验回放缓冲区,或任务 $ j $ 的缓冲区中。
  6. 更新策略 $ \pi_\theta $。
  7. 重复此过程。

关键考虑因素:

  • 选择哪些任务 $ j $ 进行重标记? 这是一个启发式过程。一个启发式方法是:如果任务 $ j $ 的奖励 $ r^{(j)} $ 很高,那么这段数据可能对该任务的学习有益,因为你可能意外地做了对另一个任务有益的事情。另一个启发式方法是随机均匀地对所有任务进行采样和重标记。
  • 何时可以应用重标记? 这取决于任务 MDP 的性质和所使用的强化学习算法。
    • 共享状态和动作空间:状态和动作空间(及维度)需要匹配。
    • 相似的初始状态分布:如果初始状态分布差异巨大,共享数据可能没那么有用。
    • 相同的动态特性至关重要。因为重标记不改变动态特性,如果动态特性不同,将其他任务的动态数据用于当前任务会产生问题。
    • 不同的奖励函数:如果奖励函数相同,数据已经以原始奖励函数存在于缓冲区中,重标记意义不大。
    • 异策略算法:重标记后的数据本质上是离策略数据(动作是在条件 $ z_i $ 下采取的,而不是 $ z_j $)。因此,更新策略 $ \pi_\theta $ 时,需要使用异策略算法。不需要存储原始策略,因为重标记后,数据被视为仿佛是在条件 $ z_j $ 下生成的。
    • 需要奖励函数形式:你需要能够计算新任务 $ j $ 的奖励,或者已经学习了一个奖励函数。

目标条件版本
对于目标条件强化学习,情况基本相同,但奖励函数现在是状态与目标之间的负距离。对于连续状态,这可以是均方误差、嵌入空间中的距离,或在目标状态某个 $ \epsilon $ 球内的 0/1 损失。


总结

本节课中,我们一起学习了:

  1. 基于模型的强化学习中的合成数据生成:如何利用学习到的动态模型,从真实数据中的状态出发生成短轨迹,来增强数据集并更高效地训练策略。
  2. 基于模型方法的适用场景:分析了其高数据效率、任务可迁移性等优势,以及模型学习难度、优化目标不匹配、引入额外超参数等缺点,强调了其应用高度依赖于领域特性。
  3. 多任务强化学习框架:将不同任务视为不同的 MDP,并通过引入任务标识符将其统一为单个聚合 MDP 进行学习。
  4. 多任务模仿学习:通过将任务标识符作为条件,最小化所有任务上的平均行为克隆损失。介绍了分层小批量采样等实用技巧,并讨论了处理多模态输入的策略架构设计。
  5. 多任务强化学习与事后重标记:介绍了如何通过将为一个任务收集的经验,用其他任务的奖励函数重新标记后,存入经验回放缓冲区,来实现跨任务的数据共享和经验复用。明确了该方法适用的前提条件(共享动态特性、异策略算法等)。

通过掌握这些技术,你可以构建更通用、数据效率更高的智能体,使其能够应对多种不同的任务。

013:元强化学习

在本节课中,我们将要学习元强化学习。我们将探讨其问题定义,并介绍一类被称为“黑盒”元强化学习的方法。我们将了解这些方法的基本原理,以及它们所面临的一些挑战。

课程回顾

上一节我们介绍了多任务强化学习,讨论了如何让智能体学习多个任务,这些任务可能对应不同的奖励函数。我们看到,可以通过构建一个聚合的马尔可夫决策过程来封装所有不同的任务,其中通过某种任务描述符(如提示、目标或索引)来增强状态空间。

这种方法的工作原理是:采样一个任务,在该任务的MDP中运行策略,再采样另一个任务,依此类推。最终,我们得到一个能够在多个不同MDP中成功获得高奖励的策略。另一种视角是,将其视为一个具有增强状态的单一聚合MDP。这与元强化学习略有不同,我们将在本讲后续部分看到一些区别。

我们还简要讨论了目标条件强化学习。它可以被简单地视为多任务强化学习的一个特例,其中每个任务都试图达到一个目标状态,而任务描述符就对应那个目标状态。例如,如果状态是图像,那么输入给策略的将是当前图像和目标图像,目标是达到那个目标图像。如果状态是向量,则输入两个向量,任务是试图达到某个目标状态。你可以根据状态是离散还是连续的,构建不同的奖励函数,例如是否达到或接近目标。这种目标条件强化学习的一个优点是,它可以以一种自监督的方式进行,不需要手动定义不同的任务描述符,可以直接使用不同的状态作为任务本身。许多任务都可以被表述为目标达成任务。需要注意的是,这种方法的训练可能相当困难,你们将在作业中实验一个简单的目标条件强化学习设置。

元强化学习的问题定义

那么,为什么我们需要关心元强化学习?为什么不直接使用标准的强化学习?

假设你试图操作一台从未使用过的意式咖啡机。如果你想让一个机器人或强化学习智能体来完成这个任务,可能需要大量的数据和尝试才能学会如何制作咖啡,因为这是一个相当复杂的任务,涉及许多步骤,并且需要按顺序执行。此外,这类任务的奖励信号可能不会非常详细。

但作为人类,如果你有一些指导或之前制作意式咖啡的经验,你可能在几分钟甚至更短的时间内就能学会。

因此,在强化学习中,人类学习的速度与强化学习系统学习的速度之间存在差距。这是相当令人不满意的。如果我们思考人类和强化学习系统之间的区别,一个主要区别在于人类并非从零开始。人们已经知道如何用手移动物体,可能已经知道如何使用其他机器制作咖啡,他们可以利用这些经验以及关于“如果有人告诉你拿起杯子放在某处或转动旋钮该怎么做”的语义知识,从而能够利用先前的经验来非常快速地解决这个问题,相比之下,从头开始训练一个强化学习系统则慢得多。

因此,在解决新任务时,处理类似任务(其他意式咖啡机、其他方式的咖啡制作或一般的运动控制、遵循指令等)的经验非常有用。我以制作意式咖啡为例,但这种不从零开始的框架非常通用。它适用于机器人问题,当你面对新环境或新任务时;它也适用于许多强化学习系统。另一个例子是,假设你想解决一个从未解决过的具有挑战性的数学问题。如果你有解决先前数学问题的经验,那么你可以利用这些经验更快地解决新问题,因为你已经学会了一些可以应用于新场景的策略。

因此,我们提出的问题是:强化学习算法能否利用先前任务的经验,以更少的数据和经验来学习新任务?

在许多方面,这个问题被视为一个迁移学习问题,我们希望将知识、信息和经验从先前任务迁移到新任务。研究界已经考虑了多种不同的表述和问题设置。

第一种是相当简单的设置:学习一个任务,然后想学习一个新任务。例如,你可以先在一个任务上训练,然后在新任务上微调。我们在监督学习中使用的微调概念也适用于强化学习设置,你可以将Q函数或策略微调到新任务。不过,要使这种方法有效,源任务和目标任务需要非常相似。

我们也讨论了多任务学习,你也可以使用多任务学习来迁移到新任务。特别是,如果你的提示具有某种结构,例如“拿起水瓶”、“拿起电话”、“拿起笔”等,那么你可能实际上能够实现所谓的“零样本”迁移,即无需任何新经验,只需将该提示传递给系统,让它根据提示行动。

而元学习通常关注的是“少样本”迁移,即利用少量经验(几个示例或几次任务尝试)来适应新任务。本质上,多任务学习和元学习的区别在于,元学习考虑了我们将用少量数据进行适应的事实,并在原始训练过程中就为此做准备。

另一种思考方式是:任务描述符可能不是提示或索引,而可能是一个数据集本身,即你将在某个策略的背景下进行适应的一组尝试。这有时也被称为上下文学习或少样本学习。

为了使第一种场景有效,源任务和目标任务必须非常相似。而对于第二种和第三种场景,在某些方面变得更容易,在某些方面变得更难。更容易的地方在于,你不再需要有一个极其相似的任务,只需要有一个任务分布,并且新任务应该在该分布内,这样新任务才有可能在你训练期间见过的任务分布之内。更难的地方在于,你实际上需要多个训练任务,而不仅仅是一个训练任务,才能获得有效的迁移。

少样本学习示例

在深入元强化学习之前,我们先看几个强化学习之外的少样本学习示例,然后再回到强化学习设置。

一个例子是少样本图像分类问题:你只有少量数据点,目标是对新数据点进行分类。通常,如果只基于六张图像从头开始训练,你几乎不可能学会一个分类器,尤其是在高维图像上。但元学习的工作方式是,你可以为机器学习系统构建其他具有类似结构的任务(如图像分类任务),训练它能够将训练数据集和查询图像(或测试输入)作为输入,然后预测标签,基本上将每个少样本学习问题本身视为一个数据点。

强化学习之外的另一个少样本学习示例是大语言模型中的上下文学习。例如,给定一个英语输入较差的句子(如“I eated the purple berries”),目标是输出良好的英语(如“I ate the purple berries”)。模型会给出几个输入输出示例作为训练数据集,目标是对新的输入,能够预测出良好的输出。这是另一个少样本学习问题的例子。语言模型在训练期间会接触到类似这样的数据。语言模型的一个特别之处在于,这种上下文学习并不需要你明确地设置训练数据集来完全匹配所有内容,事实证明,互联网数据的许多统计特性导致了这种有效响应少样本示例的能力。

在这些示例中,你可以认为目标是训练一个模型,该模型以训练数据集和一个新示例X作为输入,并基于X和训练数据对该示例进行预测。

问题:在LLM的上下文学习中,通常通过将数据集作为上下文或提示的一部分放入模型来实现这种少样本学习。在元强化学习中也是如此吗?一般来说是的,我们将在元强化学习中看到这种情况。实际上还有其他方法,例如通过梯度更新或类似最近邻的方法来实现。元强化学习中最成功的方法看起来像提示,所以这就是我们今天要讨论的内容。

元强化学习示例

现在,让我们看一个元强化学习的例子。假设我们想在迷宫中导航。我们的目标是解决一个新的迷宫。我们是一个智能体,在这个迷宫中,我们甚至看不到这种俯视图,可能只有第一人称视角。因为这是一个强化学习问题,目标不仅仅是输出标签,实际上还涉及在环境中收集经验。

因此,我们的目标是能够非常快速地解决一个强化学习问题,我们将此框架为收集一个非常小的训练数据集,例如一个或几个回合。在这个例子中,智能体探索迷宫,试图找到目标位置。它从中间开始,探索到这里,最终到达目标。在探索之后,我们希望拥有一个能够解决迷宫的策略,在这个例子中,仅用一次回合的经验。同样,如果你试图从头开始,仅用一次回合的经验来获得一个能够解决任务的策略,这将非常非常困难。相反,元强化学习通过尝试构建示例和构建一组训练环境来促进这种快速适应。

与监督学习场景相比,我们现在面临着探索问题。我们不仅仅是给定一个训练数据然后基于该数据做出预测,实际上我们是通过探索自己构建训练数据集。

我们需要弄清楚如何在环境中探索与随后解决任务之间取得最佳平衡,以及我们应该花多少时间探索与利用我们对环境的了解。

这是我们的目标,也是我们在测试时希望做到的:快速学习一个新的迷宫。为了让我们的智能体在元训练时取得成功,在我们尝试适应新迷宫之前,我们将学习如何高效地探索和解决许多其他相关的MDP(在这个例子中,可以是其他类似的迷宫等)。这些是我们为了适应新迷宫而将要训练的每个任务。

另一个关键假设是,这些新的MDP不能与之前见过的MDP完全不同。我们可以这样理解:我们应该有一个任务分布,而我们试图适应的这些新MDP应该在我们训练期间见过的任务分布之内。

迷宫导航是元强化学习任务的一个例子。还有许多其他场景。例如,在机器人学中,一个有用的场景是让腿式机器人系统能够非常快速地适应不同的地形、不同的坡度。这实际上是一个非常小的腿式机器人,但它也适用于更大的腿式机器人。有时,你可能在模拟中训练不同的环境,然后在现实世界中作为一个新环境进行适应。在操作场景中,你也可以将物体操作作为不同的任务。此外,在许多语言建模场景中,这也非常适用。元强化学习相关的一个例子是适应具有不同偏好的不同用户,你在上下文中给出他们想要的响应类型的示例,我们稍后也会在推理中看到一个例子。

问题:这种元强化学习方法与先训练再微调的迁移学习方法之间的关键区别是什么?有几种看待方式。一种是在这种训练过程中,你实际上明确地优化了可迁移性,你优化了用小数据集进行适应的能力。因此,你可以获得更快的迁移,可以使用更少的数据。有一些例子表明,与使用微调相比,使用少样本上下文学习或少样本适应,你可以获得更高效的迁移。你获得更高效率的方式是为算法提供许多不同的训练任务,而不是仅仅依赖于一个训练任务。

形式化定义

稍微更正式地说,我们讨论过多任务学习,即你试图同时解决多个任务,并可能从中迁移到新任务。但对于迁移学习,你并没有优化可迁移性,你通常是在解决某个源任务后,通过微调来解决某个目标任务。

而在元学习问题中,我们拥有来自一些训练任务的经验,并且希望非常快速地解决新任务。在强化学习场景中,这些任务将是MDP,每个都有其自己的状态空间、动作空间、动态和奖励。元学习在监督学习中也有类似之处,两者之间存在一个很好的类比,元强化学习的主要区别在于探索挑战。

深入一些符号表示,我们可以将元强化学习问题视为能够用少量经验学习一个可以解决任务的策略,并且能够自己收集这些经验。这个训练数据,元强化学习问题有两种不同的变体:在第一种情况下,这可能对应于来自某个探索策略的多个回合;在第二种情况下,你也可以认为这只是来自探索策略的几个时间步。这两种场景之间存在一定的连续性,你可能希望能够在线适应几个时间步,也能适应越来越多的回合,基本上是一个不断增长的数据集。但在这里明确地写成两种不同的事物,是为了清楚地表明,有些问题设置中你希望在一个回合内非常快速地在线适应,而在其他场景中你更关心多次尝试的经验。

最后要提到的是,我一直将其写为探索策略和任务策略。在某些场景中,你可能会分别训练它们,它们可能是独立的网络;在其他场景中,它们可以共享参数,基本上是同一个网络。因此,它们不一定需要像本幻灯片上那样分开。最后一点是,就我们学习这个以训练数据为条件的策略而言,你可以将其视为一种任务标识符,从这个角度来看,我们更像是处于一个看起来像多任务学习的设置中。

问题:当我说测试任务应该与训练任务同分布时,这是否意味着它必须与某个训练任务完全相同,还是可以略有不同?它可以略有不同,我们也会看到不同的例子。

黑盒元强化学习方法

现在让我们谈谈如何解决这些问题。好消息是,有一种概念上非常简单的方法来解决这种一般性问题陈述;坏消息是,在实践中优化起来可能具有挑战性,我们稍后会讨论其中的一些挑战。但从概念上讲,我们基本上可以训练一个序列模型(可以是Transformer、任何具有记忆的神经网络或循环神经网络),并使用它,其中传递给该策略的所有内容都对应于智能体收集的经验。

因此,你基本上是以训练数据集为条件来调整你的策略,然后让策略基于它在该MDP中迄今为止看到的数据输出动作,然后在所有训练MDP集合上训练这种序列模型策略。在这里,当前状态和上下文(或训练数据集)将随着时间的推移而变大,因为我们在给定的MDP中收集了更多的经验。

现在问你一个问题:这与在标准强化学习设置中简单地使用循环策略,或在标准强化学习中使用序列模型(如Transformer)有几个区别。有人对这里开始讨论的内容与在标准强化学习设置中简单地使用序列模型作为策略之间的区别有什么想法吗?

记忆,是的,通常在强化学习中我们通常不使用记忆,而这里我们使用记忆,这是一点。但与在标准强化学习设置中使用记忆相比,这里还有什么不同?是的,我们在这里做的一件事是,我们实际上将奖励作为输入传递给记忆,这在某种意义上有所不同,因为你实际上是在使用当前MDP的奖励信息来尝试更好地完成任务。这也意味着,实际上在测试时或当我们试图适应新任务时,我们也将使用奖励,而在强化学习设置中,通常我们并不一定假设在部署策略时拥有奖励。所以这是一个主要区别。还有其他区别吗?

问题:为什么我们也不将动作作为输入传递?你可以将动作作为输入传递。这取决于你的策略是否主要是确定性的。如果是,那么关于过去动作的信息也可以存储在记忆中,因为你预测并生成了那些动作。因此,在这些情况下,你不需要动作。如果你的策略更具随机性,那么采样过程不一定在记忆中,在这些情况下,最好也将动作作为输入传递。

正确,所以注意点是,不同任务的状态和动作可能不同。因此,这里的一个不同之处在于,我们实际上是在跨MDP训练这个模型,因此你可能拥有不同的状态和动作空间,可能具有不同的动态。因此,与标准强化学习相比,一个很大的不同在于,我们实际上是在跨MDP训练,并且这些MDP之间的状态、动作、动态和奖励会存在差异。

实际上还有另一个区别。我们讨论的第一点是奖励作为输入传递,你可能也会传递动作作为输入,并且这是在多个MDP上训练的,这与典型的强化学习设置有很大不同。现在,第二个不同之处在于,你的记忆也可能跨越多个回合。如果你试图不仅在一个回合内学习,而且跨回合学习,那么你的当前策略不仅会在一个回合内保持记忆,还会在多个回合之间保持任何隐藏状态或任何记忆。

就算法而言,这看起来像是:我们将采样一个任务或一个MDP。让我们称之为MDP Ti。然后我们将在该MDP中运行我们的策略多个回合。假设在任务或MDP中运行策略π进行N个回合。这是推出这里的过程,并且它将在那些N个回合中保持记忆。然后,可选地,如果我们使用带有回放缓冲区的离策略算法,那么我们会将回合存储在回放缓冲区中。最后,我们将优化更新我们的策略以优化奖励。因此,我们将更新π,具体来说,我们将最大化奖励的总和,就像典型的强化学习目标一样。但它将跨越我们任务分布中的所有任务。因此,我们将对某个小批量中的任务I求和,然后也是对奖励总和的期望。这将是我们的策略下不同时间步奖励总和的期望。

这是一个非常简单的算法,看起来很像强化学习,主要的不同之处在于,我们将在多个MDP上进行这种优化,并且我们的策略将在一组回合中保持记忆。通常,这个数字会相当小,因为如果很大,比如一千个回合,很难将其存储在模型的上下文中,因为你的内存会开始大幅增加。

它的样子是:你的神经网络有多个回合,然后你将为多个回合推出它,采取行动,然后你将开始为一个新的MDP收集数据,所以当你开始为采样的新MDP收集数据时,你会切断你的记忆。在这个图中,你采样一个任务,在该MDP的动态和奖励函数下推出策略进行N个回合(图中N=2)。然后将你的回放缓冲区存储起来,通常你会为每个任务设置不同的回放缓冲区。然后更新你的策略,以最大化你为所有任务收集的折扣回报,然后重复这个过程,以持续获得一个能更好地进行这种上下文适应的策略。

问题:它知道它正在开始一个新的回合吗?例如,在这个位置,在实践中你可以使用位置编码。此外,你的状态很可能会有很大的不连续性,所以你可能只是看到当前状态与过去状态非常不同,这也可能告诉它。是的,你也可以使用某种标记来告诉它这是一个新的回合。

问题:当推出策略时,我们在不同的回合中随机化S1吗?当你开始一个新回合时,你会从初始状态分布中采样,所以S1在这里可能不同,S2很可能与这里的S2不同,依此类推。

这样做的结果是,你将拥有一个应该能够跨回合适应的策略,利用这些回合的经验,并且它应该能够自行决定最佳的探索-利用权衡。最佳的探索-利用权衡将取决于你给它的回合数N。如果N=2,那么它有两个回合来尽可能快地最大化奖励,如果它需要探索,它会尽快探索。如果N稍大一些,那么它仍然有更多的预算,如果可能的话,它仍然希望快速高效地探索,因为这样它可以在以后获得更高的奖励,但它可能有稍多的预算进行探索。因此,当你端到端优化整个事情时,一个很酷的地方是,它将决定是否探索或利用,并且这些决定将以能够获得最高奖励的方式做出。

测试与架构

在这种训练过程之后,在你训练了多个MDP之后,你实际上可以在新任务中推出你的策略。在测试时,你将获得一个新任务,即你处于某个新的MDP Tj中。你可以取出训练好的策略,并在该MDP中推出它,包括数据、动作、奖励等。因此,采样一个新任务,推出该策略,你想推出最多N个回合,如果你推出更长时间,那么它可能会做什么就不确定了。你也可以在训练期间使用可变数量的回合,如果你想能够处理可变数量的回合,但这里大概是推出N个回合或最多N个回合。

就实际实现而言,你可以使用几种不同的架构和优化器。你可以使用普通的循环神经网络,一些最早的元强化学习工作就是这样做的,他们使用的算法在本质上与PPO类似。在Transformer真正流行之前,有一篇论文使用了自注意力和一维卷积,你可以将其视为一种Transformer并进行了优化。值得注意的是,在这个特定场景中,他们也传递动作作为输入。另一件事是,我们稍后会再谈一点,你也可以不使用Transformer或RNN,而是使用前馈网络,然后对嵌入进行平均,这有时被称为深度集合,它有自己的优点,实际上计算速度相当快,因为你可以并行化所有内容,并且对于它能做什么也出人意料地富有表现力。

应用实例

让我们看一些例子。我们将看这个使用类似Transformer的示例,他们试图学习如何视觉导航迷宫,特别是智能体从未见过的新迷宫。他们在1000个小迷宫上训练,并在未见过的保留迷宫中测试,实际上测试了小型和大型迷宫。这是一个他们能够看到一些外推到训练分布之外任务的场景。

这是在测试时的样子。你可以看到智能体只是在环境中探索,寻找目标位置。它只将这些图像作为输入。在右侧,我们可以看到探索的轨迹。它从中间开始,探索到这里,探索到这里,最终找到了目标。然后,在探索回合之后,我们仍然拥有来自前一个回合的记忆,利用该记忆,它能够直接前往目标。基于在那个迷宫中的经验。再看一遍,这是第一个回合,这是推出该策略的第一个回合,它选择探索,因为它不知道目标在这个迷宫中的位置,也不知道迷宫的布局,所以我们看到它在这里探索。然后在第二个回合,它选择直接前往目标,因为它认为已经探索了迷宫的范围。

这是一个更大迷宫的例子。智能体从这里开始。它探索顶部区域,没有看到目标。意识到这是一个死胡同,不需要进一步探索,然后在这里看到了目标。之后,在第一个回合之后,它直接前往目标。在这个训练示例中,N=2,所以他们训练它能够在两个回合后探索和利用。

定量地,他们查看了在第一个回合和第二个回合中找到目标的平均时间。他们与使用随机策略(偶尔会碰到目标)以及使用LSTM架构和这种更类似自注意力和卷积的架构进行了比较。他们发现,对于小型迷宫,即使在第一个回合中,它们也比随机策略好得多,这意味着它们实际上是在高效探索,然后最终经常找到目标。然后,在第二个回合中,在第一个回合中学习了目标位置和迷宫布局后,它能够更快地找到目标。我们还看到,在大型迷宫中,它比随机智能体表现好得多,并且在两种情况下,使用自注意力架构都比使用LSTM架构(另一种记忆架构)更好。

问题:奖励是找到目标吗?如果是,为什么它被优化为尽快找到目标?奖励是找到目标。我不记得奖励的确切结构。它被优化为尽快找到目标。有几种方式导致它优化为尽快找到目标。在这个特定情况下,我相信他们使用的是折扣奖励,所以折扣因子不是1,可能是0.95或0.99,因此,如果你更早获得奖励,该目标值会更高。

问题:什么作为输入传递给模型?是的,正是。是来自前一个回合的视频、前一个回合的动作,以及基本上直到当前时间为止的所有内容,包括任何前一个回合和该回合迄今为止的所有内容,所以是所有视频帧,以及所有动作和所有奖励。

问题:在算法中,我们在哪里进行探索与利用?在这里,因为它基本上都归结为两者的这个目标。其洞察是,智能体不知道任务的具体情况。根据训练任务,它不知道自己在哪个迷宫中,不知道迷宫的结构等。因此,实际上,在开始探索并找到目标位置之前,它甚至无法获得高奖励。所以,通过端到端优化奖励,你激励它去探索,因为不探索就无法获得更高的奖励。我们很快会在接下来的课程中讨论这个问题,但确实,这里有很多问题,因为当你的策略很差且没有得到好的奖励时,很难找出一个好的策略。

问题:与其做我们正在做的事情,我们能不能只做常规的强化学习,然后在测试时进行训练?在某些方面,具有循环性的语言模型,取决于你如何看待它,已经在做类似元强化学习的事情。如果它有记忆,并且基本上有能力根据你给它的任务类型进行适应。然后,是的,另一个重要组成部分是,如果你进行测试时计算,你允许它实际思考问题。现在,测试时计算是一个非常广泛的术语。在下一张幻灯片上,我们将讨论如何实际使用元强化学习与测试时计算相关。所以现在让我们谈谈这个。

测试时计算与元强化学习

假设我们正在解决不同的数学问题。这是一个典型的语言模型示例,特别是对于测试时计算。一个数学问题的例子是试图证明这个不等式,我认为这可能与Orel在他的讲座中展示的是同一个数学问题。在某些方面,试图解决这个数学问题本身可以被视为一个MDP,因为你可以尝试采取不同的策略来解决这个数学问题。你事先不知道哪种策略会帮助你解决那个问题,比如从哪里开始,你是尝试猜测和检查,还是尝试消除方程中的项等等。

理想情况下,你能够探索这些不同的策略,然后基于最佳策略产生答案。事实证明,如果你给DeepSeek一个不同的数学问题来解决,如果你给它一个难题,它会思考一段时间,在某个时刻,它会切断测试时计算,因为它不想让用户等待太久,然后为用户输出一些解释。然后,如果你给它一个非常简单的问题,比如“2加2等于问号”,它实际上也会思考解决方案可能是什么,然后给出答案的逐步解释。这显然是有些浪费的,除非这本身就是一个具有挑战性的问题。

因此,你实际上可以使用元强化学习的概念来优化测试时计算。如果你知道在测试时你将进行测试时计算,那么基本上将其纳入训练过程,并鼓励模型高效地使用测试时计算,高效地探索不同的策略,这样理想情况下,在简单问题上,它会尝试尽快输出答案,而对于难题,它会根据需要思考足够多,包括可能的探索,直到它尝试利用并给出解释。

这篇论文探索了这一点。他们发现,当他们明确优化测试时计算的有效使用时,他们能够用相同数量的标记获得更高的性能,并且实际上减少了获得相同性能所需的标记数量,这样你就不会在简单问题上浪费大量标记。

这就是元强化学习思想在语言模型中的应用案例。

与其他概念的关联

现在快速离题一下,这将引导我们以另一种方式思考元强化学习。

我们讨论过多任务策略,其中我们以任务描述符为条件,例如,我们可能希望机器人在不同位置堆叠或向不同方向行走。我们还讨论过以经验为输入,然后基于该数据生成动作的策略。

如果你思考这与多任务学习策略的关系,一种思考方式是:我们只是在做多任务学习,但现在这个数据是我们的任务标识符。它在任务内部实际上是变化的,所以这个类比并不完美,对于给定任务来说它并不是固定的,因为你可以将其视为以任务为条件,只要经验告诉你你试图做什么任务。

很好。如果你思考目标条件策略,奖励就像……你也可以将元强化学习视为目标条件策略的一种推广,因为有一组是目标达成的MDP,还有一组更广泛的奖励最大化的MDP。因此,另一种思考方式是:与其试图泛化到新目标,你可以将元强化学习视为试图用少量经验适应新任务,这将是目标条件情况下的零样本泛化与元强化学习情况下K个回合或K个时间步的K样本泛化之间的区别。

任务推断视角

现在,我们讨论了如何将经验视为任务描述符,即提示。但实际上还有另一种看待方式,即如果我们思考这个具有记忆的策略,它有过去的记忆,然后是我们的当前策略。

如果我们思考什么信息被传递到这里给策略,这个信息大概是关于任务的信息。具体来说,当ZI不是状态的一部分时,关于你试图解决哪个MDP存在模糊性,你正在使用该经验来尝试识别你所在的MDP。

你可以将其视为策略需要推断任务,它需要从其经验中推断出某种潜在的任务描述符。因此,看待元强化学习的另一种方式是:你正在使用你的经验来推断任务是什么,然后以你对任务当前估计为条件来调整当前时间步的策略。所以你可以将其视为元强化学习试图探索以推断这个未知任务,然后执行该任务。

问题:因为我们要推断任务标识符,为什么不直接把它交给学习系统?主要原因是,如果我们没有一种紧凑的方式来描述智能体正在执行的任务,那么实际上可能具有挑战性。如果你没有好的表示方式,那么我们不确定该向策略传递什么。如果我们没有好的表示方式,我们总是可以求助于使用索引,说这是任务1,这是任务2,这是任务3。但如果你这样做,然后在测试时说这是任务100,它将无法在该场景中泛化并对该任务做任何事情。而以经验为条件则是一种可以泛化的方式,它实际上能够使用状态、奖励等更连续的空间来找出新任务。所以这归结为表示问题,你可以将其视为学习一种Z表示,即学习一个代表我们任务的连续向量。

与POMDP的关系

在多任务强化学习中,我们讨论过如何制定一个对应于原始状态空间和Z向量的状态空间,然后你得到这个聚合MDP。因此,其结果仍然是一个MDP,只是有了新的状态空间和新的动态来解释这个新的状态空间。

那么问题是,对于元强化学习,是否存在一个聚合MDP?在这种情况下,我们没有在状态中提供ZI。因此,实际上它本质上是部分可观察的。你实际上不知道任务是什么,你试图从经验中探索并弄清楚。因此,实际上并不存在一个你可以考虑的聚合MDP。相反,如果你想将其聚合为一个单一的决策过程,它将必须是一个部分可观察的MDP或POMDP。这实际上是一种特殊的POMDP。

我们之前讨论过,你有一个部分可观察的马尔可夫决策过程,你实际上无法观察S,你有动作,并且你不是观察S,而是观察一些作为S函数的观察值。这将是POMDP的一般情况。关于元强化学习有点特殊的是,你唯一无法观察的是任务是什么。因此,它基本上是一个POMDP,其中隐藏状态空间可以定义为观察值和任务标识符。如果你能从经验中推断出任务标识符,那么你基本上可以将其视为一种试图推断底层状态空间以解决POMDP的方式。

所以这基本上是看待元强化学习问题的另一种方式,即它基本上像一个部分可观察的马尔可夫决策过程。

现在有一个我们实际上刚刚讨论过的元学习方法,我展示了一个架构图,它实际上明确地尝试输出Z,并且实际上输出了一些Z的分布,因为在最开始你实际上不知道Z是什么,你对Z有一些先验信念,然后随着你获得更多经验,你对Z的估计会越来越好。因此,如果你表示这种潜在任务表示的分布,那么你可以用它做一些很酷的事情,我们稍后会看到。

这个特定的算法着眼于连续控制问题,其中不同的任务对应于向不同方向行走、以不同速度奔跑,以及不同的物理动态,因此能够在摩擦不同或机器人系统的惯性不同时进行适应。

另一件事是,我们之前看到的一切都使用了类似PPO风格的算法,这有些离策略但不是很离策略,在某些方面它比离策略更接近在策略,因为它没有使用过去数据的回放缓冲区。

探索挑战

使用元学习算法,你可以非常非常快地适应。但如果你的基础算法相当接近在策略,训练过程可能会非常慢。因此,作为一个问题,希望这是一个直接的问题:如果在步骤四更新策略的基础算法是一个离策略算法,你预计这比使用在策略方法更高效还是更低效?更高效。所以,如果你使用回放缓冲区,并用该回放缓冲区更新你的记忆(具有记忆的策略),那么在元训练过程中,这应该会数据效率高得多。在测试时,当你适应时,效率将是相似的,所以这里只是讨论实际训练这种上下文学习系统的效率。

因此,如果你实际查看训练过程中的曲线,为了元学习这些系统所需的数据量,你可以看到,在蓝色中,如果我们使用带有回放缓冲区的离策略算法,它比RL²和ProMP数据效率高得多,学习速度快得多,而后两者使用的是更接近在策略的基础算法,更像PPO。

问题:能否详细说明回放缓冲区中具体有什么?通常,每个回放缓冲区将有一个回合序列,基本上回放缓冲区中的每个条目将是来自给定MDP的一系列回合,包括状态、动作、奖励。当你优化时,通常你会为每个任务设置不同的回放缓冲区,所以你可以在这里采样一个任务,然后使用来自该轨迹的记忆来优化该任务的奖励。通常,缓冲区不是只存储状态和动作,而是存储完整的轨迹在一起,因为你要训练一个具有记忆的模型,并且需要能够将该轨迹作为记忆提供给策略。

总结与挑战

总结到目前为止,我们讨论了使用这些模型来适应新的MDP。它们很通用,表现力很强,并且在架构选择上也有多种变化。

一件事是它们难以优化,因为你实际上需要从数据中找出如何适应,并且这里有很多不同的输入特征,模型必须弄清楚哪些是有用的。例如,在迷宫导航中,你作为输入传递的那些视频中,当你试图利用并学习策略时,哪些部分是有用的。因为你传递了这么多东西作为输入,模型如此之大,因此可能难以优化。从探索的角度来看,也可能难以优化,我们将在接下来讨论这一点。然后,元学习过程的样本效率将继承自你在这个最后一步中使用的任何优化器。

因此,如果你使用像普通策略梯度这样的方法,它将极其数据低效。如果你使用像PPO这样的方法,它会更稳定但仍然相当低效。如果你使用像SAC这样的方法,它可能会高效得多,尽管你可能需要更多地调整超参数。

探索问题

现在让我们谈谈探索。我指的是上下文中的探索,即当你试图探索一个新任务时。

到目前为止,我们讨论的是尝试端到端优化探索和利用,以最大化最终奖励总和。原则上,这实际上可以产生最优的探索-利用权衡,因为你直接优化了奖励总和。这真的非常棒。但它可能是一个非常具有挑战性的优化问题。让我们谈谈为什么会出现这种情况。

让我们看一个运行示例。假设你有一个像这样的机器人,机器人需要找到某个东西,并且有一些走廊,机器人可能需要走下去以尝试找到它试图找到的东西。不同的任务对应于它试图找到的物体的不同位置,所以在一个任务或场景中,它可能在这里,在另一个场景中,它可能在这里,等等。为了帮助机器人一点,我们将引入另一件事,即这里会有一张纸,那张纸实际上用文字说明了物体在哪里,比如它说物体可能在第四条走廊的尽头。

这是我们的机器人,这些是走廊,不同的任务对应于导航到不同走廊的尽头,并且我们有一些关于去哪里的信息,如果我们查看该信息,它将在状态中,关于这个任务的奖励在哪里。

我们实际上如何学习探索?假设我们正在收集轨迹,并试图学习如何探索,以便我们能获得良好的行为。假设我们从这个场景开始,我们采样了这个任务,也许任务是去这个走廊的尽头。假设我们收集了一个轨迹,我们实际上只是很幸运,收集到了一个直接前往那个奖励的轨迹。在某些方面,这看起来不错,因为我们为此获得了奖励,这给了我们一些奖励,并且优化了我们最终关心的目标。但这件事的坏处在于,机器人很幸运,它实际上不知道如何在未来重复这一点,因为它没有实际探索任何其他选择。

因此,我们可以这样看待:它去了正确走廊的尽头,会得到正奖励,但导致获得正奖励的上下文实际上看起来与任何其他任务没有什么不同,它经过了这里,没有什么能区分它在那里做了什么(零奖励,零奖励)。例如,如果任务是去这里或去这里,结果,它实际上没有学会如何探索,也没有学会如何使用探索信息来解决问题。

因此,这个轨迹可能对学习如何探索和学习如何利用非常有帮助。现在假设我们有一个不同的轨迹。假设智能体没有那样做,而是采样了相同的任务,它去了这个轨迹的尽头,然后继续,没有看到,然后去了这个轨迹的尽头。这将是好的,因为它实际上有经验排除了一个任务,然后因为不同的任务获得了奖励。所以它将教会它一些关于有效的探索策略的东西。缺点是,这种探索策略是相当次优的,因为首先查看说明然后去正确的位置会更高效得多。所以它有些好,也有些坏,它提供了一个次优探索和利用策略的信号,所以它可能比它做的第一个轨迹好,但仍然不理想。

现在考虑第三个轨迹。假设我们再次为元学习过程收集数据,假设智能体决定查看说明,然后只是停留在那里看说明。有人对这对于学习过程是否有用有什么想法吗?是的,完全正确。它做了一些有用的事情,但它没有为此获得任何奖励。它只有在做了那件事然后去了这里才会获得奖励。所以这对于学习问题也不会非常有用。基本上,在这样的问题中,你只有在你成功地进行了适当的探索行为然后进行了利用行为时,才会真正学到关于如何探索和利用的有用知识。如果你在单独的回合中做它们,那么你实际上并没有获得良好的学习信号。

这意味着你有一种样本复杂性,你需要实际上幸运地同时做这两件事,才能获得有助于你学习问题的信号。

因此,基本上,同时学习如何探索和利用是困难的。另一个例子是,假设你试图学习烹饪,你在以前的厨房中有数据,你的目标是能够快速学习如何在新厨房中烹饪。现在,为了学习烹饪,你需要找到食材,如果你还没有弄清楚如何找到食材,因为你的探索能力很差,那么你就无法学习烹饪,因为你手头没有食材。然后,如果你还不知道如何烹饪,因为你没有收集过相关经验,那么无论你做什么探索,你都会得到低奖励。

所以你有一个先有鸡还是先有蛋的问题,介于学习如何探索和学习如何使用该信息解决任务之间。因此,另一种看待方式是这种耦合问题,探索和执行(或利用)相互依赖才能共同成功。

因此,端到端训练的看法是,它很棒,因为你可以学习这种最优权衡,但如果你有一个困难的探索问题,它可能极具挑战性,因为你需要弄清楚如何探索和利用,并以这种方式获得学习信号。

问题:这里的最终挑战是奖励稀疏吗?确实,如果你有密集奖励,你会处于一个更好的位置,因为基本上你不需要明确地进行探索。是的,你将能够……嗯,你不需要明确采取行动进行探索。这确实是在探索困难时出现的问题。如果探索很容易,这真的不是问题,因为你不再需要同时解决探索和利用,你只需要解决利用。

解决方案

对此有几种解决方案,我们今天将开始讨论一种解决方案,然后在周五讨论更多解决方案。我不会完全详细地介绍这些方法的工作原理。

这里的第二种解决方案是,与其仅仅优化端到端奖励,你可以添加辅助探索目标,以鼓励它尝试找出关于任务的更有意义的信息。

这里的一种方法是使用所谓的后验采样,也称为汤普森采样。它的工作原理是:我们讨论过一种算法,你试图推断任务是什么。如果你已经收集了一些经验,并且推断出了一些关于任务的分布(在这种情况下,ZI现在是某种潜在表示,不是已知的表示),那么你可以做的是:你可以从这个分布中采样,然后表现得好像那就是正确的任务。

因此,如果你有这种任务推断过程,并且还有一个策略,在给定Z的估计下能够生成动作,那么你可以做的是:你可以从这个分布中采样一个Z,然后从这个策略中采样。如果你有能够这样做的策略,这开始有点解耦问题,因为如果你有对于给定Z能够执行任务的策略,那么你基本上会学习一种探索策略,试图探索不同的走廊以找到解决方案。

例如,这是一个看起来与走廊有些相似的问题,如果你到达这些圆圈之一,你会得到稀疏奖励,不同的圆圈对应不同的任务。在这种情况下,我们采样了这个任务。首先,我们从任务的先验中采样一个Z,没有任何数据,所以我们采样Z,然后基于这些不同的Z运行我们的策略,并根据这些进行探索。然后我们用它来推断任务可能是什么,所以现在我们知道任务可能在这里或这里。因此,现在你将收集颜色较浅的轨迹,像这个,这个,然后去这里。一旦你实际收集了这个轨迹,那么你应该对任务有一个更窄的分布,因为你在这里获得了正奖励,所以你的策略或你的Z分布将在这里变窄,你将根据那些Z执行你的策略。

因此,这是解决探索问题的一种方法,基本上是学习这种任务的潜在表示,然后从该分布中采样任务,并根据你对该任务的策略行动。

有人对这种情况很好而其他情况不好的场景有什么想法吗?这种采样可能在什么时候不好?在什么样的MDP中可能效果不佳?如果你有一个大的动作空间,那可能会造成影响,尽管这不仅仅与动作空间有关,因为如果你在大的动作空间中有密集奖励,你可能没问题。如果超出分布,当然会有问题,但即使在分布内,也有场景下这种探索策略会很糟糕。是的,所以一个可能更差的场景是,如果你开始看到一些奖励,但另一个场景中可能有更好的奖励,你可能会开始过早利用,尽管如果它知道还有其他任务可能有更高的奖励,它不会排除那些更高奖励的场景。

我想到的这种可能相当糟糕的场景实际上很像这里的这个场景。后验采样在这种情况下学习的策略不是查看说明,而是会走下每个走廊并试图找到奖励,因为它试图通过执行对应于不同任务的策略来明确探索。如果

014:探索

在本节课中,我们将要学习强化学习中的核心挑战之一:探索问题。我们将从标准强化学习环境,特别是多臂老丨虎丨机问题开始,讨论探索的基本概念和策略。然后,我们将探讨这些概念如何应用于更复杂的领域,如机器人和大语言模型。最后,我们将重新审视元学习主题,并学习一种能够有效学习探索策略的元强化学习方法。

什么是探索问题?

如果我们对某些问题应用强化学习,我们能够很好地解决它们。例如,如果我们尝试训练一个强化学习智能体来玩《打砖块》游戏,其奖励是游戏得分,你会得到一个性能相当不错的玩家,能够获得高分。

但是,如果你尝试训练一个强化学习智能体来玩右边这个游戏,它被称为《蒙特祖玛的复仇》,对于强化学习系统来说,玩这个游戏真的非常困难。

那么,为什么会有这种差异呢?在第二个游戏中,如果你拿到一把钥匙,直观上你会得到奖励。拿到钥匙对于能够取得进展是有用的,打开一扇门也是有用的。还有一个骷髅头在滚动,我们人类直观地知道这可能是一些你想要避免的东西,同样,从悬崖上掉下来也是你想要避免的事情。但这些都是智能体自己不知道的事情。

总的来说,完成这类游戏就像是一些非常稀疏的离散事件,而完成游戏只与这些奖励事件有微弱的相关性。实际上,每个单独的奖励事件也相隔甚远。例如,在开始时,智能体根本得不到任何奖励,它必须首先弄清楚如何到达钥匙的位置,这需要相当长的一系列事件。

作为人类,我们大致知道该做什么,因为我们理解游戏中每个精灵的含义。但算法真的不知道这些。如果我们试着把自己想象成强化学习算法,我们可以通过一个叫做“毛”的游戏来思考这个问题。这有点像半个游戏、半个玩笑,你不会提前被告知游戏规则,如果你违反了规则,你就会受到惩罚。

但你实际上并不知道你受到了惩罚,你也不知道规则是什么,你必须通过试错来发现规则。当你受到惩罚时,你并不总是清楚为什么受到惩罚,这些规则对你来说不一定有意义。

像《蒙特祖玛的复仇》这样的任务之所以困难,是因为强化学习方法不了解规则。它们对什么是好、什么是坏、能做什么、不能做什么知之甚少。当任务变得越来越长时,这个问题也变得更加困难,因为你必须找出更长的动作序列,这些动作可能导致获得奖励或受到惩罚。

所以,如果你思考强化学习智能体必须做什么,它们有点类似于想象你的人生目标是赢得50场“毛”游戏,而你甚至事先都不知道这一点。你只能从赢得游戏获得奖励和输掉游戏受到惩罚中学习。这有点像强化学习系统所面临的困难。这真的非常困难,尤其是在稀疏奖励的场景中。

探索与利用的权衡

现在,如果我们思考这个探索问题,有几种不同的看待方式。一种看待方式是,我们希望发现高奖励策略。我们基本上希望寻找奖励,并找到那些单独来看可能没有奖励,但当我们把它们组合在一起时,我们能够找到奖励的动作序列。

另一种看待探索问题的方式是,决定是尝试新行为,还是继续做目前已知最好的事情。你基本上是在决定:我应该尝试新事物,还是应该做过去表现好的事情。

这实际上是一个单一问题的两个部分,你需要平衡利用和探索。利用问题是做你知道会产生最高奖励的事情,做你以前见过的、有更高奖励的事情,例如,根据你的Q函数行动。

而探索问题是做你以前没有做过的事情,希望获得更高的奖励。

所以,这就是我们如何思考这个强化学习问题,如果我们的目标是最大化一段时间内的奖励总和,我们需要平衡这两个目标。

举一些例子:如果你在一个新城市,探索就是尝试新餐馆,利用就是去你最喜欢的餐馆或你认为最好的餐馆。强化学习的一个非常常见的用途是确定在哪里放置哪些广告,利用就是选择最成功的广告并向用户展示,探索就是尝试随机选择不同的广告并向用户展示。或者,最后一个例子,在石油钻探中,你不知道在哪里能找到石油,所以利用就是在你以前发现的、能产出石油的最佳地点进行钻探,而探索则是在新地点钻探。

探索的难度与问题分类

探索相当困难。如果我们想设计一个探索算法,我们可能会思考什么是探索的最佳策略,以及如何在探索和利用之间进行权衡。我们还需要思考,探索的最优性甚至意味着什么。

强化学习问题范围很广,从更简单的问题(你可以实际分析策略是否最优)到更复杂的问题(分析是否最优以及开发能够在探索方面表现良好的算法变得棘手)。在简单的一端,你从多臂老丨虎丨机开始,这是一种没有状态的单步问题。

然后,如果你想让它更复杂,你可以添加上下文,为你所处的状态添加某种特征。然后,你可以转向小型MDP,再到大型MDP。本课程中我们讨论的很多问题都是没有任何已知结构的大型MDP,这些是获得良好探索策略以及从理论上思考探索最困难的问题。

多臂老丨虎丨机中的探索

在讨论大型问题中的探索之前,我们先花点时间谈谈老丨虎丨机,因为它们提供了一种思考探索的好方法,并且实际上在实践中用于各种问题。具体来说,我们可以这样思考老丨虎丨机:它不是那种到处跑、可能试图抢劫你的人,而是强化学习的一种表述。

在这种表述中,每个回合的时间范围只有一个时间步长。没有状态。与我们迄今为止在MDP中讨论的所有内容不同,你的奖励实际上是随机的。

所以,如果你回想之前的例子,你可以把选择餐馆的问题看作一个老丨虎丨机问题,例如,你可以选择去一家餐馆,选择去另一家餐馆,等等。根据你在之前选择餐馆的回合中的经验,你可以决定是选择一家你对奖励一无所知的新餐馆,还是去一家你过去获得过高奖励的餐馆。奖励是随机的,因为你在那家餐馆的体验可能每次都不一样。这就是老丨虎丨机问题的样子。

现在,如果我们想思考探索有多好,以及我们的强化学习算法有多好,我们需要思考相对于我们最优行动能获得多少奖励。到目前为止,我们一直在思考奖励的总和,通常是跨回合平均的。在老丨虎丨机问题中,你实际上经常思考整个强化学习过程,以及探索后利用的强化学习过程的最优性。

假设到目前为止你已经进行了T个回合。那么你能做的最好事情就是采取最优行动的期望奖励乘以T。这在某种程度上是一个“先知”。当你开始时没有进行任何回合,你基本上被迫采取随机行动,因为你对MDP一无所知。所以,这有点像事后看来,你能做的最好的事情,这是你在T个回合后可能获得的奖励总和的上限。

然后,如果我们想思考我们做得有多好,我们可以思考这个上限减去我们从我们采取的行动中实际观察到的奖励总和。这就像从t=1到T的求和,我们决定在每个特定回合中采取的实际行动。这两者之间的差距将衡量一种最优性差距。这个表达式被称为“遗憾”。它衡量的是,与我们采取最优行动相比,我们对我们所采取的行动感到多少“遗憾”。

现在,如果你思考遗憾随时间的变化。这里,时间实际上索引的是回合,因为每个回合只是一个时间步长。所以,我们思考的是作为回合数函数的遗憾。如果你采取最优行动,你会得到什么样的曲线?在这个图上,如果你实际上是最优的,这将是0,并且随着你进行越来越多的回合,它将是0。这是期望值,可能会有一些随机性。所以你会得到一条看起来像这样的曲线,这有点像最优情况。

实际上,在实践中实现这一点并不真正可能,因为在第一步,正如我提到的,你必须采取随机行动。现在,有没有人想过,如果你只是随机采取行动,这条曲线会是什么样子?是的,它会持续增加。所以,如果你随机采取行动,采取最优行动和随机采取行动之间会存在差距。例如,如果你总是选择动作a1,而a1不是最佳动作,那么在一个回合后,你预计会有某种非零遗憾。所以你会得到一条看起来像这样的曲线。然后,如果你在下一个回合再次选择a1,那么你将再次产生最优奖励与你所获奖励之间的相同差异,所以这会增加。你实际上会得到一条线性的曲线,这意味着基本上在每个时间步,最优奖励与你所获奖励之间存在固定的差异。所以,每当你的遗憾线性增加时,这意味着你的算法实际上并没有改进,它实际上并没有利用探索来获得更好的奖励。

相反,如果你的算法更聪明一些,那么你会期望有次线性遗憾,所以你期望的不是遗憾随时间线性增加,而是让这条曲线看起来像这样:它开始时看起来有点像线性,然后最终,如果你在探索后达到最优行为,那么它会变平,变成这样。你可以想象,这部分是你现在处于利用阶段,而之前的阶段是你在探索和收集关于问题的信息。

问题:为了绘制这些曲线,我们是否多次运行学习过程然后取平均?对于这些曲线,实际上每条曲线只是一个强化学习过程,它们在这里非常平滑,在实践中,它们会有一点噪音。最优情况,这有点像期望值,所以会很平滑,但在现实中,你可能会有这样的情况:例如,在某一个时间步你运气不好,这条线上升了,因为你不走运;也许在下一个时间步,你仍然采取了最优行动,但运气好,所以实际上在实践中会有一些噪音。

所以,问题是,如果我们采取随机行动,为什么它是线性的,为什么它以固定量增加?如果你采取随机行动,如果你多次运行,它会有噪音。在期望中,它将是线性的。如果你有一个确定性的MDP,并且你总是通过一个非常不聪明的策略选择动作a1,并且奖励更确定,那么你实际上可能会得到一条看起来像这样的曲线。

所以,问题是,如果我们总是采取a1,那么我们实际上如何衡量这个公式?这实际上不是一个我们可以直接计算的公式。稍微回顾一下,这实际上不是我们的优化目标,我们旨在最小化遗憾,旨在让它变平,但这更多是用于分析的对象,而不是我们的优化目标,因为如果没有老丨虎丨机问题或MDP的知识,我们实际上无法衡量这个。

如果你在这里引入一个期望,那么你会期望它是单调的;如果没有,那么因为奖励是随机的,你可能会遇到这样的情况:例如,最佳动作是a5,获得高奖励的概率是90%,10%的时间你得到低奖励,那么当你得到高奖励时,相对于平均的专家,它实际上会下降。但如果你把这个写成强化学习算法的期望,它将是单调的。

探索策略

很酷,所以这是遗憾公式:在进行T个回合的强化学习后的遗憾,最佳行动的期望奖励(基本上是我们如果知道老丨虎丨机情况所能期望的最佳情况),然后减去实际采取的行动的奖励。

有多种简单的探索策略,包括一些你可以证明是最优的策略,你通常可以分析算法并提供关于遗憾的理论保证。此外,即使那些你可以在理论上做出一些保证的算法,在实际中的表现也可能有所不同。

为了获得更多直觉,实际上在我们这样做之前,我们将在一分钟内玩一个游戏,但在此之前,让我们谈谈不同的探索策略。具体来说,是在老丨虎丨机中,而不是在MDP中。

一种方法是,当你在选择不同的餐馆时,例如,如果你没有探索过一家餐馆,那么你可以选择对那家餐馆持乐观态度。这将激励你去探索新餐馆,而不是总是对你以前尝试过的餐馆贪婪。

所以,这种方式可以这样运作:你可以跟踪你过去对每个行动获得的平均奖励。然后,如果你想利用,你只会选择迄今为止你看到的具有最大平均奖励的行动。

但是,如果我们想鼓励算法访问新事物,那么我们仍然希望访问我们认为具有高平均奖励的行动,这样如果我们去了一家非常糟糕的餐馆,我们可能就不会再去。但我们将在我们的奖励估计上添加一个项,即某种奖励估计的方差。

这基本上是说,如果这个方差很高,这意味着我们对该行动的奖励不确定。如果我们不确定,那么我们基本上会在这个平均奖励估计之上给予某种奖励加成,以鼓励我们的算法探索那些不确定的或具有高方差的事物。

所以这里的直觉是,我们假设未知事物会是好的,直到我们实际观察到它们,如果我们观察到它们并且它们真的很糟糕,那么我们将来会相应地行动,方差会下降,奖励估计也会下降,这是一种平衡利用和探索的方法。

所以问题是,在这种情况下,你如何选择一个你以前从未见过的行动?如果你以前从未见过一个行动,那么你的方差估计可能像是无限的,然后这会鼓励它首先至少探索所有它没有探索过的行动,然后从那里开始,你对一个行动的方差估计或不确定性会随着时间的推移而下降。是的,所以这基本上是说,如果你以前没有做过任何事情,它会激励你先去访问那个行动。

很酷,这是一个流行的算法,你实际上可以推导出它的保证,它被称为上置信界算法的一个版本。还有另一种方法,实际上很难证明其保证,但在实践中可能效果很好,我们实际上在上次讲座中看到了类似的东西。本质上,你试图做的是估计从老丨虎丨机的每个臂获得高奖励的概率。

所以,这种方式会这样运作:你假设每个行动都有某种奖励分布。这定义了一种部分可观察的MDP,其中你不知道奖励函数的参数,你不知道你会得到高奖励还是低奖励。

因此,你将尝试建模并形成获得奖励的可能性的估计,通过尝试对这些参数和你的不确定性进行建模。

所以,你将根据迄今为止看到的任何数据形成一个估计。然后,你实际上会从你对世界可能MDP的模型中采样一个MDP。

然后,你会采取最优行动,假设你的采样是正确的。

然后重复这个过程,再次更新你的信念,然后采样一个新的MDP并重复这个过程。

我们将通过一个例子来讲解,但这里的直觉是,你可以迭代地改进你对老丨虎丨机的模型,并根据你的MDP模型所涵盖的潜在概率集合中的一个模型来行动。

最后一点,这些方法在工业界被广泛用于推荐系统和广告投放的研究和应用。我们到目前为止讨论的所有内容都是针对这些小型老丨虎丨机问题的,但它们实际上对许多实际问题非常相关,即使你没有更长的回合或带有状态的回合。

探索策略实践:一个游戏

现在,让我们玩一个小游戏,以获得一些关于这是如何运作的直觉。这里有一个小模拟。假设你被聘为一家著名研究医院的药物开发主管。事情进展顺利,现在出现了一种瘟疫,你需要找出哪些药物对应对瘟疫有效,你想通过给病人最有效的药物来拯救生命。

现在,你可以将此视为一个老丨虎丨机问题,其中每种药物你不知道它的效果如何。我们可以说,也许有大约5000名患者,你正在考虑大约10种不同的药物。你的目标是尝试理解,尝试拯救生命,尽可能多地累积拯救生命,但也要平衡现在拯救生命和未来学习每种药物信息时拯救生命。

很酷,那么让我们来玩,谁想建议一种药物?药物一,好的,我们看到我们给病人用了药物一,病人活了,这很好。谁想选一种药物?是的,4号,好的,我们也看到病人活了,进展不错。是的,1号,好的。10号,好的。7号,好的。所以1号、4号和7号目前看起来比10号好。其他人?是的,6号,仍在探索,病人死亡。5号,好的,不太好。行。7号,好的,也许我们想开始探索,病人又活了,所以这看起来相当不错。你想试试?行。2号,病人死亡,不太好。啊。是的,7号,好的,病人又活了,很好。我们接下来想做什么?7号,好的,我们想继续用7号吗?病人死亡。行。8号,病人死亡。7号,病人活了,我们应该继续用7号吗?试试9号。病人活了。试试1号。病人死亡?哦,病人活了。再试一次,病人死亡。9号,病人活了。3号,病人死亡。9号,病人活了。好的,我们喜欢9号。也许我们继续用9号一段时间。病人活了很多次。很好,有一个病人死亡。

所以,假设我们继续用9号一段时间。然后我们实际上可以绘制遗憾,所以。这是药物的真实疗效,我们可以看到9号实际上是最好的,所以我们找到了最好的,这很好,7号也相当不错。然后我们还可以绘制不同算法拯救的生命数量,这里越高越好,我们看到在这种情况下,后验采样方法(后验采样所做的是对每种药物的疗效概率进行建模,然后根据其估计选择更好的药物)的表现,我们在这里的表现是紫色的,有点难以分辨,因为有点小,但我们可以看到,总体上我们相对于算法做得相当好。

然后,你还可以绘制随时间变化的遗憾,实际上在这里我们可以看到,我们实际上比所有算法做得都好,所以你们相当不错,也许其中有一些运气成分,因为这只是单次运行。这些不同的算法是:贪婪算法显示为绿色,贪婪算法只是随着时间的推移选择你迄今为止看到的最好的东西,尤其是在你进行越来越多的试验时(越来越多的患者,越来越多的广告投放等),在这种情况下,它变得糟糕得多。我们看到后验采样(黄色)显然是这里最好的算法。其他算法:红色显示的是ε-贪婪,蓝色显示的是UCB(我们讨论的第一个算法,对不确定行动持乐观态度)。所以这基本上显示了不同算法之间的权衡。需要注意的一点是,ε-贪婪更偏向贪婪,所以我们看到当患者较少时,它实际上比UCB做得更好,但从长远来看,UCB做得更好,因为它实际上更倾向于确保你探索更多行动,所以从长远来看,它能够在未来采取更优的行动。

从老丨虎丨机到更复杂的环境

那么,对于机器人、语言模型和更大的MDP,探索是什么样子的呢?

不同的人对此有不同的看法,我对此持有些悲观的看法。特别是,实际上有很多研究试图将这些思想推广到更大的MDP。例如,你可以尝试制定一个估计,判断你是否采取过某个行动,并为访问新状态、采取新行动给予奖励加成。同样,像后验采样一样,你可以尝试找出不同动态的模型等等,并相应地行动。

但归根结底,当你处于一个非常大的MDP中时,从头开始的探索通常是难以处理的。例如,如果你随机初始化一个Transformer语言模型,并尝试弄清楚如何让用户满意或其他奖励函数(如点赞等),实际上仅仅使用点赞来从头开始训练语言模型是行不通的,可能的令牌空间实在太大了,至少相对于大多数用户将拥有的耐心而言。同样,在机器人领域,如果你试图学习如何将一个杯子里的水倒入另一个杯子,你可能会被困在只是随机移动手臂的阶段,而不是实际做有用的事情,如果你完全从头开始。

相反,在这些更大的领域中,探索通常严重依赖于演示或基于数据和演示进行预训练的基础模型。例如,强化学习在语言模型中非常成功,特别是在你有一个强大的基础模型的情况下,该模型已经知道如何写出连贯的句子,并且已经大致知道如何处理某些类型的提示或问题。同样,在机器人领域,如果你有实现高奖励的示例行为的演示,那么将其作为强化学习的起点是非常强大的。

总的来说,这些模型提供了一个对探索非常优秀的初始化,并能在可能的情况下寻找潜在的事物。同样,使用塑形奖励也很有用,因为它可以指导任何探索过程。如果你在模拟中,你可以手动编码密集奖励,或者如果你从偏好中学习单步奖励,那实际上也提供了相当密集的奖励信号。

这并不是说你不能将这些想法与演示和基础模型结合起来,但一般来说,从这种初始化开始,你会走得更远。

元强化学习中的探索

好的,尽管如此,仍然存在一个我们上次开始讨论的探索问题,既然我们已经开始学习标准MDP中的探索,我想重新审视一下。

确切地说,这里的想法是,如果你处于这类MDP中,状态空间是巨大的,所有可能的行动也是巨大的,这是一种使模型偏向于将获得高奖励的那部分状态空间的方法。

是的,给予一种偏向,比如“这些是我希望你做的事情”。好的。具体来说,我想讨论的是,假设你有一个已经训练好的模型,你可以做各种各样的事情,但在实际部署该策略时,即使你有很多先验经验,你可能仍然需要在测试时进行探索,因为你可能没有获得高奖励所需的所有信息。

所以,我们周三讨论了几个例子,例如,你可能需要在厨房里找到食材,为此你不能只是开始烹饪,你需要打开抽屉、打开橱柜等来尝试寻找信息。其次,在语言模型推理中,你可能需要探索可能导致问题解决方案的不同策略,而不是简单地开始编写你认为可能导致解决方案的令牌。

我们讨论过这种元问题,我们正在优化一个带有历史或记忆的策略,一般来说,记忆应该允许智能体能够探索和利用,因为它们能够尝试不同的行动,记住它们做了什么,然后利用这些关于食材位置的信息来解决问题。

但我们讨论过,如果我们用端到端的目标一起优化探索和利用,这很困难,因为我们有这个“先有鸡还是先有蛋”的问题:如果我们还没有学会如何探索,那么我们实际上无法获得高奖励,因为我们没有找到食材;同样,如果我们还不知道如何完成任务,那么我们对任何探索行为都会得到低奖励。存在这个耦合问题。

我们还讨论了一些更容易优化但可能导致次优性能的替代探索策略。我想讨论的是一种方法,它既能获得最优的探索和利用权衡,又能高效训练,所以它有点两全其美。

这个想法实际上将建立在上一个替代探索策略的基础上。

基于任务识别的探索

这个想法是,对于不同的环境或任务,你可以尝试拟合一个动态模型和一个奖励模型。

然后尝试以告诉我们更多关于环境模型信息的方式进行探索。

这应该激励智能体或策略去寻找额外信息,以一种与执行任务解耦的方式进行探索。

所以,如果你这样做,并且你有对应于导航到不同圆圈的MDP,然后你激励它采取导致更好的奖励模型和动态模型的轨迹,你实际上会得到一条看起来像紫色轨迹的轨迹,它明确地尝试访问那些允许它学习奖励函数将在哪里的状态。

现在,这可以学习高效的探索策略,但它也有缺点,在某些情况下可能是次优的。例如,如果有干扰物,比如墙上的图片,那么它会查看墙上所有的图片,以学习这些不同环境的好模型。

所以,我们可以在这个想法的基础上,尝试在不学习模型的情况下学习如何探索。具体来说,与其尝试学习动态和奖励模型,我们可以尝试能够预测任务是什么。

所以,我们将用标识符μ标记每个任务,这可以是一个独热编码的索引,也可以是一个语言描述,或者是一些更连续的任务描述,比如连续向量。

然后,我们可以做的是,尝试以一种允许我们预测当前任务的方式进行探索。

例如,我们将有……假设我们有两个策略:一个探索策略和一个利用策略。在实践中,你可以将它们结合起来,但将它们分开思考是有帮助的。我们将有我们的探索策略,这是我们的探索策略,它将在特定任务中产生一些经验。

我们的目标是让它能够探索,能够辨别不同的任务。所以,我们可以单独训练一个模型,该模型将根据我们迄今为止收集的经验来预测任务标识符。

如果我们这样做,那么这种探索目标与执行任务完全分开。这里的目标是能够预测任务标识符。然后与此分开,我们可以训练一个策略,该策略尝试执行任务,仅使用任务标识符。

这只是多任务学习或多任务强化学习,我们可以仅通过优化奖励来训练它,它不依赖于良好的探索。

所以在这里,我们能够解耦执行的目标,使其不依赖于探索,并拥有一个仅基于识别任务的探索目标,该目标不依赖于你执行任务的好坏。

所以,在幻灯片上,我们训练一个策略和一个任务识别模型,以便我们收集允许准确任务预测的数据。然后我们还将训练一个以任务ID为条件的策略,以便为每个任务最大化奖励。

所以,哪一部分是探索?是预测标识符的模型吗?探索实际上是这里的这个策略,而这个模型实际上将用于这个策略的奖励,所以这个策略的奖励将基本上是这个模型识别任务的好坏,或者基本上是任务识别模型的负误差。

好问题。问题是,这能推广到新的、未见过的任务类别吗?实际上可能难以推广,我们将在讨论元测试后讨论这个问题。所以,这大致是训练的工作原理。然后在测试时,如果你已经训练了所有这些不同的东西,那么你可以使用你的探索策略运行以收集经验,然后将该经验输入你的任务识别模型以获得任务ID,然后将该任务ID作为输入提供给你的执行策略以执行任务,所以你将探索,然后识别任务,然后利用。

回到那个问题,这样做的好处是你不需要建模动态或奖励,你只是学习这个预测任务标识符的模型,但如果任务标识符只是一个像独热编码的向量,这可能不会很好地推广到新任务,我们将在下一张幻灯片上看到一个解决方案。

问题是,这与我们之前讨论的黑盒元强化学习的主要区别是什么?我们仍然采样不同的MDP,主要区别仅仅是探索部分的目标。我想有两个主要区别:一是探索部分的目标,二是这里我们将最大化奖励,类似于黑盒元强化学习,但我们实际上会给予它这个任务标识符,这样它在尝试学习如何执行任务时就不需要依赖于探索或良好的探索策略。

改进:学习压缩的任务表示

现在我们有了这个泛化问题。实际上,我们也有办法解决这个问题。

与其直接使用这个任务标识符,我们实际上可以尝试学习一个更压缩的任务表示,它将比像独热向量更有效地泛化。

例如,当我们学习执行策略时,我们还将识别解决任务所需的信息。

所以,假设我们的标识符包含一些相关的东西和一些不相关的东西,比如它包含墙的颜色和装饰等信息,但也包含食材位置的信息。

那么,我们希望使用……类似地,如果你有一个独热向量,它也可能包含不相关的信息,因为你可能有两个厨房,食材放在同一个地方,但其他东西是虚假的。然后,我们将尝试对这个表示进行瓶颈压缩,以压缩掉解决任务不需要的东西。

如果我们能做到这一点,那么这种表示应该能更好地泛化。

然后,当我们学习探索时,不是学习探索以能够预测这里的标识符,而是学习探索,以便我们能够恢复这个压缩的任务表示。

所以,尝试能够探索,以便你能够预测这个任务的Z表示是什么。

现在,你如何在神经网络中实际压缩表示?在我们深入这个算法的细节之前,让我们先谈谈这个。所以,我们有我们的任务标识符。

然后,我们希望有一个神经网络用它来预测Z_i。

然后,我们将有一个策略,它接受这个和状态,并输出动作。

如果我们端到端地训练整个东西,它不一定有动力在这里实际压缩信息,例如,实际移除关于装饰的信息。所以,我们可以做的一件事是,我们可以简单地向这个表示添加噪声。

所以,如果你取这个,而不是直接把它输入这里,你可以取这个输出Z_i。然后在这里,你基本上可以添加一些噪声。所以,你在这里做的是添加一些噪声,其中噪声是从高斯分布中采样的。

如果你添加噪声,那么这将丢弃信息,因为添加噪声会破坏这个信号。

但你可能会丢弃一些好的信息。特别是如果你只在测试时这样做。现在,原则上,你也可以用这种噪声进行训练,以鼓励它从Z中丢弃信息。

但是,如果你用这个噪声作为输入来训练策略,那么它可能只是增加这里Z的幅度,使得噪声的幅度相比之下小得多。

所以,如果你只是添加噪声,模型可以补偿,仍然通过这个任务表示传递大量信息。

所以这不是一个很好的解决方案。但是,我们可以做的是,我们也可以防止模型增加幅度。

我们可以添加一个损失,修改我们策略的训练损失,使其包含一个最小化Z幅度的项。

如果你这样做,那么现在如果它增大了Z的幅度,它将在这里有很高的损失,所以它将被迫降低那个幅度,以便它实际上被迫移除不需要的信息,并且它引入的任何幅度(它将被激励只包含预测动作所需的信息)都将被保留。

这被称为变分信息瓶颈,这是一个花哨的术语,意思是添加噪声,然后修改你的损失项以包含这个对表示的L2惩罚。

之所以被称为变分信息瓶颈,是因为这个目标实际上等同于最小化你的……如果你把它看作一个分布,因为现在有一个高斯分布,均值为Z_i,方差根据ε的方差,这等同于最小化该分布与单位高斯分布之间的KL散度。

所以问题是,为什么我们要创建一个独热向量的表示?所以,如果我们回到之前讨论的算法,我们探索以生成经验,然后尝试识别任务,然后以该任务为条件,如果我们想快速解决一个新任务,那么我们将能够使用我们的策略进行探索,但在我们探索之后,如果我们的表示在这里是一个独热向量,如果是一个新任务,那么该新任务可能无法清晰地匹配之前的某个独热向量,所以我们希望有一个更连续的空间,更紧凑地表示任务,并本质上学习这个潜在的任务表示,它将泛化到新任务。

是的,所以问题是,我们不需要更多关于任务的信息吗?比如两个任务是否彼此相关?现在,我想,当你想到独热编码时,它似乎不一定捕获那么多信息,但独热向量实际上比更连续或更离散的表示压缩得更少。例如,假设你的一个任务是去这里,这是任务一,任务二是去这里,任务三是去这里,任务四是去这里。那么任务一和任务四非常相似。但当你使用独热向量表示它们时,它们被完全分开表示,如果你尝试学习一个压缩这些的任务表示,那么它将学习一个使这些更接近的表示。

问题是,你需要将ε添加到损失中吗?所以它不会进入损失,但在实际训练神经网络时,你需要添加它,所以你添加噪声,并且你每次重新采样噪声,ε是从这个分布中采样的,你可以大致认为这个分布进入了损失。但你不需要将ε添加到损失中的任何地方,它只是归结为这个。

完整算法概述

好的,那么让我们完整地走一遍这个算法是什么样子的。首先,让我们谈谈仅执行任务,与探索分开。所以我们的目标是学习这个任务表示,这个潜在的任务表示,以及如何解决任务。

为此,我们将有我们的任务标识符,我们将有一个网络产生Z_i。我们将添加噪声以获得Z_i + ε。然后,我们将把这个和状态传递给我们的执行策略,该策略将产生一个动作。

我们可以把这看作有两个部分。所以我们有这里的执行策略,它以有噪声的Z_i和状态作为输入来产生动作。然后我们还有这里的这个部分,我们将其写为某个编码器F,它从μ_i映射到Z_i。

我们可以把它写成一个分布,因为如果你把这种噪声折叠成一个分布。这将是一个分布,是一个高斯分布,均值为Z_bar_i,方差为……让我们把它写成方差。所以,我们有两个有参数的东西:F和π,我们将训练这两个神经网络以最大化奖励,这样我们实际上在学习我们的表示,以便我们能够解决任务并预测最大化奖励的动作。

然后,我们还将添加对Z的正则化项。

所以,我们的目标在这里将是最大化我们的执行策略下的期望奖励总和。

既然我们在这里最大化,我们也将最小化这里的这个项,这等同于KL散度。所以我们将最大化负的KL散度,介于F(Z_i | μ_i)和这个单位高斯分布之间。在幻灯片上,有这个目标,这只是试图解决任务,并基于任务ID学习潜在任务表示。

它将是一个向量。所以Z将是一个向量。是的,它将是一个向量。所以问题是,为什么我们要添加这个信息瓶颈或这个KL散度?原因是我们想学习一个很好的任务表示,它丢弃信息,如果我们不添加那个项,那么这里的这个Z,这个任务的表示可能仍然包含很多与解决任务无关的信息,所以它可能包含,例如,如果你有两个任务,食材放在完全相同的地方,但环境发生了变化,比如墙的颜色不同或不同的物体放在不同的地方,但这些与解决任务无关,那么Z将包含那些无关的东西,然后当你去探索时,你将探索与任务无关的东西。

是的,所以问题是,在训练期间我们被给予任务ID,我们在测试时实际上不需要它,那么当面对新任务时,泛化到新任务是什么样子的?当你面对一个新任务时,你将使用你的探索策略进行探索,然后预测一个……不是预测μ_i,你实际上将预测Z_i,你的潜在任务表示,然后将其输入你的执行策略以执行或利用任务。

问题是,你能训练执行策略关注相关部分吗?如果你有一个非常好的任务表示,其中没有不相关的部分,那么你可以跳过这些东西。基本上,将任务表示的那些部分归零。这适用于你没有独热向量,但你已经知道的情况,例如,如果你有语言字符串,一个任务是向左转,一个任务是向右转,另一个任务可能与向左转相同,你有它的任务字符串,它基本上与那个任务相同,另一个任务是向前移动。如果这些是你的不同任务,你可能已经可以摆脱,因为这可能已经是一个非常紧凑的表示,因为它告诉你是否在转弯,是否在移动,所以它已经告诉你不同任务之间的关系,所以如果你的任务表示告诉你这些关系,或者例如,如果你有一个任务表示,比如你要去的坐标,那么你将在这两个任务之间有一个非常相似的任务ID,这在这些情况下已经相当压缩,你可以跳过这一步,因为这些表示已经排除了不相关的信息。但如果你有一个独热编码或不提供信息的任务ID,那么你需要将其压缩掉,否则就没有像这样的更好的数学框架来鼓励它关注相关部分。我想,原则上,如果你有办法改变这个基于μ_i做决策的方式,你可能也能做到。

那么,输出分布有什么优势呢?这里的分布是允许我们压缩的东西,所以通过添加噪声或通过使其成为一个随机神经网络,我们能够从中移除信息,而如果你输出一个连续向量通过……有一些启发式的方法尝试压缩,例如,通过压缩维度,但你仍然可以通过甚至一维连续变量传递无限信息。所以,这是一种即使在理论上也能减少信息的方法。

探索策略的训练

现在让我们谈谈探索。我们在探索中的目标是能够尝试预测Z。我们将……我不知道我用了什么符号,所以我们的目标是尝试收集能够预测Z的数据。顺便说一下,在实践中,你可以同时训练这两个策略。

我们需要思考如何制定一个奖励函数,鼓励它能够预测Z。

我不知道,我就选一些符号。假设我们将学习某个模型,该模型试图根据我们收集的数据预测Z。

如果我们有一些一直在探索的探索策略,那么我们需要弄清楚如何相应地奖励它。

你可以做的一件事是,你可以收集一些数据,然后在一个轨迹的末尾,例如,看看你能多好地预测Z。然后让奖励成为Z的负预测误差,其他地方为零。但如果我们这样做,我们将有一个非常稀疏的奖励,我们只在轨迹的末尾有它。我们可以做的是,我们实际上可以在每个时间步增量地查看我们获得了多少关于Z的信息。

这将给我们一个更密集的奖励。具体来说,当我们通过探索训练我们的探索策略时,你可以把奖励……对于状态s_t和动作a_t,我们可以让它成为负的预测误差。在时间步t。这将是相当合理的。但是,在这个特定时间步的行动,我们实际上只获得了一个时间步的信息,如果我们想量化这些信息,我们实际上可以查看我们在前一个时间步的预测误差,并查看当前时间步误差相对于前一个时间步误差的差异,这就是我们从这个行动中获得的信息量。

所以,我们可以将奖励定义为在t-1时刻的预测误差减去在时间t的预测误差。所以,这有点像……这应该会随着时间的推移而减少。这基本上是说,相对于前一个时间步,我们在当前时间步预测Z_i的能力提高了多少?其中预测误差类似于Z_hat减去真实的Z_i。所以,我们正在训练这个模型,我们希望这有点像信息增益的近似。所以,如果我们查看直到当前时间步的所有状态,与前一个时间步的所有时间步相比,我们可以衡量这种信息增益的概念。

我想,也许为了让这更清楚一点,如果这是在时间t的预测误差,那么这意味着Z_hat是根据直到时间t的数据进行的估计。所以,轨迹中直到时间t的所有内容。

很酷,所以这就像许多研究算法一样,有一个有点牵强的首字母缩写词:元强化学习中的解耦无奖励探索和执行,或DREAM,你将在作业4中实现这个算法。

算法优势与总结

我们之前讨论过,如果你端到端地训练,比如如果你端到端地训练元强化学习方法,并且你试图同时优化探索和执行,你会有这个耦合问题。好处是你可以获得最优探索,缺点是效率非常低。

你可以证明,在相当温和的假设下,这个算法实际上将恢复最优的探索和利用。然后,如果你看效率,这是端到端优化挣扎的地方,你可以思考它。你可以构造一个简单的老丨虎丨机问题,其中这些不同的臂,臂0不是典型的动作,而是会告诉你什么是最优动作。所以,例如,如果你学习采取动作0然后采取最优动作的策略,那么这就像最优地探索然后利用。在端到端优化中,你实际上可以量化元学习过程需要多少样本,你会得到类似A^2 log A的东西,其中A是臂的数量或动作的数量,而DREAM算法只需要A log A,这里有一些假设,关于在算法的外循环中使用关键学习均匀探索,你可以查看算法的效率,DREAM能够以比使用端到端优化少得多的样本达到最优行为,端到端优化在图中显示为橙色,作为臂数量的函数。所以,随着问题变得越来越复杂,DREAM能够做得比端到端优化好得多。

我们也可以从经验上看一些东西,所以这是一个元问题的例子,其中不同的任务对应于去往不同颜色的不同物体。物体的颜色写在墙上,智能体从这里开始,它需要绕过墙,阅读颜色,然后去往正确的物体,所以它在探索,或者寻找信息,然后利用。它获得像素奖励,如果你比较这里显示的端到端算法,它们真的很难解决这种端到端的学习探索问题。

如果你使用我们周三讨论的替代策略之一,理论上可以做得更好,但你仍然有一个次优的探索策略,而使用这个算法,你实际上能够学习如何探索,比如去找标志,然后去往正确的物体,实际上是通过尝试解耦用于识别任务的探索和用于解决任务的利用。

很酷,然后你实际上可以看到这个,所以这是一个探索回合的视频,它在这个简单环境中走动并去阅读墙上的标志,然后阅读标志后,它能够去往蓝色的钥匙。

这是一个很好的问题,所以问题是,这是一个你可以先探索然后利用的场景,你可能也有需要交错探索和利用的任务,你需要先找到一些信息,用它来完成一个子任务,然后再进行一些探索。我们已经做了一些尝试将它们结合起来的工作,例如,你可以训练一个单一的策略,使用奖励来识别任务,并结合任务奖励,如果你感兴趣,我可以向你指出相关的工作。

总结与应用

好的,总结一下,端到端地学习探索和学习知道如何探索的策略可以学习最优的探索和利用,但如果探索很困难,优化起来就相当困难,我们看到了一个例子,所有的方法都趋于平缓,没有学习到良好的探索。

替代策略更容易优化,并且可以有原则,但也可能次优很多,并且在探索上效率很低。

而这种解耦的方法既能获得最优策略,也易于优化,所以它有点两全其美,它确实需要这个任务标识符,你至少需要能够枚举你的任务并知道你处于哪个任务中,这是它为了获得好处而使用的关键。

很酷,我们还有一点时间,所以你可以……我想简要地讨论一个应用,你可以将这个算法用于一个与我们之前所见略有不同的领域。

这个领域是尝试在不同的计算机程序中寻找错误。特别是,在计算机科学入门课程中,尽管这可能也适用于其他程序,对学生来说,能够编写计算机程序真的很酷,对他们来说,在学习编码时编写程序非常有成就感,然后就会创建像这样的程序。在code.org上,学生们编写这个叫做Boun的游戏,看起来有点像Pong或单边Pong,目标是将球击入球门。

在斯坦福的CS 106A课程中,学生们编写《打砖块》游戏,所以他们可能编写像这样的程序,这是一个有错误的游戏的例子,球实际上有点被球拍偏斜,它从球拍上弹开,而不是失分或失去一条命。

我们基本上

015:分层强化学习与模仿学习

在本节课中,我们将要学习如何利用分层结构来解决长视野任务。我们将探讨分层策略的核心思想、关键设计选择,并通过具体实例来理解分层模仿学习和强化学习系统是如何构建和工作的。


概述:为何需要分层?

在过去的几讲中,我们讨论了能够执行多个不同任务的多任务模仿学习和强化学习系统。我们首先从多任务模仿和强化学习的视角出发,探讨了策略或Q函数不仅依赖于状态,还依赖于某种任务描述符。最近,我们讨论了元强化学习,在这种学习中,智能体需要从少量示例和奖励经验中推断出任务是什么,并训练一个能够通过少量经验进行适应的策略。

今天,我们将在此基础上,探讨如何不仅训练策略执行多个任务,还能将多个任务的行为串联起来,以完成一个更长的、视野更广的任务。这就是分层方法发挥作用的地方,它有助于解决长视野任务。


长视野任务的挑战

长视野任务是指需要较长时间才能完成,并且可能包含一系列需要按特定顺序执行的子任务或步骤的任务。例如:

  • 烹饪一顿饭。
  • 机器人系统执行复杂操作。
  • 修复导致神经网络训练损失爆炸的Bug。
  • 自动驾驶汽车前往优胜美地。
  • 为长篇报告提供反馈。

对于AI系统来说,这些任务通常非常困难,原因如下:

  1. 状态空间广阔:完成任务需要访问大量状态,策略需要在更广泛的分布上保持成功。
  2. 错误累积与恢复:执行过程中有很多犯错的机会,并且需要能够从错误中恢复。
  3. 陷入困境:某些错误可能导致智能体无法取得进展,反复进入相同状态,从而陷入停滞。

分层策略的核心思想

分层方法的核心思想是将一个复杂的长期任务分解为一系列较小的子任务。

基本架构

我们可以构建一个两层策略架构:

  • 高层策略:接收当前状态(以及可选的高层任务目标),并输出一个中间目标子任务,供低层策略执行。
  • 低层策略:接收当前状态以及高层策略给出的目标,输出具体的动作,以尝试完成该子任务。

公式表示

  • 高层策略:g_t ~ π_high(s_t, G_high),其中 g_t 是子目标。
  • 低层策略:a_t ~ π_low(s_t, g_t),其中 a_t 是具体动作。

低层策略通常以更高的频率(例如,机器人控制为20Hz)运行,而高层策略则在更粗的时间尺度上(例如,每秒一次)规划新的子目标。

执行流程

以下是分层策略在环境中执行的基本步骤:

  1. 规划子目标:在时间步 t,根据当前状态 s_t(和可选的高层目标 G_high),从高层策略 π_high 中采样一个子目标 g_t
  2. 执行低层动作:对于接下来的 N 个时间步(或直到子目标完成):
    • 根据当前状态 s_t 和当前子目标 g_t,从低层策略 π_low 中采样动作 a_t
    • 执行动作 a_t,环境转移到新状态 s_{t+1}
    • 更新 t = t + 1
  3. 重新规划:经过 N 步后(或当低层策略发出完成信号时),返回步骤1,基于最新状态 s_t 重新规划新的子目标。


分层方法的优势

与单一的“扁平”策略相比,分层方法具有多个潜在优势:

  1. 中间监督信号:低层策略获得完成子目标的奖励,高层策略获得完成最终任务的奖励。这种中间监督有助于引导策略。
  2. 跨任务知识共享:低层多任务策略能更显式地在相似子任务间共享数据和知识。
  3. 结构化探索:高层策略在目标空间中进行探索,而非原始动作空间,这可以更高效。
  4. 计算效率:高层推理可以以比低层控制更低的频率运行,节省计算成本。


关键设计选择

构建分层系统时,需要考虑几个关键设计选择。

1. 目标表示

子目标或技能的表示形式至关重要,它通常取决于具体领域。

以下是不同任务可能的目标表示示例:

  • 机器人烹饪意大利菜:自然语言指令(如“打鸡蛋”、“打开橱柜”),或目标图像。
  • 校园内自动驾驶自行车:GPS坐标点(路径点)。
  • 起草法律简报的语言模型:自然语言描述的中间步骤(如“研究相关案例”、“撰写论点概要”)。
  • 规划一周假期的网络智能体:自然语言子任务(如“预订航班”、“查找酒店”、“安排每日活动”)。

选择目标表示时应考虑:

  • 表达性:能够描述多种不同的低层行为(如自然语言)。
  • 结构性:相似的目标应对应相似的动作,便于学习(如连续的GPS坐标)。
  • 抽象层级:既不能太具体(如“下一秒的精确速度”),也不能太抽象(如“去广场”),需要选择合适的粒度。

2. 各层级的监督

如何为高层和低层策略提供监督信号是另一个核心问题。

考虑一个“煮意面”的长视野任务,其步骤可能包括:找到锅、烧水、找到意面、煮意面。

  • 低层策略监督:训练低层策略 π_low(s, g) 完成特定的子目标 g(例如,“找到锅”)。其奖励基于是否达成该子目标。
  • 高层策略监督:训练高层策略 π_high(s, G_high) 输出一系列子目标,使得最终能完成高层任务 G_high(例如,“煮好意面”)。其奖励基于最终任务的完成情况。

重要注意事项:如果完全独立地训练两层策略,可能会出现问题。例如,低层策略“找到意面”可能只在“站在炉子前”的状态下训练得好,但如果高层策略在“刚找到锅”的状态下就命令“找到意面”,低层策略可能无法顺利执行。因此,通常需要让两层策略以某种方式协同适应,例如通过联合训练或微调,确保低层策略能在高层策略实际会命令的状态下有效工作。

3. 何时切换子任务

何时终止当前子目标并请求高层策略规划下一个?主要有两种方案:

方案一:基于完成状态切换

  • 做法:低层策略在预测动作的同时,也预测一个“任务完成”信号。当任务被判定为完成时,才请求新目标。
  • 优点:计算高效,高层策略无需在子任务执行中频繁推理。
  • 挑战
    1. 准确判断任务何时完成本身就很困难。
    2. 需要处理错误和异常情况(例如,东西掉了,需要重新执行“拾取”子任务,而非继续原来的任务)。这类错误可能导致智能体永久卡住。

方案二:固定时间间隔切换

  • 做法:每执行固定的 N 个低层时间步,就请求一次新的高层目标。
  • 优点:实现简单,避免了判断任务完成的难题。
  • 缺点
    1. 可能浪费计算(子目标已完成但仍等待)。
    2. 如果 N 太大,智能体在完成子目标后可能会“发呆”等待新指令。
    3. 如果 N 太小,高层策略需要更频繁地做出决策,计算负担增加,且决策错误的影响持续时间较短。

当前实践:由于方案一中判断错误的风险更致命,许多现有系统倾向于采用方案二,即固定频率查询高层策略。有时也会结合两种方案,例如尝试判断进度,但如果超过最大时间限制则强制重新规划。


实例分析

近年来,分层方法在机器人学和语言模型领域取得了显著成功。以下是几个代表性系统。

实例一:基于语言子目标的分层模仿学习

系统概述:该系统使用自然语言作为子目标表示,通过模仿学习训练分层策略来完成长视野机器人任务(如将多种物品装入袋子)。

数据准备

  1. 收集完成整个长视野任务的人类演示视频。
  2. 将视频分割成段,并为每一段标注语言描述(如“拿起袋子”、“用勺子舀取M&M's”)。标注可以在演示时实时进行,也可以事后进行。

训练过程

  • 高层策略:接收图像观测,被训练来预测当前片段对应的语言标签。
  • 低层策略:接收图像观测、关节角度以及高层提供的语言指令,被训练来预测机器人的关节控制命令(50Hz)。

使用DAgger进行协同适应

  1. 首先用模仿学习分别初始化高层和低层策略。
  2. 冻结低层策略,在线上运行整个分层系统。
  3. 当机器人即将犯错时,人类操作员通过语言命令进行干预(例如,说“向左移动手臂”、“举高一点”),覆盖高层策略的输出。
  4. 收集这些干预数据,并用其微调高层策略
  5. 微调后,高层策略学会了在低层策略可能出错的状态下,输出更精确的纠正性语言指令,从而实现两层策略的协同适应。

性能对比:实验表明,与训练单一的扁平策略相比,这种分层方法在任务完成进度上能带来约34%的提升。使用DAgger微调高层策略也比仅使用模仿学习效果更好。

实例二:基于图像子目标的分层模仿学习

系统概述:该系统使用生成的目标图像作为子目标表示,同样通过模仿学习进行训练。

工作原理

  • 高层策略:是一个图像生成模型(如扩散模型)。它接收当前图像观测和高级任务描述,生成一个未来期望状态的图像作为子目标。
  • 低层策略:是一个目标条件策略。它接收当前图像观测和生成的目标图像,输出达到该图像所描绘状态所需的机器人动作。

优势

  1. 无需语言标注:训练数据只需要任务演示视频,无需费力进行语言分段标注。
  2. 可利用丰富视频数据:高层策略的图像生成能力可以通过大量无标签的互联网视频(如YouTube)进行预训练,学习关于“未来可能图像”的常识,即使这些视频并非来自机器人领域。
  3. 对未知物体泛化性好:对于难以用语言描述的新物体,图像表示能更直接地捕捉其视觉特征。

性能:实验表明,在高层策略的训练中加入人类活动视频数据,能显著提升系统在应对未见过的物体时的任务成功率。

实例三:分层强化学习

虽然大规模成功案例目前多见于模仿学习,但分层强化学习也有其研究和应用价值。

基于状态目标的HRL:例如,训练一个四足蚂蚁机器人完成需要多步推理的任务(如推箱子搭桥过裂缝)。低层策略被训练为到达特定坐标点的目标条件策略。高层策略则被训练来输出这些坐标点作为子目标,并使用 hindsight experience replay 等技术来高效训练。

基于语言目标的HRL:也有工作尝试在强化学习框架下,让高层策略输出语言指令,并使用语言空间的后见之明重标记技术来训练。

技能发现:一个有趣的研究方向是无监督技能发现,即不预先定义子目标,而是让智能体在探索中自动发现有用的基础技能(如前进、后退、翻滚),然后再学习如何组合这些技能以完成复杂任务。这目前仍是一个具有挑战性的前沿领域。


总结

本节课我们一起学习了分层强化学习与模仿学习。我们了解到:

  1. 分层策略通过将长视野任务分解为子任务,并由高层策略进行规划、低层策略负责执行,可以有效应对长视野任务带来的挑战。
  2. 三个关键设计选择包括:子目标的表示形式、对各层策略的监督信号来源,以及决定何时切换子任务的机制。
  3. 实际系统展示了分层方法的有效性,特别是在模仿学习框架下,结合语言或图像作为子目标表示,并通过DAgger等技术进行协同适应,能显著提升复杂任务的完成能力。
  4. 分层强化学习虽然面临更大挑战,但在结构化探索和技能组合方面具有潜力,是无监督技能发现和更大规模应用的重要研究方向。

分层思想为构建能够解决复杂、长序列决策问题的智能系统提供了强大的框架。

016:机器人强化学习 🤖

在本节课中,我们将要学习如何让机器人通过强化学习实现自主学习和适应,减少对人类干预的依赖。我们将探讨自主强化学习的问题定义、核心挑战以及相应的算法解决方案。


为什么机器人还不能完全自主? 🤔

我们之前讨论了很多强化学习算法,也提到了模仿学习。在模仿学习中,智能体模仿专家提供的演示。而在强化学习中,智能体通过试错进行练习。这种练习的概念本身更具自主性,因为智能体是从自身与世界的交互中学习。

然而,当我们在物理机器人上运行这些算法时,它们实际上并非完全自主。一个关键问题在于“重置”。在传统的强化学习设置中,我们假设智能体在每次尝试任务后,都能神奇地“重置”回初始状态分布。但在现实世界中,这通常意味着需要人类手动将机器人或场景中的物体移回初始状态。因此,这个过程并非完全自主。

例如,一个学习抓取杯子的机器人可能会在尝试中打翻杯子。为了再次练习抓取,它需要以某种方式让杯子回到可触及的位置。这种“重置”需求在需要大量试错的强化学习中尤为突出,每次尝试都可能需要人工干预。


定义自主强化学习问题 🎯

那么,我们如何形式化这个问题呢?一种思路是简单地增加单次尝试的步长 H。理论上,减少重置频率(即增大 H)可以减少所需的人工监督,我们可以直接应用课程中学过的标准强化学习算法。

但在评估这类系统时,我们可能关心两种不同的目标:

  1. 部署策略评估:学习过程结束后,我们得到的策略质量如何?即,如果我们从初始状态分布启动这个策略,它能获得多高的奖励?其目标函数为:
    J(π) = E_{s0 ~ p(s0)} [ Σ_{t=0}^{H-1} γ^t r(st, at) ]
    这好比训练一个厨师,我们最终关心的是他学成后能否稳定地为顾客做出好菜。

  1. 生命周期奖励评估:在智能体整个学习和交互的生命周期中,它获得的平均奖励是多少?其目标函数为:
    J = lim_{H->∞} (1/H) * E [ Σ_{t=1}^{H} r_t ]
    这好比部署一个火星车,我们更关心它在整个任务期间收集科学数据的效率,而不是它最终学会了多好的策略。

本节课的算法将围绕这两个目标展开。


算法一:前向-后向强化学习 🔄

为什么简单地增加 H 会导致标准算法(如SAC)性能下降呢?主要有两个挑战:

  1. 状态漂移:智能体可能因错误操作进入难以恢复的“坏”状态区域,远离高奖励区域。
  2. 数据分布坍缩:即使智能体最终到达目标,它可能会一直停留在目标区域。导致经验回放缓冲区中缺乏从初始状态到目标区域的轨迹数据,从而无法学习到一个完整的、有效的策略。

一个直观的解决方案是:学习一个“后向”策略,在尝试完“前向”任务后,能够自主地回到初始状态或一个有利于再次尝试的状态。

以下是前向-后向强化学习的基本流程:

  1. 初始化,并从初始状态分布 p(s0) 中采样一个状态。
  2. 重复以下过程:
    • 运行前向策略 π_f:尝试完成任务,最大化前向奖励函数 R_f
    • 更新前向策略:使用你喜欢的强化学习算法(如SAC),依据 R_f 更新 π_f
    • 运行后向策略 π_b:尝试“撤销”任务,回到初始状态分布或某个预设状态。
    • 更新后向策略:依据后向奖励函数 R_b(例如,奖励回到初始状态)更新 π_b
  3. 无需重置,直接开始下一次前向策略尝试。

训练结束后,我们丢弃后向策略 π_b,只部署前向策略 π_f


算法二:学习重置至专家状态分布 🎓

前向-后向方法的一个缺点是,总是回到确切的初始点可能不是最高效的。更好的方法是让后向策略将智能体重置到“专家状态分布”中的某个状态,即任务演示轨迹所访问过的状态。这样,智能体可以从任务路径上的不同点开始练习,学习更全面。

这种方法需要少量专家演示轨迹。其流程与前向-后向类似,关键区别在于后向奖励函数 R_b 的定义:

  • R_b 的目标是鼓励智能体访问的状态与专家演示的状态分布相匹配。
  • 这可以通过训练一个判别器来实现,该判别器区分“来自当前策略的状态”和“来自专家演示的状态”。后向策略的目标是“欺骗”这个判别器,使其认为它访问的状态来自专家。

通过这种方式,后向策略学会将智能体带回到专家可能处于的状态,而不仅仅是初始状态,从而更有效地进行练习。


算法性能与基准测试 📊

在自主强化学习基准测试(如EARL)中,训练期间每20万步才允许一次重置。实验表明:

  • 标准SAC算法在这种低频重置设置下性能很差。
  • 专门为无重置学习设计的前向-后向RL及其变体(如学习重置至专家状态分布的方法)性能显著更好。
  • 在更复杂的任务中,能够重置到专家状态分布的方法通常表现最优。

这些算法已能在真实机器人上运行,实现完全自主的夜间训练。


算法三:任务图与循环练习 🗺️

对于学习多个相关任务的场景,我们可以构建一个“任务图”。智能体根据当前所处的状态,选择练习图中一个可行且合适的任务。

其流程如下:

  1. 初始化一个多任务策略 π(a|s, z),其中 z 表示任务标识。
  2. 重复以下过程:
    • 提议任务:基于当前状态 s,选择一个任务 z_i 进行练习。
    • 运行策略:执行多任务策略 π(a|s, z_i) 若干步。
    • 更新策略:使用对应任务 z_i 的奖励函数 R_{z_i} 更新策略。
  3. 同样,只有极低频的重置。

例如,一个学习制作咖啡的机器人,任务图可能包括“放置杯子”、“打开机器”、“取回掉落杯子”等。如果“放置杯子”失败,它就练习“取回掉落杯子”,成功后再继续“放置杯子”。这样,智能体总是在练习当前状态下最有意义、最能提升技能的子任务。


单次生命强化学习:部署中的适应 🚀

以上算法主要关注如何在学习阶段获得一个好策略。但部署后,策略仍可能遇到训练中未见过的情况并失败。“单次生命强化学习”关注的是:策略在单次部署尝试中,能否实时适应并从错误中恢复?

例如,一个在平地上训练的行走机器人,部署时遇到了未见过的小障碍,它需要在这一集(一次生命)内即时学习如何越过它。

简单地在线微调策略权重可能效果有限。两个改进思路是:

  1. 导向熟悉状态:当遇到困难时,不直接用任务奖励进行强化学习更新,而是尝试学习如何回到训练中见过的“熟悉”状态,这有助于摆脱困境。
  2. 在高层技能空间适应:不直接调整底层动作,而是利用预训练的技能库(如“前进”、“站起”)。在遇到新情况时,尝试组合或切换这些高层技能,能更灵活地解决问题。


总结 📝

本节课我们一起学习了机器人强化学习中的自主性问题。

  • 我们首先探讨了为什么传统强化学习需要人工重置,从而引出了自主强化学习的定义和两种评估目标。
  • 接着,我们介绍了三种核心算法思路:
    1. 前向-后向RL:通过学习一个后向重置策略来辅助前向任务的学习。
    2. 学习重置至专家状态:利用少量演示,让后向策略回到更有效的练习状态。
    3. 任务图循环练习:在多个任务构成的有向图中,根据状态选择练习任务,实现高效自主技能获取。
  • 最后,我们探讨了“单次生命强化学习”这一前沿方向,即策略在部署中如何实时适应未知挑战。

这些方法旨在减少机器人学习对人类监督的依赖,是实现长期、大规模、自适应机器人系统的关键步骤。

017:推进机器人智能 🤖

在本节课中,我们将探讨如何利用强化学习来推进机器人智能。我们将对比模仿学习与强化学习,分析强化学习在游戏、推理和机器人学等领域的成功案例,并深入讲解一个在仿真中训练、在现实世界中零样本部署的机器人运动控制方法。


上一节我们介绍了课程概述,本节中我们来看看模仿学习与强化学习的核心区别。

模仿学习与强化学习在成功应用上展现出不同的特点。以下是两者的关键对比:

  • 数据来源:成功的模仿学习依赖于离策略数据,这些数据由人类收集或生成,与最终要改进的策略无关。而成功的强化学习通常是同策略的,即用于生成数据分布的策略正是我们要改进的策略。
  • 数据使用:在模仿学习中,我们清理数据、获取优质数据集,然后用于训练模型。在强化学习中,策略执行期间生成的每一个数据点都可以用来改进和更新策略。这使得强化学习能够从正面和负面数据中学习,从而获得非常精确的行为。
  • 模型类型:模仿学习通常产生通才模型,即一个模型可以处理多种任务。强化学习则倾向于产生专才模型,或者帮助预训练的通才模型进行专业化。

这种对比并非说明一种方法严格优于另一种。实际上,它们经常结合使用,例如在围棋(AlphaGo)和大型语言模型中,先用模仿学习进行预热,再用强化学习进行提升。


上一节我们对比了两种学习方法,本节中我们来看看强化学习具体取得了哪些成就。

强化学习在多个领域实现了质的飞跃,这些成就往往是其他方法难以达成的。以下是三个关键领域的示例:

  • AlphaGo:它学会了玩围棋,并能够击败世界顶尖棋手。更重要的是,它通过发现人类未曾见过的新颖行为,超越了人类的能力
  • 大语言模型推理:通过强化学习(如DeepSeek的研究),模型在推理任务上的表现显著超越了仅使用模仿学习所能达到的水平。这展示了强化学习在处理长视野任务时具备连贯且精确的推理能力
  • 机器人灵巧性:在机器人领域,强化学习实现了高度的运动灵巧性,我们将在后续详细讨论。

那么,是什么共同因素让强化学习在这些不同领域都能取得巨大成功呢?我认为有两个关键要素:定义明确的奖励大规模策略执行能力


上一节我们探讨了强化学习的成功要素,本节中我们将这些要素应用到机器人学领域。

在机器人学中,要满足“定义明确的奖励”和“大规模执行”这两个条件,最接近的解决方案是使用仿真

  • 程序化奖励:在仿真中,我们可以获取世界的完整状态,从而以编程方式计算奖励。
  • 规模化评估:通过将物理问题转化为数字问题,策略评估可以随着计算资源的增加而轻松扩展。

这让我们能够“在仿真中解决机器人问题”,但这不等于“在现实世界中解决机器人问题”。因此,核心挑战变成了:如何训练仿真中的策略,并将其迁移到现实世界? 这将是本讲后续的重点。


在深入讲解方法之前,让我们先看看实际效果,以确信此方法是可行的。以下是基于强化学习在仿真中训练、并在现实世界中零样本部署的机器人(四足机器人)运动结果:

  • 复杂地形:机器人能在岩石、草地、斜坡、泥泞的施工场地、沙地等复杂地形中实时、自主(无外部计算)、盲视(仅凭本体感知)地行走。
  • 关键点:所有展示的结果都来自完全相同的策略权重,在现实世界中零样本部署,未针对任何特定地形进行调优。

那么,我们是如何做到的呢?这项名为“快速运动适应”(RMA)的工作发表于2021年。


第一阶段:在仿真中学习行走 🎮

基本思路很简单:将仿真视为现实世界,并利用所有可访问的信息。

我们训练一个神经网络作为基础策略 π_base。在仿真中,策略根据当前状态 s_t 和外部参数向量 e_t(我们称之为“外在向量”,编码了如质量、摩擦系数等环境参数)输出动作 a_t。仿真器模拟现实世界的一步,并返回更新后的状态 s_{t+1}

为了获得一个通用的策略,而不仅仅是适应单一场景的策略,我们在仿真中随机化所有物理参数(如质量、摩擦、电机强度等),并让策略能够访问这些参数。这样,策略在训练过程中就接触了巨大的参数变化范围,从而学会如何相应地行走。

我们使用的奖励函数 R 旨在跟踪目标速度,并最小化能耗和地面冲击力。整个系统使用PPO算法进行端到端训练,大约需要10亿个样本。


第二阶段:适应与部署 🌉

现在,我们有了一个在仿真中训练好的策略。但问题在于:现实世界中的外在向量 e_t 是未知的,且会随时变化(例如从地板走到沙地)。

关键思想是:在运行时以毫秒级的速度在线估计这个外在向量

我们用于估计的信号是观测历史,即一系列已执行的动作和实际观测到的状态。其原理是:如果你发出一个行走指令,但一条腿滑得比预期更远,那么指令信号与实际运动之间的差异就会告诉你发生了滑移。我们利用这个信号的历史来在线估计当前的外在条件。

那么,如何训练这个适应模块呢?我们回到仿真中,使用DAgger算法:

  1. 用学生策略(带适应模块) rollout 生成数据分布。
  2. 用教师策略(已知真实外在向量)的输出来监督学生策略每一步的预测。
  3. 通过监督学习更新适应模块。
  4. 重复此过程。

在部署时,基础策略以100Hz运行,而适应模块(估计外在向量)仅以10Hz运行(受限于机载算力)。实验表明,这足以获得良好的性能。


结果与分析 📊

关闭适应模块后,机器人在应对有效负载或泡沫地形等变化时表现明显下降,因为它无法检测到变化并调整步态。通过分析适应模块的输出,我们可以看到在滑倒或负载突变等事件发生时,其内部状态会发生相应变化,之后策略恢复稳定。

我们与多个基线方法进行了定量比较:

  1. 鲁棒策略:仅通过域随机化训练,不给策略提供外在信息。结果更保守,成功率较低,扭矩和急动度更高。
  2. 系统辨识:显式估计摩擦、质量等物理参数。这是一个更难的问题,且对最终行走任务并非必要,其性能甚至低于鲁棒的盲视策略。
  3. 推理时微调:在现实世界中 rollout 并改进策略。RMA 方法更接近上下文学习,适应速度更快(毫秒级)。
  4. 无适应模块:性能显著下降。

RMA 方法在成功率和效率上均表现最佳。


到目前为止,我们展示的都是盲视行走。但要迈向通用机器人模型,视觉感知是必不可少的。视觉对于跨越间隙、踩踏脚石或高效优雅地爬楼梯至关重要。

传统方法通常将视觉与控制解耦:先构建显式环境地图,再将地图输入控制器。这种方法存在根本缺陷:构建精确地图本身就是一个难题,且会引入信息损失和噪声。

在这项2022年的工作中,我们提出了一个不同的问题:我们真的需要地形图吗? 我们的假设是:不需要。相反,我们直接将视觉与控制耦合在最终系统中。


视觉-运动耦合方法 👁️

我们的系统在部署时,直接使用机载深度相机获取的以自我为中心的深度图像 d_t,连同本体感知历史 h_t,一起输入策略网络,输出动作 a_t

训练分为两个阶段:

  1. 第一阶段(快速训练):在仿真中,我们向策略提供完美的地形高度信息(而非渲染的深度图像),连同随机化的外在向量,使用强化学习(PPO)训练策略。这避免了渲染负担,训练速度更快。
  2. 第二阶段(适应训练):使用DAgger算法。我们渲染仿真深度图像,用第一阶段训练好的“教师”网络来监督一个能从真实深度图像中提取特征的“学生”编码器。同时,外在向量的适应模块也一起训练。

在最终部署的策略中,我们使用了RNN来处理历史信息,以提供更长的上下文(尽管Transformer可能效果更好,但RNN已足够)。


视觉-运动结果 🚀

使用该方法,机器人能够:

  • 自主跨越间隙和踏脚石。
  • 攀爬高度接近其身高的不均匀楼梯,并涌现出侧向移动腿等非预设步态。
  • 在光滑、崎岖的户外地形中稳健行走。
  • 所有任务均由同一套策略权重完成,无需显式地图或预定义步态。

与基线方法对比:

  • 盲视策略:在简单地形尚可,复杂地形失败。
  • 基于地图的方法:由于地图噪声,在需要精确脚部放置的复杂地形(如离散障碍、楼梯)上,性能甚至可能差于盲视策略。
  • 我们的直接深度方法:在所有地形上均表现最佳。

同样的“利用本体感知历史进行快速在线适应”的核心思想,可以推广到其他领域:

  • 灵巧手操作:同一策略可旋转具有不同物理属性(重量、摩擦、形状、质心)的物体,如纸筒、羽毛球、冰块、猕猴桃、立方体、杯子等。策略似乎利用本体感知历史进行接触检测,从而推断物体属性。
  • 无人机飞行:同一策略可控制形态差异巨大的无人机(重量差4倍,臂长差3倍),并能适应螺旋桨被网球击中的扰动。


未来挑战与展望 🔮

尽管取得了进展,我们距离能够执行人类所有任务的通用机器人模型仍有很长的路。以人形机器人为例,虽然已在行走、舞蹈等运动任务上取得进展,并在结合语言指令的简单操作任务上有所展示,但其可靠性和灵巧性远未达到人类水平。

回顾推动机器人运动成功的两个要素:

  1. 仿真:对于刚性体接触和运动,仿真已足够好。但对于涉及变形体(如面团、蔬菜切割)的复杂操作,仿真技术尚不成熟且计算缓慢。
  2. 奖励函数:为运动定义“跟踪速度”这样的奖励是直接且完整的。但为“切菜”这类操作任务定义奖励(如测量切片大小)则非常复杂、任务特定,且难以扩展。

展望

  • 仿真:有理由相信,随着算力增长,仿真技术会进步,能够模拟更复杂的交互。
  • 奖励:一个潜在的解决方案是训练一个通用的、理解世界的大型模型来提供奖励信号。虽然存在强化学习“攻击”奖励模型的风险,但即使最坏情况,我们也可以利用可扩展的人类标注来提供奖励。

最后,我们不应只将机器人学的目标定为达到人类水平。就像AlphaGo发现了超越人类的下法一样,由电机和硅基计算机驱动的机器人,有可能利用其特性,在速度、效率和敏捷性上超越人类能力,探索人类未曾设想的新行为。


本节课中,我们一起学习了如何利用强化学习推进机器人智能。我们从模仿学习与强化学习的对比出发,分析了强化学习成功的关键要素:明确的奖励和大规模仿真。随后,我们深入探讨了“快速运动适应”(RMA)方法,它通过在仿真中训练、并利用本体感知历史在线适应未知环境,实现了机器人运动策略向现实世界的零样本迁移。我们还看到了将视觉与控制直接耦合的方法如何提升机器人在复杂地形中的通行能力。最后,我们探讨了当前面临的挑战(仿真逼真度、奖励定义)以及对未来机器人超越人类能力的展望。强化学习为机器人解锁超越预设程序的、自适应且可能超越人类的智能行为提供了强大的框架。

018:前沿挑战与科研实践 🚀

在本节课中,我们将探讨深度强化学习领域当前面临的开放性问题与前沿挑战,并分享如何开展深度强化学习相关研究的实用建议。课程分为两部分:第一部分聚焦于深度强化学习在问题定义、方法及部署评估方面的挑战;第二部分则深入探讨如何有效地进行实证性研究。

第一部分:深度强化学习的开放性问题与前沿挑战

上一节我们介绍了课程的整体结构,本节中我们来看看深度强化学习在问题设定方面面临的具体挑战。

挑战一:问题设定的挑战

在许多现实场景中,奖励信号难以定义或非常延迟,这给标准的强化学习问题设定带来了挑战。

1. 奖励定义与验证的模糊性

  • 语言模型与偏好优化:当前基于人类偏好的优化方法看似有效,但研究表明,人类提供的偏好可能更看重模型的“自信度”和“与自身观点的一致性”,而非“事实准确性”。这可能导致模型优化方向偏离我们真正的期望。
  • 机器人学:在真实世界中,奖励通常是二元的(成功/失败)或在仿真中手动设计。即使有人类标注,对复杂任务(如判断机器人叠衣服的质量)提供精确奖励也非常困难且模糊。
  • 多目标平衡:实际系统通常需要平衡多个可能相互竞争的目标(例如,YouTube推荐算法需要同时优化“用户参与度”和“用户满意度”),如何定义和组合这些目标是一个难题。

2. 探索与未知目标的优化
人类的学习过程并非针对单一任务进行优化,而是通过广泛探索来学习。如何让机器智能体进行类似的、目标不明确的探索性学习,以获取更广泛的知识和技能,是一个开放性问题。

挑战二:方法层面的挑战

在问题定义之后,我们来看看实现这些目标在方法上面临的障碍。

1. 利用先验数据与知识

  • 现状与局限:当前主要依靠预训练模型权重或用先前数据初始化经验回放池来利用先验知识。但这可能过于局限,例如,预训练模型的最后一层可能已收敛到确定性输出,不利于在新任务上进行有效探索。
  • 超越先验:对于希望解决人类未解之谜的模型(如语言模型)或希望超越人类能力的系统(如机器人),它们需要在利用先验知识的同时,不被其过度约束。强化学习是实现这一目标的 promising 工具。

2. 利用世界模型与视频生成模型
视频生成模型蕴含了丰富的世界知识,理论上对学习行为很有用。但在实践中直接用于机器人控制存在挑战:

  • 分布外动作问题:如果模型只在特定策略的数据上训练,当评估新策略的动作时,其预测可能不准确。
  • 物理不准确性:生成的视频看起来逼真,但底层的物理动力学可能并不准确。
  • 潜在解决方案:1) 在更多样化的策略数据上训练模型;2) 将模型用于其他目的,例如在视频空间中进行规划(预测理想未来状态),而非预测具体动作的结果。

3. 规模化与长时程问题

  • 短时程与强在线依赖:当前大规模RL成功案例(如语言模型偏好优化、数学推理)多是短时程或极度依赖在线采样的。这难以推广到需要与人类或物理世界交互的长时程任务。
  • 价值函数的作用:对于长时程问题,准确的价值函数至关重要。但目前在大规模训练中,价值函数主要用于降低方差,其准确性尚不足以完全支撑类似Q学习的策略优化。
  • 批处理在线学习:在许多实际场景(如自动驾驶),以“收集一批数据 -> 更新策略 -> 重复”的方式进行学习更为可行。这种设置对算法的要求可能与典型的在线RL不同,例如,可能需要更具表达力的策略(如扩散策略)来保证批次内数据的多样性。

挑战三:部署与评估的挑战

解决了方法问题后,我们还需要考虑如何安全、可靠地评估和部署这些系统。

1. 安全性与高风险领域
在医疗、驾驶、法律等安全关键领域应用强化学习系统面临巨大挑战。

  • 形式化验证的局限:传统方法试图提供形式化证明或概率保证,但通常基于不切实际的假设,且难以覆盖现实世界中无数的场景。
  • 数据驱动的困境:最成功处理开放世界问题的方法是大规模机器学习,但这意味着需要收集大量(可能是不安全的)数据来教导模型,这本身存在伦理和实践风险。
  • 安全探索:如何让智能体在学习新技能时(如学骑自行车)能够安全探索,避免对自身或环境造成损害,是一个重要且未解决的问题。

2. 错误与可靠性

  • 幻觉与校准:语言模型会产生“幻觉”(自信地给出错误答案)。研究发现,经过人类反馈强化学习(RLHF)后,模型的校准性(预测置信度与实际准确性的匹配度)会下降。如何让模型更好地估计不确定性,并与人类有效协作,是一个开放问题。
  • 高可靠性要求:在无人监督的自主系统(如网络智能体、机器人)中,需要极高的可靠性。虽然强化学习结合在线数据已被证明能提升性能,但如何将其扩展到需要大规模高可靠性的场景仍需探索。

3. 评估的难题
与监督学习不同,强化学习缺乏可靠的离线评估指标。

  • 在线评估的必要性:由于策略会访问新的状态,最终必须通过在线运行策略来评估性能。
  • 通用系统的评估:对于一个旨在解决多任务的通用系统,需要在无数场景下进行评估,成本极高。
  • 开放性问题:1) 能否开发出至少能排除糟糕模型的离线指标?2) 能否选择有代表性的场景来高效评估通用性能?


第二部分:如何进行深度强化学习研究 🧠

在了解了领域的前沿挑战后,本节我们将视角转向研究者自身,探讨如何开展一项成功的深度强化学习研究项目。

如何选择研究课题

一个成功的研究项目需要两个核心要素:一个重要的问题,以及一个解决该问题的可行计划。两者缺一不可。

以下是选择课题的三步法:

  1. 重要性 + 计划:确认你研究的问题足够重要,并且你有一个初步的解决思路。
  2. 个人兴趣:你是否对这个课题感到兴奋?热情是克服研究中重重困难的关键动力。
  3. 诚实评估:如果 brutally honest,你的想法可能失败的原因是什么?即使考虑到这些风险,它仍有成功的机会吗?

问题驱动 vs. 想法驱动

  • 想法驱动:先有一个酷炫的想法,再寻找它能解决的重要问题。风险在于可能找不到真正重要或更适合该想法的问题。
  • 问题驱动:先锁定一个重要问题,然后寻找最佳解决方案。这能确保你始终围绕重要问题工作,即使解决方案事后看来有些简单。
  • 寻找瓶颈:在问题驱动的研究中,关键是要找到阻碍问题解决的瓶颈所在。攻克瓶颈才能带来最大的进展。

跨领域研究与避免完美主义

  • 打破领域壁垒:不要将自己局限在某个子领域。跨领域研究往往能带来新视角,发现原有领域研究者未意识到的问题,从而催生创新。
  • 拥抱不确定性:研究之初无法准确预测项目的影响力。不要执着于寻找“完美”的项目,重要的是开始尝试,在行动中学习和调整。

如何开展研究工作

研究充满风险,大多数想法不会成功。如何管理这些风险是研究艺术的一部分。

风险管理策略

  • 前置风险:在投入大量时间构建基础设施前,先设计简单实验来验证核心假设是否成立。这能尽早暴露致命问题。
  • 快速迭代:通过尝试大量想法来“创造运气”。快速测试,快速失败,快速转向下一个想法。
  • 并行探索:在项目初期同时探索多个方向或问题,在看到某个方向出现“生命迹象”后再全力投入。

让系统运行起来的技巧

  • 从能工作的简单版本开始:如果从头搭建的系统不工作,调试将极其困难。更好的策略是:先构建一个极度简化的、能工作的版本,然后逐步增加复杂性(更多数据、更复杂任务)。
  • 寻求外部意见:与同事、导师讨论,有助于跳出思维定式,重新审视问题或发现新的调试思路。
  • 重新审视假设:在研究过程中,你可能会发现最初的某些假设不成立。定期回顾并据此调整研究方向至关重要。
  • 合理界定项目范围:如果系统在加入所有酷炫功能后难以工作,可以考虑缩小范围,聚焦于当前方法能较好处理的核心部分,将其他挑战留作未来工作或论文的局限性说明。

何时应该转向(Pivot)
决定是否放弃当前项目转投新方向非常困难。一个有用的思维技巧是:将模糊的“是否转向”决策,转化为具体的“继续当前项目A”与“开始具体的新项目B或C”之间的比较。这能使决策更清晰、更少焦虑。

如何分享你的研究成果

研究的产出是知识与洞见。如果无人知晓,就等于没有产生 impact。因此,有效分享与研究本身同等重要。

克服分享的心理障碍

  • 这不是自我推销:你是在教育社区,分享有价值的新发现。
  • 分享失败也有价值:即使想法未完全成功,分享“什么不行”也能节省他人时间,并可能启发新的思路。
  • 知识诅咒:对你来说显而易见的事情,对他人可能并非如此。分享这些洞见同样重要。

清晰沟通的原则

  • 明确受众:假设受众知道得比你少,避免不必要的行话,提供清晰的背景回顾。
  • 结构清晰:在写作或做报告前,先用纸笔列出大纲和核心信息。
  • 持续练习与获取反馈:通过不断练习写作、演讲,并寻求真诚的反馈来提升沟通能力。

其他重要事项

  • 善用导师资源:在研究初期,不要试图独立完成所有事情。积极向导师和合作者学习,逐步承担更多责任。
  • 保持信心:研究本身充满未知、失败和拒绝,领域专家也比你更有经验。这些都不是你能力不足的证据,而是研究的常态。信心对于保持高效至关重要。
  • 当下正是好时机:尽管强化学习已取得进展,但现在正是从事相关研究的绝佳时机。当前的研究正以前所未有的速度转化为现实影响力,你的工作有可能贡献于未来的重大突破。


总结

本节课中,我们一起探讨了深度强化学习在问题定义、方法创新以及部署评估方面面临的一系列开放挑战,例如奖励设计、先验知识利用、规模化学习、安全性和评估难题等。随后,我们深入探讨了如何开展实证性研究,涵盖了从选题、风险管理、调试技巧到成果分享的全过程。希望这些内容能为你未来的学习与研究之旅提供有价值的指引和启发。

019:Q学习回顾教程 🎯

在本节课中,我们将要学习Q学习的基础知识。我们将从马尔可夫决策过程(MDP)的简要回顾开始,然后探讨在表格化环境中的Q学习算法,接着介绍参数化Q学习及其面临的偏差-方差权衡问题,最后讨论学习有效Q函数的一些实用技巧。

马尔可夫决策过程(MDP)回顾 📊

上一节我们介绍了课程概述,本节中我们来看看强化学习的基础框架——马尔可夫决策过程。

MDP为我们提供了一个与智能体交互的形式化框架。它由以下几个核心部分组成:

  • 状态(S):环境的所有可能情况。
  • 动作(A):智能体可以执行的所有操作。
  • 转移动态函数(T):定义了在给定状态和动作下,转移到下一个状态的概率。公式表示为:T(s' | s, a) = P(S_{t+1}=s' | S_t=s, A_t=a)
  • 奖励函数(R):智能体在特定状态执行特定动作后获得的即时反馈。公式表示为:R(s, a)
  • 起始状态分布:轨迹开始时的状态分布。
  • 折扣因子(γ):用于权衡即时奖励和未来奖励的重要性,取值范围在0到1之间。
  • 时间范围(H):轨迹的长度。

我们将在本教程中使用一个网格世界问题作为示例。在这个环境中,一个机器人需要导航到右上角的宝石处,同时避免中间上方的熔岩方格。

价值函数与Q函数 📈

在之前的课程中,我们重新审视了一组重要的对象,即价值函数。以下是它们的定义:

  • 状态价值函数 V^π(s):评估从状态 s 开始,并遵循策略 π 所能获得的期望未来回报。公式为:V^π(s) = E[Σ_{t=0}^{∞} γ^t R_t | S_0 = s, π]
  • 动作价值函数 Q^π(s, a):评估在状态 s 采取动作 a,然后遵循策略 π 所能获得的期望未来回报。公式为:Q^π(s, a) = E[Σ_{t=0}^{∞} γ^t R_t | S_0 = s, A_0 = a, π]

这两个量都是对当前状态(或状态-动作对)好坏的估计,为策略应该采取何种行动提供指导。

状态价值函数仅基于状态,估计从给定状态开始,遵循策略能获得多少回报。而Q函数提供了更多信息,它允许你“探测”一个特定即时动作,并考虑采取这个动作与采取其他动作相比,价值会是多少。

一个有用的关系是,你学到的状态价值函数在期望上等于你学到的Q函数。公式表示为:V^π(s) = E_{a∼π(·|s)}[Q^π(s, a)]

另一个你可能已经见过的有用概念是优势函数 A^π(s, a)。它评估在特定时间步采取特定动作 a 然后遵循策略,相对于平均动作有多好。优势函数定义为Q值与状态价值之间的差值。公式为:A^π(s, a) = Q^π(s, a) - V^π(s)

表格化Q学习与动态编程 🔄

为了探索如何学习Q函数,我们将回到之前讨论的表格化网格世界环境,看看如何通过动态编程来学习Q函数。

在课堂上,你可能见过这个贝尔曼最优方程,它定义了最优Q函数。公式如下:
Q*(s, a) = E_{s'∼T(·|s,a)}[ R(s, a) + γ * max_{a'} Q*(s', a') ]

然后,我们可以将这个给出最优Q函数的贝尔曼方程,转化为一个迭代学习过程。我们将在每个时间步定义我们的Q函数,从前一个时间步的Q值开始迭代,并执行相同的最大化过程。公式如下:
Q_{k+1}(s, a) = E_{s'∼T(·|s,a)}[ R(s, a) + γ * max_{a'} Q_k(s', a') ]

你会从一个空的网格世界开始,即所有步骤的Q函数初始值都为零。然后,你将从终端状态开始迭代,将奖励从终端状态传播回网格世界中的所有状态。这是一个迭代过程,允许你将价值从任何状态传播到所有状态。

这是Q学习的基础,我们将在接下来的幻灯片中可视化这个过程。

在我们的网格世界环境中,机器人有五个可以采取的动作:停留、向左、向右、向上、向下。如果它落在右上角的方格,将获得奖励;如果落在中间上方的方格(熔岩),将受到惩罚。我们使用折扣因子来鼓励机器人尽快到达目标状态,避免不必要的探索。

我们从定义的Q值函数开始,对于每个状态,除了右上角的终端状态(奖励+1)和熔岩方格(奖励-1)外,其他都为零。然后,我们运行Q值的多次迭代传播。在时间步2,靠近右上角的状态开始获得Q值。最终,经过多次迭代,我们能够填满网格,使Q函数稳定收敛。

关于动态编程与蒙特卡洛的说明:我们目前看到的是动态编程算法。一个快速的启发式判断方法是,如果你在更新的两边都看到了Q函数,那通常是动态编程风格的算法。而对于蒙特卡洛方法,至少在Q学习和价值函数更新中,你只会看到严格的奖励项。动态编程之所以从终端状态开始,是因为我们可以将价值从这些状态传播到网格中的所有状态。

最优值与策略 🏆

在课堂上讨论的各种符号可能会让人感到困惑,因此我想澄清几个你可能见过的不同量,并谈谈它们与当前探索的网格世界的关系。

以下是网格世界中的几个关键量:

  • 最优状态价值函数 V*(s):这是无条件于动作的价值函数。你可以看到,从获得奖励的右上角开始,你获得+1的奖励,然后0.9的折扣因子应用于离它每一步远的状态。
  • 最优动作价值函数 Q*(s, a):这是我们刚才描述的算法收敛的结果,也可以解析计算。
  • 最优策略 π*:这只是一个确定性函数。对于任何没有部分可观测性的MDP,策略将是一个确定性函数,定义为严格取Q函数的argmax。通常,它有一条通往目标的路径,并且通常是网格世界中任何状态的最短路径。

关于学习价值函数与策略的思考:你可能会问,既然有了策略就足够了,为什么还需要学习这些额外的量?在表格化领域,我们通过对Q函数取argmax来提取策略,因此我们需要Q函数来帮助我们确定整个状态空间的价值。此外,还有只利用策略的方法,例如策略梯度目标。但是,当环境在奖励或转移动态方面具有很大方差时,基于蒙特卡洛的方法可能会受到影响,因为环境方差很高。Q值函数允许你在方差和偏差之间进行权衡,是处理特定环境配置的另一种方式。因此,学习它们各有优劣,某些环境配置更适合学习Q函数。

此外,如前所述,还有一个优势函数的概念,它评估特定动作相对于策略会采取的平均动作有多好。对于最优策略,优势应该总是非正的(对于最优动作为零,对于其他动作为负)。这是因为你的策略是最优策略,没有比它更好的动作。在网格世界中,策略采取的所有动作优势都为零,而所有其他动作的优势为负,因为它们可能比最优策略表现更差。

关于当前策略与最优策略:到目前为止,我们一直在看最优策略。但对于当前策略或次优策略,情况会有所不同。你可以学习一个依赖于策略的评论家或Q函数,它告诉你当前策略与最优策略的接近程度,以及如何利用它进行改进。例如,如果你想学习一个演员-评论家风格的算法,你可以使用这个依赖于特定策略的评论家来告诉你哪些动作可能比你正在采取的动作更好,并用它来更新策略。Q^π 与当前策略相关,而 Q* 是最优的。最优策略已经收敛,因此无法再更新。

从表格化到参数化Q函数 🧠

我们一直在讨论这些表格化环境,在网格世界中观察价值如何传播是很好的。但是,类似的方法能扩展到更复杂的问题吗?

不幸的是,似乎不能。因为随着状态或动作空间的增长,表格化价值函数将会有成千上万甚至数百万行,学习起来非常困难。此外,如果你通过神经网络等方式学习一个参数化价值函数,可以更好地实现泛化。例如,如果你有两个在语义上或实际意义上彼此接近的状态,你会希望它们的Q值也非常相似。这是你从所学到的底层表示中获得的平滑性属性。

接下来,我们将看看如何使用回归技术,在连续和离散环境中学习基于神经网络的价值函数。

我们将回顾右侧的这些图示。第一张图是状态价值函数,它不依赖于动作,仅将状态作为输入,并输出标量 V^π(s)

此外,还有两种类型的Q函数:

  1. 连续Q函数:接收状态和动作作为输入,输出一个标量。
  2. 离散Q函数:对于给定状态,为所有可能的动作输出一个向量。

对于价值函数,它与动作空间无关,因此人们通常只使用一种通用的参数化方式。

离散与连续Q函数的区别:对于离散Q函数,你可以预测空间中所有动作的Q值,然后选择你想要使用的特定动作。而对于连续空间,枚举所有可能的动作将非常困难,因此你通常将动作作为输入。在连续空间中,你通常以动作为条件并输出一个标量;在进行期望计算时,你通常从策略中采样动作。而在离散情况下,你可以为每个“桶”输出一个值,然后在取期望时枚举所有动作。这样做的一个优点是,如果你在进行期望计算,你可以枚举所有动作,从而得到期望的精确估计;而在连续情况下,这只是基于样本的估计。

Q学习作为回归问题 📉

现在,让我们深入探讨如何将Q学习作为一个回归问题来解决。我们将使用右侧的白板进行推导。

我们将处理 V^π(s),你也可以为 Q(s, a) 做类似的推导。我们的价值函数依赖于特定状态,它表示从该特定状态开始的期望回报。我们可以将其写为策略 π 下,给定状态 S 时回报 G_t 的期望:V^π(s) = E_{π}[G_t | S_t = s]

回报可以进一步扩展为折扣奖励之和:G_t = Σ_{k=0}^{∞} γ^k R_{t+k}。所以:V^π(s) = E_{π}[ Σ_{k=0}^{∞} γ^k R_{t+k} | S_t = s ]。这就是我们价值函数的蒙特卡洛估计,它表示为一个总和。

现在,我们可以通过一些代数运算将其转换为一步时序差分(TD)估计。我们将从这个总和中取出 k=0 时的奖励项,并利用价值函数的定义。推导如下:
V^π(s) = E_{π}[ R_t + γ * Σ_{k=0}^{∞} γ^k R_{t+1+k} | S_t = s ]
= E_{π}[ R_t + γ * V^π(S_{t+1}) | S_t = s ]

通过这样做,我们得到了时序差分(TD)估计

蒙特卡洛估计与TD估计的区别:蒙特卡洛估计是整个轨迹的折扣回报总和,因此没有偏差。而在TD估计中,我们实际上将价值函数代回,这可能会引入一些偏差,因为我们的价值函数可能不准确,但它会减少方差,因为我们将轨迹的范围从可能非常大的H减少到仅为1。这就是我们在这里描述的TD学习。

我们只进行了一次展开,但我们也可以进行n次展开。这允许我们在偏差和方差之间进行权衡。偏差再次来自价值函数的参数化,而方差来自轨迹的范围,因为你的奖励函数或转移动态可能有噪声,会在你展开的所有轨迹中引入一些方差。

让我们看看那会是什么样子。经过k步展开后,我们的价值函数被折扣了k步,而不是一步。我们现在可以在蒙特卡洛展开(即奖励的完全折扣总和)和我们所做的价值函数估计之间进行权衡,使我们能够有效地在TD和蒙特卡洛之间进行权衡。

让我们通过可视化来比较一下。在左侧,我们本质上是从一个特定状态开始,让我们的策略展开直到达到终端状态,我们将收集多个这样的展开,平均它们之间的回报,以计算这个价值函数估计。由于在每一个动作,你都会从转移动态函数或奖励中引入噪声,这可能会有很大的方差。

相比之下,使用这种TD备份,我们只展开一步,但然后使用下一个状态的价值函数估计来减少我们估计的方差。然而,同样因为我们的价值函数可能不准确,这会导致潜在的偏差问题。

两者都有一定的权衡。在表格化设置中,这两种方法应该收敛到相同的结果方程,但当你超越表格化设置时,它们似乎不会收敛到相同的结果。

我们也可以看看N步回报,它允许TD目标在应用前查看未来N步。因此,我们可以在这里权衡偏差和方差。

你可以查看此表以了解每种方法的权衡。TD的自举深度为1步,N步方法为n步,蒙特卡洛为整个回合。像TD这样的方法偏差较高,而N步方法则处于中间位置,取决于你的K有多大,蒙特卡洛则完全没有偏差。方差则与此相反,TD方差较低,N步回报再次处于中间位置,蒙特卡洛方差较高。这在很大程度上也取决于你所处的环境。例如,在语言领域,蒙特卡洛展开实际上是许多人的做法,因为在许多情况下,你的环境动态几乎是完美的,你的奖励信号(尤其是在数学或代码推理等领域)也将是完美的,因此你不必担心动态的方差等问题。但如果你进入智能体领域或机器人领域,许多这些因素就会重新发挥作用。

动态编程给你的另一个概念是“缝合”。如果你看左侧的这个迷宫环境,你可以看到一个例子,说明为什么这可能很强大。假设我们通过策略收集了两条不同的轨迹:一条从A到B,另一条从C到D。通过这一步动态编程,你将看到实际上可以找到从A到D的最优路径,因为在每一步,你都在看它之前的一步,你可以将这些轨迹“缝合”在一起,形成通往目标的最优路径。这使你能更好地覆盖空间,并使这些算法可能更高效。

实用设计细节:稳定Q学习 🛠️

现在,让我们更多地讨论一些实际的设计细节,这些细节是使Q学习稳定所必需的。

我们首先要讨论的是半梯度目标网络的概念。

现在,我们将回顾我们一直在研究的Q值估计,我们将其定义为当前时间步的奖励加上下一个时间步的折扣Q值,其中你对所有动作取最大值。公式如下:
Q(s, a) ← R(s, a) + γ * max_{a'} Q(s', a')

这里你会注意到,左边的Q函数和右边的Q函数是相同的,但这会使优化变得非常困难,特别是如果你通过它传播梯度。因此,人们使用的一种技巧是半梯度的概念,它允许你冻结目标网络或不向其传递任何梯度,以使优化更稳定。其定义如第二个方程所示。

此外,为了使事情更稳定,人们加入了目标网络的概念,它延迟右侧的更新,使你的Q函数能够回归到一个更稳定的目标。

在这个领域,人们使用两种类型的更新:

  1. 硬目标更新:以固定的频率,将目标网络更新为最近使用的主网络参数。
  2. 软目标更新:或称为指数移动平均(EMA)或Polyak风格的平均技术,允许你以衰减参数平滑地插值到目前为止所见的Q函数。在实践中,人们通常使用右侧的方法(软更新),两者在经验上都表现良好。

你这样做的原因是,当你进行某种回归时,你希望确保你的价值函数是一个真正稳定的目标。像移除右侧的梯度以及引入目标网络这样的事情,使学习问题变得容易得多。你必须考虑以多频繁更新目标网络等问题,但在大多数情况下,人们已经将其稳定为一个超参数,例如Polyak平均的0.99。

通常,当你学习Q函数时,你会通过回归风格的技术来学习,其损失函数大致如下:
L(θ) = E_{(s,a,r,s')} [ ( Q_θ(s, a) - (r + γ * max_{a'} Q_{θ'}(s', a')) )^2 ]
其中,θ' 是目标网络的参数(在软更新中,θ' = τ * θ + (1-τ) * θ')。半梯度技巧阻止你向右侧传递梯度,因此你的目标在优化时是固定的,但你可以通过左侧的网络传递梯度。而目标网络则是一组完全不同的参数,独立于你学习到的参数,你通过Polyak平均等方式更新它们。

更多稳定技巧:梯度裁剪与损失函数 ✂️

我们还没有完成如何修复梯度或使学习更稳定的工作。不幸的是,人们还使用了一些其他类型的技术来使其更好地收敛。

第一种是梯度裁剪,在你过去训练神经网络时可能见过。当你进行像TD这样的更新时,很多时候梯度会太大,你希望将其裁剪一些,以便更稳定地进行优化。例如,在左侧的损失图中,如果你不进行梯度裁剪,你可能会在最优参数空间周围徘徊;而如果你进行一定程度的梯度裁剪,你可以平滑地接近它。

此外,你可以使用MSE以外的目标来使其更好。人们使用的一个标准方法是Huber损失,它是L1和L2损失之间的插值。它允许你通过L1损失(图中的绿色部分)不受异常值的影响,然后当你接近正确的目标值时,允许类似L2的损失生效,使你越来越接近目标值。这是你通过这种方法进行的插值。人们还做了其他事情,但这些是人们发现有助于学习价值函数的一些标准方法。

经验回放缓冲区 🗃️

现在让我们谈谈经验回放缓冲区。你可能在今天的课或上周的课中见过这个概念,它是一个内存结构,可用于存储智能体见过的过去经验。

我们以这种缓冲区格式参数化它,我们有状态、动作、奖励和下一个状态这几列,我们将它们单独存储为转移,而不是整个轨迹。

我们这样做的原因是,它允许我们打破数据集的时序相关性,并防止近因偏差。有两个因素起作用:时序相关性来自于我们在每个时间步采样转移而不是轨迹,并且这些转移可以来自不同的轨迹。此外,通过拥有这个访问过的过去轨迹的缓冲区,我可以确保不会过度拟合当前策略,从而避免近因偏差。Q函数受益于空间中的大量覆盖,这使你不会因当前策略而缩小分布。

所有这些都导致在学习Q函数时具有更好的样本效率,并允许智能体以有效的方式重用这些经验。

你的回放缓冲区有时可能有最大大小,这取决于你拥有的容量。通常这不是问题,但如果有必要,你可能需要重新加权或丢弃缓冲区的部分内容。

关于使用历史信息:人们已经探索了RNN甚至基于Transformer的架构(例如Decision Transformer),它们对长历史进行条件化以预测动作和价值等。对于学习评论家或Q函数,它们都有不同的权衡。例如,在语言策略中,我们默认这样做。但在机器人等领域,你的数据中可能存在时序相关性,使用历史学习实际上可能是一个更微妙的话题,可能需要做出更多的设计决策来更仔细地处理。但这绝对是一个值得考虑的领域,即如何保存迄今为止所见的所有状态和动作的历史,甚至可能包括先前试验的历史。

Q学习高估问题与解决方法 ⚖️

我现在想快速谈谈Q学习的高估问题。这将遵循使用函数逼近进行RL的推导,我们将再次查看顶部的Q学习贝尔曼或TD备份。你可能注意到这里右侧有一个最大化操作。

如果我们学习Q函数的方式存在一些噪声,基本上会发生什么?这就是我们要看的。当我们以神经网络参数化Q函数时,估计中可能存在噪声。我们将当前Q函数表示为近似值(学习到的参数化),Q目标表示最优Q函数或真实的基础Q函数。我们现在还要引入这个Y参数,表示由于建模错误等原因可能存在的噪声。

我们将看到的是,如果右侧在预测目标时存在噪声,这实际上会很不理想地传递到左侧。我们在这里左侧看到的是,经过一次迭代更新后Q值会是什么样子,以及它与真实目标值有何不同。Q_approx(s', â) 基本上就是我们在右侧看到的值,而 Q_target 是真实值。

我们将看到的是,即使我们定义一个零均值的噪声,最终左侧(经过一次更新后)的噪声也会具有正均值,导致我们的Q值被高估。

这导致我们在尝试学习评论家时必须处理这种高估问题。

这里我提到的一点是,我们将对动作进行最大化。例如,采样也可能存在问题,实际上我不认为这一定是问题,因为你所有动作的真实目标值可能实际上更高。我认为主要的担忧实际上来自建模错误,因为在某些情况下,你可能确实高估了右侧的Q值,一旦你进行了多轮动态编程,这个错误会传播到你的整个状态空间,并基本上会复合。

让我澄清一下我这里所说的错误或高估实际上是在Q函数中,而不是在采取的动作中。假设我们处于离散空间,可以枚举所有动作,并查看每个动作的值。我这里描述的失败情况是我们学习的Q函数与真实或最优Q函数(Q*)之间的差异。可能发生的情况是,你的Q函数可能由于某些噪声而被错误建模,比如比真实目标值更高。我说的是,即使该噪声具有零均值,当你进行这些动态编程更新时,它会传播到左侧,并由于这个最大化操作,使你基本上得到非零均值的噪声,这基本上会传播到你的整个状态空间,使你的Q值膨胀,导致高估。

我打算稍后再详细讨论这个,但我们现在可以谈谈。想象这是我们的状态空间(图中包含很多列)。我们可以查看每一步价值估计的样子。我在第二列中展示的是估计值与最大值之间的差异。第三列显示了真实值与我们想要学习的值之间的差异。如果你看这个红色图形(典型的Q学习风格算法),我们可以看到由于我们高估了真实值可能的值,并将其传播到所有状态,存在巨大的误差条。

我将谈谈我们如何解决这个问题。人们采取的一种方法是评论家集成,我们想使用网络集成来估计Q函数的认知不确定性,然后我们可以使用所有这些集成网络,并在集成上取最小值,以基本上得到Q值应该是多少的低估。这种方法有效的原因是,你可以想象,当你初始化网络时,它们以不同的方式初始化,并且它们在不同状态上产生的错误也将非常不同。因此,你可以通过集成然后进行诸如最小化之类的操作来减少不确定性或消除这些建模错误。

这在像Double Q学习这样的工作中被证明是有效的,我将在下一张幻灯片中展示,以及像离线RL(我们稍后会讨论)这样的事情。在这些工作中,你基本上可以大幅增加集成规模,并且由于集成的程度很高,分布偏移实际上得到了缓解,并且学习了Q值应该是多少的低估,使你免受噪声等原因导致的高估。

我描述的图基本上准确地展示了这一点,这来自Double Q学习论文。我们看到,尽管红色曲线(标准Q学习)有非常大的误差,但仅使用集成大小为2或进行Double Q学习,就可以缓解Q学习的所有高估误差,使事情稳定很多。因此,对于在线Q学习算法,你只使用两个就可以,并且在大多数情况下效果很好,超过这个数量就会饱和。但对于像离线强化学习这样的场景,你绝对可以尝试增加集成规模,因为在那里你处理的是一个静态数据集,任何因为你离开当前状态或动作分布的支持而发生的错误,都会让你的模型更严重地传播这些错误。因此,我认为在那里,对你所处的分布非常小心很重要,你可以为像EDAC或SN这样的方法增加集成规模。

在语言奖励建模的背景下,人们也在研究这个问题,因为在奖励建模中,你可能会面临类似的效果,比如可能的高估会降低性能。所以已经有一些论文提出,只做像LoRA这样的事情,或者确保你共享网络的大部分层,并在其之上使用线性适配器,这些是参数高效的学习方法。

posted @ 2026-03-26 13:14  布客飞龙IV  阅读(19)  评论(0)    收藏  举报